{"generated_at":"2026-10-05T21:34:02.543Z","count":4358,"chunks":[{"content":"AI in RhinoArtisan\n\nRhinoArtisan brings professional AI into the jewelry workflow. Some features connect to specialized third-party models for reasoning, image generation, video or 3D. These models are independent services with usage-based costs, giving you access to frontier capabilities while keeping you in control of the provider, quality and budget.\n\nThis section is the common ground for all of them: the accounts, the models, the costs and the privacy rules are the same whichever tool you use, so they live here once.","metadata":{"title":"AI in RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/","source":"https://www.rhinoartisan.com/docs/7/ai/","collection":"docs7","hash":"76bec58171877d86a438fa0ea46f8850","indexed_by":"docs-index"}},{"content":"AI in RhinoArtisan — Your AI tools\n\n| Tool | What it does | Account it needs |\n| --- | --- | --- |\n| Assistant | A chat that reads the design you have open, answers questions about it and builds or changes it on request: price, ring size, metal, stones, settings, shanks, reports, STL. | OpenRouter |\n| Generative AI Studio | Images, video and 3D from your viewport, a photo or a description: studio renders, try-ons, product clips, organic meshes. | fal.ai |\n| Flow Studio AI | Describe a job and get a Python script that does it, ready to review, run and keep in your Flow library. | OpenRouter |\n| File Search | Its ✦ Smart mode finds designs in your archive from a description: type, metal, stones, carat, price. | OpenRouter (Smart mode only) |\n| RhinoArtisan MCP | Drive RhinoArtisan from the AI assistant you already use: Claude, ChatGPT, Gemini, Cursor and others. | None of these: it uses the AI app you connect |\n\nEverything else in RhinoArtisan works without any AI account: modeling, gemsets, shanks, manufacturing checks, pricing, reports and rendering never contact a provider.","metadata":{"title":"AI in RhinoArtisan","section":"Your AI tools","url":"https://www.rhinoartisan.com/docs/7/ai/#your-ai-tools","source":"https://www.rhinoartisan.com/docs/7/ai/#your-ai-tools","collection":"docs7","hash":"eb018f504ab2edb1683a6a83695360c1","indexed_by":"docs-index"}},{"content":"AI in RhinoArtisan — Set up\n\nThree steps, done once for every tool:\n\n1. Create your accounts and paste the keys: OpenRouter for the Assistant, Flow Studio AI and Smart search; fal.ai for Generative AI Studio. You only need the ones for the tools you use.\n2. Choose the models, or keep the defaults.\n3. Open the tool and try it.\n\nThen the pages you will come back to:\n\n* Costs and spending: how each provider bills you, and how to keep the bill predictable.\n* Privacy and data: what leaves your computer with each tool, and what never does.\n* Frequently asked questions: short answers about the keys, the costs and the providers.","metadata":{"title":"AI in RhinoArtisan","section":"Set up","url":"https://www.rhinoartisan.com/docs/7/ai/#set-up","source":"https://www.rhinoartisan.com/docs/7/ai/#set-up","collection":"docs7","hash":"f8ae9bc0fc32eb8ccc8f108937461346","indexed_by":"docs-index"}},{"content":"AI in RhinoArtisan — Learn\n\nNew to working with AI? These short pages explain the ideas behind the tools and the choices we made:\n\n1. Understanding AI in RhinoArtisan\n2. What Is an AI Model?\n3. What Are Frontier Models?\n4. Different Models for Different Jobs\n5. What Are fal.ai and OpenRouter?\n6. Why Isn't AI Usage Included in the RhinoArtisan License?","metadata":{"title":"AI in RhinoArtisan","section":"Learn","url":"https://www.rhinoartisan.com/docs/7/ai/#learn","source":"https://www.rhinoartisan.com/docs/7/ai/#learn","collection":"docs7","hash":"ee02ec477d15b358c8a43beb8fb7e90a","indexed_by":"docs-index"}},{"content":"Choosing Models\n\nEvery model sits somewhere on a triangle of quality, speed and cost, and you cannot have all three at once. The strongest models are slower and more expensive; the fast cheap ones give up accuracy on hard problems.\n\nThere is no universally correct answer. There is a correct answer per job.","metadata":{"title":"Choosing Models","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/","collection":"docs7","hash":"a00357c39af64378936ae43ad8447a1a","indexed_by":"docs-index"}},{"content":"Choosing Models — The models in RhinoArtisan\n\nEach tool that runs on your OpenRouter key has its own model setting:\n\n| Setting | Where | Used by | Default |\n| --- | --- | --- | --- |\n| AI model | Options → Artisan → Assistant | The Assistant | Claude Opus 4.8 |\n| Flow Studio model | Options → Artisan → Integrations | Flow Studio AI | Claude Opus 4.8 |\n\nThe Assistant page also has a model per specialised job — a router that reads each message first, vision for the pictures you attach and reasoning for multi-step builds — plus the image models it uses through fal.ai. Their defaults are sensible: the router uses a small, fast model, and vision and reasoning follow the AI model. See Assistant options.\n\nThe AI model and Flow Studio dropdowns offer the same curated list. The dropdown shows each model by its OpenRouter id:\n\n| Provider | Model | Id in the dropdown |\n| --- | --- | --- |\n| Anthropic | Claude Opus 4.8, the default | `anthropic/claude-opus-4.8` |\n| Anthropic | Claude Opus 5 | `anthropic/claude-opus-5` |\n| Anthropic | Claude Fable 5 | `anthropic/claude-fable-5` |\n| Anthropic | Claude Sonnet 5 | `anthropic/claude-sonnet-5` |\n| xAI | Grok 4.5 | `x-ai/grok-4.5` |\n| OpenAI | GPT-5.6 Sol | `openai/gpt-5.6-sol` |\n| DeepSeek | DeepSeek V4 Pro | `deepseek/deepseek-v4-pro` |\n| Qwen | Qwen3 Coder Plus | `qwen/qwen3-coder-plus` |\n| Mistral | Codestral | `mistralai/codestral-2508` |\n\nEvery model on the list works with both tools; the difference is speed, depth and what each provider charges your OpenRouter account.\n\nTwo tools choose their models elsewhere:","metadata":{"title":"Choosing Models","section":"The models in RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#the-models-in-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#the-models-in-rhinoartisan","collection":"docs7","hash":"968816be4e96b06252c0c07d0e2257e3","indexed_by":"docs-index"}},{"content":"Choosing Models — The models in RhinoArtisan\n\n* File Search uses neither setting. Its ✦ Smart mode always runs on a small, fast model (Claude Haiku), because turning a description into search filters is a short job.\n* Generative AI Studio picks the image, video or 3D model per generation, from the mode chip next to the prompt. See Modes & Models.","metadata":{"title":"Choosing Models","section":"The models in RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#the-models-in-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#the-models-in-rhinoartisan","collection":"docs7","hash":"c5db7e00ec1afb46effbaf32408fa1ca","indexed_by":"docs-index"}},{"content":"Choosing Models — Two settings, on purpose\n\nThe Assistant and Flow Studio AI get a model each because they do different jobs. That is deliberate, and it is the single most useful lever you have.\n\nThe Assistant works on your design. It answers questions about the piece, and it changes and builds it in several steps: *\"resize it, change the metal and give me the new price\"* is three steps that all have to be right. It defaults to Claude Opus 4.8, a frontier model, because the requests jewelers bring are rarely as simple as they look. If you mostly ask short, factual questions, a cheaper model can be enough: DeepSeek V4 Pro is the value pick, close-to-frontier answers at a fraction of the cost.\n\nFlow Studio AI writes code. Volume is low and the stakes are high: a script that is subtly wrong wastes far more of your time than the price difference between models. This is where a frontier model earns its cost. Set it to the strongest one you are willing to pay for.","metadata":{"title":"Choosing Models","section":"Two settings, on purpose","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#two-settings-on-purpose","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#two-settings-on-purpose","collection":"docs7","hash":"58a71051b506e1826f7409b75eda2028","indexed_by":"docs-index"}},{"content":"Choosing Models — When to move up\n\nReach for a stronger model when the job has any of these:\n\n* A long instruction with several conditions. Weaker models drop constraints halfway through.\n* Real consequences. Anything you will act on in production.\n* Code. The gap between models is widest here.\n\nWhen to move down\nDrop to something cheaper and faster when:\n\n* You are asking short, factual questions in a long session.\n* You are exploring, and a rough answer is enough to point you in a direction.\n* You are repeating a task you have already validated.\n\nA practical starting point. Leave the Assistant on the default and set Flow Studio AI to the strongest model on your list. Run that for a couple of weeks, look at your provider dashboard, and adjust from real numbers instead of guesses.","metadata":{"title":"Choosing Models","section":"When to move up","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#when-to-move-up","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#when-to-move-up","collection":"docs7","hash":"ddabea6d47842b51a8714f821f564553","indexed_by":"docs-index"}},{"content":"Choosing Models — Generative AI Studio works the same way\n\nThe image, video and 3D models in Generative AI Studio sit on the same triangle. Use a fast, inexpensive model while you are exploring composition and framing, then regenerate the one you like on a stronger model for the final image. Paying the top rate for a draft you will discard is the most common way to overspend.","metadata":{"title":"Choosing Models","section":"Generative AI Studio works the same way","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#generative-ai-studio-works-the-same-way","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/choosing-the-right-model/#generative-ai-studio-works-the-same-way","collection":"docs7","hash":"9096d9ed476943df5f9e7a923f33a695","indexed_by":"docs-index"}},{"content":"Accounts and API Keys\n\nTwo accounts cover every AI feature, and you set them up once. Both are pay-as-you-go: you add credit up front and it draws down as you use the tools.\n\nWhich account each tool needs\n| Tool | OpenRouter | fal.ai |\n| --- | --- | --- |\n| Assistant | ✓ | |\n| Flow Studio AI | ✓ | |\n| File Search, ✦ Smart mode | ✓ | |\n| Generative AI Studio | | ✓ |\n\nYou only need the account for the tools you actually use: if you never open Generative AI Studio, you never need fal.ai. RhinoArtisan MCP needs neither, because it works through the AI app you connect to it.","metadata":{"title":"Accounts and API Keys","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/","collection":"docs7","hash":"032e2be22c6ea5ff5f79015c4b1fcabe","indexed_by":"docs-index"}},{"content":"Accounts and API Keys — 1. OpenRouter\n\n1. Create an account at openrouter.ai.\n2. Add credit to the balance. Start small; you can top up at any time.\n3. Open Keys in your account menu, create a key and copy it. It looks like\n`sk-or-v1-…`. Copy it immediately: providers show a key once and cannot show it again afterwards. If you lose it, you delete it and create another.","metadata":{"title":"Accounts and API Keys","section":"1. OpenRouter","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#1-openrouter","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#1-openrouter","collection":"docs7","hash":"b4d622d86699b28ac4fc3f5fcdd3c447","indexed_by":"docs-index"}},{"content":"Accounts and API Keys — 2. fal.ai\n\n1. Go to fal.ai and click Login.\n\n2. Sign up with Google, GitHub or an email and password.\n\n3. fal.ai then asks \"How will you be using fal?\" Any answer works: it is only for fal.ai's statistics and does not affect your account, features or pricing.\n\n4. Add credit to the balance.\n5. Open the Dashboard, then Manage → API Keys. A default key is created for you; click Add key if you prefer one just for RhinoArtisan.\n\n6. Click Copy key. The key looks like `fal_sk_…`, and the same caution applies: keep it private.","metadata":{"title":"Accounts and API Keys","section":"2. fal.ai","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#2-falai","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#2-falai","collection":"docs7","hash":"361f5d03c45326f6bc0d2ba5baaa5a49","indexed_by":"docs-index"}},{"content":"Accounts and API Keys — 3. Paste the keys into RhinoArtisan\n\nBoth keys go on the same page, so they are set once and every tool that needs them simply works: no panel will ever stop to ask you for a key in the middle of a job.\n\n1. Open the options: click the Settings icon under the File tab of the ribbon, or run Rhino's `Options` command.\n\n2. In the sidebar, select Artisan.\n\n3. Open its Integrations sub-page.\n\n4. Paste each key into its group:\n* OpenRouter → API Key: your OpenRouter key.\n* Generative AI (fal.ai) → API Key: your fal.ai key.\n\n5. Click OK. RhinoArtisan may ask you to restart so the change is picked up everywhere.\n\nThe same page sets the model each tool uses; the defaults are a good start, and Choosing models explains when to change them. Both keys are stored as password fields rather than plain text.","metadata":{"title":"Accounts and API Keys","section":"3. Paste the keys into RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#3-paste-the-keys-into-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#3-paste-the-keys-into-rhinoartisan","collection":"docs7","hash":"21b4ca7abf22667709a5338ec70f743b","indexed_by":"docs-index"}},{"content":"Accounts and API Keys — 4. Check that it works\n\n* OpenRouter: open the Assistant panel and type `Hi!`. A reply means the key, the balance and the model are all in order. If the key is missing, the Assistant answers *\"OpenRouter API key not configured. Set it in Options > Integrations.\"*\n* fal.ai: open Generative AI Studio. If you see the prompt bar and the mode chip at the bottom of the window, you are connected; without a key the Studio shows a notice in their place.\n\nIf something fails, check in this order: the key is pasted in full, the account has credit, and the machine can reach the internet through any corporate proxy or firewall.\n\nTreat the keys like a credit card. Anyone holding one can spend your balance. Do not paste them into a shared document, do not email them, and do not share a settings export that contains them. If a key is ever exposed, delete it in the provider dashboard and create a new one: that instantly stops the old one working.\n\nNivoda is not part of this. The same Integrations page also holds your Nivoda credentials for live diamond stock. That is a separate service and has nothing to do with AI or with these two keys.","metadata":{"title":"Accounts and API Keys","section":"4. Check that it works","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#4-check-that-it-works","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/creating-your-accounts/#4-check-that-it-works","collection":"docs7","hash":"9d67626b8dd7531099dba1eab3cea63a","indexed_by":"docs-index"}},{"content":"Different Models for Different Jobs\n\nA model learns from a particular kind of data and can only work in that domain. A language model has never seen a rendered ring; an image model has no concept of carat weight. So the tools in RhinoArtisan reach for different models depending on what you asked for.\n\nWhat each job needs\nLanguage and reasoning: the Assistant and Flow Studio AI. Answering a question about a setting, or turning a description of a repetitive task into working code. These call large language models, and code generation in particular rewards a strong one.\n\nImages: Generative AI Studio. Turning a prompt or one of your own designs into a photographic render, a sketch, a variation or a campaign image. A completely different family of model, trained on pictures.\n\nVideo and 3D: also Generative AI Studio, and different models again. Turntables, motion, and reconstructing geometry from an image are each their own specialty.","metadata":{"title":"Different Models for Different Jobs","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/different-models-different-jobs/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/different-models-different-jobs/","collection":"docs7","hash":"c2373bdfb1cd29994df0f214c7ba706f","indexed_by":"docs-index"}},{"content":"Different Models for Different Jobs — Why two providers, not one\n\nNo single company makes the best model in every category. The strongest language model and the strongest image model come from different labs, and the ranking changes several times a year.\n\nRather than tie you to one vendor's whole catalog, RhinoArtisan connects to two gateways that each aggregate many providers: OpenRouter for language, and fal.ai for images, video and 3D.\n\nThe practical effect is that when a better model appears, it shows up in your list. You are not waiting for us to ship an update, and you are not locked to whichever lab we happened to sign with.","metadata":{"title":"Different Models for Different Jobs","section":"Why two providers, not one","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/different-models-different-jobs/#why-two-providers-not-one","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/different-models-different-jobs/#why-two-providers-not-one","collection":"docs7","hash":"056e7d15e7a8519d00f30f474c5ff7be","indexed_by":"docs-index"}},{"content":"What Are fal.ai and OpenRouter?\n\nBoth are gateways. Neither trains models of its own: they sit in front of many providers and give you one account, one balance and one key for all of them.\n\nOpenRouter\nCovers language and reasoning: the Assistant, Flow Studio AI and the Smart mode of File Search.\n\nBehind a single OpenRouter account you can reach models from Anthropic, OpenAI, Google and others, plus a long tail of open models at much lower prices. In RhinoArtisan you pick which one each feature uses from a curated list, so you are not scrolling through hundreds of options that make no sense for jewelry work.","metadata":{"title":"What Are fal.ai and OpenRouter?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/","collection":"docs7","hash":"54ed81ec020aa80e43f31095de2ab940","indexed_by":"docs-index"}},{"content":"What Are fal.ai and OpenRouter? — fal.ai\n\nCovers images, video and 3D: everything in Generative AI Studio.\n\nfal.ai specializes in running generative media models fast. It hosts the current image and video models (Nano Banana, Veo, Kling and their peers) on infrastructure built for them, which is why a generation comes back in seconds rather than minutes and why nothing needs a GPU on your side.","metadata":{"title":"What Are fal.ai and OpenRouter?","section":"fal.ai","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/#falai","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/#falai","collection":"docs7","hash":"0184af18926fdbb1d3f1356b048683ca","indexed_by":"docs-index"}},{"content":"What Are fal.ai and OpenRouter? — Why a gateway instead of one lab\n\nThree reasons, all of them yours rather than ours.\n\nYou are not locked in. If the best model for your work changes labs next quarter, you change a dropdown. Nothing about your setup, your key or your billing has to change.\n\nOne balance instead of five. Signing up directly with each lab means separate accounts, separate cards and separate minimum spends. A gateway collapses that into one prepaid balance.\n\nAccess to cheap models as well as expensive ones. The same key that reaches a frontier model also reaches small, inexpensive ones. That is what makes choosing per feature worth doing.\n\nThese are your accounts, not ours. You sign up directly, you hold the key, and you are billed by them. RhinoArtisan never sees your balance and never receives a share of it. Keys are stored on your machine as password fields, do not share a settings export that contains them.\n\nSetting both up takes a few minutes and is covered in Accounts and API keys.","metadata":{"title":"What Are fal.ai and OpenRouter?","section":"Why a gateway instead of one lab","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/#why-a-gateway-instead-of-one-lab","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/fal-ai-and-openrouter/#why-a-gateway-instead-of-one-lab","collection":"docs7","hash":"f8a8f70709c7cf16bdedceb9caabef23","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Is the AI included in my RhinoArtisan license?\n\nThe features are. The model usage is not: you pay the provider directly for what you use, and RhinoArtisan adds no margin. The reasoning is in Why isn't AI usage included.\n\nWhy can't RhinoArtisan just include the model?\nBecause frontier models are not distributed to anyone. They cannot be downloaded or packaged into software; they run only on the provider's own infrastructure. See What are frontier models.","metadata":{"title":"Frequently Asked Questions","section":"Is the AI included in my RhinoArtisan license?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#is-the-ai-included-in-my-rhinoartisan-license","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#is-the-ai-included-in-my-rhinoartisan-license","collection":"docs7","hash":"912a8e58b8a47fc4e91df61611a44d7e","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Do I need both accounts?\n\nOnly for the features you use. OpenRouter covers the Assistant, Flow Studio AI and the Smart mode of File Search; fal.ai covers Generative AI Studio. If you only want one of those, set up one key. See Accounts and API keys.\n\nWhat happens if I never set up a key?\nEverything else works normally. Modeling, gemsets, shanks, manufacturing, pricing, reports and rendering do not touch an AI provider. The AI panels simply tell you a key is missing, and a Smart search falls back to matching the words you typed.","metadata":{"title":"Frequently Asked Questions","section":"Do I need both accounts?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#do-i-need-both-accounts","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#do-i-need-both-accounts","collection":"docs7","hash":"edd1952a054502799466b3f8a73e5692","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Can I be charged more than I expect?\n\nThe balances are prepaid, so the most you can spend is what you have already added. When it runs out, the features stop until you top up. You can also set spending limits in each provider dashboard, see Costs and spending.\n\nDoes RhinoArtisan take a cut?\nNo. You pay the provider directly, at their published rate. We do not resell credits, mark anything up or receive a share.","metadata":{"title":"Frequently Asked Questions","section":"Can I be charged more than I expect?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#can-i-be-charged-more-than-i-expect","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#can-i-be-charged-more-than-i-expect","collection":"docs7","hash":"26c679a1159aab7e0d6e80a1b141616b","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Which model should I use?\n\nLeave the Assistant on the default and set Flow Studio AI to the strongest model you are willing to pay for: code is where the difference between models matters most. Choosing models covers the trade in full.\n\nCan I run the AI offline?\nNot the frontier models: they exist only as a cloud service. Open models can run locally, but they are well behind the top tier on exactly the kind of question jewelry work produces.","metadata":{"title":"Frequently Asked Questions","section":"Which model should I use?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#which-model-should-i-use","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#which-model-should-i-use","collection":"docs7","hash":"87b2037890a6faf6265fed77b24c6b72","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Is my design data used to train these models?\n\nThat depends on the provider's terms, which apply to your account rather than to RhinoArtisan. Both publish their policies and both offer settings that affect the answer. See Privacy, data and third-party services.\n\nCan I use my existing ChatGPT or Claude subscription instead?\nFor the built-in panels, no: they connect through OpenRouter. But RhinoArtisan MCP does exactly that: it plugs the assistant you already pay for straight into your RhinoArtisan tools, using your own subscription.","metadata":{"title":"Frequently Asked Questions","section":"Is my design data used to train these models?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#is-my-design-data-used-to-train-these-models","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#is-my-design-data-used-to-train-these-models","collection":"docs7","hash":"1231436b73ac33ddfc99cdd0bd1aaaac","indexed_by":"docs-index"}},{"content":"Frequently Asked Questions — Can I share one key across the studio?\n\nYou can, but issue one key per machine instead. You get per-seat usage figures, separate limits, and the ability to revoke one key without disrupting everyone else.\n\nWhat if my key is exposed?\nDelete it in the provider dashboard and create a new one. That stops the old key working immediately.","metadata":{"title":"Frequently Asked Questions","section":"Can I share one key across the studio?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#can-i-share-one-key-across-the-studio","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/faq/#can-i-share-one-key-across-the-studio","collection":"docs7","hash":"c6df6ee06a54e54e3f3d7a95dc750214","indexed_by":"docs-index"}},{"content":"What Are Frontier Models?\n\nA frontier model is one of the handful of models sitting at the very top of what AI can currently do. Claude, GPT and Gemini for language and reasoning; Nano Banana, Veo, Kling and their peers for images and video.\n\nThey are not simply \"better versions\" of the open models. The gap shows up exactly where it matters for professional work: following a long instruction without drifting, reasoning about a real constraint instead of pattern-matching a similar one, and admitting uncertainty rather than inventing an answer.","metadata":{"title":"What Are Frontier Models?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/","collection":"docs7","hash":"cf1df686705a500a040ad72e73b78002","indexed_by":"docs-index"}},{"content":"What Are Frontier Models? — Why you cannot download one\n\nThis is the part that surprises people, so it is worth being blunt about it.\n\nThey are not distributed at all. Not to RhinoArtisan, not to any other software vendor, not to anyone. The weights are the single most valuable asset the lab owns (the result of a training run that costs enormous sums), and they are never published in a runnable form.\n\nThey are built for datacenter hardware. Even if you had the files, a frontier model does not fit on a workstation. A single answer is computed across many specialized accelerators with far more memory than any desktop machine has.\n\nAccess exists only through an API. The lab runs the model on its own infrastructure and sells requests to it. That is the only product on offer.\n\nSo when any software gives you a frontier model, it is not shipping the model. It is passing your request through to somebody else's, and somebody is paying per request.\n\nThis is not a RhinoArtisan limitation. Every design tool, every writing app and every chat product that offers frontier AI works the same way. The only difference between them is who pays the provider, and whether a margin is added on top. In RhinoArtisan you pay the provider directly and we add nothing.","metadata":{"title":"What Are Frontier Models?","section":"Why you cannot download one","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/#why-you-cannot-download-one","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/#why-you-cannot-download-one","collection":"docs7","hash":"a9dbac9bee34cbce4846f879ad40dfce","indexed_by":"docs-index"}},{"content":"What Are Frontier Models? — Where open models still win\n\nFrontier is not automatically the right answer. Open models run offline, cost nothing per use, and keep every byte on your own machine. For a simple, repetitive task with no confidential input, that can be the better trade. What they cannot do is carry the hard questions, and jewelry work produces plenty of those.","metadata":{"title":"What Are Frontier Models?","section":"Where open models still win","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/#where-open-models-still-win","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/frontier-models/#where-open-models-still-win","collection":"docs7","hash":"8caedc4af9fdea03cfa206118376bfb8","indexed_by":"docs-index"}},{"content":"Costs and Spending\n\nBoth providers work the same way at the top level: you put money in, and it is drawn down as you use it. There is no subscription, no monthly minimum, and nothing is charged if you do not use the tools.\n\nUsage-based billing worries people who have never used it, almost always because of one fear: waking up to a bill they did not expect. The structure makes that very hard to happen.","metadata":{"title":"Costs and Spending","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/","collection":"docs7","hash":"b813c766260e2ee55930c2897f2307ac","indexed_by":"docs-index"}},{"content":"Costs and Spending — The balance is prepaid\n\nThis is the most important thing on the page. You are not on an account with a monthly invoice that arrives after the fact: you add credit first, and the tools draw it down. When the balance reaches zero the features stop working until you top up again.\n\nThe most you can spend is the amount you have already put in. Start with a small balance while you learn what your usage looks like.","metadata":{"title":"Costs and Spending","section":"The balance is prepaid","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#the-balance-is-prepaid","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#the-balance-is-prepaid","collection":"docs7","hash":"9efe178019b0c936daed18c84f0102ef","indexed_by":"docs-index"}},{"content":"Costs and Spending — Language: priced per token\n\nThe Assistant, Flow Studio AI and the ✦ Smart mode of File Search are billed by the token, a chunk of text roughly the size of a short word or part of one.\n\nTwo things follow from that. First, you pay for the answer as well as the question, and a long answer costs more than a short one. Second, a conversation is charged cumulatively: each new message carries the earlier turns along as context, so a long thread costs more per message than a fresh one. Starting a new conversation when you change subject is the cheapest habit there is.\n\nPrices vary enormously between models: the range between a small open model and a frontier one is not a few percent, it is orders of magnitude. Smart search always uses a small, fast model, so a search costs very little.","metadata":{"title":"Costs and Spending","section":"Language: priced per token","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#language-priced-per-token","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#language-priced-per-token","collection":"docs7","hash":"f6d27850a636ae4b028d510b5bc408e8","indexed_by":"docs-index"}},{"content":"Costs and Spending — Images, video and 3D: priced per generation\n\nGenerative AI Studio is billed per output. An image has a fixed price for a given model and resolution; video is more expensive and usually scales with duration; 3D reconstruction is its own rate.\n\nHere the number of attempts is what drives the bill. Refining a prompt through ten variations costs ten generations, so it pays to be specific in the prompt rather than to iterate blindly.","metadata":{"title":"Costs and Spending","section":"Images, video and 3D: priced per generation","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#images-video-and-3d-priced-per-generation","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#images-video-and-3d-priced-per-generation","collection":"docs7","hash":"39c6b236f1fd97cebd0817666f5db89f","indexed_by":"docs-index"}},{"content":"Costs and Spending — Where to see the actual prices\n\nBoth providers publish a full price list per model, and it is the authoritative source, rates change as models are released and retired:\n\n* OpenRouter: openrouter.ai/models shows the per-token price of every model alongside its capabilities.\n* fal.ai: fal.ai/models lists each image, video and 3D model with its per-generation cost.\n\nCheck the price before you switch. The model dropdowns in Assistant and Integrations options do not show prices, because they change too often for us to keep accurate. Look the model up on the provider's page first, especially before pointing Flow Studio AI at something expensive.","metadata":{"title":"Costs and Spending","section":"Where to see the actual prices","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#where-to-see-the-actual-prices","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#where-to-see-the-actual-prices","collection":"docs7","hash":"f8965cd978716b26f37ba298c21c6c43","indexed_by":"docs-index"}},{"content":"Costs and Spending — See it, and cap it, in RhinoArtisan\n\nThe Assistant panel shows what the current conversation has cost so far, next to the Auto button, as OpenRouter bills it; hover it for today's total. In Options → Artisan → Assistant you can set a daily limit in dollars: once the Assistant's calls reach it, the Assistant stops for the day and says so in the chat.\n\nThe Assistant also keeps its costs down on its own. With Claude models, the long instructions and the tool descriptions that every message repeats are cached by the provider for a few minutes, so the second and later calls of a conversation pay a fraction for them. And each message is first read by a small, fast model that decides which tools it needs, so a short question doesn't carry the whole toolbox.","metadata":{"title":"Costs and Spending","section":"See it, and cap it, in RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#see-it-and-cap-it-in-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#see-it-and-cap-it-in-rhinoartisan","collection":"docs7","hash":"c11e04aff5f45ad8d9b01b5cf2622251","indexed_by":"docs-index"}},{"content":"Costs and Spending — Set limits at the provider\n\nBoth dashboards let you go further than the balance itself:\n\n* Spending limits: cap how much a key may consume over a period.\n* Per-key separation: issue one key per machine or per user, so you can see who is spending what and revoke one without disturbing the others.\n* Usage history: a breakdown by model and by day, which is the honest answer to \"where is the money going\".","metadata":{"title":"Costs and Spending","section":"Set limits at the provider","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#set-limits-at-the-provider","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#set-limits-at-the-provider","collection":"docs7","hash":"4d3f2faccd0bace5061fc8a34f023c26","indexed_by":"docs-index"}},{"content":"Costs and Spending — Choose models deliberately\n\nThe gap between a cheap model and a frontier one is not a rounding error, it is orders of magnitude. Which means the model dropdowns in Assistant and Integrations options are the biggest cost lever you have, bigger than any change in how much you use the tools. See Choosing models for how to pick.\n\nHabits that cost less\n* Start a new conversation when you change subject. Every message in a thread carries the earlier turns as context, so long threads get more expensive per message. A fresh conversation resets that.\n* Explore on a cheap image model, finish on an expensive one. Most of your generations are drafts you will discard. Pay the top rate only for the keeper.\n* Write the prompt properly the first time. Ten vague attempts cost ten generations. One specific prompt often costs one.\n* Ask the Assistant precise questions. A focused question gets a short answer, and you pay for the answer too.","metadata":{"title":"Costs and Spending","section":"Choose models deliberately","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#choose-models-deliberately","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#choose-models-deliberately","collection":"docs7","hash":"e496b4674e70dad225291bdbc391909f","indexed_by":"docs-index"}},{"content":"Costs and Spending — In a studio with several seats\n\nGive each machine its own key rather than sharing one. You get per-seat usage figures, you can set different limits, and if someone leaves you revoke a single key instead of rotating one that everybody is using.\n\nNothing is spent in the background\nRhinoArtisan does not make AI calls on its own. Every charge corresponds to something you asked for: a message sent, a script generated, an image produced, a Smart search run. Closing the panel spends nothing, and leaving RhinoArtisan open overnight spends nothing.\n\nReview it once, then stop worrying. Run normally for two weeks, open the provider dashboard, and look at the real total. For most individual users it is far below what they expected before they started.","metadata":{"title":"Costs and Spending","section":"In a studio with several seats","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#in-a-studio-with-several-seats","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/how-ai-pricing-works/#in-a-studio-with-several-seats","collection":"docs7","hash":"35078aadac13fcbb551160bcf1b0b641","indexed_by":"docs-index"}},{"content":"Privacy, Data and Third-Party Services\n\nUsing an AI feature means sending something to an outside company so it can be answered. That is unavoidable: it is what a frontier model is. What is avoidable is being vague about what gets sent.\n\nWhat leaves your computer\nThe Assistant: your messages and the earlier turns of that conversation, a short summary of the open design with every message (its type, metals, ring size and layers), and whatever the Assistant reads from the design to answer you: its elements and their parameters, the gems, the weights and, when you ask about price, the pricing breakdown and the Boutique data.\n\nFlow Studio AI: the description of the job you want scripted, the script under discussion, and the document context it reads first: the units, what is selected, and the gems in the selection.\n\nGenerative AI Studio: your prompt, plus any reference image or capture of your design you choose to send.\n\nFile Search: only the text of a ✦ Smart query. The indexes live in your user folder and the matching and ranking run locally over them, so your files, previews, prices and client data never leave your computer.","metadata":{"title":"Privacy, Data and Third-Party Services","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/","collection":"docs7","hash":"8eed1b5e0047d527df953d5c89c96ee2","indexed_by":"docs-index"}},{"content":"Privacy, Data and Third-Party Services — What never leaves\n\nYour files: your models, your Curator archive, your price lists, your client records, your technical documentation and your production files. RhinoArtisan does not upload your work anywhere, and there is no background sync. The tools above send only the data listed for each one, and only for a request you make.","metadata":{"title":"Privacy, Data and Third-Party Services","section":"What never leaves","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#what-never-leaves","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#what-never-leaves","collection":"docs7","hash":"b30a206c7c6325401115a41bec0c4fe6","indexed_by":"docs-index"}},{"content":"Privacy, Data and Third-Party Services — Your relationship is with the provider\n\nThe keys are yours and the accounts are yours, which means the data-handling terms that apply are theirs, not ours. RhinoArtisan is the program making the request on your behalf; we do not receive, store or process what you send, and we cannot see your conversations.\n\nBoth publish their policies, including how long requests are retained and whether they are used for training. If your work is under NDA, that is the document to read, and both offer settings and account tiers that affect the answer.\n\n* OpenRouter privacy policy\n* fal.ai privacy policy\n\nTwo habits worth keeping. Do not paste in anything you would not put in an email: client names, prices, terms of a contract, anything under NDA. And remember that a reference image you did not create may not be yours to feed in either; copyright does not stop applying because the destination is a model.","metadata":{"title":"Privacy, Data and Third-Party Services","section":"Your relationship is with the provider","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#your-relationship-is-with-the-provider","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#your-relationship-is-with-the-provider","collection":"docs7","hash":"fd6bb28f89a2a205d496cc513ad943a2","indexed_by":"docs-index"}},{"content":"Privacy, Data and Third-Party Services — If you cannot send anything at all\n\nSome work genuinely cannot leave the building. In that case the answer is not to find a different provider, it is to not use the AI tools for that job. Everything else in RhinoArtisan works with no outside connection at all: modeling, gemsets, manufacturing checks, pricing, reports and rendering never contact a provider.","metadata":{"title":"Privacy, Data and Third-Party Services","section":"If you cannot send anything at all","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#if-you-cannot-send-anything-at-all","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/privacy-and-data/#if-you-cannot-send-anything-at-all","collection":"docs7","hash":"671cc81e733bfa1fa9920bed144cbca0","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan\n\nRhinoArtisan combines professional jewelry CAD tools with a new generation of AI-powered capabilities. These technologies can help you explore ideas, interpret instructions, automate repetitive processes and create new content directly within your jewelry design workflow.\n\nHowever, not every RhinoArtisan tool uses artificial intelligence, and not every AI feature works in the same way. Understanding this distinction will help you choose the right tool, obtain better results and maintain control over your usage and costs.","metadata":{"title":"Understanding AI in RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/","collection":"docs7","hash":"f00fdcb25ba992db5e142b5f540617a0","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — Traditional CAD Tools and AI-Powered Tools\n\nMost RhinoArtisan tools are traditional CAD tools. They use defined geometric rules and parameters to create precise, editable and manufacturing-ready jewelry.\n\nFor example, when you create a basket setting, resize a ring or generate a technical report, RhinoArtisan performs a predictable operation using its own CAD technology.\n\nAI-powered tools work differently. Instead of following only a fixed set of geometric instructions, they can interpret natural language, understand images, generate new content or help decide how a more complex task should be performed.\n\nThis allows you to interact with RhinoArtisan in new ways, such as:\n\n- Describing what you want to create or modify using everyday language.\n- Asking an AI agent to perform a sequence of CAD operations.\n- Generating design concepts and visual variations.\n- Creating initial 3D geometry from a text description or reference image.\n- Developing automations for repetitive or customized workflows.\n- Using reasoning models to analyze a request and determine the appropriate RhinoArtisan tools.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"Traditional CAD Tools and AI-Powered Tools","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#traditional-cad-tools-and-ai-powered-tools","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#traditional-cad-tools-and-ai-powered-tools","collection":"docs7","hash":"7e42dca4d6f4d89d6aa14866b998c332","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — RhinoArtisan Is the Professional Workspace\n\nRhinoArtisan remains the environment in which jewelry is designed, edited, prepared and validated for production.\n\nThe AI does not replace RhinoArtisan’s CAD tools. Instead, it can help you operate them, combine them and use them more efficiently.\n\nA useful way to understand this relationship is:\n\n> RhinoArtisan provides the professional jewelry tools. AI models provide additional intelligence, interpretation and generative capabilities.\n\nFor example, an AI model may understand that you want to create several versions of a ring with different center-stone sizes. RhinoArtisan then provides the actual CAD commands required to change the stone, update the design and save each version.\n\nThe AI helps understand and organize the task. RhinoArtisan performs the real jewelry design operations.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"RhinoArtisan Is the Professional Workspace","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#rhinoartisan-is-the-professional-workspace","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#rhinoartisan-is-the-professional-workspace","collection":"docs7","hash":"00fd1678c42a50b11db3bada9e5334d0","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — Some AI Capabilities Run Through External Models\n\nAdvanced AI requires enormous computing resources and is continuously evolving. For this reason, some RhinoArtisan features connect to specialized AI models operated by external providers.\n\nDifferent models specialize in different types of work:\n\n- Language and reasoning models understand instructions, plan operations and generate automations.\n- Image models create, interpret or edit visual content.\n- Video models generate motion and presentation content.\n- 3D models create initial geometry from text or images.\n\nRhinoArtisan connects these capabilities to the jewelry workflow, allowing you to use them without leaving your design environment.\n\nThese models are not installed as part of RhinoArtisan and are not owned or operated by RhinoArtisan. They are cloud-based services that process a request whenever you choose to use an AI-powered feature.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"Some AI Capabilities Run Through External Models","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#some-ai-capabilities-run-through-external-models","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#some-ai-capabilities-run-through-external-models","collection":"docs7","hash":"4a53464d05c70c5cf027d57a6dd59fa7","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — The Right Intelligence for Each Task\n\nThere is no single AI model that is best at everything.\n\nA model that produces excellent images may not be able to understand a complex CAD workflow. A fast and economical model may be suitable for simple instructions, while a more advanced frontier model may be needed to plan a sophisticated automation or interpret a difficult design request.\n\nRhinoArtisan therefore provides access to different models and services instead of limiting every user to one fixed AI system.\n\nThis gives you greater flexibility:\n\n- Choose the model that best matches the task.\n- Balance quality, speed and cost.\n- Use economical models for experiments and iterations.\n- Use frontier models when accuracy and advanced reasoning are important.\n- Adopt new models as the technology continues to improve.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"The Right Intelligence for Each Task","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#the-right-intelligence-for-each-task","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#the-right-intelligence-for-each-task","collection":"docs7","hash":"955da6fc97129c8d3bb30d213b0dd8d4","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — You Remain in Control\n\nAI-powered features are optional. You can continue using RhinoArtisan’s traditional CAD and manufacturing tools without using external AI services.\n\nWhen you decide to use AI, you remain in control of:\n\n- The service and model you connect.\n- The information you submit.\n- The tasks you ask the model to perform.\n- The quality and performance level you select.\n- The amount you spend with the external provider.\n- The final geometry and content included in your project.\n\nAI-generated results should always be reviewed, especially when they affect dimensions, structural integrity, stone settings, production requirements or pricing.\n\nAI can accelerate the creative and technical process, but professional judgment remains essential.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"You Remain in Control","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#you-remain-in-control","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#you-remain-in-control","collection":"docs7","hash":"93caf2411a9a7c1c61daedd4aca9d319","indexed_by":"docs-index"}},{"content":"Understanding AI in RhinoArtisan — From CAD to Agentic CAD\n\nTraditional CAD waits for the designer to select and execute each command.\n\nAgentic CAD introduces another possibility: you can describe an objective, and an AI agent can help plan and execute the necessary operations using RhinoArtisan’s real tools.\n\nInstead of only asking AI to generate an attractive image, you can ask it to assist with meaningful design and production work: modify a model, create variations, prepare manufacturing information, calculate pricing or automate a repeatable workflow.\n\nThis is the fundamental role of AI in RhinoArtisan:\n\n> Not simply to imagine jewelry, but to help design, modify, prepare and produce it using professional CAD tools.","metadata":{"title":"Understanding AI in RhinoArtisan","section":"From CAD to Agentic CAD","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#from-cad-to-agentic-cad","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/understanding-ai/#from-cad-to-agentic-cad","collection":"docs7","hash":"65d96bdecd5ba1689d57d9162b6add83","indexed_by":"docs-index"}},{"content":"What Is an AI Model?\n\nA model is a trained system that does one kind of job. It was shown an enormous number of examples until it became good at predicting what should come next: the next word in a sentence, the next pixel in an image, and what it learned is stored as a large set of numbers called weights.\n\nThat is the whole idea. Everything else is consequence.","metadata":{"title":"What Is an AI Model?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/","collection":"docs7","hash":"1eb995175f9261105b91bd639f74a4d5","indexed_by":"docs-index"}},{"content":"What Is an AI Model? — Three consequences worth knowing\n\nEvery model is specialized. A model trained on language is good at language and useless at images. One trained on images knows nothing about your gemstone inventory. There is no single model behind RhinoArtisan's AI features, because no single model could do all those jobs.\n\nModels are replaced constantly. The strongest model in any category today is usually not the one from six months ago. This is why RhinoArtisan lets you choose your model from a list rather than hardcoding one: when something better appears, you switch to it without waiting for a RhinoArtisan update.\n\nA model does not know things, it predicts them. It has no database to check against and no way to tell a correct answer from a plausible one. It produces the most likely continuation of your prompt. Most of the time that lands on the truth. Sometimes it lands on something fluent and wrong, which is why nothing an AI tells you about a piece replaces the manufacturing checks that measure your actual geometry.","metadata":{"title":"What Is an AI Model?","section":"Three consequences worth knowing","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/#three-consequences-worth-knowing","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/#three-consequences-worth-knowing","collection":"docs7","hash":"f49c35b414016f53909c37c8e77de369","indexed_by":"docs-index"}},{"content":"What Is an AI Model? — Open weights and closed weights\n\nModels split into two families, and the difference decides almost everything about how you get access to them.\n\nOpen-weight models (Llama, Qwen, Mistral and many others) are published. You can download the weights, run them on your own hardware, and pay nothing but electricity. They are free and genuinely useful, and they are noticeably behind the top tier.\n\nClosed-weight models are never published. The weights stay with the lab that trained them, and the only way to use one is to send a request to their servers. Every model at the frontier of what AI can do belongs to this family, which is the subject of the next page.","metadata":{"title":"What Is an AI Model?","section":"Open weights and closed weights","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/#open-weights-and-closed-weights","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/what-is-an-ai-model/#open-weights-and-closed-weights","collection":"docs7","hash":"a0c927d5c357cdf6516fc58f72cda6ce","indexed_by":"docs-index"}},{"content":"Why Isn't AI Usage Included in the RhinoArtisan License?\n\nIt is a fair question and it deserves a real answer rather than a line in a settings dialog.\n\nThe models are not ours to give\nEvery model behind the AI features is a frontier model that cannot be downloaded, packaged or resold as a file, by us or by anyone. It exists only as a service running on hardware no desktop has, and every request to it costs the provider real money.\n\nAny software that offers you one is passing your request through to somebody else's model. The only question is who pays, and whether a margin is added.","metadata":{"title":"Why Isn't AI Usage Included in the RhinoArtisan License?","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/","collection":"docs7","hash":"c01180fc8536a0b1570a30b965ec8466","indexed_by":"docs-index"}},{"content":"Why Isn't AI Usage Included in the RhinoArtisan License? — We could have bundled a weaker model. We chose not to.\n\nThere is a whole family of open models we could have packaged inside RhinoArtisan and run on your machine for nothing. \"AI included\" would have looked good on the feature list.\n\nWe tried it, and the gap is not subtle. Jewelers ask the Assistant real questions about real work: whether a wall survives casting, how a seat should sit for a given stone, what a piece weighs in 18k. A smaller model answers those fluently and wrongly, which is the worst failure mode there is on a shop floor.\n\nBundling would have meant a worse tool sold as a better deal.","metadata":{"title":"Why Isn't AI Usage Included in the RhinoArtisan License?","section":"We could have bundled a weaker model. We chose not to.","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#we-could-have-bundled-a-weaker-model-we-chose-not-to","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#we-could-have-bundled-a-weaker-model-we-chose-not-to","collection":"docs7","hash":"a727ef577e8d39d4c7f120fd77989823","indexed_by":"docs-index"}},{"content":"Why Isn't AI Usage Included in the RhinoArtisan License? — What a flat price would actually mean\n\nIf AI were folded into the license, every user would pay for it in the price, including the ones who never open the panel. The designer generating a handful of images a year would be subsidizing the studio running hundreds a month.\n\nUsage-based billing puts the cost where the usage is. The heavy user pays for being a heavy user; everybody else keeps their money.","metadata":{"title":"Why Isn't AI Usage Included in the RhinoArtisan License?","section":"What a flat price would actually mean","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#what-a-flat-price-would-actually-mean","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#what-a-flat-price-would-actually-mean","collection":"docs7","hash":"f07d73e008a8d4433e55eb819f239575","indexed_by":"docs-index"}},{"content":"Why Isn't AI Usage Included in the RhinoArtisan License? — RhinoArtisan takes no margin\n\nThis is the part worth reading twice. You open an account with the provider, paste the key once into Options → Artisan → Integrations, and from then on you pay them directly for exactly what you use. Not a cent of it reaches us. We do not resell credits, we do not mark anything up, and we do not receive a share.","metadata":{"title":"Why Isn't AI Usage Included in the RhinoArtisan License?","section":"RhinoArtisan takes no margin","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#rhinoartisan-takes-no-margin","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#rhinoartisan-takes-no-margin","collection":"docs7","hash":"1465ba648469aaa72b91c1d4a96c6656","indexed_by":"docs-index"}},{"content":"Why Isn't AI Usage Included in the RhinoArtisan License? — And it leaves the dial in your hands\n\nBecause the billing is yours, so is the choice. You decide which model each feature uses, and you can move it up or down whenever you like: a cheap fast one for everyday questions, a stronger one when the job earns it. Bundle a single model into the license and that choice disappears along with the invoice.\n\nSee Choosing models for how to make that trade well.","metadata":{"title":"Why Isn't AI Usage Included in the RhinoArtisan License?","section":"And it leaves the dial in your hands","url":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#and-it-leaves-the-dial-in-your-hands","source":"https://www.rhinoartisan.com/docs/7/ai/models-and-services/why-ai-is-not-included/#and-it-leaves-the-dial-in-your-hands","collection":"docs7","hash":"b1585c89f18eb625aab770f193c7285e","indexed_by":"docs-index"}},{"content":"Automation\n\nYou do not need to be a programmer to automate RhinoArtisan. The idea is simple: any job you find yourself repeating — renaming stones, preparing exports, applying the same setup to every design — can become a tool you run with one click. Describing the job is enough; the AI writes the code, you just review and press Apply.\n\nFlow Studio AI Describe the job in plain language and the AI writes the script — review, apply, save.\n\nFlow Your saved automations, organized by color and one click from running again.","metadata":{"title":"Automation","url":"https://www.rhinoartisan.com/docs/7/automation/","source":"https://www.rhinoartisan.com/docs/7/automation/","collection":"docs7","hash":"8a71dfc7db2cb8519c79f8c5cab359fe","indexed_by":"docs-index"}},{"content":"Automation — Going deeper\n\nFor workshops with a technical hand on the team, RhinoArtisan opens all the way up:\n\n* Scripting API — the Python API Flow Studio writes against, documented for writing your own scripts by hand.\n* Grasshopper — RhinoArtisan's parametric components inside Grasshopper.\n* MCP — connect AI agents like Claude directly to RhinoArtisan and let them design, price, and prepare production for you.","metadata":{"title":"Automation","section":"Going deeper","url":"https://www.rhinoartisan.com/docs/7/automation/#going-deeper","source":"https://www.rhinoartisan.com/docs/7/automation/#going-deeper","collection":"docs7","hash":"954ad5c3b1b0e81e98decbe2d110a6a9","indexed_by":"docs-index"}},{"content":"Flow Studio AI\n\nBeta — RhinoArtisan Labs. Flow Studio AI ships in 7.0 as a beta, and it writes its scripts against the Scripting API, which is also beta: if the API evolves, describing the job again regenerates the script against the latest surface. All license terms apply to beta features.\n\nFlow Studio turns a sentence into an automation. Describe what you want done in your document — \"add a 0.5 mm bezel around every selected gem\", \"list the stones by size and price them\" — and it writes a Python script for exactly that, shows it to you, and runs it when you click Apply. Scripts that earn their keep get saved to your Flow library and become one-click tools.\n\nOpen it with `ArtisanFlowStudio`, or from Flow Studio in the ribbon's File tab.","metadata":{"title":"Flow Studio AI","url":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/","source":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/","collection":"docs7","hash":"51a092022c08954db5cecd2cefa8a717","indexed_by":"docs-index"}},{"content":"Flow Studio AI — Setting up\n\nFlow Studio needs two things: a network connection, and an OpenRouter API key entered in Options → Artisan → Integrations — see Accounts and API keys. The model it uses is the Flow Studio model on the same page; code is where a strong model pays off most, see Choosing models. Generation happens through your own OpenRouter account — running an already-saved flow needs neither the key nor the network.","metadata":{"title":"Flow Studio AI","section":"Setting up","url":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#setting-up","source":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#setting-up","collection":"docs7","hash":"c75be03fd254b857f37c4535e3771846","indexed_by":"docs-index"}},{"content":"Flow Studio AI — The conversation\n\nEvery message you type is a request for a script — this is not a general chat. Before asking, Flow Studio reads your document's context: the units, what is selected, and the gems in the selection with their shapes, materials, and sizes — so \"the selected stones\" means exactly that.\n\nThe reply is a proposal: *\"I prepared this script. Review it and click Apply to run it.\"* The ` ` toggle shows the actual code; Apply runs it, Cancel discards it. After the run you get a ✓ or ✗ with the result, and an OUTPUT card with anything the script printed.\n\nTwo buttons appear on the result:\n\n* 🔧 Fix it — when the script failed, one click sends the error back and a corrected version comes as a new proposal.\n* 💾 Save to Library — when it succeeded, give it a name, an optional description and tags, and it lands in the Flow panel, ready to run again on any future document.\n\nEverything a script changes in the document is wrapped in a single transaction, so one Undo reverts the whole run.","metadata":{"title":"Flow Studio AI","section":"The conversation","url":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#the-conversation","source":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#the-conversation","collection":"docs7","hash":"90acdb4693a30c10ccb6fed30ce851fc","indexed_by":"docs-index"}},{"content":"Flow Studio AI — Flow Studio and Flow\n\nFlow Studio is where flows are born — the conversation, the review, the first run. Flow is where they live: the library that lists, organizes, and re-runs them without touching the AI again. Both run scripts through the same engine, so a flow behaves identically in either panel.\n\nThe Apply button is the security boundary: nothing runs until you click it, and what runs is real code with full access to Rhino and your document. Use the ` ` toggle when in doubt — the script is short and written to be read.","metadata":{"title":"Flow Studio AI","section":"Flow Studio and Flow","url":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#flow-studio-and-flow","source":"https://www.rhinoartisan.com/docs/7/automation/flow-studio/#flow-studio-and-flow","collection":"docs7","hash":"0b45e7a0ac721594c88d51c403d864cc","indexed_by":"docs-index"}},{"content":"Flow\n\nFlow is the library where your automations live. Every flow you save from Flow Studio AI lands here as a script file, and the Flow panel is where you come back to run it — today, next week, on the next hundred designs.\n\nOpen it with `ArtisanFlow`, or from Flow Panel in the ribbon's Flow Studio menu.","metadata":{"title":"Flow","url":"https://www.rhinoartisan.com/docs/7/automation/flow/","source":"https://www.rhinoartisan.com/docs/7/automation/flow/","collection":"docs7","hash":"78b5bf5d573000e2030dffb161f760f6","indexed_by":"docs-index"}},{"content":"Flow — The panel\n\nEach saved flow appears as a card with its name and description, a Run button, and a menu with Edit code, Rename, and Delete. The output box at the bottom shows what the run printed, prefixed OK or Error.\n\nEvery card carries a color dot — click it to cycle through eight colors and use them however you organize your work: by client, by task, by maturity. The dots in the toolbar filter the list to one color; click the active dot again to see everything.\n\nThree more toolbar buttons: ＋ creates a new flow by opening Flow Studio AI, Open scripts folder takes you to the files themselves, and Refresh re-reads the list.","metadata":{"title":"Flow","section":"The panel","url":"https://www.rhinoartisan.com/docs/7/automation/flow/#the-panel","source":"https://www.rhinoartisan.com/docs/7/automation/flow/#the-panel","collection":"docs7","hash":"ac1872db59943621f4ef1d0c26bc0bb8","indexed_by":"docs-index"}},{"content":"Flow — What a flow is on disk\n\nA flow is a self-contained Python file in the `AssistantScripts` folder of your Artisan user folder, with its name, description, and color stored in a small comment header. There is no database and no sidecar files — which means flows can be backed up, version-controlled, and shared with a colleague by sending the file; anything dropped into the folder shows up in the panel.\n\nEdit code opens the file in the code editor configured in Options → Artisan → Folders, or your system's default editor for .py files.\n\nA flow is a real script with full access to Rhino and your document — Run executes it immediately, with no confirmation. Only run flows you wrote, generated yourself, or trust as if you had.","metadata":{"title":"Flow","section":"What a flow is on disk","url":"https://www.rhinoartisan.com/docs/7/automation/flow/#what-a-flow-is-on-disk","source":"https://www.rhinoartisan.com/docs/7/automation/flow/#what-a-flow-is-on-disk","collection":"docs7","hash":"9739fd83350403d003363cc0a9e8e911","indexed_by":"docs-index"}},{"content":"Diamonds\n\nEverything in this tab is about stones: putting them where they belong, building the metal that holds them, and checking afterwards that what you set can actually be made.\n\nEight groups, left to right.\n\nStudios\nGem Studio The main stone browser and editor.\n\nBaguette Studio\n\nGem Creator\n\nThree Stones The classic three-stone layout.\n\nToi et Moi Two stones facing each other.","metadata":{"title":"Diamonds","url":"https://www.rhinoartisan.com/docs/7/diamonds/","source":"https://www.rhinoartisan.com/docs/7/diamonds/","collection":"docs7","hash":"5413ffaf14ef34ca5e6c97e3a31b1217","indexed_by":"docs-index"}},{"content":"Diamonds — Gems along curves\n\nGems on Curve A run of stones following one curve.\n\nAdvanced Gems on Curve Full control over spacing, rotation and size variation.\n\nGems on 2 Curves Stones fitted between two rails, sizing to the gap.\n\nGems from Circle Turn existing circles into stones of the matching size.\n\nGems on Network Stones over a network of curves.\n\nTapered Baguettes on Curves A run of tapered baguettes between two curves.","metadata":{"title":"Diamonds","section":"Gems along curves","url":"https://www.rhinoartisan.com/docs/7/diamonds/#gems-along-curves","source":"https://www.rhinoartisan.com/docs/7/diamonds/#gems-along-curves","collection":"docs7","hash":"d7f48ac54a369f5c40e5293c103a853e","indexed_by":"docs-index"}},{"content":"Diamonds — Pearl and Cabochon\n\nPearl A pearl with its drill hole.\n\nCabochon A domed, unfaceted stone.\n\nGemsets\nBezel A rim of metal around the stone.\n\nAdvanced Bezel The same with every dimension exposed.\n\nBasket The open cage under the stone.\n\nAdvanced Basket The same with every dimension exposed.\n\nCluster A group of stones set as one head.\n\nHalo A ring of small stones around the centre one.\n\nPeg Head A head on a peg, ready to drop into a mount.\n\nTulip The tulip-shaped head.\n\nMartini The conical martini-glass setting.\n\nTrellis Crossing prongs that weave under the stone.\n\nHidden Halo A halo under the centre stone, seen only from the side.\n\nChannel Stones held between two walls of metal.","metadata":{"title":"Diamonds","section":"Pearl and Cabochon","url":"https://www.rhinoartisan.com/docs/7/diamonds/#pearl-and-cabochon","source":"https://www.rhinoartisan.com/docs/7/diamonds/#pearl-and-cabochon","collection":"docs7","hash":"f7595ac4e05b8b0a82ec9f9d234bdda3","indexed_by":"docs-index"}},{"content":"Diamonds — Trilogy\n\nTrilogy Trellis\n\nTrilogy Halo\n\nTrilogy East-West\n\nTrilogy Individual\n\nTrilogy Bezels\n\nPave and prongs\nPave Place pave stones by hand.\n\nAutomatic Pave Fill a region automatically.\n\nAlong Surface\n\nDynamic Prongs Prongs that follow the stones as they move.\n\nCustom Prongs Replace the generated prongs with a prong you modelled.\n\nProng Axis","metadata":{"title":"Diamonds","section":"Trilogy","url":"https://www.rhinoartisan.com/docs/7/diamonds/#trilogy","source":"https://www.rhinoartisan.com/docs/7/diamonds/#trilogy","collection":"docs7","hash":"54892864c31da3ba54e82c4bffb11aae","indexed_by":"docs-index"}},{"content":"Diamonds — Cutters and micro setting\n\nCutters The seats and holes for each stone.\n\nMicro Setting The cutter geometry for micro-set stones.\n\nAzure The decorative openings under the stones.\n\nGem tools\nTurn Upside Down Flip stones that went in the wrong way.\n\nRotate gems left\n\nRotate gems right\n\nGems Recover Restore stones that lost their gem data.\n\nGem Curve The curve a run of stones sits on.\n\nGems Center\n\nGem Offset\n\nCurve from Gems\n\nCenter Between Gems\n\nGem Move Move a stone on its own plane.\n\nReduce Gem Size by % Scale stones down by a percentage.\n\nGems Info Sizes, counts and weights of everything in the file.\n\nShow Orientation\n\nColor by Size\n\nGem Tags\n\nCopy by Gems Copy an object onto every stone.\n\nCPlane on Gem Put the construction plane on a stone.\n\nCollision Find stones that overlap or intersect.\n\nFlip Plane Fix the construction plane of mirrored stones so their cutters point the right way.\n\nEvery command on this tab is RhinoArtisan's own — this is the part of the product Rhino has no equivalent for.","metadata":{"title":"Diamonds","section":"Cutters and micro setting","url":"https://www.rhinoartisan.com/docs/7/diamonds/#cutters-and-micro-setting","source":"https://www.rhinoartisan.com/docs/7/diamonds/#cutters-and-micro-setting","collection":"docs7","hash":"2a25ed04d49c6f7b658e9795b7d7ce47","indexed_by":"docs-index"}},{"content":"Baguette Studio — Baguette Studio\n\nThe Baguette Studio command provides specialized functionality for designing baguette-cut gemstones with precision. Unlike the Gem Studio tool, which offers general gemstone creation, Baguette Studio focuses specifically on the complexities of the baguette cut: straight and tapered baguettes, standard commercial sizes, and full control over the cut's proportions.","metadata":{"title":"Baguette Studio","section":"Baguette Studio","url":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#baguette-studio","source":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#baguette-studio","collection":"docs7","hash":"0b0eb2a04dd84bc411ad1d307497e99e","indexed_by":"docs-index"}},{"content":"Baguette Studio — Selection Options\n\nThe Selection section offers the same placement flexibility as Gem Studio:\n\n* In the CPlane: Adds a baguette with the specified parameters to the center of the viewport, aligned to the construction plane (CPlane).\n* On a point: Adds a baguette at the selected point by clicking in the viewport, for precise placement at any predefined location.\n* On geometry: Adds a baguette on the selected surface by clicking, aligning it with the surface's orientation for seamless integration.","metadata":{"title":"Baguette Studio","section":"Selection Options","url":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#selection-options","source":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#selection-options","collection":"docs7","hash":"8384f2afebe83382399cf88b3cc31284","indexed_by":"docs-index"}},{"content":"Baguette Studio — List of Sizes\n\nThe List of sizes button opens a table of standard commercial baguette sizes. Each entry lists the Length, Top Width, Bottom Width, Depth % and the resulting Weight in carats. Pick a size from the list and accept to apply all its dimensions at once — the fastest way to work with the calibrated sizes your stone supplier actually stocks.","metadata":{"title":"Baguette Studio","section":"List of Sizes","url":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#list-of-sizes","source":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#list-of-sizes","collection":"docs7","hash":"1c4e3d239ed74deb24f4e75261a7aa48","indexed_by":"docs-index"}},{"content":"Baguette Studio — Parameters\n\nThe main parameters define the outline and depth of the stone:\n\n* Height: The length of the baguette, from end to end.\n* Top Width: The width of the wider end.\n* Bottom Width: The width of the narrower end. Set it equal to the Top Width for a straight baguette, or smaller for a tapered baguette.\n* Depth %: The total depth of the stone as a percentage of its width, following the gemological convention (64% is the standard baguette). Changing it scales the crown, girdle and pavilion proportionally, keeping the standard split between them.","metadata":{"title":"Baguette Studio","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#parameters","collection":"docs7","hash":"de602f227da60521e9ff1e4ec449c63d","indexed_by":"docs-index"}},{"content":"Baguette Studio — Advanced Parameters\n\nEnable the Advanced checkbox to unlock detailed faceting control over each part of the cut:\n\n* Table Height and Table Width: Define the size of the table (the flat top facet) along and across the stone.\n* Pavilion Scale: Controls how much the pavilion contracts toward the culet.\n* Culet Length: The length of the culet line — baguettes end in a keel line rather than a point, and this parameter controls how long that line is.\n* Girdle Depth: The thickness of the girdle band.\n* Crown Depth: The height of the crown, from the girdle to the table.\n\nThese parameters let you match the exact make of a real stone — essential when the setting must fit a supplier's parcel rather than an idealized cut.\n\nGoldsmith Tip: Designing pieces with multiple baguette stones can be challenging, especially when dealing with tapered baguettes that must be placed close together. Achieving precise and accurate placement of these stones is crucial in such cases. RhinoArtisan has introduced the Baguette Studio command to assist jewellers in creating designs with baguette cuts with unparalleled precision.\n\nBaguette Studio empowers jewellers with the tools needed to navigate the unique challenges of baguette cuts, offering both flexibility and accuracy for high-quality gemstone design. For placing a run of tapered baguettes along a curve automatically, see Tapered Baguettes on Curves.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Baguette Studio","section":"Advanced Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#advanced-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/baguette-studio/#advanced-parameters","collection":"docs7","hash":"392b7445d849b14a0266c9eacd981e98","indexed_by":"docs-index"}},{"content":"Gems by Circles — Gems by Circles\n\nThe Gems by Circles command is a simple yet powerful tool for placing round gemstones precisely. It uses the circles you select in your design as guides, and creates a round diamond on each one — with the same diameter as the circle and sitting on the circle's plane.\n\nHow It Works\n1. Select Circles: Choose the circles where you want the gemstones — you can pick as many as you need in one go, and preselection also works. Only true circles are used; any other curve in the selection is simply ignored.\n2. Automatic Placement: One click, and every circle becomes a gemstone:\n* Consistent Size: Each gemstone matches the diameter of its circle exactly.\n* Aligned Plane: Each gemstone is placed on the plane of its circle, so the orientation is always correct — even on circles that were flowed onto curved surfaces.\n\nThe created stones are placed on the gems layer and listed on the Outliner toolbar, ready for prongs, cutters and your gem report.\n\nGoldsmith Tip: This can be very useful for pieces that need the Quick Flow on Srf tool. Distribute the circles on a flat surface, flow them onto a complex curved surface, and once you are satisfied with the circle distribution, place all the gems in a single click.","metadata":{"title":"Gems by Circles","section":"Gems by Circles","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-by-circles/#gems-by-circles","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-by-circles/#gems-by-circles","collection":"docs7","hash":"68f78b7442e45dc650843846cdbe85f5","indexed_by":"docs-index"}},{"content":"Gems on 2 Curves — Gems on 2 Curves\n\nWith this command, you can parametrically generate gems between two curves. This is especially useful when filling spaces with gems on organic designs and other complex pieces: the size of each gemstone is automatically determined by the distance between the curves, so the distribution adapts itself to the shape you drew.","metadata":{"title":"Gems on 2 Curves","section":"Gems on 2 Curves","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#gems-on-2-curves","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#gems-on-2-curves","collection":"docs7","hash":"5d2f142022c609a9b5315111a8ccb178","indexed_by":"docs-index"}},{"content":"Gems on 2 Curves — Selection\n\nStart by selecting the two curves that define the path and the width available for the stones. Unlike other gem placement commands where you define the number and size of the stones, here both are computed automatically so the gemstones fit perfectly within the space provided.\n\nFour handles appear on the curves — one at each end of each curve. Drag them to limit the stretch of the curves used for the distribution, without trimming or editing the original geometry. The panel also reports the distance between the first and last stone, which is very handy when the run must stop at an exact point of the shank.\n\nIf the selected curves are arcs or circles, the command offers to convert them to NURBS curves so the distribution can be computed along them.\n\nThe Parameters section is divided into three tabs: Gems, Prongs and Cutters.","metadata":{"title":"Gems on 2 Curves","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#selection","collection":"docs7","hash":"fe062ca5c23da930db5d8990bfcf0206","indexed_by":"docs-index"}},{"content":"Gems on 2 Curves — Gems\n\n* Material: The gemstone material, from Diamond (white or Champagne) to the colored varieties of Sapphire, Topaz, Tourmaline, Quartz and more. The stones are round brilliants, sized automatically to the space between the curves.\n* Algorithm: Choose how the stones are distributed: By spine curve places them along the middle line between the two curves, while By tangency packs each stone tangent to the previous one — the right choice when consecutive stones must touch.\n* Gems Distance: The spacing between consecutive gemstones.\n* Min. Size: The minimum gem diameter. Where the curves get too close together for a stone of this size, no stone is placed — use it to avoid dust-sized gems at the tapered ends.\n* Move in Z: Fine-tune the vertical position of the stones relative to the curves.\n* Alignment Vertical: Align the gems by their Top (table) or by their Girdle.\n* Flip / Flip First / Flip Second: If the stones come out on the wrong side or the distribution looks twisted, these switches reverse the orientation of the result or the direction of either curve.\n* Precise: Rebuilds the curves internally for a more accurate distribution on complex or unevenly parameterized curves.\n* Group: Groups the generated stones into a single object when the command is confirmed.\n\nThe Info section shows the resulting stone count and the total carat weight, updated live as you adjust the parameters — your gem report before you even confirm.","metadata":{"title":"Gems on 2 Curves","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#gems","collection":"docs7","hash":"7afe8d7dcf1b57db13f873497eaad617","indexed_by":"docs-index"}},{"content":"Gems on 2 Curves — Prongs\n\n* Show Prongs: Enable this selector to generate prongs for the run.\n* Prong Distribution: Choose Shared Prongs (two prongs between consecutive stones, shared by both) for a streamlined look, or Individual Prongs (four prongs per stone) for more secure support. Each prong displays its diameter in the viewport, and gumballs let you fine-tune positions directly on the model.\n* Diameter: The thickness of the prongs.\n* Distance: The separation between the two shared prongs.\n* Height over girdle / Height under girdle: How far the prongs rise above and extend below the girdle of each stone.\n* Extension manufacturing: Adds extra length to the prongs when the piece is switched to Manufacturing mode, giving the setter material to work with.\n* End Prong Mode: Single or double prongs for the first and last stones of the run.","metadata":{"title":"Gems on 2 Curves","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#prongs","collection":"docs7","hash":"837b2ef4b02f939fb573464a63a6ec21","indexed_by":"docs-index"}},{"content":"Gems on 2 Curves — Cutters\n\n* Show Cutters: Enable this selector to generate a cutter under each gemstone — the volume used to open the seat and drill hole in the metal.\n* Type: The cutter profile: Gemstone Shape, Round, Square or Hexagon.\n* Heights (as a percentage of each gem): Height Top, Height Crown, Height Girdle, Height Pavilion and Height Drill control each section of the cutter, from the volume above the stone down to the drill hole.\n* Sizes (as a percentage of each gem): Size Top, Size Bottom and Size Drill control the width of the cutter at each level.\n* Gem Inside: How deep the gemstone sits inside the metal, in millimeters.\n\nBecause the cutters are sized per stone, the graduated run keeps correct seats from the largest gem to the smallest one.\n\nGoldsmith Tip: Imagine designing a jewelry piece where gemstones need to be evenly distributed between two curves that outline a specific area, such as a ring's shank. By using the Gems on 2 Curves command, the software will automatically place and size the gemstones according to the distance between the curves. You can then adjust the spacing and alignment to perfect the design.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gems on 2 Curves","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#cutters","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-2-curves/#cutters","collection":"docs7","hash":"3ace8fd8274cd0112f0ccb461183f48f","indexed_by":"docs-index"}},{"content":"Gems on Curve - Advanced — Advanced Gems on Curve\n\nWith this command, you can parametrically add gems to any curve with full control over the sequence: instead of one repeated stone, you build a list of gem groups — each with its own quantity, shape, sizes and rotation — and the command distributes the whole sequence along the curve. This is the tool for graduated runs, alternating patterns and any distribution that a single-stone repeat can't describe.","metadata":{"title":"Gems on Curve - Advanced","section":"Advanced Gems on Curve","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#advanced-gems-on-curve","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#advanced-gems-on-curve","collection":"docs7","hash":"62fe27e249fbd030fa5dd383d8038a24","indexed_by":"docs-index"}},{"content":"Gems on Curve - Advanced — Selection\n\nSelect the curve along which the gems will be distributed and, optionally, the geometry the gems will be oriented to. Two handles appear at the ends of the curve: drag them to limit the stretch of the curve used for the distribution, without editing the original geometry.\n\nGem Groups\nThe heart of the command is the groups table. Each row defines one group of stones in the sequence:\n\n* Qt: The number of stones in the group.\n* Shape: The cut used by the group, chosen from the Gem Studio catalog.\n* Start and End: The size of the first and last stone of the group. The sizes of the stones in between are interpolated, so a single row gives you a smooth graduated run.\n* Rotation: The rotation of the group's stones in their plane — useful for fancy cuts.\n\nAdd or remove rows to build the pattern: one row makes a classic graduated line; several rows create alternating sequences — for example, one 3 mm round followed by five 1.5 mm rounds, repeated along the shank.","metadata":{"title":"Gems on Curve - Advanced","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#selection","collection":"docs7","hash":"7f1a02e3843a55e72dea4960c90749c1","indexed_by":"docs-index"}},{"content":"Gems on Curve - Advanced — Parameters\n\n* Gems Distance: The spacing between consecutive gemstones along the curve.\n* Move in Z: Fine-tune the vertical position of the gems relative to the curve.\n* Alignment on Curve: Choose where the distribution begins along the curve — from the Start, the Center or the End.\n* Alignment Vertical: Align the gems to the curve by their Top (table) or by their Girdle.\n* Starting Point: Measure the distribution from the Boundary of each stone or from its Center — crucial for projects with minimal margins between components or when working with very small gems.\n* Gem Orientation: Place the gems in their Natural orientation or Upside Down (culet up, for reverse-set designs).\n* Orientation Plane: Enable it to display the orientation plane of each gem in the viewport, to verify how every stone will sit before confirming.\n\nGoldsmith Tip: It can be very effective to adjust the control points of the curve you're using to distribute the gemstones. After making adjustments, reselect the curve in the selection panel. This approach allows you to dynamically refine the curve, leading to more precise placement of the gemstones.\n\nOnce you confirm your changes, all the stones you have generated will be listed on the Outliner toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gems on Curve - Advanced","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve-advanced/#parameters","collection":"docs7","hash":"76901c4348799db708b8c2bb4f0ac33f","indexed_by":"docs-index"}},{"content":"Gems on Curve — Gems on Curve\n\nGems On Curve is a versatile tool designed for distributing gemstones along a selected curve with precision and flexibility. This command is particularly useful for creating intricate designs where gems follow specific paths, such as on rings, bracelets, or other curved surfaces.\n\n#### How It Works\n\nOnce activated, the command provides two areas: the Selection section and the Parameters section.","metadata":{"title":"Gems on Curve","section":"Gems on Curve","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#gems-on-curve","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#gems-on-curve","collection":"docs7","hash":"d579676d0503cf6be6af4268f8d4cfe0","indexed_by":"docs-index"}},{"content":"Gems on Curve — Selection\n\n* Curve Selection: Begin by selecting the curve on which the gems will be distributed. This can be any open or closed curve within the design.\n* Orientation Object (Optional): Optionally, select a geometry to orient the gems to. The gems will align with the surface, ensuring proper placement on complex designs.\n\nThe Parameters section is divided into three tabs: Gems, Prongs and Cutters.","metadata":{"title":"Gems on Curve","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#selection","collection":"docs7","hash":"d5161cdf87357da9a6e50856504902e9","indexed_by":"docs-index"}},{"content":"Gems on Curve — Gems\n\nThe first tab controls the gemstone distribution along the curve:\n\n* Shape: Choose the gemstone cut — the full Gem Studio catalog plus Tapered Baguette for graduated channel layouts.\n* Material: Select the gemstone material, from Diamond (white or Champagne) to the colored varieties of Sapphire, Topaz, Tourmaline, Quartz and more.\n* Gem Size: Adjust the size of the gemstones. For fancy cuts, a second field controls the size in the other direction.\n* Gems Distance: Define the spacing between gemstones along the curve.\n* Move in Z: Fine-tune the vertical position of the gemstones relative to the curve.\n* Gem Rotation: Enable it to rotate every gem 90° in its plane — for example, to set baguettes across the curve instead of along it.\n* Alignment Vertical: Align the gems to the curve by their Top (table) or by their Girdle.\n* Starting Point: Distribute the gems from the Center of the curve outward (symmetrical placement) or from its Boundary (suitable for open curves).\n* Gem Orientation: Place the gems in their Natural orientation or Upside Down (culet up, for reverse-set designs).\n* Orientation Plane: Enable it to display the orientation plane of each gem in the viewport, to verify how every stone will sit before confirming.","metadata":{"title":"Gems on Curve","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#gems","collection":"docs7","hash":"c9a0304b6fc9ea2b0dd3036a1844b12c","indexed_by":"docs-index"}},{"content":"Gems on Curve — Prongs\n\nThe second tab adds and customizes the prongs holding the gemstones:\n\n* Show Prongs: Enable this selector to generate prongs around the gemstones.\n* Prong Distribution: Choose between the two distribution modes:\n* Shared Prongs: Two prongs placed between consecutive gemstones, shared by both. Ideal for a streamlined look with minimal metal.\n* Individual Prongs: Four prongs per gemstone, for more secure support of larger or heavier stones. In this mode a gumball appears on one of the prongs of the first stone, letting you adjust its position directly in the viewport.\n* Diameter: Set the thickness of the prongs.\n* Distance: Control the separation between the two shared prongs.\n* Height over girdle: How far the prongs rise above the girdle to hold the stone.\n* Height under girdle: How far the prongs extend below the girdle.\n* Extension manufacturing: Adds extra length to the prongs when the piece is switched to Manufacturing mode, giving the setter material to work with.\n* End Prong Mode: Choose Double or Single prongs for the first and last gemstones of the run.","metadata":{"title":"Gems on Curve","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#prongs","collection":"docs7","hash":"14aeba2a34b6d0e4c8fde2e591514359","indexed_by":"docs-index"}},{"content":"Gems on Curve — Cutters\n\nThe third tab generates a cutter for each gemstone — the volume used to open the seat and drill hole in the metal:\n\n* Show Cutters: Enable this selector to generate a cutter under each gemstone.\n* Cutter Shape: Choose the cutter profile: Gem Shape (follows the outline of the stone), Round, Square or Hexagon.\n* Heights (as a percentage of the gem): Height Top, Height Crown, Height Girdle, Height Pavilion and Height Drill control each section of the cutter, from the volume above the stone down to the drill hole.\n* Sizes (as a percentage of the gem): Size Top, Size Girdle, Size Bottom and Size Drill control the width of the cutter at each level.\n* Gem Inside: How deep the gemstone sits inside the metal, in millimeters.\n\nGoldsmith Tip: It can be very effective to adjust the control points of the curve you're using to distribute the gemstones. After making adjustments, reselect the curve in the selection panel. This approach allows you to dynamically refine the curve, leading to more precise placement of the gemstones.\n\nOnce you confirm your changes, all the stones you have generated will be listed on the Outliner toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gems on Curve","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#cutters","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-curve/#cutters","collection":"docs7","hash":"57498367f8af6f481e9ecb545f1fcb67","indexed_by":"docs-index"}},{"content":"Gems on Network — Gems on Network\n\nWith this command, you can parametrically generate gems on a network of intersecting curves: RhinoArtisan distributes the stones along every curve and places gems right at the intersections. This is especially useful when adding gems to organic designs and complex pieces where multiple paths cross.\n\nSelection\nSelect one or more curves that form the network — they will typically intersect at several points, defining the paths along which the gemstones are placed. Optionally, select the geometry the gems will be oriented to, so the stones follow the surface of your piece.","metadata":{"title":"Gems on Network","section":"Gems on Network","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#gems-on-network","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#gems-on-network","collection":"docs7","hash":"25dceed5faf6fb5b36085d9aa19ae21c","indexed_by":"docs-index"}},{"content":"Gems on Network — Parameters\n\n* Gem Size: The default diameter for the gemstones distributed along the curves.\n* Min Distance: The minimum spacing between gemstones along the curves.\n* Move in Z: Fine-tune the vertical position of the gems relative to the curves.\n\nInteractive size control\nThe software automatically places a gemstone at each intersection and at the ends of the curves, and marks these key stones with control dots so they are easy to identify. Click a dot to change the size of that gemstone: the sizes of the stones between that point and the next key point (another intersection or the curve's end) are interpolated automatically, creating a smooth, harmonious gradient along the path.\n\nThis is what makes the command shine: you decide the size at the critical points of the design, and the network fills itself in between.","metadata":{"title":"Gems on Network","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#parameters","collection":"docs7","hash":"503b3840e080f079afbe3fe941fa26db","indexed_by":"docs-index"}},{"content":"Gems on Network — Advanced\n\nThe Advanced section contains two display aids for working on dense networks:\n\n* Swap Display Mode: Switches the preview between full gemstones and lightweight circles, keeping the viewport fast on large networks.\n* Show Gem Sizes: Displays the size of each gemstone in the viewport, so you can audit the whole distribution at a glance.\n\nGoldsmith Tip: You can gain additional control over gemstone sizes by adding extra control points. Split the curves at desired locations before starting the command — every curve end counts as a key point, giving you more places to adjust gem sizes independently.\n\nOnce you confirm your changes, all your generated stones will be listed on the Outliner toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gems on Network","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#advanced","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/gems-on-network/#advanced","collection":"docs7","hash":"6ad076bc741fe3dcaf32bc85d1f26d7d","indexed_by":"docs-index"}},{"content":"Tapered Baguettes on Curves — Tapered Baguettes on Curves\n\nThe Tapered Baguettes on Curves command places tapered baguettes between two rail curves, one click at a time. Each baguette spans straight from one curve to the other, automatically taking the length of the gap between the rails — the classic workflow for graduated baguette bands, where every stone has a slightly different size and the setting must follow the taper of the shank.","metadata":{"title":"Tapered Baguettes on Curves","section":"Tapered Baguettes on Curves","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#tapered-baguettes-on-curves","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#tapered-baguettes-on-curves","collection":"docs7","hash":"7667ee00e02672da4afcfe037dd35f82","indexed_by":"docs-index"}},{"content":"Tapered Baguettes on Curves — How It Works\n\n1. Select the two rail curves. They define the top and bottom edges of the baguette run.\n2. Click on a curve to place a baguette. As you move the cursor, a dotted line previews the span from the curve under the cursor to the other rail. The clicked rail carries the wider top edge of the baguette, and the stone stretches straight to the opposite rail. The length adapts to the gap at that exact spot, and the stone's proportions — table, culet — scale with it, so every baguette lands with a correct make.\n3. Adjust each stone in place. Every placed baguette keeps its own set of controls:\n* Arrows to edit the stone directly in the viewport: length, top and bottom widths, and depth.\n* Two white anchor points, one on each rail, that slide along their curve to reposition the gem — including sliding them independently to lean the stone diagonally between the rails.\n4. Undo (command option) removes the last placed baguette if you misclick.\n5. Press Enter to bake, or Esc to discard everything.\n\nIf the two curves touch at the spot you click, there is no room for a stone there — the command will ask you to pick a point where the rails are apart.","metadata":{"title":"Tapered Baguettes on Curves","section":"How It Works","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#how-it-works","collection":"docs7","hash":"ba9199f54fc30055b914fb7a2fd4cbed","indexed_by":"docs-index"}},{"content":"Tapered Baguettes on Curves — After baking\n\nThe baked stones are individual gems — no group — placed on the gems layer with their material applied, and listed on the Outliner toolbar like any other gemstone. Each baguette can be edited later through Baguette Studio from the Outliner, so you can refine any stone of the run without touching the others.\n\nGoldsmith Tip: Draw the two rails as the real borders of your channel, with the taper you want the band to have. Since each baguette takes its length from the local distance between the rails, the graduation of the whole run comes out automatically — you just click once per stone.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Tapered Baguettes on Curves","section":"After baking","url":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#after-baking","source":"https://www.rhinoartisan.com/docs/7/diamonds/by-curves/tapered-baguettes-on-curves/#after-baking","collection":"docs7","hash":"119ba634ec8b80e2f673ee499d15a2b0","indexed_by":"docs-index"}},{"content":"Cabochon — ​ Cabochon\n\nThe Cabochon command is a versatile tool for placing and customizing cabochon stones in your designs. It offers two main sections: the Selection section, where you choose the placement method, and the Parameters section, where you define the cabochon's shape and detailed measurements.\n\nSelection\nIn the Selection section, you decide how and where to place your cabochon once all the parameters are set:\n\n1. Add: Places the cabochon at the center of the CPlane.\n2. Pick a point: Places the cabochon at the point you click in the viewport.\n3. Point on geometry: Places the cabochon directly on the surface of an object, aligned with the surface at the clicked point.","metadata":{"title":"Cabochon","section":"​ Cabochon","url":"https://www.rhinoartisan.com/docs/7/diamonds/cabochon/#-cabochon","source":"https://www.rhinoartisan.com/docs/7/diamonds/cabochon/#-cabochon","collection":"docs7","hash":"69a0b38788323e3a6c1c9eeee0199956","indexed_by":"docs-index"}},{"content":"Cabochon — Parameters\n\nIn the Parameters section, you define the characteristics of your cabochon:\n\nShape: Choose the outline of the cabochon: Round, Oval, Rectangular, Heart, Pear, Marquise or Diamond.\n\nStyle: Select the style of the cabochon's top surface:\n\n* Cabochon: The classic domed cut with a flat base.\n* Buff Top Single Bevel: A softly domed top over a single beveled side.\n* Buff Top Double Bevel: A softly domed top over two stacked bevels.\n* Flat Top Single Bevel: A flat table with a single beveled side.\n* Flat Top Double Bevel: A flat table with two stacked bevels.\n\nMeasurements:\n\n* X / Y / Z: The main dimensions of the stone — length, width and height.\n* Angle: The inclination of the top section, most visible on the bevel styles.\n* Girdle Angle: The angle of the girdle wall, which controls how the cabochon sits in the setting.\n* Girdle Height: The height of the girdle band, which impacts the stone's profile and how much it rises above the setting.\n\nGoldsmith Tip: Cabochons are usually calibrated by their outline (X and Y) while the height varies with the material. Save your usual proportions with the Save defaults button in the header, and adjust only Z when switching between stone materials.\n\nOnce you confirm your changes, the cabochon you have created will be listed on the Outliner toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Cabochon","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/cabochon/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/cabochon/#parameters","collection":"docs7","hash":"a0de721d3e1d6d0e0f24abb989e42a04","indexed_by":"docs-index"}},{"content":"Gem Creator — Gem Creator\n\nThe Gem Creator command allows you to create a fully custom gemstone directly from a planar curve, using that curve as the stone's girdle outline. Once the girdle is defined, the command builds the complete stone — table, crown, girdle, pavilion and culet — and gives you precise control over every proportion. It is the tool to reach for when the stone you need doesn't exist in the Gem Studio catalog: freeform cabochon outlines, antique cuts, or a real stone you must reproduce exactly.","metadata":{"title":"Gem Creator","section":"Gem Creator","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#gem-creator","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#gem-creator","collection":"docs7","hash":"31e2793447bca2d759cbef365c235659","indexed_by":"docs-index"}},{"content":"Gem Creator — Selection\n\nSelect the closed planar curve that defines the girdle — the stone's silhouette seen from the top. The command generates the gemstone from it in real time, and every parameter change updates the preview immediately.\n\nGoldsmith Tip: Use your mobile device to capture a top-view image of your stone, or scan it with a document scanner if the base is flat. Import the image into the viewport, scale it to its actual size, and trace the silhouette with the curve commands. Then apply Gem Creator to accurately recreate the stone in your scene in just a few steps.","metadata":{"title":"Gem Creator","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#selection","collection":"docs7","hash":"bf20128962395479eaa3f0ae900866c9","indexed_by":"docs-index"}},{"content":"Gem Creator — Compound\n\nThe Compound section sets the stone's material, with a wider library than Gem Studio that includes the color varieties of each species: Diamond (white and Champagne), Ruby, Emerald, Sapphire, Amethyst, Aquamarine, Morganite, Chalcedony, Citrine (Orange, Yellow, Orange-Yellow), Peridot (Green, Yellow-Green), Topaz (Red, Violet, Pink, Blue, Green, Brown), Tourmaline (Pink, Blue, Black, Green), Tanzanite (Purple, Green), Spessartite, Quartz (clear, Rose, Smoky Gray, Smoky Brown) and Moissanite. The material drives the viewport color and the density used for weight calculations.","metadata":{"title":"Gem Creator","section":"Compound","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#compound","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#compound","collection":"docs7","hash":"d94e49687156c22c7e2f5e3f30ccca57","indexed_by":"docs-index"}},{"content":"Gem Creator — Parameters\n\nAll proportions can be edited in millimeters or as a percentage of the stone's width — switch between the two modes with the % / mm toggle, and the values stay in sync either way:\n\n* Table X and Table Y: The size of the table (the flat top facet) along and across the stone. The table keeps the shape of the girdle outline, scaled to these dimensions.\n* Crown Depth: The height of the crown, from the girdle up to the table.\n* Girdle Depth: The thickness of the girdle band.\n* Pavilion Depth: The depth of the pavilion, from the girdle down to the culet.\n* Cullet Width: The width of the culet. At zero the pavilion closes to a point or keel; increase it to open a flat culet, as in many antique cuts.\n* Scrolling: Shifts the table and culet off-center along the length of the stone. Use it to reproduce asymmetric cuts — shield shapes, freeform stones scanned from real material — where the apex is not centered on the outline.\n\nPercentage mode is the natural way to keep a cut's character while resizing: save your proportions as defaults with the Save defaults button in the header (right-click it to clear them), and every new outline you select will get the same make.\n\nThis tool offers the flexibility to craft a fully customized gemstone from a simple planar curve, easily enabling precise and unique designs.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gem Creator","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-creator/#parameters","collection":"docs7","hash":"9f9ce134af767dfb9e73bf77141f6148","indexed_by":"docs-index"}},{"content":"Gem Studio — Gem Studio\n\nThe Gem Studio command provides a comprehensive solution for creating gemstones in various popular cuts within the RhinoArtisan software. This command offers a streamlined and efficient approach to gemstone design, making it a powerful tool for jewelers. Below are the essential features and functionalities:","metadata":{"title":"Gem Studio","section":"Gem Studio","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#gem-studio","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#gem-studio","collection":"docs7","hash":"4391f7141914c88ad3f0e8c37a675f1e","indexed_by":"docs-index"}},{"content":"Gem Studio — Selection Options\n\nThe Selection section allows users to position their gemstone with a high degree of flexibility by offering multiple placement options:\n\n* In the CPlane: Adds a gemstone with the specified parameters to the center of the viewport, perfectly aligned to the construction plane (CPlane).\n* On a point: Adds a gemstone at the selected point by clicking in the viewport. This allows for precise placement of gemstones at any predefined location.\n* On a surface: Adds a gemstone with the specified parameters on the surface selected by clicking. The gemstone will align with the surface's curvature or orientation for seamless integration.\n\nThis flexibility in placement ensures accurate integration of gemstones into your designs, whether you're placing them in specific positions or aligning them to complex surfaces.","metadata":{"title":"Gem Studio","section":"Selection Options","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#selection-options","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#selection-options","collection":"docs7","hash":"ecdafafcacc9e34c1926f4a9532e867e","indexed_by":"docs-index"}},{"content":"Gem Studio — Gem Shapes\n\nRound Princess Radiant Cushion Pear Oval Heart Emerald Marquise Asscher Trillion Calf Coffin Triangle Baguette\n\nNew cuts: Calf, Coffin and Baguette\n\nGem Materials\nOffers a range of gemstone materials, each represented by their corresponding color. This feature allows users to visualize their designs with material colors, ensuring that gemstones match the overall aesthetic of the piece.\n\n> Note: These materials are used primarily for design purposes. When preparing for rendering, it is essential to use the appropriate materials from the Render and Animation panel to ensure that the gemstones have the correct appearance in the final render.","metadata":{"title":"Gem Studio","section":"Gem Shapes","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#gem-shapes","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#gem-shapes","collection":"docs7","hash":"92bbf9d9b6f2141061d19f3eec68d52e","indexed_by":"docs-index"}},{"content":"Gem Studio — Parameters Tab\n\nCarats: Determines the gemstone’s weight and size, based on standard carat measurements. When the command is opened, the default material is set to Diamond, with the carat weight set to 1 ct and a diameter of 6.50 mm. If the material is changed, for example, to Ruby, the carat weight will adjust to reflect the density of the selected material. A Ruby with a brilliant cut and a diameter of 6.50 mm would weigh approximately 1.13 ct.\n\nDiameter: Controls the width of the gemstone at its widest point.\n\n(Z) Depth: Adjusts the height or depth of the gemstone from the culet (bottom point) to the table (top facet).\n\nAlignment: This option aligns the gemstone to the center of the CPlane based on the chosen alignment option:\n\n* Girdle: Aligns the gemstone so that the girdle (the widest perimeter) is centered on the CPlane.\n* Table: Aligns the gemstone so that the table (the flat top facet) is centered on the CPlane.\n* Culet: Aligns the gemstone so that the culet (the bottom point) is centered on the CPlane.\n\nMove in Z: This option allows you to move the gemstone along the Z-axis.\n\nGoldsmith Tip: Start by creating the ring curve when designing a ring. Next, use the curve selection option to position the stone, ensuring the \"Vertical from Culet\" alignment is selected. Adjust the \"Move in Z\" parameter to set the desired distance from the finger to the stone's culet. Finally, position the mouse at the top of the ring curve visible in the viewport to accurately place the stone at the specified distance. Now, you can continue developing your design with the exact placement of the central stone.\n\nWith the Gem Studio command, jewellers can efficiently create and position gemstones, ensuring accuracy and consistency across their designs.","metadata":{"title":"Gem Studio","section":"Parameters Tab","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#parameters-tab","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#parameters-tab","collection":"docs7","hash":"b7ac6c1e75cf3efee2930719b24c664d","indexed_by":"docs-index"}},{"content":"Gem Studio — Parameters Tab\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Gem Studio","section":"Parameters Tab","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#parameters-tab","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-studio/#parameters-tab","collection":"docs7","hash":"d8e6be68684f8cf22814c0388ecc328e","indexed_by":"docs-index"}},{"content":"Center Between Gems — Center Between Gems\n\nThe Center Between Gems command finds the natural prong locations between neighboring stones and marks each one with a reference circle.\n\nSelect the diamonds and gemstones to analyze, or press Enter to run the command on every gem already in the document. The command then looks at every group of three gems that sit close enough to touch a common point, and fits a circle tangent to the three girdles — the spot where a shared prong would naturally sit between them. All the resulting circles are added to the document as a single group, ready to guide prong placement.\n\nIf no gems are found in the selection or in the document, the command reports it and does nothing.\n\nGoldsmith Tip: Run this command after laying out a pavé or cluster to quickly see where shared prongs should go, instead of eyeballing the gaps between stones.","metadata":{"title":"Center Between Gems","section":"Center Between Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/center-between-gems/#center-between-gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/center-between-gems/#center-between-gems","collection":"docs7","hash":"396d0e4d25bb4975cbe6ee7493b463a8","indexed_by":"docs-index"}},{"content":"Color by Size — Color by Size\n\nThis command allows us to change the color of the gems based on their size. It's excellent for analyzing or selecting gems by their dimensions.\n\nCounting or locating specific gem sizes within a pavé can be a time-consuming task.\n\n&#x20;The 'Color by Size' command simplifies this process by visually distinguishing groups of gems of the same size with different colors. This makes it quick and easy to identify and differentiate gem sizes, ensuring a clear and accurate visualization :\n\nGoldsmith Tip: \"Using this tool together with the gem selection feature in the Outliner allows you to quickly count, locate, and visualize all the different gem sizes at a glance.","metadata":{"title":"Color by Size","section":"Color by Size","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/color-by-size/#color-by-size","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/color-by-size/#color-by-size","collection":"docs7","hash":"26781c7e4c840dffafd886e7d75b0d9b","indexed_by":"docs-index"}},{"content":"Copy by Gems — Copy by Gems\n\nThis command allows us to create copies of objects from one gem to multiple gems, with the option to scale them proportionally to the size available.\n\nAs shown in the image, we will copy a Bezel made with SubD and apply it to all the gems.\n\n1. Select the source gem, or press Enter to use the CPlane as the source instead.\n2. Select the target gems; you can choose as many as you want.\n3. Select the object or objects to copy. While picking, a Scale option lets you choose how the copies adapt to each target gem's size:\n- No — copies keep their original size.\n- 2D — copies are scaled in X and Y by the ratio between the target gem's size and the source gem's size.\n- 3D — copies are scaled uniformly in X, Y and Z by that same ratio.","metadata":{"title":"Copy by Gems","section":"Copy by Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/copy-by-gems/#copy-by-gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/copy-by-gems/#copy-by-gems","collection":"docs7","hash":"a8c087cc189350622208bdba5f174533","indexed_by":"docs-index"}},{"content":"CPlane on Gem — CPlane on Gem\n\nThe CPlane on Gem command aligns the active viewport's construction plane to the plane of a selected gem.\n\nSelect a single diamond or gemstone. The command reads the gem's own plane and sets it as the construction plane of the active view, so the CPlane's origin sits at the gem and its axes follow the gem's orientation. The command line reports the coordinates the CPlane was aligned to.\n\nThis is a quick way to start sketching or snapping relative to a specific stone — for example, drawing a prong or seat profile flat against the gem's own plane instead of the world CPlane.\n\nGoldsmith Tip: Use this before drawing prongs or bezels by hand around a single stone — it saves you from manually rotating the CPlane to match the gem's tilt.","metadata":{"title":"CPlane on Gem","section":"CPlane on Gem","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/cplane-on-gem/#cplane-on-gem","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/cplane-on-gem/#cplane-on-gem","collection":"docs7","hash":"faf794afab7da146ef64ab43cf4f399f","indexed_by":"docs-index"}},{"content":"Curve from Gems — ​ Curve from Gems\n\nWith this command, you can create a curve following the center of multiple stones. It's especially useful to generate custom geometry for your designs around its gems.\n\nIt is effortless: select two or more gems, and a curve will be created automatically.","metadata":{"title":"Curve from Gems","section":"​ Curve from Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/curve-from-gems/#-curve-from-gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/curve-from-gems/#-curve-from-gems","collection":"docs7","hash":"fd2b3eadd31cf63958d5a78bfbacd907","indexed_by":"docs-index"}},{"content":"Flip Plane — Flip Plane\n\nThe Flip Plane command in RhinoArtisan is designed for workflows that involve symmetry, especially when mirroring gemstones from one half of a ring to the other. When gems are reflected, their construction plane orientation is also reversed. As a result, if cutters are applied to these mirrored stones, they will be created in the wrong direction.\n\nTo correct this, the Flip Plane command allows users to \"flip\" the construction plane of these reflected gems. By selecting the mirrored gemstones and activating the command, the cutters will be correctly aligned, ensuring proper orientation for further modifications or manufacturing processes.\n\nThis tool is particularly useful when working with symmetrical designs, helping to maintain accuracy and consistency in gemstone placement and cutter alignment.","metadata":{"title":"Flip Plane","section":"Flip Plane","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/flip-plane/#flip-plane","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/flip-plane/#flip-plane","collection":"docs7","hash":"b229fd150076c537c90aa0e26037ff57","indexed_by":"docs-index"}},{"content":"Gem Curve — Gem Curve\n\nThis command extracts the girdle curve of one or more gems.&#x20;\n\nSelect one or more gems, and press Enter.","metadata":{"title":"Gem Curve","section":"Gem Curve","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-curve/#gem-curve","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-curve/#gem-curve","collection":"docs7","hash":"c00a181481883e449b47717f426d264d","indexed_by":"docs-index"}},{"content":"Gem Info — Gem Info\n\nThis command creates dots with the dimensions of each gem in its position. These dots are editable and printable for technical reports.\n\nThe process is as simple as selecting the gems or using a window that contains all the objects. The command will search for the gems and ignore the other objects. It will then ask if we want the dots to be a different colour based on the size of each gem.\n\nIf you click 'Yes,' the text indicating the sizes of the selected gemstones will be displayed in different colors, making it easier to identify and locate stones of the same size. If you click 'No,' all the sizes will be shown in a single color.","metadata":{"title":"Gem Info","section":"Gem Info","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-info/#gem-info","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-info/#gem-info","collection":"docs7","hash":"3e91c0075b7110c21ffaaf1c1ac30fc7","indexed_by":"docs-index"}},{"content":"Gem Reduce by Percentage — Gem Reduce by Percentage\n\nThe Gem Reduce by Percentage command shrinks selected unlisted gemstones by a percentage, keeping their cut proportions.\n\nSelect the gems to reduce. Two options are available on the command line while selecting:\n\n* Percentage: How much to shrink the gems, from 0 to 100%.\n* Step: The increment the resulting diameter (X/Y) is snapped to, so sizes land on round numbers instead of odd decimals.\n\nThe depth (Z) is scaled by the same reduction factor as the diameter, so the stone keeps its original proportions. Each gem is rebuilt from scratch at the new size, in the same position, layer, name and group as the original, with the gemstone material re-applied; the old gem is then deleted. When the command finishes, it lists the previous and new size of every gem that was reduced on the command line.\n\nOnly unlisted gemstones are affected — other gem types in the selection are skipped and counted separately.\n\nGoldsmith Tip: Use a small Percentage (2–5%) with a Step matching your usual size increments to nudge an entire pavé down to the next standard size without breaking the layout.","metadata":{"title":"Gem Reduce by Percentage","section":"Gem Reduce by Percentage","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-reduce-by-percentage/#gem-reduce-by-percentage","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-reduce-by-percentage/#gem-reduce-by-percentage","collection":"docs7","hash":"58e5e67bd7d00706f627d24d7c19969d","indexed_by":"docs-index"}},{"content":"Gem Tags — Gem Tags\n\nThe Gem Tags command labels each selected gem with a text tag showing its measures, weight and material.\n\nSelect the diamonds and gemstones to tag, or press Enter to tag every gem already in the document. For each gem, a three-line text entity is placed above the stone's table, on the gem's own plane:\n\n* The measures (X x Y, in mm).\n* The carat weight.\n* The compound/material.\n\nThe text size scales with the gem so the tag stays legible on both small and large stones. When the command finishes, it reports how many gems were tagged on the command line.\n\nIf no gems are found in the selection or in the document, the command reports it and does nothing.\n\nGoldsmith Tip: Use Gem Tags before exporting a technical sheet or sending a design for review — it gives an at-a-glance readout of every stone's size, weight and material directly in the viewport.","metadata":{"title":"Gem Tags","section":"Gem Tags","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-tags/#gem-tags","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gem-tags/#gem-tags","collection":"docs7","hash":"2a795a1d57a303d0e3fc63aac19ae3da","indexed_by":"docs-index"}},{"content":"Gems Center — Gems Center\n\nThis command extracts the centre points of one or more gems.&#x20;\n\nSelect one or more gems, and press Enter.","metadata":{"title":"Gems Center","section":"Gems Center","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-center/#gems-center","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-center/#gems-center","collection":"docs7","hash":"3b0e386dfddbf827cc49f6cab3cb88a1","indexed_by":"docs-index"}},{"content":"Gems Collision — Gems Collision\n\nThe Collision command automatically detects if any gemstones in the design are overlapping or intersecting.\n\nWhen the Collision icon is clicked, the system scans every gemstone in the document (no selection needed) and selects the ones whose meshes actually intersect — their geometries overlap in space, which could lead to issues during manufacturing or stone setting.\n\nThis command is especially useful for quickly reviewing the final design before creating renderings, prototypes, or production files, ensuring that all stones are correctly placed without interference.\n\nGoldsmith's Tip: In tightly packed pavé or multi-stone designs, using Collision helps prevent common mistakes that might only become evident during printing or assembly.","metadata":{"title":"Gems Collision","section":"Gems Collision","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-collision/#gems-collision","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-collision/#gems-collision","collection":"docs7","hash":"c98140324d7c1f15719ff6eaba286c60","indexed_by":"docs-index"}},{"content":"Gems Move — Gems Move\n\nThis command allows us to move gems globally while each one follows its direction. This tool is crucial for adjusting pavés or complex gem structures.\n\n1. Select gems to move\n2. Set the distance. This parameter can be negative.","metadata":{"title":"Gems Move","section":"Gems Move","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-move/#gems-move","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-move/#gems-move","collection":"docs7","hash":"abd355a258751e2ecf32ad27de3f9554","indexed_by":"docs-index"}},{"content":"Gems Offset — Gems Offset\n\nThis command extracts the girdle curve and applies an offset of one or more gems.&#x20;\n\n1. Select one or more gems.\n2. Set the offset value; this parameter can be negative.","metadata":{"title":"Gems Offset","section":"Gems Offset","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-offset/#gems-offset","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-offset/#gems-offset","collection":"docs7","hash":"777446a8e4bea39f20fac8b8a9d631fb","indexed_by":"docs-index"}},{"content":"Gems Orientation — Gems Orientation\n\nThis command allows us to view each gem's individual alignment and rotate it in 90° steps. It's especially useful when the gems aren't aligned the way we'd like them to be for applying gem sets.\n\nAbove each gem, the plane and an edit button (pencil icon) will be displayed. Clicking the button rotates the gem 90° around its own plane normal. We can repeat the process as many times as needed.\n\nRunning the command again with the handles still on screen turns them off.","metadata":{"title":"Gems Orientation","section":"Gems Orientation","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-orientation/#gems-orientation","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/gems-orientation/#gems-orientation","collection":"docs7","hash":"d229983668953084d94a4001fe68e567","indexed_by":"docs-index"}},{"content":"Recover — ​ Recover\n\nThis command allows us to convert any gem created in other plugins, such as RhinoGold, Matrix, or MatrixGold, into RhinoArtisan gems, and work with them as if they were made in RhinoArtisan.\n\nRun the command; it scans the whole document by itself, no selection needed, and converts every matching gem it finds.\n\nSometimes the recovered stones may appear flipped. To correct their orientation, use our Turn Upside Down command to reverse their position..\n\nWe should note that MatrixGold creates blocks for each gem. Therefore, we recommend selecting the gems and using the ExplodeBlock command to break down the blocks and obtain a convertible mesh.","metadata":{"title":"Recover","section":"​ Recover","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/recover/#-recover","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/recover/#-recover","collection":"docs7","hash":"420a34ab7f8b42d9043a3209df5859a6","indexed_by":"docs-index"}},{"content":"Rotate Gems - Left or Right — ​ Rotate Gems - Left or Right\n\nUsing this command, you can horizontally rotate one or multiple gems at once on their individual axis.\n\nOnce you run this command, it will ask you to select the gems you want to rotate, once selected, you can click on the number in the command prompt to type the angle in degrees you want your gems to be rotated. Pressing the Enter key finishes the rotation.","metadata":{"title":"Rotate Gems - Left or Right","section":"​ Rotate Gems - Left or Right","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/rotate-gems-left-or-right/#-rotate-gems---left-or-right","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/rotate-gems-left-or-right/#-rotate-gems---left-or-right","collection":"docs7","hash":"c31d8a808c8284d88408cbacc6477b09","indexed_by":"docs-index"}},{"content":"Turn upside down — ​ Turn upside down\n\nThis command allows us to change the orientation plane of the gems. By default, RhinoArtisan automatically orients the gems, but in some cases, even if they are geometrically oriented correctly, they may be internally reversed.\n\nSelect the gems to flip and press Enter; each one is rotated 180° around its own construction plane, reversing its orientation.","metadata":{"title":"Turn upside down","section":"​ Turn upside down","url":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/turn-upside-down/#-turn-upside-down","source":"https://www.rhinoartisan.com/docs/7/diamonds/gem-tools/turn-upside-down/#-turn-upside-down","collection":"docs7","hash":"36fed56cd5b9189c75b5e637003a53f3","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket\n\nThe Advanced Basket command is the free-form version of Basket. Where the base command builds a regular basket from a single set of parameters — one prong distribution, one upper rail, one lower rail — Advanced Basket treats the basket as a list of prongs and a list of rails, each one an independent item you can add, move, duplicate, mirror, edit or delete on its own.\n\nRun the command and select one or more gemstones. Each selected gem gets its own basket, all sharing the same parameters.\n\nThe panel opens on the preset library, the same gallery you already know from the other gemsets: pick a saved basket, or click the pen icon to enter the parameters and design your own. Inside the parameters there are two tabs, Prongs and Rails.","metadata":{"title":"Advanced Basket","section":"Advanced Basket","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#advanced-basket","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#advanced-basket","collection":"docs7","hash":"59df837e106976b2d81e3604f8c39a05","indexed_by":"docs-index"}},{"content":"Advanced Basket — Prongs\n\nThe Prongs tab is a list. Every prong in the list is a numbered card with its own color, and that color is used for its handle in the viewport, so you always know which card matches which prong on screen.\n\nProng presets\nAbove the list there is a row of Assets presets that lay out a whole set of prongs in one click: None, 4, 2-2, 4-V, 6, 3-3, 8 and so on. The row adapts to the shape of the stone — Round, Cushion, Pear and Oval have their own dedicated layouts, and the remaining shapes (Princess, Radiant, Asscher, Emerald, Baguette, Marquise, Heart, Trillion, Triangle, Calf, Coffin…) get a preset row built for their geometry, with the prongs already placed on the corners, tips or flat sides where a goldsmith would put them. On sharp shapes the presets even push the prongs at the points slightly outwards so they do not dig into the tip of the stone. Applying a preset replaces the current prongs.\n\nGoldsmith Tip: Start from the preset closest to what you want and then correct only the prongs that need it. The presets are a starting layout, not a limit — the whole point of this command is that every prong afterwards is independent.","metadata":{"title":"Advanced Basket","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#prongs","collection":"docs7","hash":"82e2ef13cc917e0c6348c4e64f7b531f","indexed_by":"docs-index"}},{"content":"Advanced Basket — Working with the list\n\n* Add Prong: click the add button and then click on the gem outline in the viewport; the prong is created exactly where you clicked.\n* Duplicate: copies a prong with all its parameters.\n* Symmetry H / Symmetry V / Symmetry Quad: mirrors the prong across the horizontal axis, the vertical axis, or into all four quadrants. The mirror is geometric — it reflects the prong's real point on the gem outline — so it stays correct on non-round stones such as Oval or Marquise.\n* Edit: opens the individual editor for that prong.\n* Delete: removes the prong.\n\nYou can also drag a prong directly in the viewport: each prong has a handle placed over its top, and a vertical handle at the gem centre controls the height of the whole set.","metadata":{"title":"Advanced Basket","section":"Working with the list","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#working-with-the-list","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#working-with-the-list","collection":"docs7","hash":"23119c676578ff9f48972030cd713faf","indexed_by":"docs-index"}},{"content":"Advanced Basket — Common parameters\n\nBelow the list, the common parameters edit every prong of the set at once: Diameter, Height, Gem Inside, Over Girdle, Bottom Diameter, Rotation, Exp. Manufacturing, Bottom Inside, straight or curved, Inclination and Inclination Z, Bottom to Center and Tangent. Gem Inside is applied as a relative shift, so the per-prong corrections that the presets made (a prong pushed out of a sharp tip, for example) are preserved instead of being flattened. Two extra controls appear only when the set contains Double or Triple prongs: Separation, and External Inside for the exterior prong of a Triple.","metadata":{"title":"Advanced Basket","section":"Common parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#common-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#common-parameters","collection":"docs7","hash":"d72ca607f8a8010eb9b4aafb7e977477","indexed_by":"docs-index"}},{"content":"Advanced Basket — Editing an individual prong\n\nThe individual editor is where Advanced Basket goes beyond the base command. Each prong has a Mode:\n\n* Round: a plain circular prong.\n* Custom: the prong section is a curve from your assets. You can choose a different Top Profile, and decide whether the Bottom Profile is round or the same custom curve.\n* Offset: a V-shaped prong built from parameters instead of a curve, with Angle, Thickness, Length and Fillet defined separately for the top and the bottom profile.\n* Double: a pair of prongs controlled as a single item, with a Separation slider.\n* Triple: a pair plus an exterior prong that automatically touches the stone; Exterior Gem Inside pushes that middle prong in or out.\n* Claw: a claw prong, shaped with Cap Distance, Cap Height, Tip Width and Tip Smoothness.\n\nThe rest of the individual parameters:\n\n* Position: where the prong sits along the gem outline, as a normalized position, so you can place it with precision instead of dragging.\n* Diameter and Bottom Diameter: the thickness of the prong at the top and at the base — set them differently for a tapered prong.\n* Height: the total length of the prong.\n* Gem Inside: how far the prong bites into the stone.\n* Over Girdle: how much prong stands above the girdle.\n* Rotation: rotates the prong section.\n* Exp. Manufacturing: extra length added for production, exactly as in the base Basket.\n* Straight / Curved: in curved mode, Inclination sets the outward bow in degrees and Inclination Z moves the belly of the curve up or down along the prong.\n* Bottom Inside: where the base of the prong sits, from the gem centre (0) to straight under the top (1).\n* Tangent: the prong faces the normal of the gem outline instead of the radial direction from the gem centre — the difference is visible on fancy shapes.","metadata":{"title":"Advanced Basket","section":"Editing an individual prong","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#editing-an-individual-prong","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#editing-an-individual-prong","collection":"docs7","hash":"140796929c5a8b23df701f4443dda319","indexed_by":"docs-index"}},{"content":"Advanced Basket — Rails\n\nThe Rails tab works the same way: a list of independent rails instead of the fixed upper and lower rail of the base command. You can add as many as the design needs.\n\n* Add Rail: click the add button and then pick the height on the vertical line through the gem to place the rail.\n* Add 1 Rail and Add 2 Rail: quick presets that replace the current rails with one or two rails at default positions.\n* Each rail card can be duplicated, edited or deleted, and each rail has its own handle in the viewport to slide it up and down.","metadata":{"title":"Advanced Basket","section":"Rails","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#rails","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#rails","collection":"docs7","hash":"6434728dfbeae82ccf02684b65571b2e","indexed_by":"docs-index"}},{"content":"Advanced Basket — Editing an individual rail\n\n* Mode: Round section or Custom Shape, taking the curve from your assets.\n* Width and Height: the dimensions of the rail section.\n* Under Girdle: the distance of the rail below the girdle plane.\n* Rotation: rotates the rail section.\n* Bend Height and Bend Rotation: bend the rail out of its plane and turn the bend around the stone, for rails that are not simple horizontal rings.\n* Fillet Radius: rounds the edges of the rail.\n* Rail Offset Y: shifts the whole rail sideways; 0 keeps it centred on the stone.\n* Creation: Sweep or Revolve — the construction method used to build the rail.\n* Profile Pos.: places the section Front or Side relative to the sweep direction.\n* Mirror: mirrors the section curve.\n* Gem size Percentage: the size of the rail relative to the stone, as a percentage.\n\nGoldsmith Tip: Use the individual prong editor for the prongs that carry the stone and the common parameters for everything else. A classic trick on fancy cuts is to keep all prongs identical except the ones at the points: give those a bigger Gem Inside and a Claw or Offset mode so the tip is really protected.","metadata":{"title":"Advanced Basket","section":"Editing an individual rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#editing-an-individual-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#editing-an-individual-rail","collection":"docs7","hash":"c81365653acc49ca9e40c7274a5a28d8","indexed_by":"docs-index"}},{"content":"Advanced Basket — Presets and defaults\n\nThe header of the panel carries the usual actions. Save stores the current basket in the gallery, so it becomes a preset you can apply to any other stone later — the preset keeps the prong and rail parameters and adapts them to the live gem. Save defaults stores the current basket as your starting point, so the next time you run the command it opens with your values; right-click the same button to delete them and go back to the factory values.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Advanced Basket","section":"Presets and defaults","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#presets-and-defaults","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-basket/#presets-and-defaults","collection":"docs7","hash":"ca5729afcf95a4bf550c8d5e447f00fd","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Advanced Bezel\n\nThe Advanced Bezel command is the free-form version of Bezel. The base command builds the bezel wall from a fixed set of numbers — width, height, over girdle height, girdle — while Advanced Bezel lets you draw the section of the wall yourself, point by point, directly in the viewport against the silhouette of the stone. Everything else — post supports, cutters and airgaps — is still there, plus the construction and measuring options a production file needs.\n\nRun the command and select one or more gemstones. Each selected gem gets its own bezel, all sharing the same parameters. Unlike the base command, Advanced Bezel opens straight into the parameters: there is no gallery to go through first.\n\nThe panel is organized as three tabs inside the Parameters section: Profile, Cutters and Airgaps.","metadata":{"title":"Advanced Bezel","section":"Advanced Bezel","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#advanced-bezel","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#advanced-bezel","collection":"docs7","hash":"cb51eca55a83dadfe768067b6ba41519","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Profile\n\nThis is the heart of the command. Instead of numeric fields for the wall, RhinoArtisan draws a cross-section of the bezel in the viewport — the wall profile as a thick accent polyline, together with the silhouette of the stone cut by the same plane — and you shape the wall by dragging the numbered points of that profile.\n\nThe panel keeps the list of those points in sync: each row shows a numbered badge matching the numbered dot in the viewport.\n\n* Profile Points: the list of points of the wall section. Point 1 is the anchor on the gem outline and cannot be deleted; a profile always keeps at least three points.\n* Add Point: click the add button and then click on the profile polyline in the viewport. The new point is inserted into the segment you clicked, and the rest of the profile stays exactly where it is.\n* Sharp / smooth corner: each point row has a break toggle. A sharp point makes a corner; a smooth point lets the wall pass through it as a curve — the same idea as the break points of the asset editor.\n* Delete: removes a point from the profile.\n* Undo: steps back through your last profile changes (dragging, adding, deleting, toggling a corner).\n* Radius: fillets the sharp corners of the profile. 0 keeps them sharp.\n\nDragging a point only moves that point: the offsets of the following points are compensated automatically, so the rest of the section does not travel with it.\n\nGoldsmith Tip: Draw the section against the stone silhouette, not from memory. Give the inner face enough metal above the girdle to hammer over the stone, and remember that filing and polishing will eat part of it — what you see in the section is the metal before finishing.","metadata":{"title":"Advanced Bezel","section":"Profile","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#profile","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#profile","collection":"docs7","hash":"f435a97d0baa206aff311f0fa8d20f07","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Post Support\n\n* Post Support: adds from 1 to 6 supports for an earring post, or None.\n* Width and Thickness: the dimensions of those supports.\n\nAdvanced\n* Bezel mode: how the wall is built on the rounded gem shapes — Automatic (the per-shape default, matching the classic Bezel command), Sweep or Rail revolve. In Rail revolve a draggable handle appears on the gem plane together with a dashed line showing the revolve axis: move it to shift the axis away from the gem centre and open up asymmetric walls. The special multi-segment shapes (Marquise, Heart, Trillion, Triangle, Calf, Coffin) keep their own construction and ignore this option.\n* Section plane: where the editing section is taken — Perpendicular to the girdle curve, or forced to the gem's ZX or ZY plane.\n* Position (%): moves the editing section along the outline of the stone, from 0 % at the gem's +X side. On fancy shapes this lets you check the same profile at the point, at the side and at the shoulder.\n\nThe section plane and its position only change what you see and edit in the viewport; the solid is not affected.","metadata":{"title":"Advanced Bezel","section":"Post Support","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#post-support","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#post-support","collection":"docs7","hash":"317686fbd1b455996e08a5a49e218c53","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Viewport helpers\n\n* Bounding box: draws the bounding box of the section with its X and Y sizes, as proper dimensions.\n* Sharp point distances: dimensions the straight distances between consecutive sharp points around the profile — the measurements you would hand to the bench.\n* Hide elements: hides the stones and the bezel preview so the section and its dimensions read on their own.","metadata":{"title":"Advanced Bezel","section":"Viewport helpers","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#viewport-helpers","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#viewport-helpers","collection":"docs7","hash":"a943b3a880fdcdb26d42244c744a0509","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Cutters\n\nThe Cutters tab cuts openings through the bezel wall.\n\n* Quick buttons place None, 4, 6 or a custom number of cutters.\n* Section Curve: the closed profile used as the cutting shape, taken from your assets and editable there.\n* Number of cutters, Width and Height: how many cuts and how big.\n* Move in vertical: raises or lowers the cutters along the wall.\n* Rotation and Vertical rotation: turn each cutter on itself and tilt it.\n* Global rotation: turns the whole ring of cutters around the stone.","metadata":{"title":"Advanced Bezel","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#cutters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#cutters","collection":"docs7","hash":"7dd6b902c63a65b7404004f069d13153","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Airgaps\n\nThe Airgaps tab works exactly the same way, with its own profile and its own set of parameters — quick buttons for None, 4, 6 or a custom number, Number of airgaps, Width, Height, Move in vertical, Rotation, Vertical rotation and Global rotation. Airgaps lighten the piece and open the underside of the setting so the stone breathes and light gets in.","metadata":{"title":"Advanced Bezel","section":"Airgaps","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#airgaps","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#airgaps","collection":"docs7","hash":"1e253c119a0ddb6b6a771e75ddf52901","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Presets and defaults\n\nThe header of the panel lets you Save the bezel you have designed into the gallery, so it can be reused on other stones, and Save defaults to make the current configuration your starting point for the next run; right-click the same button to delete the saved defaults and go back to the factory values.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Advanced Bezel","section":"Presets and defaults","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#presets-and-defaults","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/advanced-bezel/#presets-and-defaults","collection":"docs7","hash":"cf03c27a6da3cd7bb394e2e0588ed914","indexed_by":"docs-index"}},{"content":"Azure — Azure\n\nThe Azure command creates open-work (ajour) cutouts under a set of gems: for every stone you select, it derives a hexagonal hole from the gem's girdle and carves it out of a supporting metal solid underneath. It is the tool to use when you want light to pass through the piece behind the stones instead of leaving a solid metal backing.\n\nThe panel is organized into three sections: Selection, Parameters and Info.","metadata":{"title":"Azure","section":"Azure","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#azure","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#azure","collection":"docs7","hash":"13837efb2e956ec2aa5278df5a893a7a","indexed_by":"docs-index"}},{"content":"Azure — Selection\n\n* Gems: Select the diamonds or gemstones that should get an azure hole. Each selected gem contributes one hexagonal cutter, positioned and sized from its own girdle.\n* Solid: Select the supporting closed solid (polysurface) the holes are carved into. It must be a closed solid — an open surface can't be subtracted from, and the command warns you if the selected geometry isn't closed.","metadata":{"title":"Azure","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#selection","collection":"docs7","hash":"20a3aa24b5490151dec4dbd63733e29c","indexed_by":"docs-index"}},{"content":"Azure — Parameters\n\n* Thickness: The wall thickness left between the hexagonal hole and the gem, in millimeters.\n* Height: How far the hexagonal cutter rises above the solid's surface.\n* Depth: How deep the cutter reaches into the solid.\n* Angle: The taper angle of the hexagon walls, in degrees. 0° gives straight walls.\n* Rotation: Rotates each hexagon around its own center, in degrees.\n* Boolean: When enabled, the hexagonal cutters are subtracted from the solid and the panel previews the carved result. When disabled, the cutters are only previewed alongside the untouched solid, ready to be baked separately (for example, to boolean them yourself later or reuse them for other cuts).\n* Delete Original: When Boolean is on, controls whether the original supporting solid is deleted from the document once the carved result is accepted, or kept alongside it.","metadata":{"title":"Azure","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#parameters","collection":"docs7","hash":"0d616200b74774a468784cb3beaf431f","indexed_by":"docs-index"}},{"content":"Azure — Info\n\n* Min. distance: Reports the thinnest remaining metal wall between two neighboring azure holes, highlighted in the viewport with a red line at the tightest point. Use it to make sure the walls stay thick enough to hold their shape once cast.\n\nGoldsmith Tip: Keep an eye on the Min. distance readout while you dial in Thickness and Rotation — it tells you exactly where the metal is thinnest between two holes, before you commit to the boolean. If it gets too close to zero, increase Thickness slightly or rotate the hexagons so the tight point moves away from the narrowest part of the setting.","metadata":{"title":"Azure","section":"Info","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#info","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/azure/#info","collection":"docs7","hash":"0e9e3280996f5ceddba7af6337f75e8a","indexed_by":"docs-index"}},{"content":"Basket — Basket\n\nThe Basket command is designed to quickly and efficiently create a customized basket setting for any gemstone. The command panel is divided into two tabs: Prongs and Base Rail.\n\nStart by selecting one of the basket designs available in the RhinoArtisan gallery, or if you prefer to modify the existing design, click the pen icon to enter editing mode. Clicking the edit button will open the command panel for this tool in the Artisan panel, allowing you to customize the basket to your specifications.","metadata":{"title":"Basket","section":"Basket","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#basket","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#basket","collection":"docs7","hash":"45e6f360fe0ea5177c4ae30550c92d2d","indexed_by":"docs-index"}},{"content":"Basket — Prongs Parameters\n\nIn the Prongs Parameters section, you have comprehensive control over the design and placement of the prongs:\n\n* Prong Distribution: Choose the number of prongs and how they are arranged around the gemstone.\n* Prong Section: Select the shape of the prongs. You can choose between a circular section, a custom shape (defined by curves in your assets, which can be edited to fit your design needs), and Claw prongs.","metadata":{"title":"Basket","section":"Prongs Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#prongs-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#prongs-parameters","collection":"docs7","hash":"d77683ea48b3b0db7dcba26ea38fe470","indexed_by":"docs-index"}},{"content":"Basket — Prongs Parameters\n\n* Prong Dimensions: Adjust the diameter of the prongs at both the top and bottom, and set the height of the prongs.\n* Gem Inside: Define how much of the gemstone is covered by the prongs to ensure a secure fit.\n* Over Girdle: Control the height of the prongs relative to the girdle of the gemstone.\n* Bottom Rail Inside: Adjust how far the bottom of the prong sits inside the lower rail.\n* Prong Rotation: Adjust the rotation of the prong section as needed. This field, along with Cap Bump (which adds a small bump on top of the prong), only applies to the Circle and Custom Shape prong sections.\n* Expansion for Manufacturing: If you switch from Rendering mode to Manufacturing mode in the Outliner panel, this feature adds extra length to the prongs to accommodate for adjustments during the manufacturing process. So you can develop the basket to be shown to your customers and with just a click you will get it ready for production.\n* Prong Style: Choose whether the prongs should be straight or bent. The curvature is determined by the diameter of the lower rail and the gemstone's girdle.\n* Claw prong options: When the Claw section is selected, the Rotation and Cap Bump fields are replaced by claw-specific controls: Gem Inside and Height for the claw tip, and Tip Direction and Smoothness sliders to shape the curve of the claw.\n* Post Support: Add support for an earring post, if required — choose None, Single, or Double. When Single or Double is selected, you can control the width and height of the post support.","metadata":{"title":"Basket","section":"Prongs Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#prongs-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#prongs-parameters","collection":"docs7","hash":"ff2b0f89e041889c2726f05b858bbc93","indexed_by":"docs-index"}},{"content":"Basket — Rails Parameters\n\nGoldsmith Tip: To achieve a cleaner, more aesthetically pleasing design, ensure that the upper rail is not visible from the top view. By positioning it so that it is hidden behind the stone, you will create a more refined appearance, allowing the focus to remain solely on the gemstone held securely by the prongs.\n\nIn the Base Rail tab, customize the upper and lower rails, each with its own Enabled toggle to turn it on or off:\n\n* Rail Section: Define the shape of the rails, similar to the prongs, with options for circular or custom sections.\n* Width, Height, and Rotation: Set the width and height of the rail's cross-section and rotate it as needed to fit your design.\n* Under Girdle (upper rail) and Move in Z (lower rail): Fine-tune how far the rail sits relative to the gemstone's girdle.\n* Gem size percentage: A slider on each rail that controls how much of the gemstone the rail covers, for precise control over the fit.\n* The Chamfer toggle in the upper rail options creates an internal chamfer on the upper rail, making it easier to prepare the seat for the gemstone. This feature helps optimize the stone setting process by allowing for a more precise and efficient fit within the basket. When enabled, a Chamfer Offset field appears to fine-tune it.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Basket","section":"Rails Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#rails-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/basket/#rails-parameters","collection":"docs7","hash":"399a28cdf15b569b00a7db1f9e3535f5","indexed_by":"docs-index"}},{"content":"Bezel — Bezel\n\nThe Bezel command in our software is designed to give you complete control over the creation of a bezel setting, ensuring a perfect fit for your gemstones. It is organized into three collapsible sections, each offering essential tools and parameters for precise customization.\n\nParameters\nIn the Parameters section, you can define the key characteristics of your bezel:\n\n* Section Curve: View and select the curve used to shape the bezel. You have the option to choose a different curve from your assets collection or edit the current one to refine its shape.\n* Width and Height: Set the width and height of the bezel to match the dimensions required for your design.\n* Over Girdle Height: This parameter adds extra metal above the girdle, which is crucial for accommodating any adjustments needed during setting. This extra height allows you to hammer the metal securely around the stone and account for metal removal during filing and polishing.\n* Girdle Width: Define the width of the girdle opening, which is essential for ensuring that the bezel is robust enough to support the gemstone while considering the material that will be removed during finishing.\n* Gem Inside: Allow a small margin in the girdle to ensure the gemstone fits smoothly into the bezel. This margin not only helps the gem to seat properly but also saves time during the setting process. By providing this slight clearance, you minimize the need for excessive metal removal or heavy hammering, leading to a cleaner and more efficient setting.","metadata":{"title":"Bezel","section":"Bezel","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#bezel","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#bezel","collection":"docs7","hash":"c991d8402fb784ab8cbe9e353b77d500","indexed_by":"docs-index"}},{"content":"Bezel — Support\n\nThe Support section is used to add and customize support features:\n\n* Post Support: Choose the number of posts, from 0 (none) to 6, using the dropdown to add post supports to the bezel — for example, for an earring design. Once at least one post is selected, set its Width and Height so the bezel is pre-configured with the correct support geometry.","metadata":{"title":"Bezel","section":"Support","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#support","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#support","collection":"docs7","hash":"2bc9db4482494a06509d7164fb1ab88a","indexed_by":"docs-index"}},{"content":"Bezel — Cutter and Airgaps\n\nGoldsmith Tip : When designing a bezel, precise measurements of the gemstone are crucial for ensuring a proper fit. It's essential to account for the exact dimensions of the stone to create a bezel that accommodates it comfortably.\n\nThe Cutter and Airgaps section lets you add aesthetic and functional details to the bezel:\n\n* Cutter: Choose the number of cuts in the bezel’s girdle — None, 4, 6, or a custom count — to enhance its design or facilitate adjustments. You can also pick a cutter profile and adjust its width, height, vertical offset, and rotation (standard, vertical, and global).\n* Airgaps: Introduce airgaps in the bezel’s middle section, using the same None / 4 / 6 / custom count options and a profile with adjustable width, height, vertical offset, and rotation. These gaps can be used for both aesthetic purposes and to ensure that the bezel is lightweight and comfortable.\n\nKeep in mind that you can save the element you create in the gallery for further designs.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Bezel","section":"Cutter and Airgaps","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#cutter-and-airgaps","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/bezel/#cutter-and-airgaps","collection":"docs7","hash":"926092ad314346338e82221f46a00dfb","indexed_by":"docs-index"}},{"content":"Channel — Channel\n\nThe Channel command builds a row of stones set into a groove between two metal walls, following a curve you select. It generates the metal channel profile along the rail and, in the same pass, populates it with a row of automatically-spaced gems, with a choice of prong style at the sides.\n\nSelection\n* Curve: The rail the channel follows. Selecting an open curve defaults the run mode to Segment; a closed curve defaults to Full. Use the flip-curve button on the selector to reverse the curve direction if the gem row starts from the wrong end.\n* Geometry (optional): A solid, surface or mesh used to orient the channel and its gems to a surface — for example, to make the channel follow the curvature of a ring shank instead of a flat plane.\n\nThe Parameters section is split into two tabs: Channel (the metal profile) and Gems (the stone row and its setting).","metadata":{"title":"Channel","section":"Channel","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#channel","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#channel","collection":"docs7","hash":"917ab2b99375671b010827bdb079d707","indexed_by":"docs-index"}},{"content":"Channel — Channel tab\n\n* Profile preview: Click it to open the assets dialog and pick a different channel cross-section profile from your library. The default is the domed rectangle profile.\n* Width and Height: The dimensions of the channel's metal cross-section.\n* Z position: Shifts the channel profile up or down relative to the rail curve.\n* Rotation: Rotates the channel cross-section around the rail.","metadata":{"title":"Channel","section":"Channel tab","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#channel-tab","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#channel-tab","collection":"docs7","hash":"6bd4c47c75a430a086b513db52b80e37","indexed_by":"docs-index"}},{"content":"Channel — Gems tab\n\n* Stone shape: Choose Round or Princess for the gems set along the channel.\n* Run mode: Full spans the whole rail curve; Segment restricts the gem row to a portion of it, set with two gumballs that appear on top of the channel in the viewport once Segment is selected.\n* Margin and Invert Segment (Segment mode only): Margin sets the gap between the end gem and the channel wall at each end; Invert Segment switches which of the two arcs between the gumballs (on a closed curve) is used.\n* Gem size: The diameter of each stone in the row.\n* Min distance: The minimum gap kept between neighboring gems.\n* Vertical: Raises or lowers the gems relative to the channel.\n* Bright cut: Size of the bright-cut facet cut into the metal around each gem.\n* Inner height and Inner width: Dimensions of the inner seat cut that holds each gem.\n* Force Even Number: Forces the gem count along the row to be even, useful for symmetric designs.","metadata":{"title":"Channel","section":"Gems tab","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#gems-tab","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#gems-tab","collection":"docs7","hash":"e3bdd6572fae65862c6628973214cbc6","indexed_by":"docs-index"}},{"content":"Channel — Prong settings\n\nBelow the gem row parameters, three buttons choose how the stones are held: Channel (no visible prongs — the two channel walls hold the stones), Prongs (shared prongs between neighboring stones) and Scalloped (a scalloped/fishtail cutout under each stone).\n\nProngs mode adds:\n\n* Gem inside: How far the prong reaches over the gem.\n* Prong height: Height of each prong.\n* Extension for manuf.: Extra prong length added for the manufacturing stage.\n* Distance: Spacing offset applied to the shared prongs.\n* Automatic Prong Diameter: When enabled, the prong diameter is computed automatically instead of using the External/Internal Diameter fields below.\n* External Diameter / Internal Diameter: Manual prong diameters, used when Automatic Prong Diameter is off.\n* End prong mode: Single places one centered prong at each end of the row; Double places one prong per wall at each end.\n\nScalloped mode adds:\n\n* V-Cutters: Enables an additional, independent set of V-shaped cutters alongside the scalloped ones.\n* Boolean: Subtracts the scalloped (and V-) cutters from the channel immediately, instead of keeping them as separate objects.\n* Remove Channel: Removes the channel body from the setting, leaving only the scalloped stone seats.\n* Cutters — Start Height / Start Width / End Height / End Width / Length: Shape of the scalloped cutter along the row, tapered independently at each end.\n* Move in Z and Move Middle in Z: Vertical offsets for the cutter ends and its midpoint.\n* Shape: U Shape or V Shape for the cutter profile, with a Shape Scale slider to scale it.\n* When V-Cutters is enabled, a matching set of Start/End Height, Start/End Width, Length and Move in Z fields controls the separate V-cutter geometry.","metadata":{"title":"Channel","section":"Prong settings","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#prong-settings","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#prong-settings","collection":"docs7","hash":"60e3bd0eb0a6749f07567a27c70cea3e","indexed_by":"docs-index"}},{"content":"Channel — Prong settings\n\nGoldsmith Tip: Start in Full run mode with the Channel prong setting to size the row and the profile against the whole rail, then switch to Segment once you're happy with the spacing — the two gumballs on the raised curve let you trim the row to fit precisely between two other elements (like a head or a bezel) without resetting the gem parameters.","metadata":{"title":"Channel","section":"Prong settings","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#prong-settings","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#prong-settings","collection":"docs7","hash":"6a4831ce91d3f3fd77e74d3e9a1a26da","indexed_by":"docs-index"}},{"content":"Channel — Editing\n\nWhen you accept the command, the channel body and its gems are baked into the document as a single group, ready to be reopened from the Outliner and adjusted at any time.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Channel","section":"Editing","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#editing","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/channel/#editing","collection":"docs7","hash":"f1253b336b21e1249980a0564d2c2b91","indexed_by":"docs-index"}},{"content":"Cluster — Cluster\n\nOur Cluster command arranges smaller gemstones around a larger central gem with full customization. It allows precise control over prongs for the central and secondary stones, including prongs built from the base for structural support. In just a few steps, you can create a polished cluster setting, ready for use in rings, earrings, or pendants, delivering a brilliant, sparkling effect with professional-grade precision.\n\nOnce the Cluster command is activated, you'll first be prompted to select the central stone, around which the cluster will be built.\n\nThe cluster can be created for the following gem cuts:\n\nRound, Cushion, Oval, Emerald, Radiant and Asscher.\n\nAfter the selection, the command panel will open, featuring a single panel divided into three tabs.","metadata":{"title":"Cluster","section":"Cluster","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#cluster","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#cluster","collection":"docs7","hash":"d21a2cf69a5126708671553ebc2270ad","indexed_by":"docs-index"}},{"content":"Cluster — Surrounding Gemstones\n\nThe first tab allows you to configure the surrounding gemstones, ensuring they are arranged perfectly around the central stone.\n\n#### Cluster Gems\n\n* Gem Size: Defines the size of the surrounding gemstones. It is essential to ensure proper proportion between the central gem and the surrounding stones.\n* Min Distance: Determines the minimum distance between the surrounding gemstones. It controls how close or far apart the stones are from each other.\n* Distance to Gem: Adjusts the distance between the surrounding gemstones and the central stone.\n* Z-Position: Controls the height of the surrounding gemstones relative to the vertical axis.\n* Rotation: This parameter allows the surrounding gemstones to be rotated.\n* Smooth Edges: Adjusts the fillet applied to the surrounding gemstones for a smoother, less angular look.\n\n#### Gem Rail\n\nDefines the support or rail upon which the surrounding gemstones are mounted. Single or Double rail.\n\n#### Top Gem Rail\n\n* Diameter: Adjusts the diameter of the rail holding the surrounding stones.\n* Move in Z: Allows you to adjust the height of the rail along the Z-axis.\n* Thread Diameter: Configures the diameter of the wire or structure holding the surrounding gemstones in place.\n\n#### Bottom Gem Rail\n\nAvailable when the Gem Rail mode is set to Double. Adds a second rail below the top one.\n\n* Diameter: Adjusts the diameter of the bottom rail holding the surrounding stones.\n* Move in Z: Allows you to adjust the height of the bottom rail along the Z-axis.\n* Thread Diameter: Configures the diameter of the wire or structure forming the bottom rail.","metadata":{"title":"Cluster","section":"Surrounding Gemstones","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#surrounding-gemstones","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#surrounding-gemstones","collection":"docs7","hash":"833889228c6b7e69c2c2d88d2afed133","indexed_by":"docs-index"}},{"content":"Cluster — Main Prongs\n\nIn the second tab, you'll find all parameters related to the main prongs that define the cluster. These prongs extend from the base of the piece to the secondary prongs. and adjust settings such as length, diameter, height above and below the girdle, and the gem's interior portion, among other fine details.&#x20;\n\n#### Number of Prongs\n\nLets you choose between 3, 4, or 5 prongs for the central gemstone.\n\n#### Internal Prongs\n\n* Diameter: Adjusts the thickness of the internal prongs.\n* Distance: Controls the distance between the internal prongs and the central gemstone.\n* Height Over Girdle: Defines the height of the internal prongs above the girdle line (the widest part of the gemstone).\n* Height Under Girdle: Adjusts the length of the prongs below the girdle.\n* Move in Z: Allows you to adjust the height of the internal prongs along the Z-axis.\n* Extension for Manufacturing: Adds an extension to the prongs to accommodate manufacturing requirements or final adjustments.\n\n#### External Prong\n\n* Diameter: Adjusts the thickness of the external prongs.\n* Distance: Controls the distance between the external prongs and the central gemstone.\n* Height Over Girdle: Defines the height of the external prongs above the girdle line (the widest part of the gemstone).\n* Extension for Manufacturing: Adds an extension to the prongs to accommodate manufacturing requirements or final adjustments.\n* Move in Z: Allows you to adjust the height of the external prongs along the Z-axis.\n\n#### Central External Prong","metadata":{"title":"Cluster","section":"Main Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-prongs","collection":"docs7","hash":"d6dafe0c45f5d13bc108db236590200e","indexed_by":"docs-index"}},{"content":"Cluster — Main Prongs\n\n* Diameter: Adjusts the thickness of the central external prong.\n* Gem Inside: Adjusts how much the prong sits inside the central gemstone.\n* Height Over Girdle: Defines the height of the central external prong above the girdle line.\n* Extension for Manufacturing: Adds an extension to the prong to accommodate manufacturing requirements or final adjustments.\n* Move in Z: Allows you to adjust the height of the central external prong along the Z-axis.\n\n#### Prong Orientation\n\nSets how the prongs are oriented: Tangent to Curve or Tangent to Center.","metadata":{"title":"Cluster","section":"Main Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-prongs","collection":"docs7","hash":"b09ae5474eb499becd1670bf2f20241f","indexed_by":"docs-index"}},{"content":"Cluster — Main Gem Rail\n\nThe third tab contains the parameters for the secondary gems' rail, allowing further customization of the overall design.\n\n* Width: Configures the width of the rail that supports the gemstones. This parameter is critical for determining how sturdy the rail structure will be.\n* Height: Adjusts the height of the main gem rail, affecting how the gems are raised above the base of the piece.\n* Thread Diameter: Defines the diameter of the thread forming part of the rail, influencing both the appearance and the functionality of the structure.\n* Move in Z: Controls the position of the rail along the Z-axis, allowing adjustments to the elevation of the gemstones.\n* Bend Height: Adjusts the height of the curve or bend in the main gem rail. This parameter allows the rail to curve upwards or downwards.\n* Bend Rotation: Controls the angle of rotation of the bend in the rail, enabling fine adjustments to the layout of the gemstones.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Cluster","section":"Main Gem Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-gem-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cluster/#main-gem-rail","collection":"docs7","hash":"b504a48cb8b59d893f0f4fc95c47f85d","indexed_by":"docs-index"}},{"content":"Custom Prongs — Custom Prongs\n\nThe Custom Prongs command allows users to replace the prongs automatically generated by RhinoArtisan tools (such as _Pavé_ or _Dynamic Prongs_) with a custom prong designed by the user. This offers complete creative freedom to apply unique or technically specific prong styles in your designs.\n\nHow it works\nWhen the icon is activated, RhinoArtisan will prompt the user to:\n\n1. Select the custom prong object(s) to use as a replacement. You can select one or several 3D objects modeled by the user.\n2. Once selected, the system will automatically replace all existing prongs with instances of the custom prong, maintaining their original positions and orientations.","metadata":{"title":"Custom Prongs","section":"Custom Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/custom-prongs/#custom-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/custom-prongs/#custom-prongs","collection":"docs7","hash":"a3819cb1fbef95bdb5cdb37cc8010ea0","indexed_by":"docs-index"}},{"content":"Custom Prongs — Available Parameters\n\n* Scale:\n* No: Keeps the custom prong at its original size, with no scaling applied.\n* 1D: Scale along a single axis (useful for adjusting height or thickness).\n* 2D: Scale along two axes (e.g., width and depth).\n* 3D: Uniform scaling in all three directions.\n* Move in Z: Allows vertical adjustment of the custom prong to better fit the design or stone height.\n* Delete Originals: When enabled, the original prongs being replaced are removed once the placement is confirmed. When disabled, the original prongs remain in the scene alongside the new custom prongs.\n\nGoldsmith’s Tip:\\ This command is perfect for adding personality and craftsmanship to your settings—whether you need split prongs, organic shapes, sharp profiles, or decorative finishes. Just make sure your custom prong is properly centered and well-aligned in the construction plane (XY), as RhinoArtisan uses this orientation and the base point for accurate placement and replacement.","metadata":{"title":"Custom Prongs","section":"Available Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/custom-prongs/#available-parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/custom-prongs/#available-parameters","collection":"docs7","hash":"6413b590794d1c8ef3187eede5c4806f","indexed_by":"docs-index"}},{"content":"Cutter — Cutter\n\nThe Cutters command is designed to apply precise cuts to gemstones, offering full customization over the shape and dimensions of the cutter.\n\nThis command consists of three key panels:\n\nSelection\nIn this panel, you can select the gemstones to which you want to apply the cutter. This allows for easy and targeted modification of specific gems within your design.","metadata":{"title":"Cutter","section":"Cutter","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#cutter","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#cutter","collection":"docs7","hash":"41d2aef7e406e25cf57880dcfca6a94d","indexed_by":"docs-index"}},{"content":"Cutter — Parameters&#x20;\n\nThe Parameters Panel provides detailed control over the cutter's configuration. You can define the cutter to interact with various parts of the gemstone, including: Crown, Pavilion and Girdle.\n\n* Height Top: Adjusts the height of the cutter at the top of the gemstone.\n* Size Top: Defines the width of the cutter at the top. It controls the overall size of the cut applied to the upper part of the gemstone.\n* Height Crown: Sets the height of the cutter specifically in the crown area of the gemstone (the top portion above the girdle). This affects how deep the cut extends into the crown.\n* Gem Inside: Determines whether the cutter penetrates the inside of the gemstone, enabling cuts that extend beyond the surface.\n* Height Girdle: Adjusts the cutter’s interaction with the girdle (the middle section of the gemstone). This is important for controlling cuts along the widest part of the gemstone.\n* Size Drill: Specifies the size of the drill used for cutting. This parameter affects the overall diameter of the cut when using a round or other drill shape.\n* Height Pavilion: Controls the height of the cutter in the pavilion area (the bottom portion below the girdle). Adjusting this allows for precise cuts in the lower part of the gemstone.\n* Size Bottom: Defines the size of the cut at the bottom of the gemstone. This parameter is useful when shaping the gemstone’s pavilion area.\n* Height Drill: Sets the height of the drilling tool. Adjusting this helps fine-tune the depth of the drill’s cut.\n\nAdditionally, you can customize the shape of the Drill, choosing from four available options: Gem Shape, Round, Square and Hexagon.\n\nThese settings give you flexibility in creating different types of cuts, whether for aesthetic purposes or specific design requirements.","metadata":{"title":"Cutter","section":"Parameters&#x20;","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#parametersx20","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#parametersx20","collection":"docs7","hash":"609635c7951758ed81bcd9ef139ee2b3","indexed_by":"docs-index"}},{"content":"Cutter — Presets\n\nThe Presets panel allows you to define the overall shape of the cutter. You can choose from four preset shapes depending on the type of cut you need. These presets provide options for whether the bottom part of the cutter should be straight, expanded, or adapted to other specific design needs.\n\nThis element is editable, meaning it can be modified anytime.\n\nGoldsmith Tip: Be mindful when selecting the type of cutter for your design. If the prongs are already placed and you've performed a Boolean union with the base of the gemstone, choosing a cutter with an extended crown section could accidentally remove part of the prong. To avoid this, ensure that the cutter is appropriate for your design and won't interfere with other components, such as prongs, that are already in place.","metadata":{"title":"Cutter","section":"Presets","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#presets","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/cutter/#presets","collection":"docs7","hash":"90cec9e81b815c92f4768e5dff45e8e9","indexed_by":"docs-index"}},{"content":"Dynamic Prongs — Dynamic Prongs\n\nWith this command, you can place prongs freely with your mouse or automatically, with precision and flexibility. It's beneficial when setting stones on organic or other complex designs.\n\nRunning this command opens its parameters in the Commands toolbar.\n\nSelection\nPick the object the prongs should sit on — its mesh is what prong placement snaps and orients to. RhinoArtisan separately scans the whole document for round gemstones, which it uses to snap new prongs into place and as the input for Automatic placement.","metadata":{"title":"Dynamic Prongs","section":"Dynamic Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#dynamic-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#dynamic-prongs","collection":"docs7","hash":"9672a888e8ed3ec8d230c1be099ad566","indexed_by":"docs-index"}},{"content":"Dynamic Prongs — Management\n\nThe Management panel offers four modes:\n\n1. Add Prongs: This mode allows you to manually place prongs with your mouse, using a specified diameter. While RhinoArtisan provides guidance, you have full control over the exact placement of each prong.\n2. Remove Prongs: In this mode, you can easily remove any prongs you don’t want by simply selecting them, or delete all of them at once with the DeleteAll option.\n3. Automatic: Yes, you read that right! In Automatic mode, RhinoArtisan will place all the prongs for you, such as those in a pavé setting, using the current prong diameter and Height settings from the Parameters panel. It searches for the natural resting point between every group of three neighboring round gems and skips any position too close to a prong that already exists.\n4. Prong Editor: toggles the interactive prong editor. With it on, hovering highlights the prong under the mouse; a click selects it, Shift+click adds more prongs to the selection, Ctrl+click removes one, and dragging from an empty spot draws a selection window. Drag any selected prong — or several at once — directly over the geometry to reposition them (each prong keeps its own size and parameters), and press Delete to remove the whole selection.\n\nGoldsmith Tip: Try the Automatic mode—it's pure magic!","metadata":{"title":"Dynamic Prongs","section":"Management","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#management","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#management","collection":"docs7","hash":"a86cb2f77b23ce2ba19689ff4c820102","indexed_by":"docs-index"}},{"content":"Dynamic Prongs — Parameters\n\nIn the Parameters panel, you can choose between two prong types:\n\n* Simple: This option places a straight prong with a consistent diameter.\n* Advanced: This allows you to define the prong’s diameter in three different sections (Top, Base, Bottom), making it especially useful for tiny prongs that need to be thicker at the base to prevent breakage.\n\nBelow the Type selector, the Height section sets how the prong relates to the gem and to manufacturing:\n\n* Over Girdle: How far the prong extends above the gem's girdle.\n* Under Girdle: How far the prong extends below the girdle, into the setting.\n* Extension for Manufacturing: Extra length added to the prong base for casting/manufacturing tolerance.\n\nWith the Prong Editor on and prongs selected, all these fields show the values of the selected prong and edit only the selection — perfect for resizing a few prongs without touching the rest. With nothing selected, they set the values used for the next prongs, as usual.","metadata":{"title":"Dynamic Prongs","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#parameters","collection":"docs7","hash":"08161d7b584e30c4c65a6ce6297fbb2d","indexed_by":"docs-index"}},{"content":"Dynamic Prongs — Advanced\n\nOn the Advanced menu, you can see various optional features:\n\n* Swap Display Mode: Disabled by default. If enabled prongs will be represented as 2D circles at their base.\n* Show Gem Sizes: Enabled by default. Shows a bubble with the diameter in millimeters on all prongs.\n* Undo: If clicked, the previous action will be undone.\n* Below these three buttons, the Symmetry dropdown (set to None by default) lets you place multiple prongs at once, mirrored across the X axis, the Y axis, or both (X and Y).\n\nWhen you confirm your changes, the Prongs will be grouped and listed on the Outliner toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Dynamic Prongs","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#advanced","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/dynamic-prongs/#advanced","collection":"docs7","hash":"1029b23dcdd941b98e5b9ea5bad8bf98","indexed_by":"docs-index"}},{"content":"Halo — Halo\n\nThis command allows you to set a selected gem into a Halo configuration.\n\nThe halo can be created for the following gem cuts:\n\nRound, Cushion, Oval, Emerald, Radiant, Asscher and Pear\n\nStart by selecting one of the Halo designs available in the RhinoArtisan gallery, or if you prefer to modify the existing design, click the pen icon to enter editing mode. Clicking the edit button will open the command panel for this tool in the Artisan panel, allowing you to customize the halo to your specifications.\n\nWhether you've chosen to edit the existing halo or modify one from the gallery, you’ll gain access to the Parameters panel, which is divided into three sections:\n\n1. Metal Profile: This section allows you to customize the metal profile that surrounds the central stone. You can modify the section curve or edit the existing one, adjusting the width and height as needed. You can also control the distance from the central stone’s girdle to the inner edge of the halo, move the halo in the Z direction, and adjust the rotation angle of the section—especially useful for inclining the halo’s gemstones. A Smooth Edges slider lets you fillet the metal profile for a softer transition.","metadata":{"title":"Halo","section":"Halo","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/halo/#halo","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/halo/#halo","collection":"docs7","hash":"f192a48c53d2669a8775bf90077100a4","indexed_by":"docs-index"}},{"content":"Halo — Halo\n\n2. Gem Settings: Here, you can define the dimensions of the halo’s gemstones, their vertical position, and the channel where they are set (bright cut and the inner height/width of the channel), plus a toggle to force an even number of gems. You can also choose how the side stones are set—None, Shared Prongs or Scalloped—and add drill holes if necessary. Shared Prongs adds controls for the shared-prong height and diameter, with an option to size them automatically; Scalloped lets you enable V-cutters, boolean cutting and channel removal, with advanced Cutters and V-Cutters expanders for fine-tuning the cutter shapes. Drill holes can be set to None, Round or Quad, with a width and height for the chosen shape.\n\n3. Prongs for the Central Stone: In this section, you can control the prongs that secure the central stone. Adjust the prong diameter, the height above the stone’s girdle, and their position (move in Z and rotation). Additionally, you can extend the prongs for manufacturing purposes if the manufacturing mode is enabled in the Outliner panel. The prong section shape can be set to a simple Circle or a Custom Shape you select from an asset. Choose a Cap Mode of Round (with a Cap Bump control) or Claw (adding gem inside, tip distance, tip height, tip width and a tension slider). Enabling Extend to Bridge connects the prongs to a bridge/gallery structure, with a height and a Curved/Straight mode.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Halo","section":"Halo","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/halo/#halo","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/halo/#halo","collection":"docs7","hash":"e909d4e7fff08988f01d7b70c0c108d1","indexed_by":"docs-index"}},{"content":"Hidden Halo — Hidden Halo\n\nThe Hidden Halo command builds a small halo of stones set into a channel that sits underneath the center gem, hidden from a top view and only visible from the side or the profile. Select one or more diamonds or gemstones and the command generates a channel ring plus the small stones set into it, all sized and positioned relative to each selected gem. Round and Princess center shapes are supported; Marquise, Triangle and Coffin gems are filtered out of the selection because the hidden halo cannot build a rail around them yet.\n\nThe command panel is organized in two tabs: the Channel tab, which shapes the ring that holds the small stones, and the Gems tab, which controls the small stones and how they are set.","metadata":{"title":"Hidden Halo","section":"Hidden Halo","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#hidden-halo","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#hidden-halo","collection":"docs7","hash":"b218999aef2abe53143ed329ce6b0743","indexed_by":"docs-index"}},{"content":"Hidden Halo — Channel\n\n* Mode: Choose the ring shape independently of the center gem's own outline — Circle, Square or Oval. Square and Oval remember their own X / Y size, so switching between shapes does not lose your settings.\n* X Length / Y Length (Square and Oval only): The extents of the ring in millimeters.\n* Metal profile: Pick the channel's cross-section from your profile assets using the preview selector.\n* Width and Height: The dimensions of the channel cross-section.\n* Distance to gem: How far the channel sits from the center gem.\n* Z position: Vertical offset of the channel.\n* Rotation: Rotates the channel's cross-section — 90° is the \"hidden halo\" orientation, tilting the section and every small-stone plane so the stones face outward instead of up, which is what keeps them out of sight from the top.\n* Smooth Edges: A slider that rounds the channel's corners.","metadata":{"title":"Hidden Halo","section":"Channel","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#channel","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#channel","collection":"docs7","hash":"138ac9d056bd1f73b5560798d42556d6","indexed_by":"docs-index"}},{"content":"Hidden Halo — Gems\n\n* Stone shape: The shape of the small stones set into the channel — Round or Princess.\n* Gem size: The diameter (or side, for Princess) of each small stone.\n* Min distance: The minimum gap kept between adjacent stones.\n* Vertical: Vertical offset of the stones inside the channel.\n* Bright cut: Width of the bright-cut facet cut around each stone.\n* Inner height / Inner width: Dimensions of the channel's inner opening around the stones.\n* Force Even Number: Forces the stone count to an even number so the halo stays symmetric.\n\nProng settings — choose how the stones are held, with three modes selectable by icon:\n\n* Channel (none): The stones sit directly in the channel with no additional prongs.\n* Prongs: Adds shared prongs between the stones — Gem inside, Prong height, Extension for manuf., Distance, an Automatic Prong Diameter toggle, and, when it is off, External Diameter / Internal Diameter to set the prong size by hand.\n* Scalloped: Cuts a scalloped bright-cut pattern between the stones instead of prongs. Toggle V-Cutters to switch the cutter shape, Boolean to carve the cutters directly out of the channel, and Remove Channel to strip the channel geometry. Configure the Cutters with Start/End Height and Width, Length, Move in Z, Move Middle in Z, a U Shape / V Shape selector and a Shape Scale slider; when V-Cutters is on, a matching set of V-Cutters parameters appears below.\n\nGoldsmith Tip: Set the channel Rotation to 90° and keep Distance to gem small — this is what makes the halo invisible from the top view while still catching light from the side, giving the illusion of a bigger center stone without adding visible metal around it.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Hidden Halo","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/hidden-halo/#gems","collection":"docs7","hash":"3322608ea91a89b09070be8bfa0c8550","indexed_by":"docs-index"}},{"content":"Martini — Martini\n\nThe Martini command builds a martini-style setting for one or more gems already placed in the document: a small number of prongs converge from the girdle down to a point below the stone, optionally topped by an upper rail and flanked by a bar of side stones. Select your gems first — the command asks you to pick them before opening the panel — and it builds one martini setting per gem. Round, cushion and most fancy shapes are supported; Triangle and Coffin shapes are excluded.\n\nThe panel is organized into three tabs: Prong, Upper Rail and Bar.","metadata":{"title":"Martini","section":"Martini","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#martini","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#martini","collection":"docs7","hash":"9daa45f3a586f1f2513cc9e0a3d1a2e1","indexed_by":"docs-index"}},{"content":"Martini — Prong\n\n* Mode: Circle uses a simple round cross-section; Custom Shape lets you pick a profile asset for the prong cross-section; Claw builds a claw-tip prong instead of a plain cylinder.\n* Diameter Top / Diameter Bottom: The prong's cross-section diameter at the girdle and at its base.\n* Over Girdle: How far the prong extends above the gem's girdle.\n* Birth Separation: Tangential offset that spreads the tops of the prongs apart along the girdle.\n* Gem Inside: How far the prong reaches over the gem.\n* Height: Length of the prong, from the girdle down to its tip. You can also drag the purple gumball shown in the viewport, anchored on the first selected gem, to set this value directly.\n* Inclination Z: Vertical position of the bow's middle control point — 0 keeps the prong straight down the midpoint.\n* Rotation: Rotates the prong section.\n* Extension Manufacturing: Extra prong length added when working in Manufacturing mode.\n* Face Tangent: When on, the prong cross-section faces the girdle's tangent direction — the default for symmetric gems (round, cushion...). When off, it faces the gem's center instead — the default for asymmetric shapes like pear or heart.\n\nClaw section (visible only in Claw mode):\n\n* Cap Distance: How far the claw's cap reaches in over the gem.\n* Cap Height: Vertical rise of the cap above the girdle.\n* Tip Width: Width of the claw tip.\n* Tip Smoothness: How smoothly the claw body transitions into the cap.","metadata":{"title":"Martini","section":"Prong","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#prong","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#prong","collection":"docs7","hash":"42e1619328e13dcea25f3211e57d3c0a","indexed_by":"docs-index"}},{"content":"Martini — Upper Rail\n\n* Enabled: Toggles the upper rail on or off.\n* Mode: Circle uses a single Diameter field for a round cross-section; Custom Shape unlocks independent Width and Height and lets you pick a profile asset.\n* Diameter (Circle) or Width / Height (Custom Shape): Dimensions of the rail's cross-section.\n* Under Girdle: How far the rail sits below the gem's girdle.\n* Rail Diameter %: The rail centerline as a percentage of the gem's own outline — a single uniform value that keeps the rail proportional to the stone even on non-round shapes.\n* Rotation: Rotates the rail cross-section.\n* Rail Y Offset: Only shown for Pear and Heart gems; shifts the rail centerline along Y to recenter it on an asymmetric outline.\n* Chamfer and Chamfer Offset: Adds an internal chamfer to the rail, with a control over how far it's offset.","metadata":{"title":"Martini","section":"Upper Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#upper-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#upper-rail","collection":"docs7","hash":"32f3cdbaba44c31fb9122bf2b4eb22f5","indexed_by":"docs-index"}},{"content":"Martini — Bar\n\n* Enabled: Toggles the side bar (side bezel stones) on or off.\n* Shape: Round or Princess, for the two side stones flanking the main gem.\n* Gem Size: Diameter of each side stone.\n* Distance: Spacing of the side stones from the main gem.\n* Width: Width of the bezel wall holding each side stone.\n* Over Girdle: How much the bezel wall extends past the side stone's girdle.\n* Fillet Edge: Rounds the bezel's edge.\n* Move in Z: Vertical offset of the bar relative to the main gem.\n\nGoldsmith Tip: Face Tangent is seeded automatically from the gem's symmetry — on for round and cushion stones, off for pear or heart — but nothing stops you from flipping it by hand. If a fancy-shaped stone's prongs look twisted where they meet the girdle, try toggling Face Tangent before touching Rotation; it usually fixes the orientation in one click.","metadata":{"title":"Martini","section":"Bar","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#bar","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#bar","collection":"docs7","hash":"aa6208249a5e36bac847193b31c11396","indexed_by":"docs-index"}},{"content":"Martini — Editing\n\nWhen you accept the command, each martini setting (prongs, rail and side bar) is baked into the document as its own group, tied to the gem it was built on.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Martini","section":"Editing","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#editing","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/martini/#editing","collection":"docs7","hash":"7abc0ad9bccff3e5ccc78245b004a455","indexed_by":"docs-index"}},{"content":"Micro Setting — ​ Micro Setting\n\nThe Microsetting command is designed to create all the necessary cutters required for a microsetting, specifically for use in a subsequent Boolean Difference operation. This command helps you prepare precise gaps in the base object where gemstones will later be set.\n\nThis tool is ideal for crafting traditional micro settings and working with complex designs. It allows for the creation of cutters that match the shape and placement of the gems you plan to use, ensuring accuracy and efficiency during the setting process.","metadata":{"title":"Micro Setting","section":"​ Micro Setting","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#-micro-setting","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#-micro-setting","collection":"docs7","hash":"242976951c54216cecebdf3d14bb518a","indexed_by":"docs-index"}},{"content":"Micro Setting — Selection\n\nSelect the gems to work on in the Selection panel. Below the selector, four buttons let you turn each cutter type on or off: Cutters, V Prongs, V Channel and Prongs in a Row. Cutters is on by default; the other three panels only appear once you enable them here.\n\nCutters&#x20;\nThe main cutter for the gemstones is controlled in this panel. You can choose between different cutter shapes and adjust parameters like height and width.\n\nHeight / Width: Adjusts the height and width of the cutter. With Mode set to Independently these split into separate Start Height / Start Width and End Height / End Width, so each end of the cutter can be sized differently — useful for curved surfaces where one side needs to be thicker than the other.\n\nWidth Mode: Choose between Measure (Width entered directly) or % of gem, where the width is instead set as a Width % of gem percentage and follows the size of each stone automatically.\n\nLength: Adjusts the length of the cutter.\n\nMove in Z: Allows you to adjust the height of the cutter along the Z-axis.\n\nMove Middle in Z: Allows you to adjust the height of the cutter along the Z-axis, of the middle part.\n\nShape: You can customize the shape of the cutter.\n\n* Shape U\n* Shape V\n* Square Shape\n* Trapezoidal Shape\n* Shape French\n\nMode: Allows you to modify both sides at the same time (Both Sides) or to modify each side independently (Independently).\n\nShape Scale: Allows to set the proportion of the shape in proportion to the total cutter.","metadata":{"title":"Micro Setting","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#selection","collection":"docs7","hash":"152061983d2846be270f7c677bc4adf5","indexed_by":"docs-index"}},{"content":"Micro Setting — V Prongs\n\nThis panel allows you to create V-shaped cutters between stones. While some setters prefer to add these cuts manually, this feature automates the process, giving you full customization of the V-prong cuts to match the design.\n\nHeight / Width: Adjusts the height and width of the V prong. With Mode set to Independently these split into Start Height / Start Width and End Height / End Width.\n\nLength: Adjusts the length of the V prong.\n\nMove in Z: Allows you to adjust the height of the V prong along the Z-axis.\n\nMove Middle in Z: Allows you to adjust the height of the V prong along the Z-axis, of the middle part.\n\nMode: Allows you to modify both sides at the same time (Both Sides) or to modify each side independently (Independently).","metadata":{"title":"Micro Setting","section":"V Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#v-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#v-prongs","collection":"docs7","hash":"6b492cac675e27f2684de0884c0207c1","indexed_by":"docs-index"}},{"content":"Micro Setting — V Channel\n\nSimilar to the Cutters panel, this section allows you to shape the V-channel between the stones. You can choose between flat or round ends, and even extend the ends if required.\n\nHeight / Width: Adjusts the height and width of the channel. With Mode set to Independently these split into Start / End pairs.\n\nMove in Z: Allows you to adjust the height of the channel along the Z-axis (also split into Start / End when Mode is Independently).\n\nExtension: Extends the end of the channel.\n\nBend: Bends the end of the channel to its side (a negative amount bends it to the opposite side if needed).\n\nShape: Selects the shape of the channel cutter between Shape U, Shape V, Square Shape or Trapezoidal Shape. The Shape Scale slider below it sets the proportion of the shape relative to the channel.\n\nMode: Allows you to modify both sides at the same time (Both Sides) or to modify each side independently (Independently).\n\nProfile: Flip Start / Flip End toggles to reverse the channel's profile direction at each end.\n\nCaps: Flip Start / Flip End toggles to flip the channel's cap ends independently of the profile.\n\nChannel: a Close toggle to close the channel.\n\nFlat Ends: a toggle to flatten the channel's ends.\n\nPrecise: This feature allows for a more precise channel, especially in cases where the shape of the object being used to construct the channel is highly curved or has double curvature.","metadata":{"title":"Micro Setting","section":"V Channel","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#v-channel","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#v-channel","collection":"docs7","hash":"91b6cf2d98d6e1056ba863604b532d14","indexed_by":"docs-index"}},{"content":"Micro Setting — Prongs in a Row\n\nThis optional panel lets you reinforce the space between the stones with prong-shaped cutters.\n\nDiameter: Sets the prong diameter directly. With Diameter Mode set to % inside gem, this is replaced by an Inside gem % field, so the diameter is instead derived from how far the prong should sit inside each neighboring gem.\n\nOver Girdle / Under Girdle: How far each prong extends above and below the girdle.\n\nAllow Collision: Lets prongs overlap neighboring geometry instead of being skipped.\n\nClose: Closes the row of prongs.\n\nSmart Adapt: Adapts prong placement automatically to the row.\n\nActivating this panel displays a draggable gumball, which you can move to position the prong row precisely, ensuring it is well-aligned with your design.\n\nOnce the cutters are generated, they can be used in a Boolean Difference operation to carve out the appropriate spaces in the object where the gemstones will be set.","metadata":{"title":"Micro Setting","section":"Prongs in a Row","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#prongs-in-a-row","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/micro-setting/#prongs-in-a-row","collection":"docs7","hash":"9dce5c93d8cab80cf8d1b8bd7b5b3b2d","indexed_by":"docs-index"}},{"content":"Peghead — Peghead\n\nThis command allows you to set a selected gem into a Peghead configuration.\n\nRunning this command will display its parameters in the Commands toolbar. Your first step is to select the stone on which the Peg Head will be applied. Next, decide whether to start with a pre-designed style from the Peg Head gallery provided by RhinoArtisan or to modify the current style displayed in the viewport. To create a new design based on the current style, simply click the \"Edit\" button.\n\nOnce you edit the one you have selected or the one in the viewport, the parameters will be shown in the Command Panel:\n\n* Number of prongs / orientation: an image selector for how many prongs the peg head has. The options depend on the shape of the selected gem — for round gems, for example, you can choose 3, 4, a 4-prong layout rotated 45° (reverse 4), or 6 prongs.\n* Profile: a preview of the prong's cross-section shape, with buttons to select a different profile from RhinoArtisan's asset library or edit the current one.\n* Thickness: the thickness of the prongs.\n* Height over Girdle: how far the prongs rise above the gem's girdle.\n* Height: the total height of the peg head.\n* Girdle Width: the width of the prongs where they meet the girdle.\n* Gem Inside: the overlap distance of the prong tip inside the gem (a negative value moves it outward instead).\n\nYou can also save the current parameters as your defaults, or save the edited peg head as a new style in the gallery, from the header toolbar.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Peghead","section":"Peghead","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/peghead/#peghead","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/peghead/#peghead","collection":"docs7","hash":"1def1d85a8185bdbe60767de3791da36","indexed_by":"docs-index"}},{"content":"Prong Axis — Prong Axis\n\nThe Prong Axis command draws the central axis line of each prong around a gem — guide curves only, with no thickness, running from a bottom point to a top point. Select one or more diamonds or gemstones and the command generates one set of axis lines per gem, ready to use as reference or as the backbone for building custom prong geometry of your own.\n\nThe command panel has two sections: Prongs, where you set how many axis lines to draw, and Parameters, where you shape them.","metadata":{"title":"Prong Axis","section":"Prong Axis","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/prong-axis/#prong-axis","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/prong-axis/#prong-axis","collection":"docs7","hash":"e3d17a956eb649327a0d32059e6211a9","indexed_by":"docs-index"}},{"content":"Prong Axis — Prongs\n\nUse the prong selector to set the number of prongs around the gem. The selector adapts to the shape of the first selected gem, offering the prong-count options that make sense for that shape.\n\nParameters\n* Height: The vertical length of each prong axis, from top to bottom.\n* Gem Inside: How far the prong top leans inward over the gem's girdle.\n* Over Girdle: The vertical offset of the prong top above the girdle.\n* Bottom Rail Inside: An inward offset applied to the prong bottoms.\n* Straight / Curved: Two buttons choose the axis shape — a straight line from top to bottom, or a curved axis that rises vertically before leaning inward.\n\nGoldsmith Tip: Prong Axis does not build any prong solid — it only lays down the centerlines. Use it to plan prong placement and length on a gem before modeling, or as guide curves to sweep your own custom prong profile along, when none of the built-in prong-setting commands give you the exact shape you need.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Prong Axis","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/prong-axis/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/prong-axis/#prongs","collection":"docs7","hash":"909feb20e0b7aa880cf99b9da16173c1","indexed_by":"docs-index"}},{"content":"Three Stones — Three Stones\n\nThe Three Stones command works like a Gem Studio for trilogy designs: instead of creating one gemstone at a time, it creates a coordinated set of three gemstones — one center stone and two symmetric side stones — already positioned around the ring size. The three gems are placed as a single editable element, ready to be used as the starting point for any of the Trilogy gemsets.\n\nThe command panel is divided into two sections: Ring and Stones.","metadata":{"title":"Three Stones","section":"Three Stones","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#three-stones","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#three-stones","collection":"docs7","hash":"0db5565afd49409bafd22c934603ef95","indexed_by":"docs-index"}},{"content":"Three Stones — Ring\n\nThe Ring section defines the finger size the stones are arranged around. Set the ring size using your preferred sizing standard, and the three gems will be positioned at the correct distance from the finger circle. A reference circle for the finger is created together with the stones, so the whole set stays consistent when you edit it later.","metadata":{"title":"Three Stones","section":"Ring","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#ring","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#ring","collection":"docs7","hash":"0bd0aaaca21912bbe7ab358dfec785da","indexed_by":"docs-index"}},{"content":"Three Stones — Stones\n\nThe Stones section contains two tabs, one for the Center Stone and one for the Side Stones. The two side stones are always symmetric: whatever you set in the Side Stones tab is mirrored on both sides of the center stone.\n\nCenter Stone\n* Shape: Choose the cut of the center stone from the same catalog as Gem Studio: Round, Cushion, Princess, Radiant, Pear, Oval, Marquise, Heart, Emerald, Asscher, Trillion, Triangle, Calf, Coffin and Baguette.\n* Material: Select the gemstone material (Diamond, Ruby, Emerald, Sapphire, Amethyst, Aquamarine, Morganite, Citrine, Tanzanite, Quartz or Moissanite). The material is represented by its color in the viewport and, as in Gem Studio, it affects the carat-to-size conversion through its density.\n* Carats: Set the weight of the center stone. The gem dimensions are computed from the carat weight using standard proportions for the selected shape and material.\n* Distance above ring: Controls how far the center stone sits above the finger circle, in millimeters.\n* Rotation: Rotates the center stone around its vertical axis — useful for fancy shapes such as Marquise, Oval or Emerald.","metadata":{"title":"Three Stones","section":"Stones","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#stones","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#stones","collection":"docs7","hash":"326e00305b71eb6ac0b669c8e724b386","indexed_by":"docs-index"}},{"content":"Three Stones — Side Stones\n\n* Shape and Material: Same options as the center stone, chosen independently — for example, a Round diamond center with Pear sapphire sides.\n* Carats: Set the weight of each side stone.\n* Distance above ring: Controls how far the side stones sit above the finger circle, independently of the center stone.\n* Angle: Positions the side stones around the finger axis, measured from the top of the ring. Increase the angle to move the side stones further down and away from the center stone.\n* Rotation: Rotates each side stone around its own vertical axis, mirrored on both sides.\n* Rotation Y: Tilts the side stones toward or away from the center stone, mirrored on both sides. This is the key parameter to make the side gems \"lean\" against the center stone for a natural trilogy look.\n\nGoldsmith Tip: Adjust Angle and Rotation Y together. The angle slides the side stones along the ring, while Rotation Y tilts them; combining both lets you close the gap to the center stone without the girdles colliding.","metadata":{"title":"Three Stones","section":"Side Stones","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#side-stones","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#side-stones","collection":"docs7","hash":"d1e6846f5fab0f73b4000373ffd872f0","indexed_by":"docs-index"}},{"content":"Three Stones — Saving your defaults\n\nThe header of the panel includes a Save defaults button. Click it to store the current configuration (shapes, materials, weights and positions) as your default starting point — the next time you run the command, it will open with those values, keeping the ring size of your current session. Right-click the same button to delete the saved defaults and go back to the factory values.","metadata":{"title":"Three Stones","section":"Saving your defaults","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#saving-your-defaults","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#saving-your-defaults","collection":"docs7","hash":"fb95794740ff77ea308875a2dade32a1","indexed_by":"docs-index"}},{"content":"Three Stones — Using it with the Trilogy gemsets\n\nWhen you accept the command, the three gems and the finger reference circle are baked into the document as a single group. This element is the foundation the Trilogy gemsets build on: commands such as Trilogy Individual, Trilogy Bezels, Trilogy Trellis, Trilogy Halo and Trilogy East-West take the three stones as their input and generate the metal around them.\n\nBecause the element is editable, you can reopen it at any time to change the stones — sizes, shapes, positions — and any gemset built on top of them stays attached to the new stones and updates accordingly. You never have to rebuild the setting because the customer asked for a bigger center stone.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Three Stones","section":"Using it with the Trilogy gemsets","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#using-it-with-the-trilogy-gemsets","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/three-stones/#using-it-with-the-trilogy-gemsets","collection":"docs7","hash":"cd60803ac968768039b77225e80ec27e","indexed_by":"docs-index"}},{"content":"Toi et Moi — Toi et Moi\n\nThe Toi et Moi command creates the signature two-stone arrangement — \"you and me\" — with two gemstones straddling the top of the ring, one leaning toward each side. Like Three Stones, it works as a Gem Studio for a complete ring top: the stones are created together, already positioned around the ring size, and baked as a single editable element.\n\nThe key difference from Three Stones is that here each stone is fully independent: its own shape, material, weight and placement. That's what makes the classic toi et moi combinations possible — a pear and a round, a sapphire and a diamond, two different carat weights — while still designing them as one coordinated pair.\n\nThe command panel is divided into two sections: Ring and Stones.","metadata":{"title":"Toi et Moi","section":"Toi et Moi","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#toi-et-moi","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#toi-et-moi","collection":"docs7","hash":"87a2b3583d2c1846f0e2d0113fffb43d","indexed_by":"docs-index"}},{"content":"Toi et Moi — Ring\n\nThe Ring section defines the finger size the pair is arranged around. Set the ring size using your preferred sizing standard, and both stones will be positioned at the correct distance from the finger circle. A reference circle for the finger is created together with the stones, so the whole set stays consistent when you edit it later.","metadata":{"title":"Toi et Moi","section":"Ring","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#ring","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#ring","collection":"docs7","hash":"5661fcea3d5e3937f2dc0cbc7f1b43e5","indexed_by":"docs-index"}},{"content":"Toi et Moi — Stones\n\nThe Stones section contains two tabs, one for each stone of the pair. By default the command opens with a mirrored configuration — same gem on both sides, leaning toward each other — and from there you customize each stone separately:\n\n* Shape: Choose the cut from the same catalog as Gem Studio: Round, Cushion, Princess, Radiant, Pear, Oval, Marquise, Heart, Emerald, Asscher, Trillion, Triangle, Calf, Coffin and Baguette.\n* Material: Select the gemstone material (Diamond, Ruby, Emerald, Sapphire, Amethyst, Aquamarine, Morganite, Citrine, Tanzanite, Quartz or Moissanite). The material is shown with its color in the viewport and affects the carat-to-size conversion through its density.\n* Carats: Set the weight of the stone. The gem dimensions are computed from the carat weight using standard proportions for the selected shape and material.\n* Distance above ring: Controls how far the stone sits above the finger circle, in millimeters.\n* Angle: Positions the stone around the finger axis, measured from the top of the ring. Positive values lean to one side and negative values to the other, so the two stones sit on opposite sides of the ring's center line.\n* Rotation: Rotates the stone around its own vertical axis — essential for orienting fancy cuts, such as pointing a Pear culet toward its partner.\n* Rotation Y: Tilts the stone toward or away from its partner. This is what creates the characteristic embrace of a toi et moi, with the two gems leaning into each other.\n\nGoldsmith Tip: For the classic pear-and-round pairing, give the larger stone a smaller Angle so it stays closer to the top of the ring, and fine-tune each stone's Rotation Y separately — asymmetric tilts often look more natural than a perfect mirror when the two cuts have different heights.","metadata":{"title":"Toi et Moi","section":"Stones","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#stones","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#stones","collection":"docs7","hash":"4e107487024b076ff629cb40a6327cd4","indexed_by":"docs-index"}},{"content":"Toi et Moi — Saving your defaults\n\nThe header of the panel includes a Save defaults button. Click it to store the current configuration (shapes, materials, weights and positions) as your default starting point — the next time you run the command, it will open with those values, keeping the ring size of your current session. Right-click the same button to delete the saved defaults and go back to the factory values.","metadata":{"title":"Toi et Moi","section":"Saving your defaults","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#saving-your-defaults","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#saving-your-defaults","collection":"docs7","hash":"033cd4503f3995dd0215b605bb7c2666","indexed_by":"docs-index"}},{"content":"Toi et Moi — An editable pair\n\nWhen you accept the command, the two gems and the finger reference circle are baked into the document as a single group, ready for you to build the setting around them — prongs, bezels, or any gemset applied to each stone.\n\nBecause the element is editable, you can reopen it at any time to change either stone — a different cut, a bigger carat weight, a new position — and the geometry is replaced in place, so everything you built on top of the stones stays attached and follows the update.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Toi et Moi","section":"An editable pair","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#an-editable-pair","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/toi-et-moi/#an-editable-pair","collection":"docs7","hash":"ff9df1b82bc276448d79b694f121415a","indexed_by":"docs-index"}},{"content":"Trellis — Trellis\n\nThe Trellis command builds a crossing-prong setting: pairs of prongs that bow outward from the gem and cross each other on their way down to a ring below, giving the classic trellis silhouette. Select one or more diamonds or gemstones — unsupported shapes (Pear, Heart, Trillion, Triangle, Calf, Coffin, Baguette) are filtered out of the selection. A default ring curve is generated automatically under each gem; you can instead pick your own curve from the panel's Selection section, as long as it lies below the gem.\n\nThe command panel has a Selection section for the ring curve, and a Parameters section split into two tabs: Prongs and Upper Rail.","metadata":{"title":"Trellis","section":"Trellis","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#trellis","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#trellis","collection":"docs7","hash":"5b987c6b28f98cb9c3408662d6df29b0","indexed_by":"docs-index"}},{"content":"Trellis — Selection\n\nUse the object selector to pick an existing curve as the ring the prongs land on. Leave it unselected to use the automatically generated default curve, positioned under the gem at the Height distance set in the Prongs tab.","metadata":{"title":"Trellis","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#selection","collection":"docs7","hash":"2a636b62cb9603262951d5cbff8b4b67","indexed_by":"docs-index"}},{"content":"Trellis — Prongs\n\n* Top Profile: The prong's shape near the gem — Circle (a plain swept/piped prong) or Claw (rebuilt as a claw with its own cap controls).\n* Bottom Profile: The cross-section where the prong lands on the ring — Circle (rounded end), Square (rectangular, sized by Width / Height) or Custom (each prong ends in half of a curve you pick from your assets; two adjacent prongs reconstruct the full profile together).\n* End Profile Curve (Custom only): The closed curve used for the custom bottom profile.\n* Profile Start: Fraction of the prong length, from the gem side, where the round cross-section starts morphing into the Bottom Profile shape — lower values give a longer, gentler transition.\n* Cross Height: Raises or lowers the point where the crossing prongs meet, without moving their ends.\n* Width / Height: Dimensions of the rectangular bottom section (Square bottom profile only).\n* Diameter: The prong tube diameter.\n* Gem Inside: Radial offset of the prong from the girdle.\n* Over Girdle: Vertical offset of the prong top above the girdle.\n* Top Vertical: Additional vertical offset near the top of the prong.\n* Birth Separation: Y-axis separation of the point where each pair of prongs originates.\n* Bend Inside: How far the prongs bend inward as they cross.\n* Distance: Y-axis separation applied to where the prongs land on the ring — separates the bottoms of the trellis without moving the tops.\n* Opening: The crossing angle between each pair of prongs.\n* Height: Vertical gap between the gem's girdle plane and the top of the auto-generated default ring curve (ignored when you pick your own curve).\n* Rotate: Rotates the whole gemset 90° around the gem's vertical axis, so the same setting can serve an oval stone whether its long axis runs along the finger or across it.","metadata":{"title":"Trellis","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#prongs","collection":"docs7","hash":"b65b1a60cdbe6d6a33db9115e97ee754","indexed_by":"docs-index"}},{"content":"Trellis — Prongs\n\n* Extension: Extra prong material added above the gem in Manufacturing mode, ignored in Render mode.\n\nClaw (Top Profile = Claw): Cap Distance pulls the claw apex toward the gem's center, Cap Height raises or lowers it, Tip Width sets the apex thickness as a fraction of the tube, and Tip Smoothness softens the body-to-cap transition. Face Tangent switches the claw direction between following the girdle's local tangent (on) and pointing straight at the gem's center (off) — off tends to look cleaner on cornered gems like Princess.\n\nProng 1 and Prong 2: Each of the two crossing prongs has its own Bulge Start, Bulge End and Middle Offset, letting you fine-tune the two halves of the crossing independently.","metadata":{"title":"Trellis","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#prongs","collection":"docs7","hash":"c8ada4bb8628c691f724229371758eec","indexed_by":"docs-index"}},{"content":"Trellis — Upper Rail\n\n* Enabled: Turns the upper rail on or off.\n* Mode: Circle for a round rail, or Custom Shape to use your own profile asset.\n* Metal profile: Pick the rail's cross-section from your profile assets using the preview selector.\n* Width / Height: Dimensions of the rail cross-section.\n* Under Girdle: How far the rail sits below the girdle.\n* Rotation: Rotates the rail's cross-section.\n* External X / External Y: The rail's outer dimensions in millimeters, measured edge to edge.\n* Chamfer: Enables an internal chamfer on the upper rail, with a Chamfer Offset to control its size — useful to prepare the seat for the gemstone.\n\nGoldsmith Tip: Use Birth Separation and Distance together to fan the crossing prongs apart at top and bottom without touching Opening — this keeps the crossing angle exactly where you tuned it while giving each prong pair more room to land cleanly on the ring.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trellis","section":"Upper Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#upper-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trellis/#upper-rail","collection":"docs7","hash":"71e07bc0a503c999a06744c1da7ae784","indexed_by":"docs-index"}},{"content":"Trilogy Bezels — Trilogy Bezels\n\nThe Trilogy Bezels command wraps every gem of a trilogy in its own bezel: one bezel for the center stone and one shared by the two side stones. It reuses the whole Bezel engine — profile, girdle rim, support post, cutters and air gaps — applied gem by gem, so a full rub-over trilogy is a single command away.\n\nThe command works on a Three Stones element. Run it and pick one of the three gems: the set is resolved from its group. If the picked gem does not belong to a Three Stones element, the command asks for the three gems manually and classifies center and sides by their positions. Any gem shape is accepted.\n\nThe panel opens on the element library: pick one of the saved Trilogy Bezels designs, or click the pen icon to start editing.","metadata":{"title":"Trilogy Bezels","section":"Trilogy Bezels","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#trilogy-bezels","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#trilogy-bezels","collection":"docs7","hash":"0bb907937d99eeeebadaec5050954e6c","indexed_by":"docs-index"}},{"content":"Trilogy Bezels — Center and Side tabs\n\nTwo tabs at the top of Parameters switch between the center bezel and the side bezels.\n\nBy default the side bezels simply copy the center one, and the Side tab shows a note saying so. Turn on Edit separately in that tab to give the sides their own values — useful when a much smaller side stone needs a thinner wall than the center.\n\nEverything below belongs to whichever bezel is active.\n\n* Profile: The bezel profile taken from your bezel asset library, shown with its preview.\n* Width and Height: Thickness and height of the bezel wall.\n* Girdle Height and Girdle Width: The rim that folds over the girdle of the stone.\n* Gem Inside: How far the bezel covers the stone.\n* Cut by ring size: Trims the bottom of the bezel to the finger circle, so it does not invade the ring. It belongs to each bezel: with Edit separately off it applies to all three, with it on the center and the sides are controlled apart.","metadata":{"title":"Trilogy Bezels","section":"Center and Side tabs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#center-and-side-tabs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#center-and-side-tabs","collection":"docs7","hash":"710b381d2a538753de5578e5019dcb83","indexed_by":"docs-index"}},{"content":"Trilogy Bezels — Support\n\nA collapsible section that adds posts underneath the bezel. It starts folded and opens by itself if the bezel already carries a support.\n\n* Post support: How many posts, from None up to 6.\n* Width and Thickness: Section of the posts.\n\nCutter and Air Gap\nA second collapsible section, with two sub-tabs that share the same set of controls: cutters (the openings cut through the bezel wall) and air gaps.\n\n* Choose the layout with the four buttons: none, 4, 6, or a free number.\n* Num of Cutters / Num of Airgaps: The count when you pick the free option.\n* Profile: The closed profile used as the section of the cut, with its preview.\n* Width and Height: Size of each cut.\n* Move in Z: Raises or lowers the cuts on the bezel wall.\n* Rotate: Turns each cut around its own axis.\n* Vertical Rotation: Tilts each cut vertically.\n* Global Rotation: Turns the whole ring of cuts around the stone, so you can align them with the prong-free areas.","metadata":{"title":"Trilogy Bezels","section":"Support","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#support","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#support","collection":"docs7","hash":"d1bb0ee9ad0398ec0db7903ad0ee3906","indexed_by":"docs-index"}},{"content":"Trilogy Bezels — Visualization\n\nFour toggles — Hide Center Gem, Hide Side Gems, Hide Center Bezel and Hide Side Bezels — let you inspect one part without the rest in the way. They are view aids only: the complete piece is always computed when you accept.\n\nStones\nThe Stones expander is the full Three Stones editor: shape, material, carats, distance above ring and rotation for the center stone, plus angle and rotation Y for the sides. While the panel is open the three gems of the document are hidden and drawn by the preview; on Accept the whole set is re-baked with its bezels.\n\nGoldsmith Tip: Leave Edit separately off while you are shaping the center bezel, and turn it on only at the end. Once the wall and the girdle rim look right on the big stone, the sides usually need nothing more than a slightly lower Height — and doing it in that order saves you from tuning three bezels at once.","metadata":{"title":"Trilogy Bezels","section":"Visualization","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#visualization","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#visualization","collection":"docs7","hash":"8d17f727c391c851b8d44a0e7876b869","indexed_by":"docs-index"}},{"content":"Trilogy Bezels — Saving your work\n\nSave defaults in the panel header stores the current configuration as the starting point for the next run (right-click to restore the factory values), and the save button stores the design as a named preset in the element library so it can be reused on any other trilogy.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trilogy Bezels","section":"Saving your work","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#saving-your-work","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-bezels/#saving-your-work","collection":"docs7","hash":"c582e92829df258c37b86ec139f44ae3","indexed_by":"docs-index"}},{"content":"Trilogy East-West — Trilogy East-West\n\nThe Trilogy East-West command builds an advanced basket around every gem of a trilogy: one basket for the center stone and one shared by the two side stones. Each basket has its own prongs and one or two rails, and the prong layout adapts to the shape of the stone it holds.\n\nThe command works on a Three Stones element. Run it and pick one of the three gems — the set is resolved from its group. If the picked gem is not part of a Three Stones element, the command asks for the three gems manually and works out which is the center from their positions. There is no shape restriction: the basket accepts any cut.\n\nThe panel opens on the element library; pick a saved Trilogy East-West design or click the pen icon to start editing.","metadata":{"title":"Trilogy East-West","section":"Trilogy East-West","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#trilogy-east-west","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#trilogy-east-west","collection":"docs7","hash":"28fad4803483568cd1f17d3cc27d20d1","indexed_by":"docs-index"}},{"content":"Trilogy East-West — The four tabs\n\nParameters is split into four tabs: Center Prong, Center Rail, Side Prong and Side Rail. The two Side tabs carry an Edit separately toggle — with it off the side baskets simply copy the center one (and the tab shows a note saying so); with it on they get their own set of values.\n\nProngs\nEach basket starts from a layout preset. The Assets row shows the presets available for that gem's shape, so an emerald center offers its four corners, a trillion side its three vertices, and so on. Pick one and the basket is rebuilt with that number and distribution of prongs.\n\nBelow the presets there is a single prong editor that drives all the prongs of the basket at once: what you change is copied to every prong (their positions stay as the preset placed them).\n\n* Mode: Round, Custom, Double, Triple or Claw.\n* Top Profile and Bottom Profile: In Custom mode, the closed profiles used for the section of the prong; the bottom can be Round or Custom (same as top).\n* Diameter and Bottom Diameter: Section of the prong at the top and at the bottom.\n* Height: Length of the prong.\n* Gem Inside: How deep the prong bites into the stone.\n* Over Girdle: How far the prong rises over the girdle.\n* Rotation: Turns the prong section.\n* Exp. Manufacturing: Extra length added for production, visible in Manufacturing mode.\n* Bottom Inside: How far the foot of the prong leans towards the axis of the stone.\n* Separation and Exterior Gem Inside: Only for Double and Triple prongs — how far apart the strands sit and how deep the outer ones bite.\n* Cap Distance, Cap Height, Tip Width and Tip Smoothness: The claw cap, only for Claw mode.\n* Inclination and Inclination Z: Tilt the prong and control where along its length the tilt starts.\n* Tangent: Makes the prong leave the rail tangentially instead of at an angle.","metadata":{"title":"Trilogy East-West","section":"The four tabs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#the-four-tabs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#the-four-tabs","collection":"docs7","hash":"e91fe45f17a15a557b69786fe313261d","indexed_by":"docs-index"}},{"content":"Trilogy East-West — Rails\n\nEach basket carries a Top rail, always present but switchable off, and an optional Bottom rail, both in their own collapsible sections with an Enable toggle. Each rail has the same editor:\n\n* Mode: Round or Custom Shape, the latter sweeping a closed profile from your asset library.\n* Width and Height: Dimensions of the rail section.\n* Under Girdle: How far below the girdle the rail sits.\n* Rotation: Rotates the profile in its section plane.\n* Bend Height and Bend Rotation: Bend the rail out of its plane.\n* Fillet Radius: Rounds the edges of the rail.\n* Rail Offset Y: Displaces the rail sideways.\n* Creation: Sweep or Revolve.\n* Profile Pos.: Whether the profile is read Front or Side.\n* Mirror: None or Mirror, to flip an asymmetric profile.\n* Gem size Percentage: Percentage of the gem the rail wraps.","metadata":{"title":"Trilogy East-West","section":"Rails","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#rails","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#rails","collection":"docs7","hash":"eee64d9f2b806f2f92097b2fdef0a81e","indexed_by":"docs-index"}},{"content":"Trilogy East-West — Visualization\n\nFour toggles — Hide Center Gem, Hide Side Gems, Hide Center Basket and Hide Side Baskets — help you work on one part at a time. They only affect the view: the whole piece is computed when you accept.\n\nStones\nThe Stones expander is the complete Three Stones editor — shape, material, carats, distance above ring and rotation for the center stone, and angle, rotation and rotation Y for the sides. While the panel is open the document gems are hidden and drawn by the preview; on Accept the whole set is re-baked with its baskets.\n\nGoldsmith Tip: The east-west look comes from the stones, not from the metal. Use the Rotation of the side stones in the Stones expander to lay them across the finger, then come back to the Side Prong tab: the preset for that shape will have rebuilt the prongs on the new orientation, and usually all that is left is to soften Over Girdle so the metal does not crowd the center stone.","metadata":{"title":"Trilogy East-West","section":"Visualization","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#visualization","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#visualization","collection":"docs7","hash":"bff995babdb127bd84d612253ec92d3d","indexed_by":"docs-index"}},{"content":"Trilogy East-West — Saving your work\n\nSave defaults in the header stores the current configuration for the next run (right-click to restore the factory values), and the save button keeps the design as a named preset in the element library, ready to be applied to another trilogy.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trilogy East-West","section":"Saving your work","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#saving-your-work","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-east-west/#saving-your-work","collection":"docs7","hash":"86dd1faece425a898f9f3fde7b729ada","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Trilogy Halo\n\nThe Trilogy Halo command surrounds every gem of a trilogy with its own halo: a metal channel following the girdle, the small gems set into it, the prongs that hold them and the prongs that hold the main stone. It is the Halo engine applied gem by gem, with one set of parameters for the center stone and another shared by the two side stones.\n\nThe command works on a Three Stones element. Run it and pick one of the three gems: the set is resolved from its group, together with the finger reference circle. If the picked gem does not belong to a Three Stones element, the command asks you to select the three gems manually.\n\nAll three stones must be a shape the halo supports — Round, Cushion, Emerald, Oval, Radiant, Asscher and Pear. If a single one of them is a different cut, the panel does not open.\n\nThe panel opens on the element library: click a saved Trilogy Halo design to load it, or the pen icon to start editing.","metadata":{"title":"Trilogy Halo","section":"Trilogy Halo","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#trilogy-halo","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#trilogy-halo","collection":"docs7","hash":"e2982017eef45529db8d75351a81f78c","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Center and sides\n\nBy default the three halos are identical and you edit them as the center. Turn on Side edition and a CENTER GEM / SIDE GEMS selector appears, so the side halos can be tuned apart from the center one. The toggle is hidden in the Settings tab, because what lives there applies to the whole piece.\n\nParameters is organised in four tabs: Metal Profile, Gems, Main Gems Prongs and Settings.","metadata":{"title":"Trilogy Halo","section":"Center and sides","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#center-and-sides","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#center-and-sides","collection":"docs7","hash":"cf792c012a3807bb73f1c53df50a39f8","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Metal Profile\n\nThe channel of metal that runs around the stone.\n\n* Profile: The channel profile from your asset library, shown with its preview.\n* Width and Height: Section of the channel.\n* Distance Gem: How far the channel sits from the main stone.\n* Bottom Diameter and Width Bottom: The bottom of the channel, so it can close narrower than the top.\n* Z Position: Raises or lowers the channel along the axis of the stone.\n* Rotation: Rotates the channel profile.\n* Smooth Edges: A slider that fillets the edges of the channel.","metadata":{"title":"Trilogy Halo","section":"Metal Profile","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#metal-profile","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#metal-profile","collection":"docs7","hash":"133d24d5c36a731117fac9643b92a0f9","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Gems\n\nThe small stones set into the halo.\n\n* Gem Size: Size of the halo gems.\n* Min Distance: Minimum separation between them.\n* Vertical: Raises or lowers them inside the channel.\n* Bright Cut: Bright-cut finish of the seats.\n* Inner Height and Inner Width: The inner opening under the gems.\n* Force Even Number: Forces an even count of gems around the halo, so the layout stays symmetric.","metadata":{"title":"Trilogy Halo","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#gems","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#gems","collection":"docs7","hash":"1b4e3ea15456e6ae40d0551f975287a2","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Prong settings\n\nThree buttons choose how the halo gems are held: none, shared prongs or scalloped.\n\nWith prongs selected:\n\n* Gem Size, Height, External Diameter and Internal Diameter: Dimensions of the prongs.\n* Extension for Mnf.: Extra length added for manufacturing.\n* Automatic Prong Diameter: Lets the prong diameter follow the gems instead of being fixed.\n\nWith scalloped selected you also get V-Cutters, Boolean and Remove Channel toggles, plus two collapsible sections:\n\n* CUTTERS — Start Height, Start Width, End Height, End Width, Length, Move in Z, Move Middle in Z, a Shape (U Shape or V Shape), a Mode (Both Sides or Independently) and a Shape Scale slider.\n* V-CUTTERS — Start | Width, Start | Height, End | Width, End | Height, Length, Move by Normal and a Mode (Keep Start and End, or Independently).","metadata":{"title":"Trilogy Halo","section":"Prong settings","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#prong-settings","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#prong-settings","collection":"docs7","hash":"cf24d73ae298131b2f4a84308ccb42b9","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Drill settings\n\nThree buttons — none, round or quad — choose the hole drilled under each halo gem, each with its own Width and Height.\n\nMain Gems Prongs\nThe prongs that hold the main stone of each halo.\n\n* Mode: Circle or Custom Shape for the section of the prong.\n* Diameter: Section of the prong.\n* Gem Inside: How deep it bites into the stone.\n* Height over Girdle: How far it rises above the girdle.\n* Move in Z: Raises or lowers the prongs.\n* Rotation: Distributes the prongs around the stone.\n* Prong Height: Length of the prong.\n* Extension for Manufacturing: Extra length for production.\n* Cap Bump: The bump on the cap of the prong.\n* Extend to Bridge: Extends the prongs down to a bridge; when it is on, Height to bridge sets how far down and Bridge Mode chooses a Curved or Straight bridge.\n* Cap Mode: Round or Claw. With Claw you also get Gem Inside, Tip inside, Height, Width and a Tension slider for the cap.","metadata":{"title":"Trilogy Halo","section":"Drill settings","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#drill-settings","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#drill-settings","collection":"docs7","hash":"bd1272c8715518b4338641ed6224f7c8","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Settings\n\nApplies to the whole piece.\n\n* Cut by ring size: Trims the halos to the finger circle.\n* Merge sides with center: Joins the side halos to the center one instead of leaving three separate bodies.\n* Show cutter: Displays the cutter used to trim, so you can check it.\n* Cutter Top, Cutter Bottom, Cutter Height and Cutter Move Z: Adjust that cutter (0 means it matches the center one).","metadata":{"title":"Trilogy Halo","section":"Settings","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#settings","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#settings","collection":"docs7","hash":"7e610a047f2da6f1e0efa101473d8c14","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Air Gap\n\nThe openings cut through the body of the halo. This section has its own Side edition toggle, with its own CENTER GEM / SIDE GEMS selector, because the air gap is set per halo.\n\n* Layout buttons: none, 4, 6 or a free number.\n* Number: The count when you choose the free option.\n* Width and Height: Size of each gap.\n* Move in Z: Raises or lowers them.\n* Vertical Rotation and Global Rotation: Tilt each gap and turn the whole ring of gaps around the stone.","metadata":{"title":"Trilogy Halo","section":"Air Gap","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#air-gap","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#air-gap","collection":"docs7","hash":"9903db218a2704fa845d5157d807f896","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Visualization\n\nFour toggles — Hide Center Gem, Hide Side Gems, Hide Center Halo and Hide Side Halos — let you tune one part without the others in the way. They are view aids only and are not saved: the whole piece is computed when you accept.\n\nStones\nThe Stones expander is the complete Three Stones editor — shape, material, carats, distance above ring and rotation for the center stone, plus angle and rotation Y for the sides. While the panel is open the three document gems are hidden and drawn by the preview; on Accept the whole set is re-baked with its halos.\n\nGoldsmith Tip: Turn on Force Even Number before you start moving Gem Size and Min Distance. An even count keeps the halo symmetric about the axes of the stone, which is what makes the three halos of a trilogy read as one family instead of three independent rings.","metadata":{"title":"Trilogy Halo","section":"Visualization","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#visualization","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#visualization","collection":"docs7","hash":"e60661b8980e32f9565d2fb62ebea2e1","indexed_by":"docs-index"}},{"content":"Trilogy Halo — Saving your work\n\nSave defaults in the panel header stores the current configuration as the starting point for the next run (right-click it to go back to the factory values), and the save button stores the design as a named preset in the element library, ready to be reused on another trilogy.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trilogy Halo","section":"Saving your work","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#saving-your-work","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-halo/#saving-your-work","collection":"docs7","hash":"a75d6ab130982325ae5e5fb4098b246e","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Trilogy Individual\n\nThe Trilogy Individual command builds a *different* setting on each gem of a trilogy: the center stone gets a full tulip prong setting, and the two side stones get a rail running under their girdle. It is the gemset to use when the center stone deserves its own architecture and the sides only need a discreet band of metal to sit on.\n\nIt works on a Three Stones element. Run the command and pick one of the three gems: the whole set (center + two sides, plus the finger reference circle) is resolved from the group. If the gem you pick does not belong to a Three Stones element, the command asks you to select the three gems manually and works out which one is the center by their positions.\n\nWhen the panel opens you land on the element library first: click one of the saved Trilogy Individual designs to load it, or click the pen icon to enter editing mode and build one from scratch.","metadata":{"title":"Trilogy Individual","section":"Trilogy Individual","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#trilogy-individual","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#trilogy-individual","collection":"docs7","hash":"b5293c3ee385efd5a28025fc564c8186","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Center stone: Setting\n\nThe first tab holds the tulip that grips the center stone.\n\n* Mode: Choose between Round prongs and Claw prongs.\n* Count: Number of prongs, 4 or 6.\n* Diameter: Thickness of the prong wire.\n* Gem Inside: How deep the prong bites into the stone.\n* Height: Height of the tulip body.\n* Move in Z: Raises or lowers the whole setting along the gem axis.\n* Bulge width and Bulge Inside: Control the belly of the tulip — how wide it swells and how far it leans towards the axis of the stone.\n* Extension for Manufacturing: Adds extra length at the bottom of the prongs for production. It only shows up when you switch from Rendering to Manufacturing mode in the Outliner panel.\n* Rotation: Turns the whole setting around the axis of the center stone, which is how you distribute the prongs (45° puts four prongs on the corners, 90° crosses them to the other two sides). New pieces start at 45° for a round center and at 0° for the other shapes.\n* Bulge close bottom, Bulge close top and Bulge spread: Three sliders, in percent, that shape the silhouette of the tulip — how much it closes at the bottom, how much at the top, and how far the bulge spreads.\n\nWhen Mode is set to Claw, an extra block appears:\n\n* Cap distance and Cap height: Position of the claw cap over the girdle.\n* Tip width: Width of the claw tip.\n* Tip length: Length of the straight tip. This one gates the whole claw — leave it at 0 and no claw is built.","metadata":{"title":"Trilogy Individual","section":"Center stone: Setting","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#center-stone-setting","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#center-stone-setting","collection":"docs7","hash":"fcf6fc2dfadbd7594be8cf33e24d9835","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Center stone: Ornament\n\nThe second tab adds a decorative element between the prongs of the tulip.\n\n* Type: None, Union (an arch joining the prongs) or Leaf.\n* Placement: Where the ornament goes — Y axis, X axis or Both.\n* Diameter: Section of the ornament wire.\n\nWith Union selected:\n\n* Attach position: Where along the prong the arch is anchored.\n* Arch height: How high the arch rises.\n* Tip inside: How far the tip of the arch reaches towards the stone.\n\nWith Leaf selected:\n\n* Axis: Both axes (shared) uses one set of values for X and Y; Individual X / Y splits them so each axis can be tuned apart.\n* Length, Tips aperture, Opening, Curvature position and Smooth: Shape of the leaf outline.\n* Move in Z, Top Z and Bottom Z: Vertical placement of the leaf and of its two ends.\n* Top inside, Bottom inside and Middle inside: How far the top, the bottom and the belly of the leaf lean towards the stone.","metadata":{"title":"Trilogy Individual","section":"Center stone: Ornament","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#center-stone-ornament","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#center-stone-ornament","collection":"docs7","hash":"385b36be8b00da87625d4bc71d9ad1b7","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Side stones: Rail\n\nThe third tab is the single rail that runs under the girdle of the two side stones — they are always symmetric, so one set of values drives both. The editor is the same rail editor used by the Advanced Basket command.\n\n* Mode: Round for a plain round section, or Custom Shape to sweep one of the closed profiles from your asset library (new pieces start on the *Square rounded corners* profile).\n* Width and Height: Dimensions of the rail section.\n* Under Girdle: How far below the girdle the rail sits.\n* Rotation: Rotates the profile in its section plane.\n* Bend Height and Bend Rotation: Bend the rail out of its plane.\n* Fillet Radius: Rounds the edges of the rail.\n* Rail Offset Y: Displaces the rail sideways.\n* Creation: Sweep or Revolve — the method used to build the rail from its profile.\n* Profile Pos.: Whether the profile is read Front or Side.\n* Mirror: None or Mirror, to flip an asymmetric profile.\n* Gem size Percentage: Percentage of the gem the rail wraps.","metadata":{"title":"Trilogy Individual","section":"Side stones: Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#side-stones-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#side-stones-rail","collection":"docs7","hash":"427e603c26e11a19844f77288d362ed5","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Visualization\n\nFour toggles that hide parts of the piece while you work — Hide Center Gem, Hide Side Gems, Hide Center Setting and Hide Side Settings. They are view aids only: they are not saved and they do not change what is baked, so the whole piece is always computed on Accept.\n\nStones\nThe Stones expander carries the complete Three Stones set of parameters — shape, material, carats and distance above ring for the center stone, plus angle, rotation and rotation Y for the sides. While the panel is open the three document gems are hidden and drawn by the preview instead; nothing touches the document until you accept, and then the whole set is re-baked together with the setting.\n\nGoldsmith Tip: Set the center Rotation before you fine-tune anything else. Turning the tulip so its prongs land on the corners of the stone frees the two long sides for the ornament, and it also decides how much of the side rails you will actually see from the top.","metadata":{"title":"Trilogy Individual","section":"Visualization","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#visualization","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#visualization","collection":"docs7","hash":"72aa1614353a32518a0346aa37e0c845","indexed_by":"docs-index"}},{"content":"Trilogy Individual — Saving your work\n\nThe panel header carries the usual actions: Save defaults stores the current configuration as the starting point for the next run (right-click it to go back to the factory values), and the save button stores the current design as a named preset in the element library, with a preview image, so you can reuse it on any other trilogy.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trilogy Individual","section":"Saving your work","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#saving-your-work","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-individual/#saving-your-work","collection":"docs7","hash":"4c12e9e0bdea1db46ccab2cc9da89586","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis\n\nThe Trilogy Trellis command builds the classic woven trellis around a trilogy: four prongs that are born at the inner corners of the side stones and descend to the ring, four more that start at the corners of the center stone, cross over it and end as the outer prong of the opposite side stone, and a rail under the girdle of each gem. The whole thing is one single joined piece — prongs, rails and shank together.\n\nThe command works on a Three Stones element. Run it and pick one of the three gems: the set is resolved from its group, including the finger circle it was baked with. If the picked gem does not belong to a Three Stones element, the command asks for the three gems manually and classifies them by position. There is no shape restriction — the prong anchors follow the girdle and corner layout of each gem.\n\nThe panel opens on the element library: click one of the saved Trilogy Trellis designs, or the pen icon to start editing.","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#trilogy-trellis","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#trilogy-trellis","collection":"docs7","hash":"f86d768275a684361377140955258b0a","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Selection\n\nThe Selection expander holds the ring curve — the curve the shank prongs land on. It comes pre-filled with the finger circle baked into the Three Stones element, and you can unselect it or pick another curve; it must be below the gems. While no curve is selected, a Height value in the Shank Prongs tab places a default curve under the center gem instead.","metadata":{"title":"Trilogy Trellis","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#selection","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#selection","collection":"docs7","hash":"2cef9cf0d4feebf15db3a34b76e2e599","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Shank Prongs\n\nThe four prongs born at the inner corners of the side gems that descend to the ring.\n\n* Height: Height of the default ring curve, shown only while no curve is selected.\n* Diameter: Section of the prong.\n* Gem Inside: How deep the prong bites into the girdle.\n* Over Girdle: How far its grip tip rises over the girdle.\n* Top Vertical: The straight stub under the tip.\n* Bulge Start and Bulge End: The tangents at both ends of the run — how hard the prong dives away from the stone and how it arrives at the ring.\n* Opening: The angle the pair of prongs opens as it descends.\n* Middle Offset: Displaces the middle of the run.\n* Cross Height: Raises or lowers where the prongs cross.\n* Distance: Separation from the ring curve.\n* Extension: Extra length added for manufacturing.","metadata":{"title":"Trilogy Trellis","section":"Shank Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#shank-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#shank-prongs","collection":"docs7","hash":"08e993e541933116822a060657c6bbd3","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Bottom Profile — shank prongs\n\nThe cross-section where a shank prong lands on the ring. Only these prongs have a bottom, since the cross prongs grip a stone at both ends.\n\n* Shape: Circle, Square or Custom. With Custom you pick the closed End Profile Curve the prongs end on.\n* Width and Height: Dimensions of that section.\n* Profile Start: Where along the prong the transition into the bottom profile begins.","metadata":{"title":"Trilogy Trellis","section":"Bottom Profile — shank prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#bottom-profile--shank-prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#bottom-profile--shank-prongs","collection":"docs7","hash":"7da8f36e018d38f1377b6b06e014705c","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Top Profile — all prong tips\n\nHow every prong tip grips its stone. It is one setting for the whole piece: it is edited here and it drives all the tips, the cross prongs included.\n\n* Mode: Circle or Claw.\n* Cap Distance, Cap Height, Tip Width and Tip Smoothness: The claw cap.\n\nCross Prongs\nThe four blend prongs born at the corners of the center gem that cross over the stone and end as the outer prong of the opposite side gem.\n\n* Diameter and Extension: Section of the prong and the extra length added for manufacturing.\n\nCenter — where the prong is born, on a corner of the center gem girdle:\n\n* Gem Inside: How far it digs into that girdle.\n* Over Girdle: How high the grip tip sits over it.\n* Top Vertical: The straight stub under the tip.\n* Bulge Start: The tangent leaving it — how hard the blend dives.\n\nMiddle — the belly that crosses under the center stone. Each value is split into 1 and 2, one per crossing family, so the two prongs that cross can be tuned apart:\n\n* Middle Inside 1 / 2: Shifts the belly horizontally.\n* Middle Height 1 / 2: Lifts it.\n* Middle Position 1 / 2: Slides it along the run.\n\nSide — where the prong dies, climbing the outer axis of the opposite side gem:\n\n* Side Gem Inside: How far it digs into that girdle.\n* Side Over Girdle: How high its grip tip sits.\n* Tip Length: The straight run below the girdle that the blend catches.\n* Bulge End: The tangent arriving onto it.\n\nThe tips of these prongs are shaped by the Top Profile, which is shared with the whole piece and lives in the Shank Prongs tab.","metadata":{"title":"Trilogy Trellis","section":"Top Profile — all prong tips","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#top-profile--all-prong-tips","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#top-profile--all-prong-tips","collection":"docs7","hash":"52833c7e11a67b90a9a3a49e63ebac04","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Center Rail\n\nThe rail under the girdle of the center stone, with a toggle to turn it on or off.\n\n* Mode: Circle or Custom Shape, the latter sweeping a profile from your asset library, shown with its preview.\n* Width and Height: Section of the rail.\n* Under Girdle: How far below the girdle it sits.\n* Rotation: Rotates the profile.\n* Chamfer and Chamfer Offset: An internal chamfer that makes it easier to prepare the seat for the stone.","metadata":{"title":"Trilogy Trellis","section":"Center Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#center-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#center-rail","collection":"docs7","hash":"c8bbb616be5f2e6e557b423bf52112a6","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Side Rail\n\nThe rails of the two side stones, with their own on/off toggle.\n\nWith Side Edition off they simply follow the Center Rail, and the tab says so. Turn it on and they get their own Mode, profile, Width, Height, Under Girdle, Rotation, Chamfer and Chamfer Offset — which is usually what a small side stone needs next to a much bigger center.","metadata":{"title":"Trilogy Trellis","section":"Side Rail","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#side-rail","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#side-rail","collection":"docs7","hash":"d551e501e709363ddda84da1f0b7bdfb","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Visualization\n\nTwo toggles, Hide Center Gem and Hide Side Gems, get the stones out of the way while you shape the metal. Because the trellis is a single joined body, there is no way to hide the center or the side settings separately. The gems come back as soon as you accept or close.\n\nStones\nThe Stones expander is the full Three Stones editor — shape, material, carats, distance above ring and rotation for the center stone, plus angle and rotation Y for the sides. On Accept the whole set is re-baked together with the trellis.\n\nGoldsmith Tip: Work the cross prongs from the ends inwards. Fix Gem Inside and Over Girdle at both ends first, so the grip is right on both stones, and only then use Middle Height and Middle Position to lift the belly clear of the center stone. Trying to fix a colliding belly by moving the ends usually costs you the grip.","metadata":{"title":"Trilogy Trellis","section":"Visualization","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#visualization","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#visualization","collection":"docs7","hash":"66bba8fe0f8b93cae68d89d1bb177d8e","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Saving your work\n\nSave defaults in the header stores the current configuration as the starting point for the next run (right-click it to restore the factory values), and the save button keeps the design as a named preset in the element library so it can be applied to any other trilogy.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Trilogy Trellis","section":"Saving your work","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#saving-your-work","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/trilogy-trellis/#saving-your-work","collection":"docs7","hash":"a68574e7ab8223795a49e64fb829baa3","indexed_by":"docs-index"}},{"content":"Tulip — Tulip\n\nThe Tulip command builds a petal-shaped setting around a gem, based on a curved rail of prongs that bows outward like a tulip flower, with an optional ornament bridging the gaps between petals. Select one or more diamonds or gemstones and the command generates the setting for each, sized and positioned to fit the selected gem.\n\nThe command panel is organized in two tabs: Setting, which shapes the petals themselves, and Ornament, which adds decoration between them.","metadata":{"title":"Tulip","section":"Tulip","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#tulip","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#tulip","collection":"docs7","hash":"8d03f004d1805080a67d167c4d84f922","indexed_by":"docs-index"}},{"content":"Tulip — Setting\n\n* Mode: The petal tip style — Round for a smooth rounded petal, or Claw for an extended grabbing claw over the stone.\n* Count: The number of petals/prongs around the gem — 4 or 6.\n* Diameter: The pipe diameter of the petal tube.\n* Gem Inside: Radial offset of the tube from the girdle — 0 means the tube is tangent to the stone.\n* Height: Vertical scale of the whole setting.\n* Move in Z: Vertical offset of the whole setting.\n* Bulge width: How far each petal's belly bows outward.\n* Bulge Inside: Radial depth of the petal's bulge (in or out).\n* Extension for Manufacturing: Extra material added above the gem when Manufacturing mode is active in the Outliner panel, for casting and setting.\n* Bulge spread: How far the bulge extends up and down the petal from its center, as a percentage.\n* Bulge close bottom / Bulge close top: How much the petal closes in at the bottom and top, as percentages.\n\nClaw (only when Mode is Claw): Cap distance pulls the claw tip toward the stone's center, Cap height moves the tip up or down, and Tip width sets how much width remains at the very tip.","metadata":{"title":"Tulip","section":"Setting","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#setting","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#setting","collection":"docs7","hash":"de916ca48a4c091daf388c604f57ab34","indexed_by":"docs-index"}},{"content":"Tulip — Ornament\n\nBridges the gap between two neighboring petals with decorative metal.\n\n* Type: None, Union (an open arch running from one petal over the center to the mirrored point on the next), or Leaf (a closed leaf-shaped outline closing at the bottom where the petals meet).\n* Placement: Which gaps get the ornament — Y axis, X axis, or Both. On an asymmetric gem (Oval, Marquise, ...) a fresh Tulip defaults to the X axis only, with per-axis editing turned on.\n* Diameter: The ornament tube diameter.\n\nUnion: Attach position sets where along the petal rail the arch grabs on (0 at the base, 1 at the tip), Arch height sets how high the arch bows over the center, and Tip inside moves the arch's apex relative to the girdle.\n\nLeaf: Axis chooses between one shared outline for both axes or Individual X / Y outlines when Placement is Both. Each outline (shown as its own X Axis / Y Axis block when individual) is shaped with Length, Tips aperture, Opening, Curvature position, Smooth, Move in Z, Top inside, Top Z, Bottom inside, Bottom Z and Middle inside.\n\nGoldsmith Tip: When a fresh Tulip on an oval or marquise stone opens with Placement set to X axis only, that is deliberate — the tool detected the asymmetric shape and picked the axis where a single Union or Leaf ornament reads best. Switch to Both only once you are happy with one side, and turn on Individual X / Y from the Leaf Axis selector so the shorter axis can use its own, tighter proportions.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Tulip","section":"Ornament","url":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#ornament","source":"https://www.rhinoartisan.com/docs/7/diamonds/gemsets/tulip/#ornament","collection":"docs7","hash":"3b0ab1a15c39d4a874ca3ad870a57d4a","indexed_by":"docs-index"}},{"content":"Automatic Pave — Automatic Pave\n\nThe Automatic Pavé command efficiently distributes gemstones of predefined sizes onto a surface. This distribution can be executed in two distinct modes:\n\n1. Point-Based Mode – Users select a starting point on the surface from which the pavé pattern expands.\n2. Edge-Based Mode – The distribution begins from the outer edges of the surface and progresses inward.\n\nAdditionally, the command provides the option to automatically generate the necessary prongs to secure the stones within the pavé, as well as the cutters (drill holes) to accommodate each gemstone in the design.","metadata":{"title":"Automatic Pave","section":"Automatic Pave","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#automatic-pave","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#automatic-pave","collection":"docs7","hash":"4420bff688e9b583514c5fcdec226cac","indexed_by":"docs-index"}},{"content":"Automatic Pave — How it Works\n\nWhen clicking on the Automatic Pavé icon, the command opens in the Artisan panel. The Selection panel has two selectors: the first, and required one, is the object where the pavé will be applied — a surface, polysurface, mesh or SubD object. The second one is optional and lets you pick gemstones that already exist in the document so they are taken into account by the distribution.\n\nThe Parameters panel is divided into three tabs:\n\nGems – Provides tools to create the pavé and set the parameters for gemstone sizes.\n\nProngs – Includes tools for generating the prongs that will secure the gemstones.\n\nCutters – Allows the creation of the drill holes for each gemstone in the pavé.\n\nBelow them, the Info panel reports the number of stones and their total weight in carats, and the Visualization panel holds the display toggles.","metadata":{"title":"Automatic Pave","section":"How it Works","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#how-it-works","collection":"docs7","hash":"63fe53645caa4276fa5056da068433f0","indexed_by":"docs-index"}},{"content":"Automatic Pave — Gems&#x20;\n\nWithin this tab, the first options available are the two gemstone distribution modes:\n\n#### &#x20; Point-Based Distribution&#x20;\n\nThe pavé starts from a specific point defined by the user within the object's surface.&#x20;\n\nOnce the starting point is specified, a set of circles will appear, indicating where the gemstone distribution will begin and the direction of construction. A dark dot will be visible, which can be moved to adjust the distribution direction.\n\nAfter setting the desired direction, right-clicking will confirm the adjustment and initiate the distribution calculations.\n\nOnce the mathematical distribution of the pavé is complete, users can begin the refinement process. It's important to note that the automatic calculation and geometric distribution may not always align with aesthetic preferences.\n\nTo achieve a customized pavé, users can:\n\n* Adjust gemstone sizes – Increase or decrease the size of specific stones.\n* Lock selected gemstones – Fix the position of certain stones and recalculate the distribution while preserving them, allowing adjacent stones to adjust accordingly. Click on to unlock .\n* Move gemstones – Shift individual stones, pushing neighboring ones to adapt to the new placement.\n* Delete gemstones – Remove specific stones to fine-tune the design, or to add others.\n\n##### Gem Sizes\n\nThe distribution only uses the sizes listed in the Gem Sizes box. Two buttons let you extend that list:\n\n* Add a single size – type one diameter in millimetres.\n* Add a range of sizes – give a Min, a Max and a Step, and every size from Min to Max is added in increments of Step.","metadata":{"title":"Automatic Pave","section":"Gems&#x20;","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","collection":"docs7","hash":"26f9875998c3d9ade1503134c9ac1f82","indexed_by":"docs-index"}},{"content":"Automatic Pave — Gems&#x20;\n\nUsers can also manually add gemstones by selecting one of these predefined sizes and clicking on a point on the surface to place it. If a newly placed gemstone intersects with another, both gemstones will turn red, signaling areas that need adjustment. To resolve these intersections, users can:\n\n* Move or resize gemstones to create more space.\n* Refresh the command to recalculate and reposition the gemstones automatically.\n\nAt any point during the automatic pavé construction process, users can stop the process by clicking the Stop button, located at the top of the panel next to the Refresh button.\n\n##### Symmetry and Editor\n\nFour buttons apply symmetry to the construction of the pavé — None, mirrored along Y, along X, or along both axes — so that every change is reproduced on the mirrored side.\n\nThe last button of the row activates or deactivates the editor. With the editor on you can pick stones with the mouse, window-select several of them at once and drag them to a new position; with it off the clicks go back to Rhino.\n\n##### Distances\n\n* Min Distance – the minimum separation the gemstones must keep between each other.\n* Border Distance – the margin kept between the outermost gemstones and the edge of the surface.\n\nThe Info panel shows the total number of gemstones in the pavé and their total weight in carats, and the Visualization panel lets you swap the display mode between real gemstones and circles, and toggle the gem size labels.\n\nThese features give users full control over the design process, allowing for both precise technical adjustments and aesthetic customization.\n\n#### Edge-Based Distribution&#x20;","metadata":{"title":"Automatic Pave","section":"Gems&#x20;","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","collection":"docs7","hash":"05c65b5bdba678a19292d0f09ff7b77c","indexed_by":"docs-index"}},{"content":"Automatic Pave — Gems&#x20;\n\nIn some cases, it is preferable to start the pavé construction by placing the outermost gemstones along the edge of the surface first. If users select this option, RhinoArtisan will first calculate the distribution of gemstones along the border and then progressively expand the pavé inward, maximizing surface coverage while maintaining the predefined spacing between stones.\n\nJust like with Point-Based Distribution, users can:\n\n* Pause the process at any time to manually add, block, or move gemstones before continuing with the distribution.\n* Refine the pavé after the calculation by adjusting gemstone sizes, shifting individual stones, or adding new ones.\n* Recalculate the distribution after making manual modifications to achieve an optimized layout.\n\nThis method provides greater control when designing pavé settings, ensuring that the most visible gemstones along the edges are positioned precisely before expanding the pattern into the surface’s interior.","metadata":{"title":"Automatic Pave","section":"Gems&#x20;","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#gemsx20","collection":"docs7","hash":"15c39ea7bdc0910d28f133fce4417976","indexed_by":"docs-index"}},{"content":"Automatic Pave — Prongs\n\nThe Prongs tab provides tools for creating and adjusting prongs to secure gemstones within the pavé. It works just like the Dynamic Prongs command, offering both manual and automatic placement options.\n\n#### Placement Modes\n\n1. Add Prong: place prongs manually with your mouse, using the diameter defined below. While RhinoArtisan provides guidance, you have full control over the exact placement of each prong.\n2. Remove Prong: remove any prong you don't want by simply selecting it.\n3. Automatic Prongs: RhinoArtisan places all the prongs of the pavé for you, using the diameter and height values below.\n4. Prong Editor: toggles the interactive prong editor. With it on, hovering highlights the prong under the mouse; a click selects it, Shift+click adds more prongs to the selection, Ctrl+click removes one, and dragging from an empty spot draws a selection window. Drag any selected prong — or several at once — directly over the surface to reposition them (each prong keeps its own size and parameters), and press Delete to remove the whole selection.\n\nWith the editor on and prongs selected, the parameter fields below show the values of the selected prong and edit only the selection — change the diameter with three prongs selected and just those three change. With nothing selected, the fields set the values used for the next prongs, as usual.\n\n#### Prong Parameters\n\nType selects the profile of the prong:\n\n* Simple – a single Diameter value.\n* Advanced – three diameters along the prong: Top, Base and Bottom.\n\nThe HEIGHT section contains:\n\n* Over Girdle – how far the prong rises above the girdle of the stone.\n* Under Girdle – how far the prong extends below the girdle.\n* Extension for Manufacturing – extra length added at the base of the prong so it can be anchored into the piece.","metadata":{"title":"Automatic Pave","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#prongs","collection":"docs7","hash":"1b9b3e719ef18c2a4eed8cb91e0299f5","indexed_by":"docs-index"}},{"content":"Automatic Pave — Prongs\n\nBelow the parameters, the same four symmetry buttons (None, Y, X and both) are available for the prongs, which is extremely useful for pieces that allow it, ensuring a balanced and aesthetically pleasing prong layout.\n\n⚠ Note: Prongs will not be added along the outer edge of the pavé, as their placement depends on how the user wants to integrate them with the border. These prongs should be defined manually to suit the specific design needs.","metadata":{"title":"Automatic Pave","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#prongs","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#prongs","collection":"docs7","hash":"6bcc5153607842511f6a49e0d9c5f36e","indexed_by":"docs-index"}},{"content":"Automatic Pave — Cutters\n\nThe Cutters tab provides advanced tools for drilling and shaping the necessary holes to accommodate gemstones within the pavé. It works similarly to our dedicated Cutter tool, offering precise control over the drilling process.\n\nA Show Cutters toggle at the top of the tab turns the preview of the cutters on and off.\n\n#### Cutter Configuration Parameters\n\nUsers can define how the cutter interacts with different parts of the gemstones, including the Crown, Pavilion, and Girdle. Except for Gem Inside, which is given in millimetres, all the values are percentages relative to the gem:\n\n* Height Top (%) – Adjusts the height of the cutter at the uppermost part of the gemstone.\n* Size Top (%) – Defines the width of the cut at the top, controlling how much material is removed.\n* Height Crown (%) – Specifies the cutter height in the crown area (above the girdle), determining how deep the cut extends into this section.\n* Gem Inside (mm) – Moves the cutter into or out of the gemstone, allowing for extended cuts if needed.\n* Height Girdle (%) – Controls the cutter’s interaction with the girdle (the widest part of the gemstone), adjusting how it shapes this section.\n* Size Drill (%) – Defines the drill size, affecting the overall diameter of the cut.\n* Height Pavilion (%) – Sets the cutter’s height in the pavilion (the lower portion of the gemstone), allowing for precise shaping.\n* Size Bottom (%) – Determines the width of the cut at the bottom of the gemstone, important for modifying the pavilion.\n* Height Drill (%) – Adjusts the drill’s height, fine-tuning the cut depth.\n\n#### Drill Shape Options\n\nTo accommodate different design requirements, users can choose from four drill shapes:","metadata":{"title":"Automatic Pave","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#cutters","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#cutters","collection":"docs7","hash":"b7926e0c67b44d69410a46da4b0bf955","indexed_by":"docs-index"}},{"content":"Automatic Pave — Cutters\n\n* Gem Shape – the cutter follows the outline of the gemstone itself. This is the default.\n* Round\n* Square\n* Hexagon\n\n#### Presets\n\nFour preset buttons at the bottom of the tab load ready-made cutter configurations, a quick starting point that you can then fine-tune with the parameters above.\n\nThese flexible settings allow for highly customizable cuts, whether for functional adjustments or aesthetic refinements in the pavé structure.","metadata":{"title":"Automatic Pave","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#cutters","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/automatic-pave/#cutters","collection":"docs7","hash":"1232feae065dc671fffc17323ef2e8c6","indexed_by":"docs-index"}},{"content":"Pave along Surface — ​ Pave along Surface\n\nThe Pave Along Surface command places rows of gemstones across a surface following its UV directions. Each row is generated along an isocurve, which makes it easy to align and distribute the gems accurately.\n\nFive panels control this command.\n\nSelection\nSelect the surface where the pavé will be applied.","metadata":{"title":"Pave along Surface","section":"​ Pave along Surface","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#-pave-along-surface","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#-pave-along-surface","collection":"docs7","hash":"aa622b79f2329d4c1984e1a1eae1455c","indexed_by":"docs-index"}},{"content":"Pave along Surface — Management\n\nThe Add button starts the placement of rows. RhinoArtisan asks you to pick a point on the surface to define the isocurve where the row will be created, and the Rhino command line offers two toggles:\n\n* Direction: switch between the U and the V direction of the surface.\n* Justify: when set to Yes, the gems are distributed so the row is justified between both ends of the isocurve; when set to No, they are laid out from the start of the row keeping the exact spacing.\n\nYou can keep picking points to add as many rows as you need, and press Enter to finish.\n\nEvery row you create gets its own gumball in the viewport, with which you can:\n\n* Drag the row to a different position on the surface.\n* Increase or decrease the gem size of that particular row in 0.05 mm steps.\n* Delete the row.","metadata":{"title":"Pave along Surface","section":"Management","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#management","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#management","collection":"docs7","hash":"6c715e7b80b4069149d09ebe2d424e84","indexed_by":"docs-index"}},{"content":"Pave along Surface — Parameters\n\nThese values are applied to every row at once — to change a single row, use its gumball.\n\n* Gem Size: diameter of the gems, in millimetres.\n* Min Distance: minimum separation kept between neighbouring gems.\n* Distance to Border: margin kept between the outermost gems and the ends of the row, so the stones do not run over the edge of the surface.\n* Alignment Vertical: how the row sits with respect to the isocurve — Center, Top or Bottom.","metadata":{"title":"Pave along Surface","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#parameters","collection":"docs7","hash":"00d4a902849fa64c2d89083f633f1f4b","indexed_by":"docs-index"}},{"content":"Pave along Surface — Info\n\nReports the Number of gems in all the rows and their total weight in Carats.\n\nAdvanced\nThis panel provides two display toggles:\n\n* Swap Display Mode: draw the gems either as real gemstones or as circles representing their placement.\n* Show Gem Sizes: toggle the visibility of the gem size labels in the viewport, to streamline your design process or to review the dimensions as needed.\n\nWhen you confirm your changes, the Gems will be grouped and listed on the Outliner toolbar.\n\nGoldsmith Tip : This tool is particularly useful for creating regular pavé settings. When working with highly curved surfaces—like the one shown in the image above—it is essential to adjust the size of the gems in each row. By carefully matching the sizes so that each row aligns seamlessly with the previous one, you achieve a perfect distribution and an aesthetically pleasing result.","metadata":{"title":"Pave along Surface","section":"Info","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#info","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave-along-surface/#info","collection":"docs7","hash":"249cb3ce1304032038f7eb4de5de3424","indexed_by":"docs-index"}},{"content":"Pave — ​ Pave\n\nWith this command, you can place gems freely with your mouse, with precision and flexibility. It's especially useful when setting stones on organic or other complex designs.\n\nThe command is divided into four collapsible panels: Selection, Parameters, Info and Advanced.\n\nSelection\nThis panel holds two selectors:\n\n* Geometry: the object where the pavé will be created. It accepts a surface, polysurface, mesh or SubD and is required before you can start placing stones.\n* Gems: optional. Pick gemstones that already exist in the document and they are absorbed into the pavé, so they are taken into account for collisions and for the prong calculation. Only round gems can be absorbed.","metadata":{"title":"Pave","section":"​ Pave","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#-pave","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#-pave","collection":"docs7","hash":"590e54284046f35a0599fc60f3e15244","indexed_by":"docs-index"}},{"content":"Pave — Parameters\n\nThis panel has two tabs, one for the gemstones and another for the prongs.\n\n#### Gems\n\nThree buttons drive the placement of the stones:\n\n* Add: pick points on the object to drop gems, one at a time. A Flip option is available in the Rhino command line to invert the orientation of the stone. Press Enter to finish.\n* Delete: pick the gems you want to remove.\n* Edit: pick a gem and a gumball appears on the object so you can slide it over the surface. While the gumball is active the command line offers Gem Size, Increase and Decrease so you can also resize that single stone.\n\nTwo values control the stones themselves:\n\n* Gem Size: diameter, in millimetres, of the gems that will be placed next.\n* Min Distance: minimum separation kept between neighbouring stones.\n\n#### Prongs\n\nThis tab works like the Dynamic Prongs tool. Four buttons are available:\n\n* Add: place prongs manually by picking points.\n* Delete: pick the prongs to remove.\n* Automatic: let RhinoArtisan calculate and place the prongs for the whole pavé.\n* Edit: pick a prong and move it to a new position.\n\nType selects the prong profile:\n\n* Simple – a single Diameter value.\n* Advanced – three diameters along the prong: Top, Base and Bottom.\n\nThe HEIGHT section contains:\n\n* Over Girdle: how far the prong rises above the girdle of the stone.\n* Under Girdle: how far the prong extends below the girdle.\n* Extension for Manufacturing: extra length added at the base of the prong so it can be anchored into the piece for manufacturing.","metadata":{"title":"Pave","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#parameters","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#parameters","collection":"docs7","hash":"80b5ef54fe38823003cdd5c21ccd58f1","indexed_by":"docs-index"}},{"content":"Pave — Info\n\nThis panel reports the Number of gems currently placed and their total weight in Carats, a useful reference while you design.\n\nAdvanced\nHere you will find three buttons and a symmetry selector:\n\n* Swap Display Mode: disabled by default. When enabled, gems are drawn as 2D circles at their base instead of as real gemstones.\n* Show Gem Sizes: enabled by default. Shows a bubble with the diameter in millimetres on every gem.\n* Undo: removes the last gem or prong you placed. If a symmetry is active, the mirrored copies are removed as well.\n* Symmetry: set to None by default. Choose X, Y or X and Y to mirror every stone or prong you place across the corresponding axis. The section curves of the active symmetry planes are displayed in the viewport as a guide.\n\nWhen you confirm your changes, the gems are grouped together (and the prongs in a second group) and listed on the Outliner toolbar.\n\nGoldsmith Tip: The Pavé tool is ideal for creating irregular pavé settings where the gemstone distribution does not follow a consistent pattern. However, it's important to pay extra attention when adding prongs. Due to the irregular arrangement of the stones, automatic prong placement may not work perfectly, so manual adjustment is recommended to ensure accurate and secure prong positioning.","metadata":{"title":"Pave","section":"Info","url":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#info","source":"https://www.rhinoartisan.com/docs/7/diamonds/pave/pave/#info","collection":"docs7","hash":"2786832bb7fc2bece0005f3b54299ec6","indexed_by":"docs-index"}},{"content":"Pearl — Pearl\n\nThe Pearl command allows you to create a realistic 3D representation of a pearl, complete with a supporting calotte and a wire for mounting. This versatile tool is ideal for jewellers designing earrings, pendants, or other pieces featuring pearls.\n\nParameters\n* Size: The diameter of the pearl sphere.\n\nThe rest of the parameters are organized in two sections:","metadata":{"title":"Pearl","section":"Pearl","url":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#pearl","source":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#pearl","collection":"docs7","hash":"e615a09cc987c232ce629faf9d7ab8cf","indexed_by":"docs-index"}},{"content":"Pearl — Pearl Wire\n\n* Diameter: The thickness of the wire.\n* Length: The length of the wire, which can be used as a post for earrings or for other mounting purposes.\n\nCalotte\n* Angle: The angle covered by the calotte — the curved cap that supports the pearl. A higher angle wraps further around the pearl, while a lower angle results in a flatter, more open cap.\n* Thickness: The metal thickness of the calotte.","metadata":{"title":"Pearl","section":"Pearl Wire","url":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#pearl-wire","source":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#pearl-wire","collection":"docs7","hash":"3b44962b0a14e91b5062adaf16928eea","indexed_by":"docs-index"}},{"content":"Pearl — Usage\n\nAdjust the parameters and watch the preview update: pearl size, wire diameter and length, and calotte angle and thickness. You can save your preferred configuration with the Save defaults button in the header (right-click it to clear the saved values), so every new pearl starts from your house specifications.\n\nGoldsmith Tip: To attach a twisted wire to the calotte, use the RhinoArtisan Rope command.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Pearl","section":"Usage","url":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#usage","source":"https://www.rhinoartisan.com/docs/7/diamonds/pearl/#usage","collection":"docs7","hash":"95465b41673bc2093a5e8caf58551ac9","indexed_by":"docs-index"}},{"content":"Quick Gems\n\nThe Quick Gems panel allows you to easily create loose stones or stones with settings like Peg-Head, Bezel, Basket, Halo, or Cluster. You can also add a drill if needed.&#x20;\n\nSelect the setting type, add the drill cutter, and choose the stone cut, material, and weight (shown in diamond carats) or size (shown in millimeters). A convenient selector lets you switch between carats or millimeters, with standard carat weights or millimeter sizes included for quick selection. Everything is completed in just two clicks.\n\nThe Quick Gems panel streamlines gem creation by offering easy selection of settings, cuts, materials, and sizes (carats or millimeters). It saves time with two-click customization, providing flexibility, precision, and a wide range of design options.\n\n#### Additional Functionality\n\nAt the end of all size fields in the Quick Gems Panel, you'll now find a button with three dots (...). Clicking this button opens a window where you can enter:\n\n* The exact size of the gem if the panel is set to millimeters (mm).\n* The exact weight of the stone if the panel is set to carats.\n\nThis feature provides precise control over gem dimensions or weight, making customization faster and more intuitive for the designer.\n\nBoth the gems and gem sets are fully parametric. You can edit them anytime in the Outliner.","metadata":{"title":"Quick Gems","url":"https://www.rhinoartisan.com/docs/7/diamonds/quick-gems/","source":"https://www.rhinoartisan.com/docs/7/diamonds/quick-gems/","collection":"docs7","hash":"ddb40ba5c6e79c9d0b8ef9b7e7174dd5","indexed_by":"docs-index"}},{"content":"Cloud Zoo\n\nCloud Zoo is the licensing system developed by McNeel to manage Rhino licenses. It allows users to access their licenses from anywhere in the world. This solution ensures a seamless experience without borders, providing the flexibility and freedom that professionals need, no matter where they are.\n\nThis documentation assumes you have set up your Cloud Zoo with your Rhino licenses. If you haven’t done so, please refer to the Cloud Zoo Licensing Setup link.","metadata":{"title":"Cloud Zoo","url":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/","source":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/","collection":"docs7","hash":"4dd0520d369ea49100992e788c4c22ac","indexed_by":"docs-index"}},{"content":"Cloud Zoo — Benefits:\n\n* Cloud Zoo is free to set up and manage through Rhino Accounts.\n* For individual users, use your Rhino Accounts login to use Rhino. This means Rhino can be used on any computer.\n* Cloud Zoo can simplify license distribution for corporations and schools. Organizations can create a pool of licenses and share them with team members.\n* Work online or offline. There is no need to check out licenses, so you should not be caught out on the road without one.\n* Licensing works without a constant internet connection.\n* Let McNeel manage the license server infrastructure.\n\nThe process is divided into two parts: one for license administrators and another for users.\n\nTo use RhinoArtisan in Cloud Zoo, version 6 or higher is required.\n\n1. Add your license on Cloud Zoo\n\n2. Set RhinoArtisan Get License from Cloud Zoo","metadata":{"title":"Cloud Zoo","section":"Benefits:","url":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/#benefits","source":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/#benefits","collection":"docs7","hash":"2c772a11ac236404591b2da5810f3309","indexed_by":"docs-index"}},{"content":"1. Add your license on Cloud Zoo\n\nWe will proceed to add the RhinoArtisan license in Cloud Zoo.\n\n1. In our case, we will access our RhinoArtisan team, although it can be any team.\n\nAs shown in the following image, we already have the Rhinoceros license. To add the RhinoArtisan license, please click on the Add License button.\n\nVery important: If your RhinoArtisan product key does not start with RA70, there is no problem; you can add it at the beginning.\n\nIn the License Key field, enter your RhinoArtisan license. Click on the Add License button.\n\nYour RhinoArtisan license is now available in Cloud Zoo.","metadata":{"title":"1. Add your license on Cloud Zoo","url":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/add-license/","source":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/add-license/","collection":"docs7","hash":"f37e06740b065cadf5b1bf8fd690f38b","indexed_by":"docs-index"}},{"content":"2. Set RhinoArtisan Get License from Cloud Zoo\n\nThis documentation assumes you have set up your Cloud Zoo with your Rhino licenses. If you haven’t done so, please refer to the Cloud Zoo Licensing Setup link.\n\nIn RhinoArtisan, in the \"File\" tab, click on \"Settings\".\n\nIf you use RhinoArtisan within Rhino, click on the Options icon or type the Options command.\n\nThe Rhino options will appear; select Artisan from the list, then check the option to Enable the license through Cloud Zoo, and click on the OK button.\n\nDoes the license option not appear? Then, you need to download a new version from your account page.\n\nIt will ask us to close RhinoArtisan (or Rhino).","metadata":{"title":"2. Set RhinoArtisan Get License from Cloud Zoo","url":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/get-license/","source":"https://www.rhinoartisan.com/docs/7/getting-started/cloud-zoo/get-license/","collection":"docs7","hash":"e61585366e7b41993f7c8095c0c0520f","indexed_by":"docs-index"}},{"content":"How to download, install and activate your license — Check the minimum requirements\n\nFirst, make sure your computer meets the minimum requirements to run RhinoArtisan.\n\nIf you already have Rhino installed, we recommend running the latest update of Rhino 7 and/or Rhino 8. It's free — just open Rhino and go to Help > Check for Updates…\n\nCreate your account\nSign up for the free trial at rhinoartisan.com and fill in the form. You get full access to every tool for 15 days, no credit card required.","metadata":{"title":"How to download, install and activate your license","section":"Check the minimum requirements","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#check-the-minimum-requirements","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#check-the-minimum-requirements","collection":"docs7","hash":"7d04f04a53b25a2c5b35c7a931f7231c","indexed_by":"docs-index"}},{"content":"How to download, install and activate your license — Download RhinoArtisan\n\nOnce your account is created, go to your account. There you'll find your license key and the Download installer button for the latest release.\n\nRhinoArtisan requires Rhino — if you don't have it yet, you'll find a Rhino trial linked from your account too.\n\nInstall RhinoArtisan\nLocate the installer you just downloaded, open it and follow the on-screen instructions. Close Rhino first if you have it running.","metadata":{"title":"How to download, install and activate your license","section":"Download RhinoArtisan","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#download-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#download-rhinoartisan","collection":"docs7","hash":"7351b8bbff6732c865a229a033916b64","indexed_by":"docs-index"}},{"content":"How to download, install and activate your license — Activate your license\n\nWhen you buy RhinoArtisan — even for the evaluation — you'll receive a product key to activate your license. RhinoArtisan has its own license system, and also integrates with Cloud Zoo, Rhino's license manager. Both are covered in the License page:\n\nLicense — how to activate\n\nOpen RhinoArtisan\nThe installer leaves two shortcuts on your desktop and in the Windows start menu. Open Rhino 8 to work with the Artisan toolbar inside Rhino, or RhinoArtisan 7.0 to get the dedicated interface with all the panels laid out for jewelry. See Rhino and RhinoArtisan interface for the difference between the two.","metadata":{"title":"How to download, install and activate your license","section":"Activate your license","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#activate-your-license","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#activate-your-license","collection":"docs7","hash":"ca5dcd347ada0a4a9942082f9de324d9","indexed_by":"docs-index"}},{"content":"How to download, install and activate your license — Watch it step by step\n\nThis lesson is the opening of Kickstart: From idea to Creation, our free course for new users.\n\nSomething not working? Contact us — our support team typically replies within two business days.","metadata":{"title":"How to download, install and activate your license","section":"Watch it step by step","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#watch-it-step-by-step","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-download-install-and-activate-your-license/#watch-it-step-by-step","collection":"docs7","hash":"f1314ed89ccc6520fe1d1c2414aac2f9","indexed_by":"docs-index"}},{"content":"How to learn?\n\nWhere all the training material lives, and above all the courses — organised by level, so you can pick the one that matches where you are.\n\nIf you're new, our recommendation is to start with Kickstart: From idea to Creation, which is free. It may feel a little basic if you're an experienced user, but it covers the concepts that matter in RhinoArtisan.\n\nKickstart: From idea to Creation — free, start here","metadata":{"title":"How to learn?","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/","collection":"docs7","hash":"3221effed626d3f79a2095025f48d328","indexed_by":"docs-index"}},{"content":"How to learn? — On-demand courses\n\nStep-by-step guided courses with instructor support and a certificate of completion. Learn at your own rhythm — pause and resume whenever you want.\n\nBrowse all the courses\n\nTrain your whole team\nIf you run a studio, there's also the In-Company Live Course: live online training tailored to your workflow, with real-time Q&A with expert instructors for the entire team.\n\nIn-Company Live Course","metadata":{"title":"How to learn?","section":"On-demand courses","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/#on-demand-courses","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/#on-demand-courses","collection":"docs7","hash":"d1b536e44f9e33335efb68592f6b00a0","indexed_by":"docs-index"}},{"content":"How to learn? — Free resources\n\nYou don't need a course to keep learning — these are open to everyone:\n\n- Tutorials — in-depth written guides with screenshots and step-by-step instructions. 120+ articles.\n- Video Lessons — watch real workflows; pause, rewind and follow along at your rhythm. 200+ videos.\n- Documentation — the pages you're reading right now: a complete reference for every tool, command and feature, always up to date.","metadata":{"title":"How to learn?","section":"Free resources","url":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/#free-resources","source":"https://www.rhinoartisan.com/docs/7/getting-started/how-to-learn/#free-resources","collection":"docs7","hash":"93ce42bb22102f73d2a03f5893235eb0","indexed_by":"docs-index"}},{"content":"Introduction\n\nHello, and welcome to the official RhinoArtisan documentation. Before anything else: thank you for trusting us. RhinoArtisan is made by jewelers, for jewelers, and every page here exists so you get the most out of it — from your first ring to full production.\n\nThese docs are the complete reference for every tool, command and feature, and they're always up to date. Keep them at hand while you work: whenever a command raises a question, the answer should be one search away.\n\nPress Ctrl+K (or ⌘K) at any time to search across the whole documentation.","metadata":{"title":"Introduction","url":"https://www.rhinoartisan.com/docs/7/","source":"https://www.rhinoartisan.com/docs/7/","collection":"docs7","hash":"f05b2513e68f1943393b7ade8bd87215","indexed_by":"docs-index"}},{"content":"Introduction — New here? Start with these three\n\n1. Download and install RhinoArtisan\n\n2. Activate your license\n\n3. Learn it — start with the free Kickstart course\n\nFind your way around\n- User Interface — the two interfaces, the Launcher, the ribbon, panels and options.\n- Commands — every command, tab by tab, from Curve to Manufacturing.\n- Diamonds and Gemstones — studios, pavé, prongs, cutters and gem tools.\n- Shanks — ring curves, sizes, styles, scoop and engraving.\n- Rendering — materials, scenes and photorealistic images.\n- Technical Documentation — reports, gem maps and everything manufacturing needs.","metadata":{"title":"Introduction","section":"New here? Start with these three","url":"https://www.rhinoartisan.com/docs/7/#new-here-start-with-these-three","source":"https://www.rhinoartisan.com/docs/7/#new-here-start-with-these-three","collection":"docs7","hash":"fcfa5db29fbe69a9e8b84a6bbb19bbd8","indexed_by":"docs-index"}},{"content":"Introduction — Stuck on something?\n\nCheck the FAQ first — the most common questions are answered there. For an instant answer, ask Paula, our AI assistant, at rhinoartisan.com/ask. And for anything else, contact us or write to support@rhinoartisan.com — answering you is a pleasure, truly.\n\nYour feedback matters\nIf you have suggestions to improve this documentation — or you catch anything that's wrong or missing — please tell us. Every correction makes these pages better for the next designer who reads them.\n\nLet's start designing together!","metadata":{"title":"Introduction","section":"Stuck on something?","url":"https://www.rhinoartisan.com/docs/7/#stuck-on-something","source":"https://www.rhinoartisan.com/docs/7/#stuck-on-something","collection":"docs7","hash":"9a5aa67dafa55d872ac4b832231180d8","indexed_by":"docs-index"}},{"content":"Languages\n\nRhinoArtisan is available in the following languages: English, German, French, Spanish, Italian, Japanese, Korean, Simplified Chinese, Traditional Chinese, Russian, Polish, Portuguese, and Czech.\n\nHow can you change the language if multiple languages are installed?\nYou can change the language in Rhino's settings by running the Options command or clicking the Options button. Select the Appearance option on the left menu.\n\nIn the case of RhinoArtisan, the procedure is precisely the same: File > Settings.","metadata":{"title":"Languages","url":"https://www.rhinoartisan.com/docs/7/getting-started/languages/","source":"https://www.rhinoartisan.com/docs/7/getting-started/languages/","collection":"docs7","hash":"3b57ce62e603d26dc3de4ff3535cfeac","indexed_by":"docs-index"}},{"content":"License\n\nRhinoArtisan gives you two licensing systems. Both use the same product key — what changes is where the license lives.\n\nRhinoArtisan's own system\nThe simplest and fastest way to get going: open the License Wizard, enter your product key, and the license is activated on that specific machine. Nothing else to set up.\n\nTrial version? Use RhinoArtisan's own license system to activate it.\n\nThe step-by-step, with screenshots, is on its own page:\n\nRhinoArtisan's own system — how to activate","metadata":{"title":"License","url":"https://www.rhinoartisan.com/docs/7/getting-started/license/","source":"https://www.rhinoartisan.com/docs/7/getting-started/license/","collection":"docs7","hash":"d9e7a0bd7045ddfa6a21a5a2e31f6388","indexed_by":"docs-index"}},{"content":"License — Cloud Zoo — Rhino's license manager\n\nRhinoArtisan also integrates with Cloud Zoo, the licensing system developed by McNeel — most likely the one you're already using with your Rhino.\n\nYour license is tied to your Rhino account instead of one computer, so you can access it from anywhere, and organizations can pool licenses and share them with the team. It works online or offline, and McNeel manages the server infrastructure.\n\nTo use RhinoArtisan in Cloud Zoo, version 6 or higher is required.\n\nSetting it up takes two steps:\n\n1. Add your license on Cloud Zoo\n\n2. Set RhinoArtisan Get License from Cloud Zoo","metadata":{"title":"License","section":"Cloud Zoo — Rhino's license manager","url":"https://www.rhinoartisan.com/docs/7/getting-started/license/#cloud-zoo--rhinos-license-manager","source":"https://www.rhinoartisan.com/docs/7/getting-started/license/#cloud-zoo--rhinos-license-manager","collection":"docs7","hash":"fc3de4fe7d38cc810bdbad732d1a8951","indexed_by":"docs-index"}},{"content":"License — Which one should I choose?\n\n| | RhinoArtisan's own system | Cloud Zoo |\n| --- | --- | --- |\n| Best for | One machine, up and running in a minute | Working from several machines, or sharing licenses in a team |\n| License lives | On that computer | In your Rhino account |\n| Setup | Enter the product key in the License Wizard | Add the license to Cloud Zoo, then enable it in RhinoArtisan |\n\nWhichever you pick, you can switch later — the product key is the same.","metadata":{"title":"License","section":"Which one should I choose?","url":"https://www.rhinoartisan.com/docs/7/getting-started/license/#which-one-should-i-choose","source":"https://www.rhinoartisan.com/docs/7/getting-started/license/#which-one-should-i-choose","collection":"docs7","hash":"69ff5220de3792f46274d21e96f1da6a","indexed_by":"docs-index"}},{"content":"RhinoArtisan's own system\n\nThe simplest and fastest way to get going: open the License Wizard, enter your product key, and the license is activated on that specific machine. Nothing else to set up.\n\nWhen you buy RhinoArtisan — even for the evaluation — you'll receive a product key to activate your license. You'll find it both in the email we send you and in your account. This product key is private, so use it with discretion.\n\nTo open the License Wizard, look for the key icon — it works the same from Rhino or RhinoArtisan: in the RhinoArtisan toolbar inside Rhino, or in the File tab of the ribbon in the RhinoArtisan UI.\n\nIn the License Wizard, click Activate your license, choose Activate Online, then paste your product key and click Activate.","metadata":{"title":"RhinoArtisan's own system","url":"https://www.rhinoartisan.com/docs/7/getting-started/rhinoartisan-license/","source":"https://www.rhinoartisan.com/docs/7/getting-started/rhinoartisan-license/","collection":"docs7","hash":"90be6502ad7fd13198154dfe649490b5","indexed_by":"docs-index"}},{"content":"System Requirements\n\nRhinoArtisan 7 works on Rhino 7 and Rhino 8.\n\nRhinoArtisan is light and thoroughly optimized to run on even home computers. Here you can find the specifications your computer should meet to run RhinoArtisan to its full potential:\n\nHardware:\n\n* AMD or Intel 64-bit processor (not ARM)\n* At least 8 GB of memory (RAM) is recommended\n* 5 GB of hard disk space\n* OpenGL 4.5 compatible graphics cards are recommended\n* Video cards with at least 4GB of memory are recommended\n* A mouse with multiple buttons and a scroll wheel is recommended.\n* RhinoArtisan works at any resolution, but 4K is recommended\n\nOperating systems:\n\n* Windows 11\n* Windows 10\n\nInternet connection for:\n\n* Download and install.\n* License validation.\n* Managing Licenses with Cloud Zoo\n\nNot supported:\n\n* Windows 8.1 and earlier versions\n* Windows Server (any version). Running the Scripting API, the Grasshopper components or the MCP server on a server — Windows Server, Rhino.Compute or any unattended host — requires an Automation license. Talk to us if you need one.\n* Boot Camp on Macs with Apple Silicon\n* Virtualization systems such as VMWare, Remote Desktop and Parallels\n* Linux\n* ARM processors, including Microsoft SQ® 1 and 2","metadata":{"title":"System Requirements","url":"https://www.rhinoartisan.com/docs/7/getting-started/system-requirements/","source":"https://www.rhinoartisan.com/docs/7/getting-started/system-requirements/","collection":"docs7","hash":"2eb376c7ad5f0b703b9d7466e96eae6e","indexed_by":"docs-index"}},{"content":"3D Print — 3D Print\n\n3D Print is the end of the line inside Rhino: it hands the arranged designs straight to your printer's own software. RhinoArtisan ships preconfigured connectors for the most common resin printers, and you can point it at any other slicer installed on your system.\n\nEach preset connector opens the design directly in its slicer:","metadata":{"title":"3D Print","section":"3D Print","url":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#3d-print","source":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#3d-print","collection":"docs7","hash":"367f8416583d0209e3dff268c8ca97b4","indexed_by":"docs-index"}},{"content":"3D Print — Asiga Composer\n\nOpens the design in Asiga's slicer, Composer.\n\nFormlabs PreForm\nOpens the design in Formlabs' slicer, PreForm.\n\n3D Systems Geomagic Print\nOpens the design in 3D Systems' slicer, Geomagic Print.\n\nAnycubic Workshop\nOpens the design in Anycubic's slicer, Photon Workshop.\n\nB9 Captivate\nOpens the design in B9Creations' slicer, Captivate.","metadata":{"title":"3D Print","section":"Asiga Composer","url":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#asiga-composer","source":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#asiga-composer","collection":"docs7","hash":"a7b9777b1fe84a62e168b048c76b42fe","indexed_by":"docs-index"}},{"content":"3D Print — Elegoo Chitubox\n\nOpens the design in Chitubox — for Elegoo printers, and for any other brand that slices with it.\n\nIf your printer is not in the list, export the tray as STL with Export from Layers or Export All in One and open the file in your slicer directly.","metadata":{"title":"3D Print","section":"Elegoo Chitubox","url":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#elegoo-chitubox","source":"https://www.rhinoartisan.com/docs/7/manufacturing/3d-print/#elegoo-chitubox","collection":"docs7","hash":"31d223848f25c8519559215ad2e6315e","indexed_by":"docs-index"}},{"content":"Manufacturing\n\nManufacturing is where the design stops being a design and becomes a piece that somebody has to print, cast and finish. The tab is laid out in the order the work actually happens: lay the models out, repair and lighten them, check they will survive casting, resize, sprue, and export.\n\nThe cards below follow the ribbon top to bottom, group by group.","metadata":{"title":"Manufacturing","url":"https://www.rhinoartisan.com/docs/7/manufacturing/","source":"https://www.rhinoartisan.com/docs/7/manufacturing/","collection":"docs7","hash":"7dbc1c644fd07998fcf8f140f81859e9","indexed_by":"docs-index"}},{"content":"Manufacturing — Breakdown Settings\n\nThe costing and process setup the rest of the section reads from — metals, processes and the rules used to break a piece down.\n\nBreakdown Settings Metals, processes and the rules every cost and weight in the file is calculated from.\n\nImport and Organize\nGetting models into the file, laid out and multiplied before anything else.\n\nImport to Layers Bring several files in at once, each one onto its own layer.\n\nDistribute Spread the models across the build plate without overlaps.\n\nCopies Multiply a model into the number of pieces you need to cast.\n\nQuick Check A fast pass over the selection looking for what would stop a print.","metadata":{"title":"Manufacturing","section":"Breakdown Settings","url":"https://www.rhinoartisan.com/docs/7/manufacturing/#breakdown-settings","source":"https://www.rhinoartisan.com/docs/7/manufacturing/#breakdown-settings","collection":"docs7","hash":"390e92f8e21acecbf309f1f2bfdda720","indexed_by":"docs-index"}},{"content":"Manufacturing — Repair and Optimize\n\nMaking the mesh printable, and making it small enough to handle.\n\nAutomatic Repair The one-click route: naked edges, non-manifold geometry and holes fixed in a pass.\n\nRepair — step by step, when you want to control each fix\n\nDecimator by Tolerance Reduce the polygon count while staying inside a distance tolerance.\n\nDecimator by Percentage Reduce the polygon count by a straight percentage of the original mesh.","metadata":{"title":"Manufacturing","section":"Repair and Optimize","url":"https://www.rhinoartisan.com/docs/7/manufacturing/#repair-and-optimize","source":"https://www.rhinoartisan.com/docs/7/manufacturing/#repair-and-optimize","collection":"docs7","hash":"4106672ff241633da12deade0c564546","indexed_by":"docs-index"}},{"content":"Manufacturing — Analyze\n\nWhether the piece will survive casting: thick enough, closed, sound.\n\nThickness Measure wall thickness where you point.\n\nShow Edges Reveal naked and non-manifold edges, the usual reason an STL fails.\n\nGlobal Thickness A thickness map of the whole piece, so thin walls surface on their own.\n\nCheck Rhino's validity report on the object.","metadata":{"title":"Manufacturing","section":"Analyze","url":"https://www.rhinoartisan.com/docs/7/manufacturing/#analyze","source":"https://www.rhinoartisan.com/docs/7/manufacturing/#analyze","collection":"docs7","hash":"a4780ccf26891fc4396d54bb30f6780f","indexed_by":"docs-index"}},{"content":"Manufacturing — Resizing\n\nScale Ring Change a ring's size properly, scaling the band without distorting stones and settings.\n\nSprues\nIdentify each design on the plate, then attach it to the casting tree. The commands differ in how the sprue reaches the piece — from inside, from outside, as a tree, a helix, a spiral or along a curve you draw.\n\nDesigns Identifier Engrave a reference on each design so it can be told apart after casting.\n\nSprue Single One sprue on one piece, placed where you click.\n\nSprue Multiple Sprue a whole set of copies in one operation.\n\nInner Tree A full tree built from the inside out.\n\nInner Branches Branches reaching the pieces from inside the tree.\n\nExternal Branches Branches reaching the pieces from outside.\n\nSprue Curve A runner frame that follows the piece's own outline.\n\nExternal Frames A rounded frame around the pieces, feeding them from the sides.\n\nCluster Tree A tree that clusters the pieces around the stem.\n\nSprue Helix Copies hung between the turns of a rising helix — made for chain links.\n\nSprue Spiral Copies along a flat spiral held over the plate — the helix's ground-hugging cousin.\n\nSprue Tree The classic casting tree.","metadata":{"title":"Manufacturing","section":"Resizing","url":"https://www.rhinoartisan.com/docs/7/manufacturing/#resizing","source":"https://www.rhinoartisan.com/docs/7/manufacturing/#resizing","collection":"docs7","hash":"a769faaa9b3555a08c485cc247ffff1b","indexed_by":"docs-index"}},{"content":"Manufacturing — Export and Print\n\nThe end of the line: out of Rhino and into the printer's own software.\n\nPreload Prepare the models for export.\n\nExport from Layers One file per layer, which is how most bureaus want it.\n\nExport All in One Everything to a single file.\n\n3D Print Send the plate straight to your printer's own software.\n\nAsiga Composer\n\nFormlabs PreForm\n\nGeomagic Print\n\nPhoton Workshop\n\nB9 Captive\n\nElegoo Chitubox\n\nSTL Format is background reading rather than a command: what an STL actually contains, and what it leaves out.","metadata":{"title":"Manufacturing","section":"Export and Print","url":"https://www.rhinoartisan.com/docs/7/manufacturing/#export-and-print","source":"https://www.rhinoartisan.com/docs/7/manufacturing/#export-and-print","collection":"docs7","hash":"5c4b4e82fb60c6c61a2cfb60eadeafff","indexed_by":"docs-index"}},{"content":"Automatic Repair STL — Automatic Repair STL\n\nAutomatic Repair STL is the one-click route to a printable mesh: it finds and fixes the classic STL problems — open edges, multiple components — in a single pass, from a panel where you control how aggressive the pass is.\n\nTwo precision modes:\n\n* Document Settings — uses the precision already defined in the document.\n* Custom Settings — lets you set the minimum and maximum edge lengths of the mesh and the decimation level applied while rebuilding it.\n\nAfter the repair, the panel reports whether the mesh is now suitable for 3D printing: the number of components (a correct STL has exactly one) and whether any open edges remain.\n\nThe command does not work with blocks — if the model contains any, explode them first with Rhino's *ExplodeBlock* and then run the repair.\n\nUse Quick Check to find the meshes that need this, and Repair when you prefer to control each fix step by step.","metadata":{"title":"Automatic Repair STL","section":"Automatic Repair STL","url":"https://www.rhinoartisan.com/docs/7/manufacturing/automatic-repair-stl/#automatic-repair-stl","source":"https://www.rhinoartisan.com/docs/7/manufacturing/automatic-repair-stl/#automatic-repair-stl","collection":"docs7","hash":"0a3b735f2b1679d36dd769786b2cd4ee","indexed_by":"docs-index"}},{"content":"Check — Check\n\nCheck runs Rhino's *Check* command: select the objects and Rhino inspects their data structure, then prints a detailed report of any errors or irregularities it finds.\n\nWhere Quick Check gives a fast green/red verdict on many meshes at once, Check is the detailed report on one object — the tool to reach for when a mesh keeps failing and you want to know why.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Check","section":"Check","url":"https://www.rhinoartisan.com/docs/7/manufacturing/check/#check","source":"https://www.rhinoartisan.com/docs/7/manufacturing/check/#check","collection":"docs7","hash":"24c0ef8574ce8203596c12b4b3f0403d","indexed_by":"docs-index"}},{"content":"Copies — Copies\n\nCopies multiplies a model into the number of pieces you need to cast: select the objects, type how many copies you want of each, and the duplicates are laid out along the Y axis, each row starting from its original.\n\nTogether with Import to Layers and Distribute this completes the layout stage: every design in the file, in the quantity the casting run needs, ready for Preload to pack onto the tray.","metadata":{"title":"Copies","section":"Copies","url":"https://www.rhinoartisan.com/docs/7/manufacturing/copies/#copies","source":"https://www.rhinoartisan.com/docs/7/manufacturing/copies/#copies","collection":"docs7","hash":"1a9594e193a53f7eb36ad489a974fc8f","indexed_by":"docs-index"}},{"content":"Distribute — Distribute\n\nDistribute spreads the models out along the X axis with clear separation between them, so a pile of freshly imported STLs turns into an orderly row you can actually look at.\n\nUse it right after Import to Layers: with every model visible side by side, it is easy to review each design and decide how many copies of it the print tray needs. The final packing of the tray itself is Preload's job.","metadata":{"title":"Distribute","section":"Distribute","url":"https://www.rhinoartisan.com/docs/7/manufacturing/distribute/#distribute","source":"https://www.rhinoartisan.com/docs/7/manufacturing/distribute/#distribute","collection":"docs7","hash":"e3f771fb0e31c786d984f606850f9be5","indexed_by":"docs-index"}},{"content":"Export All in One — Export All in One\n\nExport All in One saves everything arranged on the printer tray into a single file, preserving the exact layout — so a proven print session can be recovered and printed again without rearranging anything.\n\nUse it when the tray as a whole is the thing worth keeping. When each design should stay its own file — one per layer, copies included — use Export from Layers instead.","metadata":{"title":"Export All in One","section":"Export All in One","url":"https://www.rhinoartisan.com/docs/7/manufacturing/export-all-in-one/#export-all-in-one","source":"https://www.rhinoartisan.com/docs/7/manufacturing/export-all-in-one/#export-all-in-one","collection":"docs7","hash":"a8f9421d8a1e0e498347174dd4e2b6f7","indexed_by":"docs-index"}},{"content":"Export from Layers — Export from Layers\n\nExport from Layers saves the tray as one STL file per layer: everything that sits on a layer — a design and all its copies — goes into a single file named for it. Since Import to Layers put each design on its own layer, the export mirrors the way the file was organized.\n\nThis is the format for repeat work: next time the same designs need printing, each file already contains its copies, grouped and ready. To keep the whole tray as a single file instead, use Export All in One.","metadata":{"title":"Export from Layers","section":"Export from Layers","url":"https://www.rhinoartisan.com/docs/7/manufacturing/export-from-layers/#export-from-layers","source":"https://www.rhinoartisan.com/docs/7/manufacturing/export-from-layers/#export-from-layers","collection":"docs7","hash":"4ce5a9d4e096cacb65cd9aeb11dd5b43","indexed_by":"docs-index"}},{"content":"Global Thickness — Global Thickness\n\nGlobal Thickness analyzes the whole piece against a minimum wall thickness and paints the verdict on the model: green where the walls exceed the minimum, red where they fall below it. Thin walls surface on their own — no probing required.\n\nYou set the minimum thickness in the command line when the command starts; the default is 0.6 mm. A command-line option lets you keep or discard the analysis mesh once you are done reading it.\n\nUse it as the casting sanity check on every piece: anything red is a wall that may not fill, or a section too fragile to survive polishing. To measure an exact value at one spot instead of a map, use Thickness.","metadata":{"title":"Global Thickness","section":"Global Thickness","url":"https://www.rhinoartisan.com/docs/7/manufacturing/global-thickness/#global-thickness","source":"https://www.rhinoartisan.com/docs/7/manufacturing/global-thickness/#global-thickness","collection":"docs7","hash":"a5a643a5a4b89585d389d3c0572c9f0f","indexed_by":"docs-index"}},{"content":"Identifier — Identifier\n\nIdentifier attaches a small text label to the inside of a ring, joined by a thin cylindrical rod — so after printing and casting, every piece on the tree can still be told apart.\n\nIn the command panel you set:\n\n* The text and its size — a reference, a size, a client code.\n* The rod — its thickness, and its start and end points, so you can route it clear of critical features like holes or engravings.\n\nThe result is an Artisan object, not a loose mesh: it appears in the Outliner with its own row, and Edit there (or `ArtisanEdit` on it) reopens the panel with the same ring, points and parameters. Accept replaces the tag; closing the panel keeps the original.\n\nIt earns its keep the moment a tray carries the same model in several sizes: without a tag, six waxes of the same ring are indistinguishable. The Ring Resizer can also add reference tags to each size it generates, in its Ref tab.","metadata":{"title":"Identifier","section":"Identifier","url":"https://www.rhinoartisan.com/docs/7/manufacturing/identifyer/#identifier","source":"https://www.rhinoartisan.com/docs/7/manufacturing/identifyer/#identifier","collection":"docs7","hash":"cd89a08c1594517b67ce21a3a35f4137","indexed_by":"docs-index"}},{"content":"Import to Layers — Import to Layers\n\nImport to Layers brings a whole folder of STL files into the document in one go: point it at the folder, and every STL in it is imported onto its own layer, named after the file and given its own color so the models can be told apart at a glance.\n\nThis is the first step of preparing a print tray: instead of importing files one by one and sorting them by hand, the layer panel becomes the inventory of what is going on the plate. From there, Distribute spreads the models out and Copies multiplies each one into the quantity you need to cast.","metadata":{"title":"Import to Layers","section":"Import to Layers","url":"https://www.rhinoartisan.com/docs/7/manufacturing/import-to-layers/#import-to-layers","source":"https://www.rhinoartisan.com/docs/7/manufacturing/import-to-layers/#import-to-layers","collection":"docs7","hash":"29a1a989f8cdc2d16024d7ee32846134","indexed_by":"docs-index"}},{"content":"Preload — Preload\n\nPreload packs the print tray: it takes the designs you want to print — copies included — and arranges them inside the dimensions of your printer's tray, keeping the spacing you set between pieces.\n\nThe panel has two parts. In the selection panel you pick the meshes to print. In the parameters panel you define the tray dimensions, the distance to keep between objects, and the layout mode — the order the packer places the pieces in:\n\n* By Area — largest footprint first.\n* By Perimeter — longest outline first.\n* By Bigger Side — longest side first.\n* By Width / By Height — sorted by one dimension.\n* By Pathological Multiplier — a specialized ordering for awkward mixes of shapes.\n\nDifferent modes pack differently; if the tray comes out with wasted space, try another one.\n\nPreload is the meeting point of the layout stage — Import to Layers, Distribute, Copies, Quick Check — and what comes after: exporting the tray or sending it straight to the printer's software.","metadata":{"title":"Preload","section":"Preload","url":"https://www.rhinoartisan.com/docs/7/manufacturing/preload/#preload","source":"https://www.rhinoartisan.com/docs/7/manufacturing/preload/#preload","collection":"docs7","hash":"2ff8b4ee45d45bdc7d20f462524ce59b","indexed_by":"docs-index"}},{"content":"Quick Check — Quick Check\n\nQuick Check is the fast pass over the plate before printing: select the meshes and each one is checked for construction errors. Sound meshes turn green; meshes with problems turn red. One glance tells you which files are ready and which need attention.\n\nWhen something comes up red, run Automatic Repair on it — in most cases that is all it takes. For a diagnosis rather than a verdict, use Show Edges to see where the naked or non-manifold edges actually are.","metadata":{"title":"Quick Check","section":"Quick Check","url":"https://www.rhinoartisan.com/docs/7/manufacturing/quick-check/#quick-check","source":"https://www.rhinoartisan.com/docs/7/manufacturing/quick-check/#quick-check","collection":"docs7","hash":"2d05340369f8057f9744e2141b0e147c","indexed_by":"docs-index"}},{"content":"Decimators\n\nA jewelry STL can easily carry ten times the triangles the printer needs. The two Decimator commands lighten a mesh in place: select the meshes, give one number, and the polygon count drops. They differ in what that number promises — one guarantees the shape, the other guarantees the reduction.\n\nDecimator by Tolerance\nDecimator by Tolerance reduces each selected mesh as much as a deviation budget allows: you give a maximum deviation in mm (0.05 by default; the value is remembered for the next run), and each mesh is reduced to the heaviest percentage whose result still stays within that distance of the original surface. The shape is what is guaranteed — the face count is whatever falls out.\n\nThe search can take a moment on heavy meshes; press Esc to stop it, and the best result found so far is kept. The command line reports the triangle counts before and after, the percentage removed, and the largest deviation actually reached. Meshes that cannot lose anything within the budget are left unchanged. Quad meshes are triangulated by the reducer, so the \"before\" count can be higher than what the object properties showed.","metadata":{"title":"Decimators","url":"https://www.rhinoartisan.com/docs/7/manufacturing/reduce-mesh/","source":"https://www.rhinoartisan.com/docs/7/manufacturing/reduce-mesh/","collection":"docs7","hash":"c3a11e3225e4659d6de8f17930f563b4","indexed_by":"docs-index"}},{"content":"Decimators — Decimator by Percentage\n\nDecimator by Percentage reduces each selected mesh by a straight percentage: you give the percentage of faces to remove (50 by default, from 1 to 99) and the reducer hits that count, even at the cost of shape fidelity. Heavy percentages will visibly facet the mesh — the reduction is what is guaranteed here, not the shape.\n\nUse it when you know how much lighter the file must get; use the tolerance variant when the surface must stay true and you just want the mesh as light as that allows.\n\nGoldsmith's Tip: For production STLs, start with Decimator by Tolerance at 0.01–0.05 mm — far below what a casting can reproduce — and the file shrinks with no visible cost. Check the result with Show Edges and Quick Check before exporting.","metadata":{"title":"Decimators","section":"Decimator by Percentage","url":"https://www.rhinoartisan.com/docs/7/manufacturing/reduce-mesh/#decimator-by-percentage","source":"https://www.rhinoartisan.com/docs/7/manufacturing/reduce-mesh/#decimator-by-percentage","collection":"docs7","hash":"6788f6d83ec8e44e804b2764d7d58386","indexed_by":"docs-index"}},{"content":"Repair — Repair\n\nRepair opens Rhino's Mesh Repair panel — the step-by-step alternative to Automatic Repair, for when you want to see each problem and decide how to fix it.\n\nThe workflow the panel walks you through:\n\n1. Select a mesh and click Check Mesh — a detailed report appears, including an edge analysis view.\n2. Review the problems found and click Repair to fix them.\n3. Click Next for the advanced repair tools, make any final edits, and click Finish.","metadata":{"title":"Repair","section":"Repair","url":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#repair","source":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#repair","collection":"docs7","hash":"eca0e20fdc4992dea0c5475191df7c0f","indexed_by":"docs-index"}},{"content":"Repair — What it detects and fixes\n\n* Degenerate faces — faces with all vertices at the same location.\n* Zero-length edges — edges whose vertices overlap.\n* Duplicate faces — overlapping faces.\n* Non-manifold edges — faces joined by edges shared more than twice.\n* Inconsistent normals — reversed face normals.\n* Disjoint pieces — unconnected parts inside one mesh.","metadata":{"title":"Repair","section":"What it detects and fixes","url":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#what-it-detects-and-fixes","source":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#what-it-detects-and-fixes","collection":"docs7","hash":"8953448421ef574d2262f41ed972d9f4","indexed_by":"docs-index"}},{"content":"Repair — Advanced repair tools\n\nFor hand-finishing after the automatic fixes: align vertices, match edges, delete faces, patch a single face, fill one hole or all holes, split and swap edges, rebuild the mesh with uniform topology, and unify normals — with Undo available at every step.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Repair","section":"Advanced repair tools","url":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#advanced-repair-tools","source":"https://www.rhinoartisan.com/docs/7/manufacturing/repair/#advanced-repair-tools","collection":"docs7","hash":"8660f73267b2c1dec9c18edd7426cf54","indexed_by":"docs-index"}},{"content":"Ring Resizer — Ring Resizer\n\nRing Resizer turns one ring into a run of sizes: select the design, tell it which finger sizes you need, and it generates a copy for each — preserving the setting areas instead of blindly scaling everything.\n\nSelection and finger size\nThe selection panel prompts you to pick the entire ring design. Below it, the Finger Size panel sets the size of the ring you are starting from — the size the copies will be developed from.\n\nMode decides how the ring adapts to each new size:\n\n* Uniform — the whole design is resized together.\n* Variable — a gumball appears in the viewport and you choose the area that must not change; the rest of the ring adapts to the new finger size. This is what keeps stones and settings true to size while the band grows or shrinks. The Angle parameter adjusts the extent of the protected portion.\n\nThe output can be organized on layers, stacked sequentially, or exported directly as STL files to a folder, ready for printing. The Alignment option centers the output in the front view or aligns it on the plane.","metadata":{"title":"Ring Resizer","section":"Ring Resizer","url":"https://www.rhinoartisan.com/docs/7/manufacturing/ring-resizer/#ring-resizer","source":"https://www.rhinoartisan.com/docs/7/manufacturing/ring-resizer/#ring-resizer","collection":"docs7","hash":"8c91408974f32e18178f6da6e5fc7393","indexed_by":"docs-index"}},{"content":"Ring Resizer — Target sizes\n\nThe Target Ring Size panel lists the available sizes; check the ones you want to generate. When the command is accepted, the selection is remembered for future runs on other models — the same size run, one click away.\n\nRef and sprue\nThe Ref tab can engrave a tag inside each ring — a name or reference plus its size — so the pieces can be told apart after printing.\n\nThe last tab optionally adds a sprue at the bottom of each ring, with full control of its parameters, including how deep it intersects the shank.","metadata":{"title":"Ring Resizer","section":"Target sizes","url":"https://www.rhinoartisan.com/docs/7/manufacturing/ring-resizer/#target-sizes","source":"https://www.rhinoartisan.com/docs/7/manufacturing/ring-resizer/#target-sizes","collection":"docs7","hash":"dda2cc338fa9e6f00f9c5473154f8be4","indexed_by":"docs-index"}},{"content":"Show Edges — Show Edges\n\nShow Edges runs Rhino's *ShowEdges* command and highlights the edges that decide whether a model can print. Three display modes:\n\n* All edges — every edge of the selected surfaces, polysurfaces, meshes, or SubD objects.\n* Naked edges — edges connected to only one face: the openings. A mesh with naked edges is not watertight and will fail as an STL.\n* Non-manifold edges — edges shared by more than two faces, the other classic reason a mesh will not slice.\n\nThe found edges are drawn highlighted with endpoint markers; you can zoom to them one by one, mark them with points for a persistent reference, and change the display color.\n\nWhen Quick Check flags a mesh red, this is the tool that shows you where the problem actually is — and Automatic Repair usually closes it.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Show Edges","section":"Show Edges","url":"https://www.rhinoartisan.com/docs/7/manufacturing/show-edges/#show-edges","source":"https://www.rhinoartisan.com/docs/7/manufacturing/show-edges/#show-edges","collection":"docs7","hash":"48f2bb0b094f4d67bda1b8376c99e3ed","indexed_by":"docs-index"}},{"content":"Sprue Cluster Tree — Sprue Cluster Tree\n\nThe Sprue Cluster Tree replaces the trunk-and-branches idea with a cylinder built as a lattice: two families of crossing helices form diamond-shaped cells, and every crossing is an anchor node where a copy of the piece is attached through a short connector.\n\nWhere a radial tree spaces pieces along a stem, the cluster wraps them around a cage — many more pieces in the same flask, and a runner network that feeds them from several directions at once.\n\n`ArtisanSprueClusterTree`","metadata":{"title":"Sprue Cluster Tree","section":"Sprue Cluster Tree","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#sprue-cluster-tree","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#sprue-cluster-tree","collection":"docs7","hash":"831a417133ffef4ee2a11be543f1b504","indexed_by":"docs-index"}},{"content":"Sprue Cluster Tree — The lattice\n\n* Cells Around — how many cells go around the circumference, which is also the number of helices in each family.\n* Rows — how many rows of cells up the cylinder.\n* Wire Diameter — thickness of the lattice tube itself.\n* Move Z — shifts the lattice vertically against the base, to clear the central cylinder.\n* Perimeter rings — optionally draws the top and bottom rings that tie the nodes together.","metadata":{"title":"Sprue Cluster Tree","section":"The lattice","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#the-lattice","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#the-lattice","collection":"docs7","hash":"53a948ca41d093964a88ee4db5731ae1","indexed_by":"docs-index"}},{"content":"Sprue Cluster Tree — Hub and legs\n\n* Central Diameter / Height — the cylinder that runs from the plate up to the first row of the lattice.\n* Leg Diameter — thickness of the legs anchoring the structure to the plate.\n* Leg Separation — spacing between consecutive legs measured along the connector.\n\nThe pieces\n* Length, Angle, Rotation, Inside — the connector from the node to the piece: how far out it sits, its vertical inclination, its spin on the connector axis, and how deep it sinks into the model.\n* Diameter — the extra holding connectors reaching from the node to the model.\n\nLike every sprue in this group, the cluster is added as a mesh on Accept — adjust it in the panel before committing.","metadata":{"title":"Sprue Cluster Tree","section":"Hub and legs","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#hub-and-legs","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-cluster-tree/#hub-and-legs","collection":"docs7","hash":"a4c38b9a94dd503d4c48701992289065","indexed_by":"docs-index"}},{"content":"Sprue Curve — Sprue Curve\n\nThe Sprue Curve command wraps a single piece in a runner that follows its own outline: the top-view silhouette of the model is offset outward, smoothed, and swept into a frame tube, with connectors reaching in from the frame to the piece and an injection post feeding the frame from outside.\n\nIt is the sprue for flat, irregular pieces — a pendant, a brooch, an openwork plaque — where a straight sprue would reach some parts of the outline and miss others.\n\n`ArtisanSprueCurve`","metadata":{"title":"Sprue Curve","section":"Sprue Curve","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#sprue-curve","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#sprue-curve","collection":"docs7","hash":"bafedbee508e4f368ec99ab08495ae22","indexed_by":"docs-index"}},{"content":"Sprue Curve — Selection\n\n* The piece — one mesh, required. It is locked in the document while the panel is open, so stray clicks cannot drag it.\n* Custom perimeter curve — optional. If you pick one it replaces the automatic silhouette entirely; the selector's delete button reverts to the automatic one. The current perimeter is drawn in cyan in the viewport.","metadata":{"title":"Sprue Curve","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#selection","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#selection","collection":"docs7","hash":"2f66e409ce8226efceb34e0364c6807b","indexed_by":"docs-index"}},{"content":"Sprue Curve — Perimeter\n\n* Width / Height — the elliptical cross-section of the frame tube. Height also sets the diameter of every connector and of the injection post where they meet the frame, and how high the frame floats — its underside rests on the piece's floor.\n* Offset — how far outside the piece the automatic silhouette runs.\n* Smooth — smoothing iterations on the automatic silhouette, to round off pointy necks the offset would otherwise pinch.","metadata":{"title":"Sprue Curve","section":"Perimeter","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#perimeter","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#perimeter","collection":"docs7","hash":"64e2c7070f27386391a398c3db8f314b","indexed_by":"docs-index"}},{"content":"Sprue Curve — Connections\n\n* Number — how many connectors are seeded, spaced evenly around the perimeter.\n* Object Diameter — the connector's diameter where it touches the piece; it tapers from the frame's Height down to this.\n* Add / Remove / Clear — Add lets you click new connections directly on the perimeter (Enter to finish); Remove highlights the connection under the cursor and deletes it on click; Clear asks for confirmation and removes them all.\n* Symmetry — None, X, Y, or Quad: connections are seeded in one sector and mirrored, and the mirrors follow when you drag the originals.\n* Inside — how far the connector base sinks into the frame tube.\n\nEvery connection carries two gumballs: an orange one that slides its frame end along the perimeter, and a full 3-axis one at the tip that moves the contact point on the piece. Changing Offset, Smooth, Number, or Symmetry re-seeds the connections and discards manual edits; the diameters and Inside values can be tuned freely without losing them.","metadata":{"title":"Sprue Curve","section":"Connections","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#connections","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#connections","collection":"docs7","hash":"54e89ae583ddbf649033aad9559c05f0","indexed_by":"docs-index"}},{"content":"Sprue Curve — Injection\n\n* External Diameter — the free-end diameter of the injection post, tapering from the frame's Height.\n* Length — how far the post reaches out from the frame.\n* Inside — how far the post base sinks into the frame tube.\n\nLike every sprue in this group, the result is added as plain meshes on Accept — it is not re-editable afterwards, so adjust the frame in the panel before committing.","metadata":{"title":"Sprue Curve","section":"Injection","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#injection","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-curve/#injection","collection":"docs7","hash":"90af56f5bdd886cd1b3cb0ae86c2dae1","indexed_by":"docs-index"}},{"content":"Sprue External Frames — Sprue External Frames\n\nThe Sprue External Frames command draws a rounded rectangular runner around the pieces you select: the frame follows their combined bounding box, grown by a margin, and straight connectors reach inward from the two long sides — plus one from each end — to feed the pieces.\n\nIt suits rows of flat pieces laid side by side: earrings, charms, links — the frame surrounds the whole set and every piece is fed from the rail next to it.\n\n`ArtisanSprueExternalFrames`","metadata":{"title":"Sprue External Frames","section":"Sprue External Frames","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#sprue-external-frames","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#sprue-external-frames","collection":"docs7","hash":"beec7e12de3329a5c8de8fb4066996aa","indexed_by":"docs-index"}},{"content":"Sprue External Frames — Selection\n\nPick the meshes to frame. The number of connectors is seeded automatically to the number of pieces you selected — one feed per piece — and can be changed afterwards.\n\nFrame\n* Margin — how far outside the pieces' bounding box the frame runs.\n* Corner Radius — the fillet of the rectangle's corners.\n* Diameter — thickness of the frame tube.\n* Move Z — shifts the whole frame up or down from the pieces' mid-height.","metadata":{"title":"Sprue External Frames","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#selection","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#selection","collection":"docs7","hash":"e4118cc80c96a4af7c4a7061f58b4aaa","indexed_by":"docs-index"}},{"content":"Sprue External Frames — Connectors\n\n* Number — connector positions along the long sides; each position puts one stub on each side, reaching inward.\n* Separation — spacing between consecutive positions, centered on the frame.\n* Diameter — thickness of all connectors.\n* Length — how far each side connector reaches in.\n\nEnd connectors\n* Enabled — adds one connector at the middle of each short end.\n* Length — how far the end connectors reach in.\n\nGumballs in the viewport do the fine adjustment: orange sliders shift each long-side row of connectors independently along the frame, blue sliders shift the end connectors sideways, and arrow gumballs on the frame and connectors adjust the diameters and lengths in place.\n\nLike every sprue in this group, the frame is added as plain meshes on Accept — it is not re-editable, so slide the connectors onto solid contact points before committing.","metadata":{"title":"Sprue External Frames","section":"Connectors","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#connectors","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-frames/#connectors","collection":"docs7","hash":"28b773c74331cc71ce71d00d5d5b725e","indexed_by":"docs-index"}},{"content":"Sprue External Tree — Sprue External Tree\n\nSprue External Tree feeds a piece from outside: a main branch rises next to the design and secondary branches reach from it to the points you choose on the mesh. It is the sprue for pieces with intricate detail on both front and back — a pavé plaque with a worked backing, for instance — where an internal feed would land on detail.\n\nIn the selection panel:\n\n* Mesh Selection — the piece to sprue.\n* Main Branch Starting Point — where on the mesh the main branch begins.\n\nIn the parameters panel:\n\n* Height and diameters — the main branch's height and its upper and lower diameters.\n* Add Branches — pick the point on the mesh where each secondary branch ends. Delete removes them all; to delete one, hold Shift and click its gumball.\n* Branch Diameters — each secondary branch's diameter at the main branch and at the contact with the piece.\n\nPlaced well, the branches keep every delicate detail intact and give the metal a clean path in — fewer casting defects, better pieces.","metadata":{"title":"Sprue External Tree","section":"Sprue External Tree","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-tree/#sprue-external-tree","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-external-tree/#sprue-external-tree","collection":"docs7","hash":"13790b525478b7541da62a838cd05fed","indexed_by":"docs-index"}},{"content":"Sprue Helix — Sprue Helix\n\nThe Sprue Helix command hangs copies of one piece between the turns of a helix: a wire spirals up around a central trunk, and each copy stands in the gap between two turns, held by a connector from the turn below and stitched to the turn above.\n\nIt was built for chains: pick one link, say how many you need, and the command works out a helix where hundreds of copies sit close enough to assemble into a chain after casting, yet never touch.\n\n`ArtisanSprueHelix`","metadata":{"title":"Sprue Helix","section":"Sprue Helix","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#sprue-helix","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#sprue-helix","collection":"docs7","hash":"424f462040a34d81cd6ac1ab287ec964","indexed_by":"docs-index"}},{"content":"Sprue Helix — Building the helix\n\n1. Select link — pick the mesh (or SubD) to multiply. Its two anchor points are placed automatically on its longest axis; the X / Y / Z buttons re-align them, and two gumballs on the original link let you drag each anchor by hand. The chosen axis is the one that ends up vertical when the piece hangs.\n2. Set Copies (125 by default) and, if needed, Min Distance — extra clearance demanded between pieces on top of simply not touching. At 0, only genuine intersections are flagged, which is what interlocking chain links want.\n3. Generate helix — the command works out the turns, diameter, and height from the copies and the piece's size, and reports the result: how many pieces were placed and how many centimeters of chain that makes. Pieces that still intersect are drawn red in the preview.\n4. Adjust, Recalculate if you change something by hand, and Accept.","metadata":{"title":"Sprue Helix","section":"Building the helix","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#building-the-helix","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#building-the-helix","collection":"docs7","hash":"2998b61508162977497f8ffe61a64e15","indexed_by":"docs-index"}},{"content":"Sprue Helix — Connector\n\n* Length — how far the connector lifts the piece off the wire; it also drives the spacing between turns.\n* Diameter — thickness of both connectors, the one below the piece and the one stitching it to the turn above.\n\nHelix\n* Diameter — the diameter of the spiral path itself.\n* Height — the height of the helix, which is also the length of the main sprue.\n* Turns — how many revolutions cover that height.\n* Wire Diameter — thickness of the helix wire.","metadata":{"title":"Sprue Helix","section":"Connector","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#connector","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#connector","collection":"docs7","hash":"d906726344b1da8e64c23e6f440494c4","indexed_by":"docs-index"}},{"content":"Sprue Helix — Base\n\n* Base Diameter / Base Height — the cone standing on the plate.\n* Sprue Diameter — the central trunk the helix winds around.\n* Support Number / Support Diameter — the radial arms tying the helix to the trunk; Generate sets one arm per turn, staggered so they never stack on the same vertical.\n\nThe base point of the tree carries a gumball — drag it to move the whole helix on the plate.\n\nThe helix pays for capacity in height; its flat cousin, the Sprue Spiral, pays in plate area instead. Both are added as plain meshes on Accept and are not re-editable — size them in the panel before committing.","metadata":{"title":"Sprue Helix","section":"Base","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#base","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-helix/#base","collection":"docs7","hash":"71988f0fe8c95646bc1e68554cb2e291","indexed_by":"docs-index"}},{"content":"Sprue Inner Branches — Sprue Inner Branches\n\nSprue Inner Branches grows branches from the center of a ring out to its interior — the sprue for rings whose inside carries holes or delicate work, like a full eternity band, where a branch standing on the shank interior has nowhere safe to land.\n\nIn the selection panel:\n\n* Mesh Selection — the ring to sprue.\n* Branch Growth Point — where the branches grow from, typically the center of the ring.\n\nIn the parameters panel:\n\n* Height — lets the branches start at a different height than the ring's center.\n* Add Branches — pick the endpoint of each branch, on contact areas clear of crucial features or holes.\n* Delete Branches — one button removes them all; to delete a single branch, hold Shift and click its gumball.\n* Diameters — the branch diameter at its start and at the contact point with the mesh.\n* Symmetry — mirrors the branches for symmetrical designs.\n\nWhen the lower interior of the shank is smooth and can host a main branch, use Sprue Inner Tree instead.","metadata":{"title":"Sprue Inner Branches","section":"Sprue Inner Branches","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-inner-branches/#sprue-inner-branches","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-inner-branches/#sprue-inner-branches","collection":"docs7","hash":"30eac167869c3fa621a08f8fd6dc2ea9","indexed_by":"docs-index"}},{"content":"Sprue Inner Tree — Sprue Inner Tree\n\nSprue Inner Tree feeds a ring from the inside: a main branch stands in the smooth lower interior of the shank, and secondary branches reach from its top to the detailed upper parts — prongs, holes, galleries — that need their own metal flow during casting.\n\nIn the selection panel:\n\n* Mesh Selection — the ring to sprue.\n* Start Point — where the main branch touches the ring, typically the center of the lower interior of the shank.\n* Lower / Upper Diameter — the main branch's diameter at the contact point and at its top, where the secondary branches originate.\n\nIn the parameters panel:\n\n* Add Branches — pick the end point of each secondary branch. Choose flat areas with enough contact surface, away from crucial details and necessary holes. Each branch gets a gumball to adjust its endpoint; to delete one, hold Shift and click its gumball. You also set the branches' diameter at their contact points.\n* Symmetry — mirrors the branches, so a symmetrical ring gets an identical structure on both sides in half the clicks.\n\nFor rings whose interior itself carries holes or delicate work — a full eternity, for instance — see Sprue Inner Branches, which grows the branches from the ring's center instead.","metadata":{"title":"Sprue Inner Tree","section":"Sprue Inner Tree","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-inner-tree/#sprue-inner-tree","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-inner-tree/#sprue-inner-tree","collection":"docs7","hash":"0b3d07c50d29da9606e9e8fd4136930a","indexed_by":"docs-index"}},{"content":"Sprue Multiple Copies — Sprue Multiple Copies\n\nSprue Multiple Copies connects a set of meshes to a main runner: you define one main branch, then grow secondary branches from it to each piece, with every diameter under control.\n\nThe selection panel lists the meshes to connect. In the parameters panel:\n\n* Main Branch — a button to define the main branch by its start and end points, and its diameter at each end.\n* Add Branch — pick a point on a mesh, then the point on the main branch it should connect to. Each branch gets a gumball for fine adjustment.\n* Delete Branch — removes branches; to delete one specific branch, hold Shift and click its gumball.\n* Diameter — the secondary branches' start and end diameters.\n\nThe workflow: select the meshes, lay the main branch, add a branch to each piece, and tune the diameters — wider where the metal enters, narrower at the piece.","metadata":{"title":"Sprue Multiple Copies","section":"Sprue Multiple Copies","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-multiple-copies/#sprue-multiple-copies","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-multiple-copies/#sprue-multiple-copies","collection":"docs7","hash":"e2b74c03ebfd403e2edf8cc975740c2d","indexed_by":"docs-index"}},{"content":"Sprue Single — Sprue Single\n\nSprue Single places one sprue on one piece, exactly where you click: pick the point on the mesh and the sprue is built there, with its shape and dimensions under your control.\n\n* Height — the length of the sprue.\n* X and Y axes — the diameters of the ellipse at the top and at the bottom.\n* Shape — a round sprue with a constant diameter, or a conical one that tapers between the two ellipses.\n\nIt is the manual tool of the group — one piece, one feed, placed by eye. For a whole set of copies at once, use Sprue Multiple Copies.","metadata":{"title":"Sprue Single","section":"Sprue Single","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-single/#sprue-single","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-single/#sprue-single","collection":"docs7","hash":"36edaa36d0a90c4663f3ad3b5881c689","indexed_by":"docs-index"}},{"content":"Sprue Spiral — Sprue Spiral\n\nThe Sprue Spiral command lays a wire out as a flat spiral floating over the plate on small legs, and hangs a copy of the piece from every stretch of it. Where the Sprue Helix stacks its turns upward around a trunk, the spiral spends plate area instead of height — there is no trunk at all, and each piece hangs from a single connector.\n\nLike the helix, it was made with chains in mind: one link, a number of copies, and an automatic layout that keeps the links close enough to assemble but never touching.\n\n`ArtisanSprueSpiral`","metadata":{"title":"Sprue Spiral","section":"Sprue Spiral","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#sprue-spiral","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#sprue-spiral","collection":"docs7","hash":"66eaad2379c1b6f6d7eadabf65be7f7b","indexed_by":"docs-index"}},{"content":"Sprue Spiral — Building the spiral\n\n1. Select link — pick the mesh (or SubD) to multiply. Its anchor is placed automatically; the X / Y / Z buttons re-align it, and a gumball on the original link lets you drag it by hand.\n2. Set Copies (60 by default) and, if needed, Min Distance — extra clearance on top of not touching; 0 is right for interlocking links.\n3. Generate spiral — the command works out the turns, turn spacing, and inner diameter from the copies, staying inside Max Diameter, and reports how many pieces were placed and how many centimeters of chain that makes. Pieces that still intersect are drawn red in the preview. If the plate cannot hold the run, the panel says so — and suggests the helix, which stacks turns upward instead of paying plate for them.\n4. Adjust, and Accept.","metadata":{"title":"Sprue Spiral","section":"Building the spiral","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#building-the-spiral","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#building-the-spiral","collection":"docs7","hash":"e0a9c7e5f768d6acc0491f76fd902e8b","indexed_by":"docs-index"}},{"content":"Sprue Spiral — Connector\n\n* Length — from the wire surface down to the piece.\n* Diameter — thickness of the connector.\n\nSpiral\n* Inner Diameter — the eye at the center where the wire starts.\n* Turn Spacing — how far the wire moves outward per turn.\n* Turns — how many turns; quarter-turn steps are allowed.\n* Wire Diameter — thickness of the spiral wire.\n* Height — how high the spiral floats over the plate.\n* Max Diameter — the printer-plate limit the automatic layout must respect.","metadata":{"title":"Sprue Spiral","section":"Connector","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#connector","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#connector","collection":"docs7","hash":"14a252d2a54d508c8d261b313fb8b841","indexed_by":"docs-index"}},{"content":"Sprue Spiral — Centre and legs\n\n* Centre Diameter / Spokes — a ring on the floor with curved risers feeding the spiral from the middle; set Spokes to 0 for no centre.\n* Legs: Diameter / Separation — the posts holding the wire at its height, spaced by distance along the wire.\n\nBase\n* Honeycomb base — an optional perforated hexagonal sheet under the legs, with its Cell Size, Wall, and Thickness. Off by default.\n\nA gumball at the spiral's center moves the whole structure on the plate.\n\nLike every sprue in this group, the result is added as plain meshes on Accept and is not re-editable — generate, check the red flags, and only then commit.","metadata":{"title":"Sprue Spiral","section":"Centre and legs","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#centre-and-legs","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-spiral/#centre-and-legs","collection":"docs7","hash":"ff4a9882f62479eed0b6f397883de80f","indexed_by":"docs-index"}},{"content":"Sprue Tree — Sprue Tree\n\nThe Sprue Tree command builds the classic radial casting tree: a tapered central trunk standing on a base, with several floors of pieces distributed around it in a circle, each one joined to the trunk by its own connector.\n\nIt is the tree you use when the plate is full of the same design and you want the flask packed as tightly as the pieces allow.\n\n`ArtisanSprueTree`","metadata":{"title":"Sprue Tree","section":"Sprue Tree","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#sprue-tree","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#sprue-tree","collection":"docs7","hash":"df1d6c1976fc622e4bd79d16b840d4e3","indexed_by":"docs-index"}},{"content":"Sprue Tree — Building the tree\n\n1. Select the mesh you want to cast. Build from copies takes the copies you already laid out instead of replicating one model.\n2. Set how the pieces are distributed — Floors and Pieces per Floor — and the tree writes itself around them.\n3. Adjust the trunk and connectors until nothing collides, then Accept to add the tree to the document.","metadata":{"title":"Sprue Tree","section":"Building the tree","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#building-the-tree","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#building-the-tree","collection":"docs7","hash":"aad7bfdce06d3dff0a3287e4f2a03508","indexed_by":"docs-index"}},{"content":"Sprue Tree — Distribution\n\n* Floors — how many levels of pieces the tree carries.\n* Pieces per Floor — how many go around each level.\n* Vertical Separation — distance between floors. `0` spreads them evenly along the trunk height; if the floors need more room than the trunk has, the trunk grows to cover them and the panel says so.\n* Floor Stagger — degrees each floor is rotated against the one below, so pieces do not sit directly on top of each other.\n* Height Stagger — raises alternate arms of the same floor, as a fraction of the floor spacing: `0` keeps the floor level, `1` lifts the alternate arm halfway to the next floor. It is how you fit more pieces per turn without them touching.\n* Min Distance — the clearance the tree keeps between neighbouring pieces.","metadata":{"title":"Sprue Tree","section":"Distribution","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#distribution","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#distribution","collection":"docs7","hash":"d51ef30967b6a1aa34503be83953076e","indexed_by":"docs-index"}},{"content":"Sprue Tree — Trunk and base\n\n* Height — trunk height, driven by the flask you cast in.\n* Bottom Diameter / Top Diameter — the trunk taper, wider at the bottom where all the metal passes.\n* Base Diameter / Base Height — the cone that sits on the plate.\n* Branch Diameter — thickness of the connectors reaching the pieces.\n\nConnectors\nEach piece has its own connector, adjusted from the model section:\n\n* Length — how far the piece sits from the trunk.\n* Angle — the connector's inclination.\n* Rotation — how the piece is turned on the connector's axis.\n* Inside — how far the connector sinks into the piece.\n* Max Length — the limit used when the tree solves the layout on its own.\n\nThe tree is added as a mesh when you accept it — it is not a re-editable object. Set the parameters before accepting, and use Recalculate in the panel to refresh the preview while you work.","metadata":{"title":"Sprue Tree","section":"Trunk and base","url":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#trunk-and-base","source":"https://www.rhinoartisan.com/docs/7/manufacturing/sprue-tree/#trunk-and-base","collection":"docs7","hash":"118fda90eb2faafb60c6da217954c05d","indexed_by":"docs-index"}},{"content":"STL Format\n\nThe STL (Stereolithography) format is one of the most common and widely used file formats in 3D printing. It was initially developed by 3D Systems in 1987 for their stereolithography technology, which was one of the first 3D printing technologies.\n\nKey Features of the STL Format:\n1. Geometry Representation:\n* The STL format describes the surface of a 3D object using a collection of triangles, also known as facets. Each triangle is defined by three points (vertices) and a normal that indicates the surface's outward direction.\n* The more triangles there are, the higher the model's resolution, but the larger the file size.\n2. No Color or Texture Information:\n* The STL format is purely geometric. It does not include information about the object’s colours, textures, or materials—only its 3D shape.\n3. Simple and Widely Compatible:\n* Due to its simplicity, the STL format is compatible with almost all 3D design (CAD) software and 3D printing preparation software.\n* It is the most common format for exchanging models between design tools and 3D printing machines.\n4. Limitations:\n* Since STL only represents the surface of an object with triangles, it does not include internal details of the model, such as material thickness, which can be a limitation in some design cases.\n* The lack of colour and material information can also be a drawback for more complex models that require these features.","metadata":{"title":"STL Format","url":"https://www.rhinoartisan.com/docs/7/manufacturing/stl-format/","source":"https://www.rhinoartisan.com/docs/7/manufacturing/stl-format/","collection":"docs7","hash":"a0bc74fcedaf78599dc7d470797dfebc","indexed_by":"docs-index"}},{"content":"STL Format — Use in 3D Printing:\n\nWhen designing a model in CAD software, it is exported as an STL file to be processed by slicing software, which prepares the model for 3D printing. This software slices the model into horizontal layers and generates a file the 3D printer can interpret and build layer by layer.\n\nIn summary, the STL format is fundamental in the 3D printing workflow due to its simplicity and broad compatibility, though it has certain limitations regarding the information it can store.","metadata":{"title":"STL Format","section":"Use in 3D Printing:","url":"https://www.rhinoartisan.com/docs/7/manufacturing/stl-format/#use-in-3d-printing","source":"https://www.rhinoartisan.com/docs/7/manufacturing/stl-format/#use-in-3d-printing","collection":"docs7","hash":"1ea95bc7e748ac66617f75687bfb41cc","indexed_by":"docs-index"}},{"content":"Thickness — Thickness\n\nThickness measures the wall of the piece exactly where you point: select the object, then move the cursor over its surface and the wall thickness under the cursor is calculated live, measured along the surface normal, with a line in the viewport showing the direction of the measurement.\n\nClick to place a text marker with the value at that spot — you can mark as many points as you need, building a record of the walls that matter: the bottom of the shank, the seat under a stone, the back of a signet.\n\nFor a map of the whole piece against a minimum value instead of a probe, use Global Thickness.","metadata":{"title":"Thickness","section":"Thickness","url":"https://www.rhinoartisan.com/docs/7/manufacturing/thickness/#thickness","source":"https://www.rhinoartisan.com/docs/7/manufacturing/thickness/#thickness","collection":"docs7","hash":"e6a4ee3c53d9fe34b2ea30c948968d03","indexed_by":"docs-index"}},{"content":"Organic Modeling & Sculpting\n\nNot everything in a piece can be drawn with curves and surfaces. A panther's muscle, a face on a signet, a knot of branches, the pillow of a puffed heart — these are modelled by feel, not by measure. RhinoArtisan gives you four ways to get there, and they are made to be combined:\n\nGenerative AI Describe the shape, or show it in a photo, and get a textured 3D mesh back — plus renders, videos and try-ons from the same window.\n\nSculpt Digital clay: eight brushes with symmetry, radial copies and gem-aware masking, working any solid, surface, SubD or mesh by hand.\n\nRelief A parametric 2.5D height field built from curves, images, textures and brush strokes — the coin, the medal, the carved monogram.\n\nSubD Smooth, editable freeform shapes from a coarse cage of faces — precise control over flowing forms, and clean conversion to NURBS.","metadata":{"title":"Organic Modeling & Sculpting","url":"https://www.rhinoartisan.com/docs/7/organic/","source":"https://www.rhinoartisan.com/docs/7/organic/","collection":"docs7","hash":"fc37537cae2270a49c2b5c0137afb78d","indexed_by":"docs-index"}},{"content":"Organic Modeling & Sculpting — Which one, when\n\n* Start from nothing? Describe it to Generative AI Studio — Text to 3D turns a sentence into a mesh, Image to 3D reconstructs a photo, a sketch or a client's reference.\n* Detail on an existing piece? Sculpt brushes it directly — push, build clay, smooth, pinch — with the stones masked and the weight on screen.\n* Flat art becoming depth? Relief carves logos, lettering, photos and textures into a surface as a stack of operations that stays editable.\n* A flowing form you still want to control? SubD keeps the shape smooth and the cage editable, and converts to NURBS when the parametric work resumes.\n\nThey chain naturally. A generated mesh is a starting point you refine with Sculpt; a relief lands on a SubD shank; a sculpted piece gets its final lettering as a relief. The organic tools all end in meshes and solids that the rest of RhinoArtisan — weight, thickness analysis, rendering — treats like any other geometry.","metadata":{"title":"Organic Modeling & Sculpting","section":"Which one, when","url":"https://www.rhinoartisan.com/docs/7/organic/#which-one-when","source":"https://www.rhinoartisan.com/docs/7/organic/#which-one-when","collection":"docs7","hash":"550a7c68230185f9b3a62f50e6ae9e4f","indexed_by":"docs-index"}},{"content":"Generative AI Studio — Generative AI\n\nGenerative AI puts today's best image, video and 3D models to work on your jewelry designs, without leaving RhinoArtisan. Capture your viewport, describe what you want, and turn a working model into a studio-grade render, a product clip for social media, or an organic mesh you can keep editing in Rhino.\n\nGenerative AI grew out of Loom, the RhinoArtisan Labs experiment. In RhinoArtisan 7 it is built into the plugin and connects directly to fal.ai: no RhinoArtisan Connect account is required. Why fal.ai: What are fal.ai and OpenRouter?","metadata":{"title":"Generative AI Studio","section":"Generative AI","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#generative-ai","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#generative-ai","collection":"docs7","hash":"e53881d57c73f0d54287aa62783efb52","indexed_by":"docs-index"}},{"content":"Generative AI Studio — How it works\n\n* One window. Everything happens in the Generative AI Studio: projects, inputs, prompts, results and previews.\n* One key. You bring your own fal.ai API key. Generation is pay-per-use, billed by fal.ai — RhinoArtisan adds no fees and no subscription for this feature. See Costs and spending.\n* Local by design. Your projects and every generated image, video and 3D model are stored on your machine, in a `Falai` folder inside the RhinoArtisan User Folder.","metadata":{"title":"Generative AI Studio","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#how-it-works","collection":"docs7","hash":"e3c848feae3c236246c7ceed44f4ae61","indexed_by":"docs-index"}},{"content":"Generative AI Studio — What you can create\n\nSeven capabilities, each backed by a curated set of leading models:\n\n* Image to Image — transform a viewport capture or photo with a prompt: renders, material variations, try-ons, edits.\n* Text to Image — generate concepts and renders from nothing but a description.\n* Image to Video — animate a still into a smooth, short clip for social media and e-commerce.\n* Text to Video — generate a short video straight from a written scene.\n* Image to 3D — reconstruct an editable organic mesh from a single photo.\n* Text to 3D — describe an object and get a textured 3D mesh back.\n* Video to Video — make render footage photoreal, or upscale a generated clip up to 4K.\n\nSee the full catalog in Modes & Models, and real examples in What You Can Create.","metadata":{"title":"Generative AI Studio","section":"What you can create","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#what-you-can-create","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#what-you-can-create","collection":"docs7","hash":"eae426f8f343a62d8ee2a48e83d720ec","indexed_by":"docs-index"}},{"content":"Generative AI Studio — Quick Start\n\n1. Get a fal.ai API key and paste it into RhinoArtisan — the whole process takes a couple of minutes and is covered step by step in Accounts and API keys.\n2. Open the Studio: click Generative AI in the AI group of the File tab, or run the `ArtisanGenerativeAI` command.\n3. Create a project in the Projects column to keep related generations together.\n4. Click Capture Snapshot to send a clean capture of your active viewport to the project, or Import Files to start from a photo or sketch.\n5. Click the mode chip next to the prompt box and pick a capability and a model.\n6. Type your prompt and press Send. The result appears in the project grid, ready to preview, chain into the next generation, download — or import into Rhino if it's a 3D model.\n\nNew to working with generative AI? Understanding AI in RhinoArtisan and Different models for different jobs set the right expectations before your first generation.","metadata":{"title":"Generative AI Studio","section":"Quick Start","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#quick-start","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/#quick-start","collection":"docs7","hash":"7da14ea555b876639734e1b0be810aa9","indexed_by":"docs-index"}},{"content":"Modes & Models\n\nChoosing what to generate is a two-step decision. First you pick a mode — the capability, defined by what goes in and what comes out, like *Image to Video*. Then you pick the model that will do the work: each mode offers a curated set of the leading models for that job, each with its own strengths, options and fal.ai price.\n\nClick the mode/model chip in the prompt bar (or the AI Modes and Models toolbar button) to open the Select Mode and Model dialog: capabilities on the left, model cards — with provider badge and description — on the right.\n\nThe catalog evolves with the state of the art: models are added and replaced as better ones appear on fal.ai, with no update needed on your side beyond keeping RhinoArtisan current. The lists below reflect RhinoArtisan 7.0.","metadata":{"title":"Modes & Models","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/","collection":"docs7","hash":"3ec360c70c49a05281b63b5ba0c3d710","indexed_by":"docs-index"}},{"content":"Modes & Models — Image to Image\n\nTransform a photo or viewport capture with a prompt: renders, try-ons, edits. This is the workhorse mode for jewelry — select an input image, describe the change, and keep what matters intact.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Nano Banana Pro | Google | Final-quality results — hero shots, campaign imagery and detailed edits, up to 4K. |\n| Nano Banana 2 | Google | Fast, precise everyday edits that respect composition, lighting and style. |\n| Reve Edit | Reve | Clean, natural edits with strong prompt adherence — a good second interpretation. |\n| GPT Image 2 | OpenAI | Fine-grained local changes: swap a stone, change a finish, keep the rest untouched. |\n| Seedream 4.5 | ByteDance | Photorealistic product edits with consistent subjects across variations. |\n| FLUX.1 Kontext Pro | Black Forest Labs | Changing background, lighting or context while the piece stays identical. |\n| Grok Imagine | xAI | Fast, creative takes when you want a different eye on the same edit. |\n| BiRefNet v2 | fal.ai | Background removal — clean cut-outs even on thin chains and prongs. No prompt needed. |\n| Fibo | Bria | Licensed-data generations with fine control: steps, guidance scale, negative prompt. |","metadata":{"title":"Modes & Models","section":"Image to Image","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-image","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-image","collection":"docs7","hash":"8763c2a51e53644543af286def849de0","indexed_by":"docs-index"}},{"content":"Modes & Models — Text to Image\n\nGenerate images from a text description: sketches, renders, concepts. No input image required — just describe the piece, the scene and the style.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Nano Banana 2 | Google | The default for jewelry concepts and renders from a plain description. |\n| FLUX1.1 Pro Ultra | Black Forest Labs | Studio-photograph realism at up to 2K when the concept must look final. |\n| FLUX LoRA | Black Forest Labs | Generating in a trained brand or product style (acts as standard FLUX dev without a LoRA). |\n| FLUX.1 Schnell | Black Forest Labs | Rapid, very low-cost ideation — try many directions, refine the winner elsewhere. |\n| Grok Imagine | xAI | Bold, creative interpretations when other models play it too safe. |\n| Reve | Reve | A high-aesthetic second opinion on the same concept. |","metadata":{"title":"Modes & Models","section":"Text to Image","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-image","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-image","collection":"docs7","hash":"854ab532d04499369aab821f098d1f49","indexed_by":"docs-index"}},{"content":"Modes & Models — Image to Video\n\nCreate smooth, short videos from a single image — ideal for social media and e-commerce. Select a still (a render, a generation, a capture) and describe the motion.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Kling 2.5 Turbo Pro | Kuaishou | The go-to for jewelry turntables and hero clips — top motion realism, 5 or 10 s. |\n| Kling 3.0 Standard | Kuaishou | Current-generation Kling quality at a lower price than Pro. |\n| Seedance 2.0 | ByteDance | Fluid motion and strong subject consistency — compare with Kling on the same shot. |\n| Veo 3.1 | Google | Cinematic 8-second clips with natural physics and optional synchronized audio. |\n| Wan 2.5 | Alibaba | Volume work — animating many catalog shots at a strong price/quality ratio. |","metadata":{"title":"Modes & Models","section":"Image to Video","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-video","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-video","collection":"docs7","hash":"abd8af863f6302ceb401621a6daf0914","indexed_by":"docs-index"}},{"content":"Modes & Models — Text to Video\n\nGenerate short videos directly from a text description, with no source image at all.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Kling 2.5 Turbo Pro | Kuaishou | Smooth 5 or 10 second clips with excellent motion, straight from a description. |\n| Veo 3.1 | Google | Cinematic scenes with natural physics and optional audio. |\n| Wan 2.5 | Alibaba | Cost-effective clips at 720p or 1080p. |","metadata":{"title":"Modes & Models","section":"Text to Video","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-video","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-video","collection":"docs7","hash":"396b265f38aa88b46b479e50fbdb0035","indexed_by":"docs-index"}},{"content":"Modes & Models — Image to 3D\n\nProduce an editable organic 3D model directly from a photo — or from a viewport capture of a shape you want reinterpreted. Results preview in the Studio's 3D viewer and import into Rhino as meshes.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Meshy 6 Preview | Meshy | Most control: topology, target polycount, symmetry, remeshing and texturing. |\n| Hunyuan 3D 3.1 Pro | Tencent | Highest geometric detail on ornamental work, with PBR textures. |\n| Hunyuan3D v3 | Tencent | Quick, cheaper volume tests before rerunning the best candidates on Pro. |\n| Rodin | Hyper3D | Clean, production-grade meshes that hold up to further editing in Rhino. |\n| Seed3D | ByteDance | Fast one-shot reconstruction with strong fidelity to the photo. |","metadata":{"title":"Modes & Models","section":"Image to 3D","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-3d","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#image-to-3d","collection":"docs7","hash":"a4ffd46e097f7d481db9a22a9eaf2589","indexed_by":"docs-index"}},{"content":"Modes & Models — Text to 3D\n\nGenerate an organic 3D model from a simple description, ready to refine or print.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| Meshy 6 Preview | Meshy | Textured meshes from a description, with art style, topology, polycount and symmetry control. |\n\nVideo to Video\nTurn a viewport or render video photoreal, or upscale a generated clip. This mode needs an item that already has a video — select one in the grid first.\n\n| Model | Provider | Best for |\n| --- | --- | --- |\n| LTX Render to Real | Lightricks | Turning 3D render footage into photorealistic marketing video. |\n| Topaz Video Upscale | Topaz Labs | Upscaling generated clips up to crisp 4K for e-commerce and social. No prompt needed. |\n\n*","metadata":{"title":"Modes & Models","section":"Text to 3D","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-3d","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#text-to-3d","collection":"docs7","hash":"1efce7b33731e5bc4503f5dd0a72ab80","indexed_by":"docs-index"}},{"content":"Modes & Models — Options\n\nEvery model exposes its own subset of options — open Model Options** (the gear in the prompt bar, or the toolbar button) to see what the current model offers before you hit Send.\n\n| Option | What it does | Available values |\n| --- | --- | --- |\n| Ratio | Aspect ratio of the generated image | Auto, 21:9, 16:9, 3:2, 4:3, 5:4, 1:1, 2:3, 3:4, 4:5, 9:16 |\n| Number of Images | How many candidates one generation produces | A number, 1 by default |\n| Negative Prompt | What the model should avoid in the result | Free text |\n| Duration | Clip length for Kling, Seedance and Wan videos | 5 or 10 seconds |\n| Veo Resolution | Output resolution of Veo 3.1 clips | 720p, 1080p |\n| Generate Audio | Whether Veo 3.1 adds synchronized audio | Yes, No |\n| Wan Resolution | Output resolution of Wan 2.5 clips | 480p, 720p, 1080p |\n| CFG Scale | How strictly Kling follows the prompt | A number, 0.5 by default |\n| Steps | Number of inference steps for Fibo | A number, 50 by default |\n| Guidance Scale | Prompt-adherence strength for Fibo | A number, 5 by default |\n| Mode | Meshy generation quality tier | Preview, Full |\n| Art Style | Look of the Meshy text-to-3D result | Realistic, Sculpture |\n| Topology | Mesh structure of the Meshy result | Triangle, Quad |\n| Target Polycount | Mesh density Meshy aims for | A number, 300000 by default |\n| Symmetry | Meshy symmetry handling | Auto, Off, On |\n| Should Remesh | Whether Meshy rebuilds the mesh topology | Yes, No |\n| Should Texture | Whether Meshy textures the image-to-3D result | Yes, No |\n\nWhen in doubt, generate once with the defaults, look at the result, then adjust one option at a time — options interact with the prompt, and changing both at once makes it hard to tell what improved the result.","metadata":{"title":"Modes & Models","section":"Options","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#options","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/modes-and-models/#options","collection":"docs7","hash":"187d8092fcee5e56086e496b8c33585b","indexed_by":"docs-index"}},{"content":"Setting Up Generative AI Studio\n\nGenerative AI Studio talks directly to fal.ai, the cloud platform that hosts the AI models it uses. All you need to do once is create a fal.ai account, copy your API key, and paste it into RhinoArtisan.\n\nRequirements: RhinoArtisan 7.0, an internet connection, and a fal.ai account with credit. RhinoArtisan adds no fees of its own: you pay fal.ai directly, per generation. Curious why we use fal.ai? See What are fal.ai and OpenRouter?","metadata":{"title":"Setting Up Generative AI Studio","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/","collection":"docs7","hash":"862dd916ad89edcfb652c65ec7cae776","indexed_by":"docs-index"}},{"content":"Setting Up Generative AI Studio — Connect your fal.ai key\n\nCreate a fal.ai account, add credit, copy your API key (it looks like `fal_sk_…`) and paste it into Options → Artisan → Integrations, in the Generative AI (fal.ai) group's API Key field. Then click OK and restart RhinoArtisan (or Rhino) before your first generation.\n\nThe whole process, with screenshots of every step, is in Accounts and API keys: it takes a couple of minutes and covers every AI tool at once.","metadata":{"title":"Setting Up Generative AI Studio","section":"Connect your fal.ai key","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/#connect-your-falai-key","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/#connect-your-falai-key","collection":"docs7","hash":"263b8eb0faae1a9001e793da1a4c8592","indexed_by":"docs-index"}},{"content":"Setting Up Generative AI Studio — Verify it works\n\nOpen the Studio: click Generative AI in the AI group of the File tab, or run `ArtisanGenerativeAI`.\n\nIf the key is missing or empty, the Studio shows a notice instead of the prompt bar: *\"Generative AI needs a fal.ai API key. Add it in Options > RhinoArtisan > Integrations.\"* Clicking it takes you straight to the fal.ai keys page. If you see the prompt bar and the mode chip at the bottom of the window, you're connected — head over to the Studio tour and generate something.\n\nYour usage and spending are always visible in the fal.ai dashboard, where you can also create separate keys per device or team member, and revoke a key at any time to cut off access. More in Costs and spending.","metadata":{"title":"Setting Up Generative AI Studio","section":"Verify it works","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/#verify-it-works","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/setting-up/#verify-it-works","collection":"docs7","hash":"f7424b60058dbe6bd6058fe9941b300d","indexed_by":"docs-index"}},{"content":"Studio UI\n\nThe Generative AI Studio is the single window where everything happens: you organize work into projects, feed the AI with viewport captures or images, choose a mode and a model, write your prompt, and collect the results.\n\nOpening the Studio\n* Click Generative AI in the AI group of the File tab, next to Flow Studio AI and the Assistant.\n* Or type the `ArtisanGenerativeAI` command.\n\nThe Studio is a modeless window: you can keep it open while you model, orbit the viewport, capture a new snapshot and generate again. Running the command while it is already open simply brings it to the front.","metadata":{"title":"Studio UI","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/","collection":"docs7","hash":"e327f0be441eeb4434a2800dbc2f538f","indexed_by":"docs-index"}},{"content":"Studio UI — Projects\n\nThe left column lists your projects. A project is simply a container for related inputs and generations — one per design, client or campaign works well. Create a new one with + New Project, switch by clicking, and use Open project folder to jump to the folder on disk where that project's media lives.\n\nEach project carries a color dot — click it to change the color and use it however you organize your work. Right-click a project for Rename, Duplicate, and Delete; drag projects to reorder the list, and drag a result card onto a project to move it there.","metadata":{"title":"Studio UI","section":"Projects","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#projects","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#projects","collection":"docs7","hash":"0c7500fb04d5bae3bfa1e1e4296800ee","indexed_by":"docs-index"}},{"content":"Studio UI — Gallery\n\nEvery input you add and every generation you run appears as a thumbnail in the gallery, newest first. Hovering an item reveals its quick actions:\n\n* Import to Rhino — only on items that carry a 3D model.\n* Download — save a copy of the item's media anywhere on disk.\n* Delete — remove the item from the project. This is permanent.\n\nClick any item to load it into the preview — and to make it the input of your next generation. The Item size slider under the gallery scales the thumbnails from small inventory to near-preview size.","metadata":{"title":"Studio UI","section":"Gallery","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#gallery","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#gallery","collection":"docs7","hash":"ed7dc087dec313303036dde7363b02ac","indexed_by":"docs-index"}},{"content":"Studio UI — Preview\n\nThe big central area shows the selected item at full size: images as stills, videos in a looping player, and 3D results in an interactive viewer you can orbit. Before anything is selected it reads *\"Select an item or capture the viewport to start.\"*\n\nPrompt bar\nThe bottom bar is where generations start:\n\n* The mode/model chip shows the current capability and model — for example *Image to Image · Nano Banana 2*. Click it to open the Select Mode and Model dialog, with the capabilities on the left and the model cards — provider badge and description — on the right.\n* The Model Options gear opens the settings of the current model: aspect ratio, duration, polycount and so on, depending on the model. See Modes & Models for the full list.\n* The prompt box takes your instruction in plain language.\n* Send launches the generation; while one is running it becomes Stop.","metadata":{"title":"Studio UI","section":"Preview","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#preview","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#preview","collection":"docs7","hash":"8019be1a2931a025fa1889342379e512","indexed_by":"docs-index"}},{"content":"Studio UI — Toolbar\n\nThe button row under the prompt box, in order:\n\n* Capture Snapshot — captures the active Rhino viewport at 1920×1080, clean — no grid, no axes — and adds it to the project as an input image.\n* Import Files — adds files from disk: images (a photo, a sketch, a reference), videos, or 3D models.\n* Download — saves the selected item's media to disk.\n* AI Modes and Models — opens the Select Mode and Model dialog, same as the prompt-bar chip.\n* Model Options — opens the current model's options, same as the gear.\n* Refresh Project — reloads the project and picks up the state of queued jobs.\n* Send — launches the generation; while one runs it becomes Stop.\n\n*","metadata":{"title":"Studio UI","section":"Toolbar","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#toolbar","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#toolbar","collection":"docs7","hash":"7031db8ee389f2721717c58e4fea7575","indexed_by":"docs-index"}},{"content":"Studio UI — Chain one generation into the next\n\nWhatever is selected in the gallery is the input of the next generation. That makes iterating natural: capture the viewport, generate a render, select the render and ask for a white gold version, select that and animate it into a clip. Each step lands in the same project, so the whole exploration stays together.\n\nVideo to Video needs an item that already has a video selected — a clip you previously generated, or a video you added with Import Files: render footage to make photoreal, or a clip to upscale.","metadata":{"title":"Studio UI","section":"Chain one generation into the next","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#chain-one-generation-into-the-next","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#chain-one-generation-into-the-next","collection":"docs7","hash":"a88e1ab60e973f981b273312d02de5e6","indexed_by":"docs-index"}},{"content":"Studio UI — Queued jobs: video and 3D\n\nImages generate synchronously — you'll see the result as soon as the model finishes. Video and 3D generations run as queued jobs: the item appears in the gallery as processing and resolves automatically when it's done. If you closed the Studio in between, Refresh Project picks up finished jobs.\n\nWhile a request is running, Stop stops the wait on your side. A job that was already queued may still finish on the server — Refresh Project will pick it up.","metadata":{"title":"Studio UI","section":"Queued jobs: video and 3D","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#queued-jobs-video-and-3d","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#queued-jobs-video-and-3d","collection":"docs7","hash":"e93afd4c9810d0d34ba8b296aa205431","indexed_by":"docs-index"}},{"content":"Studio UI — Import to Rhino\n\nOn 3D results, Import to Rhino brings the generated mesh (GLB) into the active document, zooms the view to it, and closes the Studio so you can start working on the model right away. From there, refine it with Sculpt or SubD like any other mesh.\n\nEverything is stored locally\nProjects and all generated media live on your machine, under the RhinoArtisan User Folder in a `Falai` folder — one subfolder per project, plus a `projects.json` index. Open project folder takes you straight there, which makes it easy to back up a project or drop its files into other tools.\n\nDelete is permanent.** There is no cloud copy and no recycle bin inside the Studio: deleting an item removes its files from disk. Download or back up anything you want to keep before cleaning up a project.","metadata":{"title":"Studio UI","section":"Import to Rhino","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#import-to-rhino","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/studio/#import-to-rhino","collection":"docs7","hash":"1c49fa2f421dfe528127d87be6712c99","indexed_by":"docs-index"}},{"content":"What You Can Create\n\nGenerative AI opens a new creative world for jewelers, designers, and brands. Instead of limiting you to fixed workflows, it gives you the freedom to explore, experiment, and transform your ideas in seconds. On this page you'll find real examples of the range it covers — from turning simple viewport captures into luxury renders to generating videos, try-ons, new angles, variations, and fully imagined compositions. Every one of them was made in the Studio, with the modes named in each section.","metadata":{"title":"What You Can Create","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/","collection":"docs7","hash":"64ba2611a7a3b87104af1c7c7079264b","indexed_by":"docs-index"}},{"content":"What You Can Create — From Screenshot to Luxury Render\n\n*Image to Image* — from a simple Capture Snapshot inside RhinoArtisan, Generative AI transforms your design into a studio-grade visual.\n\nWe start by creating a new project and generating an ultra-realistic render: refined rose gold, high-clarity diamonds, perfect light dispersion, and precise prong detailing. The model even creates the matching pair automatically, ensuring both earrings share the exact same style, materials, reflections, and proportions. A clean white reflective background enhances brilliance and delivers a premium, minimal studio look.\n\n***","metadata":{"title":"What You Can Create","section":"From Screenshot to Luxury Render","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-screenshot-to-luxury-render","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-screenshot-to-luxury-render","collection":"docs7","hash":"12d39f590e6e70af0b538a3efeb54f33","indexed_by":"docs-index"}},{"content":"What You Can Create — Consistent Gold Variations in Seconds\n\n*Image to Image* — need variations? Just ask. Selecting the original render as the input, Generative AI produces two additional versions, instantly.\\ Version one: only the metal changes to white gold.\\ Version two: only the metal shifts to yellow gold.\n\nEverything else remains identical: lighting, camera angle, reflections, diamonds, and background.\\ Perfectly consistent results, ready for catalogs, lookbooks, or A/B testing.\n\n***","metadata":{"title":"What You Can Create","section":"Consistent Gold Variations in Seconds","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#consistent-gold-variations-in-seconds","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#consistent-gold-variations-in-seconds","collection":"docs7","hash":"05d5379f183419a5eafd57af4d8c82a7","indexed_by":"docs-index"}},{"content":"What You Can Create — From Sketch to Client-Ready Render\n\n*Image to Image* — starting from a simple hand-drawn sketch added with Import Files, Generative AI transforms your idea into a polished, ultra-realistic render.\n\nPerfect for presenting concepts to your client or getting quick approval from your design team.\\ In seconds, you move from an early idea to a visual that looks ready for production.\n\nIt can also change the gemstone colors and seamlessly adapt the dress so everything matches perfectly.\n\nAnd with *Image to Video*, the same result becomes a smooth, natural-looking clip.\n\n***","metadata":{"title":"What You Can Create","section":"From Sketch to Client-Ready Render","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-sketch-to-client-ready-render","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-sketch-to-client-ready-render","collection":"docs7","hash":"72c61a6df1b45bca841271fc80f5583b","indexed_by":"docs-index"}},{"content":"What You Can Create — Realistic Try-On, Instantly\n\n*Image to Image* — bring your jewelry to life on a real person. Generative AI can take the earring and place it naturally on the ear of a blonde woman, respecting skin tones, shadows, proportions, and perspective.\\ It creates a clean, realistic try-on image, ideal for presentations and online stores.","metadata":{"title":"What You Can Create","section":"Realistic Try-On, Instantly","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#realistic-try-on-instantly","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#realistic-try-on-instantly","collection":"docs7","hash":"b6f6ef403d53f94639aa69c1deada066","indexed_by":"docs-index"}},{"content":"What You Can Create — Add Emotion with Video\n\n*Image to Video* — and now… movement. A still image becomes engaging, emotional content in seconds.\n\n***\n\nFrom One Image to Social-Ready Variations\n*Image to Image* — from a single image, Generative AI can create new materials and multiple variations tailored for social media. For example, we start with this photo, and from it we generate several vertical versions perfectly optimized for Instagram — the Ratio option in Model Options handles the format.\n\n***","metadata":{"title":"What You Can Create","section":"Add Emotion with Video","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#add-emotion-with-video","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#add-emotion-with-video","collection":"docs7","hash":"94f6ff17c105857210fb5a7b21aad381","indexed_by":"docs-index"}},{"content":"What You Can Create — New Angles, New Possibilities\n\n*Image to Image* — starting from a single image, Generative AI can generate different points of view of the same piece, or apply changes to create new variations.\n\n***\n\nPure Creativity, No Limits\n*Text to Image* and *Image to Video* — let your imagination run free. Generative AI allows you to create artistic photographic compositions and striking, dynamic videos that go far beyond traditional jewelry visuals.\n\n***","metadata":{"title":"What You Can Create","section":"New Angles, New Possibilities","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#new-angles-new-possibilities","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#new-angles-new-possibilities","collection":"docs7","hash":"f24c05588eee783e0893154c891c63a0","indexed_by":"docs-index"}},{"content":"What You Can Create — From Words — or a Photo — to a 3D Model\n\n*Text to 3D* and *Image to 3D* — the modes that end in geometry instead of an image. Describe a shape — *a coiled serpent, a lion's head, a knot of branches* — and Text to 3D generates it as a textured 3D mesh, previewed in the Studio's 3D viewer and imported straight into your document. If the shape already exists — in a photo, a client's reference, an antique piece, or a capture of your own viewport — Image to 3D reconstructs it the same way.\n\nWhat comes back is organic geometry: a sculptural mesh, the kind of form you would otherwise model by hand. That is exactly why these modes live with the organic tools — the result is a starting point you refine with Sculpt, SubD, or Relief, not a finished piece.\n\nNot for precision parts. These models imagine shapes; they do not measure them. Don't expect an exact finger size, calibrated stone seats, watertight symmetry, or production tolerances from a generated mesh — for that, RhinoArtisan's parametric tools (shanks, gems and settings, components) are the right instrument. Use Text to 3D and Image to 3D for the organic part of the piece — the panther, the flower, the texture — and build the precision around it.\n\n***\n\nReady to make your own? Get your key in Setting Up Generative AI Studio, then pick your model in Modes & Models.","metadata":{"title":"What You Can Create","section":"From Words — or a Photo — to a 3D Model","url":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-words--or-a-photo--to-a-3d-model","source":"https://www.rhinoartisan.com/docs/7/organic/generative-ai/what-you-can-create/#from-words--or-a-photo--to-a-3d-model","collection":"docs7","hash":"0ab9a5e9572c8620dd2fe69903847a8a","indexed_by":"docs-index"}},{"content":"Relief — Relief\n\nRelief builds a 2.5D height field — a rectangular workbench on which every operation adds, subtracts or blends height — and turns it into geometry when you are done. It is how you make a signet crest, a coin-style medal, a textured band, a carved monogram or a filigree pattern without modelling every bump by hand.\n\nThe important part is that nothing is destructive. A relief is a project: an ordered stack of operations that stays editable. Move a curve in the document and the relief follows it; change the height of the third operation and only that one recomputes; reorder the stack and the result changes accordingly. The project is stored inside the `.3dm`, so closing Rhino and reopening the command resumes exactly where you left it.\n\nRun `ArtisanRelief`, or click Relief in the File tab of the ribbon, next to Sculpt. The panel opens with the project stored in the current document, or with an empty one — and if you select closed curves before running the command, they are picked up as the input of the first operation you add.\n\n*","metadata":{"title":"Relief","section":"Relief","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#relief","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#relief","collection":"docs7","hash":"22e348246becf920dd77a2295cf371f4","indexed_by":"docs-index"}},{"content":"Relief — The workbench and the project\n\nEverything is computed on a rectangular grid — the workbench — that sits on a plane, with heights measured along its normal. Open Project Settings (in the Advanced** section at the bottom of the panel) to set it up:\n\n* Width / Height — the size of the workbench in millimetres. Default 50 × 50.\n* Resolution — grid nodes along the longer side: 512, 1024, 2048 or 4096. Cells are always square. Higher resolution means finer detail and heavier computation, so work at 512–1024 and raise it for the final result. 4096 is coin-grade: a 16-million-node grid whose baked mesh runs to tens of millions of faces, so reserve it for CNC height-map exports and small parts.\n* Output — what the command builds:\n* Mesh — the relief surface on its own, open.\n* Thickness — a closed solid: the relief plus a base offset below it, ready for 3D printing or for a boolean.\n* Cap Distance — how far below the relief that base sits, in millimetres.\n* Delete Base — leaves out the flat bottom face.\n* Workbench — the plane the grid lives on. Set it to World XY, to the Active CPlane, place it by hand with Pick Center and Pick Area, or fit it with From Objects: select the objects the relief is for and the workbench keeps its orientation, takes their bounding box as size and centre, and sits at their lowest point so projected heights start at zero.\n\nPick Area is the fastest way to start: draw the rectangle over the part of the design you want to carve and the workbench takes that position, size and plane.\n\n*","metadata":{"title":"Relief","section":"The workbench and the project","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#the-workbench-and-the-project","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#the-workbench-and-the-project","collection":"docs7","hash":"36007f870e2055276e3408f7463d20f2","indexed_by":"docs-index"}},{"content":"Relief — The operation stack\n\nThe Operations section is the project itself: a list of cards, computed from top to bottom, each one contributing height to the field.\n\nAdd an operation with the buttons at the top of the panel:\n\nProfile The classic puffing: closed curves filled with a height profile that runs from the edge inwards. Monograms, cabochon-like domes, leaf shapes.\n\nExtrude Closed curves raised to a constant height — a flat plateau with vertical walls. Negative height engraves instead.\n\nImage A grayscale image drives the height: white is highest, black is lowest. Photos, logos, scanned engravings.\n\nTexture A tileable texture from the Textures 3D library, repeated over the workbench: knurls, hammering, fabric, guilloché.\n\nGeometry Existing document objects (meshes, breps, extrusions, SubDs) projected top-down; their height above the plane becomes the relief.\n\nCarbon A rubbing: load an image and brush it onto the relief. The texture appears only where you paint, so you rub a knurl or a hammered finish exactly where you want it.\n\nSculpt Freehand brush strokes that add or remove height where you paint.\n\nSmooth A painted blur: softens everything below it in the stack, only where you brush.\n\nEach card carries its colour, its index, its name and a summary of its parameters, plus four buttons: visibility (compute it or skip it), edit, duplicate and delete. Below the list, Move up / Move down reorder the selected operation — which matters, because combine modes are applied in order — and Hide / Show toggles the live preview in the viewport.","metadata":{"title":"Relief","section":"The operation stack","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#the-operation-stack","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#the-operation-stack","collection":"docs7","hash":"9a33f3ce36236dcab4cfc9f554085871","indexed_by":"docs-index"}},{"content":"Relief — Editing an operation\n\nClick a card's edit button and the panel switches to that operation's parameters. Change what you need and confirm with ✓, or discard with ✕. The preview updates as you type.\n\nOperations driven by curves or objects stay live-linked to the document: they reference the geometry by id, so editing or moving a curve updates the relief on the next recompute. If you delete the referenced geometry the operation is flagged as broken and skipped — nothing crashes, and re-picking the curves brings it back.\n\n*","metadata":{"title":"Relief","section":"Editing an operation","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#editing-an-operation","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#editing-an-operation","collection":"docs7","hash":"21f9d2b0a5c2fbe884928a4fc1ef66b8","indexed_by":"docs-index"}},{"content":"Relief — Profile\n\nThe classic \"inflate\" operation: closed curves are filled with a cross-section evaluated over the distance to the curve edge.\n\n* Profile — the cross-section shape. Four presets ship with RhinoArtisan:\n* Round — quarter circle: vertical takeoff at the edge, flat at the centre.\n* Chamfer — a straight 45° slope.\n* Smooth — tangent at both ends, the classic pillow.\n* Plateau — rises over the first stretch and then stays flat.\n* Edit — opens the Profile Editor to draw your own.\n* Inflate — how the profile spans the shape:\n* Inflate — stretched so it peaks exactly at the deepest point inside the curves, whatever their width.\n* Fixed Width — the profile spans a set distance from the edge inwards, and stays flat beyond it.\n* Height (mm) — peak height added on top of the starting height.\n* Profile Width (mm) — the span used by Fixed Width.\n* Starting Height (mm) — Z offset where the profile takes off, so a shape can start from an existing plateau.\n* Feather (mm) — blend distance at the mask edge; `0` is a hard edge.","metadata":{"title":"Relief","section":"Profile","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#profile","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#profile","collection":"docs7","hash":"8e8945dbfc9d67a9df4c35f328380d10","indexed_by":"docs-index"}},{"content":"Relief — Extrude\n\nClosed curves raised to a flat plateau with vertical walls — negative height engraves instead.\n\n* Height (mm) — extrusion height. Negative values engrave.\n* Feather (mm) — softens the wall over that distance, which also lets the combine modes blend the border into what is underneath.\n\nImage\nA grayscale image drives the height: white is highest, black is lowest.\n\n* Load Image — picks the file (`.png`, `.jpg`, `.jpeg`, `.bmp`, `.tif`,\n`.tiff`). The image is referenced by path, so editing it outside Rhino and recomputing brings the new version in.\n* Height (mm) — the height that pure white reaches.\n* Invert — flips the mapping, so black becomes the high point.\n* Scale — multiplier over the fitted size.\n\nWith no curves selected the image is centred on the workbench keeping its aspect ratio. If you select closed curves when adding it, the image fits their bounding box and is clipped to their interior — which is how you drop a photo inside a medal outline.","metadata":{"title":"Relief","section":"Extrude","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#extrude","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#extrude","collection":"docs7","hash":"88fad681bf13b65d5ce0c68fcc560637","indexed_by":"docs-index"}},{"content":"Relief — Texture\n\nA tileable texture repeated over the workbench: knurls, hammering, fabric, guilloché.\n\n* Texture — picked from the Textures 3D library.\n* Height (mm) — height at pure white.\n* Tiles U / Tiles V — how many times the texture repeats across the workbench.\n* Invert — flips high and low.\n\nAs with images, referenced closed curves clip the texture to their interior.","metadata":{"title":"Relief","section":"Texture","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#texture","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#texture","collection":"docs7","hash":"7abf4d91451586f2d1edd0a5ea20fbf5","indexed_by":"docs-index"}},{"content":"Relief — Geometry\n\nExisting document objects projected top-down into the height field.\n\n* Pick the objects — meshes, breps, extrusions or SubDs — and their height above the workbench plane becomes the relief.\n* Feather (mm) — blend distance at the silhouette edge.\n\nCarbon\nA rubbing: an image laid over the workbench that shows only where you brush it on. Where Image stamps the whole picture at once, Carbon lets you rub a texture onto exactly the areas you want, as heavily as you want, and rub it off again.\n\n* Load Image — the image whose relief the brush reveals (`.png`, `.jpg`,\n`.jpeg`, `.bmp`, `.tif`, `.tiff`). It is centred on the workbench keeping its aspect ratio, like Image, and referenced by path.\n* Height (mm) — how tall pure white is.\n* Invert — flips brightness, for pictures where the raised parts are dark.\n* Scale and Offset X / Y (mm) — place the picture: Scale multiplies the fitted size (1 fills the workbench), the offsets move its centre along the workbench axes. With Show Image on, the draped guide follows so you see where the texture will land before rubbing.\n* Base Radius (mm) — strips the image's broad tones before rubbing: the lighting, the vignette, the curvature of whatever was photographed. Anything wider than this radius is treated as tone and removed, anything finer is kept as grain. Start around the size of the pattern; 0 keeps the image as it is.\n* Radius / Strength — the brush, as in Sculpt. Every pass adds coverage until the texture is fully there; Ctrl rubs it back off.\n\nTypical use: a photo of a hammered or knurled surface rubbed over a Profile dome with Add or Multiply, only across the band you want textured.","metadata":{"title":"Relief","section":"Geometry","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#geometry","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#geometry","collection":"docs7","hash":"3f3bbefd4c662e77752ea798993e7cf1","indexed_by":"docs-index"}},{"content":"Relief — Sculpt\n\nFreehand detailing, painted directly on the relief in the viewport.\n\n* Radius — brush size in millimetres.\n* Strength — how much each pass adds.\n* Hold Ctrl while painting to invert the brush and carve instead of raise.\n\nStrokes live inside the operation, so a sculpt stays editable, reorderable and combinable like any other layer. Use Undo stroke / Redo stroke in the panel header to step through strokes.","metadata":{"title":"Relief","section":"Sculpt","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#sculpt","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#sculpt","collection":"docs7","hash":"af689b57bc0e9d4f0d57b9fb6186daab","indexed_by":"docs-index"}},{"content":"Relief — Smooth\n\nThe same brush, but instead of adding height it paints a smoothing mask: everything below this operation in the stack gets blurred where you painted.\n\n* Radius / Strength — the brush, as above.\n* Smooth Radius (mm) — how wide the blur kernel is.\n\nBecause it filters what is underneath, its position in the stack matters: put it last to soften the whole relief, or in the middle to soften only the operations below it.\n\n*","metadata":{"title":"Relief","section":"Smooth","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#smooth","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#smooth","collection":"docs7","hash":"ce8729d6f197ab59c37af8800041f986","indexed_by":"docs-index"}},{"content":"Relief — Combine modes\n\nEvery operation merges into the field with a rule, chosen in the Combine dropdown. The operation's mask always attenuates the effect, so a feathered edge blends smoothly in any mode.\n\n| Mode | Result |\n| --- | --- |\n| Add | Heights are added — the default, and what you want for stacking detail. |\n| Subtract | Heights are subtracted: the operation carves into what is below. |\n| Union Highest | Keeps whichever is taller, the operation or what is underneath. |\n| Union Lowest | Keeps whichever is lower. |\n| Absolute | No merge: the operation's heights replace what is underneath, inside its mask. |\n| Multiply | Heights are multiplied — the operation modulates an existing relief, which is how you fade a texture over a dome. |\n\nCombine modes are order-dependent: the same three operations in a different order give a different relief. That is what the Move up / Move down buttons are for.\n\n*","metadata":{"title":"Relief","section":"Combine modes","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#combine-modes","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#combine-modes","collection":"docs7","hash":"04f61044ef488450f47c6a322a2c53ea","indexed_by":"docs-index"}},{"content":"Relief — Profile Editor\n\nEdit, next to the profile dropdown of a Profile operation, opens the editor where the cross-section is drawn by hand.\n\n* Click on the graph adds a point, drag moves it, right-click deletes it.\n* The left edge of the graph is the curve edge; the right edge is the deepest point inside the shape.\n* Smooth interpolates the points with a smooth curve; unchecked, they are joined by straight segments.\n* Give it a Name and click Save to add it to Saved Profiles — your library, kept in the RhinoArtisan user folder and available in every project. Delete removes the selected saved profile.\n\n***","metadata":{"title":"Relief","section":"Profile Editor","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#profile-editor","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#profile-editor","collection":"docs7","hash":"4372adea1d17b776de54d4e1e280be69","indexed_by":"docs-index"}},{"content":"Relief — Finishing the relief\n\nThe panel previews the relief live in the viewport while you work, at a reduced resolution so editing stays fluid. When the stack is right:\n\n* Accept recomputes the project at full resolution and adds the result to the document — a mesh, or a closed solid, depending on the Output setting. The project stays saved in the file, so you can run the command again later, adjust an operation and build a new version.\n* Export Heightmap (TIFF 16-bit), in the Advanced section, writes the height field as a 16-bit grayscale TIFF — for CNC, for external software, or as the input image of another relief.\n\nWork at 512 while composing the stack and switch to 1024, 2048 or 4096 in Project Settings before accepting. Brush strokes are stored at full project resolution, so sculpting on the fast preview loses no detail.","metadata":{"title":"Relief","section":"Finishing the relief","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#finishing-the-relief","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#finishing-the-relief","collection":"docs7","hash":"a8457ddc9b0810e8071c772d29340e26","indexed_by":"docs-index"}},{"content":"Relief — Tips\n\n* Start from the outline. A Profile operation on the piece's silhouette gives the base dome; everything else — texture, lettering, sculpted detail — stacks on top of it.\n* Feather is what makes it look cast, not cut. A fraction of a millimetre on the edges removes the digital step and lets the operation blend with the rest.\n* Use Multiply to tame a texture. A knurl at full height over a whole band is noise; multiplied by a soft profile it fades towards the edges like real hand-work.\n* Keep the curves in the document. They stay linked, so refining the outline later refines the relief — no need to rebuild the operation.\n* Relief and Sculpt complement each other. Relief gives you a controlled, parametric 2.5D result; Sculpt works the mesh freely in 3D afterwards.","metadata":{"title":"Relief","section":"Tips","url":"https://www.rhinoartisan.com/docs/7/organic/relief/#tips","source":"https://www.rhinoartisan.com/docs/7/organic/relief/#tips","collection":"docs7","hash":"7fcdf67d996e30439e486fc05f9fb645","indexed_by":"docs-index"}},{"content":"Sculpt — Sculpt\n\nSculpt turns any solid, surface, SubD or mesh into a piece of digital clay. You paint on it with a brush and the surface deforms under the cursor, the way you would work wax on the bench. It is made for the organic part of a design — a face on a signet, a wave in a shank, the muscle of a panther — where parametric commands get in the way.\n\nRun `ArtisanSculpt`, or click Sculpt on the File tab. Anything already selected is picked up by the panel.\n\nSculpting always works on a mesh: meshes are duplicated, and surfaces, polysurfaces, extrusions and SubDs are converted to a render-quality mesh first. Your original object is hidden, not touched, until you confirm — so you can always back out.","metadata":{"title":"Sculpt","section":"Sculpt","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#sculpt","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#sculpt","collection":"docs7","hash":"03e0153ac1b0e86a9a68615b162bdad5","indexed_by":"docs-index"}},{"content":"Sculpt — The brushes\n\nEight brushes, one click each. The active one is framed in orange.\n\n| Brush | What it does |\n| --- | --- |\n| Push / Pull | Moves the region along the surface normal — the steady, general-purpose brush. |\n| Clay | Builds material up in even layers toward a plane over the surface, like adding wax with a spatula. |\n| Smooth | Relaxes each vertex toward its neighbours, melting away lumps and facets. |\n| Inflate | Pushes every vertex along its own normal — swells and rounds rather than translating. |\n| Flatten | Presses the region toward its average plane, for crisp planar faces. |\n| Pinch | Draws vertices toward the centre of the brush along the surface, sharpening ridges and creases without denting them. |\n| Grab | Captures the region on click and drags it with the cursor — pair it with the Hard falloff and the core moves rigidly. |\n| Mask | Paints protection instead of deforming: masked areas resist every other brush. |\n\nThree modifiers work mid-stroke, and the panel keeps them on screen —\n*Ctrl: invert · Shift: smooth · [ ] or + − : radius*:\n\n* Ctrl inverts the brush — push becomes pull, Clay carves instead of building, Mask erases. The brush circle turns blue while inverted.\n* Shift switches temporarily to Smooth; release and your brush is back.\n* [ and ] (or − and +) shrink and grow the radius, and only react while the brush is over the mesh — typing elsewhere in Rhino is never intercepted.\n\nStrokes are spaced by distance travelled, not by time — a slow, careful pass and a fast one deposit exactly the same amount of material.\n\nThe brush selects its region through the surface, not through space: the affected area is grown from the point you touch, across connected faces. Brush the outside of a shank and the inner wall beneath it stays exactly where it was.","metadata":{"title":"Sculpt","section":"The brushes","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#the-brushes","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#the-brushes","collection":"docs7","hash":"09f40df20135e60b2b6ff286493a2e33","indexed_by":"docs-index"}},{"content":"Sculpt — Brush parameters\n\n* Radius — the brush size in model units, auto-sized to the object when the session starts. The slider is tuned so half its travel covers the fine end of the range — precision where jewelry lives.\n* Strength — how hard each stroke bites, 5–100%, default 50%.\n* Stabilize — the lazy mouse: at 0% the brush follows your cursor raw; as you raise it, the brush trails a steadied path behind the cursor, for clean continuous lines along a shank or a crease.\n* Falloff — how the effect fades from centre to edge: Smooth (soft everywhere, the default), Hard (a firm plateau in the inner half, then a soft drop), or Constant (full effect across the whole radius).","metadata":{"title":"Sculpt","section":"Brush parameters","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#brush-parameters","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#brush-parameters","collection":"docs7","hash":"7c1030d7073984dca2092ade46a631cb","indexed_by":"docs-index"}},{"content":"Sculpt — Mesh Detail\n\nResolution, exactly where you need it and nowhere else:\n\n* Dynamic Detail — while you brush, the mesh refines itself under the brush until no edge is longer than Detail, and cleans up what falls below it. Detail appears where you sculpt; the rest of the mesh stays light.\n* Detail (mm) — the target edge length, 0.05–1.00 mm. It is an absolute size, so it maps directly to the smallest feature you intend to print.\n* Densify — remeshes the whole object to roughly double resolution in one pass, when the canvas as a whole is too coarse.\n* Simplify — halves the face count with the same reducer as the Decimators, when the mesh has grown heavier than the design needs.\n\nDensify and Simplify rebuild the mesh: they clear the stroke history, and Simplify does not preserve a painted mask. Do them between phases of work, not in the middle of one — and keep an eye on the live face counter in the Mesh section.","metadata":{"title":"Sculpt","section":"Mesh Detail","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mesh-detail","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mesh-detail","collection":"docs7","hash":"5686b135e92038cfd3c97c25604c1777","indexed_by":"docs-index"}},{"content":"Sculpt — Symmetry\n\n* Mirror — None (default), Top - XY, Front - ZX or Side - YZ. Every stroke is repeated at the mirrored point, with the ghost circle showing where.\n* Mirror Display — Section Only draws just the seam where the plane crosses the mesh; Section + Plane (default) adds the translucent plane itself.\n* Plane Color — the colour of that plane, blue by default.","metadata":{"title":"Sculpt","section":"Symmetry","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#symmetry","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#symmetry","collection":"docs7","hash":"e704624ff3ea68f44913f044a0884634","indexed_by":"docs-index"}},{"content":"Sculpt — Radial\n\n* Radial Copies — repeats every stroke around an axis, 1 to 32 copies (1 = off). With a mirror active, the mirror of every copy comes along too.\n* Axis — X, Y or Z (the default, since rings are built on the world Top plane).\n\nRadial is what rosettes, bezels, and everything built around a centre are sculpted with: model one petal, and the flower follows.","metadata":{"title":"Sculpt","section":"Radial","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#radial","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#radial","collection":"docs7","hash":"121e32ee65c627eb053e776d1661979b","indexed_by":"docs-index"}},{"content":"Sculpt — Mask\n\nMasked vertices are frozen — no brush moves them. Paint the mask by hand with the Mask brush (it shows as a blue-gray tint), or use the section's tools:\n\n* Mask Gems — automatically masks every vertex near a gem in the document, fading out over a short distance, and reports how many vertices around how many gems. It only ever adds protection, so it stacks with what you painted by hand.\n* Blur Mask — softens the mask border for a gradual transition.\n* Invert Mask — swaps protected and free areas.\n* Clear Mask — removes it all.","metadata":{"title":"Sculpt","section":"Mask","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mask","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mask","collection":"docs7","hash":"e8d3583b25d04a04949addf5f097419d","indexed_by":"docs-index"}},{"content":"Sculpt — Mesh\n\nThe bookkeeping section, and two habits worth keeping:\n\n* Mesh info — the live vertex and face count, updated after every stroke.\n* Weight — the live weight of the piece in grams (using the document's metal), and once you have removed material, how many grams and what percentage you have saved since the session started.\n* Delete Original — on by default: confirming replaces the source object. Switch it off to keep the original alongside the sculpt.\n* Show Wire — draws the wireframe over the preview (it hides itself during each stroke to keep the brush fluid).\n* Mesh Color — the working colour of the clay, gold by default.","metadata":{"title":"Sculpt","section":"Mesh","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mesh","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#mesh","collection":"docs7","hash":"57a0e9b51f068f190366a53f00f756fa","indexed_by":"docs-index"}},{"content":"Sculpt — Strokes, defaults and finishing\n\n* Undo Stroke / Redo Stroke — the header buttons walk back and forward through your last 16 strokes, independent of Rhino's undo.\n* Save defaults — stores the whole setup — brush, falloff, symmetry, radial, detail, colours — as your starting point for every future session.\n* Accept (✓) — bakes the sculpt as a single undo step. The result is a Sculpt element: it appears in the Outliner, and running `ArtisanEdit` on it later reopens the sculpting session on the same mesh, with your setup and painted mask restored — the clay never really dries.\n\nGoldsmith's Tip: before sculpting anywhere near a set stone, press Mask Gems — the seats freeze and you can work the metal around them as freely as you like. And if the piece is symmetric, turn the mirror on from the very first stroke: symmetry added afterwards is a promise, symmetry sculpted from the start is a fact.","metadata":{"title":"Sculpt","section":"Strokes, defaults and finishing","url":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#strokes-defaults-and-finishing","source":"https://www.rhinoartisan.com/docs/7/organic/sculpt/#strokes-defaults-and-finishing","collection":"docs7","hash":"528f6fc7f02c98d8d958db0419f351a1","indexed_by":"docs-index"}},{"content":"Pricing\n\nA design is not finished until it has a price. This section covers the whole chain: the settings every cost is calculated from, the automatic breakdown that reads your model and prices it component by component, real certified stones from Nivoda's stock, and the company profiles — markup and taxes — that turn a cost into a quote.\n\nConfigure once, and every design prices itself:\n\nBreakdown Details The automatic cost breakdown of the design, exportable to Excel, JSON or natural language.\n\nHow to Set Your Prices The Breakdown Settings panel: metals, processes and the rules every cost is calculated from.\n\nNivoda Your preferences for certified stones, matched against Nivoda's live stock.\n\nMarkup Your margin policy, by cost band.\n\nTaxes Your company's tax profile: jurisdiction, IDs, and whether tax is baked into prices.\n\nThe breakdown commands on the ribbon's Drafting tab — Breakdown Metals, Gems, Processes and Extras — write these figures onto the drawing itself, so the report sheet and the quote always tell the same story.","metadata":{"title":"Pricing","url":"https://www.rhinoartisan.com/docs/7/pricing/","source":"https://www.rhinoartisan.com/docs/7/pricing/","collection":"docs7","hash":"de5bc6465fac285d4290399581570877","indexed_by":"docs-index"}},{"content":"Breakdown Details — Breakdown Details\n\nBreakdown Details is where the piece gets its price: press Create and the panel reads the model — metal volumes by layer, every stone, the processes the piece needs — and builds the complete cost breakdown, using the rates you configured in How to Set Your Prices. Everything is shown in your currency, and the breakdown is saved inside the document, so it travels with the file.\n\nOpen it with `ArtisanBreakdownDetails`, or from the Breakdown Details button in the ribbon's File tab.\n\nFour buttons in the header run the panel: Create computes (or recomputes) the breakdown from the current model, Export saves it as a file, Delete clears it after confirmation, and Help opens this page. The numbers do not chase your edits on their own — model, then press Create, and the breakdown catches up.","metadata":{"title":"Breakdown Details","section":"Breakdown Details","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#breakdown-details","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#breakdown-details","collection":"docs7","hash":"ef8112a3fb54d306a925879ee6b65702","indexed_by":"docs-index"}},{"content":"Breakdown Details — What the breakdown shows\n\nThe panel opens with the totals — the overall price and the subtotal of each section — and the date the breakdown was created. Below, each section appears only when it has something to say:\n\n* Metals — each metal with its total cost and the figures behind it: cost per gram, net weight, waste, total weight, wax weight, volume, and surface area. Metals come from the Metal 01/02/03 layers and the alloys assigned in the document settings.\n* Gems — the stone table: setting type, color and shape, quantity, size, sieve, carats, and cost per row, with totals at the bottom. The setting type is editable right here — switch a row from Prong to Pave and the setting labour in Processes re-prices instantly.\n* Processes — per metal: printing (with the print size), casting (CFP), and two more editable choices — the finishing (Brushed, Sandblasted, Hammered…) and rhodium. Then the setting labour derived from the gem table, and your own additional processes: click Add… to name one and price it, click a price to change it, right-click a name to delete it.\n* Extras — anything else that lands on the invoice, added and edited the same way.","metadata":{"title":"Breakdown Details","section":"What the breakdown shows","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#what-the-breakdown-shows","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#what-the-breakdown-shows","collection":"docs7","hash":"66b444ccb0b92c43d2d2060348ffd85c","indexed_by":"docs-index"}},{"content":"Breakdown Details — Certified diamonds, quoted live\n\nStones at or above the carat threshold you set in How to Set Your Prices are treated as certified diamonds and get their own section. With a Nivoda account connected (see Integrations), each one is quoted against Nivoda's live stock through your Nivoda preferences: same shape, matching carat window, natural or lab-grown as the document says, and only stones that pass your quality filter — ordered by price, up to five offers per stone.\n\nEach certified stone appears as a card with the real offer: carats, price, the color–clarity–cut–polish–symmetry line, the certificate (lab and number), and the delivery estimate. Next and Previous browse the offers, and Web opens the stone on Nivoda to see its image, video, and full details.\n\nWithout a Nivoda account — or when no stone in stock passes your filter — the diamond is still listed with its carats, just without a price, and the command line tells you why.","metadata":{"title":"Breakdown Details","section":"Certified diamonds, quoted live","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#certified-diamonds-quoted-live","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#certified-diamonds-quoted-live","collection":"docs7","hash":"3860c687d1c19e86de81ee2fcc6b4a32","indexed_by":"docs-index"}},{"content":"Breakdown Details — Export\n\nExport saves the finished breakdown in the format the next tool needs:\n\n* Excel (.xlsx) — a formatted spreadsheet: the design's info block (client, PO, style, designer), totals, and the full metals, gems, processes and extras detail.\n* JSON (.json) — the complete breakdown object, for ERPs, automations, or backend processes.\n* Natural language (.txt) — a readable prose report of the same numbers, intended for training AI assistants on your real data and automated documentation:\n\n```\nHere is a detailed cost summary of your jewelry design:\n\nMETALS\n• The design includes 3,47 grams of gold white 18, priced at 70,12 per gram. This metal contributes a total of 243,46 EUR.\nTotal metal cost: 243,46 EUR.\n\nGEMSTONES\n• 10 gemstones of size 2,60 mm, totaling 0,64 carats. Price per carat: 620,00. Subtotal: 396,80 EUR.\nTotal gemstone cost: 396,80 EUR.\n\nCERTIFIED DIAMONDS\n• Certified diamond (1,50 ct, shape ROUND, clarity , color FANCY) priced at 1511,35 EUR.\nTotal certified diamond cost: 1511,35 EUR.\n\nMANUFACTURING PROCESSES\n• Metal processing: printing cost 15,00, CFP cost 173,60, finishing 0,00, rhodium 0,00.\n• Setting 10 stones using Prongs: total 90,00 EUR.\nTotal process cost: 278,60 EUR.\n\nEXTRAS\nExtra components cost: 0,00 EUR.\n\nOVERALL TOTAL\nThe complete piece has a final total cost of 2430,21 EUR. This price includes metals, gemstones, certified diamonds, all manufacturing processes, and any additional components\n```\n\nGoldsmith's Tip: The breakdown is only as honest as its settings. Before quoting from it, open How to Set Your Prices and check when the metal quotations were last updated — if the market has moved since, update them first and press Create again.","metadata":{"title":"Breakdown Details","section":"Export","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#export","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-details/#export","collection":"docs7","hash":"92aa14e4501f6ddea4350926e372c652","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Breakdown Settings\n\nBreakdown Settings is where your workshop's real numbers live: what you pay for metal, what you charge for printing, casting, finishing and setting, and how long each step takes. Everything the Breakdown Details panel, the Technical Chart and the Report show is calculated from this dialog — set it once, correctly, and the rest of RhinoArtisan prices your work on its own.\n\nOpen it from Manufacturing → Breakdown Settings, or run\n`ArtisanBreakdownSettings`. The window title shows when the settings were last updated, a useful reminder when metal has moved since you filled them in.\n\nThe eight icons across the top are the eight tabs, and the buttons along the bottom are the same everywhere:\n\n* Set Default Values — restores the factory numbers, a clean starting point.\n* Validate Values — checks the settings for gaps and inconsistencies before you rely on them.\n* ? — opens this page.\n* ✕ / ✓ — discard or save.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Breakdown Settings","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#breakdown-settings","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#breakdown-settings","collection":"docs7","hash":"6552b88e26515e73aed6021e7b65baec","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Info\n\nWho the breakdown belongs to. The name, location and currency** you set here head every report and drive how prices are displayed.\n\n* Name and Notes — the manufacturing centre this configuration belongs to, and any internal remark about it.\n* City, State, Zip Code, Country.\n* Currency — the currency every price in RhinoArtisan is expressed in.\n\nFill this in even when you work alone: the report is a document you hand to clients, and it carries these details.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Info","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#info","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#info","collection":"docs7","hash":"013ded0ce45b7ebb83b5cb6efbbc1df5","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Metals\n\nThe tab with the shortest shelf life — metal moves every day.\n\nMarkets takes the reference price for gold, silver, platinum and palladium**, and says how to read it:\n\n* Market currency and Unit — the currency and unit the four prices are typed in: LBMA quotes in USD per troy ounce, an Indian bullion dealer in ₹ per gram. The labels follow your choice (`$/oz`, `₹/g`...).\n* Exchange rate — how many units of your company currency (Info tab) one unit of the market currency is worth. Leave it at 1 when both are the same.\n* Duty / Levy (%) — import duty or levy added on top of the market price, one percentage per metal because they usually differ. Empty or 0 adds nothing.\n\nUnder each metal the panel shows the effective price: your currency per gram with the exchange rate and the duty applied. That is the number Compute multiplies by the makings to fill the price per gram of every alloy below. The LBMA Market Prices link opens the London Bullion Market Association's official quotations so you can copy today's numbers.\n\nThe duty is remembered per alloy, so a breakdown marked Export (no duty) in the Breakdown panel's Metals section costs the metal without it, while a Domestic one keeps it — same market price, two costs.\n\nMetals is the alloy table itself, one row per alloy — 24K, 22K yellow, 18K yellow, white, rose and green, and down through the list:\n\n* Makings — the alloy in parts per thousand. 18K is nominally 750, but if your workshop alloys at 752 to be safe above the hallmark, that is the number to put here.\n* Density — used to turn the volume of the model into weight.\n* Price (gram) — computed from the market quotation, and editable if you buy at a different price.","metadata":{"title":"How to Set Your Prices","section":"Metals","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#metals","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#metals","collection":"docs7","hash":"0fd4304e25911557c3e4b7d471b957eb","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Metals\n\nFurther down the tab you can also declare the material loss expected during manufacturing, and the palladium content of your 14K and 18K white alloys, so the cost reflects the formula you actually use.\n\nWorking with alloys that are not on the list? Options → Artisan → Custom Metal List imports your own metals from a CSV, and they show up here and in every breakdown.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Metals","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#metals","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#metals","collection":"docs7","hash":"551ce5d3aa30702b010f825b504a8286","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Diamonds\n\nWhat you pay for melee, per shape and per quality.\n\nThe row of small icons under the tab bar selects the shape** — round, princess, oval, pear, emerald and marquise — and each one keeps its own price table, because a 2 mm princess and a 2 mm round are not the same money.\n\nFor the selected shape:\n\n* Enable Mode Sieve — switch the ranges from millimetres to standard sieve sizes, if that is how your supplier sells.\n* Quality — the melee quality this table prices. Keep one table per quality you buy and RhinoArtisan applies the right one to the stones in the design.\n* Notes — a free field for the supplier, the certificate or whatever you need to remember about this price list.\n* Range 1 to Range 6 — a From and To size and the Cost per carat that applies between them.\n\nAny stone in the design that falls inside a range is priced at that cost per carat, against its own weight. Sizes outside every range are not priced, so make sure the ranges cover what you actually set.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Diamonds","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#diamonds","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#diamonds","collection":"docs7","hash":"0223987f8416117299000ce2e8a69cde","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Printing\n\nWhat it costs to grow the piece in wax or resin.\n\nSix brackets, each defined by a maximum X, Y and Z in millimetres and a Price. RhinoArtisan measures the design's bounding box and charges the first bracket it fits into — the way a bureau quotes by build volume.\n\nOrder the brackets from smallest to largest, and make the last one big enough to catch anything you print, or oversized pieces come through unpriced.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Printing","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#printing","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#printing","collection":"docs7","hash":"387c9686789bf1d2232ddb2b1eddd2c8","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Casting, Finishing and Polishing (CFP)\n\nWorkshop labour: casting the piece and everything that happens after it comes out of the flask — filing, pre-polish, polish.\n\nOne row per type of piece, and for each:\n\n* Breaking value — the weight in grams that separates a light piece from a heavy one.\n* Price below (g) / Price above (g) — what you charge on each side of that threshold.\n* Casting per day / Finishing per day — how many pieces the workshop can cast and finish in a day. These feed the delivery estimate, not the price.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Casting, Finishing and Polishing (CFP)","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#casting-finishing-and-polishing-cfp","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#casting-finishing-and-polishing-cfp","collection":"docs7","hash":"88283747364e385fa2062a861fd498f6","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Additional Processes\n\nThe finishes that are quoted separately.\n\nThe columns are the processes — Rhodium, Brushed, Sandblasted, Hammered and Other for anything of your own — and the rows are the types of piece: rings, earrings, bracelets, necklaces, pendants and other.\n\nFill in what each finish costs on each type of piece. A rhodium bath on a ring and on a necklace are different jobs, and the breakdown prices them as such. Leave a cell at zero and the process is simply free in the breakdown.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Additional Processes","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#additional-processes","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#additional-processes","collection":"docs7","hash":"c5b4d3e9f40178bb171bc2190651e11b","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Gem Settings\n\nSetting labour, by setting type and stone size.\n\nOne row per setting type, in this order: prong, pavé, channel, flush, bezel, pressure, wax setting and other. For each:\n\n* Breaking value (mm) — the stone size that separates cheap from expensive work.\n* Price below / Price above — the labour charged on each side of it. Setting a 1 mm stone and a 4 mm stone are different jobs.\n* Average settings per day — how many stones a setter gets through in a day, which feeds the delivery estimate.\n\nRhinoArtisan already knows which setting each stone in the design belongs to, so these numbers price the piece with no extra input from you.\n\n*","metadata":{"title":"How to Set Your Prices","section":"Gem Settings","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#gem-settings","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#gem-settings","collection":"docs7","hash":"88e0edf9321941d0484e1ca76be99e09","indexed_by":"docs-index"}},{"content":"How to Set Your Prices — Timing\n\nHow long the work takes, so RhinoArtisan can commit to a delivery date.\n\nOne row per stage — Printing, CFP, Additional Processes, Gem Setting, Packing and Security** (the buffer you add for peace of mind) — and for each:\n\n* Days — how many days that stage takes.\n* Weekdays — the days it is actually carried out, so a stage that only runs Monday to Friday does not silently finish on a Sunday.\n\nTogether with the daily capacities from the CFP and Gem Settings tabs, this turns a design into a realistic delivery date instead of an optimistic one.\n\nOnce these eight tabs are filled in, everything else follows on its own: the Breakdown Details panel prices the open design, Markup turns cost into selling price, and the Assistant can answer *\"what does this piece cost?\"* straight from the same numbers.","metadata":{"title":"How to Set Your Prices","section":"Timing","url":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#timing","source":"https://www.rhinoartisan.com/docs/7/pricing/breakdown-settings/#timing","collection":"docs7","hash":"81bb7a610fdc5ba9182dc57372a86aee","indexed_by":"docs-index"}},{"content":"Markup — Markup\n\nMarkup is where your company's margin policy lives: the percentages you add on top of cost, organized by band, saved once and kept with the rest of your pricing settings. Run `ArtisanMarkup` or click Markup in the ribbon and a floating window opens over Rhino.\n\nThe profile starts with an Info section — a Name and Notes, so the profile says whose numbers these are.","metadata":{"title":"Markup","section":"Markup","url":"https://www.rhinoartisan.com/docs/7/pricing/markup/#markup","source":"https://www.rhinoartisan.com/docs/7/pricing/markup/#markup","collection":"docs7","hash":"095c9c2ae82cf55de1404486114c0a03","indexed_by":"docs-index"}},{"content":"Markup — Main stone cost percentage\n\nEleven markup values, one per band of how much of the piece's total cost the main stone represents — from 100%–90% down to 10%–0%. A piece whose center stone dominates the cost usually carries a different margin than one where the stone is incidental; the bands let the margin follow that reality.\n\nThe last value, Only setting markup, is the margin applied when only the setting is sold — the mount without its stone.","metadata":{"title":"Markup","section":"Main stone cost percentage","url":"https://www.rhinoartisan.com/docs/7/pricing/markup/#main-stone-cost-percentage","source":"https://www.rhinoartisan.com/docs/7/pricing/markup/#main-stone-cost-percentage","collection":"docs7","hash":"f449f960e41585e87c8aa3349983b13a","indexed_by":"docs-index"}},{"content":"Markup — Diamonds and gemstones\n\nFive markup bands for loose diamonds and gemstones, from the smallest to stones above the top band — margins on stones sold as stones, rather than as part of a finished piece.\n\nSaving\nAccept stores the profile; Cancel discards the changes. The values are saved globally for your installation — in the same pricing folder as Breakdown Settings and Taxes — not inside the Rhino document, so every design prices against the same policy.\n\nGoldsmith's Tip: Fill the bands from a real sale you were happy with: work out what share of that piece's cost the main stone was, and what margin you actually charged — that pair anchors the band, and the rest of the table follows from it.","metadata":{"title":"Markup","section":"Diamonds and gemstones","url":"https://www.rhinoartisan.com/docs/7/pricing/markup/#diamonds-and-gemstones","source":"https://www.rhinoartisan.com/docs/7/pricing/markup/#diamonds-and-gemstones","collection":"docs7","hash":"6175617996f5b48cf3df27d4dc0078bb","indexed_by":"docs-index"}},{"content":"Nivoda — Nivoda — Preferences\n\nThe Nivoda panel is a quality filter: it defines which certified stones from Nivoda's live stock are acceptable for your work. When Breakdown Details prices a design with a certified gemstone, it searches Nivoda's stock through this filter and suggests the best offers — up to five per stone, ordered by price — so every suggestion is already a stone you would actually buy.\n\nOpen it with `ArtisanNivoda`, or from the Nivoda button in the ribbon's File tab. Every toggle is saved with your settings and applied to the next search — there is nothing to confirm.\n\nThe filter works by exclusion: everything starts unrestricted, and each section only narrows the search once you select something in it. Within a section, selections add up — pick D, E and F in Color and any of the three is acceptable. A section with nothing selected accepts everything.","metadata":{"title":"Nivoda","section":"Nivoda — Preferences","url":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#nivoda--preferences","source":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#nivoda--preferences","collection":"docs7","hash":"95cdabe4e53421d9e5635079720afa2e","indexed_by":"docs-index"}},{"content":"Nivoda — Availability and Shipping\n\nTwo dropdowns at the top set the commercial frame: Availability — whether you search stones that are *Available*, *Not Available*, *On Hold*, or\n*On Memo* — and Shipping, the delivery window you can work with: 3, 5, or 8 days or less.\n\nOptions\nThree toggles for the terms of the purchase:\n\n* Returnable — only stones that can be returned. On by default: when a client changes their mind, the stone can go back.\n* Hide Memo — hide diamonds that are not available to purchase.\n* Treated — include treated natural diamonds.","metadata":{"title":"Nivoda","section":"Availability and Shipping","url":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#availability-and-shipping","source":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#availability-and-shipping","collection":"docs7","hash":"2f14bb07b3c4fa6df3cb142322626900","indexed_by":"docs-index"}},{"content":"Nivoda — Color\n\nThe full color scale as diamond-shaped toggles: the single grades D to N , the lower ranges O–P , Q–R , S–T , U–V , W–X , Y–Z , and Fancy Colour for colored diamonds. Select the window you sell in. Options · Color · Clarity · Cut\n\nClarity\nEvery clarity grade with its own icon, from FL (flawless) and IF down through VVS, VS and SI to I1–I3.","metadata":{"title":"Nivoda","section":"Color","url":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#color","source":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#color","collection":"docs7","hash":"d1dc719de56da85eee80d93b5ffb3ded","indexed_by":"docs-index"}},{"content":"Nivoda — Cut\n\nThe cut grades: 8X, Ideal, Excellent, Very Good, Good, Fair, and Poor.\n\nCertificate\nWhich laboratory's word you accept: Any Cert takes every certified stone regardless of lab, Non-Cert includes uncertified stones, Supplier Cert accepts the supplier's own certificate, and the individual labs — GIA, IGI, HRD, GCAL, EGL, DBIOD, GSI, SGL, AGS, EGLISR — let you restrict to the ones you trust. Clarity · Cut · Certificate","metadata":{"title":"Nivoda","section":"Cut","url":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#cut","source":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#cut","collection":"docs7","hash":"6b4a54ce3455bbe68959ecd22c89e1e6","indexed_by":"docs-index"}},{"content":"Nivoda — Advanced Filter\n\nThe funnel button in the panel's header reveals four more sections for the finest sieve:\n\n* Cut, Polish & Symmetry — the combined trade grades: 3EX, EX CUT, 3VG+, and Heart and Arrow.\n* Polish and Symmetry — Excellent to Poor, graded separately.\n* Fluorescence — from None to Very Strong.\n\nGoldsmith's Tip: Set the filter to the window you actually quote by — say F–H color, VS clarity, Excellent cut, GIA or IGI — and leave it alone. From then on, every certified price that Breakdown Details suggests is a stone you could put in front of the client without checking it first.","metadata":{"title":"Nivoda","section":"Advanced Filter","url":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#advanced-filter","source":"https://www.rhinoartisan.com/docs/7/pricing/nivoda/#advanced-filter","collection":"docs7","hash":"6440e8990137dfded058870a5aae61b5","indexed_by":"docs-index"}},{"content":"Taxes — Taxes\n\nTaxes is your company's tax profile: where you sell from, your tax identification, and whether tax is part of your prices. Run `ArtisanTaxes` or click Taxes in the ribbon and a floating window opens over Rhino.\n\nThe profile starts with an Info section — a Name and Notes — and then a Mode that matches how your jurisdiction works:\n\n* We are a European company — pick your EU country and enter your VAT ID.\n* We are an American company — pick your state and enter your Sale Tax ID.\n* We are a Canadian company — pick your province and enter your Sale Tax ID.\n* Select a country — for everywhere else: pick the country and enter a unique tax percentage to apply.\n\nFor the VAT-style modes — European and custom country — an extra checkbox, Include taxes to pricing, records whether the tax is baked into the sale price rather than added at the till, which is how VAT jurisdictions quote to consumers.\n\nEach mode keeps its own data, so switching modes never loses what you typed in another one.","metadata":{"title":"Taxes","section":"Taxes","url":"https://www.rhinoartisan.com/docs/7/pricing/taxes/#taxes","source":"https://www.rhinoartisan.com/docs/7/pricing/taxes/#taxes","collection":"docs7","hash":"1cc4c2913bc3a5ce987d82facf9c888d","indexed_by":"docs-index"}},{"content":"Taxes — Saving\n\nAccept stores the profile; Cancel discards the changes. Like Markup, the profile is saved globally for your installation — in the same pricing folder as Breakdown Settings — not inside the Rhino document.","metadata":{"title":"Taxes","section":"Saving","url":"https://www.rhinoartisan.com/docs/7/pricing/taxes/#saving","source":"https://www.rhinoartisan.com/docs/7/pricing/taxes/#saving","collection":"docs7","hash":"b42a88970c48c73a1a46e69e52fd2bcc","indexed_by":"docs-index"}},{"content":"Productivity\n\nDesigning is only half the day. This section covers the tools that give you the other half back: finding any design you ever made in seconds, knowing where the hours actually went, and asking for anything in plain language.\n\nFile Search Find any design in your archive by file name, or describe it — type, metal, stones, carat, price — and Smart search finds it.\n\nTime Tracker How long each design actually took — tracked automatically, exportable to CSV.\n\nAssistant The chat that knows jewellery and your design: price it, resize it, build on it, prepare it for production — in plain language.\n\nThe AI tools share their accounts, models, costs and privacy rules: see AI in RhinoArtisan.","metadata":{"title":"Productivity","url":"https://www.rhinoartisan.com/docs/7/productivity/","source":"https://www.rhinoartisan.com/docs/7/productivity/","collection":"docs7","hash":"e958f9defbfe9714b3121f63937e8e49","indexed_by":"docs-index"}},{"content":"Assistant\n\nThe Assistant, powered by the best models available.\n\nThe Assistant is an intelligent companion inside RhinoArtisan: a layer that supports, guides and automates the tasks that surround creation, and that builds and changes the design when you ask it to.\n\nIt understands your libraries, walks you through workflows, retrieves technical information, checks production details, prepares reports and helps you reuse what already exists.","metadata":{"title":"Assistant","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/","collection":"docs7","hash":"f88757020a43556ce06170304b2431af","indexed_by":"docs-index"}},{"content":"Assistant — The best models available\n\nThe Assistant reaches its models through OpenRouter, with your own key: Anthropic's Claude by default, and models from OpenAI, xAI, DeepSeek, Qwen and Mistral. Pick the model that fits the task, the budget or your company's policy; see Choosing models.\n\nBecause the model runs online, the Assistant runs on any computer. No workstation, no dedicated GPU, no local setup — if RhinoArtisan runs, the Assistant runs.\n\nThe Assistant used to run a local model through Ollama, which meant a heavy download and a GPU. That is gone: 7.0 talks to hosted models over your own OpenRouter key, so any laptop gets the same answers as a workstation. The older local-model documentation is kept in Labs for reference only.","metadata":{"title":"Assistant","section":"The best models available","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#the-best-models-available","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#the-best-models-available","collection":"docs7","hash":"a1d31140717c996090089916fd5a8c07","indexed_by":"docs-index"}},{"content":"Assistant — What it actually does\n\nThe Assistant is not a chatbot bolted onto the side of RhinoArtisan: it reads the design you have open and it runs the same commands you do.","metadata":{"title":"Assistant","section":"What it actually does","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","collection":"docs7","hash":"847f183486a6322fabc0ffae529d81c9","indexed_by":"docs-index"}},{"content":"Assistant — What it actually does\n\n* It knows the piece. Every message carries a snapshot of the current design — type, metals, ring size, layers — and the Assistant can pull the full picture on demand: elements and their parameters, the pricing breakdown, the Boutique data.\n* It answers questions. *How many stones does it have? What does it weigh? What's the price in 18k white?*\n* It changes the design. Ring size, metal, stone shape and carat, prong count, element parameters — described in plain language, applied to the real parametric model.\n* It builds. Shanks and complete rings, settings such as halos, bezels, prongs and baskets, gems, and gems along a curve or pavé on a surface — with the same parametric builders you use, one step at a time.\n* It prepares the work. Reports, dimensions, STL export for printing, production setup, the breakdown to Excel, render materials and view.\n* It sees pictures and makes them. Attach a photo or a sketch and talk about it, or build from it; ask for a photorealistic render or a try-on image of your design.\n* It knows RhinoArtisan itself. *How do I…?* questions are answered from the official documentation, with links to the pages it used.\n* It follows your rules. Write your company's standards once — minimum prong sizes, default metals, production steps — and the Assistant applies them whenever it builds; see Company standards.\n* You choose how changes are applied. Questions are answered straight away. Changes run as soon as the Assistant makes them in Auto mode, which is on by default; scripts, deletions and new company standards still wait for your Apply. Turn Auto off and every change is proposed first, with Apply and Cancel. Either way, one click under the answer undoes everything it changed; see The Assistant panel.","metadata":{"title":"Assistant","section":"What it actually does","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","collection":"docs7","hash":"67ff460655cc12ae25bca8623f5a2608","indexed_by":"docs-index"}},{"content":"Assistant — What it actually does\n\n* You see what it costs. The panel shows what each conversation has cost, and you can set a daily spending limit.","metadata":{"title":"Assistant","section":"What it actually does","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#what-it-actually-does","collection":"docs7","hash":"06661449aaf96fe83f6e8ff9e73cf91b","indexed_by":"docs-index"}},{"content":"Assistant — Quick start\n\n1. Connect your OpenRouter key in Options → Artisan → Integrations, as described in Accounts and API keys. The Assistant's models are in Options → Artisan → Assistant; the defaults are a good start.\n2. Open the panel: File tab → Assistant, or run `ArtisanAssistant`.\n3. Open a design — from Boutique, Curator or your own archive.\n4. Type what you want in plain language and press Send.\n\nThe Assistant understands the 14 languages available in RhinoArtisan and replies in the language of your interface. Write to it in Spanish, Italian or Japanese and it follows.","metadata":{"title":"Assistant","section":"Quick start","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#quick-start","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#quick-start","collection":"docs7","hash":"57736d3e1f061fa23fe61d25aaa06638","indexed_by":"docs-index"}},{"content":"Assistant — In this section\n\n* Setting Up the Assistant — the API key, choosing a model, and docking the panel where it belongs.\n* The Assistant panel — every control in the panel, Auto mode, and how a conversation flows.\n* What you can ask — everything the Assistant can read and every action it can run for you.\n* Company standards — the rules your company always follows, written once and applied whenever the Assistant builds.\n* Your first interaction — a guided walkthrough on a real ring, step by step.\n\nThe keys, models, costs and privacy shared by every AI tool are in AI in RhinoArtisan.\n\nAlways review its output. Check anything the Assistant produces — measurements, weights, reports, prepared files — against the model itself before sending it to a client or into production.","metadata":{"title":"Assistant","section":"In this section","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#in-this-section","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/#in-this-section","collection":"docs7","hash":"d62b301ae9342364cc00e1ce388519d4","indexed_by":"docs-index"}},{"content":"Company standards\n\nEvery workshop has rules nobody writes down: prongs never under 0.9 mm in platinum, engagement rings in 18k white gold unless the customer asks, a 1.2 mm minimum wall on every shank. Company standards is where you write them down once, in plain language, so the Assistant follows them every time it builds or changes a design — and tells you when one of them decided a value.","metadata":{"title":"Company standards","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/","collection":"docs7","hash":"fcabf77243f2ac9190a8d83c65df7436","indexed_by":"docs-index"}},{"content":"Company standards — Where they live\n\n* Options → Artisan → Assistant → Company standards — an editor right in the Options window, with Open in text editor and Open folder next to it; see Assistant options.\n* The Company standards button in the Assistant panel opens the same file in your text editor.\n\nIt is a plain text file, `standards.md`, in the `Assistant` folder of your RhinoArtisan user folder. The first time, it starts from a template whose comments explain what to write; the comments are ignored.","metadata":{"title":"Company standards","section":"Where they live","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#where-they-live","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#where-they-live","collection":"docs7","hash":"5ec2bdaf224336ff924aca36c921449c","indexed_by":"docs-index"}},{"content":"Company standards — What to write\n\nShort rules in your own words, grouped however suits you:\n\n```markdown\n\nMetals\n- Engagement rings: 18k white gold unless the customer asks otherwise.\n\nSettings\n- Prongs: 0.9 mm minimum in gold, 1 mm in platinum.\n- Bezels: 0.8 mm walls.\n\nShanks\n- Minimum shank thickness: 1.2 mm.\n```\n\nNumbers for a single element — your usual bezel height, your favourite basket — are better saved as that command's defaults: the Assistant's tools already start from your saved defaults, so there is no need to repeat them here. Standards are for the rules that cut across elements, and for the reasons behind them.\n\nThe Assistant reads up to 6,000 characters of standards. Keep them to the rules that matter.","metadata":{"title":"Company standards","section":"What to write","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#what-to-write","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#what-to-write","collection":"docs7","hash":"783ede9ad49881cb3cdfe3b5e2293653","indexed_by":"docs-index"}},{"content":"Company standards — What the Assistant does with them\n\n* When it builds, changes or reasons about a design, the standards go along with your request, and the Assistant follows them unless your message asks for something else.\n* It tells you when a standard decided a value, so you know where a number came from.\n* It flags a standard it can't apply with the tools at hand, instead of skipping it in silence.\n* Questions about how to use RhinoArtisan don't carry the standards: they wouldn't change the answer and would only cost tokens.","metadata":{"title":"Company standards","section":"What the Assistant does with them","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#what-the-assistant-does-with-them","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#what-the-assistant-does-with-them","collection":"docs7","hash":"e50fcce44b65b48f0ff4429bfe047440","indexed_by":"docs-index"}},{"content":"Company standards — \"Remember that…\"\n\nYou can also add a standard from the chat. Write *\"remember that in platinum we always use 1 mm prongs\"* and the Assistant turns it into one clear rule and shows it to you with Apply and Cancel — even in Auto mode, because it will shape every design from then on. Apply adds it as a new line at the end of the file; a rule that is already there isn't added twice.","metadata":{"title":"Company standards","section":"\"Remember that…\"","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#remember-that","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#remember-that","collection":"docs7","hash":"364aa3fd2a81e37cbfb61af3b5fc9dc0","indexed_by":"docs-index"}},{"content":"Company standards — Other AI apps\n\nAI apps connected through RhinoArtisan MCP — Claude, ChatGPT and the rest — read the same standards with the `get_company_standards` tool, so a design built from Claude follows the same rules as one built in the panel.","metadata":{"title":"Company standards","section":"Other AI apps","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#other-ai-apps","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/company-standards/#other-ai-apps","collection":"docs7","hash":"58241afb9bef4cdb48e96b4753c7901e","indexed_by":"docs-index"}},{"content":"Your first interaction\n\nBefore exploring all the possibilities of Assistant, this section will guide you through your first interaction with the AI. You will learn how to load a model from Boutique, send your first messages, request design changes, ask for information, and generate reports and production data. These first steps will help you understand how natural and intuitive it is to work with Assistant inside RhinoArtisan.","metadata":{"title":"Your first interaction","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/","collection":"docs7","hash":"9f2bc37ccb37b4415f4b739ccc2ca29c","indexed_by":"docs-index"}},{"content":"Your first interaction — 1. Open the Assistant panel\n\nTo open Assistant, simply click File tab > Assistant icon.\\ A panel will appear on the right side of RhinoArtisan. You can dock or anchor this panel anywhere you prefer. We recommend placing it as shown below, so you always have the AI and the design tools visible while working.\n\n2. Bring a model from Boutique\nTo begin interacting with the AI, you’ll first need to load a jewelry model.\\ Open Boutique from the RhinoArtisan interface, browse to the Vintage collection, and select the model Vintage 005.\n\n\\ Once the model is loaded in the viewport, you're ready to start sending your first instructions to the Assistant.","metadata":{"title":"Your first interaction","section":"1. Open the Assistant panel","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#1-open-the-assistant-panel","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#1-open-the-assistant-panel","collection":"docs7","hash":"c54fb26c68f8ea875c77ff14374bd523","indexed_by":"docs-index"}},{"content":"Your first interaction — 3. Say: “Hi, how are you today?”\n\nThis step is optional, but it’s a great way to confirm that the Assistant is connected and responding correctly.\n\nIn the Assistant panel, type: “Hi, how are you today?” and click the Send button.\n\nAssistant will reply naturally, confirming that the OpenRouter key and the model are working — the same check described in Setting Up the Assistant.\n\nThe Assistant understands all 14 languages available in RhinoArtisan, and by default it will reply using the same language you have selected in the RhinoArtisan interface. If you type your message in another language, the Assistant will automatically adapt.","metadata":{"title":"Your first interaction","section":"3. Say: “Hi, how are you today?”","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#3-say-hi-how-are-you-today","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#3-say-hi-how-are-you-today","collection":"docs7","hash":"8a382e4c4ba13da4e2c4e64f0053662b","indexed_by":"docs-index"}},{"content":"Your first interaction — A quick note about the Assistant panel\n\nAt this point, you are already interacting with the Assistant panel.\\ This interface includes the message history, input box, action buttons, and several tools you will use throughout your design workflow.\n\nEvery control is described in The Assistant panel.\n\n4. Change the main gemstone\nNow let’s begin making real modifications to the model using natural language.&#x20;\n\nIn the Assistant panel, type: “Change the main gemstone to Oval 1.50 cts.” and click Send.\n\nAssistant will automatically update the center stone, adjusting both the shape and the approximate carat weight. This demonstrates how the Assistant interprets your request, applies the correct component, and modifies the model instantly without manual modeling.","metadata":{"title":"Your first interaction","section":"A quick note about the Assistant panel","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#a-quick-note-about-the-assistant-panel","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#a-quick-note-about-the-assistant-panel","collection":"docs7","hash":"fc5eee036540814d2631f0d05f558b29","indexed_by":"docs-index"}},{"content":"Your first interaction — 5. Set the ring size\n\nNow let’s adjust one of the most important parameters in any ring design: the size.\n\nIn the Assistant panel, type: “Set the ring size to British letter H.” and click Send.\n\nAssistant will automatically resize the ring according to the selected standard, maintaining proportions and updating the geometry where necessary.\n\nAssistant supports more than 20 ring size systems, so you can use any of them—for example:\n\n* USA 7\n* European 16\n* British letter H\n* Japanese 12, etc.\n\nYou can type the size in whichever region you prefer, and the AI will understand it immediately.","metadata":{"title":"Your first interaction","section":"5. Set the ring size","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#5-set-the-ring-size","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#5-set-the-ring-size","collection":"docs7","hash":"ec20c76f48f71683acbadc30bef0993a","indexed_by":"docs-index"}},{"content":"Your first interaction — 6. Change the cluster prongs\n\nNext, let’s adjust the prongs that hold the surrounding gemstones in place. \\ In the Assistant panel, type: “Change the cluster prongs from 5 to 3.” and click Send.\n\nAssistant will rebuild the cluster head using the new prong configuration.\\ This allows you to reshape the structure of the setting immediately, without manually editing or rebuilding the geometry. It’s a quick and precise way to explore different aesthetic and structural options.","metadata":{"title":"Your first interaction","section":"6. Change the cluster prongs","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#6-change-the-cluster-prongs","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#6-change-the-cluster-prongs","collection":"docs7","hash":"051fc0df610373ce28302c51c58bf475","indexed_by":"docs-index"}},{"content":"Your first interaction — 7. Rotate the cluster gemstones\n\nNow let’s adjust the orientation of the gemstones surrounding the center stone.\n\nIn the Assistant panel, type: “Set the gemstones in the cluster to 15 degrees.” and click Send.\n\nAssistant will rotate the entire cluster by the specified angle, maintaining symmetry and keeping all stones properly aligned.\\ This is especially useful when refining the look of halo or cluster designs, allowing you to test subtle stylistic variations instantly.","metadata":{"title":"Your first interaction","section":"7. Rotate the cluster gemstones","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#7-rotate-the-cluster-gemstones","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#7-rotate-the-cluster-gemstones","collection":"docs7","hash":"952af27ed7244a1c54fce253b0366102","indexed_by":"docs-index"}},{"content":"Your first interaction — 8. Modify the cathedral arms\n\nNext, let’s adjust part of the ring structure to see how Assistant handles geometric refinements.\n\nIn the Assistant panel, type: “In the cathedral, increase the width of the arms distance by 0.5 mm.” and click Send.\n\nAssistant will update the cathedral arms by spreading them slightly further apart, while maintaining symmetry and preserving the overall integrity of the design.\n\nThis kind of adjustment would normally require precise manual modeling, but the Assistant performs it automatically and accurately in just a second.","metadata":{"title":"Your first interaction","section":"8. Modify the cathedral arms","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#8-modify-the-cathedral-arms","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#8-modify-the-cathedral-arms","collection":"docs7","hash":"21d8e6380b03d3b8a52b66a4afee6f7f","indexed_by":"docs-index"}},{"content":"Your first interaction — 9. Remove the bridge from the cathedral shank\n\nNow let’s simplify the structure of the shank by removing one of its supporting elements.\n\nIn the Assistant panel, type: “Remove the bridge of the cathedral shank.” and click Send.\n\nAssistant will identify the bridge element in the cathedral shank and remove it cleanly, updating the geometry while preserving stability and visual coherence.\n\nThis shows how the Assistant can modify structural components of a design without requiring manual editing or rebuilding of the model.","metadata":{"title":"Your first interaction","section":"9. Remove the bridge from the cathedral shank","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#9-remove-the-bridge-from-the-cathedral-shank","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#9-remove-the-bridge-from-the-cathedral-shank","collection":"docs7","hash":"1b678e9274020b8324f44e04d8bdfe0d","indexed_by":"docs-index"}},{"content":"Your first interaction — 10. I don’t like it\n\nAssistant can also react to natural, subjective feedback — not only technical instructions.\n\nIn the Assistant panel, type: “I don’t like it.” and click Send.\n\nThe Assistant will interpret this as a negative evaluation of the latest change and will offer alternatives, suggestions, or revert options depending on the context.\\ This allows you to explore creative directions quickly, simply by expressing how you feel about the design. You don’t need to be precise or technical - Assistant understands intent as well as instructions.","metadata":{"title":"Your first interaction","section":"10. I don’t like it","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#10-i-dont-like-it","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#10-i-dont-like-it","collection":"docs7","hash":"ced0a35c9d68e1333828f8e4688e4f7e","indexed_by":"docs-index"}},{"content":"Your first interaction — 11. Ask for gemstone information\n\nAssistant can analyze the model and give you exact technical data at any moment.\n\nIn the Assistant panel, type: “How many stones does it have?” and click Send.\n\nThe Assistant will scan the model and provide a detailed count of all gemstones, including their types and positions when relevant.\\ This allows you to understand the composition of a piece instantly, without searching manually through components or layers.\n\nIt’s especially helpful for pricing, reporting, or explaining the design to a customer.","metadata":{"title":"Your first interaction","section":"11. Ask for gemstone information","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#11-ask-for-gemstone-information","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#11-ask-for-gemstone-information","collection":"docs7","hash":"9d7ff43ec74361469a94477c938a2269","indexed_by":"docs-index"}},{"content":"Your first interaction — 12. Request the price of the design\n\nAssistant can estimate the price of the model based on materials, gemstone data, metal weight, and your configured pricing rules.\n\nIn the Assistant panel, type: “Give me the price.” and click Send.\n\nThe Assistant will calculate an estimated price for the design, taking into account:\n\n* Metal weight\n* Gemstone count and specifications\n* Your pricing configuration in RhinoArtisan\n\nThis makes it incredibly easy to give customers a quick and accurate estimate, or to validate internal costs during design reviews.\n\nIf you want to understand where this information comes from and how pricing is configured, please visit the Breakdown Settings page in this documentation.","metadata":{"title":"Your first interaction","section":"12. Request the price of the design","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#12-request-the-price-of-the-design","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#12-request-the-price-of-the-design","collection":"docs7","hash":"f3ba73da0cc2b2e007393b5e0a7a5158","indexed_by":"docs-index"}},{"content":"Your first interaction — 13. Prepare the design for production, add dimensions, and generate a report\n\nOnce your design is ready, you can ask Assistant to prepare all the technical information required for manufacturing.\n\nYou can send the instructions one by one, or simply write them all together in a single message and Assistant will execute them in the correct order.\n\nFor example, you can type: “Prepare the design for production, add the dimensions, and make a report using Customer A.” and click Send.\n\nAssistant will:\n\n1. Prepare the design for production\\ Organize internal data, validate key parameters, and structure all technical information.\n2. Add the dimensions\\ Automatically create measurement annotations on the model, positioned cleanly and clearly.\n3. Generate the report using Customer A\\ Produce a professional, production-ready document including:\n* Technical specs\n* Dimensions\n* Gemstone list\n* Visual previews\n* Customer information\n* Additional metadata\n\nIf you want to learn how to customize or configure the layout and content of this report, take a look at the Report section of this documentation.\n\nWe recommend watching this video to fully understand how everything works:","metadata":{"title":"Your first interaction","section":"13. Prepare the design for production, add dimensions, and generate a report","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#13-prepare-the-design-for-production-add-dimensions-and-generate-a-report","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/first-interaction/#13-prepare-the-design-for-production-add-dimensions-and-generate-a-report","collection":"docs7","hash":"95dca2309ecdab7b0948fbfb280edf62","indexed_by":"docs-index"}},{"content":"The Assistant panel\n\nThe panel is a conversation: your messages, the Assistant's answers and, when a change needs your approval, the proposals it puts in front of you before it changes the document.\n\nThe controls\n* Message box — type in plain language. Enter sends, Shift + Enter starts a new line.\n* Send — sends the message. While the Assistant is working it becomes Stop, which aborts the request immediately.\n* Attach images — adds photos or sketches to your next message (JPG, PNG or WebP, up to six). You can also paste them with Ctrl + V or drop them on the message box; see Pictures.\n* Clear History — starts a new conversation. The Assistant forgets the thread and its pictures, and the copy kept with the file is deleted; your design is untouched.\n* Quick actions — a small menu of the most common requests, which pre-fill the message box so you can complete them: Price, Ring size…, Metal…, Report, Render view.\n* Help — opens this documentation.\n* Company standards — opens the file of rules your company always follows, which the Assistant applies when it builds; see Company standards.\n* Auto — the play button. On by default: changes run as soon as the Assistant makes them, except the ones that always wait for Apply (see below). Turn it off to review every change first with Apply and Cancel.\n* Cost — next to Auto, what the conversation has cost so far, as OpenRouter bills it (for example $0.12). Hover it for today's total and your daily limit, if you set one in Assistant options.","metadata":{"title":"The Assistant panel","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/","collection":"docs7","hash":"336016b03d2eac87eb2373a94519d610","indexed_by":"docs-index"}},{"content":"The Assistant panel — How a turn works\n\n1. You ask. Every message travels with a brief snapshot of the design you have open — its type, metals, ring size and layers — so the Assistant knows what \"it\" refers to without you explaining.\n2. It reads what it needs. If the question requires more, the Assistant fetches it on its own: the full element list with parameters, the pricing breakdown, the Boutique data, a look at the viewport, or the RhinoArtisan documentation. A status bubble shows what it is doing, with a ✕ to cancel at any point.\n3. It answers, or it acts. A question gets an answer, which appears word by word as the Assistant writes it. A request that changes the document runs straight away in Auto mode, and the Assistant closes the turn with a short summary of everything that changed. With Auto off, the change becomes a proposal card naming the exact command and its arguments, with Apply and Cancel.\n4. You stay in control. Apply runs the command on the real model and the Assistant continues from the result — so *\"resize it and tell me the new weight\"* works as one turn — while Cancel drops it and nothing is executed. And whatever the mode, an answer that changed the design ends with an Undo button: see Undo a whole answer.\n\nRead-only questions never need approval. Even in Auto mode, three kinds of action always wait for your Apply: a script or a Rhino command the Assistant writes because none of its actions fits, deleting something — objects in the design, or an element or profile from your library, which can't be brought back — and saving a new company standard. The Assistant says in one sentence what each one will do.","metadata":{"title":"The Assistant panel","section":"How a turn works","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#how-a-turn-works","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#how-a-turn-works","collection":"docs7","hash":"4e7145308bb537e82c3dbe73dc359a18","indexed_by":"docs-index"}},{"content":"The Assistant panel — Undo a whole answer\n\nA request like *\"build a solitaire with a halo\"* can take several steps, and each step is its own Rhino undo. So every answer that changed the design ends with a button — Undo these 5 changes, or Undo this change — that reverts everything that answer did in one go, including proposals you applied. The Assistant is told, so the conversation carries on from the design as it is.\n\nThe button only undoes what the answer itself did. If the design changed in between — you edited it while the Assistant was working, used Rhino's Undo, or asked for something else since — it explains why it can't and leaves the design alone; Rhino's own Undo still works step by step.","metadata":{"title":"The Assistant panel","section":"Undo a whole answer","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#undo-a-whole-answer","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#undo-a-whole-answer","collection":"docs7","hash":"3a792f6e77a2e4630a0f14d43cbcd71b","indexed_by":"docs-index"}},{"content":"The Assistant panel — Pictures\n\nAttach a photo, a sketch or a screenshot and talk about it: *\"what setting is this?\"*, *\"make something like this with a 1 ct oval\"*. The Assistant looks at each image when you send it and keeps what it saw for the rest of the conversation, so follow-ups don't send the picture again. Before building from a picture it tells you its plan and waits for your go-ahead.\n\nYou can also ask it for a picture: *\"make a photorealistic render of this ring\"*,\n*\"show it on a hand\"*, or a variation of an image you attached. Images are generated with your fal.ai key and appear in the conversation; click one to open it. See What you can ask.\n\nImages you attach are sent to the AI model provider (OpenRouter) so the Assistant can see them; the panel reminds you the first time. See Privacy and data.","metadata":{"title":"The Assistant panel","section":"Pictures","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#pictures","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#pictures","collection":"docs7","hash":"17afb5a1df9b90e59be67eb81ac352ba","indexed_by":"docs-index"}},{"content":"The Assistant panel — The conversation keeps its context\n\nFollow-ups work the way they do with a person: *\"and in yellow gold?\"*, *\"make it half a size bigger\"*, *\"I don't like it\"*. The Assistant carries the thread until you clear it, so you can refine a result instead of restating the whole request.\n\nYou can also chain several instructions in one message — *\"prepare the design for production, add the dimensions and make a report using Customer A\"* — and they run in the right order (one proposal at a time with Auto off).\n\nEach saved file keeps its conversation. Close Rhino, open the file tomorrow, and the chat is there to carry on: a gray note above the message box says when it was kept. Only the text comes back — not the pictures, and not the Undo buttons, because Rhino's undo history doesn't survive closing either. The conversation is stored on your computer, in your user folder, never inside the .3dm, so it doesn't travel with files you send to customers or workshops. A file you haven't saved yet keeps its chat from the moment you save it. You can turn this off in Assistant options.","metadata":{"title":"The Assistant panel","section":"The conversation keeps its context","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#the-conversation-keeps-its-context","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#the-conversation-keeps-its-context","collection":"docs7","hash":"3d38cc5e0c26e302aaa0f4db8a9ccca8","indexed_by":"docs-index"}},{"content":"The Assistant panel — When something goes wrong\n\n* An error bubble carries the message from the model or from the command that failed. The most common one is a missing or exhausted OpenRouter key — see Setting Up the Assistant.\n* \"The Assistant has reached today's AI spending limit\" means the daily limit in Assistant options has been reached: raise it there, or carry on tomorrow.\n* A command that could not run reports back in the conversation, and the Assistant explains what it needs — often a design element that does not exist in the current model.\n* Nothing happening usually means no design is open: the Assistant reads the active document, so an empty Rhino gives it nothing to work with.","metadata":{"title":"The Assistant panel","section":"When something goes wrong","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#when-something-goes-wrong","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/panel/#when-something-goes-wrong","collection":"docs7","hash":"dc0827944fa4442fa9791bc3e570da34","indexed_by":"docs-index"}},{"content":"Setting Up the Assistant\n\nThe Assistant talks to hosted models through OpenRouter, a single gateway to Anthropic, OpenAI, xAI, DeepSeek, Mistral and the rest. One key, every model.\n\nYou pay OpenRouter for what you use — RhinoArtisan adds nothing on top and takes no commission. There is no separate Assistant subscription.\n\nRequirements: RhinoArtisan 7.0, Rhino 7 or 8, and an internet connection. Nothing else — the model runs in the cloud, so no GPU, no VRAM, no local download.","metadata":{"title":"Setting Up the Assistant","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/","collection":"docs7","hash":"2cb6d21b6a6055772bb3537fa1bad4b2","indexed_by":"docs-index"}},{"content":"Setting Up the Assistant — 1. Connect your OpenRouter key\n\nCreate an OpenRouter account, add credit, create a key and paste it into Options → Artisan → Integrations, in the OpenRouter group's API Key field. The whole process, with screenshots, is in Accounts and API keys: it takes a couple of minutes and covers every AI tool at once.\n\nIf the key is missing, the Assistant answers with *\"OpenRouter API key not configured. Set it in Options > Integrations.\"* — that message always means this step.","metadata":{"title":"Setting Up the Assistant","section":"1. Connect your OpenRouter key","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#1-connect-your-openrouter-key","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#1-connect-your-openrouter-key","collection":"docs7","hash":"4a8693ba709088f3999d2bd65ae8ad73","indexed_by":"docs-index"}},{"content":"Setting Up the Assistant — 2. Choose the model\n\nThe Assistant's models are in Options → Artisan → Assistant, in the Models group; see Assistant options.\n\n* AI model — the model behind this panel. It defaults to Claude Opus 4.8 — frontier quality at a fraction of the top tier's cost.\n* Router, Vision and Reasoning models — specialists for reading each message, looking at pictures and planning multi-step builds. Their defaults follow the AI model (a small, fast model for the router), so you can leave them alone.\n\nFlow Studio AI keeps its own model in Integrations, tuned independently because writing scripts and working on a design are different jobs.\n\nLeave the defaults alone unless you have a reason: a cheaper model for routine work, a different provider for a company policy, or a specific vendor your organisation has approved. The full list, and how to choose, is in Choosing models.\n\nOn the same page, Costs sets an optional daily spending limit, and Company standards holds the rules your company always follows — see Company standards.\n\nModel choice is a trade-off between quality, speed and price. Complex multi-step requests — *\"resize it, change the metal and give me the new price\"* — are where a frontier model earns its cost; a plain *\"how many stones does it have?\"* runs fine on anything.","metadata":{"title":"Setting Up the Assistant","section":"2. Choose the model","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#2-choose-the-model","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#2-choose-the-model","collection":"docs7","hash":"74be0305364b758931e586fb403d7bb6","indexed_by":"docs-index"}},{"content":"Setting Up the Assistant — 3. Open and dock the panel\n\nOpen File tab → Assistant, or run `ArtisanAssistant`.\n\nThe panel can be docked anywhere, but keep it out of the standard right-side panel stack — sharing that space makes both harder to use while modelling.\n\nA good spot is next to the Curator panel: drag the Assistant tab by its title and drop it into the Curator area, and Rhino anchors it there.","metadata":{"title":"Setting Up the Assistant","section":"3. Open and dock the panel","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#3-open-and-dock-the-panel","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#3-open-and-dock-the-panel","collection":"docs7","hash":"dbc7a20fc49d9aee44fd66a02c2624a6","indexed_by":"docs-index"}},{"content":"Setting Up the Assistant — 4. Check it works\n\nType `Hi!` and press Send. A reply within a couple of seconds means the key, the model and the connection are all in order.\n\nIf instead you get an error, check in this order: the key is pasted in full, the OpenRouter account has credit, and the machine can reach the internet through any corporate proxy or firewall.","metadata":{"title":"Setting Up the Assistant","section":"4. Check it works","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#4-check-it-works","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/setting-up/#4-check-it-works","collection":"docs7","hash":"29f8e5acdf8c96458d9633c1b4e2c9f6","indexed_by":"docs-index"}},{"content":"What you can ask\n\nThe Assistant works through a fixed set of capabilities: things it can read from the design, and things it can do to it. Read tools run on their own while it answers; actions run straight away in Auto mode, or wait for your Apply when Auto is off. Scripts, deletions and new company standards always wait for Apply — see The Assistant panel.\n\nYou never type a command name — you describe what you want and the Assistant picks the right one.","metadata":{"title":"What you can ask","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/","collection":"docs7","hash":"c55785ac47335129e61095fe8d46b2c7","indexed_by":"docs-index"}},{"content":"What you can ask — What it can read\n\n| It reads | So you can ask |\n| --- | --- |\n| The design summary — file name, design type, metals, ring size and sizing regions, layers, element by element with its parameters, plus the notes | *What is this piece? How many stones does it have? What size is it? What are the prongs set to?* |\n| Pricing and Boutique — the internal manufacturing cost breakdown (materials, weights, labour) and the Boutique product data | *What does it weigh? What's the cost in 18k? What's the retail price?* |\n| Modifiable elements — every element that can be changed, with its id and its editable parameters | *What can I change on the head? Which parameters does the cathedral have?* |\n| The viewport — a picture of the design as it looks right now | *Does the halo look balanced? Is anything floating?* |\n| The RhinoArtisan documentation — searched while it answers, with links to the pages it used | *How do I make a hidden halo? Where do I set the ring size standard?* |\n| Your company standards — the rules your company always follows | *Which metal do we use for engagement rings?* |\n| Your Boutique — the ready-made designs of the Boutique collections installed on this computer, by collection, name or SKU | *Which halos do we have in the Boutique? Is there an oval solitaire?* |\n| Your hours — the Time Tracker's time per file and per day | *How many hours have I worked this week? How long have I spent on this ring?* |","metadata":{"title":"What you can ask","section":"What it can read","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#what-it-can-read","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#what-it-can-read","collection":"docs7","hash":"6587b5a9fc439fe9bddb9e820b8f2e7a","indexed_by":"docs-index"}},{"content":"What you can ask — The design\n\n| Action | Ask for it like this |\n| --- | --- |\n| Change the ring size | *\"Set the ring size to British letter H\"* — more than 20 sizing standards are understood |\n| Change the metal | *\"Change the metal to 18k white gold\"* |\n| Scale by weight | *\"Make it weigh 4.5 grams\"* — the whole design scales to hit the target |\n| Modify one element | *\"Change the main gemstone to Oval 1.50 cts\"*, *\"cluster prongs from 5 to 3\"*, *\"increase the cathedral arms distance by 0.5 mm\"* |\n| Remove part of an element | *\"Remove the bridge of the cathedral shank\"* |\n| Delete objects | *\"Delete the side stones\"* — always waits for your Apply |\n| Undo / Redo | *\"Undo that\"* — or the Undo button under the answer, which reverts everything that answer did in one go |","metadata":{"title":"What you can ask","section":"The design","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#the-design","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#the-design","collection":"docs7","hash":"193f0f574ce8f09af3f400363c9cccf0","indexed_by":"docs-index"}},{"content":"What you can ask — Building\n\n| Action | Ask for it like this |\n| --- | --- |\n| Build a shank or a ring | *\"Create a cathedral shank\"*, *\"make an eternity ring in size 6\"* — classic, cathedral, eternity, bypass, signet, split shank, wedding bands, pavé shanks and more |\n| Add a setting | *\"Add a halo around the center stone\"* — halo, bezel, prongs, basket, trilogy |\n| Add a gem | *\"Add a 1 ct round diamond\"* |\n| Lay out gems | *\"Pavé the selected surface with 1.3 mm stones\"* — gems along a curve or between two curves, pavé on a surface, tapered baguettes |\n\nThe Assistant builds one step at a time and checks each result before the next, so a complete ring is a short conversation rather than a single command. Where you don't give a value, it uses your saved defaults for that element and your company standards.","metadata":{"title":"What you can ask","section":"Building","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#building","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#building","collection":"docs7","hash":"af5828e2cb3049564dba817b0e702862","indexed_by":"docs-index"}},{"content":"What you can ask — Technical documentation and production\n\n| Action | Ask for it like this |\n| --- | --- |\n| Create the report | *\"Make a report using Customer A\"* |\n| Add or remove dimensions | *\"Add the dimensions\"* / *\"Remove all dimensions\"* |\n| Prepare for production | *\"Prepare the design for production\"* |\n| Export STL | *\"Export the metal parts for printing\"* |\n| Export the breakdown to Excel | *\"Send me the breakdown in Excel\"* |\n| Save as | *\"Save it as Vintage-005-client-B\"* |","metadata":{"title":"What you can ask","section":"Technical documentation and production","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#technical-documentation-and-production","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#technical-documentation-and-production","collection":"docs7","hash":"615689d32efa2d3a3e44246d7d70e8fa","indexed_by":"docs-index"}},{"content":"What you can ask — Rendering\n\n| Action | Ask for it like this |\n| --- | --- |\n| Render view on / off | *\"Show the design with render materials\"* / *\"back to design materials\"* |\n| Apply a render material | *\"Put a polished platinum material on Metal 01\"* |\n| Lay it on the ground | *\"Lay it flat for a render\"* |\n\nPictures\n| Action | Ask for it like this |\n| --- | --- |\n| Talk about a photo or sketch | Attach it and ask: *\"what setting is this?\"*, *\"how many stones do you count?\"* |\n| Build from a picture | *\"Make something like this with a 1 ct oval\"* — the Assistant tells you its plan and waits for your go-ahead before it builds |\n| Make a picture | *\"Make a photorealistic render of this ring\"*, *\"show it on a hand\"*, *\"a version of this photo in rose gold\"* — generated with your fal.ai key |\n\nThe image models are set in Assistant options. For finer control over generations — modes, sizes, video and 3D — use Generative AI Studio.","metadata":{"title":"What you can ask","section":"Rendering","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#rendering","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#rendering","collection":"docs7","hash":"31a51e65ef6712478adb2bff805d1c0f","indexed_by":"docs-index"}},{"content":"What you can ask — Your company's rules\n\n| Action | Ask for it like this |\n| --- | --- |\n| Remember a standard | *\"Remember that in platinum we always use 1 mm prongs\"* — the Assistant writes it as one clear rule and adds it to your company standards when you press Apply |\n\nPanels and libraries\n| Action | Ask for it like this |\n| --- | --- |\n| Open a RhinoArtisan panel | *\"Open the Outliner\"* |\n| Open the Boutique library | *\"Show me Boutique\"* |\n| Insert a Boutique design | *\"Insert the Halo 001 from the Boutique in rose gold\"* — it finds the design in your installed collections and imports it, optionally in 18k white, yellow or rose gold |\n| Open the Components library | *\"Open Components\"* |\n\nYou can combine several in one message — *\"prepare it for production, add the dimensions and make the report\"* — and the Assistant runs them in order.\n\nWhen none of its actions fits, the Assistant can write a short script against the Scripting API and run it. A script always waits for your Apply, even in Auto mode, and the proposal shows you the code before anything runs.","metadata":{"title":"What you can ask","section":"Your company's rules","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#your-companys-rules","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#your-companys-rules","collection":"docs7","hash":"e36d13c4338f5c5c042a20cb5910b6d9","indexed_by":"docs-index"}},{"content":"What you can ask — What it does not do\n\n* It does not sculpt. It builds with RhinoArtisan's parametric tools — shanks, settings, gems, pavé — not free-form or organic shapes. For form from a prompt or an image, that is Generative AI Studio; for sculpting by hand, Sculpt.\n* It is not a script library. For automations you want to review, keep and run again, use Flow Studio AI, which writes Python against the scripting API and saves it to your Flow library.\n* It does not act on its own. It changes the design only when you ask. Auto mode runs what you asked for straight away; turn it off to approve each change first.\n\nPricing answers come from your own configuration — see Breakdown Settings — and reports from your own templates, see Report. The Assistant reads those settings; it does not invent numbers.","metadata":{"title":"What you can ask","section":"What it does not do","url":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#what-it-does-not-do","source":"https://www.rhinoartisan.com/docs/7/productivity/assistant/what-you-can-ask/#what-it-does-not-do","collection":"docs7","hash":"7b2f5c781b64ad5cf9bf2d3a9b48be14","indexed_by":"docs-index"}},{"content":"File Search\n\nTwenty years of work. Thousands of `.3dm` files named after clients, orders and dates. The design you need exists — you can picture it perfectly — but its name is `M-2019-0347_rev2.3dm` and it could be in any of a dozen folders.\n\nFile Search ends that hunt. One window, two ways to find a file:\n\n* By name — instant, as you type, across every indexed folder at once. No more crawling through Explorer.\n* Smart — the headline act. Flip the ✦ Smart toggle and *describe the piece*: what it is, what it's made of, what's set in it, even what it costs. RhinoArtisan understands the description and finds the designs that match.\n\n> *\"rose gold halo rings with a diamond over 1 carat\"*\n>\n> *\"pendientes de zafiro en oro blanco por menos de 2.000\"*\n\nBoth of those are real queries. The second one is in Spanish — Smart search speaks your language, whatever it is.","metadata":{"title":"File Search","url":"https://www.rhinoartisan.com/docs/7/productivity/search/","source":"https://www.rhinoartisan.com/docs/7/productivity/search/","collection":"docs7","hash":"d29e9e5617fb5c2226205bc60bcda57d","indexed_by":"docs-index"}},{"content":"File Search — Opening the window\n\nClick File Search in the File tab of the ribbon, or run\n`ArtisanFileSearch`. The window opens instantly with your most recently modified files already on screen, newest first — often the file you want is in that first row before you type anything.\n\nEvery result is a card: a preview thumbnail, the file name, its folder and its date. Click a card to open the file. In name mode, pressing Enter opens the top result; Esc closes the window.","metadata":{"title":"File Search","section":"Opening the window","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#opening-the-window","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#opening-the-window","collection":"docs7","hash":"53ad1e15f8becb8c8637916df91ab83e","indexed_by":"docs-index"}},{"content":"File Search — Search by name\n\nJust type. Results update as you type, and you can throw several words at it in any order — `sello oval` finds `Anillo_oval_sello_2023.3dm` just fine. Every word has to appear somewhere in the file name; exact matches rank first, then names that start with your text, then names that merely contain it.\n\nThis mode runs entirely against an in-memory index, so it is instantaneous even on an archive with tens of thousands of files.","metadata":{"title":"File Search","section":"Search by name","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#search-by-name","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#search-by-name","collection":"docs7","hash":"e9d86b34a2d3c2c867ee85363c472382","indexed_by":"docs-index"}},{"content":"File Search — Smart search\n\nThis is the feature. Toggle ✦ Smart, describe what you're looking for, and press Enter.\n\nSmart search reads your description the way a colleague would. It understands:\n\n| You can ask by… | For example |\n| --- | --- |\n| Type of piece | ring, pendant, earring, necklace, bracelet |\n| Metal | yellow / white / rose gold (with karat, if you say it), platinum, silver, palladium |\n| Setting & elements | halo, bezel, pavé, solitaire, cathedral, eternity, cluster, basket, three stones, toi et moi… |\n| Gem | diamond, ruby, emerald, sapphire, aquamarine, morganite, moissanite, pearl… |\n| Gem cut | round, princess, cushion, pear, oval, marquise, baguette, heart… |\n| Carat | \"over 1 carat\", \"at least 0.5 ct\" |\n| Price | \"under 2,000\", \"between 1,500 and 3,000\" — using the prices from your own breakdowns and boutique data |\n| Anything else | free words like \"vintage\" or \"minimalist\" match against the design's description, file name and SKU |\n\nMix them freely: *\"white gold eternity ring, baguette diamonds, under 3,000\"* is one query. The status bar shows how the query was understood — e.g.\n`RING · GOLD_WHITE · ETERNITY ·\n\nSmart search runs on Enter, not on every keystroke — interpreting your description takes a moment (under a second, usually). It uses your OpenRouter key, set once in Accounts and API keys, and always a small, fast model, so a search costs very little. Without a key, or if the AI cannot be reached, the query silently falls back to plain text matching, so you always get an answer.","metadata":{"title":"File Search","section":"Smart search","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#smart-search","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#smart-search","collection":"docs7","hash":"23792f3731dcdd8128129342d30a6337","indexed_by":"docs-index"}},{"content":"File Search — Where the answers come from\n\nSmart search doesn't guess. When a design is indexed, RhinoArtisan reads the actual document — the same data behind your technical documentation and pricing: piece type, metals, setting elements, every gem with its cut and carat, ring size, cost, boutique retail price and SKU. Your query is matched against that extracted design data, not against file names or folder guesses. That is why *\"sapphire over 1 carat\"* finds the piece whose file name says nothing about sapphires.","metadata":{"title":"File Search","section":"Where the answers come from","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#where-the-answers-come-from","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#where-the-answers-come-from","collection":"docs7","hash":"d3762d7d41076f475639a241635e1c45","indexed_by":"docs-index"}},{"content":"File Search — The two indexes\n\nSearch is fast because it never scans your folders while you wait. It works from two indexes, both scoped by Options → File Search — that page decides which folders are covered, whether subfolders are included and which extensions are kept.\n\nThe names index powers search by name. It is built in the background in seconds, refreshes incrementally (only new, changed or deleted files are touched), and the window offers to update it whenever it looks out of date.\n\nThe semantic index powers Smart search. Building it is a deeper job: RhinoArtisan opens each `.3dm` and extracts the design data described above. Run `ArtisanFileSearchIndex` and choose Semantic to build it — do this once on your archive, ideally before a break, since a large library takes a while (press Esc to stop at any point; progress is kept). It is incremental too: re-running it only touches new and modified files. And from then on it maintains itself — every time you save a design, its index entry is refreshed automatically. The first build is the only bulk job you'll ever run.\n\nBuilding the semantic index opens each file in Rhino, which closes the current document — so save your work first; the command refuses to run over an unsaved document rather than risk it.","metadata":{"title":"File Search","section":"The two indexes","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#the-two-indexes","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#the-two-indexes","collection":"docs7","hash":"2b112efe19b2af7fc7ba4dfc542b681a","indexed_by":"docs-index"}},{"content":"File Search — Commands\n\n| Command | What it does |\n| --- | --- |\n| `ArtisanFileSearch` | Opens the Search window. Also on the ribbon: File → File Search. |\n| `ArtisanFileSearchIndex` | Rebuilds an index — asks which: Names (fast, background) or Semantic (deep, opens each file). |\n| `ArtisanFileSearchReindex` | Refreshes the names index in the background, with progress in Rhino's status bar. Also on the ribbon under File Search → Update index. |\n| `ArtisanFileSearchIndexReset` | Deletes both indexes (troubleshooting). Rebuild by running `ArtisanFileSearchIndex` again. |","metadata":{"title":"File Search","section":"Commands","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#commands","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#commands","collection":"docs7","hash":"3360ea8e7cc7d96933c536e56a117d52","indexed_by":"docs-index"}},{"content":"File Search — Your data\n\nThe search itself happens on your machine: both indexes live in your user folder, and the matching and ranking run locally over them. The only thing sent to the AI provider is the text of a Smart query, so it can be translated into filters — your files, previews, prices and client data never leave your computer. More in Privacy and data.","metadata":{"title":"File Search","section":"Your data","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#your-data","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#your-data","collection":"docs7","hash":"62c3777a9b3a5c6de2731f36810fdcfa","indexed_by":"docs-index"}},{"content":"File Search — Notes\n\n* Price queries use the design's boutique sale price when there is one, then the regular price, then the internal cost from the breakdown. Designs with no price at all are left out of price-filtered results — a design that can't answer the question shouldn't pretend to.\n* Ties are broken by modification date, so among equally good matches the piece you worked on most recently comes first.\n* Thumbnails are cached after the first look, so the window gets faster the more you use it.\n\nGoldsmith Tip: when a returning client says *\"like the one you made me, but in rose gold\"*, don't reach for the folder tree. Smart-search the original — *\"solitaire, cushion diamond, around 2,000\"* — open it, and start the variation from there. The archive you already have is your best design library; Search is what makes it browsable.","metadata":{"title":"File Search","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/productivity/search/#notes","source":"https://www.rhinoartisan.com/docs/7/productivity/search/#notes","collection":"docs7","hash":"5c96708e066cd00fe1f1206e16817dab","indexed_by":"docs-index"}},{"content":"Time Tracker\n\nTime Tracker answers a question every workshop eventually asks: how long did this design actually take? It runs silently in the background from the moment RhinoArtisan loads, counting the time you spend on each saved Rhino file — and shows the totals in a panel, ready to export.\n\nOpen the panel with `ArtisanTimeTracker`, or from the Time Tracker button in the ribbon's File tab.","metadata":{"title":"Time Tracker","url":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/","source":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/","collection":"docs7","hash":"777f26de03cb5db6536d50852c8f8058","indexed_by":"docs-index"}},{"content":"Time Tracker — How the tracking works\n\nThere is nothing to start or stop. Time accrues automatically for the active document, per file and per day, and only while you are really working:\n\n* Only saved documents count — an untitled, never-saved file is not tracked.\n* Time only accrues while Rhino is the foreground application; switching to your browser or email stops the clock.\n* If you step away, tracking pauses after a few minutes without keyboard or mouse input (5 minutes by default), and a sleeping machine cannot dump hours into the log.\n\nThe behavior is configured in Rhino Options → Artisan → Time Tracking: a checkbox to turn automatic tracking on or off, and the inactivity pause in minutes (1–120).","metadata":{"title":"Time Tracker","section":"How the tracking works","url":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#how-the-tracking-works","source":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#how-the-tracking-works","collection":"docs7","hash":"96d736f1264271d1c6abfb108fb478a2","indexed_by":"docs-index"}},{"content":"Time Tracker — The report panel\n\nThe panel lists your files with the total time and the number of days each one was worked on, sorted by time. A range selector filters the report: All time, Today, This week, or This month, with the filtered total at the bottom.\n\nTwo buttons complete it:\n\n* Export to CSV — saves the report as a spreadsheet-ready file with the project, time, decimal hours, and days per row.\n* Reset tracked time — clears the whole log, after a confirmation. The same is available as the `ArtisanTimeTrackingReset` command.","metadata":{"title":"Time Tracker","section":"The report panel","url":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#the-report-panel","source":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#the-report-panel","collection":"docs7","hash":"ab7d2c27c9ba1cba9c379ecc3ad95488","indexed_by":"docs-index"}},{"content":"Time Tracker — Where the data lives\n\nThe log is a local JSON file in your Artisan user folder (`TimeTracking\\time_log.json`). Nothing is ever written into the .3dm files themselves, and nothing leaves your machine.\n\nGoldsmith's Tip: The tracked hours are the missing half of your cost breakdowns: compare a piece's real design time against what you quoted for it, and your next quote gets sharper.","metadata":{"title":"Time Tracker","section":"Where the data lives","url":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#where-the-data-lives","source":"https://www.rhinoartisan.com/docs/7/productivity/time-tracker/#where-the-data-lives","collection":"docs7","hash":"a9084f4753dd260befa1beba5f9b4bad","indexed_by":"docs-index"}},{"content":"Rendering\n\nShowing a piece is not one job, it is two. Sometimes you need an image good enough to sit on a website or a client's screen next to a photograph. And sometimes you just need to turn the ring around in front of someone, right now, without waiting.\n\nRhinoArtisan gives you two rendering engines, one for each of those jobs — plus a live-linked bridge to KeyShot if that is where you render:\n\nRaytracing — Render Studio Photorealistic images and turntable videos on Cycles: real reflections, refraction and dispersion — the images you deliver.\n\nRealtime Render An instant WebGL viewer: spin, zoom and show the piece with no render queue — designing, reviewing, selling.\n\nKeyShot Live Linking keeps the KeyShot scene tied to the Rhino document — change the design, click Update, the render follows.\n\nCommands The ribbon's rendering toolbox — lights, materials, texture mapping, sync and display options. It feeds both engines.","metadata":{"title":"Rendering","url":"https://www.rhinoartisan.com/docs/7/rendering/","source":"https://www.rhinoartisan.com/docs/7/rendering/","collection":"docs7","hash":"2812ec99fc6f8053f042a981ebcf5046","indexed_by":"docs-index"}},{"content":"Rendering — The two engines\n\nRender Studio is the photorealistic route, built on Cycles, the same physically based raytracer that ships inside Rhino. Light is actually traced through the scene: metals reflect their surroundings, stones refract and disperse, and shadows fall where physics says they should. You use it for the images you deliver — catalogue shots, e-commerce photography, social posts, turntable videos — and you pay for the quality in render time, measured in passes.\n\nRealtime Render is the instant route. The scene is exported to a lightweight 3D model and opened in a WebGL viewer that responds immediately: spin it, zoom it, look at it from any angle with no waiting. You use it while you are still designing, and above all in front of a customer — it is the difference between describing a piece and handing it to someone.","metadata":{"title":"Rendering","section":"The two engines","url":"https://www.rhinoartisan.com/docs/7/rendering/#the-two-engines","source":"https://www.rhinoartisan.com/docs/7/rendering/#the-two-engines","collection":"docs7","hash":"31512bae67ada7a1dec22c3382d93da2","indexed_by":"docs-index"}},{"content":"Rendering — Which one do I want?\n\n| | Render Studio (Cycles) | Realtime Render |\n| --- | --- | --- |\n| Quality | Photorealistic | Approximate, good enough to read the shape |\n| Speed | Seconds to minutes, by quality | Instant |\n| Output | Image files, turntable video | An interactive viewer |\n| Best for | Catalogue, web, social, presentations | Design reviews, showing a client, quick checks |\n| Interaction | You set a camera and render it | You spin the piece yourself |\n| Hardware | A performance graphics card — Cycles renders on the GPU, and render times depend directly on it | Runs on any machine |\n\nGoldsmith's Tip: they are not alternatives you choose between once. Keep Realtime open while the design moves — it costs nothing — and switch to Render Studio when it stops. The materials are the same document materials, so nothing has to be set up twice.","metadata":{"title":"Rendering","section":"Which one do I want?","url":"https://www.rhinoartisan.com/docs/7/rendering/#which-one-do-i-want","source":"https://www.rhinoartisan.com/docs/7/rendering/#which-one-do-i-want","collection":"docs7","hash":"77a1eec81bce9f3bea8a508c9809f278","indexed_by":"docs-index"}},{"content":"Rendering — Already rendering in KeyShot?\n\nIf KeyShot is your rendering tool, you lose nothing by designing in RhinoArtisan — the two work better together than either does alone. The integration is deep, not a plain export: Live Linking keeps the KeyShot scene tied to the Rhino document, so a change to the design updates the render with a single Update click — no re-importing, no reassigning materials, no losing the lighting and camera you set up. And a Render button inside RhinoArtisan sends the piece straight to KeyShot.\n\nIn practice that means you keep the modelling speed of RhinoArtisan and the render quality of KeyShot in the same loop: iterate on the design, refresh the render, iterate again.","metadata":{"title":"Rendering","section":"Already rendering in KeyShot?","url":"https://www.rhinoartisan.com/docs/7/rendering/#already-rendering-in-keyshot","source":"https://www.rhinoartisan.com/docs/7/rendering/#already-rendering-in-keyshot","collection":"docs7","hash":"b86150216de205d46a48451ce716bf65","indexed_by":"docs-index"}},{"content":"Apply Design & Render Materials\n\nTwo commands, one decision: how the scene should look right now. Design materials are the fast, clear ones you model with; render materials are the physically accurate ones the final image deserves. Each command applies its set to every object in the scene in one click.\n\nApply Design Materials\nApplies the Design materials to all the objects in the scene — one pass, and every element uses the same material type, back in working trim.","metadata":{"title":"Apply Design & Render Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/apply-design-and-render-materials/","source":"https://www.rhinoartisan.com/docs/7/rendering/apply-design-and-render-materials/","collection":"docs7","hash":"2b35c28281c48817cd86edf3717d315e","indexed_by":"docs-index"}},{"content":"Apply Design & Render Materials — Apply Render Materials\n\nApplies the Render materials to all the objects in the scene — the quick way to dress the whole piece in its best materials before a render.","metadata":{"title":"Apply Design & Render Materials","section":"Apply Render Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/apply-design-and-render-materials/#apply-render-materials","source":"https://www.rhinoartisan.com/docs/7/rendering/apply-design-and-render-materials/#apply-render-materials","collection":"docs7","hash":"4421e0e5a419ab7b855494102e70453b","indexed_by":"docs-index"}},{"content":"Batch Rendering — Batch Rendering\n\nBatch Rendering renders a whole folder of files unattended: point the command at a folder, and every file in it is rendered one after the other, each image saved next to its file with the same name and a `.png` extension.\n\nIt is the tool for catalog work — a collection of thirty rings rendered overnight instead of thirty manual sessions. Set up each file's camera, materials, and lighting as you want them, save, and let the queue run without you.","metadata":{"title":"Batch Rendering","section":"Batch Rendering","url":"https://www.rhinoartisan.com/docs/7/rendering/batch-rendering/#batch-rendering","source":"https://www.rhinoartisan.com/docs/7/rendering/batch-rendering/#batch-rendering","collection":"docs7","hash":"9f30889c0f97f95b534f00dbfb7189f7","indexed_by":"docs-index"}},{"content":"Commands\n\nTwo of these commands are RhinoArtisan's own — they solve the two things you always have to do before rendering a piece of jewellery. The rest are Rhino's rendering commands, gathered into the ribbon so you do not have to hunt for them: panels, lights, texture mapping, colour synchronization and the advanced display effects.\n\nThey are shared ground: whatever you set here — materials, lights, environment, mapping — is used by Render Studio and by Realtime Render alike.","metadata":{"title":"Commands","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/","collection":"docs7","hash":"b8d9f3f2fb7ed973951552f55eb402e4","indexed_by":"docs-index"}},{"content":"Commands — Positioning the piece\n\nLying on the ground Drops the piece into a natural resting position, calculating the inclination that balances it on the ground. A ring standing perfectly upright always reads as fake, no matter how good the render is.\n\nPair Builds a pair from a single model — earrings, matching bands — with control over mirroring, distance and the angle between them.","metadata":{"title":"Commands","section":"Positioning the piece","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#positioning-the-piece","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#positioning-the-piece","collection":"docs7","hash":"0260446c61f939aa6cf9a086c7bde20e","indexed_by":"docs-index"}},{"content":"Commands — Panels\n\nThe panels where the scene is actually set up.\n\nMaterials Colour, finish, transparency, texture and bump for every material in the model.\n\nEnvironment Background colour, image and projection — the light the piece reflects.\n\nLights Every light in the scene in one list, with its own toolbar to add and edit them.\n\nTextures The textures used by materials and environments.\n\nGround An infinite ground plane at a chosen elevation, far faster to render than a surface.\n\nLibrary Materials, textures and environments saved to disk, shared between models.","metadata":{"title":"Commands","section":"Panels","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#panels","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#panels","collection":"docs7","hash":"af82e05da37fb84ae34f60b35a210f31","indexed_by":"docs-index"}},{"content":"Commands — Lights\n\nCreating and aiming the lights themselves.\n\nPoint Light Light from a single point in every direction.\n\nDirectional Light Parallel rays from one direction, like the sun.\n\nLinear Light A tube of light, for long soft highlights along a band.\n\nRectangular int Light A rectangular area light — the softbox of the studio.\n\nLight Properties Intensity, colour, shadows and the rest of a light's settings.\n\nEdit Light by Highlight Location Move the light by pointing at where you want the highlight to land.\n\nEdit Light by Looking Aim the light from the light's own point of view.\n\nSet Spotlight to View Put the spotlight where the camera is.\n\nSet View to Spotlight Put the camera where the spotlight is.","metadata":{"title":"Commands","section":"Lights","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#lights","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#lights","collection":"docs7","hash":"6d8d2ff8bc51e7c5596ce8c2eb0924e0","indexed_by":"docs-index"}},{"content":"Commands — Textures\n\nTexture mapping: how an image lands on a surface.\n\nPlanar Mapping Project the texture flat onto the surface.\n\nBox Mapping Project from the six faces of a box around the object.\n\nSpherical Mapping Wrap the texture around a sphere enclosing the object.\n\nCylindrical Mapping Wrap it around a cylinder — the projection a band asks for.\n\nUV Mapping Map along the surface's own parameters.\n\nUnwrap Texture Flatten the object so a texture can be painted onto it.\n\nShow Mapping Display the mapping widget so you can see what you are adjusting.\n\nHide Mapping Hide the mapping widgets again.\n\nEdit Mapping Coordinates Edit the object's mapping coordinates directly.\n\nApply Custom Texture Mapping Use another object as the mapping cage.\n\nExtract Custom Mapping Recover that mapping object as geometry.\n\nMatch Texture Mapping Copy one object's mapping onto others.\n\nRemove Mapping Channel Delete a mapping channel from an object.\n\nPack Textures Store the texture files inside the 3dm, so the model travels complete.\n\nUnpack Textures Extract them back out to disk.\n\nRefresh All Textures Reload the image files from disk.","metadata":{"title":"Commands","section":"Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#textures","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#textures","collection":"docs7","hash":"c0e3a3e22a686a2df019416d3efe0e2d","indexed_by":"docs-index"}},{"content":"Commands — Sync\n\nKeeping display colours and render materials telling the same story.\n\nSet Render Color Assign a render colour to the selected objects.\n\nSynchronize Render Color Make each object's material colour match its display colour, creating the material if there is none.\n\nSet Material Source Layer Take the material from the object's layer instead of the object.\n\nMatch Identical Material Align objects onto the same material.\n\nMerge Identical Find materials with identical settings, keep one and delete the rest, reassigning as it goes.","metadata":{"title":"Commands","section":"Sync","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#sync","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#sync","collection":"docs7","hash":"cb1d65e45273ccf8683f31d47dd9b8e4","indexed_by":"docs-index"}},{"content":"Commands — Advanced\n\nEffects the display pipeline adds at render time, without changing the geometry.\n\nCurve Piping Render a curve as a solid pipe: wires, threads, milgrain paths.\n\nDisplacement Push the surface in and out from a texture, for real relief instead of a bump.\n\nSoftening Round off sharp edges at render time.\n\nShutlining Cut a groove along a curve on the surface.\n\nThickness Give an open surface a rendered wall thickness.","metadata":{"title":"Commands","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/#advanced","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/#advanced","collection":"docs7","hash":"4cfb72cb45df0713207d11880acc18c4","indexed_by":"docs-index"}},{"content":"Advanced\n\nThese five effects add geometry at render time only: the model stays exactly as you built it, and the renderer dresses it up on the way to the image. That makes them free experiments — heavy-looking detail with no real polygons to manage, toggled on and off per object.\n\nCurve Piping Renders a curve as a pipe — a wire, a cord, a hair-thin milgrain line — without building the solid.\n\nSoftening Rounds hard edges in the render — the light-catching fillet real polishing would leave, with no fillet modelled.\n\nShutlining Renders grooves along curves on the surface — panel lines, seams, engraved outlines.\n\nThickness Gives a surface render-time thickness — a shell looks like a solid without offsetting it.\n\nDisplacement A texture pushes the surface into real render-time relief — hammered, woven, engraved finishes from an image.\n\nRender-time detail is for the image, not the piece: none of these effects exist in the exported STL. For texture that must be manufactured, emboss it for real with Relief and check it with the manufacturing tools.","metadata":{"title":"Advanced","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/","collection":"docs7","hash":"cb4371d1cdbbd9aa9536e62b0e540ff6","indexed_by":"docs-index"}},{"content":"Curve Piping — Curve Piping\n\nCurve piping constructs a render mesh pipe around a curve. Linetypes are supported to create stitches on leatherware or footwear models.\n\nSteps\n1. Select objects to apply curve piping to.\n2. In the Properties panel, click the Curve Piping button.\\ \\ &#xNAN;_&#x43;urves with curve piping in wireframe view (left) and shaded view (right)._\n3. Specify the curve piping properties.\n\n*","metadata":{"title":"Curve Piping","section":"Curve Piping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/curve-piping/#curve-piping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/curve-piping/#curve-piping","collection":"docs7","hash":"322faa62905347ad041d5f877db3c4de","indexed_by":"docs-index"}},{"content":"Curve Piping — Curve piping properties\n\nManages curve piping properties for the selected objects.\n\nOn\\ Switches the curve piping display on and off.\n\n#### Settings\n\nRadius\\ The measure from the curve to the surface of the mesh pipe.\\ The radius of the curve piping is multiplied by linetype width and taper values.\n\nSegments\\ The number of mesh faces that surround the curve. For example with three segments, the cross-section of the pipe looks like an equilateral triangle. The more segments there are, the rounder the pipe is.\n\nFaceted\\ Toggles between a smoothly shaded pipe and a flat-shaded pipe. This setting only affects the normals of the pipe mesh.\n\nCapType\\ Assigns one of the following cap types to both ends of the pipe.\n\nNone\\ Leaves pipe ends open.\n\nFlat\\ Plugs the pipe ends with flat caps perpendicular to the curve at each end.\n\nFlat, Extended\\ Extends the pipe by length of the Radius value and plugs it with flat caps.\n\nDome\\ Plugs the pipe ends with spherical caps centered at the curve end points.\n\nAccuracy Low / High\\ Changes the visual fidelity of the pipe along the curve. Higher value means that the center of the pipe is closer to the curve. By increasing the accuracy, the mesh will get more faces along the curve.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Curve Piping","section":"Curve piping properties","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/curve-piping/#curve-piping-properties","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/curve-piping/#curve-piping-properties","collection":"docs7","hash":"9416566bf35a95251f243308776b1291","indexed_by":"docs-index"}},{"content":"Displacement — Displacement\n\nDisplacement constructs a displacement display mesh for surfaces, polysurfaces, or meshes.\n\nSteps\n1. Select objects to apply displacement mapping to.\n2. In the Properties panel, click the Displacement button.\n3. Specify the displacement properties.\n\n*","metadata":{"title":"Displacement","section":"Displacement","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#displacement","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#displacement","collection":"docs7","hash":"ea75d72725d06cd0ecd1d58e46e1ba2a","indexed_by":"docs-index"}},{"content":"Displacement — Displacement properties\n\nManages surface displacement properties for the selected objects.\n\n#### Basic settings\n\nOn\\ Enables the displacement mapping display.\n\nTexture**\\ Specifies a procedural texture or image file used to map the displacement.\n\n* Texture pane: Click to create a new texture, import an external texture, or select an existing texture in the model.\n* Edit: Click to edit the texture properties\n* Mapping channel: Mapping channel number for the displacement mapping\n\nDisplacements\n\n* Black point: Amount of displacement (in currently used units) for black colors on displacement texture. Can be any number.\n* White point: The amount of displacement for the white color in the procedure or image.\n\nMesh detail settings\n\n-Initial quality\n\n* Low - Extremely hight (5 levels): Specifies how densely the object is subdivided and displacement texture is sampled initially. Using too low initial quality may result in loss of some features in the displacement. Too high initial quality makes displacement process unnecessarily dense and slow.\n* Compatible with Rhino 5: Only appears when an object has Displacement properties added in Rhino 5. The initial quality (subdivision density) approximately matches the initial quality in Rhino 5. This option can be saved in Rhino 6 models. Once a different level is selected, you cannot change it back except using undo.\n* Max faces: Runs a mesh reduction as a post process and simplifies the result of displacement to meet the specified number of faces.\n* Fairing: Straightens rough feature edges. This is similar to anti-aliasing. The value specifies the number of passes.\n\n*","metadata":{"title":"Displacement","section":"Displacement properties","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#displacement-properties","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#displacement-properties","collection":"docs7","hash":"81dcd019dd942f2d5a22a987086cf4a8","indexed_by":"docs-index"}},{"content":"Displacement — Advanced settings\n\nPost weld angle\\ Specifies the maximum angle between face normals of adjacent faces that will get welded together.\n\nMesh memory limit (MB)\\ Specifies in megabytes how much memory can be allocated for use by the displacement mesh. The memory limit can be set up to 32768 MB.\n\nRefine steps\\ After the initial subdivision and displacement texture sampling further refinement takes place. The value specifies the number of refinement passes.\n\nRefine sensivity\\ Specifies how sensitive the divider for contrasts on the displacement texture is. Specify 1 to split all mesh edges on each refine step. Specify 0.99 to make even slight contrasts on the displacement texture cause edges to be split. Specifying 0.01 only splits edges where heavy contrast exists.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Displacement","section":"Advanced settings","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#advanced-settings","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/displacement/#advanced-settings","collection":"docs7","hash":"65bdcb95d4277682b13f05d7e1030893","indexed_by":"docs-index"}},{"content":"Shutlining — Shutlining\n\nShut lining constructs a shut-line (parting line) display mesh for surfaces, polysurfaces, or meshes.\n\nNote\n* A shut line is the clearance gap between two adjacent surfaces such as between the door opening and body panel of an automobile or where a lid fits into the body of a tea kettle.\n* Shut Lining settings appears as an object property of the surface.\n* Surfaces inside blocks cannot be selected.","metadata":{"title":"Shutlining","section":"Shutlining","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/shutlining/#shutlining","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/shutlining/#shutlining","collection":"docs7","hash":"05d61c396573f94fca9e6e21a5bbad37","indexed_by":"docs-index"}},{"content":"Shutlining — Steps\n\n1. Select objects to shut line and press Enter.\n2. Select curves that define the shut line and press Enter.\n3. Press Enter to apply shut lining.\n\n*\n\nShutlining properties\nManages shut lining (parting line) properties for the selected objects.\n\nOn\\ Turns the shut lining on and off.\n\n#### Curves\n\nName\\ Specifies the names of the shut lining curves on the selected surface.\n\nSee: Naming conventions in Rhino\n\nAdd\\ Adds additional shut line curves.\n\nRemove\\ Removes curves from shut line process.\n\n\\ Curve properties\n\nRadius\\ Specifies the thickness of the shut line radius. The radius is the measured from the curve to the surface of the shut line.\n\n\\ Profile**\n\n* RoundGroove: Displays the shut line as a round groove.\\\n\n* Filleted: Displays the shut line as a filleted groove.\\\n\n* SharpGroove: Displays the shut line as a sharp groove.\\\n\n* Pull curve to object: Curves are pulled onto the object before making a shut line.\n* Raised: Raises the profile instead of making an indented line.\n\nFaceted\\ Toggles between smoothly shaded shut line and a flat-shaded shut line.\n\nAutoUpdate\\ All changes to Shut Lining settings are instantly applied to object. Clear the check box to make multiple changes without having to wait for shut lining process to finish.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Shutlining","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/shutlining/#steps","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/shutlining/#steps","collection":"docs7","hash":"eabc8ece599e0aaf799b3d714e14e718","indexed_by":"docs-index"}},{"content":"Softening — Softening\n\nEdge softening constructs an edge-softening display mesh for surfaces, polysurfaces, or meshes.\n\nNote\n* Edge softening applies a mesh radius or chamfer to edges in the model.\n* Edge Softening appears as a property for the surface.\n* Surfaces inside blocks cannot be selected.\n\nSteps\n1. Select objects to apply edge softening to.\n2. In the Properties panel, click the Edge Softening button.\n3. Specify the edge softening properties.\n\n*","metadata":{"title":"Softening","section":"Softening","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/softening/#softening","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/softening/#softening","collection":"docs7","hash":"aa8aece42a9d78c6afb82de80f293721","indexed_by":"docs-index"}},{"content":"Softening — Edge softening properties\n\nManages surface edge softening properties for the selected objects.\n\nOn\\ Enables edges softening.\n\n#### Settings\n\nSoftening\\ Specifies a softening amount. The visual radius approximation depends on the density of the current render mesh. Use the Properties Render Mesh Settings to adjust the mesh density.\n\nChamfer\\ The edge will be cut straight across with a hard edged chamfer. No attempt is made to soften this into a rounded edge.\n\nFaceted\\ The object, including the edge softening effect will be shaded as faceted as in FlatShade.\n\nEdge Threshold (degrees) \\_\\_\\_\\_\\ Softens the edge when the angle between the normal directions of two adjacent faces is greater than this setting.\n\nIn the example below, the edge will be softened only if Edge threshold is smaller than 42.46°.\\\n\nForce Softening\n\nForces the softening in cases where too large a softening radius might prevent softening to take place.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Softening","section":"Edge softening properties","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/softening/#edge-softening-properties","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/softening/#edge-softening-properties","collection":"docs7","hash":"02e470eef716ee45452e36c120d7bdbb","indexed_by":"docs-index"}},{"content":"Thickness — Thickness\n\nThe Thickening properties construct a mesh offset based on the object's render mesh.\n\nSteps\n1. Select objects that can have render meshes.\n2. Turn on Thickening in the Properties panel > Thickening.\n3. Specify the options.\n\n*\n\nThickening Properties\nManages thickening properties for the selected objects.\n\nOn\\ Turns the thickening display on and off.\n\n\\ Settings**\n\n* Distance: Sets the thickening distance.\n* Offset only: Moves the mesh a specified distance from the existing geometry.\n* Solid: Fills the edges between the original and new mesh to create a closed mesh.\n* Both sides: Draws the object on both sides of the object, creating the thickness twice as thick as you indicate.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Thickness","section":"Thickness","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/thickness/#thickness","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/advanced/thickness/#thickness","collection":"docs7","hash":"e8d8e0bacfcb570beb0c8c0d84b337e8","indexed_by":"docs-index"}},{"content":"Lights\n\nLighting jewelry is aiming: a stone only fires when a light hits it from the right angle, and a bezel only shows its polish when something bright reflects in it. These commands come in two groups — the light types you place, and the aiming tools that point them exactly where you want.\n\nLight types\nPoint Light Light in every direction from a single point — a bare bulb, the all-purpose fill.\n\nDirectional Light Parallel rays with a direction, like the sun — even light across the whole scene.\n\nRectangular Light A glowing panel, like a softbox — the soft, broad reflections that make polished metal read.\n\nLinear Light A tube of light between two points — long, elegant highlight streaks along a band.","metadata":{"title":"Lights","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/","collection":"docs7","hash":"263bb5e1a278532d33ecf0b3ad7107b9","indexed_by":"docs-index"}},{"content":"Lights — Aiming and editing\n\nLight Properties Open the Properties panel on the selected light: intensity, color, shadow settings.\n\nEdit Light by Highlight Location Click where the highlight should land on the piece, and the light moves so it lands there.\n\nEdit Light by Looking Fly the spotlight like a camera: orbit until it \"sees\" the right part of the scene, press Enter.\n\nSet Spotlight to View The spotlight takes the current camera's position and target — it shines at exactly what you see.\n\nSet View to Spotlight The reverse: look through the spotlight to verify exactly what it is lighting.\n\nGoldsmith's Tip: use the light list in the Lights panel as your console, and work in Rendered mode while aiming — the highlight tools are interactive, and you want to watch the sparkle land in real time.","metadata":{"title":"Lights","section":"Aiming and editing","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/#aiming-and-editing","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/#aiming-and-editing","collection":"docs7","hash":"6cb53f97e2a70da0a096fb771b8297a7","indexed_by":"docs-index"}},{"content":"Directional Light — Directional Light\n\nThe DirectionalLight command inserts a light that simulates the sun defined with parallel rays and a direction.\n\nSteps\n\n1. Pick a location at which to aim the directional light.\n2. Pick a location for the directional light.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Directional Light","section":"Directional Light","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/directional-light/#directional-light","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/directional-light/#directional-light","collection":"docs7","hash":"4dc6190d0c6668553633bc17f149f37c","indexed_by":"docs-index"}},{"content":"Edit Light by Highlight Location — Edit Light by Highlight Location\n\nThe EditLightByHighlight command edits a light by placing the light highlight on an object.\n\nThis command is view dependent. The light is placed so that the highlight is at the pick location on the object for the view in which it is placed- any changes to the view will change the location of the highlight. For best results use this command in combination with saved views.\n\nSteps\n\n1. Select a light.\\ Use Rendered mode to see the effect of the light on the object.\n2. Select a surface or polysurface for the light to shine on.\n3. Pick a location on the selected object that the light will hit.\\ The light will be directed toward the surface at the selected spot.\n\n\"Tip\": To place and direct a new light or helper line\n\n1. Press Enter.\n2. Specify a command line option.\n\n#### Command-line options\n\n-NewLight: Creates a new light with the current view characteristics instead of modifying an existing light.\n\n* Type: Specifies the type of light.\n* DirectionalLight: Places and directs a directional light.\n* PointLight: Places and directs a point light.\n* Spotlight: Places and directs a spotlight\n* Line: Places a helper line segment normal to the surface. Helper lines are useful for placing objects that show in reflections when the scene is raytraced.\n* Color\n\n1.Click the option to open the Select Color dialog box.\n\n2.Type \"C\" to set the RGB numbers.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Edit Light by Highlight Location","section":"Edit Light by Highlight Location","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/edit-light-by-highlight-location/#edit-light-by-highlight-location","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/edit-light-by-highlight-location/#edit-light-by-highlight-location","collection":"docs7","hash":"5325aed5aa10fb1018296424c2956c28","indexed_by":"docs-index"}},{"content":"Edit Light by Looking — Edit Light by Looking\n\nThe EditLightByLooking command sets a spotlight direction using view manipulation tools.\n\nThe spotlight acts like a camera where the camera location is the light cone apex and the target location is the center of the light cone base.\n\nSteps\n\n1. Select a spotlight.\\ Use Rendered Viewport mode to see the effect of the light on the object.\n2. Use standard view manipulation tools ( Pan, Zoom, etc.) change the orientation and shape of the spotlight cone.\n3. When the light \"sees\" the desired part of the scene, press Enter.\\ The view reverts to what it was at before the command.\\ The light adjusts to shine on what the temporary light-camera was seeing at the end of the command.\n\n#### Command-line options\n\n-NewSpotlight: Creates a new light with the current view characteristics instead of modifying an existing light.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Edit Light by Looking","section":"Edit Light by Looking","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/edit-light-by-looking/#edit-light-by-looking","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/edit-light-by-looking/#edit-light-by-looking","collection":"docs7","hash":"015508019e4028113e321b67106e5d05","indexed_by":"docs-index"}},{"content":"Light Properties — Light Properties\n\nThe PropertiesPage command opens the Properties panel at the specified page.\n\nSteps\n\n1. Select objects.\n2. At the Page to display prompt, the pages that apply to the selected objects display.\n3. Click a page name.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Light Properties","section":"Light Properties","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/light-properties/#light-properties","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/light-properties/#light-properties","collection":"docs7","hash":"5f2f502b82c169dd002e64b5391d30e7","indexed_by":"docs-index"}},{"content":"Linear Light — Linear Light\n\nThe LinearLight command inserts a light that imitates a fluorescent tube.\n\nSteps\n\n1. Pick the start of the light.\n2. Pick the end of the light.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Linear Light","section":"Linear Light","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/linear-light/#linear-light","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/linear-light/#linear-light","collection":"docs7","hash":"2caa03de0ea6b1e4c23cd5bae56d763b","indexed_by":"docs-index"}},{"content":"Point Light — Point Light\n\nThe PointLight command inserts a light object that emits light from a single location in all directions (omni light).\n\n#### Steps\n\n1. Pick the light's location.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Point Light","section":"Point Light","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/point-light/#point-light","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/point-light/#point-light","collection":"docs7","hash":"0174f292679417a013294a816e8fe0b7","indexed_by":"docs-index"}},{"content":"Rectangular Light — Rectangular Light\n\nThe RectangularLight command inserts a rectangular light object that emits light from an array of light points in one direction.\n\nCommand-line option\n\nTarget\n\nAims the light at the specified location.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Rectangular Light","section":"Rectangular Light","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/rectangular-int-light/#rectangular-light","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/rectangular-int-light/#rectangular-light","collection":"docs7","hash":"62fd20457d4841394f8d538414d96e46","indexed_by":"docs-index"}},{"content":"Set Spotlight to View — Set Spotlight to View\n\nThe SetSpotlightToView command matches spotlight direction to the viewport camera direction.\n\nThe command an existing spotlight or adds a new one so that the light point and target point (center of base circle) correspond to the camera point and its target point. This provides a convenient and accurate way to place or add a spotlight so that it is shining exactly in the right place.\n\nSteps\n\n* Select a spotlight.\n\n#### Command-line options\n\n-NewSpotlight: Creates a new light with the current view characteristics instead of modifying an existing light.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Set Spotlight to View","section":"Set Spotlight to View","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/set-spotlight-to-view/#set-spotlight-to-view","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/set-spotlight-to-view/#set-spotlight-to-view","collection":"docs7","hash":"45dc450db53edf3073188c7ec09e0212","indexed_by":"docs-index"}},{"content":"Set View to Spotlight — Set View to Spotlight\n\nThe SetViewToSpotlight command matches the view to a spotlight direction.\n\nThis command changes the current view so that the camera position matches the spotlight source location and the camera target matches the light target point (center of base of the cone). The camera angle matches the light cone angle. This can verify a light's view as an analysis aid in setting up a scene.\n\nSteps\n\n* Select a spotlight.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Set View to Spotlight","section":"Set View to Spotlight","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/set-view-to-spotlight/#set-view-to-spotlight","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lights/set-view-to-spotlight/#set-view-to-spotlight","collection":"docs7","hash":"de1b5b41233ff1f404c557d0e9af0101","indexed_by":"docs-index"}},{"content":"Lying on the ground — Lying on the ground\n\nThe Lying on the Ground command is a versatile tool that simplifies positioning objects within your models. It automatically calculates the perfect inclination to achieve balance along a specified axis, ensuring optimal alignment for various shapes and designs.&#x20;\n\nWhy is it important to position the object naturally?\nImagine this scenario: the ring is positioned entirely vertically. If we render the model in this position, no matter how realistic the render is, it will always give the impression of being unnatural and inauthentic.\n\nFor this reason, we’ve developed this command. Select the geometry, and the command will automatically calculate the most natural position for the render.\n\nImportant note: Please be aware that the ground is automatically positioned at the bottom, regardless of the geometry's placement.\n\nImportant note: Please be aware that the ground is automatically positioned at the bottom, regardless of the geometry's placement.","metadata":{"title":"Lying on the ground","section":"Lying on the ground","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/lying-on-the-ground/#lying-on-the-ground","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/lying-on-the-ground/#lying-on-the-ground","collection":"docs7","hash":"0a11b686b770a7897aa6906f769472dc","indexed_by":"docs-index"}},{"content":"Pair — Pair\n\nThe Pair command is an essential tool for efficiently creating pairs of objects in your models. This command lets you choose whether to mirror the objects and adjust the distance or angle between them according to your specific requirements, making it ideal for creating symmetrical or complementary designs.\n\nThe usage is very straightforward. When you run the command, you'll be prompted to select objects, and a pair preview will be displayed. You have two parameters available: distance and angle.\n\nIf we pay attention, we’ll see that the command defaults to an angle of 20 degrees. This is because it looks more aesthetically pleasing than having the two pieces parallel.","metadata":{"title":"Pair","section":"Pair","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/pair/#pair","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/pair/#pair","collection":"docs7","hash":"83f50162259107719928565cc56812d6","indexed_by":"docs-index"}},{"content":"Panels\n\nA render is more than a piece: it is a piece in a scene — lit by an environment, standing on a ground, dressed in materials. These six panels are where that scene is built. RhinoArtisan surfaces them in its ribbon so you never have to leave the workflow to open them:\n\nMaterials Every material in the document: color, finish, transparency, texture and bump — and a dozen material types to create your own.\n\nEnvironment What the metal reflects: the HDRI or background that lights the scene, drives reflections and fills the sky.\n\nLights Every light in the document in one list — add, select, group and toggle them without hunting through the viewport.\n\nTextures The images and procedurals that feed materials: bitmaps, bumps, noises, marbles — created and edited in one place.\n\nGround An infinite floor for the render — shadow-only for catalog shots, or any material when the piece needs a stage.\n\nLibrary Browse and drag in saved materials, environments and textures — including RhinoArtisan's jewelry-ready content.\n\nThese are Rhino's own panels, documented in full in the Rhino help — the pages here cover what each one is for and the options you will actually use on a jewelry render. For one-click materials on a whole piece, start with Apply Design & Render Materials instead: the panels are for when you want to go beyond the presets.","metadata":{"title":"Panels","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/","collection":"docs7","hash":"af2bb0b397574372267d44766a55bc56","indexed_by":"docs-index"}},{"content":"Environment — Environment\n\nThe environment is what the world looks like from inside your render — and on jewelry it matters more than anywhere else, because polished metal is a mirror: what a ring mostly shows is not its own color but the environment reflected in it. A good HDRI studio environment is the difference between gold that looks like gold and gold that looks like yellow plastic.\n\nThe Environments panel manages the environments in the document: which one lights the scene as skylight, which one drives reflections and refractions, and which one shows as the 360° background. One environment can play all three roles, or you can split them — a bright studio for the reflections, a plain color for the backdrop.","metadata":{"title":"Environment","section":"Environment","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#environment","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#environment","collection":"docs7","hash":"0e903d0505f388810147072fcfc38f3b","indexed_by":"docs-index"}},{"content":"Environment — Creating and importing\n\n* Add Environment — create a new one: a Basic environment (color or image with projection controls), or pick from More Types in the content type browser.\n* Import from file — load a saved `.renv` file, which is how environments travel between models and between people.\n* Choose existing — duplicate an environment in the document to use as a starting point.\n* The search box filters by name, notes or tags when the list grows.","metadata":{"title":"Environment","section":"Creating and importing","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#creating-and-importing","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#creating-and-importing","collection":"docs7","hash":"ae060a61a31433304da615cb977c504e","indexed_by":"docs-index"}},{"content":"Environment — Reading the thumbnails\n\nSmall icons on the corner of each thumbnail tell you the environment's role in the scene: used for reflection/refraction, used as the skylight, used as the 360° background — or flagged when its image file is missing (save with *Save textures* enabled to embed images in the `.3dm` and avoid that).\n\nGoldsmith's Tip: when a render looks flat, change the environment before touching the materials. Metal that looks dull is almost never a material problem — it is a reflection problem, and reflections come from here.\n\nThe full reference for every environment setting is in the Rhino help.","metadata":{"title":"Environment","section":"Reading the thumbnails","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#reading-the-thumbnails","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/environment/#reading-the-thumbnails","collection":"docs7","hash":"b994cf12aaf3a70ab694f5b36f8d70ba","indexed_by":"docs-index"}},{"content":"Ground — Ground\n\nA piece floating in a void looks rendered; a piece standing on a floor with a shadow under it looks photographed. The Ground Plane panel gives the scene an infinite horizontal floor, stretching to the horizon in every direction — far faster to render than modelling a floor surface, and it takes any material.\n\n* On — turns the ground plane on.\n* Height above world XY plane — where the floor sits. Automatic drops it to the lowest point of the objects in the model, so the piece always stands on it rather than floating above or sinking into it.\n* Show underside — makes the back of the plane visible from below; otherwise it is transparent when the camera dips under the horizon.","metadata":{"title":"Ground","section":"Ground","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/ground/#ground","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/ground/#ground","collection":"docs7","hash":"41832fc9156b3b3b8165a5e1a0e3dd77","indexed_by":"docs-index"}},{"content":"Ground — Effect\n\n* Shadow only — the ground itself is invisible but still catches shadows: the piece sits on pure white with a real contact shadow under it. This is the catalog-shot setting.\n* Use a material — assigns a real material to the floor, edited like any material from the Materials panel: marble for a lifestyle shot, dark leather for drama.\n* Texture mapping — when the floor material carries a texture: X/Y offset, X/Y size and rotation control how it lies on the plane.\n\nThe ground plane doesn't show in the Technical or Wireframe display modes — it exists for the rendered views.","metadata":{"title":"Ground","section":"Effect","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/ground/#effect","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/ground/#effect","collection":"docs7","hash":"50350022551fb5bbce7c0034842d5306","indexed_by":"docs-index"}},{"content":"Materials Library in Rhino (Libraries Panel) — Library\n\nThe Libraries panel is the shelf your render content lives on: folders of saved materials (`.rmtl`), environments (`.renv`) and textures (`.rtex`) that exist outside any one model. Build a scene you like once, save its pieces here, and every future project starts dressed.\n\nUsing it\n* Drag and drop a material, environment or texture from the panel into the model — onto an object, into the Materials panel, even between two Rhino sessions.\n* Navigate with back / forward, filter with the search box (by name, with optional regular expressions), and narrow the view to materials, environments or textures with the filter buttons.\n* Grid or list view, with a thumbnail size slider at the bottom — slide to 0% for a compact text list.\n* Library folders are configured in Options → Render Libraries; the content files themselves live in the Render Content folder and can be copied between machines and Rhino versions.\n\nSome library materials reference texture images that are not on your machine yet — Rhino downloads them when the content is added. Before working offline, run DownloadLibraryTextures once to pull everything local.\n\nGoldsmith's Tip: when a client render comes out right, save its environment and ground material to a library folder named after the client. The next piece for them renders in the same world — consistency across a collection is what makes a catalog look professional.\n\nThe panel's full reference is in the Rhino help.","metadata":{"title":"Materials Library in Rhino (Libraries Panel)","section":"Library","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/library/#library","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/library/#library","collection":"docs7","hash":"0b9ccf04387bc54c0248703b4eb2400d","indexed_by":"docs-index"}},{"content":"Lights — Lights\n\nA lit scene fills up fast — a key light, a fill, a rim, a sparkle light for the stones — and lights are easy to lose in the viewport because they are usually placed out of frame. The Lights panel puts every light in the document in one list, where you can find, select and toggle them without hunting.\n\n* Add light — pick a light type and place it in the viewport, without leaving the panel. The types themselves are covered in the Lights commands.\n* Light selection to viewport — selecting a light in the list also selects it in the viewport, so the list becomes the fastest way to grab the light you want to move.\n* Show groups — displays light groups in the list.\n* Show lights on layers that are off — keeps lights visible in the list even when their layer is hidden, so a light can't disappear from the panel just because its layer did.\n\nGoldsmith's Tip: name your lights the moment you place them — *key*,\n*fill*, *sparkle* — and this list becomes your lighting console: click to select, toggle to compare, one light at a time.","metadata":{"title":"Lights","section":"Lights","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/lights/#lights","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/lights/#lights","collection":"docs7","hash":"d70e2ffeeb36e8d8d0ca6aaee7aaaf98","indexed_by":"docs-index"}},{"content":"Materials Panel in Rhino: Full Guide — Materials\n\nThe Materials panel lists every material in the document and edits its color, finish, transparency, texture and bump. It is the workshop behind the scenes: Apply Design & Render Materials dresses the whole piece in RhinoArtisan's jewelry presets with one click — this panel is where you go to tune one of those materials, or to build something the presets don't cover.","metadata":{"title":"Materials Panel in Rhino: Full Guide","section":"Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#materials","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#materials","collection":"docs7","hash":"373c398998778e5928ac680494d2501e","indexed_by":"docs-index"}},{"content":"Materials Panel in Rhino: Full Guide — Creating a material\n\nAdd material offers a type for every job — the ones that matter on a jewelry render first:\n\n* Metal — physically correct metals; the base of every shank and setting.\n* Gem — refraction, dispersion and color for stones.\n* Glass — transparency with an IOR, for enamel windows and crystal.\n* Emission — a surface that emits light; handy for backlit product shots.\n* Physically Based (PBR) — the full modern material, and the one to use with downloaded PBR texture sets: Create Physically Based material from texture files builds it straight from the images (or a `.zip` set) and wires every map for you.\n* Blend / Double Sided — combine two materials, or give the inside of a surface a different finish than the outside.\n* Plus Custom, Paint, Picture, Plaster, Plastic and More types… for everything else.\n\nYou can also Import from material library (`.rmtl` files) or Choose existing to start from a material already in the document.","metadata":{"title":"Materials Panel in Rhino: Full Guide","section":"Creating a material","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#creating-a-material","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#creating-a-material","collection":"docs7","hash":"8e637c63e3a8d7f67b1366108ef770ee","indexed_by":"docs-index"}},{"content":"Materials Panel in Rhino: Full Guide — Managing the list\n\n* The search box filters by name, notes or tags — tags are gathered from the content in the document, and the tag list is fully keyboard-driven.\n* Corner icons on each thumbnail show the material's status: used by objects, used by the current selection, or missing an image file. Saving with *Save textures* enabled embeds images in the `.3dm` so nothing goes missing when the file travels.\n\nGoldsmith's Tip: don't rebuild gold from scratch. Start from a RhinoArtisan metal — applied via Apply Design & Render Materials — and use this panel to nudge roughness or color. A believable metal is 90% environment and 10% material.\n\nEvery material type and setting is documented in the Rhino help.","metadata":{"title":"Materials Panel in Rhino: Full Guide","section":"Managing the list","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#managing-the-list","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/materials/#managing-the-list","collection":"docs7","hash":"2a8779ddc46c291a3797009dd2a0fa8f","indexed_by":"docs-index"}},{"content":"Textures — Textures\n\nMaterials get their character from textures: the image on a picture material, the bump that makes a hammered finish read as hammered, the noise that breaks up a too-perfect surface. The Textures panel lists every texture in the document and is where you create and edit them directly — rather than digging for them inside each material.\n\nAdd texture creates a new one, Import from file loads a saved `.rtex`, and Choose existing duplicates one already in the document. The search box filters by name, notes or tags.","metadata":{"title":"Textures","section":"Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/textures/#textures","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/textures/#textures","collection":"docs7","hash":"b60eb6600419d69210bbd0c65aaf2cd7","indexed_by":"docs-index"}},{"content":"Textures — The texture families\n\n* Image-based — a bitmap does the work: Bitmap and Simple Bitmap for image maps, High Dynamic Range for HDRIs, and a set of ready-made bump images — Crosshatch, Grit, Hatch, Leather Grain, Simple Dot, Speckle — that are the fastest route to a believable brushed or blasted finish.\n* 2D procedural — generated patterns on the surface: Checker, Dots, Grid, Waves, Mask, Gradient and friends.\n* 3D procedural — generated in space, so they cut through the object with no seams: Noise, Granite, Marble, Perlin Marble, Wood, Stucco, Turbulence, plus utility nodes like Blend, Addition, Multiplication to combine them.\n* Utility — Physical Sky, the Projection Changer, and More types… in the content type browser.\n\nProcedural textures are mathematics, not pixels: they weigh nothing, never pixelate when you zoom into a macro shot, and in Rhino 8's Rendered and Raytraced modes they no longer need baking. For the tileable relief-style textures you emboss into the metal itself, that is a different tool — the Relief Texture operation.\n\nThe full reference for every texture type is in the Rhino help.","metadata":{"title":"Textures","section":"The texture families","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/textures/#the-texture-families","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/panels/textures/#the-texture-families","collection":"docs7","hash":"57e8786047f8278140a05e34da2b5ece","indexed_by":"docs-index"}},{"content":"Sync\n\nA model that has been through a real design process accumulates material clutter — colors that don't match between viewport and render, near-duplicate materials, objects carrying their own material when the layer should decide. The Sync group is the housekeeping crew:\n\nSet Render Color Pick objects, pick a color — the material color is set directly from a color picker, no panel digging.\n\nMatch Identical Material Copy one object's full material — color, gloss, transparency, every map — onto the objects you select.\n\nSynchronize Render Color Make the material color match the display color, so the render looks like the viewport you approved.\n\nSet Material Source: Layer Selected objects take their material from their layer again — the reset for per-object material chaos.\n\nMerge Identical Find materials with identical settings, keep one, delete the rest — assignments update themselves.\n\nGoldsmith's Tip: before a final render, run Merge Identical and give the survivors real names. A material list that reads *18k Yellow, Platinum, Diamond* instead of *Custom, Custom 01, Custom 02* is the difference between a scene you can edit and one you fight.","metadata":{"title":"Sync","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/","collection":"docs7","hash":"82e9bb244951372413fb2ae5c4b8dea3","indexed_by":"docs-index"}},{"content":"Match Identical Material — Match Identical Material\n\nWhen one object already looks right, this command spreads that look: it copies the full material of a source object — color, gloss finish, transparency, texture map, transparency map, bump map and environment map — onto the objects you select.\n\nSteps\n\n1. Run the command and select the objects that should receive the material.\n2. Pick the object to match — the one that already looks right.\n\nEvery material property is transferred, so the selection ends up rendering exactly like the source.\n\nTune one prong until it is perfect, then match the other five to it — that is this command's whole life, and it is a good life.","metadata":{"title":"Match Identical Material","section":"Match Identical Material","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/match-identical-material/#match-identical-material","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/match-identical-material/#match-identical-material","collection":"docs7","hash":"5424a1cadea502efdbfced694a6b9773","indexed_by":"docs-index"}},{"content":"Merge Identical — Merge Identical\n\nImports, copies and experiments leave a model with a dozen materials that are really the same gold. Merge Identical finds materials with identical settings, keeps one of each, and deletes the rest — every object that used a duplicate is reassigned to the survivor automatically.\n\nCommand-line option\n\n* SameNameOnly (Yes/No) — merge only identical materials that also share the same name.\n\nFor more detail, see the Rhino documentation.","metadata":{"title":"Merge Identical","section":"Merge Identical","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/merge-identical/#merge-identical","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/merge-identical/#merge-identical","collection":"docs7","hash":"f2a34c02df105793b921838b54fff715","indexed_by":"docs-index"}},{"content":"Set Material Source: Layer — Set Material Source: Layer\n\nEvery object in Rhino takes its material either from itself (a material assigned to the object) or from its layer. Per-object materials creep in over the life of a model — an import here, an experiment there — until the layer structure no longer controls how the model renders.\n\nThis command resets that: the selected objects' material source is set back to Layer, so they render with their layer's material again.\n\nSteps\n\n1. Select the objects.\n2. Run the command — their material source becomes *Layer*.\n\nThe layer-based workflow is what makes RhinoArtisan's Apply Design & Render Materials work so well: metals and gems live on their layers, and one click dresses everything. This command brings stray objects back into that system.","metadata":{"title":"Set Material Source: Layer","section":"Set Material Source: Layer","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/set-material-source-layer/#set-material-source-layer","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/set-material-source-layer/#set-material-source-layer","collection":"docs7","hash":"75ef022bf06cc66ecfab12d4b1dce1e9","indexed_by":"docs-index"}},{"content":"Set Render Color — Set Render Color\n\nThe fastest way to recolor something in the render: no Materials panel, no property pages — pick the objects, pick a color, done. The command sets the material color of the selected objects directly from a color picker.\n\nSteps\n\n1. Run the command and select the objects to recolor.\n2. Pick the color in the color picker that opens.\n\nThe objects' render material takes the color immediately — you will see it in Rendered mode and in Render Studio.","metadata":{"title":"Set Render Color","section":"Set Render Color","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/set-render-color/#set-render-color","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/set-render-color/#set-render-color","collection":"docs7","hash":"d77da6a391ef4815a0a35c6628183270","indexed_by":"docs-index"}},{"content":"Synchronize Render Color — Synchronize Render Color\n\nYou set up the viewport colors with care — and then the render comes out with different ones, because display color and material color are two separate things in Rhino. This command reconciles them: the material color of the selected objects is changed to match their display color, so the render looks like the viewport you approved.\n\nIf an object has no material assigned, a new material is created and assigned to the object's layer.\n\nSteps\n\n* Select the objects whose display colors should become their material colors.\n\nCommand-line option\n\n* AllLayers — applies the display colors of *all layers* to their layer materials in one pass; layers without a material get a new one in their display color.","metadata":{"title":"Synchronize Render Color","section":"Synchronize Render Color","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/synchronize-render-color/#synchronize-render-color","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/sync/synchronize-render-color/#synchronize-render-color","collection":"docs7","hash":"18a15e6ad52a460da2c16fbcd625d65e","indexed_by":"docs-index"}},{"content":"Textures\n\nA texture is flat; a ring is not. Texture mapping decides how the flat image wraps the geometry — and when a wood grain stretches or a pattern smears around a curve, the mapping is what needs fixing, not the texture. These commands control it directly from the ribbon.\n\nSee what you have\nShow Mapping Display the mapping widget on the selected objects, so you can see and edit the projection.\n\nHide Mapping Hide the mapping widget again once the projection is set.","metadata":{"title":"Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/","collection":"docs7","hash":"70a865efb0d91c5649943ef7f1b7892a","indexed_by":"docs-index"}},{"content":"Textures — Projections\n\nHow the image is projected onto the object — pick the one shaped like your geometry:\n\nPlanar Mapping Projected flat from one direction — for flat faces, signet tops, coins.\n\nBox Mapping Projected from six sides — the safe default for chunky, angular forms.\n\nUV Mapping The texture follows the surface's own UV coordinates — it flows with the geometry.\n\nSpherical Mapping Wrapped around a sphere — beads, cabochons, pearls.\n\nCylindrical Mapping Wrapped around a cylinder — bands, shanks, anything that goes around a finger.","metadata":{"title":"Textures","section":"Projections","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#projections","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#projections","collection":"docs7","hash":"2f14e560aa8ae4ac89928a9c71700cf3","indexed_by":"docs-index"}},{"content":"Textures — Custom and precise\n\nUnwrap Texture Flatten the object's surface into UV space along seams you choose — full control for complex pieces.\n\nEdit Mapping Coordinates Edit the mapping's control points directly on the object.\n\nApply Custom Mapping Use another object as the mapping shape — the texture wraps as if it were that object.\n\nExtract Custom Mapping Pull the mapping object back out of an object to edit or reuse it.\n\nMatch Texture Mapping Copy one object's mapping onto others — a matched pair maps identically.\n\nRemove Mapping Channel Delete a mapping channel and fall back to the default.","metadata":{"title":"Textures","section":"Custom and precise","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#custom-and-precise","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#custom-and-precise","collection":"docs7","hash":"73a25857eb00511a181754677cc85a75","indexed_by":"docs-index"}},{"content":"Textures — Files and refresh\n\nPack Textures Embed the texture image files inside the .3dm, so the file travels complete.\n\nUnpack Textures Extract embedded textures back out to a folder on disk.\n\nRefresh All Textures Reload every texture from disk — after editing an image outside Rhino.\n\nThe textures themselves — bitmaps, procedurals, bumps — are created and edited in the Textures panel; these commands control how they lie on the geometry.","metadata":{"title":"Textures","section":"Files and refresh","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#files-and-refresh","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/#files-and-refresh","collection":"docs7","hash":"207c8b2b2c32d43e8816682a4a9c47ac","indexed_by":"docs-index"}},{"content":"Apply Custom Texture Mapping — Apply Custom Texture Mapping\n\nThe ApplyCustomMapping command adds a custom texture mapping channel to an object.\n\nNo mapping or surface mapping (left), custom mapping object (center), result of custom mapping.\n\nA specified mesh or NURBS surface or polysurface acts as the mapping for the selected objects. The mapping object is preserved in the mapping table so deleting the mapping object does not affect the mapping on the target object.","metadata":{"title":"Apply Custom Texture Mapping","section":"Apply Custom Texture Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/apply-custom-texture-mapping/#apply-custom-texture-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/apply-custom-texture-mapping/#apply-custom-texture-mapping","collection":"docs7","hash":"bb7c1fb39131f2306588acd6fbbdea52","indexed_by":"docs-index"}},{"content":"Apply Custom Texture Mapping — Steps\n\n1. Select target objects.\n2. Select the custom mapping surface or mesh.\n3. Enter a mapping channel number, or press Enter to accept the default value.\n\n* The custom mapping object applied to objects can be extracted by the ExtractCustomMappingObject command.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Apply Custom Texture Mapping","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/apply-custom-texture-mapping/#steps","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/apply-custom-texture-mapping/#steps","collection":"docs7","hash":"bff6b833d9b7692552d5b82b21b9c633","indexed_by":"docs-index"}},{"content":"Box Mapping — Box Mapping\n\nThe ApplyBoxMapping command adds a box texture mapping channel to an object and sets the mapping type to box.\n\nSteps\n1. Select objects, and press Enter.\n2. Draw the mapping widget box.\n3. Select the coordinate system.\n4. Specify if the box will be capped.\n5. Enter a mapping channel number, or press Enter to accept the default value.\n\n*","metadata":{"title":"Box Mapping","section":"Box Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/box-mapping/#box-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/box-mapping/#box-mapping","collection":"docs7","hash":"3e546dc8c6abb33ca97974ee6db01633","indexed_by":"docs-index"}},{"content":"Box Mapping — Command-line options\n\nBoundingBox\\ Uses the object bounding box to determine the location and size of the mapping widget.\n\nCPlane\\ Uses Construction plane coordinates for the bounding box.\n\nWorld\\ Uses World coordinates for the bounding box.\n\nDiagonal\\ Creates a box from the diagonal corners. If you pick the two corners on the CPlane, the command prompts for picking the height.\n\nCube\\ Creates a box with six square faces from the diagonal corners.\n\n(Default)\\ Draws the rectangle using two opposite corners.\n\n3Point\\ Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nEdgeMidpoint\\ Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\nVertical\\ Draws the rectangle perpendicular to the construction plane.\n\nCenter\\ Draws the rectangle from the center point and a corner.\n\nCapped\\ Applies the mapping to all six sides of the box.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Box Mapping","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/box-mapping/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/box-mapping/#command-line-options","collection":"docs7","hash":"360cfd29f896ff6899f6c8e0144f1726","indexed_by":"docs-index"}},{"content":"Cylindrical Mapping — Cylindrical Mapping\n\nThe ApplyCylindricalMapping command adds a texture mapping channel to an object and sets the mapping type to cylindrical.\n\nSteps\n1. Select objects, and press Enter.\n2. Draw the mapping widget cylinder.\n3. Select the coordinate system.\n4. Specify if the cylinder will be capped.\n5. Enter a mapping channel number, or press Enter to accept the default value.\n\n*","metadata":{"title":"Cylindrical Mapping","section":"Cylindrical Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/cylindrical-mapping/#cylindrical-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/cylindrical-mapping/#cylindrical-mapping","collection":"docs7","hash":"899ae285cf7523f338fdfe0599b845d9","indexed_by":"docs-index"}},{"content":"Cylindrical Mapping — Command-line options\n\nBoundingBox\\ Uses the object bounding box to determine the location and size of the mapping widget.\n\nCPlane\\ Uses Construction plane coordinates for the bounding box.\n\nWorld\\ Uses World coordinates for the bounding box.\n\nDirectionConstraint\\ Direction constraints restrict the direction of the cylinder.\n\nNone**\\ Pick or type a number to set the height.\n\n* Use elevator mode, objects snaps, or other modeling aids to help picking a location.\n* The cursor location defines the positive direction when you type a number to set the height.\n\nVertical\\ Creates a cylinder perpendicular to the construction plane.\n\n* The CPlane +Z direction defines the positive direction when you type a number to set the height.\n\nAroundCurve\\ Draws the base circle perpendicular to the picked point on a curve. The center line of the cylinder will be tangent to the curve.\n\n* The curve direction defines the positive direction when you type a number to set the height.\n\nRadius\\ Draws the base circle by picking the center point and a radius point.\n\n* Cylinder\n* Diameter\n* Circumference\n* Area\n* ProjectOsnap\n\n2Point\\ Draws the base circle from two opposite points.\n\n3Point\\ Draws the base circle through three points.\n\n* Cylinder\n* Radius\n\nTangent\\ Draws the base circle tangent to one, two, or three curves.\n\n* Cylinder\n* Point\n* FromFirstPoint\n* Radius\n\nFitPoints\\ Draws the base circle by fitting to selected points, control points, or mesh vertices.\n\nCapped\\ Applies the mapping to the top and bottom of the cylinder.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cylindrical Mapping","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/cylindrical-mapping/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/cylindrical-mapping/#command-line-options","collection":"docs7","hash":"98b0ba30572c94678689db021f972c67","indexed_by":"docs-index"}},{"content":"Edit Object Texture Mapping Coordinates — Edit Object Texture Mapping Coordinates\n\nThe UVEditor command edits meshes that affect the texture coordinates of the original object. The texture meshes can be joined and split, and their control points edited.\n\nSteps\n1. Select objects.\n2. Edit the UV mesh in the UVEditor window.\n\n*\n\nScriptable command-line options\nTo access scriptable command-line options**\n\n* Type a hyphen in front of the command name: -UVEditor.\n\n*\n\nFor more information about the UVEditor Window**, please refer to the Rhino documentation.","metadata":{"title":"Edit Object Texture Mapping Coordinates","section":"Edit Object Texture Mapping Coordinates","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/edit-object-texture-mapping-coordinates/#edit-object-texture-mapping-coordinates","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/edit-object-texture-mapping-coordinates/#edit-object-texture-mapping-coordinates","collection":"docs7","hash":"54a369ca889e51dd275743d1500b8d40","indexed_by":"docs-index"}},{"content":"Extract Custom Mapping — Extract Custom Mapping\n\nThe ExtractCustomMappingObject command extracts the custom mapping source, a mesh or a surface, embedded in the selected object.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extract Custom Mapping","section":"Extract Custom Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/extract-custom-mapping/#extract-custom-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/extract-custom-mapping/#extract-custom-mapping","collection":"docs7","hash":"bd76ddb5aea5832f7938d4501bf31ea2","indexed_by":"docs-index"}},{"content":"Hide Mapping — Hide Mapping\n\nThe MappingWidgetOff command turns off the mapping widgets for selected objects.\n\nPress Enter to turn off all mapping widgets.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Hide Mapping","section":"Hide Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/hide-mapping/#hide-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/hide-mapping/#hide-mapping","collection":"docs7","hash":"d82bdd25c10cfedf8f9f3e6247ca9ffd","indexed_by":"docs-index"}},{"content":"Match Texture Mapping — Match Texture Mapping\n\nThe MatchMapping command changes the texture mapping properties of a selected object to duplicate a specified object.\n\nYou can also use the Match Mapping button in Texture Mapping Properties.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Match Texture Mapping","section":"Match Texture Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/match-texture-mapping/#match-texture-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/match-texture-mapping/#match-texture-mapping","collection":"docs7","hash":"cc0240507a48263e986d283b795c140a","indexed_by":"docs-index"}},{"content":"Pack Textures — Pack Textures\n\nThe PackTextures command separates faces of a polysurface in the texture UV space. Each face will display different portion of the texture.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Pack Textures","section":"Pack Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/pack-textures/#pack-textures","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/pack-textures/#pack-textures","collection":"docs7","hash":"100ba2ccdb5f814ba98993d4c2ed62e6","indexed_by":"docs-index"}},{"content":"Planar Mapping — Planar Mapping\n\nThe ApplyPlanarMapping command adds a texture mapping channel to an object and sets the mapping type to planar.\n\nSteps\n1. Select objects, and press Enter.\n2. Draw the mapping widget box.\n3. Select UV for 2D mapping, or UVW for 3D.\n4. Enter a mapping channel number, or press Enter to accept the default value.\n\n***","metadata":{"title":"Planar Mapping","section":"Planar Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/planar-mapping/#planar-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/planar-mapping/#planar-mapping","collection":"docs7","hash":"3757107cfa19765410a54db0543b4b8f","indexed_by":"docs-index"}},{"content":"Planar Mapping — Command-line options\n\n-BoundingBox: Uses the object bounding box to determine the location and size of the mapping widget\n\n* CPlane: Uses Construction plane coordinates for the bounding box.\n* World: Uses World coordinates for the bounding box\n\nBox\\ Draws a box to add a planar mapping widget.\n\n* The vertical direction of the box defines the W direction that is used by 3D procedural textures, such as Wood, Noise, Granite, etc.\n\n(Default)\\ Draws the rectangle using two opposite corners.\n\n3Point\\ Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nEdgeMidpoint\\ Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\nVertical\\ Draws the rectangle perpendicular to the construction plane.\n\nCenter\\ Draws the rectangle from the center point and a corner.\n\nAroundCurve\\ Draws a rectangle perpendicular to a curve.\n\nSteps\n\n1. Select a curve and pick the center of the rectangle on the curve.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Planar Mapping","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/planar-mapping/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/planar-mapping/#command-line-options","collection":"docs7","hash":"e37fcc85de26b20a7945c3f5f262f260","indexed_by":"docs-index"}},{"content":"Refresh All Textures — Refresh All Textures\n\nThe RefreshAllTextures command reloads the texture files from disk and refreshes displays that are currently using the textures.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Refresh All Textures","section":"Refresh All Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/refresh-all-textures/#refresh-all-textures","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/refresh-all-textures/#refresh-all-textures","collection":"docs7","hash":"5d36649383ac04b598c1796a428a0783","indexed_by":"docs-index"}},{"content":"Remove Mapping Channel — Remove Mapping Channel\n\nThe RemoveMappingChannel command removes the specified mapping channels from an object.\n\nSteps\n1. Select objects.\n2. Type the mapping channel number.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Remove Mapping Channel","section":"Remove Mapping Channel","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/remove-mapping-channel/#remove-mapping-channel","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/remove-mapping-channel/#remove-mapping-channel","collection":"docs7","hash":"36fe8535bb134b594f05069fdbe0390f","indexed_by":"docs-index"}},{"content":"Show Mapping — Show Mapping\n\nThe MappingWidget command turns on the mapping widgets for the selected objects.\n\nSteps\n1. Select objects.\n2. Type the mapping channel number or press Enter.\n\n*\n\nCommand-line options\n-ShowOCSFrame: Displays the Object Coordinate System frame added to the object by the ApplyOcsMapping command. This option is only visible when the selected object has an OCS frame.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Show Mapping","section":"Show Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/show-mapping/#show-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/show-mapping/#show-mapping","collection":"docs7","hash":"f5c92304ab26ec3fcf99bda1ba6c993c","indexed_by":"docs-index"}},{"content":"Spherical Mapping — Spherical Mapping\n\nThe ApplySphericalMapping command adds a texture mapping channel to an object and sets the mapping type to spherical.\n\nSteps\n1. Select objects, and press Enter.\n2. Draw the mapping widget sphere.\n\n3. Enter a mapping channel number, or press Enter to accept the default value.\n\n*\n\nCommand-line options\nBoundingBox\\ Uses the object bounding box to determine the location and size of the mapping widget.\n\nCPlane\\ Uses Construction plane coordinates for the bounding box.\n\nWorld\\ Uses World coordinates for the bounding box.\n\nRadius**\\ Creates a sphere by picking the center point and a radius point.\n\n* Sphere attributes\n* Diameter\n* Orientation\n* Circumference\n* Area\n* ProjectOsnap\n\n2Point\\ Creates a sphere from two opposite points on the base circle.\n\n3Point\\ Creates a sphere from three points on the base circle.\n\n* Sphere attributes\n* Radius\n\nTangent\\ Creates a sphere with the base circle tangent to one, two or three curves.\n\n* Sphere attributes\n* Point\n* FromFirstPoint\n* Radius\n\nAroundCurve\\ Creates a sphere from its center point on a curve, and a point on the base circle perpendicular to the curve.\n\n* Sphere attributes\n* Radius\n* Diameter\n* Circumference\n* Area\n* ProjectOsnap\n\n4Point\\ Creates a sphere from three points on a section circle and a point on the sphere.\n\n* Sphere attributes\n* Radius\n\nFitPoints\\ Creates a sphere by fitting to selected point objects, curve and surface control points, and mesh vertices.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Spherical Mapping","section":"Spherical Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/spherical-mapping/#spherical-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/spherical-mapping/#spherical-mapping","collection":"docs7","hash":"f284904abf634c1b2b8b796b3365506a","indexed_by":"docs-index"}},{"content":"Unpack Textures — Unpack Textures\n\nThe UnpackTextures command maps each face of a polysurface to the whole texture UV space. Every face will display the complete texture with some stretch or compression.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Unpack Textures","section":"Unpack Textures","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unpack-textures/#unpack-textures","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unpack-textures/#unpack-textures","collection":"docs7","hash":"202267d57f03be7e8191ff6fbbba955d","indexed_by":"docs-index"}},{"content":"Unwrap Texture — Unwrap Texture\n\nThe Unwrap command prompts for selecting edges on the selected object as texture seams where the object's render mesh will be split in UV space.\n\nInput\n* Surface, Polysurface, Extrusion, Mesh, SubD\n\n*\n\nSteps\n1. Start the command.\n2. Select one or multiple objects, press Enter.\n\nMultiple selected objects will not overlap in UV space.\n3. Select a mapping channel.\n4. Select edges on the object.\n\nUse the command-line options to help selecting edges.\n5. Press Enter when done.\n\n*","metadata":{"title":"Unwrap Texture","section":"Unwrap Texture","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unwrap-texture/#unwrap-texture","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unwrap-texture/#unwrap-texture","collection":"docs7","hash":"adaf9c1bb17af2b58116d06ddabb946f","indexed_by":"docs-index"}},{"content":"Unwrap Texture — Command-line options\n\nChain\\ Chain selects the seams.\n\nApply\\ Applies the seam selection.\n\nEdit\\ Opens the UV Editor.\n\nCancel\\ Cancels the command.\n\nMappingChannel\\ Selects a mapping channel number for the UV mesh.\n\nUnweldedOnly (For mesh-only)\\ Makes only unwelded mesh edges selectable.\n\nSymmetryTip\\ Defines the symmetrical plane on an object to unwrap the object symmetrically.\n\nUnweldSeams (Mesh-only)\\ Unwelds the mesh edges along the seams to avoid mapping distortion near the seams. The actual mesh geometry will be modified.\n\nMethod\n\nConformal\\ Uses the Least Squares Conformal map (LSCM) algorithm to flatten 3D objects.\n\nAngleBased\\ Uses the Angle Based Flattening (ABF++) algorithm to flatten 3D objects.\n\nAsRigidAsPossible\\ Uses the As-Rigid-As-Possible (ARAP) algorithm to flatten 3D objects. ARAP keeps texture size more even across the object than LSCM and ABF.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Unwrap Texture","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unwrap-texture/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/unwrap-texture/#command-line-options","collection":"docs7","hash":"78d93503bd04bd72d41ba67c8002bd74","indexed_by":"docs-index"}},{"content":"UV Mapping — UV Mapping\n\nThe ApplySurfaceMapping command adds a texture mapping channel to an object and sets the mapping type to surface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"UV Mapping","section":"UV Mapping","url":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/uv-mapping/#uv-mapping","source":"https://www.rhinoartisan.com/docs/7/rendering/commands/textures/uv-mapping/#uv-mapping","collection":"docs7","hash":"bf373eae68af0559c328683fcc9861fe","indexed_by":"docs-index"}},{"content":"How to create a rendered image\n\nA 3D CAD-rendered image is a visual representation of a three-dimensional model created from a CAD file.\n\nThe rendering process takes the geometric and material data from the model and converts it into a photorealistic or stylized image. This involves calculating lighting, shadows, reflections and other visual effects to simulate how the object would look in the real world.\n\nWe assume your model already has defined materials, ground, and environment. If not, please see the Render & Animation page.\n\n1. In Type, choose Image.\n\n2. Choose the Resolution that you want to achieve. The higher the resolution, the more details you will be able to see in the video and the longer it will take to generate the rendering.\n\nIf you are not sure what resolution to use, we suggest choosing 1920x1080 (16:9) HD for a standard, all-purpose rendered image.\n\nIf you are not sure what resolution to use, we suggest choosing 1920x1080 (16:9) HD for a standard, all-purpose rendered video. We also offer vertical resolutions for social networks like Facebook, Instagram, and TikTok.\n\n3. &#x20;Adjust the Quality value to the number of passes you want the render engine to make before finishing the rendering process. This will set the definition of your image. The higher the value, the more time it will take to finish the process. We suggest setting this value to 500 to achieve a good definition with usually little time to render.\n\n4. Click the Preview Render button, and drag an area over the scene you want to preview.\n\n5. If you like how it looks, click on the Render button.\n\nOnce the rendering process ends, the image is saved in the same location as your design file by default.","metadata":{"title":"How to create a rendered image","url":"https://www.rhinoartisan.com/docs/7/rendering/how-to-create-a-rendered-image/","source":"https://www.rhinoartisan.com/docs/7/rendering/how-to-create-a-rendered-image/","collection":"docs7","hash":"69a36fe3c4c66ad301052988caef75b7","indexed_by":"docs-index"}},{"content":"How to create a turntable video\n\nTurntable renders are a 3D visualization technique that involves rotating an object 360 degrees while rendering it in real-time. This allows the viewer to examine the model from all angles and appreciate its shape, details, and textures.\n\nWe assume that your model already has defined materials, ground, and environment. If not, please see the Render & Animation page.\n\n1. In Type, choose Turntable.\n\n2. Choose the Resolution that you want to achieve. The higher the resolution, the more details you will be able to see in the video and the longer it will take to generate the rendering.\n\nIf you are not sure what resolution to use, we suggest choosing 1920x1080 (16:9) HD for a standard, all-purpose rendered video. Also, we offer vertical resolutions for social networks like Facebook, Instagram and Tik Tok.\n\n3. Adjust the Quality value to the number of passes you want the render engine to do before finishing the rendering process. This will set the definition of your video. The higher the value, the more time it will take to finish the process.\n\nWe suggest setting this value to 500 to achieve a good definition, which usually does not take much time to render.\n\n4. Set the duration and frames per second you want your video to be made.\n\nClick the Preview Render button and drag an area over the scene you want to preview.\n\n5. &#x20;Click on the Render Video button.\n\n5. Name your rendered video, choose the folder on which the video will be saved, and click the Save button.","metadata":{"title":"How to create a turntable video","url":"https://www.rhinoartisan.com/docs/7/rendering/how-to-create-a-turntable-video/","source":"https://www.rhinoartisan.com/docs/7/rendering/how-to-create-a-turntable-video/","collection":"docs7","hash":"1f3b244b0a7612f9f72af1b09e0f3e40","indexed_by":"docs-index"}},{"content":"Keyshot\n\nKeyShot is one of the leading rendering tools in the jewelry industry — fast, photorealistic, with a deep material library and studio lighting environments. If it is where your renders happen, you lose nothing by designing in RhinoArtisan: the integration is a live link, not an export.\n\nThe workflow it replaces is the painful one: export, import, reassign materials, rebuild lighting, notice a design flaw, start over. With Live Linking the KeyShot scene stays tied to the Rhino document — you keep the modelling speed of RhinoArtisan and the render quality of KeyShot in the same loop.","metadata":{"title":"Keyshot","url":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/","source":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/","collection":"docs7","hash":"1ee615b39458dcafff7b9fd6706eefd8","indexed_by":"docs-index"}},{"content":"Keyshot — Installing the plugin\n\nThe integration uses KeyShot's free plugin for Rhino, installed from the package manager in one minute:\n\n1. Run the `PackageManager` command and type keyshot in the search field.\n\n2. Select KeyShot Studio and click Install:\n\n3. A new window asks you to confirm — click Install and let it download.\n\nOnce installed, three buttons appear in the Rendering tab of the RhinoArtisan ribbon.","metadata":{"title":"Keyshot","section":"Installing the plugin","url":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#installing-the-plugin","source":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#installing-the-plugin","collection":"docs7","hash":"ba4321a6299d727f2d51bd3bee16af98","indexed_by":"docs-index"}},{"content":"Keyshot — Render — start the live link\n\nSends the model to KeyShot and opens it there, live-linked: the KeyShot scene remembers it came from this Rhino document. Set up your materials, lighting and camera in KeyShot as usual — that setup is what the link protects from now on.\n\nUpdate — push a design change\nThe heart of the workflow. Changed the shank, moved a stone, resized the piece? Click Update and the geometry refreshes inside the open KeyShot scene — keeping the materials, lighting and camera you set up. No re-import, no reassigning, no starting over.","metadata":{"title":"Keyshot","section":"Render — start the live link","url":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#render--start-the-live-link","source":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#render--start-the-live-link","collection":"docs7","hash":"381f5461bf88f281f2d5dab6e4200824","indexed_by":"docs-index"}},{"content":"Keyshot — Export — package for later\n\nWrites the model as a KeyShot package on disk, without opening KeyShot. Use it when the rendering happens somewhere else — another machine, another person, a render specialist who takes it from there.\n\n*\n\nThe loop in practice\n1. Model the piece in RhinoArtisan.\n2. Render — the piece opens in KeyShot; dress and light it there.\n3. Render, look, and spot what the design needs.\n4. Fix it in RhinoArtisan — with the parametric tools, so a change is a parameter, not a rebuild.\n5. Update — the KeyShot scene refreshes, everything else intact.\n6. Repeat until the image and the piece are both right.\n\nGoldsmith's Tip**: iterate the design at low render quality and save the final settings for the end. The live link makes design changes cheap — let the expensive part (the final high-sample render) happen exactly once.","metadata":{"title":"Keyshot","section":"Export — package for later","url":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#export--package-for-later","source":"https://www.rhinoartisan.com/docs/7/rendering/keyshot/#export--package-for-later","collection":"docs7","hash":"29dc8968eeba1c713cd9fbfcc0a2d8e5","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio)\n\nThe photorealistic route. Materials and environments are set in the Render & Animation panel, and the actual image is produced by Render Studio, driven by Cycles — the physically based raytracer that ships with Rhino.\n\nBecause light is really traced through the scene, the things that make jewellery hard to photograph are the things this engine gets right: the reflection of an environment across a polished band, the way a stone breaks light, the contact shadow that tells the eye a piece is sitting on a surface.","metadata":{"title":"Raytracing (Render Studio)","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/","collection":"docs7","hash":"261e93b32989bf3f0759350083bbf25b","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — How the pipeline fits together\n\n1. Assign materials. The Render & Animation panel holds metals, gems, grounds, miscellaneous materials and environments, in five tabs. Drag a material onto an object, or select the object and click the material.\n2. Or assign them in bulk. Apply Design & Render Materials pushes an entire set of materials onto a design in one step, which is what you want when the piece has thirty components.\n3. Frame the shot. Safe Frame shows exactly what will end up inside the image, so nothing is cropped off in the render that looked fine in the viewport.\n4. Render. Open Render Studio from the button at the top right of the Render & Animation panel, choose what you are producing, and run it.","metadata":{"title":"Raytracing (Render Studio)","section":"How the pipeline fits together","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#how-the-pipeline-fits-together","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#how-the-pipeline-fits-together","collection":"docs7","hash":"378edb3d93e96af05d3b80c608205930","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — What Render Studio can produce\n\nThe Type setting decides the job:\n\n* Image — a single still. See How to create a rendered image.\n* Turntable — the piece rotating on itself, as a video. See How to create a turntable video.\n* Snapshot — renders from saved snapshots, so a set of views comes out consistent.\n* Curves — a line render, for technical and presentation drawings rather than photorealism.","metadata":{"title":"Raytracing (Render Studio)","section":"What Render Studio can produce","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#what-render-studio-can-produce","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#what-render-studio-can-produce","collection":"docs7","hash":"9a4fffa01485b543035380084a40e1db","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — Resolution\n\nA long list of presets covering the formats you actually publish in: 4:3, 1:1 and 16:9 up to 4K (3840×2160), plus ready-made sizes for Instagram posts, stories, reels and video, and for TikTok. Custom unlocks the width and height fields in pixels.\n\nThe presets exist so nobody has to look up what aspect ratio Instagram wants this year.","metadata":{"title":"Raytracing (Render Studio)","section":"Resolution","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#resolution","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#resolution","collection":"docs7","hash":"b24eb265d91fefa53c157119f3395595","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — Quality\n\nA passes slider, from 1 to 1000. Each pass refines the image and removes noise; more passes means a cleaner render and a longer wait. Low values are for checking a composition, high values for the final file.\n\nMode\n* Cycles — the raytracer. This is the photorealistic option.\n* Current Display Mode — renders using whatever display mode the viewport is in, which is near-instant and useful for technical or stylised output.","metadata":{"title":"Raytracing (Render Studio)","section":"Quality","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#quality","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#quality","collection":"docs7","hash":"a0dce60647f6b914226815d0f17f614a","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — Video\n\nFor turntables: 5 or 10 seconds at 12 or 24 fps as presets, or Custom to set seconds and frames per second yourself.\n\nRendering a batch\nBatch Rendering runs a whole queue of files unattended. It is the answer to a collection of forty pieces that all need the same three shots — you set it up and let the machine work while you do not.\n\nGoldsmith Tip: find your composition with a low pass count — 20 or 30 is plenty to judge framing, materials and lighting. Only raise the quality once you have decided you are rendering the final file. Most of the time people lose to rendering is spent producing clean images of a shot they end up discarding.","metadata":{"title":"Raytracing (Render Studio)","section":"Video","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#video","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#video","collection":"docs7","hash":"6e521cd2f979092d893649dc20c6a515","indexed_by":"docs-index"}},{"content":"Raytracing (Render Studio) — In this section\n\n* Render & Animation — the materials and environments panel.\n* How to create a rendered image\n* How to create a turntable video\n* Apply Design & Render Materials\n* Safe Frame\n* Batch Rendering","metadata":{"title":"Raytracing (Render Studio)","section":"In this section","url":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#in-this-section","source":"https://www.rhinoartisan.com/docs/7/rendering/raytracing/#in-this-section","collection":"docs7","hash":"9f3299a3e1f8408fcc4f86a8cbd6c58a","indexed_by":"docs-index"}},{"content":"Realtime Render — Realtime Render\n\nRealtime Render opens your design in an interactive 3D viewer, immediately. There is no render queue and no waiting for passes: the scene is exported to a lightweight 3D model and displayed in a hardware-accelerated WebGL viewer that you can spin, zoom and orbit as fast as you can move the mouse.\n\nIt is not trying to compete with Render Studio on image quality. It is solving a different problem: seeing the piece now, and letting somebody else see it too.\n\nRun it with `ArtisanRealtimeRender`, or from the Realtime Render button in the ribbon — it is in both the File and the Rendering tabs.","metadata":{"title":"Realtime Render","section":"Realtime Render","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#realtime-render","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#realtime-render","collection":"docs7","hash":"a239328c126a360ab59a0e7bb73cef5e","indexed_by":"docs-index"}},{"content":"Realtime Render — The window\n\n* A separate window with the piece loaded, ready to be turned around — orbit, pan and zoom with the mouse.\n* Live Update — a checkbox (off by default) that keeps the viewer in sync with the Rhino document. Turn it on and the viewer follows your edits as you make them; leave it off and the model stays as it was when you opened it.\n* Refresh — pushes the current state of the document to the viewer once, on demand.\n\nOpening the window always shows the document you are actually working on, so you never present a client a piece from the previous file.","metadata":{"title":"Realtime Render","section":"The window","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#the-window","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#the-window","collection":"docs7","hash":"5706b1f6337e94cfd06e5ebf74200284","indexed_by":"docs-index"}},{"content":"Realtime Render — Dressing the piece\n\nThe viewer is not just a spinner — it is a quick dressing room. Click a part to select it (Shift-click adds to the selection), then open one of the panels on the left toolbar and apply a material.\n\nMetals\nEvery document metal in six finishes: Polished, Brushed, Florentine, Hammered, Rough and Sandblast — white, yellow and rose golds, sterling silvers, platinum, titanium and the numbered gold alloys, each one a click away.","metadata":{"title":"Realtime Render","section":"Dressing the piece","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#dressing-the-piece","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#dressing-the-piece","collection":"docs7","hash":"5a981b6d79a776576a7ffd39d2f9f895","indexed_by":"docs-index"}},{"content":"Realtime Render — Gemstones\n\nThe full gem palette, transparent and opaque: diamond, ruby, sapphire, emerald, amethyst, citrine, quartz and the rest — so the center stone can go from emerald to sapphire while the client is looking at it.\n\nOther\nThe materials that are neither metal nor gem: Pearl in its white, golden, Tahitian and Akoya varieties, Enamel in a full range of colors, plus Ceramic and Leather.","metadata":{"title":"Realtime Render","section":"Gemstones","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#gemstones","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#gemstones","collection":"docs7","hash":"aa1ff0c475f0ead05b442aa3c352f7d9","indexed_by":"docs-index"}},{"content":"Realtime Render — Backgrounds\n\nA palette of preset backgrounds — neutral greys and whites for evaluating the piece, blacks for drama, soft tints to match where it will be shown — and, on top of the panel, two color selectors: pick the Top and Bottom colors yourself and the gradient between them is previewed live and applied instantly. The background is part of the captured image, so pick it before you shoot.","metadata":{"title":"Realtime Render","section":"Backgrounds","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#backgrounds","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#backgrounds","collection":"docs7","hash":"70cb46641c5b4c7177b341d1af0a13d6","indexed_by":"docs-index"}},{"content":"Realtime Render — Advanced\n\nThe Advanced panel is a small post-production studio — every effect has its own Enabled switch, so you pay only for what you turn on:\n\n* Bevel — light-catching rounded edges: radius, strength, edge amplitude and resolution.\n* Shadows — ground shadows with full control over darkness, blur, falloff, scale, contact and color, separate opacity for metals and gems, and the light direction on all three axes.\n* Ambient Occlusion — soft contact shading in crevices and between stones: radius and intensity.\n* Depth of Field — a photographic focus plane with adjustable focus distance, focal length and bokeh, for that macro-lens product shot.\n* Bloom — a glow on the brightest highlights: intensity, threshold and radius.\n* Vignette — darkened corners that pull the eye to the piece: offset and darkness.\n* Brightness / Contrast and Hue / Saturation — final color grading, right in the viewer.\n\nWhy the bevel matters: a CAD model has mathematically sharp edges, but a real piece never does — casting and polishing round every edge, and it is precisely those rounded edges that catch the light. The bevel simulates that rounding, which is why turning it on makes the piece instantly read as metal instead of a 3D model.","metadata":{"title":"Realtime Render","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#advanced","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#advanced","collection":"docs7","hash":"483128b77bee8e37b015ea8de534a19d","indexed_by":"docs-index"}},{"content":"Realtime Render — Scene Materials\n\nEverything you apply is listed under Scene Materials — one entry per material with the parts it covers, so you can reselect or restyle a part from the list instead of hunting for it in the viewport. The whole viewer setup is saved inside the `.3dm`: reopen the file next week and the piece is dressed exactly as you left it.\n\nAnd the materials are not fixed: the edit button on each entry opens a small editor with the properties that make sense for that material type —\n\n* Color on everything, as a picker or a hex code — nudge an emerald towards mint, match a client's enamel reference exactly.\n* Roughness on metals, from mirror polish to satin.\n* IOR and Opacity on gems — the refraction and transparency that give a stone its character.\n* Brightness and Saturation on the rest.\n\nEdited materials are flagged with a dot in the list, and Reset to material defaults takes any experiment back to the original — so there is no way to break anything.","metadata":{"title":"Realtime Render","section":"Scene Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#scene-materials","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#scene-materials","collection":"docs7","hash":"23cee182210664f1a5767dbbcb6752a6","indexed_by":"docs-index"}},{"content":"Realtime Render — Showing and sharing\n\nThe toolbar covers the presentation itself:\n\n* Views — front, back, left, right, top, bottom and three-quarter orthographic views, plus zoom extents, zoom in/out, and a default camera you can save and return to.\n* Turntable — a continuous 360° rotation for hands-free display.\n* Download — saves a still image of exactly what you see — the piece dressed in its materials, background and shadows included — as a PNG, ready to drop into a WhatsApp chat or an email. One click, no dialog.\n* Record — captures the viewer as a video clip. Clicking it asks how long: a fixed Duration in seconds, or Until I stop it for a free take. While recording, a timer runs and the button becomes Stop; spin the piece by hand or let the turntable do it, and the clip saves when time is up or you stop it. The fastest product video you will ever make — no render farm, no editing.","metadata":{"title":"Realtime Render","section":"Showing and sharing","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#showing-and-sharing","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#showing-and-sharing","collection":"docs7","hash":"dcecd58c040c9a410af2f63534a8205c","indexed_by":"docs-index"}},{"content":"Realtime Render — When to use it\n\n* In front of a customer. Handing someone a ring they can turn around themselves is a different conversation from showing them a picture of it.\n* During design reviews. Checking proportions, how the shank meets the head, or whether a stone reads at the size you intended, all without stopping to render.\n* As a sanity check. A quick look from every angle catches things that hide in an orthographic viewport.\n\nGoldsmith's Tip: turn Live Update on while you are iterating with someone watching. They see the change land as you make it, which turns a review into a conversation instead of a sequence of screenshots.","metadata":{"title":"Realtime Render","section":"When to use it","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#when-to-use-it","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#when-to-use-it","collection":"docs7","hash":"c1a4c89ae08e7a810e64cc65e790cd10","indexed_by":"docs-index"}},{"content":"Realtime Render — Notes\n\n* The viewer runs on WebView2, the Microsoft Edge component that ships with Windows, served from a small local server on your own machine. Your model never leaves your computer.\n* The exported model is cached. If the document has not changed since the last export, reopening the window loads instantly instead of exporting again.\n* If you never open Realtime Render, none of this runs — there is no background export and no cost to having the feature there.\n* Because it is a realtime viewer, materials are an approximation. Gems and polished metals in particular look considerably better in Render Studio — use that for anything a client will keep.","metadata":{"title":"Realtime Render","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#notes","source":"https://www.rhinoartisan.com/docs/7/rendering/realtime/#notes","collection":"docs7","hash":"e5547d69743f34af8102b3683a1fb0a3","indexed_by":"docs-index"}},{"content":"Render & Animation — Render & Animation\n\nThe Render & Animation panel stores all the resources you need to create rendered images and animated videos from your designs. Inside, you will see five tabs containing materials and environments and a tab where you can set the parameters of your renders.\n\nThe button at the top right corner of this panel opens the Rendering Studio, where you can create your images and videos. The button to the left previews how a rendered image would look with your selected parameters and configurations.\n\nTo add a material to an object in your scene, you can either drag and drop the material on the object or select the object and then click on the material. This doesn't apply to floor materials, as these can only be used for the ground plane of your scene. To use them, you just need to click on the desired floor material.\n\nTo optimize space, we suggest docking this toolbar to the right side of your layout, especially within the same panel where you have other toolbars.","metadata":{"title":"Render & Animation","section":"Render & Animation","url":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#render--animation","source":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#render--animation","collection":"docs7","hash":"47bd2fd80a21284d324d4700d91d9115","indexed_by":"docs-index"}},{"content":"Render & Animation — Metal Materials\n\nIt's the first tab from left to right.\n\nThis menu contains materials for metals such as gold, silver, and platinum. It also includes some textured materials and waxes.\n\nGem Materials\nIt's the second tab from left to right.\n\nThis menu contains materials for gems such as diamonds, emeralds, sapphires, and many more. Additionally, you can also find some materials for pearls.","metadata":{"title":"Render & Animation","section":"Metal Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#metal-materials","source":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#metal-materials","collection":"docs7","hash":"4185b514669d1a6b8f3ba4ec0c9b5f6f","indexed_by":"docs-index"}},{"content":"Render & Animation — Ground Materials\n\nIt's the third tab from left to right.\n\nThis menu contains materials for the floor of your scenario. You can apply them by simply clicking on them. Many ground materials are basically reflective or matte colors, but others have patterns and textures to them.\n\nYou can only have one Ground active at a time.","metadata":{"title":"Render & Animation","section":"Ground Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#ground-materials","source":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#ground-materials","collection":"docs7","hash":"9096d86fa27d5a89d57e6c99f8ee94f9","indexed_by":"docs-index"}},{"content":"Render & Animation — Miscellaneous Materials\n\nIt's the fourth tab from left to right.\n\nThis menu contains materials for props and other decorative objects. You can apply these to busts, boxes, and other background objects.\n\nEnvironments\nIt's the fifth tab from left to right.\n\nThe different items you will find inside this category are called Environments. Each environment has its own lighting settings and unique HDRIs.\n\nTo apply an Environment to your scene, click on the Environment you want to use. You can't have more than one Environment active at a time.","metadata":{"title":"Render & Animation","section":"Miscellaneous Materials","url":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#miscellaneous-materials","source":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#miscellaneous-materials","collection":"docs7","hash":"2e3527a9c7df2bcc979a1aa2eb07df1e","indexed_by":"docs-index"}},{"content":"Render & Animation — Settings\n\nIt's the sixth tab from left to right.\n\nOn this menu, you can set the different parameters to generate your rendered image or video:\n\n* Type: Sets whether an Image, Turntable video, Snapshots video, or Curves video will be created. Note that videos take considerably longer to create as they are made out of multiple images in sequence.\n* Resolution: Defines the output resolution of your render, the higher the resolution, the more time it will take to finish creating the render.\n* Quality: With this parameter, you can decide the resulting quality of your rendered image (or images in the case of a video). Each unit represents a pass the render engine makes to smooth the image. We suggest settling for 500 passes by default.\n* Mode: Only visible if Turntable, Snapshots, or Curves, is selected on the Type parameter. Can be set to Cycles to use Rhino's default raytracing rendering, or Current Display Mode to use the method you are using now.\n* Video: Only visible if Turntable, Snapshots, or Curves, is selected on the Type parameter. This sets the duration in seconds and the frame rate of the resulting rendered video. Selecting Custom allows you to define the seconds and fps you want to achieve.\n* Snapshots: Only visible if Snapshots is selected on the Type parameter. It will display the snapshots you have set, clicking on them will bring your viewport to that point.\n* Curves: Only visible if Curves is selected on the Type parameter. Displays 2 buttons, Rail, which allows you to select the curve that will follow as a path, and Target, which allows you to select a target that will orient to.\n\nThe time it takes for an image to get rendered will highly depend on the hardware specifications of your device.","metadata":{"title":"Render & Animation","section":"Settings","url":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#settings","source":"https://www.rhinoartisan.com/docs/7/rendering/render-and-animation/#settings","collection":"docs7","hash":"a0b7e001fbd72df2361d6fd872f18f61","indexed_by":"docs-index"}},{"content":"Safe Frame — Safe frame\n\nThe Safe Frame displays the view area rendered in the active window. The sizes of these zones can be customized, which is useful when the specified render resolution is different from that of the active view.\n\nActivating the Safe Frame\nYou can activate it from the Rendering tab or by typing the command `ArtisanSafeFrame`. When rendering, all elements not inside these frames will not appear in the final render.","metadata":{"title":"Safe Frame","section":"Safe frame","url":"https://www.rhinoartisan.com/docs/7/rendering/safe-frame/#safe-frame","source":"https://www.rhinoartisan.com/docs/7/rendering/safe-frame/#safe-frame","collection":"docs7","hash":"8dab8295c6a9ce37ab5b6c93e263e5c2","indexed_by":"docs-index"}},{"content":"Safe Frame — Safe Frame Size\n\nThe size of the safe zone will depend on the resolution you have set for the render.","metadata":{"title":"Safe Frame","section":"Safe Frame Size","url":"https://www.rhinoartisan.com/docs/7/rendering/safe-frame/#safe-frame-size","source":"https://www.rhinoartisan.com/docs/7/rendering/safe-frame/#safe-frame-size","collection":"docs7","hash":"89caa279550a6607f02a925ca798bc90","indexed_by":"docs-index"}},{"content":"Boutique — Boutique\n\nBoutique is a library of ready-made jewelry collections: professional, production-ready designs organized by collection, meant both as inspiration and as starting points for your own work. Alongside the official collections you can create your own and share them with clients — a catalog to co-create from, right inside Rhino.","metadata":{"title":"Boutique","section":"Boutique","url":"https://www.rhinoartisan.com/docs/7/retail/boutique/#boutique","source":"https://www.rhinoartisan.com/docs/7/retail/boutique/#boutique","collection":"docs7","hash":"d60bc0f91d0aa07f2c0627f0379aaec1","indexed_by":"docs-index"}},{"content":"Boutique — How it works\n\nThe first time you open Boutique, RhinoArtisan offers to download the available collections — content for both Boutique and Components. Once downloaded, they are installed in your user folder and appear in the Boutique window, each with its cover image, title, and short description.\n\nOpen a collection and every design inside is shown with its image, name, and description. Click a design and it is inserted into the viewport, ready to customize or send to production. The window stays open, so you can keep browsing and inserting without interruption.\n\nOnce inserted, a design is ordinary RhinoArtisan geometry: edit it, resize it, price it, export it as STL for printing, or hand it to a client as-is.\n\nEverything around the collections themselves — downloading the official ones, importing, creating your own, and sharing them — is covered in Collections.","metadata":{"title":"Boutique","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/retail/boutique/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/retail/boutique/#how-it-works","collection":"docs7","hash":"6357a9decafabdcf4e4a3442a136a16a","indexed_by":"docs-index"}},{"content":"Catalog\n\nThis is the official catalog — what Download installs, kept up to date as new collections are released: 13 Boutique collections with 176 complete designs, and 20 Components libraries with 466 parts. Open any collection to browse every piece inside. Alongside these, the collections you create yourself appear in the same windows, visible only to you.","metadata":{"title":"Catalog","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/","collection":"docs7","hash":"b9d46ef95601928d0782c503cfc883ca","indexed_by":"docs-index"}},{"content":"Catalog — Boutique\n\nComplete, production-ready designs — insert one and it lands in your viewport, ready to customize, price, or cast as it is.\n\nSolitaires Elegant designs showcasing the unmatched brilliance and purity of a single gemstone for life’s meaningful moments. 15 designs\n\nTrilogies A harmonious trio of stones, symbolizing love's past, present, and future in timeless elegance. 16 designs\n\nHalo The Halo Collection highlights a central gem surrounded by smaller stones, offering brilliance and versatile elegance. 16 designs\n\nVintage Style Inspired by jewellery styles of the past, find in our selection of detailed vintage designs your glittering symbol of shared love. 15 designs\n\nWeddings Bands Elegant designs showcasing the unmatched brilliance and purity of a single gemstone for life’s meaningful moments. 11 designs\n\nEuropean Eternity Rings Elegant and modern diamond bands with channel, pavé, and French setting designs that enhance every detail. 16 designs\n\nProng Eternity Bands Diamond bands with prong settings, featuring elegant designs that enhance the brilliance of each gemstone. 20 designs\n\nDiamonds Earrings Diamond earrings with elegant hoops, combining dazzling brilliance and sophistication for any occasion. 12 designs\n\nDiamond Stud Effortless elegance, with a single gemstone that adds brilliance and sophistication to any look. 15 designs\n\nDiamond Pendants Diamond pendants with an elegant, simple design, showcasing stunning brilliance and refined sophistication. 7 designs\n\nNameplates Nameplate pendants designed to reflect your unique style and add a personal touch to your look. 13 designs\n\nCocktail Rings Cocktail rings featuring a central colored gemstone, surrounded by details that create a vibrant and striking piece. 12 designs","metadata":{"title":"Catalog","section":"Boutique","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/#boutique","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/#boutique","collection":"docs7","hash":"bde647c9811a3b577e192b7adb136af8","indexed_by":"docs-index"}},{"content":"Catalog — Boutique\n\nCocktail Pendants Cocktail pendants feature a central colored gemstone, surrounded by smaller accents, creating a bold and vibrant statement piece. 8 designs","metadata":{"title":"Catalog","section":"Boutique","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/#boutique","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/#boutique","collection":"docs7","hash":"425672cb24ffea196936c2596e40fefd","indexed_by":"docs-index"}},{"content":"Catalog — Components\n\nThe parts libraries: settings, shanks, and decorative elements, each collection holding its family of components.\n\nBezels Secure and stylish settings, ready to embrace your most precious gemstones. The Bezel Collection. 48 components\n\nBasket Elegant foundations to elevate your gemstones with grace and security. The Basket Collection. 34 components\n\nPeghead A balanced, timeless base for elegant ring designs. 32 components\n\nHalos A balanced, timeless base for elegant ring designs. 18 components\n\nCluster A captivating gathering of gemstones, designed to maximize brilliance and impact. The Clusters Collection. 23 components\n\nClassic Shanks Timeless and elegant foundations, offering enduring style for every cherished gemstone. The Classic Shanks. 38 components\n\nCathedral Shanks Graceful arches that elevate the center gemstone, creating a majestic and timeless setting. The Cathedral Shanks. 31 components\n\nSignet Shanks Classic surfaces awaiting personal inscription, embodying heritage and timeless sophistication. The Signets. 18 components\n\nAdvanced Shanks Innovative and distinctive designs, pushing the boundaries of ring artistry. The Advanced Shanks. 21 components\n\nBangle Sleek and versatile wrist bases, ready to be adorned with gems or accents for a personalized style. The Bangles. 20 components\n\nBead Versatile accents for creating unique sequences or adding exquisite detail to the ends of your designs. The Beads. 17 components\n\nCharms Personalizable adornments to weave into your story, adding unique touches to bracelets, necklaces, or as elegant end accents. 21 components\n\nBail Essential components to finalize your pendant or charm designs, providing the perfect setting for a captivating centerpiece. The Bails. 24 components","metadata":{"title":"Catalog","section":"Components","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/#components","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/#components","collection":"docs7","hash":"6abad9eaffa2ba04913b1092aee83c16","indexed_by":"docs-index"}},{"content":"Catalog — Components\n\nFindings Essential jewelry findings to complete and enhance your designs, from clasps to connectors, enabling intricate creations. The Findings. 40 components\n\nMusica Harmonious accents to compose your own melodic jewelry, perfect for expressing a love of music in every detail. The Musical Elements. 6 components\n\nHearts Decorative elements to enhance your jewelry creations, adding flair and personality to necklaces, bracelets, and more. The Ornaments. 10 components\n\nOrnaments A balanced, timeless base for elegant ring designs. 24 components\n\nReligion A balanced, timeless base for elegant ring designs. 16 components\n\nZoo A balanced, timeless base for elegant ring designs. 15 components\n\nFloral A balanced, timeless base for elegant ring designs. 10 components","metadata":{"title":"Catalog","section":"Components","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/#components","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/#components","collection":"docs7","hash":"fa43bc0febcdf8dc6aef7bc6f275bda5","indexed_by":"docs-index"}},{"content":"Cocktail Pendants\n\nCocktail pendants feature a central colored gemstone, surrounded by smaller accents, creating a bold and vibrant statement piece. 8 designs\n\n← Back to the catalog","metadata":{"title":"Cocktail Pendants","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/cocktail-pendants/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/cocktail-pendants/","collection":"docs7","hash":"0c9ffc6f8c215ac60341c238c417d082","indexed_by":"docs-index"}},{"content":"Cocktail Rings\n\nCocktail rings featuring a central colored gemstone, surrounded by details that create a vibrant and striking piece. 12 designs\n\n← Back to the catalog","metadata":{"title":"Cocktail Rings","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/cocktail-rings/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/cocktail-rings/","collection":"docs7","hash":"16cf556b11e60a04032ac2576c0be29e","indexed_by":"docs-index"}},{"content":"Diamonds Earrings\n\nDiamond earrings with elegant hoops, combining dazzling brilliance and sophistication for any occasion. 12 designs\n\n← Back to the catalog","metadata":{"title":"Diamonds Earrings","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-earrings/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-earrings/","collection":"docs7","hash":"a566424e394e9af31d5a5284cad4592b","indexed_by":"docs-index"}},{"content":"Diamond Pendants\n\nDiamond pendants with an elegant, simple design, showcasing stunning brilliance and refined sophistication. 7 designs\n\n← Back to the catalog","metadata":{"title":"Diamond Pendants","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-necklaces/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-necklaces/","collection":"docs7","hash":"2d9df5e75f0a35376cc0a187d395bcc6","indexed_by":"docs-index"}},{"content":"Diamond Stud\n\nEffortless elegance, with a single gemstone that adds brilliance and sophistication to any look. 15 designs\n\n← Back to the catalog","metadata":{"title":"Diamond Stud","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-stud/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/diamond-stud/","collection":"docs7","hash":"2e9331cc69dff20c75701e078f3810e1","indexed_by":"docs-index"}},{"content":"European Eternity Rings\n\nElegant and modern diamond bands with channel, pavé, and French setting designs that enhance every detail. 16 designs\n\n← Back to the catalog","metadata":{"title":"European Eternity Rings","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/european-eternity-rings/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/european-eternity-rings/","collection":"docs7","hash":"3efd2f6b7f7aa40a737c99922e21c48a","indexed_by":"docs-index"}},{"content":"Halo\n\nThe Halo Collection highlights a central gem surrounded by smaller stones, offering brilliance and versatile elegance. 16 designs\n\n← Back to the catalog","metadata":{"title":"Halo","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/halo/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/halo/","collection":"docs7","hash":"5ac1a6bc270b28e86c9e0065dc050f31","indexed_by":"docs-index"}},{"content":"Nameplates\n\nNameplate pendants designed to reflect your unique style and add a personal touch to your look. 13 designs\n\n← Back to the catalog","metadata":{"title":"Nameplates","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/nameplates/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/nameplates/","collection":"docs7","hash":"b2b0a4406b3b706b4a4d8d3b60f2d8ec","indexed_by":"docs-index"}},{"content":"Prong Eternity Bands\n\nDiamond bands with prong settings, featuring elegant designs that enhance the brilliance of each gemstone. 20 designs\n\n← Back to the catalog","metadata":{"title":"Prong Eternity Bands","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/prong-eternity-bands/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/prong-eternity-bands/","collection":"docs7","hash":"7ef6829657290598856f2cb705e1bbc4","indexed_by":"docs-index"}},{"content":"Solitaires\n\nElegant designs showcasing the unmatched brilliance and purity of a single gemstone for life’s meaningful moments. 15 designs\n\n← Back to the catalog","metadata":{"title":"Solitaires","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/solitaires/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/solitaires/","collection":"docs7","hash":"cea5b27fb2e0ab3619bd7ce39607c147","indexed_by":"docs-index"}},{"content":"Trilogies\n\nA harmonious trio of stones, symbolizing love's past, present, and future in timeless elegance. 16 designs\n\n← Back to the catalog","metadata":{"title":"Trilogies","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/trilogies/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/trilogies/","collection":"docs7","hash":"22924fd4aa544da69b6b81198862f8c9","indexed_by":"docs-index"}},{"content":"Vintage Style\n\nInspired by jewellery styles of the past, find in our selection of detailed vintage designs your glittering symbol of shared love. 15 designs\n\n← Back to the catalog","metadata":{"title":"Vintage Style","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/vintage/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/vintage/","collection":"docs7","hash":"c6a58ef6ba35a8a660e8fca4a5d05b1d","indexed_by":"docs-index"}},{"content":"Weddings Bands\n\nElegant designs showcasing the unmatched brilliance and purity of a single gemstone for life’s meaningful moments. 11 designs\n\n← Back to the catalog","metadata":{"title":"Weddings Bands","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/wedding-bands/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/boutique/wedding-bands/","collection":"docs7","hash":"9884222400ebc6908232097a910abb0a","indexed_by":"docs-index"}},{"content":"Advanced Shanks\n\nInnovative and distinctive designs, pushing the boundaries of ring artistry. The Advanced Shanks. 21 components\n\n← Back to the catalog","metadata":{"title":"Advanced Shanks","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/advanced/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/advanced/","collection":"docs7","hash":"e9d4c2d9135dd73e4d2c027c47c3014b","indexed_by":"docs-index"}},{"content":"Bail\n\nEssential components to finalize your pendant or charm designs, providing the perfect setting for a captivating centerpiece. The Bails. 24 components\n\n← Back to the catalog","metadata":{"title":"Bail","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bail/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bail/","collection":"docs7","hash":"53c46c71705d2afe74b51e43cf8cd7f4","indexed_by":"docs-index"}},{"content":"Bangle\n\nSleek and versatile wrist bases, ready to be adorned with gems or accents for a personalized style. The Bangles. 20 components\n\n← Back to the catalog","metadata":{"title":"Bangle","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bangle/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bangle/","collection":"docs7","hash":"f48db399fb949fce0027ea4d9a66ecdc","indexed_by":"docs-index"}},{"content":"Basket\n\nElegant foundations to elevate your gemstones with grace and security. The Basket Collection. 34 components\n\n← Back to the catalog","metadata":{"title":"Basket","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/basket/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/basket/","collection":"docs7","hash":"cb2b1ef34e1cca7a0c825cc49abff69f","indexed_by":"docs-index"}},{"content":"Bead\n\nVersatile accents for creating unique sequences or adding exquisite detail to the ends of your designs. The Beads. 17 components\n\n← Back to the catalog","metadata":{"title":"Bead","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bead/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bead/","collection":"docs7","hash":"5e442b185c20c2cc68bd473c2f049b87","indexed_by":"docs-index"}},{"content":"Bezels\n\nSecure and stylish settings, ready to embrace your most precious gemstones. The Bezel Collection. 48 components\n\n← Back to the catalog","metadata":{"title":"Bezels","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bezel/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/bezel/","collection":"docs7","hash":"0b9d82f0df477bc365c3a11bd013b4e3","indexed_by":"docs-index"}},{"content":"Cathedral Shanks\n\nGraceful arches that elevate the center gemstone, creating a majestic and timeless setting. The Cathedral Shanks. 31 components\n\n← Back to the catalog","metadata":{"title":"Cathedral Shanks","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/cathedral/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/cathedral/","collection":"docs7","hash":"1cdd1078d17c56cf900a6c5a59bc32e2","indexed_by":"docs-index"}},{"content":"Charms\n\nPersonalizable adornments to weave into your story, adding unique touches to bracelets, necklaces, or as elegant end accents. 21 components\n\n← Back to the catalog","metadata":{"title":"Charms","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/charm/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/charm/","collection":"docs7","hash":"1d65c29d7e2afdea39ec7102359c6655","indexed_by":"docs-index"}},{"content":"Classic Shanks\n\nTimeless and elegant foundations, offering enduring style for every cherished gemstone. The Classic Shanks. 38 components\n\n← Back to the catalog","metadata":{"title":"Classic Shanks","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/classic/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/classic/","collection":"docs7","hash":"f5b64357d89beff7e16fee53f94a137d","indexed_by":"docs-index"}},{"content":"Cluster\n\nA captivating gathering of gemstones, designed to maximize brilliance and impact. The Clusters Collection. 23 components\n\n← Back to the catalog","metadata":{"title":"Cluster","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/cluster/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/cluster/","collection":"docs7","hash":"3af2707531971945c2f32a1ec25a3fdb","indexed_by":"docs-index"}},{"content":"Findings\n\nEssential jewelry findings to complete and enhance your designs, from clasps to connectors, enabling intricate creations. The Findings. 40 components\n\n← Back to the catalog","metadata":{"title":"Findings","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/findings/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/findings/","collection":"docs7","hash":"edc180be66e9cb60f5ac97c1b93d3f03","indexed_by":"docs-index"}},{"content":"Floral\n\nA balanced, timeless base for elegant ring designs. 10 components\n\n← Back to the catalog","metadata":{"title":"Floral","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/floral/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/floral/","collection":"docs7","hash":"0b538e3f923efeb7d75440eb363b2af4","indexed_by":"docs-index"}},{"content":"Halos\n\nA balanced, timeless base for elegant ring designs. 18 components\n\n← Back to the catalog","metadata":{"title":"Halos","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/halo/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/halo/","collection":"docs7","hash":"60f09bd2ca02d229d3833725156ffc29","indexed_by":"docs-index"}},{"content":"Hearts\n\nDecorative elements to enhance your jewelry creations, adding flair and personality to necklaces, bracelets, and more. The Ornaments. 10 components\n\n← Back to the catalog","metadata":{"title":"Hearts","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/heart/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/heart/","collection":"docs7","hash":"9da7631269f18e1d25f6a076b4fdb37f","indexed_by":"docs-index"}},{"content":"Musica\n\nHarmonious accents to compose your own melodic jewelry, perfect for expressing a love of music in every detail. The Musical Elements. 6 components\n\n← Back to the catalog","metadata":{"title":"Musica","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/music/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/music/","collection":"docs7","hash":"5e2a79ff7319e7bb926a0eeab47d1a7e","indexed_by":"docs-index"}},{"content":"Ornaments\n\nA balanced, timeless base for elegant ring designs. 24 components\n\n← Back to the catalog","metadata":{"title":"Ornaments","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/ornament/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/ornament/","collection":"docs7","hash":"d1c6fbed7c4cc931abdb66d2711d9c06","indexed_by":"docs-index"}},{"content":"Peghead\n\nA balanced, timeless base for elegant ring designs. 32 components\n\n← Back to the catalog","metadata":{"title":"Peghead","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/peghead/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/peghead/","collection":"docs7","hash":"0441364610820d4efd79056ee8773eef","indexed_by":"docs-index"}},{"content":"Religion\n\nA balanced, timeless base for elegant ring designs. 16 components\n\n← Back to the catalog","metadata":{"title":"Religion","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/religion/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/religion/","collection":"docs7","hash":"c9d8481566c3e2d9b1c5df29cb159c42","indexed_by":"docs-index"}},{"content":"Signet Shanks\n\nClassic surfaces awaiting personal inscription, embodying heritage and timeless sophistication. The Signets. 18 components\n\n← Back to the catalog","metadata":{"title":"Signet Shanks","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/signet/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/signet/","collection":"docs7","hash":"e66e8186733eb3c99e8e8a319d6448ad","indexed_by":"docs-index"}},{"content":"Zoo\n\nA balanced, timeless base for elegant ring designs. 15 components\n\n← Back to the catalog","metadata":{"title":"Zoo","url":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/zoo/","source":"https://www.rhinoartisan.com/docs/7/retail/catalog/components/zoo/","collection":"docs7","hash":"5bc45f7d9c0dec30aacfc7d6f271b247","indexed_by":"docs-index"}},{"content":"Collections\n\nEverything in Boutique and Components is organized in collections: sets of designs or parts with a cover, a title, and a description. Some come from the official RhinoArtisan catalog; others you build yourself and share as a single\n`.zip`. The tools that manage them all live in the submenu of the Boutique button, in the File menu.","metadata":{"title":"Collections","url":"https://www.rhinoartisan.com/docs/7/retail/collections/","source":"https://www.rhinoartisan.com/docs/7/retail/collections/","collection":"docs7","hash":"94cd42c443b9a8ed268a69d7d906dd7c","indexed_by":"docs-index"}},{"content":"Collections — The life of a collection\n\nDownload is where the official content arrives: it checks which collections from the RhinoArtisan catalog you are missing — Boutique and Components alike — and installs the ones you pick. When something new is released, a notification in the Boutique window points you back here. What ships in that catalog is listed in the Catalog.\n\nCreate turns a folder of your own\n`.3dm` designs into a collection: covers, previews, multi-metal images, prices and descriptions — everything the product details allow. The result can go straight into your catalog or be packaged as a\n`.zip`; Import is the other side of that exchange, installing any collection shared with you.\n\nDelete All wipes the collections folder for a clean start — your own collections included, so keep a `.zip` of anything you made before running it.","metadata":{"title":"Collections","section":"The life of a collection","url":"https://www.rhinoartisan.com/docs/7/retail/collections/#the-life-of-a-collection","source":"https://www.rhinoartisan.com/docs/7/retail/collections/#the-life-of-a-collection","collection":"docs7","hash":"eff6d2cb49ab87c135c7ede1d0203ab3","indexed_by":"docs-index"}},{"content":"Collections — The commands\n\nDownload Get the official catalog, and the new collections as they are released.\n\nImport Add a collection shared with you as a .zip.\n\nCreate Turn a folder of your own designs into a collection.\n\nDelete All Remove every collection from your user folder.\n\nIncluded Collections What ships in the official catalog.","metadata":{"title":"Collections","section":"The commands","url":"https://www.rhinoartisan.com/docs/7/retail/collections/#the-commands","source":"https://www.rhinoartisan.com/docs/7/retail/collections/#the-commands","collection":"docs7","hash":"b8e99f1f22f1bb17f4923a7800434e97","indexed_by":"docs-index"}},{"content":"Components — Components\n\nWhere Boutique offers complete designs, Components offers the parts: bezels, baskets, classic and cathedral shanks, ornaments, findings, and more — the building blocks a custom piece is assembled from, with professional geometry and consistent quality.\n\nHow it works\nThe first time you open Components, RhinoArtisan offers to download the component collections; they install into your user folder and appear as covers in the Components window. Click a collection to see its parts, each with a name and description, and click a part to insert it into the viewport, ready to position and combine into your design.\n\nTwo selectors, at the top right of each collection that supports them, adapt the part before it is inserted:\n\n* In the ring collections, choose the finger size the design comes in at.\n* In presets like Bezels, Baskets, Pegheads, Halos, and Clusters, choose the stone: its material and its measurements, in carats or millimeters.\n\nThe window stays open, so a whole piece — shank, head, accents — can be pulled together without leaving it.","metadata":{"title":"Components","section":"Components","url":"https://www.rhinoartisan.com/docs/7/retail/components/#components","source":"https://www.rhinoartisan.com/docs/7/retail/components/#components","collection":"docs7","hash":"83f74e6612dec7485948ac79b769cfda","indexed_by":"docs-index"}},{"content":"Create\n\nBring your jewelry collections to life: the Create a Collection command, in the submenu of the Boutique button under the File menu, turns a folder of your own designs into a Boutique or Components collection.\n\nPrepare Your Files\nEnsure your .3dm files are ready with basic details filled in the Boutique Panel (both Name and Description are required).\\ Add a cover image named either `Collection.jpg` or `Components.jpg`.\\ Optionally, include preview images for each design using the same name as the .3dm file.","metadata":{"title":"Create","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/","collection":"docs7","hash":"32cfc73f972c0d4eb6d2ad812f0f5532","indexed_by":"docs-index"}},{"content":"Create — Organize Your Folder\n\nThe folder must contain only the required files: the `.3dm` file, the cover image in `.jpg` format, and optionally, preview images also in `.jpg` format. No other file types should be included. Make sure all images are saved as `.jpg` to ensure compatibility.\n\nStart the Collection Process\nOpen the Boutique menu and select Create a Collection.","metadata":{"title":"Create","section":"Organize Your Folder","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#organize-your-folder","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#organize-your-folder","collection":"docs7","hash":"5929260bf0d45602c4f88f0e0d2d650a","indexed_by":"docs-index"}},{"content":"Create — Select Your Folder\n\nBrowse and choose the folder containing your prepared files.\n\nChoose the Collection Type\nSelect between Boutique collections, designed for in-store co-creation with your customers, or Components collections, perfect for assembling individual parts into stunning designs.\n\nEnter Collection Details\nInput the Collection Name and Description when prompted.","metadata":{"title":"Create","section":"Select Your Folder","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#select-your-folder","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#select-your-folder","collection":"docs7","hash":"6bf8440cf88c385815650643af5a5e51","indexed_by":"docs-index"}},{"content":"Create — Configure Multi-Metal Options (if needed)\n\nThe system will ask if the collection supports Multi-Metals.\n\n* If yes, include extra images for each metal color:\n* `W` for White\n* `Y` for Yellow\n* `R` for Rose\n\nFinalize the Collection\nChoose whether to:\n\n* Add the collection to your catalog, or\n* Generate a .zip file for external use.\n\nWhy generate a .zip file?\nCreating a .zip file gives you the flexibility to share your collection effortlessly outside RhinoArtisan. Send it to your customers for review, collaborate seamlessly with your design team, or keep a backup of your work neatly organized. It’s the perfect way to present your designs anywhere, anytime—whether you're emailing concepts, working remotely, or showcasing your collection at events.","metadata":{"title":"Create","section":"Configure Multi-Metal Options (if needed)","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#configure-multi-metal-options-if-needed","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/#configure-multi-metal-options-if-needed","collection":"docs7","hash":"77229b20e87d902eca40377e31456f85","indexed_by":"docs-index"}},{"content":"Product Details\n\nTurn every design into a masterpiece with the right details. From a captivating name and enticing description to setting the perfect price and marking your featured items—these small touches make a big difference.","metadata":{"title":"Product Details","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/product-details/","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/product-details/","collection":"docs7","hash":"c3302ef3504df2af32336c9817ad3f34","indexed_by":"docs-index"}},{"content":"Product Details — How to define the product details?\n\nTo create your own Boutique or Components collection, you must start by preparing your `.3dm` files with a minimum amount of information entered in the Boutique Panel, available from the File menu in RhinoArtisan. In this panel, you can fill out the following details for each design:\n\n* Name (required)\n* Description (required)\n* SKU\n* Regular Price\n* Sale Price\n* Highlight (to mark featured items)\n\nOnly the Name and Description are mandatory, as these will appear under each item's image when browsing the collection.\n\nYou’ll also need a cover image for your collection:\n\n* The image must be named `Collection.jpg` for Boutique collections or `Components.jpg` for Components collections.\n* It must be placed in the same folder as the `.3dm` files.\n\nAdditionally, you can provide individual preview images for each design:\n\n* Each image must have the same name as its corresponding `.3dm` file.\n* If no image is provided, RhinoArtisan will automatically generate one by capturing a viewport screenshot of the model.\n\nIf you want to offer multiple metal color options (such as white, yellow, or rose gold) for a design, you can activate the Multi-Metal Selector during the collection creation.\\ To enable this feature:\n\n* Include additional images named by adding a suffix to the `.3dm` filename:\n* W for White\n* Y for Yellow\n* R for Rose\n* For example, if a design is named BE1001, you should provide:\n* `BE1001` (main image)\n* `BE1001W` (white metal version)\n* `BE1001Y` (yellow metal version)\n* `BE1001R` (rose metal version)\n\nThis allows users to switch between metal color options through a color selector located in the top right corner when viewing the collection.","metadata":{"title":"Product Details","section":"How to define the product details?","url":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/product-details/#how-to-define-the-product-details","source":"https://www.rhinoartisan.com/docs/7/retail/create-a-collection/product-details/#how-to-define-the-product-details","collection":"docs7","hash":"b3e548f27465fd26aefe9118e363e822","indexed_by":"docs-index"}},{"content":"Curator — Curator\n\nCurator is the keeper of the elements you reach for again and again: earring posts and clasps, ornaments and motifs — and anything of your own worth keeping. Every element lives in a folder, shows as a thumbnail, and one click inserts it into the document, ready to position.\n\nThe library has two doors, both onto the same content: the docked Curator panel (`ArtisanCuratorPanel`, from the File tab's panel list) that stays open while you work, and the full-screen Curator dialog (`ArtisanCurator`, the Curator button on the Accessories tab) for browsing with bigger thumbnails — that one also zooms to the element after inserting it.","metadata":{"title":"Curator","section":"Curator","url":"https://www.rhinoartisan.com/docs/7/retail/curator/#curator","source":"https://www.rhinoartisan.com/docs/7/retail/curator/#curator","collection":"docs7","hash":"010bfdfe421d9a88212350a0df271cd1","indexed_by":"docs-index"}},{"content":"Curator — The panel\n\nFive buttons in the toolbar, then a search box, the folder selector, and the thumbnail grid:\n\n* Add a folder — creates a new folder in your library; you are asked for a name (the current document's name is offered as default).\n* Open folder — opens the Curator folder in Windows Explorer. Renaming or deleting folders and elements is done here, with ordinary files.\n* Add Curator Collection from File — imports a collection packaged as a\n`.zip`, from the online gallery or shared with you.\n* Online Curator Gallery — opens the collection page on the RhinoArtisan website in your browser.\n* Save on Curator — turns your current selection into a library element.\n\nThe search box looks across the whole library at once — element and folder names alike — so \"clasp\" finds every clasp no matter which folder it sleeps in. Clear it and you are back in the selected folder.","metadata":{"title":"Curator","section":"The panel","url":"https://www.rhinoartisan.com/docs/7/retail/curator/#the-panel","source":"https://www.rhinoartisan.com/docs/7/retail/curator/#the-panel","collection":"docs7","hash":"12b7a607ae6b7b1601a6e0d1dae52c7c","indexed_by":"docs-index"}},{"content":"Curator — Building your own library\n\nSelect the objects you want to keep, pick the destination folder, click Save on Curator, and give the element a name. That is the whole workflow: the element is exported to the library and its thumbnail is generated automatically from the file's preview. Next week it is one click away, in this document or any other.","metadata":{"title":"Curator","section":"Building your own library","url":"https://www.rhinoartisan.com/docs/7/retail/curator/#building-your-own-library","source":"https://www.rhinoartisan.com/docs/7/retail/curator/#building-your-own-library","collection":"docs7","hash":"a947ce28256f16962b35de2d55a78597","indexed_by":"docs-index"}},{"content":"Curator — Growing it with collections\n\nAdditional Curator collections are available in your Dashboard on the RhinoArtisan website — click Online Curator Gallery to browse and download them. They are updated regularly, with new elements and entirely new collections added over time.\n\nA downloaded collection arrives as a `.zip`: click Add Curator Collection from File, pick the file, and it is installed and listed alongside your own folders. The same route works for collections a colleague shares with you.\n\nThe Curator collections on the website require a Commercial RhinoArtisan license; importing collections is not available on educational and trial licenses.","metadata":{"title":"Curator","section":"Growing it with collections","url":"https://www.rhinoartisan.com/docs/7/retail/curator/#growing-it-with-collections","source":"https://www.rhinoartisan.com/docs/7/retail/curator/#growing-it-with-collections","collection":"docs7","hash":"3953d604cc931f318f91740b22c752d5","indexed_by":"docs-index"}},{"content":"Curator — Where it lives\n\nThe library is a plain folder on disk —\n`%APPDATA%\\Artisan\\7.0\\Curator` by default, or wherever your custom folder in Options → Artisan → Folders points. Each element is just a thumbnail next to its 3dm file, which makes the whole library easy to back up, sync, or carry to another machine.\n\nGoldsmith's Tip: Make a folder per thing you actually repeat — *Clasps*,\n*Client logos*, *Bails that sell* — not per project. The moment saving an element to Curator becomes a habit, every future design starts three clicks ahead.","metadata":{"title":"Curator","section":"Where it lives","url":"https://www.rhinoartisan.com/docs/7/retail/curator/#where-it-lives","source":"https://www.rhinoartisan.com/docs/7/retail/curator/#where-it-lives","collection":"docs7","hash":"ec2dd2bc7237929e89fd01483aa51c57","indexed_by":"docs-index"}},{"content":"Delete All — Delete all Collections\n\nThe Delete all Collections command is located in the submenu of the Boutique button, found under the File menu in RhinoArtisan.\n\nWhen clicking the Delete all Collections button, the system will prompt you to confirm the removal of the Boutique folder from your user directory. This folder contains the collections for both Boutique and Components, so both will be deleted.\n\nIf you then access either Boutique or Components, a warning will appear indicating that no collections are available, and you will be asked if you would like to download them. If you choose to proceed, the Collection Download window provided by RhinoArtisan will appear, just as it does when using the Download Collections button.\n\nCollections you created or imported yourself live in the same folder and are deleted too. Keep a `.zip` of your own collections before running this command — see Create a Collection.","metadata":{"title":"Delete All","section":"Delete all Collections","url":"https://www.rhinoartisan.com/docs/7/retail/delete-all-collections/#delete-all-collections","source":"https://www.rhinoartisan.com/docs/7/retail/delete-all-collections/#delete-all-collections","collection":"docs7","hash":"5b7960ef73c65f1463da4ccb80519cad","indexed_by":"docs-index"}},{"content":"Download — Download Collections\n\nThe Download Collections command is located in the submenu of the Boutique button, found under the File menu in RhinoArtisan.\n\nWhen you click Download Collections, the system will automatically check whether all official collections provided by RhinoArtisan are already available in your setup. If it detects any new or missing collections, a window will appear listing the collections that are available for download.\n\nBy clicking the Download button, the selected collections will be added to your system — whether they are Boutique collections or Components collections. Once downloaded, they will become immediately accessible within the corresponding module.\n\nAdditionally, whenever a new collection is released, a notification will appear in the top-right corner of the Boutique or Components window, informing you about the available updates. You can click on this message or manually run the Download Collections command to see which collections from the RhinoArtisan catalog are missing and download them accordingly.\n\nThis feature helps you keep your design library up to date and ensures you never miss out on the latest creations offered by RhinoArtisan.\n\nLooking for what ships with RhinoArtisan? See Included Collections.","metadata":{"title":"Download","section":"Download Collections","url":"https://www.rhinoartisan.com/docs/7/retail/download-collections/#download-collections","source":"https://www.rhinoartisan.com/docs/7/retail/download-collections/#download-collections","collection":"docs7","hash":"f693b0ef0ced72e1fc38149cc8afaabd","indexed_by":"docs-index"}},{"content":"Import — Import Collection\n\nThe Import Collection command is available in the submenu of the Boutique button, located under the File menu in RhinoArtisan.\n\nThis command allows you to import a collection that has been previously created using the Create a Collection feature in RhinoArtisan. The collection must be packaged as a .zip file, either prepared by you or shared with you by a collaborator, supplier, or client.\n\nTo import a collection:\n\n1. Click Import Collection from the submenu.\n2. A dialog will appear prompting you to locate and select the `.zip` file that contains the collection.\n3. Once selected, the system will automatically install the collection and make it available under the Boutique or Components module, depending on how the original collection was created.\n\nImported collections will be displayed with their cover image, title, and description, and the individual designs will appear with their associated name and details, just like the official RhinoArtisan collections.\n\nThis feature makes it easy to exchange collections between professionals, ensuring consistency in presentation and easy collaboration.","metadata":{"title":"Import","section":"Import Collection","url":"https://www.rhinoartisan.com/docs/7/retail/import-collection/#import-collection","source":"https://www.rhinoartisan.com/docs/7/retail/import-collection/#import-collection","collection":"docs7","hash":"2280d1f31909671241404deacfeeac2a","indexed_by":"docs-index"}},{"content":"Shanks\n\nThe shank is the part of the ring that goes round the finger, and it is where almost every ring starts. Get the size right first: everything else is built on that curve.\n\nTwo groups, left to right.\n\nUtilities\nCreate Ring Curve The curve every shank is built on, at the size you choose.\n\nEstimate\n\nCut by Ring Size\n\nScoop Hollow the inside of the band to save metal and sit better on the finger.\n\nEngraving Engrave text on the band.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/7/shanks/","source":"https://www.rhinoartisan.com/docs/7/shanks/","collection":"docs7","hash":"4e1fa453adde9ab329c9d1fef3ad862e","indexed_by":"docs-index"}},{"content":"Shanks — Builders\n\nClassic The plain round band, the starting point for most rings.\n\nCathedral Shoulders that rise towards the centre stone.\n\nAdvanced Cathedral\n\nBypass\n\nEternity Stones all the way round.\n\nAdvanced Ring Build the band from your own sections along the ring curve.\n\nSignet The flat top for a seal or engraving.\n\nAdvanced Signet Ring\n\nExtrude Ring\n\nClass Ring The graduation-ring layout, with its sides and centre stone.\n\nWedding The wedding band.\n\nBand\n\nMatching\n\nPave A band prepared for pave setting.\n\nTwo Rows Two rows of stones along the band.\n\nSplit Shank The band divides as it reaches the head.\n\nGraduated A band that changes width from the bottom to the shoulders.\n\nEvery command on this tab is RhinoArtisan's own.","metadata":{"title":"Shanks","section":"Builders","url":"https://www.rhinoartisan.com/docs/7/shanks/#builders","source":"https://www.rhinoartisan.com/docs/7/shanks/#builders","collection":"docs7","hash":"94628dddaec91e75c147d7f992241e84","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral\n\nAdvanced Cathedral builds the same family of raised-arm shanks as the classic Cathedral command, but the arm is no longer a single fixed section swept from top to bottom. Here the arm is defined by a list of profiles placed along it — each one with its own shape, width and height — and the shank is swept through them. That is what lets you thin the arm where it meets the head, let it swell at the shoulder and finish wide at the bottom, all inside one object.\n\nOn top of that it carries the full gem system: a run of stones down each arm with uniform or graduated sizes, a channel, prongs or a pavé micro-setting with its cutters, and the drills.\n\nRunning the command opens the gallery of saved Advanced Cathedral elements. Click one to preview it in the viewport, double-click it to open its parameters, or press Edit in the header to start from the shank shown in the viewport.\n\nGoldsmith Tip: The arm is what carries the centre stone, so build it from the bottom up, not from the tip down. Set the ring size and the bottom profile first — that is the section your customer actually feels — then add an intermediate profile at the shoulder and only afterwards close in the tip with Opening and Height. If you shape the tip first, every later change to the shoulder pushes it out of alignment with the head and you end up chasing the same two numbers over and over.","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#advanced-cathedral","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#advanced-cathedral","collection":"docs7","hash":"184f029d0b596a84644ac7ba29d20dd9","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Finger Size\n\nSets the ring size the whole shank is built around. Everything else — arm height, profile positions, the gem run — is measured from that circle, so change it before you fine-tune the rest.","metadata":{"title":"Advanced Cathedral","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#finger-size","collection":"docs7","hash":"84d4400badfef30e5515885f17c641e9","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Shank\n\nThe first tab holds the arm itself: its profiles, its overall geometry and the bridge.\n\n#### Profiles\n\nThe list shows every station along the arm, numbered from the tip (1) down to the bottom of the ring. Each row carries a colour badge, a thumbnail of its cross-section, and buttons to duplicate, edit or delete it. The colour of each badge matches the handles drawn on that station in the viewport, so you always know which row you are dragging.\n\n* Add profile (the orange-bordered button above the list): asks you to click a point on the shank curve in the viewport and inserts a new profile there. It inherits the width, height and shape of the nearest existing profile, and the list re-sorts itself so the numbering always follows the geometry.\n* Duplicate: same thing, starting from the width, height and shape of the row you clicked.\n* Delete: removes an intermediate profile. The two end profiles — the arm tip and the ring bottom — are fixed and cannot be removed; their delete buttons are disabled.\n* Apply All Profiles: when on, every station shares one single cross-section shape while keeping its own measurements — change the shape anywhere and all of them follow. Turn it off to give each station an independent shape.\n\nClicking a thumbnail or the edit button opens that profile inline:\n\n* Profile asset: pick a cross-section from the library, or open the editor to draw your own. In shared mode the choice is applied to every station at once.\n* Width: the section's width at that station, in millimetres.\n* Height: the section's height at that station, in millimetres.\n* Position: where the station sits along the arm, from 0 at the tip to 1 at the bottom of the ring. Only intermediate profiles have it — the two ends are pinned.","metadata":{"title":"Advanced Cathedral","section":"Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#shank","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#shank","collection":"docs7","hash":"a93cc03f671c4b49a896e8f9b62d0917","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Shank\n\nAccept returns to the list keeping the changes (they are applied live as you type); Close reverts the station to how it was when you opened it.\n\nThe same values are available as handles in the viewport: a centred width handle and a height handle on each station, plus a slider handle that moves an intermediate station along the arm. Hold Shift while dragging a width or height handle to apply the new value to every station at once.\n\n#### Shank\n\n* Height: how far the arm tips rise above the top of the ring.\n* Opening: the gap between the two arm tips — in practice, the room left for the head or the centre stone. It also has its own centred handle in the viewport, at tip height.\n* Tip inclination: how much the tip leans, by tilting the tangent at the end of the arm.\n* Cap length: the rounded dome that closes the arm tip. At 0 the tip is cut flat.\n* Tangent point: where the arms leave the ring. Dragged to the right the arms emerge near the top, giving a short, steep cathedral; dragged to the left they emerge lower down, past the equator, giving the long, nearly straight arm of a tall cathedral.\n\n#### Bridge\n\nThe bridge is the piece of metal that spans the top of the ring under the head.\n\n* Bridge (toggle): builds the bridge or leaves the arms open.\n* Bridge width: how wide the bridge is across the ring.\n* Bridge thickness: how far it stands out radially.\n* Bridge fillet: rounds the bridge edges. At 0 they stay sharp.\n* Bridge diameter: the diameter of the central disc. It only shows when it is larger than the bridge width and the bridge is not opened.\n* Open angle: opens a V in the centre of the bridge. Above 0 the bridge becomes an open one and the central disc disappears.","metadata":{"title":"Advanced Cathedral","section":"Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#shank","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#shank","collection":"docs7","hash":"ea034428d921d5187b04a11f99d1d21e","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Gems\n\nThe second tab sets the stones running down the arms and how they are held. Everything below is inert until the Gems toggle at the top is on.\n\n#### Sizes along the run\n\n* Gradient mode: Uniform gives every stone the same size; Gradient 2 Points interpolates between a top and a bottom size; Gradient 3 Points adds a middle stop.\n* Gem size: the single size used in Uniform mode.\n* Top / Bottom: the sizes at each end of the run, in gradient mode.\n* Middle: the size at the middle stop (3-point only).\n* Middle pos: where that middle stop sits along the run, from 0 to 1 (3-point only).\n* Min distance: the minimum gap left between stones.\n* Vertical: raises or sinks the whole run relative to the arm.\n* Margin: where the run starts, measured from the arm tip.\n* End: the angle at which the run stops, going down the arm.\n* Gem shape: Round or Square.\n\nMargin, End and, in 3-point mode, the middle stop also appear as labelled handles sliding along the gem run in the viewport, so you can set the extent of the run by eye.\n\n#### Channel\n\nThe seat the stones sit in.\n\n* Inner width: the width of the channel rail. It follows the stones, scaled by this value.\n* Inner height: the depth of the channel.\n* Bright cut: the height of the bright-cut edge between the metal and the stones.\n* Inner margin: how far the channel is inset from the inner side of the arm.\n\n#### Prong Settings\n\nThree options, chosen with the icon buttons: no prongs, shared prongs, or pavé (micro-setting). The tuning parameters below appear for shared prongs, and the cutter sections further down appear for pavé.","metadata":{"title":"Advanced Cathedral","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","collection":"docs7","hash":"dddaab8f0fc253387676b1a505a55041","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Gems\n\n* Prong height: how tall the prongs stand above the stones.\n* Prong grow: millimetres added to every prong's diameter, all growing equally.\n* Min diameter: the smallest a prong is allowed to get, whatever the stone size asks for.\n* Prong distance: pushes the prong line sideways — positive values move the prongs further apart.\n* End prongs: Single end prong puts one centred prong at each end of the run, Double end prongs puts one on each rail.\n\n#### Cutters and V-Cutters\n\nVisible in pavé mode. They carve the seats and the bright-cut grooves under the stones.\n\n* V-Cutters (toggle), Boolean (toggle) and Remove channel (toggle) at the top of the section: whether the V-cutters are built, whether the cutters are actually subtracted from the shank, and whether the channel is removed underneath. With the boolean off the cutters are shown as preview solids and are baked as separate objects on Accept, so you can subtract them yourself later.\n* Start | Height, Start | Width, End | Height, End | Width: the section of the cutter at each end of the run. When Mode is Both Sides the start and end values stay locked together; Independently unlocks them.\n* Length: how far the cutter runs.\n* Move in Z and Move Middle in Z: raise or sink the cutter, and its middle, relative to the girdle.\n* Shape: U, V, Square, Trapezoidal or French.\n* Shape Scale: blends the chosen shape between its rounder and squarer extremes.\n\nThe V-cutter block repeats the same Start | Width, Start | Height, End | Width, End | Height, Length and Move by Normal, with its own Mode (Keep Start and End locks the two ends together, Independently frees them).\n\n#### Drill Settings\n\nTwo icon buttons choose between no drill and round drill; the parameters below appear only with the drill on.","metadata":{"title":"Advanced Cathedral","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","collection":"docs7","hash":"384208a501617bf5d586ddca6e626e93","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Gems\n\n* Allow intersection: lets the drills intersect each other instead of being trimmed back.\n* Show: draws the drill solids in the preview so you can see exactly what is being removed.\n* Height top, Height crown, Height girdle, Height pavilion, Height drill: the vertical breakdown of the drill profile.\n* Size top, Size drill, Size bottom: its diameters at the top, at the drill and at the bottom.\n* Gem inside: how deep the stone sits inside the drill.\n* Drill type: Gemstone shape follows the stone outline; Round, Square and Hexagon force a fixed section.","metadata":{"title":"Advanced Cathedral","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#gems","collection":"docs7","hash":"e775fbeff127665ca4d2c076536e47ae","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Working with the panel\n\n* Refresh in the header recomputes the preview. The shank is computed in the background, so you can keep adjusting while it works.\n* Save defaults stores the current parameters as the starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n* Save stores the current shank as a local element, so it shows up in the gallery next time.\n* Accept bakes the shank, its stones, its prongs and — in pavé without the boolean — its cutters, all as one editable Artisan object.\n\nRe-editable: the shank you accept stays a parametric object. Select it and run ArtisanEdit to reopen this panel with every profile and parameter exactly as you left it; accepting again replaces the old shank and its stones in place.","metadata":{"title":"Advanced Cathedral","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-cathedral/#working-with-the-panel","collection":"docs7","hash":"848e46f014eeeee4f5153a61f99264e8","indexed_by":"docs-index"}},{"content":"Advanced Ring — Advanced Ring\n\nUsing this command, you can create advanced rings and a shank with multiple sections, measurements, and assets to create your own custom shank type.\n\nRunning this command will display its parameters in the Commands toolbar. Your first step should be to choose whether you want to start working on a style provided by RhinoArtisan or create a new one by editing the style currently displayed in the viewport.\n\nOn its parameters, you can find:","metadata":{"title":"Advanced Ring","section":"Advanced Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#advanced-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#advanced-ring","collection":"docs7","hash":"26e814b276dbbe43a62faefc1ce3f7a4","indexed_by":"docs-index"}},{"content":"Advanced Ring — Finger Size\n\nAllows users to select different finger sizes to adjust the ring accordingly.\n\nRing Curve\nThis tab defines the shape of the curve the shank is built on. Choose between four configurations:\n\nClosed\nProvides a closed curve for the ring's creation, resulting in a continuous, complete band.\n\nOpening\nProvides an open curve for the ring's creation. This option allows the user to set the degree of opening, offering more control over the design of the ring.\n\n* Opening: Controls the size of the opening in the shank.","metadata":{"title":"Advanced Ring","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#finger-size","collection":"docs7","hash":"a362e7bc3bdd1d6c71466878fe137b5e","indexed_by":"docs-index"}},{"content":"Advanced Ring — Bypass\n\nThis style of ring features two bands that gracefully curve around each other, giving the appearance of overlapping or interwoven strands.\n\n* Opening: Controls the size of the opening between the two bands.\n* Angle: Allows the user to set the rotation angle of the curves. This parameter can be used to create rings with varied twists and orientations.\n* Offset X / Offset Y: Controls the offset distance between the curves in both the X and Y axes, providing precise control over the alignment and spacing of the ring's components.","metadata":{"title":"Advanced Ring","section":"Bypass","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#bypass","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#bypass","collection":"docs7","hash":"db899342c3dd0cf583da7c470bbb6e96","indexed_by":"docs-index"}},{"content":"Advanced Ring — Shape\n\nProvides an advanced curve creation system to define the shape of the ring.\n\n* Opening: Adjusts the size of the opening in the shank, similar to the \"Opening\" shank configuration.\n* Round / Ellipse: Defines the general shape of the top portion of the shank, offering either a round or an ellipse form.\n* Diameter *(Round only)*: Modifies the diameter of the upper curve, determining the overall size of the top portion of the ring.\n* Width / Height *(Ellipse only)*: Modifies the width and height of the upper curve when the ellipse shape is selected.\n* Offset: Changes the offset of the central curve, allowing for further control of the curvature's position relative to the center.\n* Move in Z: Enables movement of the upper curve along the Z-axis, giving flexibility to the vertical positioning of the top part of the ring.\n* Start on Circle: Allows the user to select the starting point of the curve along the shape's path.\n* End on Circle: Determines the endpoint of the curve on the shape's path, providing control over the termination of the curve's design.","metadata":{"title":"Advanced Ring","section":"Shape","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#shape","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#shape","collection":"docs7","hash":"13ab620661921e8573cca3185c74cbe9","indexed_by":"docs-index"}},{"content":"Advanced Ring — Profiles\n\nIn the Profiles section, the panel displays a list of profiles used to construct the sweep forming the ring. Each profile is numbered and assigned a distinct color, facilitating its identification on the ring displayed in the viewport.\n\nBy selecting any of the listed profiles in the panel, you can modify the corresponding section of the ring. Additionally, if desired, you can edit the profile's shape using the integrated profile editor, allowing for further customization of the design.\n\n* Add: Enables users to add new profile curves to the shank. Users can select a point from the curve created in the first tab to define the shape and the parameters of the new profile.\n* Show Hide Solids: Toggles the visibility of the shank's solids in the viewport.","metadata":{"title":"Advanced Ring","section":"Profiles","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#profiles","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#profiles","collection":"docs7","hash":"c09348d3e0cfb8c77344c9ae513bf3b3","indexed_by":"docs-index"}},{"content":"Advanced Ring — Cap\n\n* Starting Cap: Allows users to define the size of the initial cap at the starting point of the shank.\n* End Cap: Provides the option to set the size of the cap at the end point of the shank.\n\nBridge\n* Switch: Toggles the bridge on or off, activating or deactivating this structural component.\n* Width: Allows users to modify the width of the bridge, changing its overall horizontal span.\n* Thickness: Defines the thickness of the bridge, allowing for adjustments to its vertical depth.\n* Diameter: Controls the diameter of the bridge, affecting its curvature or roundness.\n* Angle: Enables the user to adjust the angles of the bridge, allowing for customized shaping and orientation.","metadata":{"title":"Advanced Ring","section":"Cap","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#cap","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#cap","collection":"docs7","hash":"d2d39eb8253f151e1ccb8bc62a89ba65","indexed_by":"docs-index"}},{"content":"Advanced Ring — Rebuild Profiles\n\n* Rebuild: Toggles the automatic rebuild of the profile curves.\n* Points: Controls the number of points used to rebuild the profile curves.\n\nWhen you confirm your changes, the Advanced Ring will be listed on the Outliner toolbar.\n\nGoldsmith Tip: Jewelers can create stunning designs with this tool. Use the Closed configuration to craft a complex shank for a solitaire by adding as many sections as needed. For a Cluster ring, opt for the Opening configuration. The Bypass configuration is ideal for holding one or multiple stones between the ends, while the Shape configuration is perfect for positioning a Basket or a Bezel in the center. The only limit is your imagination!","metadata":{"title":"Advanced Ring","section":"Rebuild Profiles","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#rebuild-profiles","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-ring/#rebuild-profiles","collection":"docs7","hash":"8206c0bb11c188b106a7d045a18aa8ea","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — Advanced Signet Ring\n\nAdvanced Signet Ring builds a signet — the flat-topped ring made to carry a seal, a crest or an engraving. It takes the classic Signet construction and adds a second control over the silhouette: besides the top face and the three band sections, you give it a lateral profile, the curve seen from the side, which decides how the band grows from the bottom of the ring up into the table.\n\nThat side curve is what separates a heavy, straight-shouldered gentleman's signet from a slim one that tapers away under the finger, without touching any of the front measurements.\n\nRunning the command opens the gallery of saved Advanced Signet elements. Click one to preview it in the viewport, double-click it to open its parameters, or press Edit in the header to start from the ring shown in the viewport.\n\nGoldsmith Tip: Decide the Recess before the engraver does. A signet meant for a wax seal needs a table thick enough to be cut into and still hold; a signet that will only be laser-engraved or enamelled can be hollowed out from below and save a real amount of gold. Turn the recess on early, set Thickness to the wall your engraver asks for, and design the rest of the ring around that — going back to hollow a finished signet changes its whole weight and balance.","metadata":{"title":"Advanced Signet Ring","section":"Advanced Signet Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#advanced-signet-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#advanced-signet-ring","collection":"docs7","hash":"cbfd6a9c70b6a595ba825055a4320176","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — Finger Size\n\nSets the ring size everything else is built from.","metadata":{"title":"Advanced Signet Ring","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#finger-size","collection":"docs7","hash":"7a9d67463697c46888bf1ef43e37edf5","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — Parameters\n\nThe parameters are split into two tabs.\n\n#### Frontal\n\nThe top face and the sections of the band, seen from the front.\n\n* Mode: Circle makes the top a plain circle — the profile picker disappears and the single size field is labelled Diameter. Custom Shape unlocks the profile picker below and gives you separate Width and Height.\n* Profile: the outline of the top face. Pick one from the library or open the editor to draw your own. Visible in Custom Shape mode only.\n* Width: the width of the top face (its Diameter in Circle mode).\n* Height: the height of the top face. Hidden in Circle mode, where the diameter covers both.\n* Height position: how far the top face sits above the finger hole — in practice, the thickness of the head.\n* Rotation: turns the top face on the ring, in degrees.\n* Width bottom profile: the width of the band at the bottom of the ring.\n* Height bottom profile: the thickness of the band at the bottom.\n* Height middle profile: the thickness of the band at the sides, halfway between the bottom and the head.\n\nFive of these are also handles in the viewport, so you can size the ring by eye: the top face Width and Height (centred on the head), the Height position (rising from the top of the finger hole), and the Width bottom profile and Height bottom profile at the bottom of the ring, plus the Height middle profile at the side.\n\n##### Recess\n\nTwo icon buttons choose the finish of the underside of the head: flat, or hollowed out. With the recess on, two parameters appear:\n\n* Thickness: the wall of metal left under the table.\n* Inner height: how deep the hollow goes into the head.\n\n#### Lateral","metadata":{"title":"Advanced Signet Ring","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#parameters","collection":"docs7","hash":"184a6aa8552a93b1f371f4b4f8edcf8b","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — Parameters\n\n* Lateral profile: the side silhouette of the ring — the curve the band follows as it climbs from the bottom into the head. Pick one from the library or edit it in place, exactly like the front profile.","metadata":{"title":"Advanced Signet Ring","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#parameters","collection":"docs7","hash":"bdc01c5b8b74f8b062feb7996acde401","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — Working with the panel\n\n* Refresh in the header recomputes the preview; the ring is built in the background while you keep adjusting.\n* Save defaults stores the current parameters as the starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n* Save stores the current ring as a local element, so it appears in the gallery next time.\n* Accept bakes the signet. If it is pressed while the preview is still computing, or before one has resolved, the panel asks you to wait or to refresh first.","metadata":{"title":"Advanced Signet Ring","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/advanced-signet-ring/#working-with-the-panel","collection":"docs7","hash":"d52a96ca127d834b675a593634d35caf","indexed_by":"docs-index"}},{"content":"Builders\n\nThe band itself. Each one is its own command with its own panel, and several carry a submenu with an advanced version or a close relative. They are listed here in the order they appear in the tab.\n\nClassic The plain round band, and the starting point for most rings.\n\nCathedral Shoulders that rise towards the centre stone.\n\nAdvanced Cathedral\n\nBypass\n\nEternity Stones all the way round the band, closing evenly.\n\nAdvanced The band built from your own sections along the ring curve.\n\nSignet The flat top for a seal, a monogram or an engraving.\n\nAdvanced Signet Ring\n\nExtrude Ring\n\nClass Ring Centre stone, flat sides for emblems, heavy shoulders.\n\nWedding The wedding band, with the profile and comfort fit that decide how it feels.\n\nBand\n\nMatching\n\nPave A band prepared for pave setting, ready for the stones.\n\nTwo Rows Two rows of stones along the band, with the channel between them.\n\nSplit Shank The band divides as it reaches the head, lifting the centre stone.\n\nGraduated Thin under the finger, wide where it meets the setting.\n\nTwo buttons in this block are hidden in the current build: Name Ring and Boolean by Ring Size. They are not wired to a command, so nothing is missing from your ribbon.","metadata":{"title":"Builders","url":"https://www.rhinoartisan.com/docs/7/shanks/builders/","source":"https://www.rhinoartisan.com/docs/7/shanks/builders/","collection":"docs7","hash":"aadedf2b323e2be3880953cf41ce903f","indexed_by":"docs-index"}},{"content":"Bypass — Bypass\n\nBypass builds a crossover shank: two arms that rise from the bottom of the ring, drift apart along the finger axis as they climb, and pass each other at the top instead of meeting. The gap they leave is where the centre stone — or a bridge, or nothing at all — goes. It is the shape behind the classic bypass, toi et moi and open-top engagement rings.\n\nThe command runs from the ribbon (Shanks, inside the Cathedral group) or by typing `ArtisanBypass`. It opens on the library of saved styles: pick one to start from, or press Edit to work on the one already shown in the viewport. When you accept, the Bypass is baked as a parametric object and appears in the Outliner, so you can reopen and re-edit it later.\n\nGoldsmith Tip: The two arms cross, so the metal that looks thinnest on screen is where they overlap — and that is exactly where the ring will be sized and where it will bend first. Set the Angle and Opening before you touch the profiles: they decide how far up the crossover happens. Then walk the profile stations from the bottom up, keeping the section at the crossing point no thinner than the section at the ring bottom. A bypass that tapers to nothing at the top photographs beautifully and comes back from the customer.","metadata":{"title":"Bypass","section":"Bypass","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#bypass","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#bypass","collection":"docs7","hash":"c15d8da642f721aee264cd7fe17b8649","indexed_by":"docs-index"}},{"content":"Bypass — Finger Size\n\nSets the ring size the whole shank is built on. Every other measurement is applied over this curve.","metadata":{"title":"Bypass","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#finger-size","collection":"docs7","hash":"07bcca11d06e77e0eddc088974685408","indexed_by":"docs-index"}},{"content":"Bypass — Shank\n\nThe first tab holds the metal: the cross-sections swept along the arms, the rail shape, and the bridge.\n\n#### Profiles\n\nThe arm is swept through a list of stations — each one a cross-section with its own shape and size, placed at a position along the half rail (0 at the arm tip, 1 at the ring bottom). The sweep interpolates between them, so a two-station list gives a plain taper and adding stations in between lets you swell or pinch the arm wherever you want.\n\n* Apply All Profiles: makes every station share one profile shape. Sizes stay per-station, only the outline is shared. Turn it off when you want a different section at the top than at the bottom.\n* Add profile (the orange + button): inserts a new station between the two ends.\n* Station cards: one row per station. Each has buttons to edit, duplicate and delete it — the two end stations cannot be deleted.\n* Station editor: opening a station replaces the list with its own editor — an asset preview for choosing or editing the cross-section shape, plus Width and Height in millimetres, and, for interior stations only, Position along the rail (0–1). Confirm with the tick, or close with the cross to revert everything you changed in that editor.\n\n#### Shank","metadata":{"title":"Bypass","section":"Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#shank","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#shank","collection":"docs7","hash":"d68f1794b38aff5d66785919c577c576","indexed_by":"docs-index"}},{"content":"Bypass — Shank\n\n* Width: Width of the arm section, in millimetres.\n* Height: Height of the arm section, in millimetres.\n* Opening: How far the arm tip is displaced along the finger axis. This is the crossover — the other arm is displaced by the same amount in the opposite direction, so the number is half the total separation.\n* Angle: Arc swept on the finger circle by each arm, in degrees (45–180). Lower values keep the arms short and steep, higher values make them wrap further round the finger.\n* Rotation: Roll of the tip profile about the rail tangent. Only the section turns; the arm keeps its path.\n* Tangency: Slider, 0 to 1. Controls how the arm leaves the ring — 0 continues straight, 1 flares it outward.\n* Start Curvature: Slider, 1 to 8. The rail point where the displacement starts. Below it the arm stays centred on the band; from there it ramps up to the full Opening at the tip. Low values start the crossover near the bottom, high values keep the band straight and swing it late.\n\n#### Bridge\n\nA small piece of metal joining the two arms where they cross, so the ring is closed rather than open. The toggle in this section turns it on and off.\n\n* Width: Width of the bridge.\n* Thickness: Thickness of the bridge.\n* Diameter: Diameter of the central cylinder that joins the two displaced halves of the bridge.\n* Angle: Angle from the top of the ring where the bridge meets its arm.","metadata":{"title":"Bypass","section":"Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#shank","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#shank","collection":"docs7","hash":"66432b796b6a7e111f8f1384dcfec9b2","indexed_by":"docs-index"}},{"content":"Bypass — Gems\n\nThe second tab sets a pavé run along each arm. The toggle at the top of the tab enables the stones; everything below it is inert while it is off.\n\n#### Gems\n\n* Start size: Diameter of the first stone of the run.\n* End size: Diameter of the last stone. The sizes step linearly between the two, which is what gives the arm its graduated look.\n* Vertical: Radial lift of the stones over the arm surface.\n* Min Distance: Minimum gap between adjacent stones.\n* Min inner width: Width of the seat cut under the girdles.\n* Inner Height: Depth of that seat.\n* Inner Margin: Metal left below the stones, on the inner side of the arm.\n* Bright Cut: Height of the bright-cut edge between the metal and the stones.\n* Start: Where the gem run begins along the arm.\n* End: Where it ends, in degrees (0–180).\n* Gem Shape: Round or Square.\n\n#### Prong settings\n\nThree mutually exclusive settings styles:\n\nWithout prongs — the stones sit in their seats with no beads. No further parameters.\n\nShared prongs — one bead shared between neighbouring stones:\n\n* Prong height: Height of the bead above the girdle.\n* Prong grow: Extra material added to the bead; negative values slim it down.\n* Min diameter: Smallest diameter the bead is allowed to take.\n* Prong distance: Transverse separation of the two rails of beads. Positive moves them apart, negative brings them together.\n* End prong mode: Single end prong finishes each end of the run with one centred bead, Double end prongs with one on each side.\n\nScalloped — the arm is scalloped between the stones with cutters instead of beads:","metadata":{"title":"Bypass","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#gems","collection":"docs7","hash":"34153c26b08f50bade78b42058073380","indexed_by":"docs-index"}},{"content":"Bypass — Gems\n\n* V-Cutters: Adds V-shaped divider cuts between adjacent stones, and enables the V-Cutters section.\n* Boolean: Subtracts the cutters from the metal instead of only showing them.\n* Remove Channel: Removes the channel left under the stones.\n\nCutters — the scallop shape:\n\n* Start Height / Start Width: Section of the cutter at its top.\n* End Height / End Width: Section at its bottom.\n* Length: Length of the cutter.\n* Move in Z: Vertical placement.\n* Move Middle in Z: Height of the cutter's middle, which bows the scallop.\n* Shape: U Shape, V Shape, Square Shape, Trapezoidal Shape or French Shape.\n* Mode: Both Sides keeps the start and end sections linked; Independently frees them.\n* Shape Scale: Slider from 0 to 2, sweeping the section between round and square.\n\nV-Cutters — the divider cuts, shown when the V-Cutters toggle is on:\n\n* Start Width / Start Height: Section at the top of the V.\n* End Width / End Height: Section at the bottom.\n* Length: Length of the cut.\n* Move by Normal: Displacement of the cut along the surface normal.\n* Mode: Both Sides or Independently.\n\n#### Drill settings\n\nTwo buttons choose between no drill and a round drill under each stone. With the drill on, its shape is set here:\n\n* Allow Intersection: Lets neighbouring drills overlap instead of being clipped against each other.\n* Show: Displays the drills in the viewport.\n* Height Top, Height Crown, Height Girdle, Height Pavilion, Height Drill: The five vertical steps of the drill profile, from the top face down through the crown, girdle and pavilion to the through-hole.\n* Size Top, Size Drill, Size Bottom: Widths at the top, at the drill and at the bottom, as a percentage of the stone.\n* Gem Inside: How deep the stone sits into the metal.\n* Type: Gemstone Shape, Round, Square or Hexagon.","metadata":{"title":"Bypass","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#gems","collection":"docs7","hash":"8680ff6de981f374f57ba31d6fe4153f","indexed_by":"docs-index"}},{"content":"Bypass — Working with the panel\n\n* Save defaults in the header stores the current parameters as the starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n* Save and Update write the current design into your styles library, so it shows up in the gallery the next time the command opens.\n* Accept bakes the shank, its stones and its prongs into the document as a single parametric group and lists it in the Outliner. If the preview has not finished computing, the panel asks you to wait or to preview first.","metadata":{"title":"Bypass","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/bypass/#working-with-the-panel","collection":"docs7","hash":"a471edbee2e5f07bdbc31cf77d95576f","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral\n\nUsing this command, you can create cathedral shanks, especially useful to design fancy and vintage engagement rings with arms raising to support the gemsets on top.\n\nRunning this command will display its parameters in the Commands toolbar. Your first step should be to choose whether you want to start working on one of the styles offered by RhinoArtisan in the gallery of this command or to create a new one by editing the one that it is shown in the viewport.\n\nOn its parameters, you can find the ring size, measurements and the asset that will give shape to the shank, and options to add secondary gems with their setting style on this element among other possibilities.\n\nWhen you confirm your changes, the Cathedral Shank will be listed on the Outliner toolbar.\n\nGoldsmith Tip : This type of shank is designed to support a basket, halo, bezel, or peg-head, which will hold the ring's center stone. It's important not to finalize the parameters of the cathedral shank until the central stone's setting is complete. Any changes to the stone's position or its setting may require adjustments to the shank's design to ensure a cohesive and aesthetically pleasing result that harmonizes both elements.","metadata":{"title":"Cathedral","section":"Cathedral","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cathedral","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cathedral","collection":"docs7","hash":"03719ee7128508d01914c07836af2c8e","indexed_by":"docs-index"}},{"content":"Cathedral — Finger Size\n\nAllows users to select different finger sizes to adjust the ring accordingly.\n\nProfiles Parameters\n* Assets Editor: Custom edit the shape of the different parts of the ring.\n* Ring Top Width: Controls the top ring's width.\n* Ring Top Height: Controls the top ring's height.\n* Ring Bottom Width: Controls the bottom ring's width.\n* Ring Bottom Height: Controls the bottom ring's height.","metadata":{"title":"Cathedral","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#finger-size","collection":"docs7","hash":"58cc19819f5a04b8f3fee2e0c8d4665b","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral Shank\n\n* Width: Controls the shank's width.\n* Height: Controls the shank's height.\n* Angle: Controls the shank's angle.\n* Tangent: Controls the shank's tangent by slider.\n\nBridge\n* Enable Bridge: Toggles the bridge enabling.\n* Width: Controls the bridge's width.\n* Thickness: Controls the bridge's thickness.\n* Diameter: Controls the bridge's diameter.\n* Fillet: Controls the bridge's fillet.","metadata":{"title":"Cathedral","section":"Cathedral Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cathedral-shank","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cathedral-shank","collection":"docs7","hash":"a9627efdc4202d94e105946239baeef2","indexed_by":"docs-index"}},{"content":"Cathedral — Gems\n\nGems Toggle: Toggles between enabling gems.\n\n* Gems Size: Controls the cathedral gems's size.\n* Min Distance: Controls the minimum distance between gems.\n* Vertical: Controls the vertical placement of the gem in conection with the cathedral's shank.\n* Angle: Controls the cathedral gems's angle.\n* Inner width: Controls the width of the gems's hole.\n* Inner height: Controls the height of the gem's hole.\n* Bright cut: Controls the height of the edge between the ring and the gems.\n* Margin: Controls the distance of the gems from the top of the cathedral shank.\n* Inner Margin: Controls the distance of the gems from the bottom of the cathedral shank.\n* Gem Shape: Toggles between the gem shape.","metadata":{"title":"Cathedral","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#gems","collection":"docs7","hash":"76de06c24d9d3c900c9008e83f1c0d00","indexed_by":"docs-index"}},{"content":"Cathedral — Without prongs\n\nThis option excludes prongs from being added to the gems, providing a clean design without any additional settings for prong customization.\n\nAdd Prongs\nThis option includes prongs for the gems and provides several parameters for customization:\n\n* Gem Inside: Controls the horizontal level at which the prong interacts with the gem.\n* Height: Adjusts the vertical height of the prong.\n* Extension Manufacturing (only in manufacturing mode): Manages the extension of the prong from the topside, useful in the manufacturing stage.\n* Move Z: Modifies the height position of the prong along the Z-axis.\n* Automatic Prong Diameter: Toggles the automatic adjustment of the prong’s diameter based on the gem's dimensions.\n* Diameter: Controls the diameter of the prong.","metadata":{"title":"Cathedral","section":"Without prongs","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#without-prongs","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#without-prongs","collection":"docs7","hash":"415c559fd8ad108fde9adb1aebe70c8d","indexed_by":"docs-index"}},{"content":"Cathedral — Cutters\n\nThe Cutters section allows users to establish cutting options and parameters for both standard and V-Cutters.\n\nV-Cutters: Toggles between enabling V-Cutters.\n\nBoolean: Toggles between enabling the cutters boolean.\n\nRemove Channels: Toggles between removing cutters channel.\n\n#### Cutters Parameters\n\n* Start | Height: Controls the top height of the cutters.\n* Start | Width: Controls the top width of the cutters.\n* End | Height: Controls the bottom height of the cutters.\n* End | Width: Controls the bottom width of the cutters.\n* Length: Controls the length of the cutters.\n* Move in Z: Controls the vertical placement.\n* Move Middle in Z: Controls the center height of the Cutters.\n* Shapes: Toggles between the shapes in the cutters.\n* Mode: Toggles between the independence of the cutters towards the Start/End parameters.\n* Shape Scale: Controls the spectrum between round and squared shape by a slider.\n\n#### V-Cutters Parameters\n\n* Start | Height: Controls the top height of the V-Cutters.\n* Start | Width: Controls the top width of the V-Cutters.\n* End | Height: Controls the bottom height of the V-Cutters.\n* End | Width: Controls the bottom width of the V-Cutters.\n* Length: Controls the length of the V-Cutters.\n* Move in Z: Controls the vertical placement.\n* Mode: Toggles between the independence of the V-Cutters towards the Start/End parameters.","metadata":{"title":"Cathedral","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cutters","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#cutters","collection":"docs7","hash":"9c336dc006ef76f2f14aec30291d1bac","indexed_by":"docs-index"}},{"content":"Cathedral — Drill Settings\n\nThe Drill Settings section allows users to configure a drill hole under the gems. This includes toggling the drill on or off and adjusting its parameters to achieve the desired drilling effect.\n\nWithout drill: Deactivates the drilling feature.\n\nRound Drill: Activates the drill and reveals its parameters:\n\n* Allow Intersection: Toggles whether the drill is allowed to intersect with other geometry.\n* Show: Toggles the visibility of the drill in the viewport.\n* Height Top, Height Crown, Height Girdle, Height Pavilion, Height Drill: Control, as percentages, the height of each stage of the drill profile.\n* Size Top, Gem Inside, Size Drill, Size Bottom: Control, as percentages, the width of each stage of the drill profile.\n* Type: Selects the shape of the drill: Gemstone Shape, Round, Square, or Hexagon.","metadata":{"title":"Cathedral","section":"Drill Settings","url":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#drill-settings","source":"https://www.rhinoartisan.com/docs/7/shanks/cathedral/#drill-settings","collection":"docs7","hash":"d125dea6be38beee75af6e3083295942","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring\n\nClass Ring builds the graduation-ring silhouette in one go: the heavy shank that widens from the bottom into two flat sides, the raised stand on top, and the stone sitting on it. It is the shape used for school, college and championship rings, and the same construction works for any signet-like ring with a bezel-set stone on a built-up head.\n\nThe stone is part of the ring, not a separate object: it is regenerated from the ring's own parameters every time, so its seat and the metal around it always agree.\n\nRunning the command opens the gallery of saved Class Ring elements. Click one to preview it, double-click it to open its parameters, or press Edit in the header to start from the ring shown in the viewport.\n\nGoldsmith Tip: On a class ring the stone is usually large and the ring is worn every day, so the number that decides whether the piece survives is Side Width, not the top. Give the sides enough metal to carry the engraving your customer will ask for later — names, dates, a crest — before you settle the stone size. Widening the sides afterwards changes the proportion of the whole ring and you will have to redo the head.","metadata":{"title":"Class Ring","section":"Class Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#class-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#class-ring","collection":"docs7","hash":"6a947b42efefd3a151632fe5ea3eb16f","indexed_by":"docs-index"}},{"content":"Class Ring — Finger Size\n\nSets the ring size. The shank and the stand are built off that circle, so set it first.\n\nMain Stone\n* Stone type: Gemstone puts a faceted stone on the seat; Cabochon puts a domed one.\n* Stone shape: Round, Oval or Cushion. The choice also drives the shape of the stand below it. On Round the top Width field disappears and the top Height field takes over both dimensions, since the outline is a circle.\n* Move in Z: raises or sinks the stone relative to its seat. Negative values push it into the head, positive ones lift it out.\n* Cabochon Height: the dome height of the stone. Visible only in Cabochon mode; at or below zero the dome falls back to an automatic proportion — half the shorter side of the seat.","metadata":{"title":"Class Ring","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#finger-size","collection":"docs7","hash":"47799bdda65d7a51bbebca280dc85f07","indexed_by":"docs-index"}},{"content":"Class Ring — Parameters\n\nThe parameters are split into two tabs.\n\n#### Top\n\nThe head: the stand and the seat the stone sits on.\n\n* Height: one semi-axis of the seat. On a Round stone this field is labelled Height/Width and controls both.\n* Width: the other semi-axis of the seat. Hidden on Round stones.\n* Stand Height: how far the stand rises before the seat.\n* Depth: how deeply the top is stepped down towards the sides — the chamfer that takes the head into the flat faces of the ring.\n* Offset: the margin between the seat outline and the base of the top. Larger values pull the base in towards the stone; pushed too far the base collapses and the command tells you the offset is invalid.\n\n#### Shank\n\nThe band itself.\n\n* Height: the height of the top surface of the shank, where it meets the head.\n* Angle: the flare of the sides as they climb from the bottom of the ring towards the head.\n* Bottom Height: the thickness of the band at the bottom of the finger hole.\n* Bottom Width: the half-width of the band at the bottom — the profile is mirrored, so the band is twice this value across.\n* Side Width: how far the flat sides stand out from the finger hole. This is the metal that carries the side engraving.","metadata":{"title":"Class Ring","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#parameters","collection":"docs7","hash":"26fd8c2bb45d6be285154fa359e5c830","indexed_by":"docs-index"}},{"content":"Class Ring — Handles in the viewport\n\nFour of these values also have handles you can drag directly on the ring, and they stay in sync with the fields:\n\n* the two semi-axes of the stone on its seat (green and red), which follow the stone's Move in Z;\n* the Bottom Height hanging from the bottom of the finger hole (blue);\n* the Bottom Width, centred on the symmetry plane and spanning the full width of the band (red);\n* the Side Width, growing outwards from the side of the finger hole (orange).","metadata":{"title":"Class Ring","section":"Handles in the viewport","url":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#handles-in-the-viewport","source":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#handles-in-the-viewport","collection":"docs7","hash":"a0930b5e8bd069758e88c3d33eca6efe","indexed_by":"docs-index"}},{"content":"Class Ring — Working with the panel\n\n* Refresh in the header recomputes the preview; the ring is built in the background while you keep adjusting.\n* Save defaults stores the current parameters as the starting point for the next run. Right-click the same button to clear them.\n* Save stores the current ring as a local element for the gallery.\n* Accept bakes the ring with the stone attached to it. If it is pressed before a preview has resolved, the panel asks you to refresh first.\n\nRe-editable: the accepted ring stays a parametric object. Select it and run ArtisanEdit to reopen this panel with every value as you left it; accepting again replaces the ring in place and rebuilds its stone.","metadata":{"title":"Class Ring","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/class-ring/#working-with-the-panel","collection":"docs7","hash":"8b70acb7c325460b745ec160a55b1960","indexed_by":"docs-index"}},{"content":"Classic — Classic\n\nUsing this command, you can create classic rings, which are especially useful for traditional engagement rings, wedding rings, and simple yet universally gorgeous designs.\n\nRunning this command will display its parameters in the Commands toolbar. Your first step should be to choose whether you want to start working on a style provided by RhinoArtisan or click on the Edit Element to create a fresh new style by editing the one that appears in the viewport.&#x20;\n\nIn its parameters section, you'll find options to set the ring size, define measurements, and select the asset that shapes the shank, including the option to extend its external form if needed. Additionally, you can choose settings for adding gems and customize their placement and style, among other features\n\nThe Classic Shank will be listed on the Outliner toolbar when you confirm your changes.\n\nGoldsmith Tip : When designing a pair of wedding bands, it’s efficient to begin by creating one band according to your customer’s specifications. Once this base design is complete, you can duplicate it and adjust key parameters to achieve two objectives: first, to match the ring size for the second band perfectly, and second, to introduce variations, such as adding a stone or altering the width for different style options. By designing just one band, you can easily generate renders of the different pairs, allowing you to present a range of options to your customers.","metadata":{"title":"Classic","section":"Classic","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#classic","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#classic","collection":"docs7","hash":"fef94403061a3e6f9909b04a41b771a4","indexed_by":"docs-index"}},{"content":"Classic — Finger Size\n\nAllows users to select different finger sizes to adjust the ring accordingly.\n\nShank Parameters\n#### Top, Middle and Bottom Profiles\n\nFour tabs let you shape the shank's cross-section: Top Profile, Bottom Profile, Mid Profile, and External Ring. The Bottom, Mid, and External Ring tabs can each be switched on or off independently.\n\n* Enable *(Bottom and Mid profiles only)*: Toggles whether that profile is used in the shank at all.\n* Profile Editor: Custom edit the shape of the different parts of the ring.\n* Width: Controls the profile's width.\n* Height: Controls the profile's height.\n* Type: Can change the interior ring shape with the properties. You can choose between Solid, Comfort and Thickness.\n* Rotation: Controls the shank's rotation.\n* Displacement: Controls the displacement of the lateral sides of the shank.\n* Orientation: Sets the profile's orientation, Natural or Reverse.\n\n#### External Ring\n\n* Enable: Toggles whether the external ring silhouette is applied to the shank.\n* Top: Controls the top width of the external ring.\n* Mid: Controls the mid width of the external ring.\n* Bottom: Controls the bottom width of the external ring.","metadata":{"title":"Classic","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#finger-size","collection":"docs7","hash":"7515bfad493e0a9c9574dfc594ec5e4b","indexed_by":"docs-index"}},{"content":"Classic — Advanced: Gems&#x20;\n\n* Toggle between gems: can enable or disable the ring's gem.\n* Gem Size: Controls the size of gems.\n* Min Distance: Controls the distance between gems.\n* Angle: Controls the angle of gems.\n* Vertical: Controls the gems height offset.\n* Inner width: Controls the gem's prongs inner width.\n* Inner height: Controls the gem's prongs inner height.\n* Bright cut: Controls the height of the edge between the ring and the gems.\n* Margin: Controls the width of the edge between the ring and the gems.\n* Gem Shape: Controls the gem's shape.","metadata":{"title":"Classic","section":"Advanced: Gems&#x20;","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-gemsx20","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-gemsx20","collection":"docs7","hash":"35b9f73e7ea88c46e1877fd6b74257bd","indexed_by":"docs-index"}},{"content":"Classic — Advanced: Settings\n\nThe Advanced Settings section provides a range of options to fine-tune the design of rings, including the management of prongs, cutters, and V-Cutters. This allows for precise control over the appearance and functionality of these components.\n\nWithout prongs\nThis option excludes prongs from being added to the gems, providing a clean design without any additional settings for prong customization.","metadata":{"title":"Classic","section":"Advanced: Settings","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-settings","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-settings","collection":"docs7","hash":"984eb0bd1ae6013baea75a3eaf1c50a0","indexed_by":"docs-index"}},{"content":"Classic — Add Prongs\n\nThis option includes prongs for the gems and provides several parameters for customization:\n\n* Gem Inside: Controls the horizontal level at which the prong interacts with the gem.\n* Height: Adjusts the vertical height of the prong.\n* Extension Manufacturing (only in manufacturing mode): Manages the extension of the prong from the topside, useful in the manufacturing stage.\n* Move Z: Modifies the height position of the prong along the Z-axis.\n* Automatic Prong Diameter: Toggles the automatic adjustment of the prong’s diameter based on the gem's dimensions.\n* Diameter: Controls the diameter of the prong.","metadata":{"title":"Classic","section":"Add Prongs","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#add-prongs","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#add-prongs","collection":"docs7","hash":"a564bf6c36968bf6fe64c5f454140657","indexed_by":"docs-index"}},{"content":"Classic — Cutters\n\nThe Cutters section allows users to establish cutting options and parameters for both standard and V-Cutters.\n\nV-Cutters: Toggles between enabling V-Cutters.\n\nBoolean: Toggles between enabling the cutters boolean.\n\nRemove Channels: Toggles between removing cutters channel.\n\n#### Cutters Parameters\n\n* Start | Height: Controls the top height of the cutters.\n* Start | Width: Controls the top width of the cutters.\n* End | Height: Controls the bottom height of the cutters.\n* End | Width: Controls the bottom width of the cutters.\n* Length: Controls the length of the cutters.\n* Move in Z: Controls the vertical placement.\n* Move Middle in Z: Controls the center height of the Cutters.\n* Shapes: Toggles between the shapes in the cutters.\n* Mode: Toggles between the independence of the cutters towards the Start/End parameters.\n* Shape Scale: Controls the spectrum between round and squared shape by a slider.\n\n#### V-Cutters Parameters\n\n* Start | Height: Controls the top height of the V-Cutters.\n* Start | Width: Controls the top width of the V-Cutters.\n* End | Height: Controls the bottom height of the V-Cutters.\n* End | Width: Controls the bottom width of the V-Cutters.\n* Length: Controls the length of the V-Cutters.\n* Move in Z: Controls the vertical placement.\n* Mode: Toggles between the independence of the V-Cutters towards the Start/End parameters.","metadata":{"title":"Classic","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#cutters","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#cutters","collection":"docs7","hash":"53fa840bdf069ef49afe63853a1f8d45","indexed_by":"docs-index"}},{"content":"Classic — Drill Settings\n\nThe Drill Settings section allows users to configure drilling operations. This includes toggling different drill types and adjusting their parameters to achieve the desired drilling effects.\n\nWithout drill: Deactivates the drilling feature.\n\nRound Drill: Activates a round drill and reveals its own Width and Height parameters.\n\nSquare Drill: Activates a square drill and reveals its own Width and Height parameters.","metadata":{"title":"Classic","section":"Drill Settings","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#drill-settings","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#drill-settings","collection":"docs7","hash":"0491d00344a209ae7001afd54eb1200a","indexed_by":"docs-index"}},{"content":"Classic — Advanced Shank: Opening mode\n\nThe Advanced Shank Parameters section offers detailed controls for the opening mode of the ring shank, featuring various cutting and pinching techniques. These settings enable precise adjustments to the shank's design and structure, allowing for customized modifications. Choose None, Cutting, or Pinch from the Opening dropdown.\n\n#### Cutting\n\n* Cut length: Controls the length of the cut's edge.\n* Cap bumping: Controls the bump outside the ring.\n\n#### Pinch\n\n* Opening: Adjusts the width of the pinched area on the shank. This parameter determines the extent to which the shank is pinched or narrowed, affecting the visual and structural characteristics of the ring.\n* Base X: Controls the horizontal positioning (X-axis) of the base of the pinch. Adjusting this parameter changes the lateral placement of the pinch effect, allowing for precise alignment along the X-axis.\n* Base Y: Controls the depth positioning (Y-axis) of the base of the pinch. This parameter determines how far the pinch extends into the material of the shank, affecting the depth and prominence of the pinch effect.\n* Base Z: Adjusts the vertical positioning (Z-axis) of the base of the pinch. This parameter affects the vertical placement of the pinch effect relative to the shank, providing control over the height of the pinch.","metadata":{"title":"Classic","section":"Advanced Shank: Opening mode","url":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-shank-opening-mode","source":"https://www.rhinoartisan.com/docs/7/shanks/classic/#advanced-shank-opening-mode","collection":"docs7","hash":"21a4e7c9729c46fd9f0de650fbda6fa1","indexed_by":"docs-index"}},{"content":"Cut By Ring Size — Cut by Ring Size\n\nIn some cases, objects fit inside the ring circle, so this command cuts and adjusts those parts that interfere with the space for the finger.\n\nHow to use it\nRun the command and select the objects to cut. It works on polysurfaces, extrusions, meshes and SubDs.\n\nThe cut uses the ring size currently set in your session, and the prompt shows the diameter it is about to use. If you need a different one for this run only, choose the Diameter option on the command line and type the value — it does not change your session's ring size. If no valid ring size has been set, the command stops and asks you to set one first.\n\nOnce you confirm the selection, a cylinder of that diameter is subtracted from every selected object. When it is done, the command line reports how many objects were cut and how many failed.\n\nThe cutting cylinder always runs along the world Y axis, through the origin — the convention every RhinoArtisan ring is modelled to. If your selection does not straddle that axis, the command warns you, because the cut will happen at the origin and not where your geometry is. Move the piece to the origin before cutting.\n\nGoldsmith Tip : This tool significantly enhances our workflow efficiency. For example, when designing a solitaire ring with a basket, there's no need to align the lower rail exactly with the top of the ring curve. Instead, you can extend the basket height, ensuring that the portion of the rail outside the ring curve is sufficiently thick. Once your design is complete, simply apply the 'Cut by Ring Size' function, and you’ll achieve a perfectly shaped basket with the lower rail precisely adapted to the finger size.","metadata":{"title":"Cut By Ring Size","section":"Cut by Ring Size","url":"https://www.rhinoartisan.com/docs/7/shanks/cut-by-ring-size/#cut-by-ring-size","source":"https://www.rhinoartisan.com/docs/7/shanks/cut-by-ring-size/#cut-by-ring-size","collection":"docs7","hash":"169205ffec2b6c8b1841a7e00267d931","indexed_by":"docs-index"}},{"content":"Engraving — Engrave Ring\n\nEngrave Ring wraps text around a ring at a given finger size. A date, a name, a couple of initials, a hallmark — the part of a wedding ring nobody sees and everybody remembers.\n\nIt does not need a curve, a band or a selection: the command builds its own circle from the ring size you choose and flows the lettering along it. That is what makes it different from the general text-on-curve tool — you set a size, not a path.","metadata":{"title":"Engraving","section":"Engrave Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#engrave-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#engrave-ring","collection":"docs7","hash":"778465def1ae4abf1aa15ec23d6ee005","indexed_by":"docs-index"}},{"content":"Engraving — Size\n\nThe Size section sets the finger size the text is laid on, in the sizing standard you work in. That size defines the diameter of the circle the letters follow, so it is the first thing to get right: engrave at the finished size of the band and the lettering lands where the inner wall is.\n\nChanging the size rebuilds the text around the new circle immediately.","metadata":{"title":"Engraving","section":"Size","url":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#size","source":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#size","collection":"docs7","hash":"c478cd5afede2745a7b1d45c76308992","indexed_by":"docs-index"}},{"content":"Engraving — Positioning the text around the ring\n\nA rotation gumball appears in the viewport, around the ring axis. Drag it to turn the whole engraving around the band — to bring the text away from the seam, or to centre it under the setting. The angle you leave it at is saved with the engraving.\n\nParameters\n* Text: What gets engraved. Type it and the preview updates as you go.\n* Font: Four script and display faces are supplied with RhinoArtisan — Bienchen, Discipuli Britannica, Helvetia Verbundene and Sacramento — followed by every font installed on your machine. The supplied four are single-stroke or lightly-weighted faces chosen because they engrave well; a heavy system font will not.\n* Style: Regular, Bold or Italic.\n* Horizontal alignment: Where the text sits along the circle — Left, Center, Right or Justify.\n* Vertical alignment: How the lettering is anchored across its own height — Top, Center or Bottom.\n* Height: The cap height of the letters, in millimetres. On the inside of a band this is usually well under 2 mm.\n* Spacing: The gap between letters. Opening it up is often what makes a long inscription fit and stay readable.\n* Thickness: How far the letters are extruded off the circle. Left at zero you get flat lettering — the outlines and no solid. Give it a value and the text becomes a solid you can boolean into or out of the band.\n* Text flip horizontal and Text flip vertical: Two toggle buttons that mirror the lettering. Text laid on a ring reads one way from the outside and the other way from the inside; these are how you make it read correctly on the face you are engraving.","metadata":{"title":"Engraving","section":"Positioning the text around the ring","url":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#positioning-the-text-around-the-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#positioning-the-text-around-the-ring","collection":"docs7","hash":"6923bf062b21da8da34c92241688e3da","indexed_by":"docs-index"}},{"content":"Engraving — What it creates\n\nAccept bakes the engraving as a single group: the letter solids on your metal layer and the letter outlines on your user layer. The group appears in the Outliner as Engrave Ring.\n\nFrom there it is geometry like any other. Give the text a thickness and boolean it out of the band for a cut inscription, or into it for a raised one; leave it flat and use the curves as a path for engraving or laser marking.\n\nSave defaults in the panel header stores the current font, style, height, spacing and alignment as your starting point for the next engraving. Right-click the same button to clear them.\n\nGoldsmith Tip: Engrave last, and engrave at the final size. If you scoop or resize the band after the inscription is baked, the letters stay on the circle they were built on and no longer sit on the wall. When you do have to change the size, reopen the engraving from the Outliner and change it there — that is exactly what the element is for.\n\nThis element is editable, meaning it can be modified anytime — reopen it from the Outliner to change the text, the font or the ring size, and the engraving is rebuilt in place.","metadata":{"title":"Engraving","section":"What it creates","url":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#what-it-creates","source":"https://www.rhinoartisan.com/docs/7/shanks/engraving/#what-it-creates","collection":"docs7","hash":"f2a89f0db02eb52b1f05305b9893d3c1","indexed_by":"docs-index"}},{"content":"Estimate Ring Size — Estimate Ring Size\n\nEstimate Ring Size answers a question you get every time a model arrives from somewhere else: *what size is this ring?* It measures the hole the finger goes through, converts that diameter into a finger size in your sizing standard, and drops a Ring Curve at that size so the rest of RhinoArtisan knows what it is working with.\n\nIt is the command to run on an imported STL, a model a customer sent over, or a ring you modelled long enough ago that you no longer remember the size.","metadata":{"title":"Estimate Ring Size","section":"Estimate Ring Size","url":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#estimate-ring-size","source":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#estimate-ring-size","collection":"docs7","hash":"22364b3f5806651187f9c8cbc1a2e157","indexed_by":"docs-index"}},{"content":"Estimate Ring Size — How it works\n\nThe command has no panel and asks for nothing. Run it and it does all of this on its own:\n\n* It collects every visible, unlocked object in the document — surfaces, polysurfaces and meshes alike. Hidden and locked objects are ignored, which is the simplest way to exclude a gemstone or a reference solid from the measurement.\n* It cuts those objects with the two world planes that pass through the origin and looks at the resulting section curves.\n* Across the X axis it finds the two sections closest to the centre — the left and right walls of the band — and the distance between them is the estimated inner diameter.\n* It scores how ring-like the result is: whether it found walls on both sides, whether it found a floor below the axis, whether the diameter falls in a plausible range, and how symmetric the two walls are around the centre.\n* If the score is high enough, it converts the diameter into a finger size and adds the matching Ring Curve to the document.","metadata":{"title":"Estimate Ring Size","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#how-it-works","collection":"docs7","hash":"43c13b86feb9cdf81819cec5156de651","indexed_by":"docs-index"}},{"content":"Estimate Ring Size — What it reports\n\nThe result is written to the Rhino command line, not to a dialog. You get one of two answers:\n\n* `The probability of this being a ring is 95% and Estimated finger size: …` — followed by the size, its diameter in millimetres, and the standard it was read in. A Ring Curve at that size appears in the viewport and in the Outliner.\n* `I don't think this is a ring.` — nothing was measurable, or what was measured did not look like a band. Nothing is added to the document.\n\nThe percentage is a confidence figure, not a tolerance: it tells you how convinced the command is that it was looking at a ring, not how accurate the diameter is.","metadata":{"title":"Estimate Ring Size","section":"What it reports","url":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#what-it-reports","source":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#what-it-reports","collection":"docs7","hash":"d5531a0b2beca5b9d76dcccf1a052ded","indexed_by":"docs-index"}},{"content":"Estimate Ring Size — The sizing standard\n\nThe size is expressed in the standard of the ring size currently set in your session — the one you pick in the Size section of any shank command. If none has been set yet, the command falls back to USA. Change your working standard first if you want the answer in Europe, UK or Japan sizes.\n\nGetting a reliable reading\nThe measurement assumes the ring is modelled the way RhinoArtisan builds them: centred on the world origin, with the finger axis along Y. Two consequences worth knowing:\n\n* An imported model sitting away from the origin will not measure correctly. Move it to the origin first.\n* The command measures the narrowest opening it finds. Anything crossing the finger space — a lower rail left long, a bezel that dips inside the band — will be measured instead of the band itself and will give you a smaller size than the real one. If you get an implausibly small answer, that is usually why.\n\nGoldsmith Tip: When a customer sends you a model to resize, run Estimate Ring Size before you touch anything. You get the current size and, in the same move, the Ring Curve you need as a reference. From there, changing the size is a matter of comparing that curve with a new one at the size ordered — and Cut by Ring Size will open the band to the new diameter.\n\nThe Ring Curve this command creates is a standard editable element: reopen it from the Outliner at any time to change its size or its shape.","metadata":{"title":"Estimate Ring Size","section":"The sizing standard","url":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#the-sizing-standard","source":"https://www.rhinoartisan.com/docs/7/shanks/estimate-ring-size/#the-sizing-standard","collection":"docs7","hash":"b37771fc7a33e220fe5ccb57b8378661","indexed_by":"docs-index"}},{"content":"Eternity Ring — Eternity Ring\n\nThe Eternity command enables jewelers to create a wide variety of eternity bands, including Full, Half, Three-Quarter, Five-Stone, Seven-Stone, and Nine-Stone designs, all within a single command. For bands that are not Full Eternities, you can customize the remaining shank by adding your preferred sections and adjusting the parameters to achieve a harmonious design.","metadata":{"title":"Eternity Ring","section":"Eternity Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#eternity-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#eternity-ring","collection":"docs7","hash":"e20d8667e91055dfc484e73a3d54ff19","indexed_by":"docs-index"}},{"content":"Eternity Ring — Parameters\n\nThe Eternity command's parameter panel is divided into four tabs — Gems, Prongs, Bezel and Shank — to help you customize every aspect of the eternity band design.\n\nGems\nThis tab focuses on gem distribution, allowing you to choose between options such as Full, Half, Three-Quarters, Five Stones, Seven Stones, or Nine Stones. This flexibility lets you determine how much of the band is covered by gemstones. You can also select the gemstone cut, with options like Round, Princess, Radiant, Oval, and Emerald, and the gem material (Diamond, Ruby, Emerald, Sapphire, Amethyst, Aquamarine, Morganite, Chalcedony, Moissanite and a range of coloured-stone variants).\n\nIn addition, this tab provides settings to define the gem sizes (carat weight and width/height/depth) and the minimum distance between the stones, as well as the option to adjust the gems' position along the Z-axis for precise placement and alignment.","metadata":{"title":"Eternity Ring","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#parameters","collection":"docs7","hash":"9e94464a6eeb8b8b190d52510f800a72","indexed_by":"docs-index"}},{"content":"Eternity Ring — Prongs\n\nThis tab focuses on the prong settings. Here, you can customize various aspects of the prongs used to secure the gemstones. Prongs can be shared between gems or created individually, and you have control over the top distance, the height over the girdle of the gems, and the prongs location, ensuring the gemstones are securely held in place.\n\nUnder Prong Diameter, you can set the top and bottom diameter, the expansion for manufacturing, and — for individual prongs — the top and bottom distance between them. A pair of buttons lets you switch the prong style between straight and bent.","metadata":{"title":"Eternity Ring","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#prongs","source":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#prongs","collection":"docs7","hash":"a066a924e55ec774ed46535c314cd4c3","indexed_by":"docs-index"}},{"content":"Eternity Ring — Bezel\n\nThis tab is dedicated to the gem rails of the eternity ring. You can choose to create the ring with either one or two rails (Gem Rails), and set their shape as round, rectangular, or oval (Rails Shape). In the Rails Profile option, you can select between a round or a rectangular cross-section, allowing you to adapt the rails to the desired style of the ring. The Top Rail and Bottom Rail groups let you fine-tune each rail's own dimensions independently, ensuring that the overall design of the ring perfectly matches your specifications and aesthetic preferences.","metadata":{"title":"Eternity Ring","section":"Bezel","url":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#bezel","source":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#bezel","collection":"docs7","hash":"aa2d2d47fce4dde883b47cd025973e52","indexed_by":"docs-index"}},{"content":"Eternity Ring — Shank\n\nThis tab pertains to the shank of the eternity ring, and only applies when the Full option is not selected in the Gems tab — with Full eternity selected, the tab shows a \"not available in full mode\" notice instead. Otherwise, you can customize the Joining Profile and Bottom Profile (asset, width, height, type — Solid, Comfort or Thickness — and orientation — Natural or Reverse) of the remaining shank sections, plus the Cap distances (Starting Cap and End Cap) where the shank meets the eternity gems. This flexibility enables you to create a unique look that complements the overall style of the eternity band.","metadata":{"title":"Eternity Ring","section":"Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#shank","source":"https://www.rhinoartisan.com/docs/7/shanks/eternity-ring/#shank","collection":"docs7","hash":"c5fd94fcfc26e607849218a4f6af4166","indexed_by":"docs-index"}},{"content":"Graduated — Graduated\n\nGraduated builds the shoulders of a graduated solitaire: a band whose top is cut open, with a run of round diamonds stepping down in size on each side of the gap left for the centre stone. Every stone sits on its own hidden under-bezel that drops to the finger curve and is held by shared prongs, and the length of the cut is derived from the run itself, so the ends of the band always meet the outermost bezel.\n\nRun it from the ribbon (Shanks) or by typing `ArtisanGraduated`. The panel opens on the library of saved styles; pick one, or press Edit to work on the design shown in the viewport. Accepting bakes a parametric Graduated shank that is listed in the Outliner and can be reopened later.\n\nGoldsmith Tip: Set Opening to the real diameter of the centre stone before anything else — it is what the gap is measured from, and every other number in the command follows from it. Then work the run outwards: First size is the stone nearest the centre and should read as roughly half the head, Last size is the one meeting the band and should be small enough to disappear into it. If the last stone is still visibly larger than the band is wide, take one stone off the count rather than shrinking them all; a shoulder of four honest stones always looks better than one of six apologetic ones.","metadata":{"title":"Graduated","section":"Graduated","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#graduated","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#graduated","collection":"docs7","hash":"188f45bc2684608ce59a3ccc5b69e336","indexed_by":"docs-index"}},{"content":"Graduated — Finger Size\n\nSets the ring size. The stones and their bezels are placed on this curve, so changing it re-flows the whole run.\n\nTop profile\nThe upper face of the band. The asset preview at the top of the tab chooses the cross-section shape and opens the editor for it.\n\n* Width: Width of the section, in millimetres.\n* Height: Height of the section, in millimetres.\n* Interior: Solid or Comfort. Comfort hollows the inner face.\n* Comfort Height: Depth of the comfort fit. Shown only while Interior is set to Comfort.","metadata":{"title":"Graduated","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#finger-size","collection":"docs7","hash":"2dde8b7f4ee5d2972d45c70bfb74eaa1","indexed_by":"docs-index"}},{"content":"Graduated — Bottom profile\n\nThe lower face of the band, with the same controls, plus a toggle:\n\n* Enable: Turns the bottom profile on. With it off, the band is swept from the top profile alone.\n* Width, Height, Interior, Comfort Height: as above.\n\nGems\nThe asset preview at the top of this tab chooses the under-bezel section used for every stone in the run.\n\n#### Gems\n\n* Nº of Gems: How many stones per side, from 1 to 12.\n* Distance: Gap between neighbouring stones.\n* First size: Diameter of the stone next to the centre gap — the largest of the run.\n* Last size: Diameter of the stone next to the band — the smallest. The sizes step linearly between the two.\n* Start Gem Z: Radial adjustment of the stone at the centre-gap end, relative to the finger curve.\n* End Gem Z: The same adjustment at the band end. The bezels follow their stones.\n\n#### Bezel\n\nThe five parameters of the standalone Bezel command, applied to every under-bezel in the run.\n\n* Width: Wall thickness of the bezel.\n* Height (0 = auto): Total height of the bezel. Leave it at 0 to let the command derive it from the stone and the finger curve.\n* Girdle Height: Height of the lip above the girdle.\n* Girdle Width: Width of that lip.\n* Gem Inside: How deep the stone sits into the bezel.","metadata":{"title":"Graduated","section":"Bottom profile","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#bottom-profile","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#bottom-profile","collection":"docs7","hash":"fc0bcadc07f7353b96e8287323510e8b","indexed_by":"docs-index"}},{"content":"Graduated — Prongs\n\nThe stones are always set; the prongs are optional and are what actually grips them.\n\n* Enable: Turns the prongs on.\n* Cut by ring size: On, the foot of each prong is cut on the finger curve, so its length is derived per prong and only the Over Girdle values decide where the tip ends — the two Height fields are hidden. Off, the Start/End Height ramp drives the length instead.\n* Start Height / End Height: Total prong length at the centre-gap end and at the band end, ramping linearly between them. Hidden while Cut by ring size is on.\n* Start Over Girdle / End Over Girdle: How far the prong tip rises above the girdle at each end of the run. 0 is flush with the girdle.\n* Start Diameter / End Diameter: Prong diameter at each end of the run.\n* Start Separation / End Separation: How far apart the two rails of prongs sit, at each end of the run.\n* Extension for manufacturing: Extra length added to the prong for the casting stage.\n* End prong mode: Single end prong closes each end of the run with one centred prong, Double end prongs with one on each side.","metadata":{"title":"Graduated","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#prongs","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#prongs","collection":"docs7","hash":"d429dec51d2594d99fd820a4507ff580","indexed_by":"docs-index"}},{"content":"Graduated — Opening\n\nThe top of the band is always cut; this section controls where the cut falls and how its faces are finished.\n\n* Opening: The diameter of the centre stone. This is the gap the run leaves at the top — set it to the stone you intend to mount.\n* Margin: Extra arc length per side added to the derived cut. Positive opens the band away from the outermost bezel; negative buries the cap deeper into it.\n* Cap bumping: Bulge of the cut cap faces.\n* Cap orientation: Natural or Reverse. Flips the profile curve at the cut ends. One selector governs both profiles, since they are the two faces of the same sweep.","metadata":{"title":"Graduated","section":"Opening","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#opening","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#opening","collection":"docs7","hash":"e22f3c35e33524c6c713be2f24c08492","indexed_by":"docs-index"}},{"content":"Graduated — Working with the panel\n\n* Save defaults in the header stores the current parameters as the starting point for the next run; right-click it to clear them and return to the factory values.\n* Save and Update write the design into your styles library so it appears in the gallery next time.\n* Accept bakes the band, the stones, the bezels and the prongs, and lists the result in the Outliner. If the preview has not resolved, the panel asks you to preview first.","metadata":{"title":"Graduated","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/graduated/#working-with-the-panel","collection":"docs7","hash":"923b1730e5ff46ec20a139172042ca85","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching\n\nMatching builds the companion band for a ring that already exists. Instead of sweeping a profile along a plain circle, it fires a ray from every section of the new band against the ring you point at, and seats each section exactly where it touches. The result is a band whose face follows the silhouette of the engagement ring — flush at the top where the setting bulges, straight down the sides and around the bottom.\n\nThis is the wedding band of a bridal set, and it is also the way to build a shadow band, a contour band or any second ring that has to nest against a piece you have already finished.\n\nRun the command with the ring already selected, or press Enter at the prompt and pick it later from the panel. The panel opens on the library of saved Matching styles: click one to preview it, double-click it — or press Edit in the header — to go through to the parameters.","metadata":{"title":"Matching Shank","section":"Matching","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#matching","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#matching","collection":"docs7","hash":"31ac85bbb0a283c44a62d748ed04d73a","indexed_by":"docs-index"}},{"content":"Matching Shank — Selection\n\nThe Selection expander holds the *mother* — the ring, or the whole design, the new band has to match. It stays re-pickable while the panel is open, so you can swap the reference without restarting the command. The pick may span several objects; they are merged into one reference mesh, which is what lets you point at a finished design rather than hunting for the single brep of its shank.\n\nThe rail the band is built on is always the finger-size circle driven by the Size panel, so the band's own diameter is set there and nowhere else.","metadata":{"title":"Matching Shank","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#selection","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#selection","collection":"docs7","hash":"0df53fa3230a8817be1e76c8eb47fda9","indexed_by":"docs-index"}},{"content":"Matching Shank — Parameters\n\nThe parameters are split across two tabs.\n\n#### Band\n\nThe section swept around the band, and how tightly it hugs the ring.\n\n* Profile: the section curve, picked from the RING\\_PROFILE library or edited in place with the curve editor.\n* Top Width / Top Height: the section at the top of the ring, in millimetres.\n* Bottom Width / Bottom Height: the section at the bottom. The two sections blend into each other up the sides, so a band can taper from a broad top to a narrow shoulder.\n* Sections: how many profile stations are probed against the mother ring. The value is always even and never below two — one lands on the top and one on the bottom, the anchors of the blend — and typed odd numbers are rounded up. More sections follow an intricate ring more faithfully and cost more to compute.\n* Distance: the gap along the finger axis between the band and the ring it matches. Negative values press the band into the ring.\n* Top Distance: extra gap applied at the top only, fading smoothly to nothing by 90°. This is what you open when a protruding oval or pear head pushes the band away at the centre but the sides should still sit tight.\n* Side: which face of the mother the band is built against — Side A, Side B, or Both Sides. Both Sides computes a mirrored pair, each one probed against its own face, because the ring it hugs need not be symmetric.\n* Interior: Solid leaves the inner face flat; Comfort domes it toward the finger and reveals the Comfort field for the depth of the dome, in millimetres.","metadata":{"title":"Matching Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","collection":"docs7","hash":"6925e0bbf7e1379ac37af702dc0c5c11","indexed_by":"docs-index"}},{"content":"Matching Shank — Parameters\n\nWhile this tab is open the viewport carries handles for the same values: two on the top section and two on the bottom for width and height, and one handle per section along the band that adds a personal delta on top of the contact the command computed — drag one out to open a gap at that station, drag it in to press the band closer.\n\n#### Gems\n\nA toggle at the top of the tab turns the stone run on. Everything below it is grouped into pill sections.\n\nLayout\n\n* Distribution: Full runs stones the whole way round as one closed line; Side runs them between two angles on each side; Top covers a single arc centred on the top of the band.\n* Size Start / Size End: stone diameter at each end of the run, in millimetres. Setting them apart graduates the stones along the band.\n* Vertical: raises or lowers the stones relative to the band surface.\n* Min Distance: the smallest gap allowed between neighbouring stones.\n* Top Inner Width / Bottom Inner Width: the width of the channel the stones sit in, at the top and at the bottom of the ring. The channel blends between the two the same way the profile does; leave the bottom value at zero to keep it the same as the top.\n* Top Inner Height / Bottom Inner Height: the depth of that channel at each end.\n* Inner Margin: the metal left below the stones, toward the inside of the band.\n* Bright Cut: the height of the bright-cut edge between the metal and the stones.\n* Start / End: the angles, in degrees from the top, where the run begins and ends. Shown for the Side distribution only.\n* Angle: the total arc covered, in degrees. Shown for the Top distribution only.\n* Row Offset: shifts the whole row sideways across the band, positive toward the ring being matched.\n* Gem Shape: Round or Square.","metadata":{"title":"Matching Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","collection":"docs7","hash":"bcbc543c6ea0696388e3e8cacd818eb9","indexed_by":"docs-index"}},{"content":"Matching Shank — Parameters\n\nThe start and end of the run also carry handles on the band in the viewport, so the extent can be dragged instead of typed.\n\nProng Settings\n\nThree buttons choose how the stones are held: without prongs, with shared prongs, or with a scalloped setting.\n\nWith shared prongs you get:\n\n* Top Diameter / Bottom Diameter: prong diameter at the top and bottom of the ring; zero on the bottom keeps it the same as the top.\n* Prong height: how far the prong stands above the stone.\n* Prong distance: how far the prong sits from the stone.\n* Single end prong / Double end prongs: how the run is closed off at each end. The choice is hidden on the Full distribution, which has no ends.\n\nThe scalloped setting adds V-Cutters, Boolean and Remove Channels toggles, plus two pill sections of their own:\n\n* Cutters — Start Height, Start Width, End Height, End Width, Length, Move in Z, Move Middle in Z, the cutter Shape (U, V, square, trapezoidal or French), a Mode that ties the start and end together or frees them, and a Shape Scale slider between round and square.\n* V-Cutters — Start | Width, Start | Height, End | Width, End | Height, Length, Move by Normal, and the same Mode.\n\nDrill Settings\n\nTwo buttons switch the drilling off or on. With it on:\n\n* Allow Intersection and Show control whether the drill volumes may overlap and whether they are drawn in the viewport.\n* Height Top, Height Crown, Height Girdle, Height Pavilion and Height Drill set the vertical proportions of the hole, as percentages of the stone.\n* Size Top, Size Drill and Size Bottom set its widths, and Gem Inside how deep the stone sits into it, in millimetres.\n* Type: the section of the hole — following the gemstone shape, or round, square or hexagonal.","metadata":{"title":"Matching Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#parameters","collection":"docs7","hash":"597d05499fbb18f245d9b25e75ff88d4","indexed_by":"docs-index"}},{"content":"Matching Shank — Working with the panel\n\n* Refresh in the header recomputes the preview. Nothing is computed until a mother ring has been picked — without one there is nothing to hug.\n* Save stores the current parameters in the Matching library so the style can be reused on the next set. Back returns to that library.\n* Save defaults stores the current values as the starting point for the next run; right-click the same button to clear them.\n* Accept bakes the band, its stones and its prongs, grouped together, and lists them in the Outliner.\n\nGoldsmith Tip: Do not match the band until the head is final. The whole point of this command is that the band reads the ring's silhouette, so every change to the setting — a taller basket, a wider halo, a stone that moves a fraction — changes where the band touches. Build the engagement ring completely, then match the band last; and when you do, raise Sections only as far as the shape actually needs. A plain shoulder is happy with the default; an openwork gallery is where the extra stations earn their compute time.\n\nThe matched band is a re-editable Artisan element. Select it and run ArtisanEdit — or use the Outliner — to reopen this panel with the parameters it was built with. It also remembers the ring it was matched to: change that ring and the band is flagged for regeneration, so the pair stays in contact.","metadata":{"title":"Matching Shank","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/matching-shank/#working-with-the-panel","collection":"docs7","hash":"f11fb03f0240c05987dfa8054b5c7bd4","indexed_by":"docs-index"}},{"content":"Pave Shank — Pave\n\nPave builds a band and lays the stones on it in the same operation. The band itself is a plain swept shank — a profile, a width, a height — and on top of it you define rows: lines of equal stones running along the ring at a lateral offset from the centre of the profile, each one with its own size, spacing and extent. Add a second row beside the first and you have a two-row pave; mirror a row and it appears on both sides of the band without becoming a second thing to edit.\n\nProngs are placed by pointing at where you want them on a stone rather than by choosing a preset arrangement, and cutters are generated from the stones so the seats are cut in the same pass.\n\nThe command opens straight on its parameters — there is no style gallery.","metadata":{"title":"Pave Shank","section":"Pave","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#pave","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#pave","collection":"docs7","hash":"30f30164760cf347320a76a7983724a9","indexed_by":"docs-index"}},{"content":"Pave Shank — Size\n\nThe finger size drives the ring. Change it and the band, the rows and everything sitting on them are rebuilt around the new diameter.","metadata":{"title":"Pave Shank","section":"Size","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#size","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#size","collection":"docs7","hash":"d9f9e18a0a9853468a8e853379accba5","indexed_by":"docs-index"}},{"content":"Pave Shank — Parameters\n\nThe parameters are split across four tabs.\n\n#### Shank\n\nThe band the stones are set into.\n\n* Profile: the section curve, picked from the ring profile library or redrawn in the curve editor.\n* Width / Height: the section, in millimetres. Both also have a handle in the viewport — the red one across the band for width, the blue one at the top of the ring for height — so the section can be dragged instead of typed.\n* Type: how the inside of the band is closed. Solid fills it, Comfort domes it toward the finger and reveals Comfort Height for the depth of the dome, Thickness hollows it to a wall and reveals Thickness for that wall.\n\nBelow the section, three buttons choose what happens at the bottom of the ring:\n\n* Pinch narrows the band toward the bottom, and shows Opening, Base X, Base Y and Base Z — the width of the pinched region and the position of its base along each axis.\n* Open cuts the band open at the bottom, and shows Cut length for the length of the cut edge and Cap bumping for the bump left outside the ring.\n* None leaves the band closed all the way round, with no extra parameters.\n\n#### Gems\n\nThis tab holds the Rows — one card per row, added with + Add row and removed with the ✕ on the card. A new row is cloned from the last one and pushed one stone further out, so adding rows in sequence walks them across the band.\n\nEach card carries, in its header:","metadata":{"title":"Pave Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","collection":"docs7","hash":"01b1c70f516ea1abc526b7bbd11fd6a7","indexed_by":"docs-index"}},{"content":"Pave Shank — Parameters\n\n* A chevron that collapses the card, so a band with several rows stays readable.\n* A colour swatch that opens the colour picker. That colour is what the row's stones are drawn in while you work, which is how you tell one row from another in the viewport.\n* Mirror, which also places the row's stones at the opposite offset. This is a property of the one row, not a copy of it: edit the row and both sides follow.\n* Duplicate, which adds a real second row shifted one stone outward, with a fresh colour.\n\nAnd in its body:\n\n* Stone size: the diameter of the row's stones, in millimetres.\n* Offset: where the row sits across the band, measured along the profile from its centre. Zero is the middle of the band.\n* Spacing: the gap left between consecutive stones along the row.\n* Start and End: the angles, in degrees around the ring, between which the row runs. A row left at 0 and 360 goes the whole way round. Both angles also have a handle on the row's guide circle in the viewport, drawn in the row's colour; while a row is still symmetric, dragging the start handle moves the end to match, and once you have set an asymmetric end it stops doing so.\n\nTwo buttons under the list control what the preview shows and change nothing in the result: one swaps the stones between plain circles and real gems, the other shows each stone's diameter beside it.\n\n#### Prongs\n\nGlobal at the top holds a Diameter and a Height. New prongs start from these, and editing either one applies it to every prong already defined — the quick way to resize the whole setting at once.","metadata":{"title":"Pave Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","collection":"docs7","hash":"01df40397b01566e04ff5747074700f3","indexed_by":"docs-index"}},{"content":"Pave Shank — Parameters\n\nBelow it, Prongs is a list of prong definitions, added with + Add prong. Adding one immediately asks you to pick its position in the viewport; the pick is constrained to the plane of the first stone of the row, and that stone is highlighted in yellow so you can see what you are aiming at. Cancelling the pick leaves the prong at the stone centre.\n\nEach card carries, in its header, the same chevron and colour swatch as the rows, plus:\n\n* A visibility toggle. Hidden prongs are skipped by the computation entirely, not merely undrawn.\n* Mirror, which also places the prong on the other side of the band.\n* Delete.\n\nAnd in its body:\n\n* A row selector, choosing which row the prong belongs to.\n* Pick, to place the prong again in the viewport.\n* X and Y: the offset from the stone centre in the plane of the stone, in millimetres. Every visible prong also has a draggable handle in the viewport at that position, so it can be nudged without re-picking.\n* Diameter and Height: the prong's own size. A prong left at zero height stays a flat marker; give it a height and it becomes a solid prong that is built and baked with the ring.\n* All gems: repeat the prong on every stone of the row. Turn it off and it is placed on the first stone only.\n\nProngs are tied to their row by position in the list, and deleting a row takes its prongs with it.\n\n#### Cutters\n\nOne cutter is generated per placed stone, and on Accept they are subtracted from the band so the seats and the holes are already cut.","metadata":{"title":"Pave Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","collection":"docs7","hash":"a9d2a2ffcd4edb3969c7ed700246b7ea","indexed_by":"docs-index"}},{"content":"Pave Shank — Parameters\n\n* Show Cutters turns them on. Touching any value below turns them on too.\n* Height Top, Height Crown, Height Girdle, Height Pavilion and Height Drill set the vertical proportions of the cutter as percentages of the stone.\n* Size Top, Size Drill and Size Bottom set its widths, also as percentages, and Gem Inside how far the stone sits into it, in millimetres.\n* Type sets the section of the hole: following the gemstone shape, or round, square or hexagonal.\n\nPresets underneath offers four ready-made combinations of sizes and heights; click one and adjust from there rather than starting from nothing.","metadata":{"title":"Pave Shank","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#parameters","collection":"docs7","hash":"2a036068e5de97964618d8713f3f0a44","indexed_by":"docs-index"}},{"content":"Pave Shank — Working with the panel\n\n* Refresh in the header recomputes the preview. A change made while a computation is running is not lost — the panel re-runs with the latest values as soon as the current pass finishes.\n* Save defaults stores the current band, rows, prongs and cutter values as the starting point for the next run; right-click the same button to clear them.\n* Accept bakes the band, the stones as one group and the solid prongs as another. If cutters are enabled the subtraction is done first, off the main thread — on a heavy row count this takes a moment, and the header spinner keeps running while it does. If that boolean fails, the band is baked untouched and the command says so in the command line rather than losing your work.\n\nGoldsmith Tip: Set Spacing before you set Stone size. The row fills itself with as many stones as fit, so the gap is what actually controls whether the pave reads as a continuous line of light or as a row of separate stones — and it is also what your setter will complain about first. Pick the gap you would cut by hand, then adjust the stone size until the row lands where you want it to end; a run that stops a fraction short is better than one whose last stone is crowded into the shoulder. And keep the rows in different colours while you work: on a three-row band, the colours are the only quick way to see which row a stray stone belongs to.\n\nThe pave shank is a re-editable Artisan element. Select it and run ArtisanEdit — or reach it through the Outliner — to reopen this panel with the rows, prongs and cutter settings it was built with; its stones and prongs come back with it as children, so accepting replaces the whole set rather than leaving the old stones behind.","metadata":{"title":"Pave Shank","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/pave-shank/#working-with-the-panel","collection":"docs7","hash":"2857038eb6d5d5b3b4dc1f62549db07b","indexed_by":"docs-index"}},{"content":"Ring Curve — Ring Curve\n\nWith this command, you can create a curve of a ring, with the precise diameter of the size you want.\n\nRunning this command will display its parameters in the Commands toolbar.\n\nOnce the command has been executed, you can choose from various international sizing scales and sizes and what type of curve you want to create: closed, open, bypass, shape, or a custom profile drawn in the 2D editor.\n\nThe Ring Curve will be listed on the Outliner toolbar when you confirm your changes.\n\nGoldsmith Tip : Starting your ring designs with the ring curve is highly recommended. This serves as a crucial reference point, allowing you to accurately measure the distance from the finger to the culet of the stones and other key components.","metadata":{"title":"Ring Curve","section":"Ring Curve","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#ring-curve","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#ring-curve","collection":"docs7","hash":"e07f98bce47fe24382772fdbc9120ed8","indexed_by":"docs-index"}},{"content":"Ring Curve — Finger Size\n\nAllows users to select different finger sizes to adjust the ring accordingly.","metadata":{"title":"Ring Curve","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#finger-size","collection":"docs7","hash":"24bdb45055a6715b2a311dff6171dea7","indexed_by":"docs-index"}},{"content":"Ring Curve — Parameters\n\n1. Closed: Provides a closed curve for the ring's creation, resulting in a continuous, complete band.\n\n2. Open: Provides an open curve for the ring's creation. This option allows the user to set the degree of opening, offering more control over the design of the ring.\n\n* Opening Length: Controls the size of the opening in the shank.\n\n3. Bypass: This style of ring features two bands that gracefully curve around each other, giving the appearance of overlapping or interwoven strands.\n\n* Opening Length: Controls the size of the opening between the two curves.\n* Angle: Allows the user to set the rotation angle of the curves. This parameter can be used to create rings with varied twists and orientations.\n* Offset In X / Offset In Y: Controls the offset distance between the curves in both the X and Y axes, providing precise control over the alignment and spacing of the ring's components.\n\n4. Shape: Provides an advanced curve creation system to define the shape of the ring. The following parameters allow customization:","metadata":{"title":"Ring Curve","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#parameters","collection":"docs7","hash":"a50b37e4bdd4fe153c0dedc04a2688db","indexed_by":"docs-index"}},{"content":"Ring Curve — Parameters\n\n* Opening Length: Adjusts the size of the opening in the shank, similar to the \"Open\" shank configuration.\n* Round / Ellipse: Two buttons that define the general shape of the top portion of the shank, offering either a round or an elliptical form. The parameters below change with the choice: Round exposes a single Diameter, Ellipse exposes Width and Height instead.\n* Diameter (Round only): Modifies the diameter of the upper curve, determining the overall size of the top portion of the ring.\n* Width and Height (Ellipse only): Modify the two axes of the upper curve independently.\n* Offset: Changes the offset of the central curve, allowing for further control of the curvature's position relative to the center.\n* Move In Z: Enables movement of the upper curve along the Z-axis, giving flexibility to the vertical positioning of the top part of the ring.\n* Start On Circle: Allows the user to select the starting point of the curve along a circular path.\n* End On Circle: Determines the endpoint of the curve on the circular path, providing control over the termination of the curve’s design.\n\n5. 2D Editor: Instead of one of the preset configurations, the ring curve follows a profile of your own. The section shows the current profile asset, with the option to pick a different one from the asset library or open it in the profile editor and reshape it point by point.\n\n* Symmetry: Keeps the profile symmetric while you edit it, so both halves stay mirrored.\n* Cylinder: Shows the finger cylinder in the editor as a reference, so you can see how far your profile departs from the finger circle.","metadata":{"title":"Ring Curve","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-curve/#parameters","collection":"docs7","hash":"f784d5152dec9552b41d79c9d70191e8","indexed_by":"docs-index"}},{"content":"Ring Extrude — Extrude Ring\n\nExtrude Ring builds a band from two silhouettes instead of from a swept section. You give it the shape the ring shows from the front — its outline, the flare of the shoulders, the sweep down to the bottom — and the shape it shows from the side, and the command extrudes one against the other into a solid ring at the finger size you set.\n\nThat makes it the tool for bands whose character is in the outline rather than in the section: sculpted and organic shanks, wide bands that swell and narrow around the finger, tapered and pinched profiles that a fixed section cannot describe. Both silhouettes come from the asset libraries and can be redrawn in the curve editor, so the shape is yours rather than a preset.\n\nThe command opens straight on its parameters — there is no style gallery to pick from.","metadata":{"title":"Ring Extrude","section":"Extrude Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#extrude-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#extrude-ring","collection":"docs7","hash":"e9f0ce9a1de929aa957d4f86d851c6f9","indexed_by":"docs-index"}},{"content":"Ring Extrude — Size\n\nThe finger size drives the diameter of the ring, as everywhere else in Artisan. Set it before you fine-tune the lengths and thicknesses, because they are all measured from it.\n\nParameters\nThe two silhouettes live behind two tabs.\n\n#### Frontal\n\nThe outline of the ring seen face on, taken from the external ring profile library.\n\n* Top Length: the width of the band at the top of the ring, in millimetres.\n* Side Length: the width at the sides.\n* Bottom Length: the width at the bottom.\n\nSetting the three apart is what gives the band its taper: a broad top running down to a narrow bottom, or the reverse.\n\n#### Lateral\n\nThe ring seen from the side, taken from the ring side curve library — this is the curve that decides how the band's thickness changes around the finger.\n\n* Top Thickness: how thick the band is at the top, in millimetres.\n* Bottom Thickness: how thick it is at the bottom.","metadata":{"title":"Ring Extrude","section":"Size","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#size","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#size","collection":"docs7","hash":"971e5c087b11ffc1cfa9b373180532c8","indexed_by":"docs-index"}},{"content":"Ring Extrude — Advanced\n\n* Hollow: hollows the band out instead of leaving it solid, so the piece casts lighter.\n* Symmetric / Asymmetric: how the remaining wall is described. Symmetric uses one figure all the way round; asymmetric splits it into a top and a lateral value, which is what you want when the top of the band has to stay heavy while the sides are thinned.\n* Linear Thickness: the wall left behind, in millimetres. Shown in symmetric mode.\n* Top Thickness and Lateral Thickness: the wall left at the top and at the sides. Shown in asymmetric mode.\n* Angle: rotates the hollowing around the ring, so the thinned region can be aimed where the design allows it.","metadata":{"title":"Ring Extrude","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#advanced","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#advanced","collection":"docs7","hash":"3e018bdb99614111e1cfcac448775f45","indexed_by":"docs-index"}},{"content":"Ring Extrude — Working with the panel\n\n* Refresh in the header recomputes the preview; the panel keeps computing in the background while you carry on adjusting.\n* Save defaults stores the current silhouettes and values as the starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n* Accept adds the extruded ring to the document with the document metal applied.\n\nGoldsmith Tip: Draw the frontal silhouette for the finger, not for the drawing. The width at the bottom is what the customer feels all day, and it is also where a wide band digs in; taking Bottom Length a millimetre under Top Length costs nothing visually — nobody looks at the underside of a ring — and turns a band that gets taken off into one that gets worn. Then, once the outline is settled, use Hollow in asymmetric mode: keep the top wall heavy enough to hold a polish and thin the sides, and you take real weight out of the casting without touching the silhouette you just tuned.\n\nThe extruded ring is a re-editable Artisan element. Select it and run ArtisanEdit — or reach it through the Outliner — to reopen this panel with the silhouettes and values it was built with, and it follows a document ring-size change on its own.","metadata":{"title":"Ring Extrude","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/ring-extrude/#working-with-the-panel","collection":"docs7","hash":"bf6145c7b78982e3793dd3fe149a7f79","indexed_by":"docs-index"}},{"content":"Scoop Ring — Scoop\n\nScoop hollows the inside of a finished band. It carves a channel out of the inner wall along an arc you control, leaving a wall of the thickness you ask for. Less metal means a lighter piece and a cheaper cast, and a scooped band sits more comfortably on the finger — which is why it is standard practice on anything wide.\n\nIt works on a band that already exists: run it after the shank, the setting and the booleans, as one of the last steps before the piece goes out.","metadata":{"title":"Scoop Ring","section":"Scoop","url":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#scoop","source":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#scoop","collection":"docs7","hash":"45ec56e7d6c2d6b63fb25ae69aa622d9","indexed_by":"docs-index"}},{"content":"Scoop Ring — Selection\n\nThe Selection section is where the command starts. Pick the faces to scoop — the inner faces of the band, the ones that touch the finger.\n\nAll the faces you pick must belong to the same object; a pick spanning several objects keeps only the first one. As soon as a valid pick is made, the original object is hidden and replaced by a live preview of the scooped result, and a circular rail with four handles appears around the ring.","metadata":{"title":"Scoop Ring","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#selection","source":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#selection","collection":"docs7","hash":"39f27d108f7195026c7e18969e2a6c10","indexed_by":"docs-index"}},{"content":"Scoop Ring — Setting the extent\n\nThe scoop runs along an arc, not the whole circumference: the band stays solid where the seam and the setting are. That arc is defined twice over — with numbers, and with the handles on the rail — and the two stay in sync, so drag the handles and watch the fields update, or type the values and watch the handles move.\n\nThe arc has two parts. The central arc is fully scooped to the thickness you set. On each side of it, the transition arc fades the scoop back out to the solid band, so there is no step where the channel ends.","metadata":{"title":"Scoop Ring","section":"Setting the extent","url":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#setting-the-extent","source":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#setting-the-extent","collection":"docs7","hash":"3eb47adef2cf3e41a473e0d56f1ba96b","indexed_by":"docs-index"}},{"content":"Scoop Ring — Parameters\n\n* Thickness: The wall left behind in the scooped area, in millimetres. This is the number your caster cares about — it is what stops the band collapsing.\n* Central Angle: The span of the fully scooped arc, in degrees, centred opposite the seam. The default 108° covers roughly the bottom third of the band.\n* Transition Angle: The extra arc, in degrees, added at each end of the central one, over which the scoop fades progressively back into the solid band.\n* Transition Inset: How far the end sections of the scoop are pushed toward the centre of the ring, which deepens the ends of the transition and softens the way it runs out.\n* Mode: Symmetric keeps both ends of the scoop mirrored around the bottom of the band, driven by the two angle fields. Asymmetric unlocks the two sides so you can drag each end independently — the Central Angle and Transition Angle fields are disabled in this mode, because the handles are the only thing defining the extent.\n* Smoothing: How finely the scoop surface is rebuilt. Smooth, Medium and Fine rebuild it to progressively more points, giving a heavier but more faithful surface; Precise skips the rebuild altogether and uses the exact sections. Start on Smooth and go up only if you can see facets on the finished channel.\n* Display Wires: Shows the cutting volume and its section curves in the viewport while you work. It changes nothing in the result — it is there so you can see exactly what is being removed.\n* Liner: Adds a separate liner shell inside the scoop instead of leaving it open. Turning it on reveals the Liner section below.","metadata":{"title":"Scoop Ring","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#parameters","source":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#parameters","collection":"docs7","hash":"089ae28bceeb34f7a1eb21ccc41c4e1f","indexed_by":"docs-index"}},{"content":"Scoop Ring — Liner\n\nVisible only when the Liner toggle is on.\n\n* Liner Thickness: The thickness of the liner shell, in millimetres.\n* Swap Liner: Flips which side of the split the liner is built on. If the liner comes out on the wrong side of the wall, this is the switch that fixes it.\n\nWorking with the panel\n* Refresh in the panel header recomputes the preview. The scoop is a boolean operation and can take a moment on a complex band — the panel keeps computing in the background while you keep adjusting.\n* Accept replaces the original object with the scooped one, keeping its layer and attributes, and adds the liner as separate objects when it is enabled. If you press Accept before a preview has resolved, the panel asks you to refresh first.\n* Save defaults in the header stores the current thickness, angles and options as your starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n\nGoldsmith Tip: Decide the scoop before you quote, not after. On a 6 mm band a scoop of a couple of degrees either side of the bottom can take a noticeable fraction of the metal out of the piece, and in gold that is the difference between two prices. Set Thickness to whatever your caster considers the minimum safe wall, then open the Central Angle as far as the design allows — the transition arc is what keeps it from looking like it was drilled.","metadata":{"title":"Scoop Ring","section":"Liner","url":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#liner","source":"https://www.rhinoartisan.com/docs/7/shanks/scoop-ring/#liner","collection":"docs7","hash":"f9eee0e9c5e45f019b4ee90595946ab9","indexed_by":"docs-index"}},{"content":"Signet Ring — Signet Ring\n\nUsing this command, you can create signet rings, a great style for the foundation of family crests, seals, university, and other types of elegant bold rings.\n\nWhen you run this command, its parameters will appear in the Commands toolbar. Your first step is to decide whether you want to start with a pre-designed style provided by RhinoArtisan or create a new one by editing the style currently displayed in the viewport.\n\nOn its parameters, you can find the ring size, measurements, the asset that will shape the signet area, and options to make a recess on the ring.","metadata":{"title":"Signet Ring","section":"Signet Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/signet-ring/#signet-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/signet-ring/#signet-ring","collection":"docs7","hash":"94d86325c47b14719a90d3a205cc1570","indexed_by":"docs-index"}},{"content":"Signet Ring — Finger Size\n\nAllows users to select different finger sizes to adjust the ring accordingly.\n\nParameters\n* Mode: Select the outline of the signet face — Circle for a plain circular section, or Custom Shape for one defined by curves in your assets, which can be edited to fit your design needs. In Circle mode only a single Diameter value is shown; Custom Shape exposes independent Width and Height fields instead.\n* Width and Height: Set the width and height of the face to match the dimensions required for your design.\n* Height Position: Adjust the position of the face in relation to its height above the band.\n* Rotation: Adjust the rotation of the face in the Z axis.\n* Width/Height Bottom Profile: Set the width and height of the bottom profile of the band.\n* Width/Height Middle Profile: Set the width and height of the middle profile of the band.\n* Recess: Switch the finish of the face between Flat and Boolean with the two option buttons. With Boolean selected, two extra parameters appear:\n* Thickness: Determines the thickness of the edge.\n* Inner Height: Determines the inner height of the face.\n\nThe Signet Ring will be listed on the Outliner toolbar when you confirm your changes.\n\nGoldsmith Tip : This tool is versatile beyond creating classic signet rings, offering jewelers numerous possibilities. For example, you can use the Round Cap command to create a dome surface for a pavé design that seamlessly fits the signet shape. Or, craft a signet with a recessed area to add custom initials. With the Creator command, you can design a custom stone, then use the same curve with an offset and recess to quickly create a ring tailored to that gemstone. By combining different RhinoArtisan commands, you can significantly enhance your design workflow.","metadata":{"title":"Signet Ring","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/signet-ring/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/signet-ring/#finger-size","collection":"docs7","hash":"7109e03255dd199f34171de0849bd5cc","indexed_by":"docs-index"}},{"content":"Split Shank — Split Shank\n\nSplit Shank builds a cathedral band that forks: a single trunk rises from the bottom of the ring and, at a point you choose, splits into two arms that climb to the head separated along the finger axis. It is the shoulder of the split-shank and open-shoulder engagement rings, and it can carry pavé that runs up the trunk, bridges the fork with one stone, and continues along both arms.\n\nRun it from the ribbon (Shanks) or by typing `ArtisanSplitShank`. Unlike most shank commands it opens straight into its parameters — there is no style gallery. The panel is driven together with gumballs in the viewport: one on the rail for the movable Side profile, and two on the arms marking the ends of the pavé run.\n\nGoldsmith Tip: Split Start and the Side profile are two different things, and confusing them is the usual reason a split shank looks wrong. Split Start is where the metal actually forks; the Side profile is only a cross-section you can slide along the rail to control the swell. Fix the fork first — usually a little above where the finger stops being visible, around 0.5 to 0.6 — then move the Side profile up near the fork and fatten it slightly. That is what gives the shoulder its shape, and it costs nothing in metal because the trunk below stays as thin as you left it.","metadata":{"title":"Split Shank","section":"Split Shank","url":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#split-shank","source":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#split-shank","collection":"docs7","hash":"0b769e0e8c3d74bd7e2090a580fafe61","indexed_by":"docs-index"}},{"content":"Split Shank — Finger Size\n\nSets the ring size the rail is built on.\n\nProfiles\nThe metal is swept through three cross-sections along the arm rail. Bottom sits at the ring bottom and Top at the arm tip; both are fixed at their ends and always active. Side is the central one: it can be switched off, and its position along the rail is movable — either from the panel or by dragging its gumball on the rail in the viewport.\n\nThree buttons select which of the three you are editing. Each has the same set of controls, and the asset preview at the top of the panel chooses and edits its section shape.\n\n* Width: Width of the section, in millimetres.\n* Height: Height of the section, in millimetres.\n* Type: Solid, Comfort or Thickness — the treatment of the inner face.\n* Comfort Height: Depth of the comfort fit. Shown only while Type is Comfort.\n* Rotation: Roll of the section about the rail, in degrees.\n* Displacement: Lateral shift of the section off the rail.\n* Orientation: Natural or Reverse. Flips the profile curve.\n\nThe Side panel also carries an enable toggle. With it off, the sweep runs straight from Bottom to Top and the rail gumball disappears.\n\n#### Shape\n\n* Arm Height: How far the arm tips rise above the top of the band.\n* Opening: Separation along the finger axis between the two arms of each side — the width of the fork.\n* Split Start: Where the arms leave the shared trunk, as a fraction of the rail from 0 (ring bottom) to 1 (arm tip).","metadata":{"title":"Split Shank","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#finger-size","collection":"docs7","hash":"8c9201268e2a331005e08906ce347816","indexed_by":"docs-index"}},{"content":"Split Shank — Gems\n\nPavé along the shank. The toggle at the top of the tab enables it; with it on, the command cuts the channel and lays the stones on it. The two orange gumballs on the rail set where the run starts and ends, and they stay in sync with the geometry — the start one cannot be pushed back past the fork.\n\nThe run is treated as three zones: the trunk below the fork, one stone at the fork junction bridging them, and the two arms above it. Sizes and spacing are set per zone.\n\n* Start: Stone size at the arm tip.\n* Transition: Size of the stone that sits at the fork, where two arms meet one trunk.\n* End: Flat stone size along the trunk, below the fork.\n* Arm Spacing: Gap between stones on the arms.\n* Shank Spacing: Gap between stones on the trunk.\n* Vertical: Radial lift of the stones over the rail.\n* Angle: Angular extent of the pavé, in degrees.\n* Move in Z: Vertical displacement of the stones.\n* Inner Width / Inner Height: Width and depth of the seat cut under the girdles.\n* Bright Cut: Height of the bright-cut edge between metal and stones.\n* Margin: Metal left at the edge of the channel.\n* Inner Margin: Metal left under the stones.\n* Gem Shape: Round or Square.\n\n#### Prong settings\n\nThree buttons choose how the stones are held: without prongs, shared prongs (one bead between neighbouring stones) or scalloped.\n\n#### Drill settings\n\nThree buttons choose the hole left under each stone: none, round or square.\n\n#### Channel settings\n\n* Channel shape: U, V or □ (square) — the cross-section of the channel the stones sit in.\n* Flip Start: Flips the channel profile at the bottom end of the run.\n* Flip End: Flips it at the tip end.\n* V-Cutters: Adds V-shaped divider cuts between adjacent stones.","metadata":{"title":"Split Shank","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#gems","collection":"docs7","hash":"e7eb18ea1545a03ae57f61b70ae15141","indexed_by":"docs-index"}},{"content":"Split Shank — Working with the panel\n\n* Save defaults in the header stores the current parameters as the starting point for the next run. Right-click the same button to clear them and go back to the factory values.\n* Accept bakes the split shank into the document as a parametric object. If the preview has not been computed, the panel asks you to preview first; if the parameters cannot be built, it reports why rather than failing silently.","metadata":{"title":"Split Shank","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/split-shank/#working-with-the-panel","collection":"docs7","hash":"8a713840b45145298c60dbbc6df83aca","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows\n\nTwo Rows builds a knife-edge pavé band: a Classic shank with a gently pointed top, carved by two parallel channels — one on each face of the ridge — each carrying its own row of stones. It is the shank behind two-row pavé and knife-edge wedding and eternity bands, and it can also be driven as a single wide channel holding both rows side by side.\n\nRun it from the ribbon (Shanks) or by typing `ArtisanTwoRowsShank`. The panel opens on the library of saved styles; pick one, or press Edit to work on the design in the viewport. Accepting bakes a parametric shank — band, stones, prongs and, optionally, drill cutters — and lists it in the Outliner for later re-editing.\n\nGoldsmith Tip: The whole piece lives or dies on the Wall width — the sliver of metal between the two rows. Make it too generous and the ring stops reading as two rows and starts reading as a wide band with a groove; make it too mean and the two rows of girdles touch inside the metal and there is nothing left to hold either of them. Start at a fifth of the stone size and check it against a section view, not a render. And keep an eye on the depth: two channels cut into opposite faces of a knife edge meet in the middle long before you expect them to.","metadata":{"title":"Two Rows Shank","section":"Two Rows","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#two-rows","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#two-rows","collection":"docs7","hash":"24f03f9bbfb664ac629f9b9656ce8c3b","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Finger Size\n\nSets the ring size the band is built on.\n\nTop profile\nThe band itself is a Classic shank, edited here through the Classic profile editor. The top profile is the outer face — the one the two channels are cut into. The asset preview chooses and edits its cross-section; the command starts on a triangular section, which is what gives the knife edge.\n\n* Width: Width of the section, in millimetres.\n* Height: Height of the section, in millimetres.\n* Type: Solid, Comfort or Thickness — the treatment of the inner face, with its own depth field appearing alongside.\n* Rotation: Roll of the section.\n* Move in Z: Vertical displacement of the section.","metadata":{"title":"Two Rows Shank","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#finger-size","collection":"docs7","hash":"847fc1061c3967380541034e9d31793f","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Bottom profile\n\nThe inner face of the band.\n\n* Profile: Top Profile mirrors the section used on top; Half-round switches the interior to a half-round section.\n* Width, Height, Type, Rotation, Displacement: as above.","metadata":{"title":"Two Rows Shank","section":"Bottom profile","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#bottom-profile","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#bottom-profile","collection":"docs7","hash":"4d958e1dbf849db1b2717ccd5f478542","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Gems\n\nEverything about the rows: where they run, the channel they sit in, the stones, and the prongs.\n\n#### Layout\n\nWhere the pavé runs around the finger.\n\n* Full: All the way round.\n* Side: A run on each side, bounded by Start and End angles in degrees.\n* Top: A single run centred on the top, bounded by one Angle. Only available on a complete band — selecting an opening under Advanced disables it and falls back to Side.\n\n#### Channel\n\n* 2 Rails: Two channels, one cut into each face of the ridge — the knife-edge design.\n* 1 Rail: One wide channel centred on the apex, with both rows of stones sitting in it. Use it with a flat-topped section.\n* Angled / Horizontal (2 Rails only): whether the channels follow the angle of the face or are cut flat, with a radial base.\n* Width (2 Rails): How deep each channel sinks into the band.\n* Border (1 Rail): The outer metal rim left on each side of the single channel.\n* Height: Vertical offset of the channel.\n* Wall width (2 Rails): Thickness of the metal wall left between the two rows.\n* Row spacing (1 Rail): Gap between the two rows of stones, edge to edge.\n* End margin: Gap between each end of the channel and the nearest stone — the metal left at the start and finish of the run.\n\n#### Gems\n\n* Round / Princess: Shape of the stones.\n* Gem size: Diameter of the stones.\n* Min. Distance: Minimum gap between neighbouring stones.\n* Move in Z: Radial displacement of the stones.\n\n#### Settings\n\nTwo buttons select whether the stones are held by prongs or not. With prongs on:","metadata":{"title":"Two Rows Shank","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#gems","collection":"docs7","hash":"d12f61ec62cdfc8fb31b70dacd9b6cae","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Gems\n\n* Diameter: Diameter of the outer prongs, the columns at the rim of the channel.\n* Internal (1 Rail only): Diameter of the inner prongs — the shared centre column between the two rows.\n* Height: Height of the prong bead.\n* Gem inside: How deep the stone sits into the metal.\n* Over girdle: How far the prong rises above the girdle.\n* Extension Manufacturing: Extra prong length for the casting stage.\n* End prong mode: Single end prong finishes each rail with one centred prong, Double end prongs with one on each side.","metadata":{"title":"Two Rows Shank","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#gems","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#gems","collection":"docs7","hash":"9833dc56688286edd22abd1eef4997bf","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Cutters\n\nThe drill cutters under the stones, using the same parameters as the standalone Cutter command. Show Cutters turns them on; while it is off, changes here have no effect on the preview and nothing is baked.\n\n* Height Top, Height Crown, Height Girdle, Height Pavilion, Height Drill: The five vertical steps of the cutter profile, from the top face down through the crown, girdle and pavilion to the through-hole.\n* Size Top, Size Drill, Size Bottom: Widths at the top, at the drill and at the bottom.\n* Gem Inside: How deep the stone sits into the cutter.\n* Type: Gemstone Shape, Round, Square or Hexagon.\n\nWhen you accept with cutters on, one parametric cutter is baked per stone, linked to its stone, and all of them are grouped together.","metadata":{"title":"Two Rows Shank","section":"Cutters","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#cutters","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#cutters","collection":"docs7","hash":"d707cd6362f65cac9a7addb93aecb897","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Advanced: Opening\n\nHow the band is finished at the top, in case the shank is meant to receive a head rather than close on itself. Three buttons choose the mode.\n\nPinch narrows the band toward the top:\n\n* Opening: Width of the pinched area.\n* Base X: Lateral position of the base of the pinch.\n* Base Y: Depth of the pinch into the material.\n* Base Z: Vertical position of the base of the pinch.\n\nOpen cuts the band:\n\n* Cut length: Length of the cut edge.\n* Cap bumping: Bulge of the cap faces outside the ring.\n\nNone leaves the band complete. This is the only mode in which the Top gem layout is available.","metadata":{"title":"Two Rows Shank","section":"Advanced: Opening","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#advanced-opening","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#advanced-opening","collection":"docs7","hash":"ee272711fa224b5d9f12f6efee1e15cd","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Working with the panel\n\n* Save defaults in the header stores the current parameters as the starting point for the next run. Right-click the same button to clear them and return to the factory values.\n* Save and Update write the design into your styles library so it appears in the gallery next time.\n* Accept bakes the band, its stones, prongs and cutters as one parametric group and lists it in the Outliner. If the preview has not resolved, the panel asks you to preview first.","metadata":{"title":"Two Rows Shank","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/two-rows-shank/#working-with-the-panel","collection":"docs7","hash":"73ac0437bd3da430577b8742b3d67f5c","indexed_by":"docs-index"}},{"content":"Utilities\n\nEverything on the Shanks tab that is not a shank builder: what you run before building a band to get the size right, and what you run after it exists to lighten it or mark it.\n\nSetting the size\nBefore any shank exists there is a curve at the right size. Get this wrong and every measurement downstream is wrong with it.\n\nCurve The ring curve at the size you choose — the spine every shank is built along.\n\nEstimate Size\n\nCut by Ring Size\n\nEstimate Size and Cut by Ring Size live in the submenu of the Curve button — click the small arrow in its corner. Estimate reads a ring already in the document and tells you its size; Cut trims a finished ring open to a larger size, or clears an intruding bezel.","metadata":{"title":"Utilities","url":"https://www.rhinoartisan.com/docs/7/shanks/utilities/","source":"https://www.rhinoartisan.com/docs/7/shanks/utilities/","collection":"docs7","hash":"fcf9f544d423979aaa9f1333fcf7d368","indexed_by":"docs-index"}},{"content":"Utilities — Finishing the band\n\nTwo commands applied once the band exists.\n\nScoop Hollows the inside of the band: less metal, a lighter piece, a cheaper cast — and a ring that sits better on the finger.\n\nEngrave Text at the ring size, ready to be cut into the band or raised out of it — dates, names, hallmarks.","metadata":{"title":"Utilities","section":"Finishing the band","url":"https://www.rhinoartisan.com/docs/7/shanks/utilities/#finishing-the-band","source":"https://www.rhinoartisan.com/docs/7/shanks/utilities/#finishing-the-band","collection":"docs7","hash":"0600b03536e3331daeba020d0056ff0b","indexed_by":"docs-index"}},{"content":"Band — Band\n\nBand builds a single wedding band: a plain ring swept from a profile you choose, with the option of a run of stones set around it. It is the quickest route to a wedding or eternity band — pick the section, set the width and height, and if the design calls for it, turn the stones on and choose how far around the finger they go.\n\nUnlike the Wedding Ring command, which produces a matched pair, this one builds one band at a time. That is usually what you want when the two rings in a set are not the same.\n\nGoldsmith Tip: When a couple orders a pair, build one band to the specification you agreed and then run the command again for the second, changing only the ring size and whatever detail differs — a stone, a narrower width. Working from one settled section keeps the pair looking like a pair, and it lets you render several variations for the customer without modelling each one from scratch.","metadata":{"title":"Band","section":"Band","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#band","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#band","collection":"docs7","hash":"366c15e3d98d584982b2ec64dd1daf11","indexed_by":"docs-index"}},{"content":"Band — Finger Size\n\nSets the ring size. Everything else is built around that circle.\n\nParameters\n* Profile: the cross-section the band is swept from. Pick one from the library, or open the editor to draw your own — the preview updates as soon as you close it.\n* Height: the height of the section, in millimetres.\n* Width: the width of the section, in millimetres.","metadata":{"title":"Band","section":"Finger Size","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#finger-size","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#finger-size","collection":"docs7","hash":"e870a8d2405361c454969347c2a339a3","indexed_by":"docs-index"}},{"content":"Band — Stone Settings\n\nEverything in this section is inert until the Gems toggle is on.\n\n* Gems: builds the stones on the band, or leaves it plain.\n\nThree icon buttons then choose how the stones are held: no prongs, shared prongs, or a channel. Choosing prongs or a channel reveals the seat parameters (Inner width, Inner height) and the Prongs section at the bottom of the panel.\n\n#### Distribution\n\n* Distribution: how far around the finger the stones run — Full all the way around, Half, One Quarter, or Custom.\n* Continous / Equidistant: only in Custom. Continous packs the stones one against the next; Equidistant spreads them evenly around the chosen span.\n* Number of gems: how many stones to set. Only in Custom.\n\n#### The stones\n\n* Gem shape: Round or Princess.\n* Gem size: the diameter of the stones.\n* Min. Distance: the minimum gap left between them.\n* Vertical: raises or sinks the stones relative to the band.\n* Inner width and Inner height: the width and depth of the seat cut for the stones. Shown with prongs or a channel.\n\n#### Drill\n\n* Drill type: None, Round, or Quad. Round reveals the drill width; Quad reveals both width and height.\n* Drill Width: the width of the drill under each stone.\n* Drill Height: its height. Quad only.","metadata":{"title":"Band","section":"Stone Settings","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#stone-settings","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#stone-settings","collection":"docs7","hash":"34de68f2de363e1ddc4c1175ace0844b","indexed_by":"docs-index"}},{"content":"Band — Prongs\n\nShown when the prong or channel setting is selected.\n\n* Gem Inside: how far into the stone the prong bites.\n* Height: how tall the prong stands.\n* Extension for manufacturing: extra length left on top of the prong, useful for the casting and setting stages.\n* Move in Z: raises or lowers the prong along the vertical axis.\n* Diameter: the diameter of the prong.","metadata":{"title":"Band","section":"Prongs","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#prongs","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#prongs","collection":"docs7","hash":"f0e528ee01730a00c93bacefad4dde7a","indexed_by":"docs-index"}},{"content":"Band — Working with the panel\n\n* Refresh in the header recomputes the preview; the band is built in the background while you keep adjusting.\n* Accept bakes the band, its stones and its prongs together as a group, and lists it in the Outliner. If the parameters cannot produce a valid solid, the panel tells you to check them and stays open.","metadata":{"title":"Band","section":"Working with the panel","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#working-with-the-panel","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-band/#working-with-the-panel","collection":"docs7","hash":"84e5fada92d0e55b222ab7be55c233bf","indexed_by":"docs-index"}},{"content":"Wedding ring — Wedding Ring\n\nThe Wedding Rings command is designed to create two wedding bands for the couple, offering customization options for each ring individually. This command consists of a Parameters Panel, divided into two tabs — Ring 1 and Ring 2 — one for each ring, plus a shared Finger Size section below them.\n\nRing 1\n* Metal & Size:\\ Choose the metal (gold in several karats and colors, platinum or silver) and the ring size for this band from their respective dropdowns.\n* Profile:\\ Pick the profile asset that will be used to create the ring, and adjust its width and height.\n* Stone Setting:\\ Turn gemstones on or off with the Gems toggle. When enabled, choose the setting type — None, Prongs or Channel — and the gemstone distribution:\n* Full\n* Half\n* One Quarter\n* Custom (If selected, you'll define whether the gems are spaced Continuously or Equidistantly along the covered arc.)\n* Gemstone Customization:\\ You can also set the gem shape (Round or Princess) and define additional parameters such as:\n* Gem Size\n* Min. Distance between the gems\n* Vertical, allowing you to control how the gemstones are positioned along the height of the ring.\n* When the Prongs setting is selected, a Prongs group adds Gem Inside, prong Height, Extension Manufacturing, Move Z and Diameter.","metadata":{"title":"Wedding ring","section":"Wedding Ring","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-ring/#wedding-ring","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-ring/#wedding-ring","collection":"docs7","hash":"ea7387dcf87d7aa46f3b43333be1050a","indexed_by":"docs-index"}},{"content":"Wedding ring — Ring 2\n\nThe same set of parameters as Ring 1 — metal, size, profile, and independent stone-setting options — applied to the second band, so each ring in the pair can be customized on its own.\n\nThis command provides an intuitive way to create personalized wedding rings, offering both precise customization for the profile and size, as well as flexible options for adding and arranging gemstones.","metadata":{"title":"Wedding ring","section":"Ring 2","url":"https://www.rhinoartisan.com/docs/7/shanks/wedding-ring/#ring-2","source":"https://www.rhinoartisan.com/docs/7/shanks/wedding-ring/#ring-2","collection":"docs7","hash":"70247771687c5984713fb775996872a7","indexed_by":"docs-index"}},{"content":"Accessories\n\nFour groups, left to right.\n\nLibrary\nComponents The component library you build pieces from.\n\nCurator Collects and organises what you reuse.\n\nParts\nBead A bead, sized and drilled.\n\nBail The loop a pendant hangs from.\n\nCharm A charm, ready to hang.\n\nBangle The rigid bracelet, at the size you set.\n\nNamed Pendant A pendant built from a name or word.","metadata":{"title":"Accessories","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/","collection":"docs7","hash":"73ed5441195410d5b782ba088aa20637","indexed_by":"docs-index"}},{"content":"Accessories — Profiles and links\n\nSmart Profiles The library of parametric section profiles.\n\nProfile Sweep A solid swept through your cross-section curves, editable afterwards.\n\nMilgrain The beaded edge detail.\n\nRope A twisted rope band.\n\nHinge A working hinge between two parts.\n\nLink A single chain link.\n\nChain A full chain from a link you choose.\n\nUser Element Makes RhinoArtisan treat your own geometry as an Element.","metadata":{"title":"Accessories","section":"Profiles and links","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/#profiles-and-links","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/#profiles-and-links","collection":"docs7","hash":"65b406c8004c09e75311db88ba531e46","indexed_by":"docs-index"}},{"content":"Accessories — Patterns\n\nPattern Repeats a motif across a surface.\n\nVoronoi The organic cell pattern.\n\nHoneycomb The hexagonal cell pattern.\n\nTexture 3D Turns an image into relief on the surface.","metadata":{"title":"Accessories","section":"Patterns","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/#patterns","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/#patterns","collection":"docs7","hash":"52ba44aa6596c77a9feb419e8535c0db","indexed_by":"docs-index"}},{"content":"Bail — Bail\n\nThis command creates bail pieces, which are ideal for pendants and necklace designs.\n\nAs with many other RhinoArtisan commands, the style library will be displayed when the command is executed. We can start with a predefined one. We can edit it by clicking on the pencil to edit all the parameters in detail.\n\nOn the parameters menu, you can define its shape and measurements for the top and lower sections, as well as enable or disable the O-ring that links to your main piece.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Bail","section":"Bail","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bail/#bail","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bail/#bail","collection":"docs7","hash":"5a036a09c2505e7ecc33de5350ec74ba","indexed_by":"docs-index"}},{"content":"Bangle — Bangle\n\nUsing this command, you can create a bangle element, ideal for cuffs, affirmation bracelets, and other jewellery pieces.\n\nAs with many other RhinoArtisan commands, the style library will be displayed when executed. We can start with a predefined one. We can edit it by clicking on the pencil to edit all the parameters in detail.\n\n.jpg)\n\nOn the parameters, you can choose to have your bangle open or closed and define its size. Also, below, you can find the shape, its measurements, and the option to have its back flat or curved for each of its 3 sections.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Bangle","section":"Bangle","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bangle/#bangle","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bangle/#bangle","collection":"docs7","hash":"23be159deaf94f3ef8f9181b68d3e16c","indexed_by":"docs-index"}},{"content":"Bead — Bead\n\nWith this command, you can create metal pieces that are ideal for wristbands and charm bracelets.\n\nWhen executing the command, as with many other RhinoArtisan commands, the style library will be displayed, where we can start from a predefined one. We can edit by clicking on the pencil, allowing us to edit all the parameters in detail.\n\nYou can choose a square, round or hexagon shape for its parameters and define its measurements with the fields below.\n\nThe Bead will be listed on the Outliner toolbar when you confirm your changes.","metadata":{"title":"Bead","section":"Bead","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bead/#bead","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/bead/#bead","collection":"docs7","hash":"84dc042af6458c8c3f3ff7b00fb2fc78","indexed_by":"docs-index"}},{"content":"Chain — Chain\n\nThe chain command allows us to select and copy a chain link using a curve, changing parameters such as rotations, copies, etc. This can be very useful for calculating the necessary links in a chain, even for chain rendering.\n\nThis command requires two elements: the link and the curve. For example, the link can be a single object or multiple objects, such as in cases where you want links with diamonds.&#x20;\n\nIn the parameters, we'll define the number of copies and whether we wish to rotate the links. Note that we can rotate the even and odd links together or independently to achieve the desired effect.\n\nThe following image shows the difference between the Include Ends option&#x73;. The first image shows the option enabled, while the second image shows it disabled.","metadata":{"title":"Chain","section":"Chain","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/chain/#chain","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/chain/#chain","collection":"docs7","hash":"cafb5c6e9827c1f368e1071ac0da4b70","indexed_by":"docs-index"}},{"content":"Charm — Charm\n\nThis command allows you to create metal pieces with a dome effect following any curve.\n\nAs with many other RhinoArtisan commands, the style library will be displayed when executed. We can start with a predefined one. We can edit it by clicking on the pencil to edit all the parameters in detail.\n\nThe parameters show the shape of this charm, its measurements, and the option to have its back flat or curved.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Charm","section":"Charm","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/charm/#charm","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/charm/#charm","collection":"docs7","hash":"0878f8703c9fa8aec4a2a3eeae56a58c","indexed_by":"docs-index"}},{"content":"Hinge — Hinge\n\nUsing this command, you can generate a hinge mechanism on almost any solid object to allow it to open and close. This is beneficial for making closed bracelets and other pieces that require this motion.\n\nOn its parameters, you can find the selection square that allows you to choose which object you want to make the hinge on, and then select the point where to generate the hinge. Below, you can find the various measurements, the number of male inserts, the opening angle, the direction it opens, and also an option to flip the direction it is facing currently.\n\nRhino does not allow boolean split operations on the same object.&#x20;\n\nRhino does not allow boolean split operations on the same object. For example, creating a hinge on a torus is not possible due to the limitations of the split command. Therefore, we recommend creating a geometry to split the object, make the hinge, and then rejoin it using a boolean union operation.","metadata":{"title":"Hinge","section":"Hinge","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/hinge/#hinge","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/hinge/#hinge","collection":"docs7","hash":"6b02761734a113bf12ca24c93d1840bd","indexed_by":"docs-index"}},{"content":"Honeycomb — Honeycomb - Azure\n\nWith this command, you can select a closed curve, and 2Shapes will fill it with a Honeycomb pattern. It's beneficial for filling up hollowed designs and creating gorgeous geometric patterns as Azures.\n\nAfter running this command, you can select the closed curve you want to use by clicking on the selection square. Below, you can find the parameters such as the honeycomb thickness, its height, and all its measurements.\n\nFlow by Surface is an excellent tool for applying these shapes to any 3D surface.","metadata":{"title":"Honeycomb","section":"Honeycomb - Azure","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/honeycomb/#honeycomb---azure","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/honeycomb/#honeycomb---azure","collection":"docs7","hash":"a2885b13a6492c9397d830fd07fe9c42","indexed_by":"docs-index"}},{"content":"Link — Link\n\nThe chain link command allows us to design a slab that precisely fits our taste and style. We define measures and rotations and analyse how they behave with the front and rear links. It also allows us to create a Cuban link in seconds, analyzing the weight in real-time for each modification.\n\nThe first four parameters refer to the dimensions of the link, such as height, width, etc. The last two parameters determine how the link interacts with adjacent links to enable boolean operations between them.","metadata":{"title":"Link","section":"Link","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/link/#link","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/link/#link","collection":"docs7","hash":"433048637a1ffa5f3886cba88c8cda4a","indexed_by":"docs-index"}},{"content":"Milgrain — Milgrain\n\nWith this command, you can generate milgrain running down a selected curve. This is especially useful for adding a vintage touch to any design.\n\nThe usage is simple: we'll start by selecting one or more curves.\n\nOn its parameters, you can change the diameter of each sphere, the overlapping distance in millimetres between spheres, and whether you want it to start and end within the curve's limits or at the very end.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Milgrain","section":"Milgrain","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/milgrain/#milgrain","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/milgrain/#milgrain","collection":"docs7","hash":"cb08ceeec4b6a5a3e1b3d04537da6577","indexed_by":"docs-index"}},{"content":"Named Pendant — Named Pendant&#x20;\n\nThe Named Pendant command in RhinoArtisan allows users to create personalized pendants featuring a custom name. Upon activating the command, a pendant with a default name appears in the viewport, which can be customized using the Pendant Panel.\n\n#### Features and Parameters of the Named Pendant Command:\n\nPendant Panel :\n\n1. Name: Define the name to display on the pendant.\n2. Font: Select the font type for the text.\n3. Font Style: Choose the style of the font, such as bold or italic.\n4. Letter Spacing Mode:\n* Automatic: Adjusts the spacing between letters automatically.\n* Manual: Enables control over letter spacing using the Spacing parameter.\n5. Pendant Style:\n* Only Letter: Creates the pendant using only the letters.\n* Letter with Plate (Rectangular): Adds a rectangular plate behind the letters.\n* Letter with Plate (Offset): Adds a plate with an offset boundary around the letters.\n6. Relief:\n* Emboss: Places the letters raised on top of a plate.\n* Engraving: Carves the letters into the plate by removing material.\n7. Height: Adjusts the size of the letters.\n8. Thickness: Sets the thickness of the letters.\n9. Connection: Manages the connections between accents and letters or the dot and stem of the letter \"i.\"\n10. Plate Offset: Controls the distance between the letters and the plate's edge.\n11. Plate Thickness: Adjusts the thickness of the plate.\n\nO-Rings Panel :\n\nThis panel allows customization of the rings used to attach a chain to the pendant:\n\n1. Number of O-Rings: Choose between none, one, or two rings.\n2. Positioning:\n* Automatic: Positions the rings based on the design.\n* Manual: Enables precise control over the rings' placement.\n\nThe Named Pendant command provides flexibility in design, enabling users to create unique pendants tailored to individual preferences.","metadata":{"title":"Named Pendant","section":"Named Pendant&#x20;","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/named-pendant/#named-pendantx20","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/named-pendant/#named-pendantx20","collection":"docs7","hash":"ea17e55507b3550e67fb47c53047bfb5","indexed_by":"docs-index"}},{"content":"Pattern — Pattern\n\nThis command allows you to select an object and replicate the number of rows and columns you want on a surface. It's ideal for quickly creating an extensive array of the same object, generating rich and beautiful patterns.\n\nThis command requires two elements: the object or group of objects and the surface on which to apply them.","metadata":{"title":"Pattern","section":"Pattern","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/pattern/#pattern","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/pattern/#pattern","collection":"docs7","hash":"765e7774ab17944bc7bf9d11183b4e86","indexed_by":"docs-index"}},{"content":"Pattern — Parameters\n\n* Object Selector: Clicking this left square allows you to select the object you want to use for the pattern.\n* Surface Selector: By clicking this right square, you can select a surface, to which the pattern will be oriented.\n* Column: The number of column reiterations that will be generated.\n* Rows: The number of rows your object will be repeated.\n* X Padding: The margin between columns in millimeters.\n* Y Padding: The margin between rows in millimeters.\n* X Rotation: It's the amount of horizontal rotation in degrees you want to apply to your pattern.\n* Y Rotation: It's the amount of vertical rotation in degrees you want your pattern to have.\n* Reverse Mode: Needs a selected surface. Has three options, None, to disable it, Reverse X, to invert the horizontal orientation on the selected surface, Reverse Y, to invert the vertical orientation, and Both, to invert the orientation in the X and Y axes.\n* Move on Z: The vertical distance above the surface where the pattern is being generated.\n* Enable Max Thickness: Activates the maximum thickness.\n* Max Thickness: Only applies if Enable Max Thickness is enabled. Sets the maximum extent in millimeters the pattern will not exceed.","metadata":{"title":"Pattern","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/pattern/#parameters","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/pattern/#parameters","collection":"docs7","hash":"8dc25bbb6a5eb03240e95859476e20d2","indexed_by":"docs-index"}},{"content":"Profile Sweep — Profile Sweep\n\nProfile Sweep builds a solid through the cross-sections you draw: pick two or more closed curves, and the command sweeps a body through them — ordered, capped, optionally mirrored, and re-editable afterwards. It is the free-form tube of the toolbox: a bail, a chunky link, an organic shank, any shape you can describe as \"these sections, in this order\".\n\n`ArtisanProfileSweep`","metadata":{"title":"Profile Sweep","section":"Profile Sweep","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#profile-sweep","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#profile-sweep","collection":"docs7","hash":"5f7f7399677ec69457a4bdc1d9529771","indexed_by":"docs-index"}},{"content":"Profile Sweep — Building the sweep\n\nSelect the closed curves in the panel; each one gets a numbered dot in the viewport showing the sweep order, and a gumball at its center to move it in place — the preview follows live. In the parameters table, every curve has its own Width and Height, so a section can be squashed or grown without redrawing it, and ▲/▼ buttons to reorder it.\n\nOutput mode chooses what gets built:\n\n* Brep — a closed NURBS solid, with a Cap section for each end: None, Flat, or Round (the default), with the dome height of each round cap under your control.\n* SubD — a SubD body instead, with Shape segments (density around each section) and Rail segments (rings along the sweep). SubD output has no caps.","metadata":{"title":"Profile Sweep","section":"Building the sweep","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#building-the-sweep","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#building-the-sweep","collection":"docs7","hash":"cf17c2cb23f587f724cc2b1c54b56893","indexed_by":"docs-index"}},{"content":"Profile Sweep — Advanced\n\n* Continuity — how the sweep's spine leaves the first section and arrives at the last: Position, Tangency (default), Curvature, G3, or G4, with a Flip per end to reverse the tangent for S-shaped transitions. With two sections and Position at both ends, the sweep runs dead straight.\n* Symmetry — None, Vertical, Horizontal, or Quad: the sweep is mirrored about the world planes and joined, so one quarter of the sections can describe the whole piece.","metadata":{"title":"Profile Sweep","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#advanced","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#advanced","collection":"docs7","hash":"dd51ac9cf455333d7573c5a6cc916e8c","indexed_by":"docs-index"}},{"content":"Profile Sweep — This element is editable\n\nWith Brep output, the sweep is baked as a parametric element: run\n`ArtisanEdit` on it and the panel reopens with your sections, sizes, and order exactly as you left them — move a curve, change a width, accept, and the solid rebuilds. SubD output is plain geometry and cannot be re-edited.\n\nGoldsmith's Tip: Draw the sections at the places where the shape actually changes — three or four well-placed curves beat ten evenly spaced ones, and every extra section is one more thing to edit later.","metadata":{"title":"Profile Sweep","section":"This element is editable","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#this-element-is-editable","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/profile-sweep/#this-element-is-editable","collection":"docs7","hash":"885d07bda1d7baac3eea48e022201a2e","indexed_by":"docs-index"}},{"content":"Rope — Rope\n\nWith this command, you can generate a rope running curves. It's advantageous to give a creative touch to any design you add this to or even achieve some sailor-themed style.\n\nWe'll start by selecting one or more curves.\n\nOn its parameters, you can change the diameter of each thread, the whole rope width, the amount of thread, and the number of turns from start to finish. Also, if you have selected a closed curve, you can enable Infinite to make the rope seamless.\n\nThis element is editable, meaning it can be modified anytime.","metadata":{"title":"Rope","section":"Rope","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/rope/#rope","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/rope/#rope","collection":"docs7","hash":"e10d5252cd818267e7b807150d5ec09e","indexed_by":"docs-index"}},{"content":"Texture 3D — Texture 3D\n\nUsing this command, you can select a surface and cover it with a fantastic Texture 3D, a three-dimensional interpretation of a 2D texture using it as a height map. It's especially useful for applying complex texturing to your designs.\n\nThis command requires two elements: an image and a surface.\n\nYou can choose which texture to use by clicking on the left selection square; this will open your available textures.&#x20;\n\nWith the right selection button, you can choose which object to apply the Texture 3D.&#x20;\n\nBelow are the measurements of the texture, from its stretching in U and V to its displacement, height, and rotation. You also have the option to align the texture in its four corners or mirror it on two axes.&#x20;\n\nThe Resolution slider is at the bottom, letting you adjust the quality of the resulting texture.\n\nAn important point is that the texture's appearance on the object is always shown, but the texture won't be fully calculated until we click the Preview button.\n\nOnce the preview is displayed, click the Confirm button.\n\nThis command is resource-intensive and requires heavy processing on your computer.&#x20;","metadata":{"title":"Texture 3D","section":"Texture 3D","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/texture-3d/#texture-3d","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/texture-3d/#texture-3d","collection":"docs7","hash":"5785592eb15394d0b01572252a12035b","indexed_by":"docs-index"}},{"content":"Texture 3D — How can I add my textures and images?\n\nAn exciting feature of this command is that it uses standard textures and images in JPG or PNG format, allowing us to add our own. You can add more textures by placing them on your User Folder > Textures3D.\n\nWhy is the texture larger than the surface?\nWe must distinguish between a surface and a trimmed surface to understand this concept. The command uses the entire surface, so if trimmed, it will display something similar to this example.\n\nWe will see the following if we use the Show Control Points command (F10).\n\nThis surface is a trimmed section of a torus. To address this, we have two options: the first is to create the texture with the surface and trim it, which may not be ideal; the second is to use the Surface > ShrinkTrimmedSurface command, which will recalculate a new surface adjusted to the trim.","metadata":{"title":"Texture 3D","section":"How can I add my textures and images?","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/texture-3d/#how-can-i-add-my-textures-and-images","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/texture-3d/#how-can-i-add-my-textures-and-images","collection":"docs7","hash":"8bd1d1d8ebeda7814b2c93a83c366c78","indexed_by":"docs-index"}},{"content":"User Element — User Element\n\nThe User Element command allows you to include any imported or manually created object in the Outliner, even if it was not generated using RhinoArtisan tools. This ensures that the object is recognized within the project structure and can be managed like any other element.\n\nAdvantages:\n\n* Allows better organization and management within the project workflow.\n* Ensures that all elements are included in breakdowns and reports.\n* Provides flexibility to work with a mix of RhinoArtisan and non-RhinoArtisan elements.","metadata":{"title":"User Element","section":"User Element","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/user-element/#user-element","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/user-element/#user-element","collection":"docs7","hash":"34deffba4fff9306f59b6486334abf64","indexed_by":"docs-index"}},{"content":"Voronoi — Voronoi\n\nWith this command, you can select a closed curve, and RhinoArtisan will fill it with a unique, randomly generated Voronoi pattern. This is particularly useful for filling hollow designs and creating beautiful, organic-like patterns.\n\nVoronoi is a mathematical and geometric concept used in various fields, from science to graphic design. In simple terms, a Voronoi diagram divides a space into regions based on the distance to a specific set of points.\n\nYou can choose the closed curve you want to use by clicking on the selection box. Below, you'll find parameters such as the thickness of the branching, its height, and measurements.\n\nYou can click the Refresh button anytime to generate a new random pattern. This is great because there won't be two identical patterns worldwide.","metadata":{"title":"Voronoi","section":"Voronoi","url":"https://www.rhinoartisan.com/docs/7/tabs/accessories/voronoi/#voronoi","source":"https://www.rhinoartisan.com/docs/7/tabs/accessories/voronoi/#voronoi","collection":"docs7","hash":"944dd30068fee88f20c9d019c8b0c893","indexed_by":"docs-index"}},{"content":"Analyze\n\nWhat a piece weighs, how thick its walls are and whether it is sound enough to cast — the questions you ask before sending anything out.\n\nFive groups, left to right.\n\nWeight\nWeight What the piece weighs in the metal you pick.\n\nWeight by Selection The same for what you select.\n\nWeight by Area Weight worked out from surface area and a thickness.","metadata":{"title":"Analyze","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/","collection":"docs7","hash":"ce39d418feff46a018d5859a7125ffdf","indexed_by":"docs-index"}},{"content":"Analyze — Direction\n\nShow Direction Displays which way normals point.\n\nFlip Direction Turns them the other way.\n\nMeasurement\nEvaluate Point The coordinates of a point you pick.\n\nLength The length of a curve.\n\nDistance Between two points.\n\nAngle Between two lines.\n\nDiameter Of a circle or arc.\n\nRadius Of a circle or arc.\n\nDeviation How far two curves drift apart.\n\nClosest Points Where two objects come nearest.","metadata":{"title":"Analyze","section":"Direction","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/#direction","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/#direction","collection":"docs7","hash":"ed974a68a6c7807b0b1e953ed398ba5e","indexed_by":"docs-index"}},{"content":"Analyze — Thickness\n\nThickness Wall thickness where you point.\n\nGlobal Thickness A thickness map of the whole piece, so thin walls surface on their own.\n\nChecks\nBalancer Checker Whether the piece sits balanced — a ring that will not tip on the finger.\n\nArea Centroid The centroid of the selected area.\n\nShow Edges Reveals naked and non-manifold edges.\n\nCheck Objects Rhino's validity report on the object.\n\nSel Bad Objects Selects everything that fails that check.\n\nWeight, Thickness, Global Thickness and the Balancer Checker are RhinoArtisan's own; the measurement set is Rhino's, gathered here.","metadata":{"title":"Analyze","section":"Thickness","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/#thickness","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/#thickness","collection":"docs7","hash":"ac297084a970820383ad3b17ecf38aca","indexed_by":"docs-index"}},{"content":"Balancer Checker — Balancer Checker\n\nThis command allows us to calculate the position of objects based on gravity, making it ideal for determining how a pendant will naturally fall. We will select two groups of objects: the base object (which will remain fixed and serve as a reference) and the objects to be oriented.","metadata":{"title":"Balancer Checker","section":"Balancer Checker","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/balancer-checker/#balancer-checker","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/balancer-checker/#balancer-checker","collection":"docs7","hash":"c578aad3764e63274d6fe06a7fed4ca1","indexed_by":"docs-index"}},{"content":"Check Objects — Check\n\nThe Check command reports errors in the selected object's data structure.\n\nSteps\n1. Select objects.\n2. A report on the correctness of the object will display.\\ This is primarily a tool for diagnosing potential geometry errors.\n3. Delete or remodel objects that have errors.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Check Objects","section":"Check","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/check-objects/#check","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/check-objects/#check","collection":"docs7","hash":"77fe7dc9e75cc12cb09cdab2a06be304","indexed_by":"docs-index"}},{"content":"Flip Direction — Flip Direction\n\nThe Flip command reverses the normal direction of an object.\n\nSupported input objects\n* Curve, surface, polysurface, mesh, SubD, Clipping Plane and rectangle light.\n\nSteps\n* Select objects.\n\n\\ The command line reports the number of objects flipped.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Flip Direction","section":"Flip Direction","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/direction/flip-direction/#flip-direction","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/direction/flip-direction/#flip-direction","collection":"docs7","hash":"eebe49ee951b6b68ef63dfc749420524","indexed_by":"docs-index"}},{"content":"Show Direction — Show Direction\n\nThe ShowDir command opens the Direction Analysis control and displays the direction of curves, surfaces, and polysurfaces.\n\nSteps\n* Select objects: Direction arrows will be displayed on the object.\n\n\\\n\nDirection Analysis options\n\nParameters\nShow\n\n* Direction: Displays the object's normal direction.\n* U (Surfaces only): Displays the u direction.\n* V (Surfaces only): Displays the v direction.\n\n\\\n\nFlip Direction: Reverses the direction.\n\nReverse U: Reverses the surface u direction.\n\nReverse V: Reverses the surface v direction.\n\nSwap UV: Switches the u and v directions.\n\nDirection color: Set the display color for the direction arrows.\\\n\nThe u and v direction colors are determined by the Options > Appearance > Colors settings for the X axis and Y axis lines.\n\nAdd Objects: Add objects to the Direction Analysis display.\n\nRemove Objects: Remove objects from the Direction Analysis display.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Show Direction","section":"Show Direction","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/direction/show-direction/#show-direction","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/direction/show-direction/#show-direction","collection":"docs7","hash":"f93af562bf260e8ab1386d9fe2300d86","indexed_by":"docs-index"}},{"content":"Global Thickness — Global Thickness\n\nThis command allows us to visually and globally analyze our jewellery, setting a minimum measurement. By default, the command uses 0.6 mm as a reference for resin printing and metal casting.","metadata":{"title":"Global Thickness","section":"Global Thickness","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/global-thickness/#global-thickness","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/global-thickness/#global-thickness","collection":"docs7","hash":"0147af78d526de459a65992d1927bcdc","indexed_by":"docs-index"}},{"content":"Angle — Angle\n\nThe Angle command reports the angle between two sets of locations in degrees.\n\nThe angle is that between picked points that represent the endpoints of two lines.\n\nSteps\n1. Pick the start of an imaginary angle line.\\ Snap to existing geometry to establish the lines.\n2. Pick the end of an imaginary angle line.\\\n\n3. Pick the start of a second imaginary angle line.\n4. Pick the end of a second imaginary angle line.\\ \\ The angle between the imaginary lines is reported on the command line.","metadata":{"title":"Angle","section":"Angle","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/angle/#angle","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/angle/#angle","collection":"docs7","hash":"32d6dc81e57e681bc080ebf997175134","indexed_by":"docs-index"}},{"content":"Angle — Command-line options\n\nTwoObjects: Measures the angle between two planar surfaces or two lines.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Angle","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/angle/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/angle/#command-line-options","collection":"docs7","hash":"5116bfec9b81c43746efea1667db26f3","indexed_by":"docs-index"}},{"content":"Closest Points — Closest Points\n\nThe ClosestPt command creates a point object at the closest point from a specified location to a selected object or on two objects where they are closest to each other.\n\nSteps\n1. Select the target object or objects.\n2. Pick the base point for the closest point calculation.\n\nNote\n\n* The closest point on all of the objects is calculated.\n* If more than one object is selected, the closest point will appear on only one object. To find the closest point on each object, use the ClosestPt command on each object individually.\n* The distance is printed on the command line.","metadata":{"title":"Closest Points","section":"Closest Points","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/closest-points/#closest-points","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/closest-points/#closest-points","collection":"docs7","hash":"1580a572f19d908f43da0bb08f01e747","indexed_by":"docs-index"}},{"content":"Closest Points — Command-line options\n\nObject:&#x20;\n\nCalculates the closest point between two objects.\n\nTo calculate the closest point to an object\n\n* Select a curve or point object.\\ To select parts of objects, use sub-object selection.\\ The closest point from that object to the originally selected object is calculated.\\ Point objects are created at the closest points.\\ This is especially useful for testing two curve objects.\n\n\\\n\nCreateLine: Draw a line between the base point and the closest point on the object.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Closest Points","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/closest-points/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/closest-points/#command-line-options","collection":"docs7","hash":"c7b19a680062ac66d60d3b025db8d36c","indexed_by":"docs-index"}},{"content":"Curve Deviation — Curve Deviation\n\nThe CrvDeviation command reports the maximum and minimum distances between two curves.\n\nSteps\n1. Select two curves.\n\nThe command may find one or more intervals of overlap between the two curves or report that they do not overlap.\n\nFor each overlap interval, three pairs of indicator marks with indicator lines between them will appear, joining the ends of the overlap interval to the points of greatest deviation within the interval.\n\nMinimum deviation = Green Marks\n\nMaximum deviation = Red Marks\n\n* For each overlap interval, the three deviation distances are reported at the command line, along with the world coordinates of the interval ends on each curve.\n* The minimum deviation will be 0 when the two curves intersect.\n* Use the Command History window or press the F2key to view the data in a separate window.\n\n2. Press Enter to turn off the deviation display.","metadata":{"title":"Curve Deviation","section":"Curve Deviation","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/curve-deviation/#curve-deviation","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/curve-deviation/#curve-deviation","collection":"docs7","hash":"2281615c4e9cb836baa79fe624b5d26d","indexed_by":"docs-index"}},{"content":"Curve Deviation — Command-line options\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Curve Deviation","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/curve-deviation/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/curve-deviation/#command-line-options","collection":"docs7","hash":"3fb1c10b26c3ba22045439ea1f36c47d","indexed_by":"docs-index"}},{"content":"Diameter — Diameter\n\nThe Diameter command reports the diameter of a curve at a specified point.\n\nSteps\n1. Move the mouse cursor along a curve.\n\nThe Units pane on the status bar reports the diameter of the curve at the current cursor location.\n2. Pick a point on the curve.\n\nThe diameter and radius are reported to the command line.\n\nIf the diameter and radius return \"infinite\", the curve is linear (no curvature) at the picked location, or has the shape of a line or a polyline.","metadata":{"title":"Diameter","section":"Diameter","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/diameter/#diameter","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/diameter/#diameter","collection":"docs7","hash":"4e66017dd8bc5632fdfb3ee20549bfbf","indexed_by":"docs-index"}},{"content":"Diameter — Command-line options\n\nSelectCurve: Limit the selection to a specified curve. Press Enter to select any curve.\n\nMarkDiameter: Places a point object at the evaluated point on a curve and creates a curvature circle through that point.\n\nUnits: Set the units for the length display. This option is only available if no objects are selected.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Diameter","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/diameter/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/diameter/#command-line-options","collection":"docs7","hash":"79315cb1eb75ba17f24278921d925472","indexed_by":"docs-index"}},{"content":"Distance — Distance\n\nThe Distance command reports the distance between two points.\n\nSteps\n1. Pick the first point.\n2. Pick the second point.\\ The distance between the points is displayed in the command history window, with angles and distances in the axis directions in world and construction plane coordinates.\n\nCommand-line options\nUnits: Set the units for the distance display.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Distance","section":"Distance","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/distance/#distance","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/distance/#distance","collection":"docs7","hash":"686da1b9f86e241f88ee25b9bcc09f82","indexed_by":"docs-index"}},{"content":"Evaluate Point — Evaluate Point\n\nThe EvaluatePt command reports and optionally labels the world and construction plane coordinates of a selected location in space.\n\nSteps\n* Pick a location in a viewport. The command history window displays the location's Cartesian coordinates in x,y, and z format, both in the world and in the construction plane.","metadata":{"title":"Evaluate Point","section":"Evaluate Point","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/evaluate-point/#evaluate-point","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/evaluate-point/#evaluate-point","collection":"docs7","hash":"b141ec036e68a6cd3ace63fec562de1f","indexed_by":"docs-index"}},{"content":"Evaluate Point — Command-line options\n\nLabel: Specifies whether a leader or dot label will be added to the model.\n\n* Labels are created with the unit settings of the current annotation style, not the model unit settings.\n\nStyle\n\n* Dot: Labels the coordinates with an annotation dot.\n* Leader: Labels the coordinates with a text leader.\n\nCoordinateSystem: Specifies to use World or CPlane coordinates in labels.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Evaluate Point","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/evaluate-point/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/evaluate-point/#command-line-options","collection":"docs7","hash":"38bf30812c058429b1d7bb93473f4814","indexed_by":"docs-index"}},{"content":"Length — Length\n\nThe Length command reports the length of curves or edges.\n\nSupported input:&#x20;\n* Curves\n* Mesh/SubD edges\n\nWhen multiple objects are selected, the accumulated length is displayed in the command history.\n\nCumulative length is calculated from all curves in a group unless using Ctrl+Shift+click to select group members separately.\n\nGroup members that are hidden or on hidden layers will not be calculated.","metadata":{"title":"Length","section":"Length","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/length/#length","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/length/#length","collection":"docs7","hash":"ed1fea8db18d260728ed3af874cfabc9","indexed_by":"docs-index"}},{"content":"Length — Command-line options\n\nUnits: Set the units for the length display.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Length","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/length/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/length/#command-line-options","collection":"docs7","hash":"295c4dcb280f64c759a49d3029190e5d","indexed_by":"docs-index"}},{"content":"Radius — Radius\n\nThe Radius command reports the radius of a curve at a specified point.\n\nSteps\n1. Move the mouse cursor along a curve.\n\nThe Units pane on the status bar reports the radius of the curve at the current cursor location.\n2. Pick a point on the curve.\n\nThe diameter and radius report to the command-line.\n\nIf the diameter and radius return \"infinite\", the curve is linear (no curvature) at the picked location, or has the shape of a line or a polyline.","metadata":{"title":"Radius","section":"Radius","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/radius/#radius","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/radius/#radius","collection":"docs7","hash":"e97e5619e7860f627be6e97f124245a5","indexed_by":"docs-index"}},{"content":"Radius — Command-line options\n\nSelectCurve: Limit the selection to a specified curve. Press Enter to select any curve.\n\nMarkDiameter: Places a point object at the evaluated point on a curve and creates a curvature circle through that point.\n\nUnits: Set the units for the length display. This option is only available if no objects are selected.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Radius","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/radius/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/measurement/radius/#command-line-options","collection":"docs7","hash":"c160f6703ed921146d9278ea01ea6079","indexed_by":"docs-index"}},{"content":"Sel Bad Objects — Sel Bad Objects\n\nThe SelBadObjects command selects all objects that do not pass Check.\n\nWhen do we encounter \"Bad Objects\" in Rhino and why?\n\"Bad Objects\" in Rhino are elements within a 3D model that have irregularities or inconsistencies that can affect their visualization, editing, or export. These irregularities can arise for various reasons, from modelling errors to issues with imported files.","metadata":{"title":"Sel Bad Objects","section":"Sel Bad Objects","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#sel-bad-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#sel-bad-objects","collection":"docs7","hash":"fb76048130e69236e66dd60a884300cc","indexed_by":"docs-index"}},{"content":"Sel Bad Objects — Common Causes of \"Bad Objects\":\n\n#### Modelling Errors:\n\n* Self-intersecting curves: When a curve crosses itself, creating undefined geometry.\n* Invalid surfaces: Surfaces with holes, open edges, or incorrect orientations.\n* Non-planar curves on surfaces: When a curve is not entirely on the plane of a surface.\n* Mismatched nodes: Junction points between curves or surfaces that do not share the same location.\n\n#### Problems When Importing Files:\n\n* Incompatible file formats: When importing files from other programs, conversion issues may arise, leading to damaged objects.\n* File corruption: Damaged or incomplete files may contain erroneous objects.\n* Failed Boolean operations: When performing Boolean operations (union, subtraction, intersection) between objects, errors may occur if the objects are not properly aligned or have complex intersections.\n* Accidental modifications: Errors that damage the object's geometry can occur while editing a model.\n\n#### Consequences of \"Bad Objects\":\n\n* Incorrect visualization: Damaged objects may appear distorted or have holes on the screen.\n* Editing problems: Editing tools may not work properly on damaged objects.\n* Corrupt files: \"Bad Objects\" can cause a file to become corrupt and impossible to open in the future.\n* Unexpected results in renders or simulations: Damaged objects may produce erroneous results in subsequent processes.\n\n#### Preventing \"Bad Objects\":\n\n* Careful modeling: Pay attention to accuracy and consistency in geometry during modeling.\n* Regular checks: Perform periodic checks of the model to detect and correct any issues early.\n* Proper use of tools: Use Rhino tools correctly and avoid operations that might damage the geometry.\n* Save backups: Regularly create backup copies of the model to be able to restore a previous version in case of problems.","metadata":{"title":"Sel Bad Objects","section":"Common Causes of \"Bad Objects\":","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#common-causes-of-bad-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#common-causes-of-bad-objects","collection":"docs7","hash":"c96b4b6c52f531df19503fd820210867","indexed_by":"docs-index"}},{"content":"Sel Bad Objects — Common Causes of \"Bad Objects\":\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sel Bad Objects","section":"Common Causes of \"Bad Objects\":","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#common-causes-of-bad-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/sel-bad-objects/#common-causes-of-bad-objects","collection":"docs7","hash":"26222288aed6fd074fbf484eaaec2084","indexed_by":"docs-index"}},{"content":"Show Edges — Show Edges\n\nThe ShowEdges command highlights naked, non-manifold or all edges of the selected surface, mesh and SubD objects.\n\nSteps\n1. Select objects.\\ The edges highlight and the ends of edges are marked with point display markers in the color you selected.\n\nShow:\n* All edges: Display the edges of objects, including:\n* All edges of surfaces, polysurfaces, and Extrusions.\n* Naked, creased, and soft crease edges of SubDs.\n* Naked and unwelded edges of meshes\n\n* Naked edges: Displays open edges in surfaces, polysurfaces, meshes, and SubDs. A surface, polysurface, mesh, SubD edge that is not connected to another edge. Solid objects have no naked edges.\n\n* Non-manifold edges: Displays the edges of polysurfaces or meshes shared by more than two faces.","metadata":{"title":"Show Edges","section":"Show Edges","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#show-edges","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#show-edges","collection":"docs7","hash":"b049923211a66e2ba9234f2ee3f365ec","indexed_by":"docs-index"}},{"content":"Show Edges — Zoom:&#x20;\n\nZoom to include the selected edges.\n\n* Zoom options\n* All: Zooms to include all naked edges.\n* Current: Zooms to the first edge in the selection. This useful if you zoom out with the mouse and want to zoom back in.\n* Next: Zooms to the next edge in the selection. If the selected objects have only one naked edge, this option is not displayed\n* Previous: Zooms to the previous edge in the selection. If the selected objects have only one naked edge, this option is not displayed.\n* Mark: Marks ends of the edge with point objects. If the All option was previously selected, all naked edges are marked.","metadata":{"title":"Show Edges","section":"Zoom:&#x20;","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#zoomx20","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#zoomx20","collection":"docs7","hash":"97880852df920bab0b654edcf3ac07a6","indexed_by":"docs-index"}},{"content":"Show Edges — Edge color:&#x20;\n\nSets the display color for the edges.\n\n* Add Objects: Adds objects to the edge display.\n* Remove Objects: Removes objects from the edge display.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Show Edges","section":"Edge color:&#x20;","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#edge-colorx20","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/show-edges/#edge-colorx20","collection":"docs7","hash":"a5d5915d72c9317def35aa927364f6ca","indexed_by":"docs-index"}},{"content":"Thickness — Thickness\n\nWith this command, you can see the thickness of an object at a point you choose. It's a great tool to check if a creative design is printable on your 3D printer. Just pick a point on the point to analyse.\n\nFrom a manufacturing standpoint, the thickness of a piece of jewelry is a critical factor that directly influences the production process and the quality of the final product.","metadata":{"title":"Thickness","section":"Thickness","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#thickness","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#thickness","collection":"docs7","hash":"74b3fb6c2468aec314e1c1ce08da6899","indexed_by":"docs-index"}},{"content":"Thickness — Implications of thickness in jewelry manufacturing:\n\n* Casting:\n* Minimum thickness: A minimum thickness is necessary for the wax models to remain stable during investment and to prevent deformation during the casting process.\n* Uniform thickness: A uniform thickness facilitates metal solidification and reduces the risk of porosity or bubbles in the cast piece.\n* Thickness in critical areas: In areas with fine details or with settings, additional thickness is required to prevent breakage or deformation during finishing and polishing.\n* Finishing:\n* Polishing: Sufficient thickness allows for a bright and durable polish.\n* Plating: Thickness influences the adhesion of gold, rhodium, or other precious metal platings.\n* Engraving: Adequate thickness allows for deeper and more detailed engravings.\n* Setting:\n* Securing stones: Sufficient thickness ensures the security of precious and semi-precious stones, preventing them from falling out.\n* Setting type: The thickness of prongs or pavé depends on the size and shape of the stone.\n* Soldering:\n* Strength of joints: Adequate thickness in soldering areas ensures the strength of the piece.\n* Quality control:\n* Measurements: Thickness is verified at various points of the piece to ensure it meets design specifications.\n* Defect detection: Insufficient thickness can reveal defects such as porosity or cracks.","metadata":{"title":"Thickness","section":"Implications of thickness in jewelry manufacturing:","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#implications-of-thickness-in-jewelry-manufacturing","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#implications-of-thickness-in-jewelry-manufacturing","collection":"docs7","hash":"1615e7f4a57dd686bfa416d4a83941ca","indexed_by":"docs-index"}},{"content":"Thickness — Benefits of calculating thickness at specific points with RhinoArtisan:\n\n* Material optimization: It allows you to identify areas where thickness can be reduced without compromising strength or aesthetics, resulting in material savings and lower costs.\n* Error reduction: By having a precise measurement of thickness, manufacturing errors are minimized, reducing the number of defective pieces and rework costs.\n* Greater control over the process: It allows manufacturers to have greater control over the entire production process, from design to final finish.\n* Improved product quality: By ensuring uniform and adequate thickness in all areas of the piece, a higher quality and more durable final product is obtained.","metadata":{"title":"Thickness","section":"Benefits of calculating thickness at specific points with RhinoArtisan:","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#benefits-of-calculating-thickness-at-specific-points-with-rhinoartisan","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/thickness/#benefits-of-calculating-thickness-at-specific-points-with-rhinoartisan","collection":"docs7","hash":"4eb9ef753d3d4ad5b32186614ea7fa2d","indexed_by":"docs-index"}},{"content":"Weight by Area — Weight by Area\n\nThis tool is ingeniously designed to calculate the weight of plating based on an object's surface area. It proves immensely useful for designers and manufacturers seeking accuracy in metal coating processes, allowing for a more precise estimation of the metal weight used in electroplating.","metadata":{"title":"Weight by Area","section":"Weight by Area","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight-by-area/#weight-by-area","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight-by-area/#weight-by-area","collection":"docs7","hash":"ac4c02b7d02e876a66c16bd2f23c3067","indexed_by":"docs-index"}},{"content":"Weight by Selection — Weight by Selection\n\nBy using this command, you can easily calculate the weight of any selected object or group of objects. A pop-up will display the results.\n\nThe default metal value is shown in the Outliner. You can change it, and it will affect the weight, rendering, etc.","metadata":{"title":"Weight by Selection","section":"Weight by Selection","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight-by-selection/#weight-by-selection","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight-by-selection/#weight-by-selection","collection":"docs7","hash":"64a0f1fbdf6015b2a09869ab5e5c7b8c","indexed_by":"docs-index"}},{"content":"Weight — Weight\n\nThis command will calculate the weight of our design, considering the weight of the metals and gems. In this case, we only have one type of metal and diamonds, but it will show the complete list in cases where we have several.\n\nThis command analyzes the entire document. To get information about the weight of a specific object or objects, you can use the \"Weight by Selection\" command.\n\nThe default metal value is shown in the Outliner. You can change it, and it will affect the weight, rendering, etc.","metadata":{"title":"Weight","section":"Weight","url":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight/#weight","source":"https://www.rhinoartisan.com/docs/7/tabs/analyze/weight/weight/#weight","collection":"docs7","hash":"581aeba4a59150d4ae5306bc0c46e687","indexed_by":"docs-index"}},{"content":"Curve\n\nSix groups, left to right. Buttons with a submenu list it underneath.\n\nDraw\nPoint A point object at a picked location.\n\nMultiple\n\nExtract\n\nClosest Point\n\nClosest Point Between Two Objects\n\nMark Curve Start\n\nMark Curve End\n\nDivide By Length\n\nDivide By Segments\n\nLine A straight line segment between two points.\n\nPolyline\n\nFrom Midpoint\n\nNormal To Surface\n\nBisector\n\nVertical To CPlane\n\nAngled\n\nPerpendicular From Curve\n\nPerpendicular To 2 Curves\n\nTangent From Curve\n\nTangent To 2 Curves\n\nTangent, Perpendicular\n\nCurve A freeform curve through picked points.\n\nControl Points\n\nControl Points From Polyline\n\nHandle Curve\n\nSketch\n\nSketch On Surface\n\nSketch On Mesh\n\nInterpolate On Surface\n\nConic\n\nConic: Tangent At Start\n\nParabola From 3 Points\n\nParabola By Focus\n\nHyperbola\n\nCatenary\n\nSpiral\n\nHelix\n\nWaves\n\nCross\n\nInfinite Curve\n\nArc A circular arc from a centre, start and end.\n\nStart, End, Point On Arc\n\nStart, End, Direction At Start\n\nStart, End, Radius\n\nTangent To Curves\n\nCircle A circle from a centre and radius.\n\nDiameter\n\nBy 3 Points\n\nAround Curve\n\nTangent, Tangent, Radius\n\nTangent 3 Curves\n\nVertical CPlane: Center\n\nVertical CPlane: Diameter\n\nDeformable\n\nFit Points\n\nRectangle A rectangle from two opposite corners.\n\nCenter, Corner\n\n3 Points\n\nRounded Rectangle\n\nVertical\n\nEllipse An ellipse from a centre and two axes.\n\nDiameter\n\nFrom Foci\n\nAround Curve\n\nBy Corners\n\nDeformable\n\nPolygon A regular polygon; also draws squares and stars.\n\nCircumscribed Polygon\n\nPolygon: By Edge\n\nSquare\n\nCircumscribed Square\n\nSquare: Edge\n\nStar\n\nAdvanced Curve\n\nFrom 2 Views Builds a 3D curve from two planar views of it.\n\nCross Section\n\nBlend A free-form transition between the ends of two curves.\n\nCPlane Moves the construction plane.","metadata":{"title":"Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/","collection":"docs7","hash":"d92361552bcb33be5dfb4cec4b602b88","indexed_by":"docs-index"}},{"content":"Curve — Sketch and reference\n\nAssets Your library of reusable profile curves.\n\nText Draws flat text as curves.\n\nRaster to Vector Traces an image into editable curves.\n\nAdd Sketches\n\nText on Curve Flows text along a curve you pick.\n\nAdd Picture Frame Places a reference image on a plane.\n\nTrim and join\nTrim Removes the part of a curve on one side of a cutting object.\n\nJoin Joins two or more curves end to end into one.\n\nJoin Copy\n\nAuto Join\n\nSplit Splits a curve at picked points or intersections.\n\nExplode Breaks a polycurve into its individual segments.","metadata":{"title":"Curve","section":"Sketch and reference","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/#sketch-and-reference","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/#sketch-and-reference","collection":"docs7","hash":"300a86bf64b486f2a85c8aeb3a713f90","indexed_by":"docs-index"}},{"content":"Curve — Edit\n\nFillet Rounds the corner between two curves.\n\nFillet Corners Rounds every corner of a polycurve at once.\n\nSymmetry Mirrors one half of a curve onto the other about an axis.\n\nContinue Extends a curve from an endpoint, matching tangency.\n\nChamfer Bevels the corner between two curves.\n\nConnect Extends or trims two curves so they meet.\n\nMatch Matches position, tangency or curvature at a shared curve end.\n\nOffset Copies a curve at a set distance from the original.\n\nOffset On Surface\n\nNormal To Surface\n\nMultiple\n\nExtend Lengthens a curve past its endpoint.\n\nTo Boundary\n\nExtend On Surface\n\nTween Interpolates one or more curves between two existing curves.","metadata":{"title":"Curve","section":"Edit","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/#edit","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/#edit","collection":"docs7","hash":"cc8b2d2e30aa71ec81906d069438a3c2","indexed_by":"docs-index"}},{"content":"Curve — From objects\n\nProject Projects a curve onto a surface or mesh along the view direction.\n\nFit Curve to Surface Reshapes a curve to sit on a surface.\n\nDup. Edge Duplicates the edge of a surface or polysurface as a curve.\n\nExtract Isocurve Extracts an isocurve from a surface.\n\nDuplicate Face Border Duplicates the outer edge of a surface face.\n\nContour Creates curves at a set of evenly spaced cutting planes.\n\nPull Pulls a curve onto the closest points of a surface.\n\nExtract Wireframe Duplicates a surface's isocurves as curves.\n\nDuplicate Border Duplicates the outer boundary of a set of surfaces.\n\nMove Isocurve Reshapes a surface by dragging one of its isocurves.\n\nSilhouette Draws the silhouette of an object as seen from the current view.\n\nBoolean Combines curve regions with union, difference or intersection.\n\nSection Draws the curve where an object crosses a cutting plane.\n\nMove Intersection Moves a curve to lie on its intersection with another object.","metadata":{"title":"Curve","section":"From objects","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/#from-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/#from-objects","collection":"docs7","hash":"cce74edbdde726d1714a85e50490763e","indexed_by":"docs-index"}},{"content":"Curve — Advanced\n\nMake2D Flattens the visible geometry of the model into 2D curves.\n\nAdjust Seam Moves the seam of a closed curve.\n\nCreate UV Draws the UV parameter curves of a surface.\n\nRebuild Rebuilds a curve with a given point count and degree.\n\nRefit to Tolerance Refits a curve within a specified tolerance.\n\nApply UV Reshapes a curve using another surface's UV space.","metadata":{"title":"Curve","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/#advanced","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/#advanced","collection":"docs7","hash":"a7f618c191dc2cb1e1876f3fe2aa2b1d","indexed_by":"docs-index"}},{"content":"Add Sketches — &#x20; Add Sketches\n\nThe Add Sketches command simplifies the insertion and alignment of reference images in the viewport to aid in precise modeling with RhinoArtisan.\n\nWorkflow:\n\n1. Reference Cube Appears: When the command is activated, a cube appears in the viewport.\n2. Image Input: In the command panel, the user can select three reference images for the Top, Front, and Side views.\n3. Automatic Alignment: The images are automatically placed on the corresponding faces of the cube, aligned in 3D space.\n4. Confirmation and Display: Once the command is confirmed, the cube becomes transparent, leaving only the images visible for reference.\n\nAdvantages:\n\nProvides an intuitive system for organizing sketches in 3D space.\\ Ensures precise and automatic alignment of reference images.\\ The transparent cube avoids visual obstructions.","metadata":{"title":"Add Sketches","section":"&#x20; Add Sketches","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/add-sketches/#x20-add-sketches","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/add-sketches/#x20-add-sketches","collection":"docs7","hash":"20e1dd807570230025fd6e827b0c4c6f","indexed_by":"docs-index"}},{"content":"Advanced Curve — Advanced Curve\n\nWith this command you can create a complex curve through some steps:\n\n1\\) Once you run the command, it will ask you to pick a point where the curve will start.\n\n2\\) Click on any other place to create a new point for your curve.\n\n3\\) When you press the Escape or Enter key, or if you right-click on the viewport, the command will end and stop adding more points to your curve.\n\n.png)\n\nWhen running the command, you can see three options in the command prompt:\n\n* Close: If it's set to On, it will generate a closed curve with ends meeting the starting point.\n* Symmetry: Disabled by default, it can be set to X if you want horizontal symmetry, to Y to make it vertically symmetric, or Quad, if you wish to make the curve symmetric on all axis.\n* Offset: Clicking on this option allows you to type the thickness of this curve in millimeters.\n* Undo: If clicked, it will undo the previous change you made.","metadata":{"title":"Advanced Curve","section":"Advanced Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/advanced-curve/#advanced-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/advanced-curve/#advanced-curve","collection":"docs7","hash":"4dbeedd7d7deb4c20643a25cf849daec","indexed_by":"docs-index"}},{"content":"Assets — Assets\n\nThe _assets_ refer to curves that we will use in our designs, and the Assets Manager is where we create, modify, manage, and draw these curves. These curves will later be used in the design process. Additionally, the Assets Manager includes an editor that allows us to adjust and modify the curves as needed for the project.\n\nYou will find here all the curves used by all the RhinoArtisan commands organized by Asset type.\n\n.png)","metadata":{"title":"Assets","section":"Assets","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#assets","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#assets","collection":"docs7","hash":"7801d9bb5ecc4219f822a48af8ff14d2","indexed_by":"docs-index"}},{"content":"Assets — Asset types (from left to right):\n\n* Ring curves: These are used to give revolving shape to Classic, Cathedral, and Advanced shanks. Additionally, those curves are used for the Profiles and Bails commands.\n* External ring curves: Can be used on Classic shanks to affect the outer shape of your design, replacing the default fully circular form.\n* Signet ring curves: These shapes allow you to change the seal shape on your signet ring.\n* Channel curves: These are used primarily to define the revolving shape of your Halo gemset channel.\n* Prong curves: With this profile, you can change the prong shape on Basket and Halo gem sets.\n* Charm curves: Using this curve, you can create a 3D object with a bombé finish, ideal for creating charms and pendants.\n* Bezel curves: These curves are used exclusively to give a revolving shape to Bezel gemsets.\n* Peg head curves: These curves are used exclusively to shape the prongs of the Peg head gem set.\n\nYou will find two different buttons at the lower-right corner of this menu: one with a + symbol to create a new asset in the category you are in and another with a checkmark to accept your changes.","metadata":{"title":"Assets","section":"Asset types (from left to right):","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#asset-types-from-left-to-right","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#asset-types-from-left-to-right","collection":"docs7","hash":"7160ac954856c5bd970381c47b35539d","indexed_by":"docs-index"}},{"content":"Assets — Right-click:\n\nIf you right-click on a selected asset, a menu will pop up, giving you access to different options :\n\n* Add to document: It will add the selection curve to the viewport on the CPlane.\n* Edit: Opens the selection on the Asset Editor and allows you to manipulate it.\n* Rename: This button opens a window that displays the asset's current name and allows you to change it by typing in the new name.\n* Duplicate: Makes a copy of the selected Asset.\n* Delete: Deletes the selected Asset.&#x20;","metadata":{"title":"Assets","section":"Right-click:","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#right-click","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/assets/#right-click","collection":"docs7","hash":"2aa6557995463f631eceaced11adbcb8","indexed_by":"docs-index"}},{"content":"Auto Join — Auto Join\n\nAutojoin automatically unites all the curves in your file that meet at a common end, making single curves.","metadata":{"title":"Auto Join","section":"Auto Join","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/auto-join/#auto-join","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/auto-join/#auto-join","collection":"docs7","hash":"9ebe61bb1a1118510f0335ce23e6f167","indexed_by":"docs-index"}},{"content":"Arc — Arc\n\nDraw an arc with options for center, start, angle, and direction.\n\nStart, End, Point On Arc\nArc by start, end, point on arc.\n\nStart, End, Direction At Start\nArc by start, end, direction at start.\n\nStart, End, Radius\nArc by start, end, radius.\n\nTangent To Curves\nArc tangent to curves.","metadata":{"title":"Arc","section":"Arc","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/arc/#arc","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/arc/#arc","collection":"docs7","hash":"e2d1664aeab94823ff214c1ff41026a0","indexed_by":"docs-index"}},{"content":"Circle — Circle\n\nThe Circle command draws a circle from a center location and a radius.\n\nDiameter\nDraws the circle from the two ends of its diameter.\n\nBy 3 Points\nDraws a circle through three points on the circumference.\n\nAround Curve\nDraws a circle perpendicular to a curve.\n\nTangent, Tangent, Radius\nDraws a circle tangent to two curves and a given radius.","metadata":{"title":"Circle","section":"Circle","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#circle","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#circle","collection":"docs7","hash":"fc933e1f5fcf89b4c572f5cf731d8916","indexed_by":"docs-index"}},{"content":"Circle — Tangent 3 Curves\n\nDraws a circle tangent to three curves.\n\nVertical CPlane: Center\nDraws a circle perpendicular to the construction plane at a given center.\n\nVertical CPlane: Diameter\nDraws a circle perpendicular to the construction plane with a given diameter.\n\nDeformable\nDraws a NURBS approximation of the curve will be created with the degree and number of points you specify.","metadata":{"title":"Circle","section":"Tangent 3 Curves","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#tangent-3-curves","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#tangent-3-curves","collection":"docs7","hash":"7fb371e1cc8af932e42d4135f60c9551","indexed_by":"docs-index"}},{"content":"Circle — Fit Points\n\nDraws a circle by fitting to selected point objects, curve and surface control points, and mesh vertices.","metadata":{"title":"Circle","section":"Fit Points","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#fit-points","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/circle/#fit-points","collection":"docs7","hash":"00d9935d35fbfe6e9835f2efd4e80ec2","indexed_by":"docs-index"}},{"content":"Ellipse — Ellipse\n\nDraw a closed elliptical curve from center and edges.\n\nDiameter\nDraws a closed elliptical curve by diameter.\n\nFrom Foci\nDraw a closed elliptical curve from focus points.\n\nAround Curve\nDraw a closed elliptical curve around a curve.\n\nBy Corners\nDraw a closed elliptical curve from bounding rectangle.\n\nDeformable\nDraw a closed elliptical NURBS approximation of the curve will be created with the number of points you specify.","metadata":{"title":"Ellipse","section":"Ellipse","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/ellipse/#ellipse","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/ellipse/#ellipse","collection":"docs7","hash":"73a5e8d49fb5bc9809736e0b497b37a0","indexed_by":"docs-index"}},{"content":"Line — Line\n\nThe Line command draws one line segment.\n\nPolyline\nThe Polyline command draws a series of joined line or arc segments.\n\nFrom Midpoint\nDraw one line segment from its midpoint.\n\nNormal To Surface\nDraw a line segment normal to a surface.\n\nBisector\nDraw one line segment at a bisecting angle.\n\nVertical To CPlane\nDraw a line segment perpendicular to the construction plane.","metadata":{"title":"Line","section":"Line","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#line","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#line","collection":"docs7","hash":"c284603d882ce7575e6cf6d7467ab4b6","indexed_by":"docs-index"}},{"content":"Line — Angled\n\nDraw one angled line segment.\n\nPerpendicular From Curve\nDraw a line segment perpendicular from a curve.\n\nPerpendicular To 2 Curves\nDraw one line segment perpendicular to two curves.\n\nTangent From Curve\nDraw a line segment tangent from a curve.\n\nTangent To 2 Curves\nDraw one line segment tangent to two curves.","metadata":{"title":"Line","section":"Angled","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#angled","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#angled","collection":"docs7","hash":"afd29eeb53ee15e06e98a8c32e1a7103","indexed_by":"docs-index"}},{"content":"Line — Tangent, Perpendicular\n\nDraw one line segment tangent and perpendicular to curves.","metadata":{"title":"Line","section":"Tangent, Perpendicular","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#tangent-perpendicular","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/line/#tangent-perpendicular","collection":"docs7","hash":"5b5a43ccce11a0ca707e94096a3dd402","indexed_by":"docs-index"}},{"content":"Point — Point\n\nThe Point command draws a single point object at a specified location.\n\nMultiple\nThe Points command draws multiple point objects.\n\nExtract\nThe ExtractPt command places point objects at curve control points or edit point locations, surface and text control point locations, polygon mesh vertices, and so on.","metadata":{"title":"Point","section":"Point","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#point","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#point","collection":"docs7","hash":"23f007bd4e6d1e8a8903c72658aee3a7","indexed_by":"docs-index"}},{"content":"Point — Closest Point\n\nThe ClosestPt command creates a point object at the closest point from a specified location to a selected object or on two objects where they are closest to each other.\n\nClosest Point Between Two Objects\nThis tool analyzes and identifies the closest point between two selected objects based on a specified point between them","metadata":{"title":"Point","section":"Closest Point","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#closest-point","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#closest-point","collection":"docs7","hash":"9d7262463d02b2186668dc5d4410251b","indexed_by":"docs-index"}},{"content":"Point — Mark Curve Start\n\nThe CrvStart command places a point object at the start of a curve.\n\nMark Curve End\nThe CrvEnd command places a point object at the end of a curve.\n\nDivide By Length\nThe Divide command creates point objects along a curve or splits a curve by equal length.\n\nDivide By Segments\nThe Divide command creates point objects along a curve or splits a curve by number of segments.","metadata":{"title":"Point","section":"Mark Curve Start","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#mark-curve-start","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/point/#mark-curve-start","collection":"docs7","hash":"4f9d40fdd5584ffa40ec3e3e667e2d11","indexed_by":"docs-index"}},{"content":"Polygons — Polygon\n\nThe Polygon command draws a closed polyline with a specified number of sides\n\nCircumscribes Polygon\nDraws the polygon where the midpoints of the sides touch an imaginary circle of a specified radius.\n\nPolygon: By Edge\nDraws a polygon by defining one edge.\n\nSquare\nThe Square command draws a closed square polyline.","metadata":{"title":"Polygons","section":"Polygon","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/polygons/#polygon","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/polygons/#polygon","collection":"docs7","hash":"3c85ebd744c6b2ba46e81d50e4508b53","indexed_by":"docs-index"}},{"content":"Polygons — Circumscribed Square\n\nDraws the square polyline where the midpoints of the sides touch an imaginary circle of a specified radius.\n\nSquare: Edge\nDraws a square polyline by defining one edge.\n\nStar\nDraws a star-shaped polygon.","metadata":{"title":"Polygons","section":"Circumscribed Square","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/polygons/#circumscribed-square","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/polygons/#circumscribed-square","collection":"docs7","hash":"2863a2eeb6b77f18c66fe64391e7289c","indexed_by":"docs-index"}},{"content":"Rectangle — Rectangle\n\nDraws the rectangle using two opposite corners.\n\nCenter, Corner\nDraws the rectangle from the center point and a corner.\n\n3 Points\nDraws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nRounded Rectangle\nRounds the corners of the rectangle with arcs or conic sections.","metadata":{"title":"Rectangle","section":"Rectangle","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/rectangle/#rectangle","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/rectangle/#rectangle","collection":"docs7","hash":"971b9662639ef60342c32a7fe285458e","indexed_by":"docs-index"}},{"content":"Rectangle — Vertical\n\nDraws the rectangle perpendicular to the construction plane.","metadata":{"title":"Rectangle","section":"Vertical","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/rectangle/#vertical","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/basic-geometry/rectangle/#vertical","collection":"docs7","hash":"3443b31579268feeec686a3b69b8b33d","indexed_by":"docs-index"}},{"content":"Connect — Connect\n\nConnect runs Rhino's *Connect* command: it extends or trims two curves so they meet exactly. Pick the two curves — on the portions you want to keep — and each one is extended to the intersection, or trimmed back to it, so the pair ends in a clean corner.\n\nIt is the fastest way to close the gap between two construction curves — two shoulder lines that should meet at the shank, a gallery rail meeting a bezel profile — without measuring anything: the intersection does the work.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Connect","section":"Connect","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/connect/#connect","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/connect/#connect","collection":"docs7","hash":"88811e0f2af97d422bb2e140fb33885a","indexed_by":"docs-index"}},{"content":"CPlane — CPlane\n\nThe CPlane command in Rhino sets the construction plane (CPlane) origin and orientation in the active viewport, providing a \"tabletop\" for drawing. Users can adjust the CPlane's position and rotation using several options such as aligning it with curves, surfaces, objects, and views. Key options include Curve, Object, Surface, Elevation, Rotate, and 3Point. For jewelry design, this tool is helpful for setting precise working planes on curves or surfaces for modeling and engraving.","metadata":{"title":"CPlane","section":"CPlane","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/cplane/#cplane","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/cplane/#cplane","collection":"docs7","hash":"1349c1fc1dd83d59a0347666f061bef4","indexed_by":"docs-index"}},{"content":"Cross Section — Cross Section\n\nThe CSec command in Rhino allows goldsmiths to create precise cross-sections of jewelry models, which is crucial for detailing designs like intricate ring shanks or settings. By intersecting a profile with a defined plane, it generates curves that guide the shaping of the piece. This command can be particularly helpful for visualizing the profile of bands or other components, ensuring the correct fit and flow of the design, which is essential for accurate casting or fabrication.","metadata":{"title":"Cross Section","section":"Cross Section","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/cross-section/#cross-section","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/cross-section/#cross-section","collection":"docs7","hash":"09030cc617407545012340dfa8b3a6d3","indexed_by":"docs-index"}},{"content":"Cross — Cross\n\nYou can quickly create a cross-shape polyline with just a few clicks.\n\nOnce you click the Cross icon, the Cross Builder will open in the commands panel.\n\nHere you can edit the total Width and Height of the cross parameters, as well as the thickness of the sections and the location of the horizontal part with the Displacement parameter.\n\nAdditionally you can add a round fillet at the corners in Round or Chamfer mode and control its radius or length\n\nGoldsmith Hint : To create a gem-studded cross, start by designing a cross and offsetting its curve. Use the 'Stones by Curve' command to place stones along this curve. Then, offset the curve again and extrude it along with the original cross in the -Z direction. This process will result in a solid cross encircled by stones in just a few steps.","metadata":{"title":"Cross","section":"Cross","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/cross/#cross","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/cross/#cross","collection":"docs7","hash":"eb1aaf57b665a019875096ed88421114","indexed_by":"docs-index"}},{"content":"Curve — Curve\n\nDraw a curve from control point locations.\n\nControl Points\nFit a curve through picked locations.\n\nControl Points From Polyline\nBuilds a curve using the control points of a polyline\n\nHandle Curve\nDraw chained Bézier curves with editing handles.\n\nSketch\nDrag the mouse to draw a curve.\n\nSketch On Surface\nDrag the mouse to draw a curve on a selected surface.","metadata":{"title":"Curve","section":"Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#curve","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#curve","collection":"docs7","hash":"4cc1b65520a19a31a0f84926dcd5a33d","indexed_by":"docs-index"}},{"content":"Curve — Sketch On Mesh\n\nDrag the mouse to draw a curve on a selected mesh.\n\nConic\nThe Conic command draws a conic section curve based on a start, end, and apex point.\n\nConic: Tangent At Start\nLets you select a curve for the conic curve to be tangent to for the start or end of the conic.\n\nParabola From 3 Points\nDraw a parabolic curve through three picked points.","metadata":{"title":"Curve","section":"Sketch On Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#sketch-on-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#sketch-on-mesh","collection":"docs7","hash":"97d256c8efd9404e7e8ababde830d150","indexed_by":"docs-index"}},{"content":"Curve — Parabola By Focus\n\nDraw a parabolic curve from focus and vertex or endpoint.\n\nHyperbola\nThe Hyperbola command draws a hyperbolic curve.\n\nCatenary\nCreates a curve that a hanging chain or cable assumes under its own weight when supported only at its ends.","metadata":{"title":"Curve","section":"Parabola By Focus","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#parabola-by-focus","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/curve/#parabola-by-focus","collection":"docs7","hash":"e88763d5f5b7a06a308e3971576a8ee5","indexed_by":"docs-index"}},{"content":"From 2 Views — From 2 Views\n\nThe Crv2View command projects a curve into a selected view, aligning it to the current viewport. You can control the curve's position, scale, and orientation by specifying the desired view and adjusting the projection settings. This command is particularly useful for creating designs that require precise alignment or visual transformations, often in jewelry design when projecting patterns or details onto surfaces.","metadata":{"title":"From 2 Views","section":"From 2 Views","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/from-2-views/#from-2-views","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/from-2-views/#from-2-views","collection":"docs7","hash":"d9d50eb7590244379ca7c9b1f8315135","indexed_by":"docs-index"}},{"content":"Helix — Helix\n\nThe Helix command in Rhino creates helical curves with several customization options. Key command-line features include:\n\n* Vertical: Creates a helix with an axis perpendicular to the construction plane.\n* AroundCurve: Draws a helix around a selected curve.\n* Diameter/Radius: Toggle between radius and diameter input.\n* Turns: Defines the number of turns; pitch adjusts automatically.\n* Pitch: Defines the distance between turns; number of turns adjusts automatically.\n* ReverseTwist: Reverses the direction of the helix twist.\n\nThese options are useful for designing components such as coiled jewelry, springs, or threaded elements.","metadata":{"title":"Helix","section":"Helix","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/helix/#helix","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/helix/#helix","collection":"docs7","hash":"49c4212c4f7e59f8fee509aa983a1838","indexed_by":"docs-index"}},{"content":"Infinite Curve — Infinite Curve\n\nInfinite Curve draws a construction line long enough to behave as infinite — a reference axis for layout, mirroring, and alignment, sized automatically to dwarf everything in the scene. Rhino has no true infinite line, so the command builds one ten times the diagonal of the model's bounding box, centered on the point you pick.\n\n`ArtisanInfiniteCurve`\n\nPick the base point and the line appears; all control lives in the command-line options:\n\n* Mode — how the direction is set:\n* TwoPoints (default) — pick a second point.\n* Horizontal / Vertical — along the reference plane's X or Y axis.\n* Angle — pick a point to set the angle, or press Enter to use the Angle value in degrees.\n* AxisX / AxisY / AxisZ — along the world axes.\n* Bisector — pick two points and the line bisects the angle between them, the classic way to find the axis between two shoulders.\n* Type — Line (centered on the base point, running both ways) or Ray (starting at the base point, running one way).\n* Length — override the automatic length with an exact value.\n* Reference — whether Horizontal/Vertical and Angle follow the current CPlane (default) or the World XY plane.\n* Continuous — on by default: the command keeps placing lines until you press Enter, so laying down a whole set of guides is one command, not five.\n\nThe result is an ordinary Rhino line — trim it, use it as a mirror axis, or delete it when the construction is done.","metadata":{"title":"Infinite Curve","section":"Infinite Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/infinite/#infinite-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/infinite/#infinite-curve","collection":"docs7","hash":"6f281953ea85756357d56cbda5701503","indexed_by":"docs-index"}},{"content":"Interpolate on Surface — Interpolate on Surface&#x20;\n\nThe InterpCrvOnSrf command in Rhino is useful for creating curves through points on a surface, ideal for custom patterns or details. When combined with the Gems on Curve command in RhinoArtisan, this allows jewelers to precisely place gemstones along the curves on surfaces, ensuring perfect alignment for settings. The ability to draw and control curves in this manner is crucial for creating intricate jewelry designs such as rings and pendants.","metadata":{"title":"Interpolate on Surface","section":"Interpolate on Surface&#x20;","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/interpolate-on-surface/#interpolate-on-surfacex20","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/interpolate-on-surface/#interpolate-on-surfacex20","collection":"docs7","hash":"14f6ecafdb94b3ed33f25c1b1db42316","indexed_by":"docs-index"}},{"content":"Extract Isocurve — Extract Isocurve\n\nExtract Isocurve runs Rhino's *ExtractIsocurve* command: it duplicates one of a surface's isoparametric curves as a real curve. Select the surface, and as you move the cursor over it the isocurve under the pointer previews live; click to extract it. The Direction option chooses the U direction, the V direction, or both at once.\n\nOn jewelry surfaces this is how you harvest construction curves from geometry that already exists — the centerline of a shank to array stones along, or a flow line of the surface to guide a pipe or a sweep.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extract Isocurve","section":"Extract Isocurve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/isocurve/#extract-isocurve","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/isocurve/#extract-isocurve","collection":"docs7","hash":"56eed7301a47e3363ac093b532042fee","indexed_by":"docs-index"}},{"content":"Raster to Vector — Raster to Vector\n\nThis command converts an image into a group of curves. It's handy for translating images into 3D models.\n\nThe command's parameters will be displayed on the Commands toolbar.\n\nSelect an image in any format, and a preview will be displayed. Using the available parameters, you can define how you want the curves to adapt to the image and whether you want to smooth sharp edges.","metadata":{"title":"Raster to Vector","section":"Raster to Vector","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/raster-to-vector/#raster-to-vector","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/raster-to-vector/#raster-to-vector","collection":"docs7","hash":"d016be6f19f81e7c8b023fa41917742a","indexed_by":"docs-index"}},{"content":"Spiral — Spiral\n\nThe Spiral command in Rhino generates customizable spirals with various options for control. Users can define the Turns (number of revolutions), Pitch (distance between turns), Start/End Radius (size at the ends), and choose between Flat (2D) or Vertical (3D) configurations. The Around Curve option aligns the spiral to a selected curve for unique shapes. Jewelers can use this command to create intricate designs like twisted bands or filigree with precision and adaptability.","metadata":{"title":"Spiral","section":"Spiral","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/spiral/#spiral","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/spiral/#spiral","collection":"docs7","hash":"951b0c530ec5e277970d5e0b50e61cc8","indexed_by":"docs-index"}},{"content":"Text On Curve — Text On Curve\n\nYou can write text on a curve with different options.\n\nIn the command panel of the Text On Curve tool, you can choose the font and its style, the position of the text, and the alignment.\n\nThe parameters of Height and Spacing control the size and space between the letters.\n\nIf we set the thickness at a 0.00 value, we will get the letters' curves, but if we increase this value, we will get the extruded letters instead.&#x20;\n\nAdditionally, we can move the letters on the Z axis.\n\nGoldsmith Tip: Using this method, you can easily create a nameplate pendant or an engraved metal plaque. Start by drawing the outline of the plaque and adding a curve to define the path where the letters will follow. Use the \"Text on Curve\" command to place the letters along this path, then give them thickness to create a solid shape. Move the letters downward in the -Z direction to intersect with the plaque. Next, a Boolean Difference operation is performed between the plaque and the letters to engrave the text.\n\nFor a professional finish, 3D print the design and cast it in metal. After casting, polish the plaque's surface to a high shine; the contrast between the polished plaque and the textured background of the letters will create an appealing visual effect.","metadata":{"title":"Text On Curve","section":"Text On Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/text-on-curve/#text-on-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/text-on-curve/#text-on-curve","collection":"docs7","hash":"fb7c796a2753171c760adcf13ad14ba3","indexed_by":"docs-index"}},{"content":"Waves — Waves\n\nYou can use this command to create a wavy curve following another curve as a reference.\n\nOnce you run Waves, you will see two options on the command prompt:\n\n* Height: If clicked, it will allow you to type in the maximum displacement from the centre of the selected curve in millimetres.\n* Waves: This option allows you to type in the number of waves you want to fit in the selected curve.\n\nPressing the Enter key will create the Waves curve. If you press the Escape key or right-click on your viewport, the command will stop and cancel your changes.","metadata":{"title":"Waves","section":"Waves","url":"https://www.rhinoartisan.com/docs/7/tabs/curve/waves/#waves","source":"https://www.rhinoartisan.com/docs/7/tabs/curve/waves/#waves","collection":"docs7","hash":"2c8515894655360708ff602c2bb7ad82","indexed_by":"docs-index"}},{"content":"File\n\nThe File tab is the one you always come back to. Half of it is what you would expect — new, open, save, copy, paste, undo — and the other half is a shortcut board: the panels, the studios and the settings, gathered so you do not have to remember which tab a thing lives in.\n\nTen groups, left to right. Several buttons open tools documented in another section; those cards link straight there.","metadata":{"title":"File","url":"https://www.rhinoartisan.com/docs/7/tabs/file/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/","collection":"docs7","hash":"966b73c962831c8bced423a0284a779a","indexed_by":"docs-index"}},{"content":"File — Files\n\nNew A new file from a template. Small Objects — Millimeters is the one for jewellery: it sets the viewport to a millimetre scale.\n\nOpen Open a file — with importing, inserting and the worksession manager in its submenu.\n\nImport\n\nInsert\n\nImport Elements By File\n\nWorksession Manager\n\nRevert\n\nOpen File Location\n\nSave Save the file, with the save-as variants in its submenu.\n\nSave As\n\nIncremental Save\n\nSave Small\n\nExport Selected\n\nSave as Template\n\nRecent The files you had open last.\n\nStdize Puts a model imported from another CAD — Matrix, MatrixGold, RhinoGold — onto RhinoArtisan's layer structure, so the rest of the tools recognise it.\n\nCreate Layer's Structure — the layer tree on its own\n\nOrganize Objects by Layer — the objects onto it\n\nFile Search Find a design by name across the folders you indexed.\n\nUpdate index","metadata":{"title":"File","section":"Files","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#files","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#files","collection":"docs7","hash":"52a3eb7ae356187957646b157deb655b","indexed_by":"docs-index"}},{"content":"File — Clipboard and editing\n\nCopy Duplicates the selected objects.\n\nCut Deletes the objects and places them in the clipboard.\n\nPaste Inserts what is in the clipboard.\n\nUndo Reverses recent changes.\n\nUndo selected\n\nUndo multiple\n\nRedo Steps forward again through what Undo reversed.\n\nExplode Breaks an object into its parts: a polysurface into surfaces, a polycurve into segments, a block into its contents.\n\nJoin Joins objects that touch into one: curves into a polycurve, surfaces into a polysurface.\n\nTrim Cuts and deletes the part of an object beyond where it crosses another.\n\nSplit Divides an object where it crosses another, keeping every part.\n\nJoin Copy Joins a copy of the selection, leaving the originals untouched.","metadata":{"title":"File","section":"Clipboard and editing","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#clipboard-and-editing","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#clipboard-and-editing","collection":"docs7","hash":"bf01e77052adc8c3647dbec5478b4670","indexed_by":"docs-index"}},{"content":"File — Output\n\nCapture Viewport Saves the viewport as an image, with control over which viewport elements are included.\n\nPrint Prints an image of the viewport contents.\n\nPrint 3D Converts the file to STL and opens it in the slicer set under Options.\n\nUser Folder Opens your assets, presets and libraries in Explorer.","metadata":{"title":"File","section":"Output","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#output","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#output","collection":"docs7","hash":"e74ab01f72f285f56443f3a20d81cb49","indexed_by":"docs-index"}},{"content":"File — Retail and pricing\n\nBoutique Your collections.\n\nDownload Collections\n\nImport Collection\n\nCreate a Collection\n\nDelete all Collections\n\nMarkup What turns a cost into a price.\n\nComponents The component library.\n\nTaxes The tax rules applied to that price.\n\nOrganic\nSculpt Brush a mesh or SubD by hand.\n\nRelief Carve a relief from an image.","metadata":{"title":"File","section":"Retail and pricing","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#retail-and-pricing","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#retail-and-pricing","collection":"docs7","hash":"454b4508a5c9ee512b8a63da8c133f3a","indexed_by":"docs-index"}},{"content":"File — Rendering\n\nRealtime Render The view that keeps refining while you work.\n\nRender and Animation The render panel and turntables.\n\nReports\nBreakdown Details What the piece is made of, and what it costs.\n\nReport The sheet you hand over.\n\nTechnical Chart The dimensioned drawing.\n\nTime Tracker Hours per file.\n\nAI\nThe keys, models and costs these tools share are in AI in RhinoArtisan.\n\nGenerative AI Generative AI Studio: images, video and 3D from your viewport, a photo or a prompt.\n\nFlow Studio AI Turns what you describe into a script that runs in Rhino.\n\nFlow Panel\n\nAssistant The chat that knows jewellery and your design.","metadata":{"title":"File","section":"Rendering","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#rendering","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#rendering","collection":"docs7","hash":"d9404d723b1f2d024c05e427c0bef09d","indexed_by":"docs-index"}},{"content":"File — Panels\n\nPanels One submenu with every RhinoArtisan panel.\n\nNotes\n\nOutliner\n\nLayers\n\nQuick Gems\n\nCurator\n\nRecent Commands\n\nProduct Details\n\nNivoda\n\nPanel Log\n\nGH Opens Grasshopper.\n\nSetup and support\nSettings Opens Rhino Options on the Artisan branch.\n\nUpdate Checks for a new version and installs it if there is one.\n\nWindow Layout Puts every panel back where it shipped.\n\nAbout Version and build.\n\nLearn The tutorials and courses.\n\nShow / hide Quick Bar The strip of favourites under the ribbon.\n\nLicense Your licence and Cloud Zoo.\n\nSupport How to reach us.","metadata":{"title":"File","section":"Panels","url":"https://www.rhinoartisan.com/docs/7/tabs/file/#panels","source":"https://www.rhinoartisan.com/docs/7/tabs/file/#panels","collection":"docs7","hash":"588e1db74d76455175ca532e47ea33e9","indexed_by":"docs-index"}},{"content":"Create Layer's Structure\n\nCreates the layer tree RhinoArtisan expects, without touching the geometry.\n\nIt is the first half of Standardize, split out for when a file needs the structure but you want to place the objects yourself — a model imported from Matrix, MatrixGold or RhinoGold whose parts you would rather sort by hand than have moved automatically.\n\nRun it, then use Organize Objects by Layers to fill it, or drag the objects across yourself.\n\nIf you want both steps at once, run Standardize instead — it creates the structure and files the objects in a single pass.","metadata":{"title":"Create Layer's Structure","url":"https://www.rhinoartisan.com/docs/7/tabs/file/create-layers-structure/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/create-layers-structure/","collection":"docs7","hash":"4dfb9606a1237283dbe0e49cf2e23a97","indexed_by":"docs-index"}},{"content":"Elements management\n\nAn Element is a parametric piece RhinoArtisan rebuilds rather than just draws: you set its dimensions and it regenerates. This page is about moving those between machines — one person builds the house shanks and bezels, the studio imports them once.\n\nImport Elements By File Adds somebody else's Elements to your collections, from their elements.json.\n\nExport Elements Writes your Elements out so someone else can import them.","metadata":{"title":"Elements management","url":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/","collection":"docs7","hash":"d7477aaf5c981f9b0ceb03ef0e769cc8","indexed_by":"docs-index"}},{"content":"Elements management — What ships as an Element\n\nRhinoArtisan comes with a library of them: the whole Shanks category, the building components under Diamonds — Baskets, Bezels, Peg Heads, Clusters, Halos — and Beads, Bails, Charms, Bangles and Profiles under Accessories.\n\nUse them as they are, change one and save it back, or build your own from scratch and add it to the collection.","metadata":{"title":"Elements management","section":"What ships as an Element","url":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/#what-ships-as-an-element","source":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/#what-ships-as-an-element","collection":"docs7","hash":"2d2d73a4e3fa847fa917126660f17bf9","indexed_by":"docs-index"}},{"content":"Elements management — Where the library lives\n\nEvery Element parameter is stored in a single file, `elements.json`, in your User Folder. That is the file that travels: it is the whole library, not one piece of it.\n\nImporting somebody else's\nSend `elements.json` across and the other person brings it in with Import Elements By File, in the Open flyout of the File tab.\n\nOnly the Elements they do not already have are added. Their own are left untouched, so importing a colleague's library over yours cannot cost you anything.\n\nImport Elements By File is in the ribbon; Export Elements (`ArtisanExportElementsByType`) has no button on the File tab and is run from the command line or from the Elements manager.","metadata":{"title":"Elements management","section":"Where the library lives","url":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/#where-the-library-lives","source":"https://www.rhinoartisan.com/docs/7/tabs/file/elements-management/#where-the-library-lives","collection":"docs7","hash":"884c2d2ce788443392b1f2c4b78d45ba","indexed_by":"docs-index"}},{"content":"Export\n\nEverything here writes the file, or part of it, back out to disk. All of it sits in the Save flyout of the File tab.\n\nSave Saves the current model.\n\nSave As Saves under a different name, closes the current file and leaves you in the new one.\n\nIncremental Save Writes a new numbered version and leaves the file you are in untouched.\n\nSave Small Saves the geometry without its render meshes.\n\nExport Selected Writes only what you have selected to a new file, in Rhino format or any other Rhino supports.\n\nSave as Template Saves the geometry and every setting you have made, so the next piece starts from it.","metadata":{"title":"Export","url":"https://www.rhinoartisan.com/docs/7/tabs/file/export/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/export/","collection":"docs7","hash":"8b91a6bf5b82db3885e6e71c7533de90","indexed_by":"docs-index"}},{"content":"Export — Which one to use\n\nFour of these look alike and are not. The difference is what ends up in the file and what happens to the one you are in.\n\n| | Writes | You end up in |\n| --- | --- | --- |\n| Save | everything | the same file |\n| Save As | everything, new name | the new file |\n| Incremental Save | everything, next number | the file you were in |\n| Save Small | geometry, no render meshes | the same file |\n| Export Selected | only the selection | the file you were in |\n\nIncremental Save is the one worth the habit: it costs a click and leaves a numbered trail through a design, which is the cheapest insurance there is against a client asking for the version from two days ago.\n\nSave Small is the one to send. A jewellery file's render meshes are usually larger than the geometry itself, and whoever opens it rebuilds them anyway — so the mail gets through and nothing is lost.","metadata":{"title":"Export","section":"Which one to use","url":"https://www.rhinoartisan.com/docs/7/tabs/file/export/#which-one-to-use","source":"https://www.rhinoartisan.com/docs/7/tabs/file/export/#which-one-to-use","collection":"docs7","hash":"191d008b40d85231a8ebf5eaa968d880","indexed_by":"docs-index"}},{"content":"Export — Sending a design on\n\nExport Selected is how a single piece leaves a busy file: select the ring, write it out, and the plate of forty others stays behind. It writes any format Rhino supports, so it is also the route to STL for a bureau that wants one piece rather than a whole build plate.\n\nFor a full plate going to a printer, use 3D Print in Manufacturing instead — it converts and hands the file to your slicer.\n\nFor sending your Elements rather than your geometry — the shanks, bezels and profiles you built — see Elements management.","metadata":{"title":"Export","section":"Sending a design on","url":"https://www.rhinoartisan.com/docs/7/tabs/file/export/#sending-a-design-on","source":"https://www.rhinoartisan.com/docs/7/tabs/file/export/#sending-a-design-on","collection":"docs7","hash":"62729fc8b410887686cb37ab317d4c52","indexed_by":"docs-index"}},{"content":"Import\n\nEverything here is a way of getting something into the file you are working in. All of it sits in the Open flyout of the File tab.\n\nOpen Opens a Rhino file, or any other format Rhino reads.\n\nImport Merges every object from another file into this one, exactly as they are there. Nothing stays linked afterwards.\n\nInsert Brings a file in as a block, a group or plain objects. Unlike Import, you pick the insertion point and can scale and rotate on the way in.\n\nImport Elements By File Adds someone else's Elements to your collections, from their elements.json.\n\nRevert Discards every change since the last save and reloads the file from disk.\n\nOpen File Location Opens Windows Explorer on the folder the current file is saved in.\n\nWorksession Manager Keeps several models open at once: one active and editable, the rest attached for reference.\n\nA model imported from another jewellery CAD — Matrix, MatrixGold, RhinoGold — should go through Standardize next, or the rest of RhinoArtisan will not recognise what is in it.\n\nWorksession is Rhino's own; see the Rhino documentation for the full command.","metadata":{"title":"Import","url":"https://www.rhinoartisan.com/docs/7/tabs/file/import/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/import/","collection":"docs7","hash":"ea35742b2e2fde9d7a5a9fd5291dab63","indexed_by":"docs-index"}},{"content":"Organize Objects by Layers\n\nMoves the objects already in the file onto the layers they belong to.\n\nIt is the second half of Standardize, split out for a file that already has the right layer structure — one you built with Create Layer's Structure, or a model from Matrix, MatrixGold or RhinoGold whose tree survived the import but whose objects landed in the wrong places.\n\nRun this after importing and the rest of RhinoArtisan starts recognising the model: the gem tools find its stones, the reports find its metals, and Manufacturing can check it.","metadata":{"title":"Organize Objects by Layers","url":"https://www.rhinoartisan.com/docs/7/tabs/file/organize-objects-by-layers/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/organize-objects-by-layers/","collection":"docs7","hash":"db21c54c72811e24b96024f9c5d3fa12","indexed_by":"docs-index"}},{"content":"Panels\n\nThe Panels button in the File tab opens any RhinoArtisan panel without hunting for it. Each entry shows the panel if it is closed, or brings it forward if it is docked behind another one.\n\nNotes Text stored in the document properties and saved with the model — for the note that has to travel with the file.\n\nOutliner The structure of the piece. Worth keeping pinned to the right sidebar.\n\nLayers The layer tree. Worth keeping docked to the left sidebar.\n\nQuick Gems Stones a click away while you set.\n\nCurator Collects and organises what you reuse.\n\nRecent Commands What you have just run, ready to run again.\n\nProduct Details The data of the collection product you are working on.\n\nNivoda Live diamond stock inside Rhino. Needs its credentials under Options.\n\nPanel Log What RhinoArtisan did and what went wrong — the first place to look when a command misbehaves.\n\nNivoda needs its credentials in Options › Integrations before the panel shows anything.\n\nRender and Animation is not in this submenu: it has its own button, one group to the left. See Render and Animation.","metadata":{"title":"Panels","url":"https://www.rhinoartisan.com/docs/7/tabs/file/panels/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/panels/","collection":"docs7","hash":"02676a6896d4605c4380c167e48dcf77","indexed_by":"docs-index"}},{"content":"Recent\n\nRecent opens the Recent Files window.\n\nEach entry carries a rendered thumbnail of the piece, its file name and the date it was last saved, numbered in order. Click one and it opens; if the file you are in has unsaved changes, you are asked whether to save them first.\n\nThe thumbnail is the point. A folder of files called `RA-4897` and `RA-5596` tells you nothing, and jewellery files are rarely named after what they look like — here you find the ring by looking at it.\n\nThis is RhinoArtisan's own list, not Rhino's. It tracks what you opened through RhinoArtisan, which is what you want when several versions of a design live in different folders.","metadata":{"title":"Recent","url":"https://www.rhinoartisan.com/docs/7/tabs/file/recent/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/recent/","collection":"docs7","hash":"a348c26fe79008330360596f1f0ac07b","indexed_by":"docs-index"}},{"content":"Standardize\n\nStdize is the command you run first on a model that did not start in RhinoArtisan.\n\nA file coming from Matrix, MatrixGold or RhinoGold carries that program's own layer tree, names and conventions. The geometry arrives fine, but RhinoArtisan cannot tell a gem from a prong from a shank, because none of it is labelled the way it expects. Standardize rebuilds that: it puts the file on the standard layer structure and files the objects where they belong.\n\nOnce a model is standardized, the rest of RhinoArtisan works on it as if it had been modelled here — the gem tools count its stones, the reports list its metals, and Manufacturing can check and sprue it.","metadata":{"title":"Standardize","url":"https://www.rhinoartisan.com/docs/7/tabs/file/standardize/","source":"https://www.rhinoartisan.com/docs/7/tabs/file/standardize/","collection":"docs7","hash":"e15280532ad6ea3a35e8f236da99285f","indexed_by":"docs-index"}},{"content":"Standardize — The two steps, on their own\n\nStandardize does both in one pass. They are also in its submenu separately, for when a file only needs one of them:\n\n* Create Layer's Structure — builds the standard layer tree, without moving anything onto it.\n* Organize Objects by Layers — moves the objects onto the layers they belong to.\n\nWorth running on any imported file, not only one from another CAD: a model that arrives as a single layer of loose surfaces standardizes just as well.","metadata":{"title":"Standardize","section":"The two steps, on their own","url":"https://www.rhinoartisan.com/docs/7/tabs/file/standardize/#the-two-steps-on-their-own","source":"https://www.rhinoartisan.com/docs/7/tabs/file/standardize/#the-two-steps-on-their-own","collection":"docs7","hash":"6da9b16f3f382bb9a54155394e623866","indexed_by":"docs-index"}},{"content":"Mesh\n\nNine groups, left to right. Buttons with a submenu list it underneath.\n\nCheck and repair\nCheck Reports what is wrong with a mesh before you fix it.\n\nRepair The guided repair wizard, step by step.\n\nRepair tools\nAlign Vertices Pulls near-coincident vertices onto each other.\n\nWeld Merges vertices within an angle tolerance.\n\nWeld Edge\n\nWeld Vertices\n\nMatch Mesh Edges Aligns the edges of two meshes so they meet.\n\nRebuild Mesh Normals Recomputes the face and vertex normals.\n\nRebuild Mesh Rebuilds the mesh, discarding bad data.\n\nFill Mesh Holes Closes the holes left in a mesh.","metadata":{"title":"Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/","collection":"docs7","hash":"53ab44b054d57488dbe29ee4a8c4d592","indexed_by":"docs-index"}},{"content":"Mesh — Faces and normals\n\nDelete Faces Removes the faces you pick.\n\nPatch Single Faces Fills a one-face gap.\n\nCull Degenerate Mesh Faces Deletes faces with zero area.\n\nSwap Mesh Edge Flips the shared edge of two triangles.\n\nUnify Mesh Normals Makes every normal point the same way.\n\nApply Mesh Applies the edited mesh back to its object.\n\nSplit Mesh Edge Splits an edge, adding a vertex.","metadata":{"title":"Mesh","section":"Faces and normals","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#faces-and-normals","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#faces-and-normals","collection":"docs7","hash":"7ff13e48ea8815a4186319c0b8c67605","indexed_by":"docs-index"}},{"content":"Mesh — Create\n\nSplit Disjoint Mesh Separates a mesh into its unconnected shells.\n\nMesh Meshes a surface or polysurface.\n\nMesh Patch Fits a mesh through a boundary and points.\n\nMesh From Lines Builds a mesh from a network of lines.\n\nInsert Point Adds a vertex inside a face.\n\nMesh From Points Builds a mesh through a point cloud.","metadata":{"title":"Mesh","section":"Create","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#create","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#create","collection":"docs7","hash":"ae0a5598f58fe046ef443dbaf5d3a70c","indexed_by":"docs-index"}},{"content":"Mesh — Booleans and modifications\n\nApply Mesh UVN Deforms a mesh through another mesh's UVN space.\n\nMesh Boolean Union Fuses meshes into one.\n\nMesh Boolean Difference Subtracts one mesh from another.\n\nShrink Wrap Wraps a single clean mesh around anything.\n\nBevel Bevels mesh edges.\n\nMesh Intersect Draws the curve where two meshes cross.\n\nOffset Mesh Offsets a mesh by a distance.\n\nMesh Boolean Split Splits a mesh with another, keeping both parts.\n\nMesh Boolean Intersection Keeps only the volume two meshes share.\n\nMerge Faces Merges the faces you pick into one.\n\nDup Mesh Hole Boundary Draws a curve around every hole.","metadata":{"title":"Mesh","section":"Booleans and modifications","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#booleans-and-modifications","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#booleans-and-modifications","collection":"docs7","hash":"5090ea6e4d7d1b61dd998e65634883b9","indexed_by":"docs-index"}},{"content":"Mesh — Quads and triangles\n\nQuadrangulate Mesh Turns triangle pairs into quads.\n\nTriangulate Mesh Splits every quad into triangles.\n\nNgons and extraction\nPolygon Count Reports how many faces a mesh has.\n\nMerge Coplanar Face Merges faces lying in the same plane.\n\nAdd Ngons To Mesh Groups coplanar faces into ngons.\n\nExtract Mesh Faces Pulls the faces you pick out of the mesh.\n\nMove\n\nExtract Connected Mesh Faces\n\nBy Aspect Ratio\n\nBy Area\n\nBy Edge Length\n\nBy Draft Angle\n\nExtract Mesh Part\n\nExtract Mesh Edges\n\nDelete Mesh Ngons Removes ngon grouping, leaving the faces.\n\nAppend To Mesh Adds a face by picking its corners.","metadata":{"title":"Mesh","section":"Quads and triangles","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#quads-and-triangles","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#quads-and-triangles","collection":"docs7","hash":"816b100c44b5715de2f4b473690716bd","indexed_by":"docs-index"}},{"content":"Mesh — Vertex and edge editing\n\nStitch Sews two mesh borders together.\n\nInsert Edge Inserts an edge loop.\n\nCrease Marks an edge as sharp.\n\nSlide Slides an edge along the surface.\n\nInset Insets a face inside its own border.\n\nRemove Crease Softens an edge marked sharp.\n\nRetopology and selection\nExtrude Mesh Extrudes the faces you pick.\n\nReduce Mesh Cuts the face count, keeping the shape.\n\nQuad Remesh Rebuilds the mesh as an even quad grid.\n\nSelect Meshes The mesh selection helpers.\n\nSelect Closed Mesh\n\nSelect Open Mesh\n\nSelect Visible Mesh\n\nSelect Edge Loop\n\nSelect Edge Ring\n\nSelect Face Loop\n\nEvery command in this tab is Rhino's own — RhinoArtisan groups them here so the mesh work an STL needs is in one place instead of spread across menus. For the jewellery-specific mesh tools see Manufacturing and Organic Modeling & Sculpting.","metadata":{"title":"Mesh","section":"Vertex and edge editing","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#vertex-and-edge-editing","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/#vertex-and-edge-editing","collection":"docs7","hash":"927ad98cec7eab239a8be5701fbee49a","indexed_by":"docs-index"}},{"content":"Apply Mesh UVN — Apply Mesh UVN\n\nThe ApplyMeshUVN command wraps meshes and points onto a surface.\n\nTo create meshes from bitmaps, see the Heightfield command.\n\nSteps\n1. Select meshes and points.\\\n\n2. Select the target surface.\\ \\ The mesh wraps around the target surface.\\\n\nCommand-line option\nVerticalScale: The scaling factor for the height of the applied mesh.","metadata":{"title":"Apply Mesh UVN","section":"Apply Mesh UVN","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/apply-mesh-uvn/#apply-mesh-uvn","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/apply-mesh-uvn/#apply-mesh-uvn","collection":"docs7","hash":"36328ba65674fc39e9f6e73dcf9a7655","indexed_by":"docs-index"}},{"content":"Extract Mesh Faces — Extract Mesh Faces\n\nThe ExtractMeshFaces command separates selected mesh faces from the parent mesh object.\n\nThis command works best in shaded mode, because you can pick the shaded mesh faces as well as the face edges.\n\nCommand-line options\nMakeCopy\n\n* Yes: Makes a copy of the selected mesh faces rather than extracting them from the parent mesh object.\n* No: Extracts the mesh faces leaving a hole in the parent mesh object.","metadata":{"title":"Extract Mesh Faces","section":"Extract Mesh Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/#extract-mesh-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/#extract-mesh-faces","collection":"docs7","hash":"340f8cad38fcc4f7b3168d97afc0cbd2","indexed_by":"docs-index"}},{"content":"By Area — Extract Mesh Faces By Area\n\nThe ExtractMeshFacesByArea command separates mesh faces that are within a specified range of area from the parent mesh object.\\\n\nExtract mesh faces by area options\nSelect faces larger than: Selects mesh faces with an area larger than the specified setting.\n\nSelect smallest face: Select a mesh face to set the area of the smallest face.\n\nSelect faces smaller than: Selects mesh faces with an area smaller than the specified setting.\n\n* Select largest face: Select a mesh face to set the area of the largest face.\n\nIncrement: Sets the amount the value is changed with each arrow click.\n\nSelect range from face: Select an example mesh face to set the size range. A range of ±10% of the area of the selected face is used.\n\nBorder only: Makes polylines out of the edges of the selected mesh faces instead of extracting them from the parent mesh object.\n\nExtract a copy: Makes a copy of the selected mesh faces rather than extracting them from the parent mesh object.","metadata":{"title":"By Area","section":"Extract Mesh Faces By Area","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-area/#extract-mesh-faces-by-area","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-area/#extract-mesh-faces-by-area","collection":"docs7","hash":"ab1f633e34cffa17d8166514d75aa01e","indexed_by":"docs-index"}},{"content":"By Aspect Ratio — Extract Mesh Faces By Aspect Ratio\n\nThe ExtractMeshFacesByAspectRatio command separates mesh faces from the parent mesh object that are greater than the specified aspect ratio limit.\n\nExtractMeshFacesByAspectRatio finds mesh faces that are very long compared to their width. A ratio of 25:1 or above is considered long.\n\nIn the image, the extracted red faces have an aspect ratio of 9:1 or more.\\","metadata":{"title":"By Aspect Ratio","section":"Extract Mesh Faces By Aspect Ratio","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-aspect-ratio/#extract-mesh-faces-by-aspect-ratio","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-aspect-ratio/#extract-mesh-faces-by-aspect-ratio","collection":"docs7","hash":"a987f7c1e81d2fed62946d0cd7493116","indexed_by":"docs-index"}},{"content":"By Aspect Ratio — Extract mesh faces by aspect ratio options\n\nAspect ratio \\_\\_\\_ to 1\n\nSet the target aspect ratio.\n\nIncrement\n\nSets the amount the value is changed with each arrow click.\n\nSelect aspect ratio from face\n\nSelect a mesh face to specify the Aspect Ratio value.\n\nBorder only\n\nMakes polylines out of the edges of the selected mesh faces instead of extracting them from the parent mesh object.\n\nExtract a copy\n\nMakes a copy of the selected mesh faces rather than extracting them from the parent mesh object.","metadata":{"title":"By Aspect Ratio","section":"Extract mesh faces by aspect ratio options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-aspect-ratio/#extract-mesh-faces-by-aspect-ratio-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-aspect-ratio/#extract-mesh-faces-by-aspect-ratio-options","collection":"docs7","hash":"2b06117b448908803ad18bde861c4eeb","indexed_by":"docs-index"}},{"content":"By Draft Angle — By Draft Angle\n\nThe ExtractMeshFacesByDraftAngle command separates mesh faces from the parent mesh object based on the angle of the faces to the view.\n\nExtractMeshFacesByDraftAngle can split a mesh object for molds or to look for undercut areas. In the example, the mesh faces were selected in the top view.\\\n\nCommand - line\nStart angle from camera direction: Sets the starting angle from the direction of the viewport camera.\n\nEnd angle from camera direction: Sets the ending angle from the direction of the viewport camera.\n\nBorder only: Makes polylines out of the edges of the selected meshes instead of extracting them from the parent mesh object.\n\nExtract a copy: Makes a copy of the selected mesh faces rather than extracting them from the parent mesh object.","metadata":{"title":"By Draft Angle","section":"By Draft Angle","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-draft-angle/#by-draft-angle","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-draft-angle/#by-draft-angle","collection":"docs7","hash":"b561b82770e389216cc0f0270e07b194","indexed_by":"docs-index"}},{"content":"By Edge Length — Extract Mesh Faces By Edge Length\n\nThe ExtractMeshFacesByEdgeLength command separates mesh faces from the parent mesh object that have an edge length greater or less than a specified value.\n\nExtractMeshFacesByEdgeLength removes small or large mesh faces that do not belong in the mesh object.\n\nIn the example image, the extracted red faces have an edge length shorter than 0.1.\\","metadata":{"title":"By Edge Length","section":"Extract Mesh Faces By Edge Length","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-edge-length/#extract-mesh-faces-by-edge-length","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-edge-length/#extract-mesh-faces-by-edge-length","collection":"docs7","hash":"25a2ec9b91fcfb30dfe18291c8931170","indexed_by":"docs-index"}},{"content":"By Edge Length — Command - line\n\nEdge length: Sets the mesh edge length to compare.\n\n* Select edge: Pick a mesh edge to specify the edge length you want.\n\nIncrement: Sets the amount the value is changed with each arrow click.\n\nSelect edges:\n\n* Shorter than edge length: Selects mesh faces with an edge length shorter than the Edge length setting.\n* Longer than edge length: Selects mesh faces with an edge length longer than the Edge length setting.\n\nBorder only: Makes polylines out of the edges of the selected mesh faces instead of extracting them from the parent mesh object.\n\nExtract a copy: Makes a copy of the selected mesh faces rather than extracting them from the parent mesh object.","metadata":{"title":"By Edge Length","section":"Command - line","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-edge-length/#command---line","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/by-edge-length/#command---line","collection":"docs7","hash":"9d2af3206d0917615f4b14585eb1b04a","indexed_by":"docs-index"}},{"content":"Copy of Extract Mesh Part — Extract Mesh Edges\n\nThe ExtractMeshEdges command separates edges from the parent mesh determined by an angle between mesh face normals.\n\nThe command may help if you have a mesh that came from a polysurface but no longer have the polysurface. Using the command with the Unwelded option creates polyline approximations of where the edges of the polysurface were.","metadata":{"title":"Copy of Extract Mesh Part","section":"Extract Mesh Edges","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/copy-of-extract-mesh-part/#extract-mesh-edges","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/copy-of-extract-mesh-part/#extract-mesh-edges","collection":"docs7","hash":"4355af07dca5e1d61c447d05783da6ae","indexed_by":"docs-index"}},{"content":"Copy of Extract Mesh Part — Command-line options\n\nExtract edges by\n\n* Unwelded: Extracts edges with coincident vertices.\n* Break angle: Extracts edges based on the angle between the face normals of adjacent faces.\n\nGreater than: Specifies the minimum break angle.\n\nLess than: Specifies a maximum break angle\n\nIncrement: Sets the amount the value changed by each arrow click.\n\n* Naked: Extracts the edges that have only one face associated.\n* Join results: Creates polylines from the extracted line segments.","metadata":{"title":"Copy of Extract Mesh Part","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/copy-of-extract-mesh-part/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/copy-of-extract-mesh-part/#command-line-options","collection":"docs7","hash":"b480286c03b6b387c2a70f33673e05f6","indexed_by":"docs-index"}},{"content":"Extract Connected Mesh Faces — Extract Connected Mesh Faces\n\nThe ExtractConnectedMeshFaces command separates mesh faces from the parent mesh object that are connected to a selected face.\n\nThe ExtractConnectedMeshFaces command extracts a set of mesh faces from a joined mesh object based on a specified break angle. This can be used to extract a series of mesh faces that make up a planar surface in a mesh object or to extract set of faces that make up a coherent feature in the mesh.","metadata":{"title":"Extract Connected Mesh Faces","section":"Extract Connected Mesh Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-connected-mesh-faces/#extract-connected-mesh-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-connected-mesh-faces/#extract-connected-mesh-faces","collection":"docs7","hash":"4b0ae589fde680693e54f84ff3291873","indexed_by":"docs-index"}},{"content":"Extract Connected Mesh Faces — Steps\n\n1. Select mesh faces, and press Enter.\n2. Adjust options to get the selection you want.\n\nExtract connected mesh faces options\nExtract faces connected with angle\n\nSets the angle between mesh faces for selection.\n\nLess than / Greater than \\_\\_\\_ degrees\n\nNote\n\n* A setting of 0 will give you all the mesh faces that are connected and planar with the face you select.\n* Sometimes planar meshes have a little noise in them, so a angle of 1 can help select planar faces.\n\nIncrement\n\nSets the amount the value is changed with each arrow click.\n\nSelect faces to measure angle\n\nSelect two mesh faces to specify the angle you want.\n\nBorder only\n\nMakes polylines out of the edges of the selected mesh faces instead of extracting them from the parent mesh object.\n\nExtract a copy\n\nMakes a copy of the selected mesh faces rather than extracting them from the parent mesh object.\n\nEdit Selection\n\nClick to select a different mesh face.","metadata":{"title":"Extract Connected Mesh Faces","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-connected-mesh-faces/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-connected-mesh-faces/#steps","collection":"docs7","hash":"635ab36553f42affbdb0cdceba89a9c9","indexed_by":"docs-index"}},{"content":"Extract Mesh Part — Extract Mesh Part\n\nThe ExtractMeshPart command extracts all mesh faces radiating out from the selected face to unwelded, non-manifold, or naked edges in the parent mesh object.\n\nCommand-line options\nThe scriptable command, -ExtractMeshPart, provides extra options.\n\nBorderOnly\nCreates line segments from the boundary edges of the selected mesh face group.","metadata":{"title":"Extract Mesh Part","section":"Extract Mesh Part","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#extract-mesh-part","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#extract-mesh-part","collection":"docs7","hash":"36fecfd4caec01d9c6c6fb031dc7248f","indexed_by":"docs-index"}},{"content":"Extract Mesh Part — MakeCopy\n\nDuplicates the selected mesh face group instead of extracting it.\n\nExtractWholeDisjointParts\n* Yes: Extracts the selected part in the mesh that does not physically join to other parts.\n\n* No: The ExtractToNonManifoldEdges option decides how mesh faces are extracted.\n* ExtractToNonManifoldEdges\n\nYes: Extraction stops at non-manifold edges.\n\nNo: Extraction stops at unwelded edges.","metadata":{"title":"Extract Mesh Part","section":"MakeCopy","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#makecopy","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#makecopy","collection":"docs7","hash":"d0c9458c1db1e0a9e33b11f417c8efd8","indexed_by":"docs-index"}},{"content":"Extract Mesh Part — JoinOutput\n\nJoins the extracted mesh faces into a mesh object.","metadata":{"title":"Extract Mesh Part","section":"JoinOutput","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#joinoutput","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/extract-mesh-part/#joinoutput","collection":"docs7","hash":"38302d71f0b857c92adcfdbc16d16e96","indexed_by":"docs-index"}},{"content":"Move — Move\n\nThe Move command options control mouse operation for selecting and dragging.\n\nSteps\n1. Select objects.\n2. Pick a point to move from.\n\nPress Enter to use the bounding box center of the object.\n3. Pick a point to move to.\n\nNormal\nMoves objects in the normal direction of the picked location1 on another object2.\n\n1 The picked location will be the \"from\" point.\n\n2 The object can be a curve, surface, polysurface, extrusion, or SubD.","metadata":{"title":"Move","section":"Move","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/move/#move","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/move/#move","collection":"docs7","hash":"434a92b97eb9cc66087702c265f6c539","indexed_by":"docs-index"}},{"content":"Move — Vertical\n\nMoves objects perpendicular to the current construction plane.","metadata":{"title":"Move","section":"Vertical","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/move/#vertical","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/extract-mesh-faces/move/#vertical","collection":"docs7","hash":"557428628394ab9f2a056d4bddafd307","indexed_by":"docs-index"}},{"content":"Dup Mesh Hole Boundary — Dup Mesh Hole Boundary\n\nThe `DupMeshHoleBoundary` command in Rhino duplicates the boundary of a mesh hole by creating a polyline around it. To use it, simply select the boundary of the hole in the mesh. This tool is helpful for creating clear, editable boundaries around mesh holes.&#x20;","metadata":{"title":"Dup Mesh Hole Boundary","section":"Dup Mesh Hole Boundary","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/dup-mesh-hole-boundary/#dup-mesh-hole-boundary","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/dup-mesh-hole-boundary/#dup-mesh-hole-boundary","collection":"docs7","hash":"d01efd4dd6962922bf025231b4482199","indexed_by":"docs-index"}},{"content":"Mesh Intersect — Mesh Intersect\n\nThe MeshIntersect command creates a polyline at the intersection of mesh objects.\n\nTolerance\n* Auto: Uses a tolerance that is more suitable for well-drawn meshes created using document tolerances. The value is computed using heuristics.\n* Literal: Uses document tolerances. This might not be the best value because meshes often have tiny features that might fall well below the document tolerance.","metadata":{"title":"Mesh Intersect","section":"Mesh Intersect","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/mesh-intersect/#mesh-intersect","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/mesh-intersect/#mesh-intersect","collection":"docs7","hash":"e2e61833e70b562f25f56b04999d7231","indexed_by":"docs-index"}},{"content":"Mesh Intersect — CoplanarFaces\n\n* Drop: Discards coplanar overlaps.\n* Polylines: Creates polylines from the boundaries of coplanar overlaps.\n* Meshes: Creates meshes from coplanar overlaps.\n\nDrop (left), Polylines (middle), and Meshes (right)","metadata":{"title":"Mesh Intersect","section":"CoplanarFaces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/mesh-intersect/#coplanarfaces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/mesh-intersect/#coplanarfaces","collection":"docs7","hash":"0265a6795fd77f223dbefb126493df07","indexed_by":"docs-index"}},{"content":"Polygon Count — Polygon Count\n\nThe PolygonCount command in Rhino reports the number of polygons in a selected mesh object. This helps to analyze mesh complexity, especially useful when preparing models for 3D printing or ensuring optimal performance.","metadata":{"title":"Polygon Count","section":"Polygon Count","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/polygon-count/#polygon-count","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-analysis/polygon-count/#polygon-count","collection":"docs7","hash":"d85e59e25b2f36b5844c7524787ab83b","indexed_by":"docs-index"}},{"content":"Mesh Boolean Union — Mesh Boolean Union\n\nThe MeshBooleanUnion command trims the shared areas of selected meshes, polysurfaces, or surfaces and creates a single mesh from the unshared areas. This command is primarily used for combining multiple meshes or surfaces into a single object, removing the overlapping regions, and ensuring the resulting mesh is clean and unified.\n\n*\n\nUse Cases**\n\n* Combining Meshes: Combine two or more meshes by trimming shared areas, useful for creating complex shapes from simpler ones.\n* Mesh Cleanup: Remove unnecessary overlapping geometry to create a cleaner and more efficient mesh.\n* Mesh Preparation for 3D Printing: Create a single unified mesh by merging multiple mesh objects, suitable for 3D printing.\n\n*\n\nSteps to Use\n\n1. Start the Command:\\ Type MeshBooleanUnion in the command line or select it from the mesh tools menu.\n2. Select Meshes, Polysurfaces, or Surfaces:\\ Select the meshes, polysurfaces, or surfaces that you want to union. The shared areas between the selected objects will be trimmed.\n3. Complete the Operation**:\\ After the selection, the command will perform the boolean operation, removing the shared regions and creating a new mesh that represents the unshared areas of the selected objects.","metadata":{"title":"Mesh Boolean Union","section":"Mesh Boolean Union","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-boolean-union/#mesh-boolean-union","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-boolean-union/#mesh-boolean-union","collection":"docs7","hash":"7ca4096acc618e21cc0ba0071a3e6fbf","indexed_by":"docs-index"}},{"content":"Mesh From Lines — Mesh From Lines\n\nThe MeshFromLines command allows you to create a polygon mesh from a set of three or more connected line segments. These lines must be connected at their endpoints to form closed regions. This command is useful for quickly converting line-based geometry into meshes, especially when dealing with closed loops of lines. Note that MeshFromLines does not accept polylines as input.\n\n*\n\nSteps to Use\n\n1. Start the Command:\\ Type MeshFromLines in the command line or select the command from the menu.\n2. Select Line Segments:\\ Choose the line segments connected at their endpoints. These segments must form closed regions. Once selected, press Enter to create the mesh.\n\n> Note: MeshFromLines does not accept polyline inputs.\n\n*\n\nCommand-line Options\n\n* MaxSidesPerFace:\\ Defines the maximum number of sides that can be used for each face in the generated mesh. This is useful if you want to limit the complexity of the mesh faces.\n* DeleteInput:\\ This option determines whether the original geometry (the line segments) is retained or deleted after the mesh is created.\n* Yes: Deletes the original line segments after the mesh is generated.\n* No: Retains the original geometry.\n* CurrentLayer:\\ Places the resulting mesh on the current layer, making it easier to manage in your scene.\n\n*\n\nUse Case Example","metadata":{"title":"Mesh From Lines","section":"Mesh From Lines","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-lines/#mesh-from-lines","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-lines/#mesh-from-lines","collection":"docs7","hash":"ed36e1b0ec684b7a209bd9a9d001ad26","indexed_by":"docs-index"}},{"content":"Mesh From Lines — Mesh From Lines\n\n1. Create a Mesh from Lines**:\n* Start the MeshFromLines command.\n* Select the line segments that form a closed loop, ensuring they are connected at their endpoints.\n* Press Enter to generate the mesh.\n2. Control Mesh Complexity:\n* If needed, adjust the MaxSidesPerFace option to limit the number of sides for each mesh face.\n3. Decide on Geometry Retention:\n* Choose whether to delete or retain the original line segments by using the DeleteInput option.\n4. Layer Management:\n* The resulting mesh will automatically be placed on the CurrentLayer for easier organization.","metadata":{"title":"Mesh From Lines","section":"Mesh From Lines","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-lines/#mesh-from-lines","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-lines/#mesh-from-lines","collection":"docs7","hash":"5af2df477cd5192cfa076c332ac8ae6c","indexed_by":"docs-index"}},{"content":"Mesh From Points — Mesh From Points\n\nOverview\n\nThe MeshFromPoints command creates a polygon mesh from selected point objects or point clouds. This command is ideal for generating meshes from a collection of points or 3D data, such as a point cloud from a 3D scan. It uses these points to form a mesh that can be used for modeling or further editing.\n\n*\n\nSteps to Use\n\n1. Start the Command:\\ Type MeshFromPoints in the command line or select the command from the menu.\n2. Select Points:\\ Choose the point objects or point cloud that will be used to generate the mesh. Once the points are selected, press Enter to create the mesh.\n\n*\n\nCommand-line Options\n\n* SamplingDensityPlusNoise:\\ Specifies the number of points to use in a given grid cell. Increasing this value can improve the mesh quality by increasing the point density, but it may also increase the computational time.\n* AutoAdjustGrid (Yes/No):\\ Decides whether the system should automatically calculate a better starting point for the mesh generation. Setting this option to Yes allows the system to adjust the grid automatically to optimize the mesh creation.\n* NumOfContouringGridCells:\\ Sets the number of grid cells that the entire model is divided into. The more cells, the finer the mesh will be, but it may also increase the processing time and complexity.\n\n*\n\nUse Case Example","metadata":{"title":"Mesh From Points","section":"Mesh From Points","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-points/#mesh-from-points","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-points/#mesh-from-points","collection":"docs7","hash":"3226f321dcb9b06bd4779796c775c2e7","indexed_by":"docs-index"}},{"content":"Mesh From Points — Mesh From Points\n\n1. Create a Mesh from Points**:\n* Start the MeshFromPoints command.\n* Select the point objects or point cloud you want to convert into a mesh.\n* Press Enter to generate the mesh.\n2. Control Mesh Density:\n* Adjust the SamplingDensityPlusNoise to set how many points are used in each grid cell, influencing the mesh resolution.\n3. Optimize the Grid:\n* Set AutoAdjustGrid to Yes if you want the system to automatically adjust the starting grid for better mesh formation.\n4. Adjust Grid Cell Count:\n* Modify NumOfContouringGridCells to determine how many cells the model will be divided into, affecting the mesh detail and processing time.","metadata":{"title":"Mesh From Points","section":"Mesh From Points","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-points/#mesh-from-points","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-from-points/#mesh-from-points","collection":"docs7","hash":"a0013112534e071ad102401da0b7eede","indexed_by":"docs-index"}},{"content":"Mesh Patch — Mesh Patch\n\nThe MeshPatch command creates a polygon mesh from selected curves and points. This is useful when you need to generate a mesh that matches the contours of your input curves and points, while optionally allowing for holes defined by closed curves. The command gives you the flexibility to control the mesh generation with several options, including angle tolerance and reference surfaces.\n\n*\n\nSteps to Use\n\n1. Select Curves and Points:\\ Choose the curves and points that will define the mesh. This can include any curve or point object.\n2. Define Holes:\\ Select closed interior curves to be used as holes in the mesh. If no curves are selected, the mesh will be created without any holes.\n3. Press Enter:\\ After selecting the necessary curves and points, press Enter to create the mesh.\n\n*\n\nCommand-line Options\n\n* AngleTolerance:\\ Defines the angle tolerance for approximating the curves as polylines. If polylines are selected instead of curves, this option has no effect on the final output.\n* StartingSurface:\\ Uses a reference surface that is similar in shape to the mesh you're trying to create. This surface will influence the shape of the final mesh, allowing for better matching of the mesh to the reference surface's geometry.\n\n*\n\nHidden Command-line Options\n\nTo access hidden options, type a hyphen in front of the command name, e.g., -MeshPatch**. These hidden options provide additional flexibility in mesh creation:\n\n* TrimBack:\\ Trims the base rectangular mesh to the boundaries defined by the input curves and points.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/meshpatch_trimback.gif","metadata":{"title":"Mesh Patch","section":"Mesh Patch","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-patch/#mesh-patch","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-patch/#mesh-patch","collection":"docs7","hash":"49c98de5c4da9ea0fd498976d32f7a5c","indexed_by":"docs-index"}},{"content":"Mesh Patch — Mesh Patch\n\n* MainSegmentCount:\\ Controls the number of segments on each side of the base rectangular mesh. This option is only available when TrimBack is set to \"No\". If TrimBack is enabled, the segment count will be automatically set to 1.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/meshpatch_mainsegmentcount.gif\n\n*\n\nUse Case Example\n\n1. Create a Mesh with Curves and Points**:\n* Select the curves and points that define the mesh shape.\n* Optionally select closed curves to create holes in the mesh.\n2. Adjust Mesh Shape:\n* Set the AngleTolerance if necessary to control how curves are approximated as polylines.\n* Use the StartingSurface option if you want the mesh to follow the shape of an existing reference surface.\n3. Finalize the Mesh:\n* Once all selections are made, press Enter to generate the mesh. The mesh will respect the defined curves, holes, and shape influences.","metadata":{"title":"Mesh Patch","section":"Mesh Patch","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-patch/#mesh-patch","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh-patch/#mesh-patch","collection":"docs7","hash":"ce9f8ce832c70abb9d0471fff49a0f3d","indexed_by":"docs-index"}},{"content":"Mesh — Mesh\n\nThe Mesh command creates a polygon mesh from a NURBS surface, polysurface, or SubD. A polygon mesh is a collection of vertices and polygons (typically triangles and quadrilaterals) that define the shape of a polyhedral object. In Rhino, meshes are essential for 3D modeling, rendering, and exporting to various file formats, including STL for 3D printing.\n\nWhen you create a mesh from a solid, it will be seamless and watertight, meaning there will be no holes in the mesh. This feature is particularly important for rapid prototyping and 3D printing.\n\n*\n\nSteps to Use\n\n1. Select Objects: Choose the NURBS surfaces, polysurfaces, or SubD objects you want to convert into a mesh.\n2. Preview Mesh: Rhino will generate a preview of the mesh and allow you to adjust the mesh options before finalizing.\n3. Adjust Mesh Options: Use the available options to control the quality and density of the generated mesh.\n4. Finalize: Once satisfied with the preview, finalize the mesh creation.\n\n*\n\nMesh Options","metadata":{"title":"Mesh","section":"Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","collection":"docs7","hash":"984707bdd38ff82c1e8e12a85b134f4a","indexed_by":"docs-index"}},{"content":"Mesh — Mesh\n\n* Simple Mesh Options\\ Adjust the density of the mesh faces created from the NURBS surfaces. A higher polygon count results in a more detailed mesh, while a lower polygon count creates a more simplified mesh.\n* NURBS Meshing Parameters\n* Fewer Polygons / More Polygons: This slider controls the density of the mesh. Fewer polygons will create a coarser mesh, while more polygons result in a finer, more detailed mesh.\n* SubD Meshing Parameters\n* Adaptive Subdivision Level: Controls how the mesh adapts to the subdivision level of SubD objects. A lower subdivision level results in fewer mesh faces, which increases performance but reduces mesh accuracy.\n* Render Mesh Wire Preview: You can preview the mesh wireframe in the viewport. This is particularly useful to visualize the structure of the mesh before finalizing the settings.\n* Note: The wireframe preview will not display in Rendered and Raytraced display modes.\n* Restore Defaults: If you want to reset the meshing options to the default settings, you can click the Restore Defaults button. Your custom mesh presets will remain unaffected.\n* Detailed Controls: For advanced users, switching to detailed meshing settings allows for greater control over how the mesh is generated, particularly in terms of polygon count and the distribution of vertices.\n\n*\n\nMesh Types and Considerations**","metadata":{"title":"Mesh","section":"Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","collection":"docs7","hash":"878f2b7caad07e11e9c796130b3f8215","indexed_by":"docs-index"}},{"content":"Mesh — Mesh\n\n* Seamless (Watertight) Meshes:\\ When creating a mesh from a solid, Rhino ensures that the mesh is seamless, meaning all faces are connected, and there are no holes. This feature is crucial for exporting to 3D printing file formats like STL, as a watertight mesh is required for successful printing.\n* Editable vs. Display Meshes:\\ Meshes created using the Mesh command are fully editable, and you can modify them independently of the original NURBS or SubD object. In contrast, meshes generated in shaded viewports are not editable but can be extracted using the ExtractRenderMesh command.\n\n*\n\nUse Case Example\n\n1. Convert a Solid to Mesh**:\n* Select a solid object that you wish to convert into a mesh.\n* Use the Mesh command to create a seamless, watertight mesh suitable for 3D printing.\n2. Adjust Mesh Density:\n* Use the slider to adjust the number of polygons based on your need for mesh detail. For rapid prototyping, you may opt for fewer polygons.\n3. Preview and Finalize:\n* Preview the mesh and make any necessary adjustments before clicking OK to generate the final mesh.","metadata":{"title":"Mesh","section":"Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/mesh/#mesh","collection":"docs7","hash":"035e43465b54f1004c6ca1dbc33af6e5","indexed_by":"docs-index"}},{"content":"Shrink Wrap — Shrink Wrap\n\nThe ShrinkWrap command generates a mesh that wraps around the selected geometry, including NURBS surfaces, SubD objects, meshes, point clouds, and point objects. This command is highly useful in a variety of applications, such as 3D printing, reverse engineering, and repairing broken or complex geometry. It can create solid meshes from the union of multiple input objects or from fragments of 3D scan data, and it ensures the output mesh is valid and closed.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/shrinkwrap.gif\n\n*\n\nUse Cases**\n\n* 3D Printing: Create a mesh suitable for 3D printing applications.\n* Solid Mesh Creation: Generate a single solid mesh from multiple objects or 3D scan fragments.\n* Mesh Repair: Repair broken meshes or geometry with self-intersections.\n* Reverse Engineering: Create meshes from point clouds or NURBS surfaces for reverse engineering.\n* Offset Meshes: Create meshes with offsets, useful for shell operations.\n\n*\n\nSteps to Use\n\n1. Start the Command:\\ Type ShrinkWrap in the command line or select the command from the menu.\n2. Select the Geometry:\\ Select the geometry you want the mesh to wrap around. This can include NURBS surfaces, SubDs, meshes, point clouds, or point objects.\n3. Adjust the Options:\\ Customize the mesh output using the available command-line options.\n\n*\n\nCommand-line Options","metadata":{"title":"Shrink Wrap","section":"Shrink Wrap","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","collection":"docs7","hash":"444436769df5df5ef107bef78176d3d8","indexed_by":"docs-index"}},{"content":"Shrink Wrap — Shrink Wrap\n\n* Target Edge Length:\\ Sets the approximate length of the edges in the output mesh.\n* Default is calculated automatically.\n* The edge length deviates more with higher Polygon Optimization settings.\n* Offset:\\ Offsets the output mesh by a specified distance.\n* Positive values inflate the mesh (adds more faces).\n* Negative values shrink the mesh (reduces face count).\n* The offset distance has less influence on the target edge length.\n* Smoothing Iterations:\n\nDefines the smoothing strength for the mesh output.\n\n* Set to 0 to disable smoothing.\n* Higher values reduce mesh faces and deflate the mesh more.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/shrinkwrap_smoothing.gif\n\n* Polygon Optimization % \\[0-100]:\\ Reduces the number of polygons adaptively, keeping faces along hard edges intact.\n* A higher percentage reduces more faces.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/shrinkwrap_optimization.gif","metadata":{"title":"Shrink Wrap","section":"Shrink Wrap","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","collection":"docs7","hash":"ef2ac942affbd8fa4130f3d2f425ad5b","indexed_by":"docs-index"}},{"content":"Shrink Wrap — Shrink Wrap\n\n* Inflate Vertices and Points:\\ Constructs the output mesh from each vertex/point of the input geometry.\n* Enabled by default for point clouds or point objects.\n* Disabled for other object types like SubDs or NURBS surfaces, but can be enabled manually.\n* Meshes will merge when inflated meshes intersect.\n* Fill Holes in Input Objects:\\ Fills holes in the input objects before mesh creation.\n* Helpful for closing micro gaps or other minor issues in the input geometry.\n* Has no effect for point clouds or when Inflate Vertices and Points is enabled.\n* Compute Vertex Colors:\\ Adds vertex colors from the original mesh or display colors from point clouds to the resulting mesh.\n* Delete Input Objects:\\ Deletes the input objects if the output mesh is successfully created.\n* Preview:\\ Displays a preview of the resulting mesh during the command session.\n* Draw Mesh Wires:\\ Displays the wireframe of the preview mesh.\n* Hide Input Objects:\\ Hides the original input objects during the mesh preview.\n\n*\n\nUse Case Example","metadata":{"title":"Shrink Wrap","section":"Shrink Wrap","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","collection":"docs7","hash":"68cb5ec3b6d0e2a471e731f41a4e3dcd","indexed_by":"docs-index"}},{"content":"Shrink Wrap — Shrink Wrap\n\n1. Creating a Mesh for 3D Printing**:\n* Start the ShrinkWrap command.\n* Select your NURBS surfaces or point cloud data.\n* Set the Target Edge Length to your desired resolution for the mesh.\n* Enable Polygon Optimization to reduce unnecessary faces while preserving hard edges.\n* Optionally, adjust the Offset if you want to inflate or shrink the mesh.\n* Preview the mesh and adjust smoothing settings if necessary.\n* Click OK to finalize and create the mesh.\n2. Repairing a Broken Mesh:\n* Use the Fill Holes in Input Objects option to close any gaps in the geometry.\n* Set a negative Offset value if you want to shrink the mesh and reduce its face count.\n* Use Smoothing Iterations to clean up any irregularities in the geometry.\n* Preview the results and finalize the mesh creation.","metadata":{"title":"Shrink Wrap","section":"Shrink Wrap","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-creation/shrink-wrap/#shrink-wrap","collection":"docs7","hash":"0794ed9e15f2f0b37c07aefc4fb2217d","indexed_by":"docs-index"}},{"content":"Add Ngons To Mesh — Add Ngons To Mesh\n\nThe AddNgonsToMesh command converts regions of connected coplanar welded mesh faces into Ngons.\n\nNote: This command does not allow selecting meshes in a block. To select meshes in a block, use the BlockEdit command to edit the block first.","metadata":{"title":"Add Ngons To Mesh","section":"Add Ngons To Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/add-ngons-to-mesh/#add-ngons-to-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/add-ngons-to-mesh/#add-ngons-to-mesh","collection":"docs7","hash":"e800b46b034cf18b36b8efe7e3c319e5","indexed_by":"docs-index"}},{"content":"Append to mesh — Append to mesh\n\nThe 3DFace command creates mesh or SubD faces that can be standalone or added to an existing mesh or SubD.\n\nA mesh face (left) and a SubD face (right)\n\n* When meshes or SubDs are pre-selected, the 3DFace command starts in the Append mode.","metadata":{"title":"Append to mesh","section":"Append to mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#append-to-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#append-to-mesh","collection":"docs7","hash":"d25e66a17c306182408b643dfe76b22b","indexed_by":"docs-index"}},{"content":"Append to mesh — Command-line options\n\nOutput\n\nMesh\n\nCreates mesh faces.\n\nSubD\n\nCreates SubD faces.\n\nInterpolated (Yes/No)\n\n| | |\n| ------------------------------------------------------------------------------------------------------------------------------------ | -- |\n| Yes | No |\n\nConceptually, this is the difference between what the Curve and InterpCrv commands do. The Curve command turns input points into the curve's control points. The InterpCrv command creates a curve to pass the input points.\n\nAppend\n\nSelects an existing mesh or SubD to which the new faces will be added.\n\n* During appending new faces, press ESC to cancel the current face creation. Press ESC one more time to cancel the command.\n\nPolygonType (Triangle/Quad/Ngon)\n\nSpecifies to create triangle, quad, or n-gon faces.\n\n* When PolygonType=Ngon, picking not enough points adds a triangle or quad face.\n\nFromEdge\n\nYes\n\nEach new face is started by selecting an existing mesh or SubD boundary edge.\n\nChain (Yes/No)\n\nCreate faces along an edge chain. The edge chain can be from an existing mesh or the current creating mesh.\n\nThis option is only available when PolygonType= Quad\n\nExample\n\n1. Click the Append option to select a mesh or SubD.\n2. Set PolygonType=Quad, FromEdge=Yes, Chain=Yes, and Mode=MultipleFaces.\n3. Select a boundary edge of the object.\n4. Pick two points to form the first face.\n5. Pick one point to form the next face and repeat.\n6. Right-click to start a new edge chain.\n\nFromEdgeReset\n\nYes\n\nResets FromEdge to No in the next 3DFace command session.\n\nNo\n\nRemembers the setting of FromEdge for the next 3DFace command session.\n\nNo\n\nEach new face is created by picking points.\n\nInPlane (Yes/No)","metadata":{"title":"Append to mesh","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#command-line-options","collection":"docs7","hash":"7fba9611871a7ef19a3c1917d9637b85","indexed_by":"docs-index"}},{"content":"Append to mesh — Command-line options\n\nSet Yes to define a plane with the first three points and constrain the rest points of the current face on that plane. This option only takes effect when PolygonType=Quad/Ngon.\n\nWeldAngle (Only for Output=Mesh)\n\nThe welding tolerance for mesh edges in degrees. Welding applies to edges around new faces. The default angle is 180 degrees that welds all edges.\n\nMode (SingleFace/MultipleFaces)\n\nSpecifies to create only one or more faces in a command session.\n\nUndo\n\nRemoves the previous pick.","metadata":{"title":"Append to mesh","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/append-to-mesh/#command-line-options","collection":"docs7","hash":"8cdda29e488dce37e8a8282f551b8b61","indexed_by":"docs-index"}},{"content":"Bevel — Bevel\n\nThe Bevel command chamfers or fillets mesh or SubD edges with the specified number of segments. This command is useful for smoothing or rounding sharp edges of 3D models, making them more suitable for various applications, including 3D printing and visualization.\n\n*\n\nUse Cases**\n\n* Edge Smoothing: Smooth or round sharp edges of meshes or SubDs to create more aesthetically pleasing shapes or improve the quality of 3D models.\n* 3D Printing: Chamfer or fillet sharp edges to improve mesh quality and minimize printing issues.\n* Subdivision Surface Modelling: Retain sharp edges while beveling SubD objects, improving the model’s appearance.\n\n*\n\nSteps to Use\n\n1. Start the Command:\\ Type Bevel in the command line or select it from the mesh or SubD editing tools menu.\n2. Select the Edge(s):\\ Click one or more edges on a mesh or SubD object. Press Enter to confirm the selection.\n3. Decide the Bevel Amount**:\n* Move the cursor to visually adjust the bevel amount, then click to confirm.\n* Alternatively, input a specific number for the bevel distance and press Enter. The value can be absolute or proportional, depending on the selected OffsetMode.\n\n*\n\nCommand-line Options**","metadata":{"title":"Bevel","section":"Bevel","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","collection":"docs7","hash":"517e08899679360369b7c7104291c78c","indexed_by":"docs-index"}},{"content":"Bevel — Bevel\n\n* Edge Selection Mode:\n* Default: Click to select a single edge. Double-click to select an edge loop.\n* EdgeLoop: Click on one edge of the loop to select the entire loop. The selected edge will be highlighted brighter than the others.\n* Ctrl+click: Deselect an individual edge or an entire loop (Ctrl+double-click to deselect the loop).\n* Segments:\\ Specifies the number of new faces added along the beveled edge. This controls the smoothness of the bevel.\n* OffsetMode:\n* Proportional: The bevel amount is proportional to the length of the crossing edges. The input value should range from 0 to 1.0.\n* Absolute: The bevel amount is constant for all selected edges and is specified as a distance in the model units.\n* Straightness (0-1.0):\\ Controls the curvature of the bevel:\n* 0 creates the most rounded bevel (requires more segments).\n* 1.0 creates a flat bevel (sharp, chamfer-like edges).\n* WeldAngle (Mesh only):\\ The tolerance in degrees for welding mesh edges that meet at an angle. This option is only available for meshes.\n* RetainShape (Mesh only):\\ When enabled, new vertices added during the bevel operation will lie along the original mesh edges.\n* KeepCreases (SubD only):\\ Specifies whether the creased edges of SubD objects will be retained after the bevel operation.\n\n*\n\nExample Workflow","metadata":{"title":"Bevel","section":"Bevel","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","collection":"docs7","hash":"cab031cf99dca772e3a119ff66aabe91","indexed_by":"docs-index"}},{"content":"Bevel — Bevel\n\n1. Beveling Mesh Edges**:\n* Start the Bevel command.\n* Select the edges to bevel on the mesh.\n* Use the cursor to adjust the bevel, or enter a specific distance for the bevel.\n* Use the OffsetMode setting to define if the bevel should be proportional or absolute.\n* Confirm the bevel.\n2. Beveling SubD Edges:\n* Start the Bevel command.\n* Select the edges of a SubD object.\n* Adjust the bevel using the proportional or absolute setting.\n* If the SubD has creased edges, choose whether to retain them using the KeepCreases option.\n* Confirm the bevel.","metadata":{"title":"Bevel","section":"Bevel","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/bevel/#bevel","collection":"docs7","hash":"a283660c06df242b8e0288a314d1bb9e","indexed_by":"docs-index"}},{"content":"Delete Mesh Ngons — Delete Mesh Ngons\n\nThe DeleteMeshNgons command converts Ngons on a mesh into triangle or quad faces.\n\nNote: This command does not allow selecting meshes in a block. To select meshes in a block, use the BlockEdit command to edit the block first.","metadata":{"title":"Delete Mesh Ngons","section":"Delete Mesh Ngons","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/delete-mesh-ngons/#delete-mesh-ngons","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/delete-mesh-ngons/#delete-mesh-ngons","collection":"docs7","hash":"2603f82b930ea9b782874fcd8ea90a30","indexed_by":"docs-index"}},{"content":"Merge Coplanar Face — Merge Coplanar Face\n\nThe MergeCoplanarFace combines adjacent coplanar faces of a mesh, polysurface, or SubD into a single face.\n\nCommand-line options\nMergeAllCoplanar\n\nCombines all faces of a planar region that includes the selected face.","metadata":{"title":"Merge Coplanar Face","section":"Merge Coplanar Face","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/merge-coplanar-face/#merge-coplanar-face","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/merge-coplanar-face/#merge-coplanar-face","collection":"docs7","hash":"a6c84e80c1352f15c8bf1c46ad0942d1","indexed_by":"docs-index"}},{"content":"Merge Faces — Merge Faces\n\nThe MergeFaces command merges a connected set of SubD or mesh faces into a single face.\n\nA SubD (left) and a mesh (right).\n\nInput\n\n* SubD Face, Edge, Vertex\n* Mesh Face, Edge, Vertex\n\nHow faces are merged:\n\n* If a vertex is selected, the faces around the vertex are merged into a single face.\n* If an edge is selected, the faces on either side of the edge are merged into a single face.\n* If a collection of faces is selected, they are partitioned into subsets. Each subset is merged into a single face.\n* Faces separated by a SubD crease or an unwelded mesh edge cannot be merged. Use the RemoveCrease command to remove the crease or unwelded edge before merging the faces.\n* Use Ctrl(CMD)+Shift+Click to select vertices or edges and press Delete to merge the surrounding faces into a single face. Deleting faces with Delete will leave holes.","metadata":{"title":"Merge Faces","section":"Merge Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/merge-faces/#merge-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/merge-faces/#merge-faces","collection":"docs7","hash":"99776e2836a1c734d5cf32cb3f5d1cf7","indexed_by":"docs-index"}},{"content":"Offset Mesh — Offset Mesh\n\nThe OffsetMesh command copies a mesh by moving the vertices a specified distance with different direction modes.\n\nSetBasePoint\nPicks a point as the starting point of the offset distance.\n\nDirectionMethod\nUseVertexNormals\n\nOffsets a mesh based on vertex normals.\n\nAverageNormals\nYes: Offsets a mesh in the average direction of all vertex normals in the mesh. If the average vector is 0 (e.g., a mesh sphere), the CPlane normal will be used.\n\nNo: Offsets a mesh by moving the vertices in their normal directions.\n\nFlip: Changes the offsetting side of the picked mesh among the meshes being offset.","metadata":{"title":"Offset Mesh","section":"Offset Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#offset-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#offset-mesh","collection":"docs7","hash":"5cd54ba3a5f95201898ae0388cb90faa","indexed_by":"docs-index"}},{"content":"Offset Mesh — FlipAll\n\nChanges the offsetting side of all the selected meshes.\n\nUserSelectedDirection\nPicks the offset direction manually.\n\nUseVectorLength\nYes: The offset distance is picked by the mouse cursor.\n\nNo: The offset distance is constrained to the previous distance. Input a number and press Enter to change the distance.","metadata":{"title":"Offset Mesh","section":"FlipAll","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#flipall","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#flipall","collection":"docs7","hash":"7a719b05f36b84989a17b008b164773f","indexed_by":"docs-index"}},{"content":"Offset Mesh — DeleteInput\n\nDeletes (Yes) or keeps (No) the input objects.\n\nSolid\nSpecifies if a wall will be added alongside to join the original and offset meshes.\n\nYes\n\nNo\n\nBothSides\nYes: Offsets a mesh to both sides. Each side offsets the specified distance.\n\nNo: Offsets a mesh to a single side.\n\nAllowDisjoint\nYes: The original and offset meshes will be a single object even though they do not touch.\n\nNo: The original and offset meshes will be separate.","metadata":{"title":"Offset Mesh","section":"DeleteInput","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#deleteinput","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#deleteinput","collection":"docs7","hash":"a5118396a805e2fa5a66da6c1ca24d57","indexed_by":"docs-index"}},{"content":"Offset Mesh — DynamicPreview\n\nYes : The preview follows the mouse cursor.\n\n* Left-click offsets the mesh to the preview location.\n* Right-click offsets the mesh to the input distance.\n\nNo: The preview is static at the input distance. The cursor location does not affect to the result.","metadata":{"title":"Offset Mesh","section":"DynamicPreview","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#dynamicpreview","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-modifications/offset-mesh/#dynamicpreview","collection":"docs7","hash":"fef8c3a5c91aea07b120592c029bb69b","indexed_by":"docs-index"}},{"content":"Align Vertices — Align Vertices\n\nThe AlignVertices command aligns mesh or SubD vertices to the same location. This can be particularly useful when preparing meshes for STL/SLA printing, where long, thin facets can cause issues like slow printing, odd results, or excessive memory usage. The command helps fix areas where vertices that should be at the same location are slightly offset.\n\n*\n\nHow to Use the AlignVertices Command\n\n1. Select mesh or SubD objects and specify the desired command-line options. Press Enter to execute.\n2. If the distance between vertices is smaller than the set DistanceToAdjust, the vertices will be forced to align at the same location.\n\n*\n\nCommand-Line Options\n\n* SelectVertices\\ Allows you to manually select the vertices that you want to align.\n* SelectNakedEdges\\ Enables you to select naked edges and align all vertices on those edges.\n* DistanceToAdjust\\ Sets the tolerance distance for vertex adjustment. Vertices within this distance will be aligned.\n* AverageVertexesToAdjust\\ Moves vertices to the average location, instead of aligning them to one specific vertex.\n\n***\n\nThis command is particularly useful for cleaning up meshes and SubD models, ensuring that vertices that should be in the same location are properly aligned for better mesh quality and smoother printing results.","metadata":{"title":"Align Vertices","section":"Align Vertices","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/align-vertices/#align-vertices","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/align-vertices/#align-vertices","collection":"docs7","hash":"b95c33439fde4bbd023ca5bc31d5ad6a","indexed_by":"docs-index"}},{"content":"Check — Check\n\nThis command reports errors in the data structure of selected objects, providing a detailed report on potential geometry issues.\\ Steps to use:\n\n1. Select the objects to analyze.\n2. Review the generated report for identified issues.\n3. If errors are found, consider deleting or remodeling the problematic objects.\n\n* CheckNewObjects\\ Detects errors in the data structure of objects as they are created or imported into the model.\\ Details:\n* Displays messages in the command history when bad objects are created while opening or importing files.\n* If a problem is detected during modeling, undo, export the problematic object, and report the issue for debugging.\n\n*\n\nDiagnosing Common Issues\n\nDetectable Issues and Solutions\n\n1. Degenerate faces:\\ Fix using the `CullDegenerateMeshFaces` command.\n2. Zero-length edges:\\ Often associated with degenerate faces. Use the same command as above.\n3. Non-manifold edges:\\ Identify with `ExtractNonManifoldMeshEdges` after removing degenerate faces.\n4. Naked edges:\\ These can cause issues in rapid prototyping. Fix using commands like `FillMeshHole` or `MatchMeshEdge`.\n5. Duplicate faces:\\ Remove duplicates with `ExtractDuplicateMeshFaces`.\n6. Disjoint pieces:\\ Separate unconnected pieces using `SplitDisjointMesh`.\n\nAdditional Issues and Best Practices**\n\n* Avoid creating curves with tiny segments or self-intersections.\n* Ensure adjacent parts align cleanly with simple edge-to-edge matching.\n* Repair faulty structures by breaking down objects (`Explode`), untrimming, re-trimming, and rejoining.","metadata":{"title":"Check","section":"Check","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/check/#check","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/check/#check","collection":"docs7","hash":"0233e57ac6347062a6a95d75a12e4a83","indexed_by":"docs-index"}},{"content":" Cull Degenerate Mesh Faces — Cull Degenerate Mesh Faces\n\nThe CullDegenerateMeshFaces command removes degenerated mesh faces and edges. Degenerated faces are those with zero area, and degenerated edges have a length of zero. This command is essential for cleaning up meshes by eliminating unnecessary or problematic elements that could cause issues in modeling or 3D printing.\n\n*\n\nSteps to Use\n\n1. Select the mesh that you wish to clean up.\n2. Run the CullDegenerateMeshFaces command to remove the degenerated faces and edges.\n\n*\n\nWhat Gets Removed\n\n* Degenerated mesh faces: Faces with an area of zero (i.e., collapsed to a point).\n* Degenerated mesh edges: Edges with a length of zero.\n* Orphaned vertices: If any vertices are left unattached after removal, they will also be deleted.\n\n*\n\nApplications**\n\n* Mesh Repair: Clean up meshes that contain degenerated elements, ensuring the model is better structured for further operations.\n* STL/SLA Printing: Useful for preparing meshes for 3D printing by removing problematic elements that could cause slow printing or errors during the process.","metadata":{"title":" Cull Degenerate Mesh Faces","section":"Cull Degenerate Mesh Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/cull-degenerate-mesh-faces/#cull-degenerate-mesh-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/cull-degenerate-mesh-faces/#cull-degenerate-mesh-faces","collection":"docs7","hash":"8d875c6a8175c318a5ef34eaa4f271e7","indexed_by":"docs-index"}},{"content":"Delete Faces — Delete Faces\n\nThe DeleteFaces command removes selected faces from a mesh, SubD, or polysurface. This is particularly useful for editing objects by creating holes or simplifying geometry. For the best experience, use this command in a shaded display mode to visually select and remove faces with precision.\n\n*\n\nSupported Input**\n\n* Mesh faces\n* SubD faces\n* Polysurface faces\n\n*\n\nSteps to Use\n\n1. Select the faces on the mesh, SubD, or polysurface that you want to remove.\n2. Execute the DeleteFaces command.\n\nFace Loop Selection (Post-Selection)**\n\nYou can use advanced selection techniques to remove entire loops or ranges of faces:\n\n* To select an entire face loop\n1. Click on a face in the desired loop.\n2. Double-click on the next face to define the loop direction.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/doubleclickfaceloop.gif\n\n* To select a face loop range\n1. Click on the first face and the last face in the loop.\n2. Double-click on an intermediate face near the selected range.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/doubleclickfacelooprange.gif\n\n*\n\nApplications\n\nUse the DeleteFaces** command to:\n\n* Create holes in objects for further editing.\n* Simplify meshes, SubDs, or polysurfaces.\n* Prepare models for custom modifications.","metadata":{"title":"Delete Faces","section":"Delete Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/delete-faces/#delete-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/delete-faces/#delete-faces","collection":"docs7","hash":"92475235f9967dda2fffd1226ab46599","indexed_by":"docs-index"}},{"content":" Fill Mesh Hole — Fill Mesh Hole\n\nThe FillMeshHole command allows you to close a specific hole in a mesh by filling it with new faces. This is an essential tool for repairing mesh files, especially those intended for rapid prototyping or 3D printing.\n\n*\n\nKey Features**\n\n* Closes individual holes in a mesh.\n* Adds triangular faces to fill the gap seamlessly.\n* Option to join the new faces directly to the original mesh.\n\n*\n\nSteps to Use\n\n1. Select the boundary of the hole to be filled.\n2. Execute the command.\n\n*\n\nCommand-Line Options\n\n* JoinMesh\\ When enabled, this option ensures that the new faces created are merged with the original mesh, forming a unified object.","metadata":{"title":" Fill Mesh Hole","section":"Fill Mesh Hole","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/fill-mesh-hole/#fill-mesh-hole","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/fill-mesh-hole/#fill-mesh-hole","collection":"docs7","hash":"78f6b7fd59996b621bbbd2c7733e56c3","indexed_by":"docs-index"}},{"content":"Match Mesh Edge — Match Mesh Edge\n\nThe MatchMeshEdge command adjusts the edges of an open mesh to align them with adjacent mesh edges. This is particularly useful for repairing and closing gaps in meshes. It ensures that no part of the mesh moves beyond a specified tolerance, making it suitable for precise adjustments.\n\n*\n\nKey Features**\n\n* Aligns open edges to adjacent mesh edges by matching vertices or splitting edges as needed.\n* Operates on the entire mesh or selected edges for targeted corrections.\n* Supports a progressive matching approach to address small gaps first and gradually adjust larger ones.\n* Prevents excessive distortion by adhering to user-defined tolerance limits.\n\n*\n\nUsage Guidelines\n\n1. Select edges or a complete mesh to apply the command.\n2. Set the distance tolerance to define the maximum adjustment allowed.\n3. Run the command and review the adjustments made to the mesh edges.\n\n_Note_: When working with large tolerances on a complete mesh, unexpected results may occur. It is recommended to use higher tolerances only for specific edges.\n\n*\n\nCommand-Line Options\n\n* PickEdges\\ Allows selection of specific edges to match, ensuring targeted adjustments.\n* DistanceToAdjust\\ Specifies the maximum distance vertices or edges can move during matching.\n* RatchetMode\\ Enables a multi-pass adjustment process, starting with smaller tolerances and progressing to the specified maximum tolerance.\n* AverageVertexesToAdjust\\ Moves vertices to an averaged position rather than relocating one vertex to another.\n* Join\\ Joins input meshes with aligned vertices, effectively merging them.\n\n*\n\nTips for Best Results**","metadata":{"title":"Match Mesh Edge","section":"Match Mesh Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/match-mesh-edge/#match-mesh-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/match-mesh-edge/#match-mesh-edge","collection":"docs7","hash":"79f366e4856ae7a3ab1dd776ecce3401","indexed_by":"docs-index"}},{"content":"Match Mesh Edge — Match Mesh Edge\n\n* Use this command to repair gaps in meshes intended for 3D printing, especially for STL/SLA models.\n* Smaller tolerances are recommended for precise work and to avoid unintended distortions.\n* Always verify the results when working on complex meshes to ensure optimal performance and geometry.\n\nThis tool is ideal for improving the quality and continuity of mesh geometries while maintaining control over tolerances and edge alignment.","metadata":{"title":"Match Mesh Edge","section":"Match Mesh Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/match-mesh-edge/#match-mesh-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/match-mesh-edge/#match-mesh-edge","collection":"docs7","hash":"9de1b8d4dc0150ac3f9f62e3ce6acd80","indexed_by":"docs-index"}},{"content":"Patch Single Face — Patch Single Face\n\nThe PatchSingleFace command fills a hole in a mesh by creating a single mesh face. This is useful for repairing meshes, particularly in cases where there are gaps or missing faces. The command allows you to close the hole by selecting a combination of edges or vertices to form the new face.\n\nhttps://docs.mcneel.com/rhino/8/help/en-us/image/topic_illustrations/patchsingleface.gif\n\n*\n\nSteps to Use\n\n1. Select two edges or vertices around the hole in the mesh.\n2. Run the PatchSingleFace command to create a new face that fills the hole.\n\n*\n\nCommand-line Options\n\n* JoinMesh: When enabled, this option joins the newly created face with the original mesh, ensuring a seamless connection.\n\n*\n\nApplications**\n\n* Mesh Repair: Fill small holes in meshes to improve their integrity and prevent issues during 3D printing or analysis.\n* STL/SLA Printing: Helps prepare meshes by eliminating gaps that could interfere with 3D printing processes, especially for meshes containing long, thin facets.","metadata":{"title":"Patch Single Face","section":"Patch Single Face","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/patch-single-face/#patch-single-face","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/patch-single-face/#patch-single-face","collection":"docs7","hash":"a3bd0307bfb27939eb163907b43f751f","indexed_by":"docs-index"}},{"content":"Rebuild Mesh Normals — Rebuild Mesh Normals\n\nThe RebuildMeshNormals command recalculates the face and vertex normals of a mesh by removing existing normals and generating new ones based on the orientation of the mesh faces. This ensures a consistent and accurate normal direction, which is crucial for proper rendering and 3D printing.\n\n*\n\nKey Features**\n\n* Removes outdated or incorrect mesh normals.\n* Rebuilds face and vertex normals to reflect the actual geometry.\n* Improves mesh compatibility for 3D printing and other applications.\n\n*\n\nSteps to Use\n\n1. Select the mesh objects for which you want to rebuild normals.\n2. Run the RebuildMeshNormals command.\n\n*\n\nApplications\n\nThis command is particularly useful when working with imported or modified meshes that exhibit shading issues, irregularities in rendering, or problems during 3D printing. By recalculating the normals, you can ensure a smoother and more consistent surface appearance and behavior.","metadata":{"title":"Rebuild Mesh Normals","section":"Rebuild Mesh Normals","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/rebuild-mesh-normals/#rebuild-mesh-normals","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/rebuild-mesh-normals/#rebuild-mesh-normals","collection":"docs7","hash":"7b3c1ff2ca40eae24324e5723c0fa83f","indexed_by":"docs-index"}},{"content":"Rebuild Mesh — Rebuild Mesh\n\nThe RebuildMesh command removes all non-essential data from a mesh, such as texture coordinates, vertex colors, surface curvatures, and surface parameters. This command is useful for repairing or simplifying meshes that are not functioning correctly, particularly for 3D printing and prototyping.\n\n*\n\nKey Features**\n\n* Strips unnecessary metadata to simplify the mesh.\n* Recalculates face and vertex normals to ensure proper geometry.\n* Retains vertices and faces, preserving the basic structure of the mesh.\n\n*\n\nSteps to Use\n\n1. Select the mesh objects you want to rebuild.\n2. Execute the command.\n3. Adjust command-line options if needed.\n\n*\n\nCommand-Line Options\n\n* PreserveTextureCoordinates\\ Keeps the existing texture coordinates on the mesh.\n* PreserveVertexColors\\ Retains the original vertex color data on the mesh.\n\n*\n\nApplications\n\nUse RebuildMesh** when a mesh is malfunctioning or contains extraneous data that may hinder performance or cause errors during 3D printing. By recalculating normals and removing unnecessary attributes, this command ensures the mesh is clean, optimized, and ready for further processing or export.","metadata":{"title":"Rebuild Mesh","section":"Rebuild Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/rebuild-mesh/#rebuild-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/rebuild-mesh/#rebuild-mesh","collection":"docs7","hash":"2dc49c7298063f3cb8531b3a59fa7302","indexed_by":"docs-index"}},{"content":"Repair — Repair\n\nThe MeshRepair command opens the Mesh Repair panel, providing tools to analyze and repair problematic meshes efficiently. This is especially useful for preparing models for STL/SLA printing, where issues like long, thin facets can cause errors or performance problems.\n\n*\n\nHow to Use the Mesh Repair Panel\n1. Select a mesh and click Check Mesh**.\n* A detailed report on the mesh is displayed, including an Edge Analysis view.\n2. Identify problems from the report and click Repair to fix them.\n3. After resolving all issues, click Next to access Advanced Repair Tools for further adjustments.\n4. Make final edits and click Finish to complete the repair process.\n\n*","metadata":{"title":"Repair","section":"Repair","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#repair","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#repair","collection":"docs7","hash":"ac84afebe7a0ef7db7ad4999574e4ee1","indexed_by":"docs-index"}},{"content":"Repair — Panel Features and Error Types\n\nThe panel provides a summary of detected mesh errors and tools to address them. Error types are automatically highlighted when detected.\n\nError Statistics and Fixes\n* Degenerate faces:\\ Removes faces with all vertices at the same location.\n* See: `CullDegenerateMeshFaces`.\n* Zero-length edges:\\ Removes edges with overlapping vertices.\n* Duplicate faces:\\ Eliminates overlapping faces.\n* Non-manifold edges:\\ Extracts faces joined by non-manifold edges.\n* See: `ExtractNonManifoldMeshEdges`.\n* Inconsistent normals:\\ Fixes reversed normals.\n* See: `UnifyMeshNormals`.\n* Disjoint pieces:\\ Separates unconnected parts of the mesh.\n* See: `SplitDisjointMesh`.\n\n*","metadata":{"title":"Repair","section":"Panel Features and Error Types","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#panel-features-and-error-types","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#panel-features-and-error-types","collection":"docs7","hash":"faba38472ca4cf6f84b2d891f33ac477","indexed_by":"docs-index"}},{"content":"Repair — Advanced Repair Tools\n\nAdditional tools for precise mesh editing:\n\n* Align Vertices: Aligns selected vertices. (`AlignVertices`)\n* Match Edges: Adjusts mesh edges to align. (`MatchMeshEdge`)\n* Delete Faces: Removes unwanted faces. (`DeleteFaces`)\n* Patch Face: Repairs individual faces. (`PatchSingleFace`)\n* Fill Hole: Closes a specific mesh hole. (`FillMeshHole`)\n* Fill All Holes: Automatically closes all detected holes. (`FillMeshHoles`)\n* Split Edges: Splits selected mesh edges. (`SplitMeshEdge`)\n* Swap Edge: Adjusts edge connections. (`SwapMeshEdge`)\n* Rebuild Mesh: Reconstructs the mesh with uniform topology. (`RebuildMesh`)\n* Unify Normals: Ensures all normals are consistent. (`UnifyMeshNormals`)\n* Undo: Reverts the last action. (`Undo`)","metadata":{"title":"Repair","section":"Advanced Repair Tools","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#advanced-repair-tools","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/repair/#advanced-repair-tools","collection":"docs7","hash":"a3b4044929c92bcb2fda0f545641b582","indexed_by":"docs-index"}},{"content":"Swap Mesh Edge — Swap Mesh Edge\n\nThe SwapMeshEdge command transposes (swaps) the corners of mesh triangles that share an edge. This operation is useful for adjusting the mesh topology, often to improve the structure of a mesh for further modeling or 3D printing.\n\n*\n\nSteps to Use\n\n1. Select a shared mesh edge (the edge must be shared by two faces).\n2. Execute the SwapMeshEdge command to transpose the corners of the mesh triangles that share the selected edge.\n\n*\n\nApplications\n\n* Mesh Repair: The SwapMeshEdge command helps adjust the geometry of mesh faces, particularly when correcting edge-related issues.\n* STL/SLA Printing: When preparing meshes for 3D printing, this command can improve mesh quality and prevent printing errors caused by poorly defined edges.\n\n*\n\nImportant Notes**\n\n* Only edges shared by two faces can be selected for this operation.\n* Mesh edges and other subparts are not selectable in shaded view mode.","metadata":{"title":"Swap Mesh Edge","section":"Swap Mesh Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/swap-mesh-edge/#swap-mesh-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/swap-mesh-edge/#swap-mesh-edge","collection":"docs7","hash":"5a574500f29528448dd022a3e694841c","indexed_by":"docs-index"}},{"content":"Unify Mesh Normals — Unify Mesh Normals\n\nThe UnifyMeshNormals command ensures that all face normals in a mesh object point in a consistent direction. This is particularly useful when cleaning up meshes for 3D printing or exporting them into other software. Consistent normal direction helps prevent errors in rendering or 3D printing, especially in STL/SLA formats.\n\n*\n\nSteps to Use\n\n1. Select a single unjoined mesh object.\n2. Run the UnifyMeshNormals command to adjust the normals of all faces in the mesh so they point to one side of the object.\n3. (Optional) After using UnifyMeshNormals, you can verify the consistency of the normals by displaying front and back faces in different colors using the Display Modes Options.\n4. If the command doesn’t seem to affect the mesh, try exploding it and rejoining after ensuring the normals are unified.\n\n*\n\nApplications\n\n* Mesh Repair: Unifying normals ensures that the mesh has a consistent structure and directionality, which is important for cleaning up the mesh for export or further processing.\n* STL/SLA Printing: Inconsistent normals can lead to poor 3D print quality, including inverted faces or issues with surface rendering. This command corrects such problems.\n\n*\n\nAdditional Notes**\n\n* A polygon mesh has both vertex normals and face normals. The UnifyMeshNormals command primarily adjusts the face normals to be consistent across the mesh.\n* The direction of the face normal is typically determined by the order of vertices in a polygon (clockwise or counterclockwise). You can use the right-hand rule to determine the correct normal direction.\n* If UnifyMeshNormals doesn’t work as expected, try exploding the mesh, correcting the normals, and then rejoining the mesh.\n\n*\n\nExample Use Case","metadata":{"title":"Unify Mesh Normals","section":"Unify Mesh Normals","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/unify-mesh-normals/#unify-mesh-normals","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/unify-mesh-normals/#unify-mesh-normals","collection":"docs7","hash":"628f2f416b167ce8a57c1111c39771ca","indexed_by":"docs-index"}},{"content":"Unify Mesh Normals — Unify Mesh Normals\n\n1. Import an STL file with holes.\n2. Fill the holes in the mesh.\n3. Weld the mesh by setting the welding angle to 180° to ensure all vertices are welded together.\n4. Run UnifyMeshNormals to ensure all face normals point in the same direction.\n5. Use the Flip** command if needed to correct the direction of the normals.\n6. Export the mesh in the desired format.","metadata":{"title":"Unify Mesh Normals","section":"Unify Mesh Normals","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/unify-mesh-normals/#unify-mesh-normals","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/unify-mesh-normals/#unify-mesh-normals","collection":"docs7","hash":"8ad23cfc48d11450e3f296c0ad195456","indexed_by":"docs-index"}},{"content":"Weld — Weld\n\nThe Weld command removes creases from a mesh by merging coincident mesh vertices. This helps smooth out the mesh and eliminate unwanted sharp edges. As vertices are merged, individual texture mapping, color, and normal vector data are averaged or discarded for the affected vertices. New vertex normals are created as averages of the adjacent face normals.\n\n*","metadata":{"title":"Weld","section":"Weld","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#weld","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#weld","collection":"docs7","hash":"50e2b76982823040c0acaa521ea794b1","indexed_by":"docs-index"}},{"content":"Weld — How to Use the Weld Command\n\n1. Select a mesh to apply the weld.\n2. Specify the angle tolerance value that determines how closely aligned the adjacent faces must be for their vertices to be welded.\n\n*\n\nCommand-Line Options\n* Angle Tolerance\\ Sets the maximum angle between the faces that will allow their coincident vertices to be merged into a single vertex.\n* If two naked edge points are coincident, and their neighboring faces are within the specified angle tolerance, they will be replaced by one vertex.\n* If the points belong to different sub-meshes of a joined mesh, the meshes will merge into one, and the resulting mesh cannot be exploded.\n* As you adjust the tolerance, the mesh edges that are within the tolerance for welding will be highlighted.\n\n*\n\nThis command is useful for cleaning up meshes by removing unnecessary creases and ensuring smooth transitions between adjacent faces, improving the overall appearance and geometry of the model.","metadata":{"title":"Weld","section":"How to Use the Weld Command","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#how-to-use-the-weld-command","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#how-to-use-the-weld-command","collection":"docs7","hash":"9bd948367b86119c51a527f52c7f0695","indexed_by":"docs-index"}},{"content":"Weld — Weld Vertices\n\nThe WeldVertices command merges selected coincident vertices on joined mesh edges into single vertices.\n\n&#x20;\n\nOr, converts selected SubD creased vertices into smooth vertices.\n\nSupported input**\n\n* Mesh Vertex, Control point.\n* SubD Vertex, Edit point, Control point\n\nWeld Edge\nThe WeldEdge command:\n\n* Merges coincident mesh vertices along selected unwelded mesh edges.\n* Smooths selected creased edges in SubDs.","metadata":{"title":"Weld","section":"Weld Vertices","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#weld-vertices","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair/weld/#weld-vertices","collection":"docs7","hash":"8b8d756916445bdbaec02d1a986a42f9","indexed_by":"docs-index"}},{"content":" Apply Mesh — Apply Mesh\n\nThe ApplyMesh command uses texture UV coordinates to map a mesh onto a surface.\n\n* If the target surface is trimmed, the untrimmed surface is used.\n* ApplyMesh only accepts meshes with UV coordinates embedded. Meshes imported from STL files do not work.\n* ApplyMesh is sensitive to the u and v directions of a surface. Use the Dir command to swap the u and v directions.","metadata":{"title":" Apply Mesh","section":"Apply Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/apply-mesh/#apply-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/apply-mesh/#apply-mesh","collection":"docs7","hash":"665085744ea9f3e56ba88cf896e2cb67","indexed_by":"docs-index"}},{"content":" Apply Mesh — Steps\n\n1. Select a mesh.\n2. Select the target surface.","metadata":{"title":" Apply Mesh","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/apply-mesh/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/apply-mesh/#steps","collection":"docs7","hash":"317a79b96cbb0bacc7cd2f2a39e28e1d","indexed_by":"docs-index"}},{"content":"Split Disjoint Mesh — Split Disjoint Mesh\n\nThe SplitDisjointMesh command divides into separate objects meshes that do not connect, but are still one object.\\\n\n* Some STL/SLA printers have problems if meshes contain many long, thin facets. These facets can slow the printer down, produce odd results, or run the printer out of memory.\n* The MeshRepair command may be useful when tuning up meshes for STL/SLA printing.","metadata":{"title":"Split Disjoint Mesh","section":"Split Disjoint Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/split-disjoint-mesh/#split-disjoint-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/split-disjoint-mesh/#split-disjoint-mesh","collection":"docs7","hash":"aee72be033469ff072aa1bcce9269cdf","indexed_by":"docs-index"}},{"content":"Split Mesh Edge — Split Mesh Edge\n\nThe SplitMeshEdge command divides a mesh edge to create two or more triangles.\n\nUse the SplitMeshEdge command to specify how you want to split faces, and then match an adjacent mesh using the MatchMeshEdge command.\n\n* Some STL/SLA printers have problems if meshes contain many long, thin facets. These facets can slow the printer down, produce odd results, or run the printer out of memory.\n* The MeshRepair command may be useful when tuning up meshes for STL/SLA printing.","metadata":{"title":"Split Mesh Edge","section":"Split Mesh Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/split-mesh-edge/#split-mesh-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-repair-advanced/split-mesh-edge/#split-mesh-edge","collection":"docs7","hash":"a0ea6f885120adac1c1b41a31e459500","indexed_by":"docs-index"}},{"content":"Quad Remesh — Quad Remesh\n\nThe QuadRemesh command quickly creates a quad mesh with optimized topology from existing surfaces, meshes, or SubDs. It uses a unique algorithm to generate manageable polygon meshes, ideal for rendering, animation, CFD, FEA, and reverse-engineering.\n\nTarget Edge Length\nSets the approximate edge length of the output mesh.\n\n* This setting is scale dependent. The resulting face count increases with object scale.\n* Re-meshing would fail if the target edge length is set too large for the object size.","metadata":{"title":"Quad Remesh","section":"Quad Remesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#quad-remesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#quad-remesh","collection":"docs7","hash":"af886929a0a5e304e2621379ae4761cb","indexed_by":"docs-index"}},{"content":"Quad Remesh — Target Quad Count\n\nSets the approximate face count of the output mesh as a goal for the algorithm.\n\n* This setting is scale independent. An input object in different scales produces a similar face count.\n\nAdaptive Size (0-100)\n\nSet 0 to get a minimal number of quads and uniform sizes. A value above 30 will diminish your control of getting a smaller number of quads. Higher values result in smaller quads in high curvature areas. Set 100 to keep more details.","metadata":{"title":"Quad Remesh","section":"Target Quad Count","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#target-quad-count","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#target-quad-count","collection":"docs7","hash":"727cb14145863e69675bec535eb5f1fe","indexed_by":"docs-index"}},{"content":"Quad Remesh — Use Surface Edges (Polysurface/Extrusion only)\n\nSpecifies if meshes edges will be created along the sub-face boundaries on the input object.\n\n* Off: Ignores sub-face boundaries.\n\n* Smart: Retains sub-face boundaries except for the ones being determined as meaningless by the algorithm. This is usually the best choice.\n\n* Strict: Retains all sub-face boundaries.","metadata":{"title":"Quad Remesh","section":"Use Surface Edges (Polysurface/Extrusion only)","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#use-surface-edges-polysurfaceextrusion-only","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#use-surface-edges-polysurfaceextrusion-only","collection":"docs7","hash":"76407492b8fad6c711b126311e633528","indexed_by":"docs-index"}},{"content":"Quad Remesh — Symmetry Axis: X Y Z\n\nSelect to perform symmetrical re-meshing across the X, Y, or Z central plane of the object's bounding box. Multiple axes can be selected. It only makes sense for symmetrical objects and when the correct symmetrical plane is selected.\n\nGuide Curves\nThe quad re-meshing algorithm will try to place edge loops or edge rings along guide curves. Guide Curves can be used to define more details, or simply influence the direction of quad re-meshing in a region. Guide curves must be projected onto the input object to have an effect. Click Select Curves to select guide curves.\n\nCurve Influence: These options control how guide curves affect the final quad mesh.\n\n* None: No effect on the result.\n* Approximate: Adjusts the general direction of the quads by influencing their natural flow. The guide curves have a weak effect on the result.\n\n* Create Edge Ring: Orients the crossing edges perpendicular to the guide curves. The guide curves have a stronger effect on the result, but edge rings may not follow guide curves exactly.\n\n* Create Edge Loop: Places edge loops along guide curves. The guide curves have the strongest effect on the result.\n\nDetect Hard Edges\n\nUses a 30-degree break angle threshold to divide the quad mesh with hard edges (creased edges). If the break angle between two adjacent faces is larger than 30 degrees, a hard edge loop will be added.","metadata":{"title":"Quad Remesh","section":"Symmetry Axis: X Y Z","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#symmetry-axis-x-y-z","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quad-remesh/#symmetry-axis-x-y-z","collection":"docs7","hash":"40d5852f6b0c2c02bf9c931acf040944","indexed_by":"docs-index"}},{"content":"Quadrangulate Mesh — Quadrangulate Mesh\n\nThe QuadrangulateMesh command merges mesh triangles into quadrangles.\n\nDiagonals that are unwelded (have unique vertexes at the corners) will not be considered as candidates for merging triangles into quadrangles.\n\nCommand-line options\n* Planarity: The angle between the face normals of the triangles.\n* Rectangularity: Specify a number greater than or equal to 1. If the adjacent triangles pass the planarity test then they will be merged into a quadrangle if the largest ratio of the lengths of the diagonal is less than or equal to the number you typed, then the triangles are converted to quadrangle.\n* Increment: Increment value used by the spinner controls.","metadata":{"title":"Quadrangulate Mesh","section":"Quadrangulate Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quadrangulate-mesh/#quadrangulate-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/quadrangulate-mesh/#quadrangulate-mesh","collection":"docs7","hash":"43685c4041dc77c8dac86a83192444b8","indexed_by":"docs-index"}},{"content":"Reduce Mesh — Reduce Mesh\n\nThe ReduceMesh command decreases the polygon mesh face count while minimizing geometric and texture distortion.\\\n\nNote\n\n* The mesh is first triangulated, its polygon count is reduced, and the resulting triangular mesh is quadrangulated again.\n* Nonmanifold meshes (meshes whose edges are shared by more than two faces) may produce undesirable results in some cases.","metadata":{"title":"Reduce Mesh","section":"Reduce Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/reduce-mesh/#reduce-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/reduce-mesh/#reduce-mesh","collection":"docs7","hash":"578a236ab95cbe23c063ef5155b2519f","indexed_by":"docs-index"}},{"content":"Reduce Mesh — Steps\n\n1. Select mesh objects.\n2. Set the mesh reducing options.","metadata":{"title":"Reduce Mesh","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/reduce-mesh/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/reduce-mesh/#steps","collection":"docs7","hash":"9b3a34c2cb18b532cd90df824afcbcad","indexed_by":"docs-index"}},{"content":"Triangulate Mesh — Triangulate Mesh\n\nThe TriangulateMesh command splits all planar quadrangular polygon mesh faces into two triangular mesh faces.","metadata":{"title":"Triangulate Mesh","section":"Triangulate Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/triangulate-mesh/#triangulate-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/mesh-retopology/triangulate-mesh/#triangulate-mesh","collection":"docs7","hash":"8bc53729794d1e128a0102670ba03a54","indexed_by":"docs-index"}},{"content":"Sel Mesh — Sel Mesh\n\nThe SelMesh command selects all mesh objects.\n\nSel Closed Mesh\nThe SelClosedMesh command selects all closed mesh objects.\n\nSel Open Mesh\nThe SelOpenMesh command selects all open mesh objects.\n\nSel Visible\nThe SelVisible command selects all surfaces or meshes that are in front of other objects in the active viewport with a crossing selection.\n\nSteps\n\n* Drag a crossing selection.\n\nNote: The SelVisible command does not work with block instances since they are drawn using their own draw lists that have no relationship with other objects in the model.","metadata":{"title":"Sel Mesh","section":"Sel Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-mesh","collection":"docs7","hash":"d36c1bf911bef197d90eca66719f1051","indexed_by":"docs-index"}},{"content":"Sel Mesh — Sel Edge Loop\n\nThe SelEdgeLoop command selects a loop of mesh/SubD edges by picking an edge in the loop.\n\nSteps\n\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest of edges in the loop.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the loop.\n2. Press Enter to accept the selection.\\ An edge loop is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the edges to deselect individually.\n\n* This command only works on meshes with UV information.\n* This command can be used when a command prompts for selecting mesh/SubD edges.","metadata":{"title":"Sel Mesh","section":"Sel Edge Loop","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-edge-loop","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-edge-loop","collection":"docs7","hash":"e6ee28584ab47f92ef1028bc58b5f1bf","indexed_by":"docs-index"}},{"content":"Sel Mesh — Sel Edge Ring\n\nThe SelEdgeRing command selects a ring of mesh/SubD edges by picking an edge in the ring.\n\nSteps\n\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest edges in the ring.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the ring.\n2. Press Enter to accept the selection.\\ An edge ring is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the edges to deselect individually.\n\n* This command only works on meshes with UV information.\n* This command can be used when a command prompts for selecting mesh/SubD edges.","metadata":{"title":"Sel Mesh","section":"Sel Edge Ring","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-edge-ring","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-edge-ring","collection":"docs7","hash":"2624d8f64dd2fe8c1e90d7401d6c9837","indexed_by":"docs-index"}},{"content":"Sel Mesh — Sel Face Loop\n\nThe SelFaceLoop command selects a loop of mesh/SubD faces by picking an edge between any two faces in the loop.\n\nSteps\n\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest edges in the loop.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the loop.\n2. Press Enter to accept the selection.\\ A face loop is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the faces to deselect individually.\n\n* This command only works on meshes with UV information.\n* This command can be used when a command prompts for selecting mesh/SubD faces.","metadata":{"title":"Sel Mesh","section":"Sel Face Loop","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-face-loop","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/sel-mesh/#sel-face-loop","collection":"docs7","hash":"42a4ef80caa66d1018a13a4b7ca1f0b7","indexed_by":"docs-index"}},{"content":"Crease — Crease\n\nThe Crease command changes smooth SubD edges/vertices into creased edges/vertices, or welded mesh edges into unwelded edges.\n\nAdd creases to a SubD (left) and a mesh (right).\n\nInput\n* SubD edges and vertices\n* SubD control net edges and Points\n* Mesh edges","metadata":{"title":"Crease","section":"Crease","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/crease/#crease","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/crease/#crease","collection":"docs7","hash":"d7ea14ab5dc0a7f426d4689ab0613921","indexed_by":"docs-index"}},{"content":"Extrude Mesh — Extrude Mesh\n\nThe ExtrudeMesh command extrudes mesh faces and boundary edges with different direction modes.\n\nSteps\n1. Start the command.\n2. Select mesh faces or boundary edges to extrude.\n\nTo extrude a whole mesh, select the mesh before starting the command.\n3. Set command-line options.\n4. Pick or enter the extrusion distance.","metadata":{"title":"Extrude Mesh","section":"Extrude Mesh","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/extrude-mesh/#extrude-mesh","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/extrude-mesh/#extrude-mesh","collection":"docs7","hash":"ba8b346f67caf865e8f542a642731af6","indexed_by":"docs-index"}},{"content":"Extrude Mesh — Command-line options\n\nEdgeLoop: Pick an edge on the boundary to select an edge loop.\n\nBasis\n\n* WCS: All faces or boundary edges extrude in the same direction based on world coordinates.\n* Direction\n* Free: The direction is picked freely.\n* X/Y/Z: The direction is fixed to the world X, Y, or Z axis.\n\n* UVN: Each face or edge extrudes in the direction based on UVN coordinates.\n* Direction\n* Free: The direction is picked freely.\n\n* V (Boundary edges only): Boundary edges extrude along the extending direction of the faces.\n\n* N: Faces extrude along vertex normal directions.\n\n* Boundary edges extrude perpendicular to the faces.\n\nSetBasePoint\n\nPicks a point as the starting point of the extruding distance.","metadata":{"title":"Extrude Mesh","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/extrude-mesh/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/extrude-mesh/#command-line-options","collection":"docs7","hash":"ff5400b727b0d19b2dd4dbef6c9db242","indexed_by":"docs-index"}},{"content":"Insert Point — Insert Point\n\nThe InsertPoint command adds vertices and edges to a Mesh or SubD along the picked points on edges.\n\nInput\n* SubD / Mesh Edge\n\nSteps\n1. Select a mesh or SubD.\n2. Pick points on edges.\n\nOptions\nUndo: Removes the last picked point.","metadata":{"title":"Insert Point","section":"Insert Point","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insert-point/#insert-point","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insert-point/#insert-point","collection":"docs7","hash":"c14a9694befea6bf4c2a4b9b16f14d93","indexed_by":"docs-index"}},{"content":"InsertEdge (loop) — InsertEdge (loop)\n\nThe InsertEdge command inserts edges beside an edge loop (left) or across an edge ring (right) on a SubD or mesh.\n\n* When edges fail to insert, the defective geometry is marked with a text dot. The secondary text in the text dot properties gives a hint of what should be repaired.\n\nType\nLoop: Insert edges beside the selected edge loop.\n\n* BothSides: Insert edges on both sides of the selected edge loop.\n\nRing: Insert edges across the selected edge ring.","metadata":{"title":"InsertEdge (loop)","section":"InsertEdge (loop)","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insertedge-loop/#insertedge-loop","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insertedge-loop/#insertedge-loop","collection":"docs7","hash":"e53a472acdca2e8d6412b1a7812edc3d","indexed_by":"docs-index"}},{"content":"InsertEdge (loop) — Mode\n\nFull: Select an entire edge loop (left) or ring (right) based on the Type option to insert edges.\n\nRange: Select the start and end edges in a range of loop (left) or ring (right) based on the Type option to insert edges.\n\nOffsetMode\nProportional: The amount is proportional to each crossing edge length. The input number should be between 0 and 1.0.\n\nAbsolute: The amount is same for all edges. The input number is a distance in the model unit.","metadata":{"title":"InsertEdge (loop)","section":"Mode","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insertedge-loop/#mode","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/insertedge-loop/#mode","collection":"docs7","hash":"0bdcbde490ea9a8e0c0123d69deb8798","indexed_by":"docs-index"}},{"content":"Inset — Inset\n\nThe Inset command inserts edges by offsetting the edges of selected mesh, SubD, or polysurface faces a certain distance inwards.\n\nInput\n* Mesh/SubD faces\n* Surfaces and polysurface faces\n\nTo inset selected faces\n1. Select mesh, SubD, or polysurface faces.\n2. Enter a distance or pick two points to define the distance.","metadata":{"title":"Inset","section":"Inset","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/inset/#inset","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/inset/#inset","collection":"docs7","hash":"10b32f855838a07714f9461628516c61","indexed_by":"docs-index"}},{"content":"Inset — Command-line options\n\nMode (For multiple SubD faces only)\n\n* Group (left) insets connected SubD faces as a unit.\n* Single (right) insets SubD faces individually.\n\n(Surface-only options below)\nThroughPoint: Pick a point for the inset curve to pass through.\n\nLoose: Loose=On does not refine the inset curves to be in the system tolerance as Loose=Off does. The refinement process could be time consuming so the preview uses Loose=On to speed up.\n\nIgnoreSeams: Ignores the seam of the input surface.\n\na) Input, b) IgnoreSeams=No, c) IgnoreSeams=Yes\n\nSplit: Splits the input surface; otherwise creates the inset curves only.\n\n* JoinOutputs: When Split=Yes, specifies whether the resulting surfaces will be joined.","metadata":{"title":"Inset","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/inset/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/inset/#command-line-options","collection":"docs7","hash":"d2ca16257107c699cc2c19b8047c726b","indexed_by":"docs-index"}},{"content":"Remove Crease — Remove Crease\n\nThe RemoveCrease command smoothes creased SubD edges/vertices, or welds mesh edges.\n\nRemove creased edges on a SubD (left) and a mesh (right).\n\nInput\n* SubD edges and vertices\n* SubD control net edges and Points\n* Mesh edges","metadata":{"title":"Remove Crease","section":"Remove Crease","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/remove-crease/#remove-crease","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/remove-crease/#remove-crease","collection":"docs7","hash":"95991a2de8ab0a700e20157ab58ab36e","indexed_by":"docs-index"}},{"content":"Slide — Slide\n\nThe Slide command moves selected vertices (or vertices of selected edges) along adjacent edges.\n\nInput:\n* Mesh/SubD edge or edge loop\n* Mesh/SubD vertex\n\nSteps\n1. Select mesh/SubD edges, edge loops, or vertices.\n2. Move the mouse cursor and click.\n\nOr, type a value and press Enter.\n\nThe arrows point out the positive direction that is used for value input.","metadata":{"title":"Slide","section":"Slide","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#slide","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#slide","collection":"docs7","hash":"8356bcc632a1818afdac4db53e64afc2","indexed_by":"docs-index"}},{"content":"Slide — Edge selection mode\n\n(Default): Click selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n\nEdgeLoop: Click an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.","metadata":{"title":"Slide","section":"Edge selection mode","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#edge-selection-mode","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#edge-selection-mode","collection":"docs7","hash":"0d59235f57fdffb05535c5c2efe7036e","indexed_by":"docs-index"}},{"content":"Slide — OffsetMode\n\nProportional: The amount is proportional to each crossing edge length. The input number should be between 0 and 1.0.\n\n| |\n| ------------------------------------------------------------------------------------------------------------------------------- |\n\nAbsolute: The amount is same for all edges. The input number is a distance in the model unit.","metadata":{"title":"Slide","section":"OffsetMode","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#offsetmode","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#offsetmode","collection":"docs7","hash":"6a9e588a3e713e1758e2e8164fa09413","indexed_by":"docs-index"}},{"content":"Slide — Smoothness (0 - 1.0)\n\n0 moves vertices linearly along the edges towards the next vertices. 1.0 moves vertices in the most curved path towards the next vertices.\n\n| | |\n| ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| 0 | 1.0 |","metadata":{"title":"Slide","section":"Smoothness (0 - 1.0)","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#smoothness-0---10","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#smoothness-0---10","collection":"docs7","hash":"3d04376227cc67d871fc40e76b03fda7","indexed_by":"docs-index"}},{"content":"Slide — Direction=Across/Along\n\nMoves edges in the side direction (Across), or in the edge direction (Along).\n\n| | |\n| --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |\n| Across | Along |","metadata":{"title":"Slide","section":"Direction=Across/Along","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#directionacrossalong","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/slide/#directionacrossalong","collection":"docs7","hash":"88c5aa6870608d7853e3de76b9aff143","indexed_by":"docs-index"}},{"content":"Stitch — Stitch\n\nThe Stitch command matches the positions of a pair of mesh/SubD vertices.\n\nInput\n* Mesh edges, vertices, control points\n* SubD edges, vertices, control points\n\nExample\n1. Select the first set of edges, press Enter.\n\nOr, select the first vertex.\n2. Select the second set of edges, press Enter.\n\nOr, select the second vertex.\n\nThe number of edges in both sets must match.\n3. Pick the stitch location. Press Enter to stitch at the average location.\n\nOr, select a stitch location option in the command-line.\n\n* If the vertex or edge pairs belong to different objects, the two objects will be combined into a single object.\n* Display SubD in Flat Mode by pressing Tab to help picking SubD vertices.\n* Use preselect to stitch multiple vertices.","metadata":{"title":"Stitch","section":"Stitch","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#stitch","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#stitch","collection":"docs7","hash":"42597980810237005f385a5b289b3331","indexed_by":"docs-index"}},{"content":"Stitch — Edge selection mode\n\n* (Default) Click selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n\n* EdgeLoop: Click an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.\n\nThe Edges option also allows selecting a pair of vertices.","metadata":{"title":"Stitch","section":"Edge selection mode","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#edge-selection-mode","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#edge-selection-mode","collection":"docs7","hash":"348b12f2347bab7372d21cc3804f56eb","indexed_by":"docs-index"}},{"content":"Stitch — Stitch location\n\n* Average: Right-click to stitch at the average location.\n* First: Stitch at the location of the first set.\n* Second: Stitch at the location of the second set.","metadata":{"title":"Stitch","section":"Stitch location","url":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#stitch-location","source":"https://www.rhinoartisan.com/docs/7/tabs/mesh/vertex-and-edge-operations/stitch/#stitch-location","collection":"docs7","hash":"62607c63fac18061dace4a98176b02e0","indexed_by":"docs-index"}},{"content":"Emboss — Emboss\n\nEmboss is the relief modelling tool of RhinoArtisan 7 and the successor of RhinoEmboss. Instead of working directly on geometry, it builds a 2.5D height field — a grid of heights over a flat workbench — from an ordered stack of operations. Each operation writes its own layer into the grid, the layers are merged from top to bottom, and the final field is converted into an open relief mesh or into a closed solid with thickness.\n\nThe whole project is stored inside the `.3dm` file, so closing and reopening the command resumes exactly where you left it, with every operation still editable.\n\nRun it by typing `ArtisanEmboss` in the command line. Any curves already selected when the command starts become the first operation.\n\nWhy a height field? Because every operation shares the same grid, you can stack a signet plateau, an engraved monogram, a photo relief and a smoothing pass on top of each other and still go back and change any of them. Nothing is baked until you build the output mesh.","metadata":{"title":"Emboss","section":"Emboss","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#emboss","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#emboss","collection":"docs7","hash":"c533e4abf19457b02efd2455d76fe9cf","indexed_by":"docs-index"}},{"content":"Emboss — How it works\n\n1. The workbench. A plane (World XY by default) with a size in millimetres — 50 × 50 mm out of the box. The grid is centred on the plane origin and heights grow along its normal.\n2. The operation stack. Each entry rasterises itself into a layer. Layers are merged in list order using the operation's Combine mode, so order matters.\n3. Recompute. Only the operations whose parameters or referenced geometry changed are re-rasterised; the rest come from cache. This is why the preview stays responsive even with a heavy stack.\n4. The output. The finished field becomes a mesh (open relief) or a solid (relief plus a base offset downwards by the cap distance).\n\nIf an operation references a curve or an object that you later delete, it is flagged as broken in the panel and skipped — nothing fails, and it comes back to life as soon as you point it at new geometry.","metadata":{"title":"Emboss","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#how-it-works","collection":"docs7","hash":"cb3c4120f3a257e64037ae8db0782a2f","indexed_by":"docs-index"}},{"content":"Emboss — Steps\n\n* Run `ArtisanEmboss`.\n* Open Project Settings and set the workbench size, plane and resolution for the piece you are working on.\n* Add operations with the + Profile, + Extrude, + Image, + Geometry, + Sculpt, + Smooth and + Texture buttons.\n* Select each operation to edit it: pick its geometry, choose the combine mode and set the height, the feather and the profile.\n* Reorder the stack with ▲ / ▼ until the relief reads the way you want.\n* Confirm to build the output mesh or solid.","metadata":{"title":"Emboss","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#steps","collection":"docs7","hash":"199cca46394709d50b8664bf4427685a","indexed_by":"docs-index"}},{"content":"Emboss — Operations\n\nThe top panel is the stack itself. Every card is one operation, with its own colour, an on/off switch, duplicate and delete.\n\n| Button | What it adds |\n| --- | --- |\n| + Profile | Closed curves raised with a shaped cross-section (the classic embossing operation). |\n| + Extrude | Closed curves raised straight up, with no profile shaping. |\n| + Image | A greyscale image used as a heightmap. |\n| + Geometry | Existing document geometry projected into the height field. |\n| + Sculpt | A freehand brush that pushes and pulls the field directly. |\n| + Smooth | A blur pass that filters everything underneath it in the stack. |\n| + Texture | A tiled texture object that modulates the relief. |\n\n* ▲ / ▼ — move the selected operation up or down the stack. Because combine modes are order-dependent, this changes the result.\n* Hide / Show — toggles the live preview of the relief in the viewport.","metadata":{"title":"Emboss","section":"Operations","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operations","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operations","collection":"docs7","hash":"fae511e9a3fb0383a669ffa6e0099368","indexed_by":"docs-index"}},{"content":"Emboss — Advanced\n\n* Project Settings — opens the workbench and output dialog (below).\n* Export Heightmap (TIFF 16-bit) — writes the current field to a 16-bit TIFF, ready for external engraving or CNC software.","metadata":{"title":"Emboss","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#advanced","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#advanced","collection":"docs7","hash":"204e22f67a3f94591e7e7892e4c7d2fc","indexed_by":"docs-index"}},{"content":"Emboss — Operation editor\n\nSelecting an operation replaces the list with its parameters.\n\n#### Combine\n\nHow this operation's layer merges into everything below it. The layer's own mask always attenuates the effect, so a soft edge blends smoothly in every mode.\n\n* Add — heights are summed. The default.\n* Subtract — heights are subtracted, carving into the relief.\n* Union Highest — keeps whichever of the two is taller.\n* Union Lowest — keeps whichever of the two is lower.\n* Absolute — no merge at all: inside its mask, the layer replaces what is underneath.\n* Multiply — the layer acts as a scale factor over the existing relief. This is the mode to use when modulating a shape with a texture.\n\n#### Height and feather\n\n* Height (mm) — how far the operation lifts the field. Range −50 to 50 mm, step 0.1, default 1. Negative values push down.\n* Feather (mm) — softens the border of the mask so the operation fades into its surroundings. Range 0 to 20 mm, step 0.1, default 0.\n\n#### Profile\n\nAvailable on profile operations. It controls the cross-section of the raised shape:\n\n* Round — a circular takeoff, the classic domed emboss.\n* Smooth — a smoothstep pillow, tangent at both the edge and the centre.\n* Chamfer — a straight ramp.\n* Plateau — a flat top with shaped sides.\n\nEdit opens the profile editor, where you can draw your own curve — click to add a point, drag to move it, right-click to delete. The left of the graph is the edge of the shape and the right is its centre. Profiles you save are stored in your user folder and reappear in the list for any project.\n\n#### Inflate","metadata":{"title":"Emboss","section":"Operation editor","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operation-editor","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operation-editor","collection":"docs7","hash":"c6e414b20bec82239da8008b3cdd6082","indexed_by":"docs-index"}},{"content":"Emboss — Operation editor\n\n* Inflate — the shaped section spans the full width available inside the curve, so wide areas rise higher than narrow ones.\n* Fixed Width — the section always uses the width you set, giving a constant border regardless of the shape of the curve.\n\n* Width (mm) — the section width used by Fixed Width. Range 0.05 to 100 mm, step 0.1, default 2.\n* Starting Height — the height at which the section begins, useful to sit an operation on top of another one. Range −50 to 50, step 0.1, default 0.\n\n#### Image operations\n\n* Load Image — picks the greyscale file used as a heightmap.\n* Invert — swaps black and white, turning peaks into valleys.\n* Scale — size of the image over the workbench. Range 0.05 to 10, step 0.05, default 1.\n\n#### Sculpt operations\n\n* Radius — brush size. Range 0.1 to 20, default 3.\n* Strength — brush intensity. Range 5% to 100%, default 50%.\n* Hold Ctrl while dragging to invert the brush and carve instead of raise.\n\n#### Smooth operations\n\n* Smooth Radius (mm) — blur radius applied to everything below in the stack. Range 0.1 to 20, step 0.1, default 1.\n\nSmooth is a filter, not a layer: it always runs fresh over the accumulated field, which is why its position in the stack matters so much.\n\n#### Texture operations\n\n* Object selector — the geometry whose surface supplies the texture.\n* Tiles U / Tiles V — how many times the texture repeats in each direction. Range 0.25 to 100, step 0.25, default 4.\n* Invert — flips the texture's highs and lows.","metadata":{"title":"Emboss","section":"Operation editor","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operation-editor","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#operation-editor","collection":"docs7","hash":"44f772d358aa071e83fcfcbb2e2ec5a2","indexed_by":"docs-index"}},{"content":"Emboss — Project Settings\n\n| Setting | Values | Default |\n| --- | --- | --- |\n| Width | 1 – 1000 mm | 50 mm |\n| Height | 1 – 1000 mm | 50 mm |\n| Resolution | 512 · 1024 · 2048 | 512 |\n| Output | Mesh · Thickness | Thickness |\n| Cap Distance | 0.05 – 50 mm | 1 mm |\n| Delete Base | on / off | off |\n\n* Width / Height — the size of the workbench in model units. Grid cells are always square, so the shorter side is derived from the longer one.\n* Resolution — grid nodes along the longer side of the workbench. Higher values capture finer detail and cost more to recompute.\n* Output — Mesh produces the open relief surface; Thickness closes it into a solid by offsetting the relief downwards.\n* Cap Distance — how far the base sits below the relief when the output is Thickness.\n* Delete Base — leaves the flat backing out of the result.\n* Workbench — where the relief lives. World XY and Active CPlane set the plane directly; Pick Center lets you click the origin in the viewport, and Pick Area lets you drag the rectangle, setting plane and size in one go.\n\nGoldsmith Tip: for a signet top, start with a Profile operation on the outline in Plateau with Fixed Width to get a crisp bezel, then add the monogram as a second Profile operation in Add mode. Finish with a short Smooth pass — 0.2 to 0.4 mm is usually enough — to take the digital edge off the transitions without losing the engraving.\n\nResolution changes invalidate the cached layers of every operation, so the next recompute is a full one. Work at 512 while you design and raise it to 1024 or 2048 only for the final build.","metadata":{"title":"Emboss","section":"Project Settings","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#project-settings","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/emboss/#project-settings","collection":"docs7","hash":"483e8618a006cbf90090d89f2a73a667","indexed_by":"docs-index"}},{"content":"Reduce Thickness\n\nReduce Thickness takes grams out of a piece without redesigning it: you brush the side you want to hollow, and the metal sinks inward — stopping exactly at the minimum wall thickness you set. A live heat map shows where the walls stand, and the panel reports the weight saved as you work.\n\n`ArtisanReduceThickness` (run it from the command line)","metadata":{"title":"Reduce Thickness","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/","collection":"docs7","hash":"62c2ab928074df3a9a5a2dd776b0572f","indexed_by":"docs-index"}},{"content":"Reduce Thickness — How it works\n\n1. Run the command and select a mesh, surface, polysurface, or SubD — anything solid; non-meshes are meshed for the session.\n2. The piece appears with the thickness heat map: red at the minimum, yellow close to it, green comfortable.\n3. Brush the side you want to hollow. Each stroke sinks the touched surface inward along its normals until the local wall reaches the target — never past it, so repainting the same area is safe. Walls already at the minimum are untouched.\n4. Accept to commit; the reworked mesh replaces the original as a single undo step. Cancel brings the original back untouched.\n\nGems are protected automatically: stones in the document count as walls — so the metal under a seat cannot be thinned — and the area around them is masked against deformation.","metadata":{"title":"Reduce Thickness","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/#how-it-works","collection":"docs7","hash":"da947e3e14277fe315702d7df3d4c700","indexed_by":"docs-index"}},{"content":"Reduce Thickness — The panel\n\n* Weight readout — the piece's current weight in grams (using the document's metal) and how much you have saved so far.\n* Thickness (mm) — the minimum wall thickness, 0.8 mm by default (0.1–5 mm). It is both the carving floor and the heat map's red line.\n* Radius — the brush size, auto-sized to the piece; adjust it in the panel or with [ and ] while brushing.\n* Undo Stroke / Redo Stroke — per-stroke history inside the session, up to 16 strokes.\n\nIf any wall is still below the minimum when you accept — possible when both sides of the same wall were brushed — the command warns you and asks before committing.\n\nGoldsmith's Tip: Check the heat map before brushing anything — the piece often tells you where the grams are hiding. Then confirm the result with Global Thickness before it goes to the printer.","metadata":{"title":"Reduce Thickness","section":"The panel","url":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/#the-panel","source":"https://www.rhinoartisan.com/docs/7/tabs/meshes/reduce-thickness/#the-panel","collection":"docs7","hash":"11710eb2884099ff08dbc7e0be82b521","indexed_by":"docs-index"}},{"content":"Render\n\nEverything needed to turn a finished piece into an image: the two engines, the lights, the materials and the mapping.\n\nThe concepts — which engine to use and when — are in Rendering, which is where the pages these cards link to live. Eight groups, left to right.\n\nRender and materials\nRender and Animation The render panel and turntable animations.\n\nApply Design Materials Puts the design materials on the piece.\n\nSafe Frame Shows what the render will actually include.\n\nLying on the Ground Drops the piece flat, as it would rest for a photo.\n\nApply Render Materials Swaps in the heavier render materials.\n\nBatch Rendering Renders a queue of views or files unattended.\n\nPair 3D The mirrored twin, for a paired shot.","metadata":{"title":"Render","url":"https://www.rhinoartisan.com/docs/7/tabs/render/","source":"https://www.rhinoartisan.com/docs/7/tabs/render/","collection":"docs7","hash":"ff4bc0c7db8c9de45a0e54b3287c5f57","indexed_by":"docs-index"}},{"content":"Render — Realtime\n\nRealtime Render The viewer that keeps refining while you work.\n\nKeyShot\nLive Linking Opens the piece in KeyShot and keeps it linked.\n\nUpdate Instance Pushes your latest changes to that KeyShot scene.\n\nExport Sends the piece to KeyShot as a one-off.\n\nPanels\nEnvironment The environment the piece is lit by.\n\nLights The lights in the scene.\n\nGround The ground plane under the piece.\n\nMaterials The materials in the file.\n\nTextures The textures those materials use.\n\nLibrary The material and environment library.","metadata":{"title":"Render","section":"Realtime","url":"https://www.rhinoartisan.com/docs/7/tabs/render/#realtime","source":"https://www.rhinoartisan.com/docs/7/tabs/render/#realtime","collection":"docs7","hash":"28e019470bd9c924a5fb05b497979f85","indexed_by":"docs-index"}},{"content":"Render — Lights\n\nSpotlight A cone of light aimed where you point.\n\nPoint Light Light radiating from a single point.\n\nDirectional Light Parallel light, like the sun.\n\nRectangular Light A softbox — the usual key light for jewellery.\n\nLinear Light A strip of light.\n\nLight Properties Intensity, colour and shadow of a light.\n\nEdit Light by Highlight Location Places a light by dragging the highlight it makes.\n\nSet Spotlight to View Points a spotlight where you are looking.\n\nEdit Light by Looking Aims a light from the light's own point of view.\n\nSet View to Spotlight Looks through a spotlight.","metadata":{"title":"Render","section":"Lights","url":"https://www.rhinoartisan.com/docs/7/tabs/render/#lights","source":"https://www.rhinoartisan.com/docs/7/tabs/render/#lights","collection":"docs7","hash":"dbce72553406338efe05fbab2a66d679","indexed_by":"docs-index"}},{"content":"Render — Colours and materials\n\nSet Render Color Sets the colour a material renders as.\n\nSynchronize Render Colors Brings display and render colours into line.\n\nMerge Identical Materials Collapses duplicate materials into one.\n\nMatch Material Properties Copies one material's settings onto another.\n\nSet Material Source: Layer Makes objects take their material from the layer.","metadata":{"title":"Render","section":"Colours and materials","url":"https://www.rhinoartisan.com/docs/7/tabs/render/#colours-and-materials","source":"https://www.rhinoartisan.com/docs/7/tabs/render/#colours-and-materials","collection":"docs7","hash":"c90b2cf39694aac6db586cfe64392bc7","indexed_by":"docs-index"}},{"content":"Render — Texture mapping\n\nShow Texture Mapping Displays the mapping widget on an object.\n\nPlanar Mapping Projects the texture flat.\n\nUV Mapping Uses the surface's own UV space.\n\nCylindrical Mapping Wraps the texture around a cylinder.\n\nBox Mapping Projects from six sides.\n\nSpherical Mapping Wraps the texture around a sphere.\n\nUnwrap Texture Flattens the surface so a texture can be painted on it.\n\nApply Custom Texture Mapping Uses an object you modelled as the mapping cage.\n\nPack Textures Packs the textures into one atlas.\n\nRefresh All Textures Reloads every texture from disk.\n\nUnpack Textures Splits a packed atlas back out.\n\nHide Mapping Widgets Hides the mapping cages from the viewport.\n\nRemove Mapping Channel Drops a mapping channel from the object.\n\nEdit Mapping Coordinates Edits the mapping numerically.\n\nExtract Custom Mapping Object Pulls the mapping cage out as geometry.\n\nMatch Texture Mapping Copies one object's mapping onto another.","metadata":{"title":"Render","section":"Texture mapping","url":"https://www.rhinoartisan.com/docs/7/tabs/render/#texture-mapping","source":"https://www.rhinoartisan.com/docs/7/tabs/render/#texture-mapping","collection":"docs7","hash":"5e66202ca20540c0ecfe44954318ba2d","indexed_by":"docs-index"}},{"content":"Render — Surface effects\n\nCurve Piping Renders a curve as a pipe without modelling one.\n\nShutlining Renders a groove along a curve.\n\nDisplacement Pushes the surface with a texture at render time.\n\nEdge Softening Rounds hard edges so they catch light.\n\nThickness Gives an open surface render thickness.\n\nMost of this tab is Rhino's own rendering toolset. RhinoArtisan adds the two engines themselves — Render Studio and Realtime Render — plus the KeyShot live link, Apply Design/Render Materials, Safe Frame, Batch Rendering and Lying on the Ground.","metadata":{"title":"Render","section":"Surface effects","url":"https://www.rhinoartisan.com/docs/7/tabs/render/#surface-effects","source":"https://www.rhinoartisan.com/docs/7/tabs/render/#surface-effects","collection":"docs7","hash":"9d3093f74e6a93a41fe54dfe7d9c0a63","indexed_by":"docs-index"}},{"content":"Select\n\nSelecting the right objects is most of the work in a piece with three hundred stones. This tab collects Rhino's selection commands into a single grid, and the ones that come in families carry a submenu.\n\nTwo groups, left to right.","metadata":{"title":"Select","url":"https://www.rhinoartisan.com/docs/7/tabs/select/","source":"https://www.rhinoartisan.com/docs/7/tabs/select/","collection":"docs7","hash":"0a505588c3d4f851028f6747fc784cc6","indexed_by":"docs-index"}},{"content":"Select — By kind and property\n\nSelect All Everything in the file.\n\nSelection Filter Limits what the cursor can pick.\n\nNamed Selections Saves a selection to recall later.\n\nSelect Previous Selection Back to what you had selected before.\n\nSelect by Object ID By the object's unique ID.\n\nSelect by Color Everything sharing a display colour.\n\nSelect Points Point objects.\n\nSelect Block Instances Every instance of a block.\n\nSelect Lights The lights in the scene.\n\nSelect by Annotation Style Annotations sharing a style.\n\nSelect Dots Annotation dots.\n\nSelect Clipping Planes Clipping planes.\n\nSelect Clipping Plane in Viewport Only those clipping this viewport.\n\nSelect Meshes Mesh objects.\n\nSelect Closed Meshes\n\nSelect Open Meshes\n\nSelect Curves Curve objects.\n\nShort Curves\n\nOpen Curves\n\nClosed Curves\n\nPolylines\n\nLines\n\nBy Linetype\n\nPlanar Curves\n\nSub Curve\n\nSelf-Intersecting Curves\n\nSelect Chain A run of curves that meet end to end.\n\nG0 Continuity\n\nG1 Continuity\n\nG2 Continuity\n\nSelect None Clears the selection.\n\nInvert Selection Swaps selected for unselected.\n\nSelect Last Created What the last command made.\n\nSelect by Object Name By the name you gave it.\n\nSelect Exact Duplicates Objects sitting on top of each other.\n\nSelect by Layer Everything on a layer.\n\nSelect Point Clouds Point cloud objects.\n\nSelect Mirrored Blocks Block instances that were mirrored.\n\nSelect Hatches Hatch objects.\n\nSelect Dimensions Dimension objects.\n\nLinear\n\nCentermarks\n\nRadial\n\nOrdinate\n\nAngular\n\nWith Property Overrides\n\nWith Text Overrides\n\nBy Font Use\n\nSelect by Group Name Everything in a named group.\n\nSelect Polysurfaces Polysurface objects.\n\nOpen Polysurfaces\n\nClosed Polysurfaces\n\nLightweight Extrusions\n\nSelect Surfaces Surface objects.\n\nOpen Surfaces\n\nClosed Surfaces\n\nUntrimmed Surfaces\n\nTrimmed Surfaces\n\nPictures\n\nPlanar Surfaces","metadata":{"title":"Select","section":"By kind and property","url":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-kind-and-property","source":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-kind-and-property","collection":"docs7","hash":"95e1c96ebe3cf8a7873c02f7b10b0aed","indexed_by":"docs-index"}},{"content":"Select — By kind and property\n\nSelect SubD Objects SubD objects and their parts.\n\nSubD Friendly Curves\n\nSubD Edges\n\nEdge Loop\n\nEdge Ring\n\nFace Loop\n\nFilter: Edges\n\nFilter: Faces\n\nFilter: Vertices\n\nFilter: None\n\nToggle Edge/Vertex\n\nFaces to Boundary\n\nLasso Points Control points, by dragging a lasso.\n\nConnected Points\n\nSelect UV\n\nSelect U\n\nSelect V\n\nInvert Point Selection\n\nNext U\n\nAdd Previous U\n\nNext V\n\nAdd Previous V\n\nBrush Points\n\nControl Point Region\n\nControl Points\n\nSelect Objects with History Objects linked to what made them.\n\nParents\n\nChildren","metadata":{"title":"Select","section":"By kind and property","url":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-kind-and-property","source":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-kind-and-property","collection":"docs7","hash":"22acd0ebe293875e0b5e965b177b18a3","indexed_by":"docs-index"}},{"content":"Select — By region and volume\n\nSelect Rectangular Region Everything inside a rectangle you draw.\n\nSelect by 3-D Box Everything inside a box.\n\nSelect by Boundary Curve Everything inside a closed curve.\n\nSelect Small Objects below a size you set — useful for junk.\n\nSelect by Closed Volume Everything inside a closed solid.\n\nSelect by Key By user-text key.\n\nSelect by Key/Value By user-text key and value.\n\nSelect by Sphere Everything inside a sphere.\n\nSelect by Circle Everything inside a circle.\n\nSelect by Brushing Paints a selection with the cursor.\n\nSelect with Fence Everything a line you draw crosses.\n\nSelect Controls Control objects of a cage or history.\n\nSelect by Value By user-text value.\n\nSelect Non-Manifold Objects that cannot exist as solids — a common cause of failed prints.\n\nEvery command here is Rhino's own, gathered into one tab. Select Small and Select Non-Manifold are the two worth knowing before an export: they find the junk and the geometry that will not print.","metadata":{"title":"Select","section":"By region and volume","url":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-region-and-volume","source":"https://www.rhinoartisan.com/docs/7/tabs/select/#by-region-and-volume","collection":"docs7","hash":"2791c61f2f76e2addcf83990ddbb95aa","indexed_by":"docs-index"}},{"content":"Solid\n\nEight groups, left to right. Buttons with a submenu list it underneath.\n\nPrimitives\nBox A rectangular solid from two corners and a height.\n\nDiagonal\n\n3 Points, Height\n\nCylinder A cylinder from a base circle and a height.\n\nTorus A ring solid from a centre circle and a tube radius.\n\nTube A cylinder with a hollow core.\n\nSphere A sphere from a centre and radius.\n\nDiameter\n\n3 Points\n\n4 Points\n\nAround Curve\n\nCone A cone from a base circle and an apex.\n\nTruncated Cone\n\nEllipsoid A solid with three independent axes.\n\nBy Diameter\n\nFrom Foci\n\nCorner\n\nAround Curve\n\nPyramid A pyramid on a polygonal base.\n\nTruncated Pyramid\n\nParaboloid","metadata":{"title":"Solid","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/","collection":"docs7","hash":"ca4884df880f3a3158a0b6f59bf459c8","indexed_by":"docs-index"}},{"content":"Solid — Extrude\n\nExtrude Curve Extrudes a closed curve into a capped solid.\n\nExtrude Curve to Point Extrudes a curve to a single apex.\n\nExtrude Curve Tapered Extrudes with a draft angle.\n\nExtrude Curve Along Curve Extrudes a curve following a path.\n\nBoss Raises a boss from a face.\n\nExtrude Surface Gives a surface thickness, making it solid.\n\nExtrude Surface to Point Extrudes a surface to a single apex.\n\nExtrude Surface Tapered Extrudes a surface with a draft angle.\n\nExtrude Surface Along Curve Extrudes a surface following a path.\n\nRib Builds a rib between a curve and a solid.","metadata":{"title":"Solid","section":"Extrude","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#extrude","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#extrude","collection":"docs7","hash":"017b214b8bed3c1a698c115b8bcadf80","indexed_by":"docs-index"}},{"content":"Solid — Thickness and caps\n\nSolid Pipe A capped pipe along a curve.\n\nSolid Shell Hollows a solid, leaving a wall thickness.\n\nCap Caps planar holes to close an open solid.\n\nRecess Sinks a recess into a face.\n\nBounding Box The smallest box enclosing the selection.\n\nSmart Profiles The library of parametric section profiles.\n\nCurve Shell Shells a solid following a curve you pick.\n\nCap Round Caps an opening with a rounded dome.\n\nPush Pull Drags a face to add or remove material.\n\nSolid Control Points Turns on the control points of a solid.","metadata":{"title":"Solid","section":"Thickness and caps","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#thickness-and-caps","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#thickness-and-caps","collection":"docs7","hash":"554407b130816ef4c133bd43f863b824","indexed_by":"docs-index"}},{"content":"Solid — Create and cut\n\nCreate Solid Joins surrounding surfaces into a closed solid.\n\nCut Cuts a solid with another object.\n\nFold Planar Faces Folds a planar face about a hinge line.\n\nExtract Surface Pulls a face out of a polysurface.\n\nDiagonal A box drawn from its diagonal.\n\nWire Cut Cuts a solid through with a curve, like a wire saw.","metadata":{"title":"Solid","section":"Create and cut","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#create-and-cut","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#create-and-cut","collection":"docs7","hash":"79740762c4044adebbd1fccd6c543790","indexed_by":"docs-index"}},{"content":"Solid — Booleans\n\nBoolean Union Fuses solids, keeping them editable afterwards.\n\nBoolean Union (Rhino)\n\nBoolean Difference Subtracts one solid from another, editably.\n\nBoolean Difference (Rhino)\n\nBoolean Intersection Keeps only the volume two solids share.\n\nBoolean Intersection (Rhino)\n\nBoolean Split Splits a solid with another, keeping both parts.\n\nBoolean Split (Rhino)\n\nBoolean Update Recomputes a boolean after you edit its inputs.","metadata":{"title":"Solid","section":"Booleans","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#booleans","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#booleans","collection":"docs7","hash":"7824ce23ba9d7a40755f8c0a50834508","indexed_by":"docs-index"}},{"content":"Solid — Fillet and chamfer\n\nFillet Edge Rounds the edges of a solid.\n\nChamfer Edge Bevels the edges of a solid.\n\nBlend Edge A curvature-continuous fillet.\n\nEdit Fillet Edge Reopens an existing fillet to change its radius.\n\nFace editing\nMove Face Moves a face, rebuilding the solid around it.\n\nMove Untrimmed Face Moves the underlying face beneath a trim.\n\nMove Face to a Boundary Moves a face until it meets another object.\n\nMove Edge Moves an edge, adjusting the faces it joins.\n\nMove Untrimmed Edge Moves the underlying edge beneath a trim.\n\nExtrude Face Extrudes a face out of the solid.\n\nMerge All Coplanar Faces Merges faces that lie in the same plane.","metadata":{"title":"Solid","section":"Fillet and chamfer","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#fillet-and-chamfer","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#fillet-and-chamfer","collection":"docs7","hash":"d40168a3008e5a036cb83711cca8a145","indexed_by":"docs-index"}},{"content":"Solid — Join\n\nJoin Edge Forces two near-matching edges to join.\n\nUnjoin Edge Separates joined edges again.\n\nThe four booleans on this group are RhinoArtisan's own: the result stays linked to the shapes that made it, so you can move an input and rerun Boolean Update instead of rebuilding. Rhino's plain booleans are one click away in each submenu.","metadata":{"title":"Solid","section":"Join","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/#join","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/#join","collection":"docs7","hash":"742394068c3efc2b329f9991cbe891c4","indexed_by":"docs-index"}},{"content":"Box — Box\n\nThe Box command creates an Extrusion box.\n\nSteps\n1. Pick two points for the opposite corners of the base rectangle.\n\nPress and hold Shift to draw a square.\n\nOr, select one of the options to draw the rectangle in a different way.\n2. Pick the height.\n\nPress Enter to use the width value for the height.","metadata":{"title":"Box","section":"Box","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/box/#box","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/box/#box","collection":"docs7","hash":"ea78e0fb0b90883e41457590f274ec83","indexed_by":"docs-index"}},{"content":"Box — Command-line options\n\nDiagonal: Creates a box from the diagonal corners. If you pick the two corners on the CPlane, the command prompts for picking the height.\n\nCube: Creates a box with six square faces from the diagonal corners.\n\n(Default): Draws the rectangle using two opposite corners.\n\n3Point: Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nEdgeMidpoint: Draws the rectangle from the midpoint of the first edge, and end of the edge, an end of the edge, and a location on the opposite side.\n\nVertical: Draws the rectangle perpendicular to the construction plane.\n\nCenter: Draws the rectangle from the center point and a corner.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Box","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/box/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/box/#command-line-options","collection":"docs7","hash":"a386c39f5a9a701b4707e406131ed246","indexed_by":"docs-index"}},{"content":"Cone — Cone\n\nThe Cone command creates a surface cone.\n\n#### Command-line options\n\n* DirectionConstraint: Direction constraints restrict the direction of the cone\n\n1.None: Pick or type a number to set the height.\n\n2.Vertical: Creates a cone perpendicular to the contruction plane.\n\n3.AroundCurve: Draws the base circle perpendicular to the picked point on a curve. The center line of the cone will be tangent to the curve.\n* Solid (Yes/No): Decides if the bottom will be capped to create a solid or open cone.\n* Radius: Draws the base circle by picking the center point and a radius point.\n* 2Point: Draws the base circle from two opposite points.\n* 3Point: Draws the base circle through three points.\n* Tangent: Draws the base circle tangent to one, two, or three curves.\n* FitPoints: Draws the base circle by fitting to selected points, control points, or mesh vertices.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cone","section":"Cone","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/cone/#cone","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/cone/#cone","collection":"docs7","hash":"9c538dd730dee6d8626b8c9365beccbd","indexed_by":"docs-index"}},{"content":"Cylinder — Cylinder\n\nThe Cylinder command draws an Extrusion cylinder.\n\n#### Command-line options\n\n* DirectionConstraint: Direction constraints restrict the direction of the cylinder.\n\n1.None: Pick or type a number to set the height.\n\n2.Vertical: Creates a cylinder perpendicular to the construction plane\n\n3.AroundCurve: Draws the base circle perpendiculart to the picked point on a curve. The center line of the cylinder will be tangent to the curve.\n* Solid: Caps the top and bottom openings or leave them open.\n* Radius: Draw the base circle by picking the center point and a radius point.\n* 2Point: Draws the base circle from two opposite points.\n* 3Point: Draws the base circle through three points.\n* Tangent: Draws the base circle tangent to one, two, or three curves.\n* FitPoints: Draws the base circle by fitting to selected points, control points, or mesh vertices.\n* BothSides: Creates a cylinder symmetrical across the base circle. The height of the cylinder is twice as long as you specify.\n\nSteps\n\n1. Draw the base circle.\n2. Pick a location or type a number to set the height.\n\nThe DirectionConstraint options define the positive height differently.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cylinder","section":"Cylinder","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/cylinder/#cylinder","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/cylinder/#cylinder","collection":"docs7","hash":"6a23865e3cc20172e273bcc019d801b1","indexed_by":"docs-index"}},{"content":"Ellipsoid — Ellipsoid\n\nThe Ellipsoid command draws a solid NURBS ellipsoid.\n\n#### Command-line options\n\n* Radius: Creates an ellipsoid by defining the half-length of each axis.\n\n1.Corner: Draws the base ellipse from the center point and a corner of the enclosing rectangle.\n* Corner: Draws the base ellipse from two opposite corners of the enclosing rectangle.\n* Diameter: Creates an ellipsoid by defining the length of each axis.\n\n1.Vertical: Draws the base ellipse perpendicular to the construction plane.\n* FromFoci: Draws the ellipse from focus points and a point on the curve.\n\n1.MarkFoci: Places a point object at the focus locations.\n* AroundCurve: Draws the base ellipse perpendicular to the picked point on a curve. The third axis will be tangent to the curve.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Ellipsoid","section":"Ellipsoid","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/ellipsoid/#ellipsoid","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/ellipsoid/#ellipsoid","collection":"docs7","hash":"25c89ae712d78186b7dda5bc9fe986d1","indexed_by":"docs-index"}},{"content":"Pyramid — Pyramid\n\nThe Pyramid command draws a pyramid.\n\nSteps\n\n1. Draw the base polygon.\\ See the Polygon command for option descriptions.\n2. Pick the end of the pyramid (apex), or type a value to set the height.\n\n#### Command-line options\n\n-Direction constraint options: Direction constraints restrict the direction of the circle.\n\n* None: The center can be anywhere in 3-D space\n* Pick the second point anywhere using elevator mode, object snaps or other modeling aids.\n* Vertical: Draws an object perpendicular to the construction plane.\n* Pick the center and a radius or diameter\n* AroundCurve: Draws a circle perpendicular to a curve.\n* Select a curve and pick the center of the circle on the curve and a radius or diameter.\n\n-Solid: Fills the base with a surface to form a closed solid.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Pyramid","section":"Pyramid","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/pyramid/#pyramid","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/pyramid/#pyramid","collection":"docs7","hash":"6af329d0afd5c5e12cb6110c4ed06208","indexed_by":"docs-index"}},{"content":"Sphere — Sphere\n\nThe Sphere command draws a solid sphere.\n\nCommand-line options\nRadius\n\nCreates a sphere by picking the center point and a radius point.\n\nDiameter - Orientation - Circumference - Area - ProjectOsnap\n\n2Point\n\nCreates a sphere from two opposite points on the base circle.\n\n3Point\n\nCreates a sphere from three points on the base circle.\n\nRadius\n\nTangent\n\nCreates a sphere with the base circle tangent to one, two or three curves.\n\nPoint - FromFirstPoint - Radius\n\nAroundCurve\n\nCreates a sphere from its center point on a curve, and a point on the base circle perpendicular to the curve.\n\nRadius - Diameter - Circumference - Area - ProjectOsnap\n\n4Point\n\nCreates a sphere from three points on a section circle and a point on the sphere.\n\nRadius\n\nFitPoints\n\nCreates a sphere by fitting to selected point objects, curve and surface control points, and mesh vertices.\n\n&#x20;\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sphere","section":"Sphere","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/sphere/#sphere","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/sphere/#sphere","collection":"docs7","hash":"2279c85e165ae5731be7d9f09aa144b1","indexed_by":"docs-index"}},{"content":"Torus — Torus\n\nThe Torus command draws a torus (doughnut shape).\n\n#### Base circle options\n\n* Radius: Pick a point or enter a radius to decide the size of the base circle.\n* Vertical: Draws the base circle vertical to the construction plane.\n* 2Point: Pick two opposite points on the base circle.\n* 3Point: Draws the base circle through three points.\n* Tangent: Draws the base circle tangent to one, two, or three curves.\n* AroundCurve: Draws the base circle perpendicular to the picked point on a curve. The center line of the torus will be tangent to the curve.\n* FitPoints: Draws the base circle by fitting to selected points, control points, or mesh vertices.\n\n#### Second circle options\n\n* Radius: Pick a point or enter a radius to decide the size of the second circle.\n* Diameter: Pick a point or enter a diameter to decide the size of the second circle.\n* FixInnerDimension: The first radius chosen sets the inner dimension of the torus and the second radius is constrained to be outside of the first radius.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Torus","section":"Torus","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/torus/#torus","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/torus/#torus","collection":"docs7","hash":"3b0daf88958c9dff5dac4f86bb1312af","indexed_by":"docs-index"}},{"content":"Tube — Tube\n\nThe Tube command draws a closed cylinder with a concentric cylindrical hole.\n\nSteps\n\n1. Pick the center and radius of the base.\\ See the Circle command for option descriptions.\n2. After drawing the base circle, pick the radius/diameter for the second tube wall.\n3. Pick the end of the tube or type a height.\n\n#### Command-line options\n\n-Direction constraint options: Direction constraints restrict the direction of the circle.\n\n* Nonce: The center can be anywhere in 3-D space.\n* Pick the second point anywhere using elevator mode, object snaps or other modeling aids.\n* Vertical: Draws an object perpendicular to the construction plane.\n* Pick the center and a radius or diameter.\n* AroundCurve: Draws a circle perpendicular to a curve.\n* Select a curve and pick the center of the circle on the curve and a radius or diameter.\n\n-BothSides: Draws the object on both sides of the start point, creating the object twice as long as you indicate.\n\n-WallThickness: Specifies the value for the distance between the inside and outside of the tube.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Tube","section":"Tube","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/tube/#tube","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/basic-geometry/tube/#tube","collection":"docs7","hash":"cecfeeabebcd0ab0a59764512bc4f467","indexed_by":"docs-index"}},{"content":"Boolean Difference (RhinoArtisan) — Boolean Difference\n\n`ArtisanBooleanDifference` subtracts one set of solids from another, like the standard Rhino command — with one decisive difference: the originals are not destroyed. Both the solids you keep and the cutters are hidden and kept in the document, and the result is baked into a group that remembers which objects went into it and what operation was applied.\n\nThat makes the difference editable. The cutter that hollows a signet, the gems that seat into a pavé — change any of them later, and rebuild the cut without modeling anything twice.\n\nLooking for Rhino's own, one-way boolean? It is still there, under Boolean Difference (Rhino) in the ribbon submenu, and documented in Boolean Difference.","metadata":{"title":"Boolean Difference (RhinoArtisan)","section":"Boolean Difference","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#boolean-difference","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#boolean-difference","collection":"docs7","hash":"47c3b6ae749313bbc972a19fa588b22f","indexed_by":"docs-index"}},{"content":"Boolean Difference (RhinoArtisan) — Steps\n\n* Run `ArtisanBooleanDifference`.\n* Select solids to keep — pick the solids or extrusions the metal stays in, and press Enter.\n* Select solids to subtract — pick the cutters and press Enter.\n* The result appears as a single grouped object, and all the originals are hidden.\n\nThe same object cannot be in both sets — the command checks and stops if it is.","metadata":{"title":"Boolean Difference (RhinoArtisan)","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#steps","collection":"docs7","hash":"bbead087b7bdc76a59c79e3e5ca18ea0","indexed_by":"docs-index"}},{"content":"Boolean Difference (RhinoArtisan) — Editing a boolean afterwards\n\n* `ArtisanEdit` on the result dismantles the boolean: the result is removed and the original operands come back, visible and editable. The group and its stored parameters stay behind.\n* Change whatever you need — move a cutter, resize the solid it cuts.\n* `ArtisanBooleanUpdate` rebuilds every dismantled boolean in the document at once. No selection is needed: it finds them by itself.\n\nIf an operand was recreated and its stored identity no longer matches anything in the document, Boolean Update asks you to reselect just that one object and remembers the new one.","metadata":{"title":"Boolean Difference (RhinoArtisan)","section":"Editing a boolean afterwards","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#editing-a-boolean-afterwards","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#editing-a-boolean-afterwards","collection":"docs7","hash":"15d47fb21ebb5518060709bf659edf91","indexed_by":"docs-index"}},{"content":"Boolean Difference (RhinoArtisan) — Notes\n\n* Operands can be polysurfaces or extrusions; surfaces and meshes are not accepted.\n* The result inherits the layer and display attributes of the first object you selected.\n* If the difference fails — self-intersections, bad edges, a tolerance problem — the command says so and leaves your objects untouched.\n* The operation is recorded as a single undo step, and the result appears in the Outliner as an editable object.","metadata":{"title":"Boolean Difference (RhinoArtisan)","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#notes","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#notes","collection":"docs7","hash":"a5aeba8728882576dd9226966fa097f6","indexed_by":"docs-index"}},{"content":"Boolean Difference (RhinoArtisan) — Related commands\n\n* Boolean Union — join solids into one.\n* Boolean Intersection — keep only the shared volume.\n* Boolean Split — cut solids with other solids and keep every piece.\n* Boolean Update — rebuild dismantled booleans.","metadata":{"title":"Boolean Difference (RhinoArtisan)","section":"Related commands","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#related-commands","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/difference/#related-commands","collection":"docs7","hash":"be8f46be7e71b06520569edb28137407","indexed_by":"docs-index"}},{"content":"Boolean Intersection (RhinoArtisan) — Boolean Intersection\n\n`ArtisanBooleanIntersection` keeps only the volume that two sets of solids share, like the standard Rhino command — with one decisive difference: the originals are not destroyed. Both sets are hidden and kept in the document, and the result is baked into a group that remembers which objects went into it and what operation was applied.\n\nThe ribbon button is labeled Boolean Intersect; it runs this command.\n\nLooking for Rhino's own, one-way boolean? It is still there, under Boolean Intersection (Rhino) in the ribbon submenu, and documented in Boolean Intersection.","metadata":{"title":"Boolean Intersection (RhinoArtisan)","section":"Boolean Intersection","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#boolean-intersection","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#boolean-intersection","collection":"docs7","hash":"2b316725e145adb2c38132c2edd89207","indexed_by":"docs-index"}},{"content":"Boolean Intersection (RhinoArtisan) — Steps\n\n* Run `ArtisanBooleanIntersection`.\n* Select first set of solids — pick solids or extrusions and press Enter.\n* Select second set of solids — pick the other set and press Enter.\n* The shared volume appears as a single grouped object, and all the originals are hidden.\n\nThe same object cannot be in both sets — the command checks and stops if it is.","metadata":{"title":"Boolean Intersection (RhinoArtisan)","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#steps","collection":"docs7","hash":"bdf202cc72bbd3007cea4651a7d79cc2","indexed_by":"docs-index"}},{"content":"Boolean Intersection (RhinoArtisan) — Editing a boolean afterwards\n\n* `ArtisanEdit` on the result dismantles the boolean: the result is removed and the original operands come back, visible and editable.\n* Change whatever you need.\n* `ArtisanBooleanUpdate` rebuilds every dismantled boolean in the document at once, asking you to reselect only an operand whose stored identity no longer matches anything.","metadata":{"title":"Boolean Intersection (RhinoArtisan)","section":"Editing a boolean afterwards","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#editing-a-boolean-afterwards","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#editing-a-boolean-afterwards","collection":"docs7","hash":"9a2713076232b0fb17b1e4a931abb844","indexed_by":"docs-index"}},{"content":"Boolean Intersection (RhinoArtisan) — Notes\n\n* Operands can be polysurfaces or extrusions; surfaces and meshes are not accepted.\n* The result inherits the layer and display attributes of the first object you selected.\n* If the intersection fails, the command says so and leaves your objects untouched.\n* The operation is a single undo step, and the result appears in the Outliner as an editable object.","metadata":{"title":"Boolean Intersection (RhinoArtisan)","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#notes","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#notes","collection":"docs7","hash":"94ff361bade9e8fa383e07415573e14c","indexed_by":"docs-index"}},{"content":"Boolean Intersection (RhinoArtisan) — Related commands\n\n* Boolean Union — join solids into one.\n* Boolean Difference — subtract one set from another.\n* Boolean Split — cut solids with other solids and keep every piece.\n* Boolean Update — rebuild dismantled booleans.","metadata":{"title":"Boolean Intersection (RhinoArtisan)","section":"Related commands","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#related-commands","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/intersection/#related-commands","collection":"docs7","hash":"6325f4663d776287f0cf04f7eb426112","indexed_by":"docs-index"}},{"content":"Boolean Split (RhinoArtisan) — Boolean Split\n\n`ArtisanBooleanSplit` cuts a set of solids with another and keeps every piece — inside and outside the cutters — like the standard Rhino command, with one decisive difference: the originals are not destroyed. Both sets are hidden and kept in the document, and the pieces are baked into a group that remembers which objects went into it and what operation was applied.\n\nSplit is the boolean for two-color pieces and for parting a design into components: one cut, all the parts, and the cutter still alive if the parting line has to move.\n\nLooking for Rhino's own, one-way boolean? It is still there, under Boolean Split (Rhino) in the ribbon submenu, and documented in Boolean Split.","metadata":{"title":"Boolean Split (RhinoArtisan)","section":"Boolean Split","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#boolean-split","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#boolean-split","collection":"docs7","hash":"e5559aad3dc68c692476c09a9bdfc0fd","indexed_by":"docs-index"}},{"content":"Boolean Split (RhinoArtisan) — Steps\n\n* Run `ArtisanBooleanSplit`.\n* Select solids to split — pick solids or extrusions and press Enter.\n* Select cutting solids — pick the cutters and press Enter.\n* The pieces appear as a single grouped object, and all the originals are hidden.\n\nThe same object cannot be in both sets — the command checks and stops if it is.","metadata":{"title":"Boolean Split (RhinoArtisan)","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#steps","collection":"docs7","hash":"378492ec3b9615016b5ed5b18f8ad95b","indexed_by":"docs-index"}},{"content":"Boolean Split (RhinoArtisan) — Editing a boolean afterwards\n\n* `ArtisanEdit` on the result dismantles the boolean: the pieces are removed and the original operands come back, visible and editable.\n* Change whatever you need — typically the cutter that defines the parting.\n* `ArtisanBooleanUpdate` rebuilds every dismantled boolean in the document at once, asking you to reselect only an operand whose stored identity no longer matches anything.","metadata":{"title":"Boolean Split (RhinoArtisan)","section":"Editing a boolean afterwards","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#editing-a-boolean-afterwards","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#editing-a-boolean-afterwards","collection":"docs7","hash":"a489fd3127689499f29b9bc0d9e78eba","indexed_by":"docs-index"}},{"content":"Boolean Split (RhinoArtisan) — Notes\n\n* Operands can be polysurfaces or extrusions; surfaces and meshes are not accepted.\n* The pieces inherit the layer and display attributes of the first object you selected.\n* If the split fails, the command says so and leaves your objects untouched.\n* The operation is a single undo step, and the result appears in the Outliner as an editable object.","metadata":{"title":"Boolean Split (RhinoArtisan)","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#notes","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#notes","collection":"docs7","hash":"8007602863336b4e0bcf0439606bf4c4","indexed_by":"docs-index"}},{"content":"Boolean Split (RhinoArtisan) — Related commands\n\n* Boolean Union — join solids into one.\n* Boolean Difference — subtract one set from another.\n* Boolean Intersection — keep only the shared volume.\n* Boolean Update — rebuild dismantled booleans.","metadata":{"title":"Boolean Split (RhinoArtisan)","section":"Related commands","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#related-commands","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/split/#related-commands","collection":"docs7","hash":"c2a61924b4fa2110636af021282b4cbb","indexed_by":"docs-index"}},{"content":"Boolean Union (RhinoArtisan) — Boolean Union\n\n`ArtisanBooleanUnion` joins two or more solids into one, like the standard Rhino command — with one decisive difference: the originals are not destroyed. They are hidden and kept in the document, and the result is baked into a group that remembers which objects went into it and what operation was applied.\n\nThat makes the union editable. Days later you can open the boolean back up, change one of the operands, and rebuild the result — no history to preserve, no need to have kept a copy on a spare layer.\n\nLooking for Rhino's own, one-way boolean? It is still there, under Boolean Union (Rhino) in the ribbon submenu, and documented in Boolean Union.","metadata":{"title":"Boolean Union (RhinoArtisan)","section":"Boolean Union","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#boolean-union","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#boolean-union","collection":"docs7","hash":"944549349d6ba760fef138ce886d90d7","indexed_by":"docs-index"}},{"content":"Boolean Union (RhinoArtisan) — Steps\n\n* Run `ArtisanBooleanUnion`.\n* Select solids to union — pick at least two solids or extrusions and press Enter.\n* The result appears as a single grouped object, and the originals are hidden.\n\nThe union needs at least two solids; with a single object selected the command reports it and stops.\n\nEditing a boolean afterwards\n* `ArtisanEdit` on the result dismantles the boolean: the result is removed and the original operands come back, visible and editable. The group and its stored parameters stay behind.\n* Change whatever you need — including running a parametric command on one of the operands, which recreates it with a new identity.\n* `ArtisanBooleanUpdate` rebuilds every dismantled boolean in the document at once. No selection is needed: it finds them by itself.\n\nIf an operand was recreated and its stored identity no longer matches anything in the document, Boolean Update asks you to reselect just that one object and remembers the new one. Everything else is rebuilt silently.","metadata":{"title":"Boolean Union (RhinoArtisan)","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#steps","collection":"docs7","hash":"107769b039a793aacafb76f3f1c34fd4","indexed_by":"docs-index"}},{"content":"Boolean Union (RhinoArtisan) — Notes\n\n* Operands can be polysurfaces or extrusions; surfaces and meshes are not accepted.\n* The result inherits the layer and display attributes of the first object you selected.\n* If the union fails — self-intersections, bad edges, a tolerance problem — the command says so and leaves your objects untouched. Nothing is hidden and nothing is deleted.\n* The operation is recorded as a single undo step, so one Ctrl+Z puts the document back exactly as it was.\n* Results appear in the Outliner, where the boolean is listed as an editable object alongside the rest of the parametric geometry.","metadata":{"title":"Boolean Union (RhinoArtisan)","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#notes","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#notes","collection":"docs7","hash":"be82536649a970c5a969ef790e9e3f51","indexed_by":"docs-index"}},{"content":"Boolean Union (RhinoArtisan) — Related commands\n\n* Boolean Difference — subtract one set of solids from another.\n* Boolean Intersection — keep only the shared volume.\n* Boolean Split — cut solids with other solids and keep every piece.\n* Boolean Update — rebuild dismantled booleans.\n\nGoldsmith Tip: build shanks, heads and galleries as separate solids and union them last. Because the operands survive inside the boolean, a client asking for a slightly wider shank two weeks later costs you one ArtisanEdit, one change and one ArtisanBooleanUpdate — not a rebuild from scratch.","metadata":{"title":"Boolean Union (RhinoArtisan)","section":"Related commands","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#related-commands","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/union/#related-commands","collection":"docs7","hash":"5f6561a55b4439e09442e8c43d1ed8b3","indexed_by":"docs-index"}},{"content":"Boolean Update — Boolean Update\n\n`ArtisanBooleanUpdate` is the second half of the editable boolean workflow: after `ArtisanEdit` has dismantled a union, difference, intersection or split and you have edited the operands, one run of Boolean Update puts everything back together.\n\nHow it works\n* No selection is needed. The command scans the document for dismantled booleans — the ones opened with `ArtisanEdit` and not yet rebuilt — and recomputes each one from its stored operands. Intact booleans are left alone.\n* Each rebuilt result replaces the dismantled one in its group, and the operands are hidden again.\n* If an operand was recreated — for example, a parametric command rebuilt it with a new identity — Update asks you to reselect just that one object, and remembers the new one for next time.\n\nAt the end, the command line reports how many booleans were rebuilt. If one of them fails to recompute — a moved cutter no longer intersecting, a tolerance problem — that boolean is skipped with its operands left visible, and the rest are still processed.","metadata":{"title":"Boolean Update","section":"Boolean Update","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/update/#boolean-update","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/update/#boolean-update","collection":"docs7","hash":"9793be2b3c8c5b47d6e0a10f507aa878","indexed_by":"docs-index"}},{"content":"Boolean Update — Notes\n\n* With no dismantled booleans in the document, the command simply reports there is nothing to update.\n* Each rebuild is recorded as an undo step.\n* The rebuilt results reappear in the Outliner as editable objects.\n\nGoldsmith Tip: dismantle several booleans in one editing session — the shank union, the gem cuts — make all the changes, and let a single Boolean Update close them all at once.","metadata":{"title":"Boolean Update","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/update/#notes","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/boolean/update/#notes","collection":"docs7","hash":"71d751e7a28d5044d03480ab609fa592","indexed_by":"docs-index"}},{"content":"Booleans\n\n###","metadata":{"title":"Booleans","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/","collection":"docs7","hash":"03ee841794c3b06dcd8b298861efd44a","indexed_by":"docs-index"}},{"content":"Boolean Difference\n\nBoolean Difference\n\nThe BooleanDifference command trims the shared areas of selected polysurfaces or surfaces with another set of polysurfaces or surfaces.\n\nSteps\n\n1. Select surfaces or polysurfaces to subtract from, and press Enter.\n\n2. Select surfaces or polysurfaces to subtract with, and press Enter.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Boolean Difference","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-difference/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-difference/","collection":"docs7","hash":"26e61dcfae4e06500bf83d4c914cfd37","indexed_by":"docs-index"}},{"content":"Boolean Intersection\n\nBoolean Intersection\n\nThe BooleanIntersection command trims the unshared areas of selected polysurfaces or surfaces.\n\nSteps\n\n1. Select the first set of objects or a set of intersecting objects and press Enter.\n\n2. If a first set of objects was selected, select the second set of objects and press Enter.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Boolean Intersection","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-intersection/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-intersection/","collection":"docs7","hash":"498b3260d8a96185576b63d13c3fc929","indexed_by":"docs-index"}},{"content":"Boolean Split\n\nBoolean Split\n\nThe BooleanSplit command splits shared areas of selected polysurfaces or surfaces and creates separate polysurfaces from the shared and unshared parts.\n\nSteps\n\n1. Select the first set of objects and press Enter.\n\n2. Select the cutting objects and press Enter.\\ The cutting objects and the objects to split can be the same objects.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Boolean Split","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-split/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-split/","collection":"docs7","hash":"d61c299bcdbf4cbbf4df22d2c7030fca","indexed_by":"docs-index"}},{"content":"Boolean Union — Boolean Union\n\nThe BooleanUnion command trims the shared areas of selected polysurfaces or surfaces and creates a single polysurface from the unshared areas.\n\nSteps\n\n* Select the objects and press Enter.\\ The objects combine into one polysurface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Boolean Union","section":"Boolean Union","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-union/#boolean-union","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/booleans/boolean-union/#boolean-union","collection":"docs7","hash":"16f6c34b505924e084ba45981f3b5f96","indexed_by":"docs-index"}},{"content":"Bounding Box — BoundingBox\n\nThe BoundingBox command creates a box that encloses all selected objects, or each object in selection.\n\n#### Command options\n\n-CoordinateSystem: Specifies the coordinate system that will be used for basing the bounding box.\n\n* CPlane: Bases the object creation on construction plane coordinates.\n* World: Bases the object creation on world coordinates.\n\n-Cumulative (Yes/No): Specifies to create a bounding box for a collection of objects, or for each object in the collection.\n\nYes (Default)No\n\n-Output: For three-dimensional objects, specifies the result.\n\n* Solid: Creates a polysurface box.\n* Meshes: Creates a mesh box or plane.\n* Curves: Creates six grouped rectangles.\n* None: Reports the dimensions of the bounding box at the command line.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Bounding Box","section":"BoundingBox","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/bounding-box/#boundingbox","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/bounding-box/#boundingbox","collection":"docs7","hash":"a3157587df3b31013b9f448938c30c03","indexed_by":"docs-index"}},{"content":"Cap Round — Cap Round\n\nUsing this command allows you to create dome-shaped enclosures following the form of a closed curve.\n\n.png)\n\nRunning this command will display its parameters in the Commands toolbar.\n\nBy clicking the selection square, you can select the curve you would like to use to generate the Cap Round object.\n\nOnce you confirm your changes, the Cap Round object will be listed on the Outliner toolbar.\n\nLearn more about this command in Academy","metadata":{"title":"Cap Round","section":"Cap Round","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/cap-round/#cap-round","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/cap-round/#cap-round","collection":"docs7","hash":"fc98ff9f392e89c1900b255965c41ae7","indexed_by":"docs-index"}},{"content":"Cap — Cap\n\nThe Cap command fills planar holes in objects with planar faces.\n\nIt is caplable of capping surfaces, Meshes and SubDs.\n\n#### Command-line options (Mesh/SubD only)\n\n-DeleteInput: Specify if the input object will be deleted.\n\n-Crease\n\n* Yes: Do not weld the vertices along the cap boundary.\n\n* No: Welds the vertices along the cap boundary.\n\n* Triangles\n* Yes: Fills a planar opening in a SubD or mesh with triangle faces.\n\n* No: Fills a planar opening in a SubD with a single face, or in a mesh with an n-gon.\n\n#### Aditional Notes\n\nCaps will always be made up of triangles when:\n\n* A SubD or mesh cap has a hole (an inner boundary).\n\n* Any part of the outer boundary of a SubD cap is not convex.\n\nYou can use the MergeFaces command to combine the triangles into a single face as needed.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cap","section":"Cap","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/cap/#cap","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/cap/#cap","collection":"docs7","hash":"b7b3bf54e4ef81edbbac98fc1e88c075","indexed_by":"docs-index"}},{"content":"Curve Shell — Curve Shell\n\nWith this command, you can select closed curves, and generate a shell-shaped solid, with a flat platform and vertical walls. This is especially useful to create solid surfaces where to set gems or Texture 3D.\n\n.png)\n\nWhen running this command, its parameters will be shown on the Commands toolbar.\n\nClicking the selection square will allow you to select the closed curve you want to use to create the Curve Shell object.\n\nOnce you confirm your changes, the Curve Shell object will be listed on the Outliner toolbar.\n\nLearn more about this command in Academy","metadata":{"title":"Curve Shell","section":"Curve Shell","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/curve-shell/#curve-shell","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/curve-shell/#curve-shell","collection":"docs7","hash":"b82bb6d88011feb8afcc37c529cf469b","indexed_by":"docs-index"}},{"content":"Cut — Cut\n\nWith this command you can make a hole on a solid object. It's especially useful to punch holes into your designs using the shape you want.\n\nIf you run this command, it will ask you to select the planar curve you want to use as the shape, and then a solid object which you want to make the hole into.\n\nTo take effect, the selected planar curve should be oriented with its inner area towards the solid object.","metadata":{"title":"Cut","section":"Cut","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/cut/#cut","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/cut/#cut","collection":"docs7","hash":"5783f0199c2d26c2fca813bbd636093e","indexed_by":"docs-index"}},{"content":"Boss — Boss\n\nThe Boss command extrudes closed planar curves normal to the curve plane toward a boundary surface where the boundary surface is trimmed and joined to the extruded objects.\n\nSteps\n\n1. Select planar curves.\n2. Select a surface or polysurface boundary.\\ If a curve is inside a target (for example, circle inside a box), then a hole is created.\n\n#### Command-line option\n\n-Mode: Sets the style for the extrusion.\n\n* Straight: Extrudes the curves straight.\n* Tapered: Extrudes the curves with a draft angle.\n* DraftAngle: Sets the angle of the taper\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Boss","section":"Boss","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/boss/#boss","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/boss/#boss","collection":"docs7","hash":"1b18c9a08dd2698dda4d76aa66685980","indexed_by":"docs-index"}},{"content":"Extrude Curve Along Curve — Extrude Curve Along Curve\n\nThe ExtrudeCrvAlongCrv command creates a surface by tracing the path of a curve along another path curve.\n\nSteps\n\n1. Select a curve.\n2. Select the path curve.\n\n#### Command-line options\n\nOutput\n\n* Surface: Create a surface object.\n* SubD: Create a SubD object.\n* SubD friendly curves as the input create a better SubD object.\n* Some options may not be available when Output=SubD.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to maje a closed polysurface.\n\nDeleteInput\n\n* Yes: Deletes the input objects.\n* No: Keeps the input objects.\n\nSubCurve: Extrudes a curve the distance specified by picking two points along a curve.\n\nThe extruded surface starts from the beginning of the curve, not the first picked point. Picking the points only establishes the extrusion distance.\n\n* Steps\n\n1.Select the path curve.\n\n2.Pick a start along the path curve.\n\n3.Pick an end along the path curve.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Curve Along Curve","section":"Extrude Curve Along Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-along-curve/#extrude-curve-along-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-along-curve/#extrude-curve-along-curve","collection":"docs7","hash":"72683030fbef47b2222b2f0a636af1d1","indexed_by":"docs-index"}},{"content":"Extrude Curve Tapered — Extrude Curve Tapered\n\nThe ExtrudeCrvTapered command creates a surface by tracing the path of a curve in a straight line tapering in or out at a specified draft angle.\n\nSteps\n\n1. Select a curve.\n2. Specify a distance.\n\n#### Command-line options\n\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extrisopm distance.\n\nDirection: Two points establish the direction angle.\n\n* Direction steps\n\n1.Pick a base point.\n\n2.Pick a second point that establishes the direction angle.\n\nDraftAngle: Specify the draft angle for the taper. The draft angle depends on the construction plane orientation. When the surface is vertical/perpendicular to the construction plane, the draft angle is zero. When the surface is parallel to the construction plane, the draft angle is 90 degrees.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nCorners: Specifies how corner continuity is handled.\n\n* Sharp: The corners of the tapered surfaces will extend to meet at sharp corners with position (G0) continuity.\n* Round: The corners of the tapered surfaces will be filled with filleted segments with tangent (G1) continuity.\n* Smooth: The corners of the tapered surfaces will be filled with blend segments with curvature (G2) continually.\n\nDeleteInput: Delete (Yes) or keeps (No) the input objects.\n\nFlipAngle: Toggles the draft angle direction.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Curve Tapered","section":"Extrude Curve Tapered","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-tapered/#extrude-curve-tapered","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-tapered/#extrude-curve-tapered","collection":"docs7","hash":"c67cde45eb3b9a93d9a97bf7b01cf6e9","indexed_by":"docs-index"}},{"content":"Extrude Curve To Point — Extrude Curve To Point\n\nThe ExtrudeCrvToPoint command creates a surface by tracing the path of a curve tapering to converge at a selected point.\n\nSteps\n\n1. Select a curve.\n2. Pick the point to extrude to.\n\n#### Command-line options\n\nOutput\n\n* Surface: Create a surface object.\n* SubD: Create a SubD object.\n* A SubD friendly curve as the input creates a better SubD object.\n* Some options may not be available when Output = SubD.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Curve To Point","section":"Extrude Curve To Point","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-to-point/#extrude-curve-to-point","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-curve-to-point/#extrude-curve-to-point","collection":"docs7","hash":"df5eb22d6401915a3ec6c85dfea8f435","indexed_by":"docs-index"}},{"content":"Extrude Surface Along Curve — Extrude Surface Along Curve\n\nThe ExtrudeSrfAlongCrv command creates a solid by tracing the path of the surface edges along another path curve.\n\nSteps\n\n1. Select a surface.\n2. Select the path curve near the start.\n\n#### Command-line options\n\n-Solid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\n-DeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\n-SubCurve: Extrudes a curve the distance specified by picking two points along a curve.\n\nThe extruded surface starts from the beginning of the curve, not the first picked point. Picking the points only establishes the extrusion distance.\n\n* SubCurve steps\n\n1.Select the path curve.\n\n2.Pick a start along the path curve.\n\n3.Pick an end along the path curve.\n\n-ToBoundary: Extrudes the object to a boundary surface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Surface Along Curve","section":"Extrude Surface Along Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-along-curve/#extrude-surface-along-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-along-curve/#extrude-surface-along-curve","collection":"docs7","hash":"d8c50ba0ec7896d114c701d41d27cc4f","indexed_by":"docs-index"}},{"content":"Extrude Surface Tapered — Extrude Surface Tapered\n\nThe ExtrudeSrfTapered command creates a solid by tracing the path of the surface edges in a straight line tapering in or out at a specified draft angle.\n\nSteps\n\n1. Select a surface.\n2. Specify a distance.\n\n#### Command-line options\n\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extrusion distance.\n\nDirection: Two points establish the direction angle.\n\n* Direction steps\n\n1.Pick a base point.\n\n2.Pick a second point that establishes the direction angle.\n\nDraftAngle: Specify the draft angle for the taper. The draft angle depends on the construction plane orientation. When the surface is vertical/perpendicular to the construction plane, the draft angle is zero. When the surface is parallel to the construction plane, the draft angle is 90 degrees.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nCorners: Specifies how corner continuity is handled.\n\n* Sharp: The corners of the tapered surfaces will extend to meet at sharp corners with position (G0) continuity.\n* Round: The corners of the tapered surfaces will be filled with filleted segments with tangent (G1) continuity.\n* Smooth: The corners of the tapered surfaces will be filled with blend segments with curvature (G2) continuity.\n\nDeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\nFlipAngle: Toggles the draft angle direction.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Surface Tapered","section":"Extrude Surface Tapered","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-tapered/#extrude-surface-tapered","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-tapered/#extrude-surface-tapered","collection":"docs7","hash":"3705598e98495e8f7c1eaed85d9bbaf6","indexed_by":"docs-index"}},{"content":"Extrude Surface To Point — Extrude Surface To Point\n\nThe ExtrudeSrfToPoint command creates a solid by tracing the path of the surface edges tapering to converge at a selected point.\n\nSteps\n\n1. Select a surface.\n2. Pick the point to extrude to.\n\n#### Command-line options\n\n-Solid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nDeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\nToBoundary: Extrudes the object to a boundary surface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Surface To Point","section":"Extrude Surface To Point","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-to-point/#extrude-surface-to-point","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface-to-point/#extrude-surface-to-point","collection":"docs7","hash":"2c0d99bbe436abd82f674115536e363a","indexed_by":"docs-index"}},{"content":"Extrude Surface — Extrude Surface\n\nThe ExtrudeSrf command creates a solid by tracing the path of the surface edges in a straight line.\n\nSteps\n\n1. Select a surface.\n2. Specify a distance.\n\n#### Command-line options\n\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extrusion distance.\n\nDirection: Two points establish the direction angle\n\n* Direction steps\n\n1.Pick a base point.\n\n2.Pick a second point that establishes the direction angle.\n\nBothSides: Draws the object on both sides of the start point, creating the object twice as long as you indicate.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nDeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\nToBoundary: Extrudes the object to a boundary surface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude Surface","section":"Extrude Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface/#extrude-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude-surface/#extrude-surface","collection":"docs7","hash":"51c188b3f18ff7a8b469f1cdb5b8287a","indexed_by":"docs-index"}},{"content":"Extrude — Extrude\n\nThe ExtrudeCrv command creates a surface by tracing the path of a curve in a straight line.\n\nSteps\n\n1. Select a curve.\n2. Specify a distance.\n\n#### Command-line options\n\nOutput\n\n* Surface: Create an extrusion or a surface object\n* SubD: Create a SubD object.\n* A SubD friendly curve as the input creates a better SubD object.\n* Some options may not be available when Output=SubD.\n\nDirection: Pick two points to define the extruding direction.\n\nBothSides: Extrude towards the both sides of the input curve.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nToBoundary: Extrude the object to a boundary surface.\n\nDeleteInput: Specify if the input object will be deleted.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extrude","section":"Extrude","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude/#extrude","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/extrude/#extrude","collection":"docs7","hash":"e275223263f9fb78740d3c05bd987333","indexed_by":"docs-index"}},{"content":"Rib — Rib\n\nThe Rib command extrudes a curve in two directions to a boundary surface.\n\nSteps\n\n1. Select planar curves to rib.\n2. Select a boundary.\n\n#### Command-line options\n\n-Offset: The offset direction relative to the input curve.\n\n* InCurvePlane: Use when the input curve describes the rib in plan view.\n* NormalToCurvePlane: Use when the rib curve describes the rib in elevation view.\n\n-Distance: Sets the offset distance.\n\n-Mode\n\n* Straight: Extrudes the curve straight to the boundary.\n* Tapered: Extrudes the curves to the boundary with a draft angle.\n* DraftAngle: Specify the draft angle for the taper. The draft angle depends on the construction plane orientation. When the surface is vertical/perpendicular to the construction plane, the draft angle is zero. When the surface is parallel to the construction plane, the draft angle is 90 degrees.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Rib","section":"Rib","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/rib/#rib","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/extrusion/rib/#rib","collection":"docs7","hash":"f9c4078d87fa2f53653205131e9c1235","indexed_by":"docs-index"}},{"content":"Extrude Face\n\nExtrude Face\n\nThe ExtrudeSrf command creates a solid by tracing the path of the surface edges in a straight line.\n\nSteps\n\n1. Select a surface.\n2. Specify a distance.\n\n#### Command-line options\n\n-SetBasePoint\n\n* Specify a location that serves as the first point when picking two points that set the extrusion distance.\n\n-Direction\n\n* Two points establish the direction angle\n* Direction steps\n\n1.Pick a base point.\n\n2.Pick a second point that establishes the direction angle\n\n-BothSides\n\n* Draws the object on both sides of the start point, creating the object twice as long as you indicate.\n\n-Solid\n\n* If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\n-DeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\n-ToBoundary\n\n* Extrudes the object to a boundary surface\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extrude Face","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/extrude-face/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/extrude-face/","collection":"docs7","hash":"09393a4308211af55a92d46e1989a052","indexed_by":"docs-index"}},{"content":"Merge All Coplanar Faces\n\nMerge All Coplanar Faces\n\nThe MergeAllCoplanarFaces command combines the faces of each planar region on a mesh, polysurface, or SubD into a single face.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Merge All Coplanar Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/merge-all-coplanar-faces/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/merge-all-coplanar-faces/","collection":"docs7","hash":"c3a0b9c84747717ca1bd7fdaecbfa70c","indexed_by":"docs-index"}},{"content":"Move Edge\n\nMove Edge\n\nThe MoveEdge command moves a polysurface edge.\n\nSteps\n\n1. Select edges.\n2. Pick a point to move from.\n3. Pick a point to move to.\n\n#### Command-line options\n\n-DirectionConstraint:\n\n* None: No restriction to direction.\n* FirstFaceNoraml: Restricts movement to the normal direction of the first face selected.\n* SecondFaceNormal: Restricts movement to the normal direction of the second face selected.\n* AverageFacesNormal: Restricts movement to an average of the normal directions of the first and second faces.\n* Vertical: Restricts movement vertical to the construction plane.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Move Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-edge/","collection":"docs7","hash":"eb9881eebc679fecc38d65a728f01a53","indexed_by":"docs-index"}},{"content":"Move Face To Boundary\n\nMove Face To Boundary\n\nThe MoveFace command moves a polysurface face.\n\nThe surrounding joined surfaces are adjusted to accommodate the new face orientation.\n\nFaces on relatively simple polysurfaces such as boxy planar shapes can be moved to adjust things like wall locations in a building or planes in a mechanical part.\n\nSteps\n\n1. Select a face.\n2. Pick a point to move from.\n3. Pick a point to move to.\n\n#### Command-line options\n\n-DirectionConstraint\n\n* None: The face can be moved any direction.\n* Normal: The face can only be moved in the positive or negative normal direction.\n\n-ToBoundary\n\n* DeleteBoundary: Determines whether or not the boundary is deleted after the move.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Move Face To Boundary","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-face-to-boundary/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-face-to-boundary/","collection":"docs7","hash":"d81a157339597f14a49e763436ac3a23","indexed_by":"docs-index"}},{"content":"Move Face\n\nMove Face\n\nThe MoveFace command moves a polysurface face.\n\nThe surrounding joined surfaces are adjusted to accommodate the new face orientation.\n\nFaces on relatively simple polysurfaces such as boxy planar shapes can be moved to adjust things like wall locations in a building or planes in a mechanical part.\n\nSteps\n\n1. Select a face.\n2. Pick a point to move from.\n3. Pick a point to move to.\n\n#### Command-line options\n\n-DirectionConstraint\n\n* None: The face can be moved any direction.\n* Normal: The face can only be moved in the positive or negative normal direction.\n\n-ToBoundary\n\n* DeleteBoundary: Determines whether or not the boundary is deleted after the move\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Move Face","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-face/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-face/","collection":"docs7","hash":"34b7a6e122f6f82a19a45a989cddc298","indexed_by":"docs-index"}},{"content":"Move Untrimmed Edge\n\nMove Untrimmed Edge\n\nThe MoveUntrimmedEdge command moves the edge of an untrimmed polysurface face.\n\nThe surrounding joined surfaces are adjusted to accommodate the new face shape and orientation.\n\nSteps\n\n1. Select an edge of an untrimmed face.\n2. Pick a point to move from.\n3. Pick a point to move to.\n\n#### Command-line option\n\n* Copy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on. The RememberCopyOptions command determines whether the selected option is used as the default.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Move Untrimmed Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-untrimmed-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-untrimmed-edge/","collection":"docs7","hash":"1bcdd0836deac0a8809a9e098053ea74","indexed_by":"docs-index"}},{"content":"Move Untrimmed Face\n\nMove Untrimmed Face\n\nThe MoveUntrimmedFace command moves an untrimmed polysurface face.\n\nThe surrounding joined surfaces are adjusted to accommodate the new face orientation.\n\nSteps\n\n1. Select a face.\n2. Pick a point to move from.\n3. Pick a point to move to.\n\n#### Command-line option\n\n* Copy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on. The RememberCopyOptions command determines whether the selected option is used as the default.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Move Untrimmed Face","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-untrimmed-face/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/face-edition/move-untrimmed-face/","collection":"docs7","hash":"ff76e3fcc6d0fc7da37e1c76ca41cdc6","indexed_by":"docs-index"}},{"content":"Blend Edge\n\nBlend Edge\n\nThe BlendEdge command creates a curvature-continuous blend surface between polysurface edges with varying radius values.\n\nThe polysurface is trimmed and joined to the blend.\n\n#### Steps\n\n1. Select edges. Or, double-click an edge to select tangent edges.\n2. Edit radius handles and options.\n\n#### Command-line options\n\n-ShowRadius\n\n* Yes: Displays radius handles in the viewport.\n* No: Hides radius handles in the viewport. A hidden radius handle will display when the mouse cursor is close to it.\n\n-NextRadius: Specifies the radius for the next edge.\n\n-ChainEdges: Automatically selects connected edge based on continuity.\n\n-FaceEdges: Pick a face to select its boundary edges. Tangent edges are excluded.\n\n-PreviousEdgeSelection: In cases where the command is canceled or ended prematurely, the PreviousEdgeSelection option re-selects the previously selected edges. Supports multiple sets of previously selected edges for up 20 previous edge sets.\n\n-TrimAndJoin: Trims and joins the resulting surface to the input surfaces. History only works if TrimAndJoin=No\n\n-SelectEdges: Allows selecting more edges after the selection has been closed.\n\n-Preview: Displays a dynamic preview. You can change the options and the preview will update\n\n-Edit: Edit the most recent selected set of edges.\n\n* \"Tip\": When no command is running, double-clicking the object is the alternative way to start the editing mode.\n* To edit edges\n\n1.Select the object to edit. The editable edges highlight.\n\n2.Edit the size of the handles.\n\n3.Click the SelectEdges option.\n\n4.Use Shift + click to add edges. Use Ctrl + click to remove edges. Remove all edges in the most recent edge set to return to the previous edge set.\n\nTip: Radius and Distance options appear on the command line when you drag a handle grip.","metadata":{"title":"Blend Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/blend-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/blend-edge/","collection":"docs7","hash":"1df5fbfebee0fdc9a583b3e91e5aeed0","indexed_by":"docs-index"}},{"content":"Blend Edge\n\n#### Radius/Distance options\n\n-FromCurve: Select a curve. The radius of the curve at the picked location will be used.\n\n-FromTwoPoints: Pick two points to show the radius distance.\n\n#### Handle options\n\n-AddHandle: Adds a handle along the edges.\n\n-CopyHandle: Adds a new handle using the distance from the selected handle.\n\n-RemoveHandle: Visible only when at least one handle has been added.\n\n-SetAll: Sets the distance or radius for all handles.\n\n-LinkHandles: Editing a single handle updates all handles\n\n#### RailType options\n\n-DistFromEdge: The distance from the edge curves determines the intersection.\n\n-RollingBall: The radius of a rolling ball determines the intersection.\n\n-DistBetweenRails: The distance between the edge rails determines the intersection\n\n-Preview: Displays a dynamic preview. You can change the options and the preview will update.\n\n-Edit: Allows changing the radius of existing blends.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Blend Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/blend-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/blend-edge/","collection":"docs7","hash":"9b4e41f0d3729a8eb58ed917bbd962f2","indexed_by":"docs-index"}},{"content":"Chamfer Edge\n\nChamfer Edge\n\nThe ChamferEdge command creates a ruled surface between selected polysurface edges with varying chamfer distances, trims and joins the chamfer surfaces to the surface.\n\nSteps\n\n1. Select edges.\n\nOr, double-click an edge to select tangent edges.\n2. Edit chamfer distance handles and options.\n\n#### Command-line options\n\n-ShowsChamferDistance\n\n* Yes: Displays chamfer distance handles in the viewport.\n* No: Hides chamfer distance handles in the viewport. A hidden chamfer distance handle will display when the mouse cursor is close to it.\n\n-NextChamferDistance: Specifies the chamfer distance for the next edge.\n\n-ChainEdges: Automatically selects connected edge based on continuity.\n\n-FaceEdges: Pick a face to select its boundary edges. Tangent edges are excluded.\n\n-PreviousEdgeSelection: In cases where the command is canceled or ended prematurely, the PreviousEdgeSelection option re-selects the previously selected edges. Supports multiple sets of previously selected edges for up 20 previous edge sets.\n\n-TrimAndJoin: Trims and joins the resulting surface to the input surfaces. History only works if TrimAndJoin=No\n\n-SelectEdges: Allows selecting more edges after the selection has been closed.\n\n-Preview: Displays a dynamic preview. You can change the options and the preview will update\n\n-Edit: Edit the most recent selected set of edges.\n\n* \"Tip\": When no command is running, double-clicking the object is the alternative way to start the editing mode.\n* To edit edges\n\n1.Select the object to edit. The editable edges highlight.\n\n2.Edit the size of the handles.\n\n3.Click the SelectEdges option.\n\n4.Use Shift + click to add edges. Use Ctrl + click to remove edges. Remove all edges in the most recent edge set to return to the previous edge set.","metadata":{"title":"Chamfer Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/chamfer-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/chamfer-edge/","collection":"docs7","hash":"b12c8a8685d3b5c21c2210b125207927","indexed_by":"docs-index"}},{"content":"Chamfer Edge\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Chamfer Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/chamfer-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/chamfer-edge/","collection":"docs7","hash":"e15d69c11202ff17a5c269a6dd002bea","indexed_by":"docs-index"}},{"content":"Fillet Edge\n\nFillet Edge\n\nThe FilletEdge command creates a tangent surface between polysurface edges with varying radius values then trims and joins the original faces to the fillet surfaces.\n\nSteps\n\n1. Select edges.\n\nOr, double-click an edge to select tangent edges.\n2. Edit radius handles and options.\n\n#### Command-line options\n\n-ShowRadius\n\n* Yes: Displays radius handles in the viewport\n* No: Hides radius handles in the viewport. A hidden radius handle will display when the mouse cursor is close to it.\n\n-NextRadius: Specifies the radius for the next edge.\n\n-ChainEdges: Automatically selects connected edges based on continuity\n\n-FaceEdges: Pick a face to select its boundary edges. Tangent edges are excluded.\n\n-PreviousEdgeSelection: In cases where the command is canceled or ended prematurely, the PreviousEdgeSelection option re-selects the previously selected edges. Supports multiple sets of previously selected edges for up 20 previous edge sets.\n\n-TrimAndJoin: Trims and joins the resulting surface to the input surfaces. History only works if TrimAndJoin=No\n\n-SelectEdges: Allows selecting more edges after the selection has been closed.\n\n-Preview: Displays a dynamic preview. You can change the options and the preview will update.\n\n-Edit: Edit the most recent selected set of edges.\n\n* \"Tip\": When no command is running, double-clicking the object is the alternative way to start the editing mode.\n* To edit edges\n\n1.Select the object to edit. The editable edges highlight.\n\n2.Edit the size of the handles.\n\n3.Click the SelectEdges option.\n\n4.Use Shift + click to add edges. Use Ctrl + click to remove edges. Remove all edges in the most recent edge set to return to the previous edge set.\n\nTip: Radius and Distance options appear on the command line when you drag a handle grip.","metadata":{"title":"Fillet Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/fillet-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/fillet-edge/","collection":"docs7","hash":"0ab582fecb9c1bc05582b6f02af4eefe","indexed_by":"docs-index"}},{"content":"Fillet Edge\n\n#### Radius/Distance options\n\n-FromCurve: Select a curve. The radius of the curve at the picked location will be used.\n\n-FromTwoPoints: Pick two points to show the radius distance.\n\n#### Handle options\n\n-AddHandle: Adds a handle along the edges.\n\n-CopyHandle: Adds a new handle using the distance from the selected handle.\n\n-RemoveHandle: Visible only when at least one handle has been added.\n\n-SetAll: Sets the distance or radius for all handles.\n\n-LinkHandles: Editing a single handle updates all handles\n\n#### RailType options\n\n-DistFromEdge: The distance from the edge curves determines the intersection.\n\n-RollingBall: The radius of a rolling ball determines the intersection.\n\n-DistBetweenRails: The distance between the edge rails determines the intersection\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Fillet Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/fillet-edge/","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/fillet-and-chamfer/fillet-edge/","collection":"docs7","hash":"47534bc571d0310ff0ab973febfcb13b","indexed_by":"docs-index"}},{"content":"Join and Unjoin — Join Edge\n\nThe JoinEdge command joins two naked edges that are out of tolerance.\n\nSteps\n\n* Select two naked surface or polysurface edges that are coincident or close together.\\ If the edges overlap (run somewhat parallel) along at least part of their length (an interval), but are not coincident, the Edge Joining dialog box reports, \"Joining these edges requires a join tolerance of \\ . Do you want to join these edges?\". The surfaces will extend to join along the intervals.","metadata":{"title":"Join and Unjoin","section":"Join Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/join-and-unjoin/#join-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/join-and-unjoin/#join-edge","collection":"docs7","hash":"031d9d39d2144b692b81e49a1162086a","indexed_by":"docs-index"}},{"content":"Join and Unjoin — Unjoin Edge\n\nThe UnjoinEdge command separates selected polysurface edges.\n\nSeams in closed surfaces will not separate.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Join and Unjoin","section":"Unjoin Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/join-and-unjoin/#unjoin-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/join-and-unjoin/#unjoin-edge","collection":"docs7","hash":"052270f77db8cad30cf0f4a7ad47226e","indexed_by":"docs-index"}},{"content":"Pipe — Pipe\n\nThe Pipe command creates a surface with a circular profile around curves.\n\nSteps\n\n1. Select one curve.\n2. Pick the start radius at the beginning of the pipe.\n3. If the curve is closed, pick the radius for the pipe.\n4. Pick the radius at the end of the pipe.\n5. Pick a point for the next radius, or press Enter to end the command.\n\n#### Command-line options\n\n-ChainEdges: Selects surface edges that are touching the selected edge.\n\n-Multiple: Allows selecting more than one curve.\n\n-Output\n\n* Surface: Creates a surface pipe.\n* SubD: Creates a SubD pipe.\n\n-Diameter/Radius: Toggle between picking a Radius and picking a Diameter.\n\n-Thick: Determines whether the pipe has two walls or one.\n\n* Thick steps\n\n1.Pick the first start radius.\n\n2.Pick the second start radius.\n\n3.Pick the first end radius.\n\n4.Pick the second end radius.\n\n-Cap: Specifies how to cap the ends.\n\n* None: No cap.\n* Flat: Cap with planar surface.\n* Round: Cap with hemispherical surface.\n\n-FitRail: If the curve is a polycurve of lines and arcs, the curve is fit and a single surface is created; otherwise the result is a polysurface with joined surfaces created from the polycurve segments.\n\n-ShapeBlending (Single curve only)\n\n* Local: The pipe radius stays constant at the ends and changes more rapidly in the middle.\n* Global: The radius is linearly blended from one end to the other, creating pipes that taper from one radius to the other.\n* WallThickness (Single curve only): Specifies the value for the distance between the inside and outside of the pipe. Negative numbers make the first radius the outer core.\n\n#### ChainEdgens options\n\n-AutoChain: Selecting a curve or surface edge automatically selects all curve segments connected with the level of continuity set by the ChainContinuity option.","metadata":{"title":"Pipe","section":"Pipe","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/pipe/#pipe","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/pipe/#pipe","collection":"docs7","hash":"7703eb0cf65d2a4af3d57d06aa0983ac","indexed_by":"docs-index"}},{"content":"Pipe — Pipe\n\n-ChainContinuity: Controls the level of continuity required between segments to be selected with the AutoChain option.\n\n* Direction\n* Forward: Selects curves in the positive curve direction.\n* Backward: Selects curves in the negative curve direction.\n* Both: Selects curves in both the posive and negative curve direction\n\n-GapTolerance: If the gap between two edges/curves is less than this value, the chain selection will ignore the gap and will select the next segment.\n\n-AngleTolerance: When Continuity is set to Tangency, if the angle between two edges/curves is less than this values, the chain selection will consider the criteria for continuity.\n\n-Undo: Undo last segment selection.\n\n-Next: Select next segment.\n\n-All: Select all segments.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Pipe","section":"Pipe","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/pipe/#pipe","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/pipe/#pipe","collection":"docs7","hash":"a71a67b448ce406f32329e84a41e05c2","indexed_by":"docs-index"}},{"content":"Profiles — Profiles\n\nUsing this command you can create a custom Element following a curve, and use multiple shapes on multiple points along the curve. Ideal to make decorative elements, or sleek and amazing jewelry pieces.\n\nUpon activation, the user is prompted to select a base curve to build the design. This curve serves as the foundation on which profiles are applied. Once the curve is chosen, the user is presented with a gallery of pre-defined profile samples to select from.\n\n* Sample Selection: The gallery offers a variety of profiles suited for different types of designs. After selecting a profile, the user can either accept it as is or choose to further customize it.\n* Customization: If the user opts to edit the profile, two panels appear in the Artisan's panel:\n\n1. Selection Panel: This panel displays the selected curve and any object that the profiles will be oriented to. The user can modify their choices at this stage if needed.\n2. Parameters Panel: In this panel, users can add multiple profiles along the curve and modify each profile's properties. A \"+\" shape button is available to add as many profiles as needed for the customization of the piece. Once a profile is added, the user must choose a point along the curve to specify where the new profile will be placed. Afterward, its parameters can be adjusted, including:\n* Width: Alters the profile's width relative to the base curve.\n* Height: Modifies the profile's vertical dimension.\n* Rotation: Allows for precise rotation of the profile along the curve.\n* Displacement: Provides the ability to move the profile along the curve’s axis, enabling fine control over the design's flow.\n\nAdditionally, two key parameters allow for further customization:","metadata":{"title":"Profiles","section":"Profiles","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/profiles/#profiles","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/profiles/#profiles","collection":"docs7","hash":"eb77d7256f14b39838aaa25af9f55951","indexed_by":"docs-index"}},{"content":"Profiles — Profiles\n\n* Mode: Defines the base structure of the profile:\n* Solid: A flat base for a solid, sturdy design.\n* Comfort: A domed base, ideal for creating a more ergonomic, comfortable fit (e.g., rings).\n* Thickness: A scooped section, allowing for control over material thickness for lighter, refined designs.\n* Orientation: Provides the ability to flip the section when needed, useful for achieving the desired alignment and symmetry.\n* We can also define the length of the rounded caps.&#x20;\n* Rebuild Profile : The 'rebuild profile' process refines the shape of a surface, ensuring more precise and accurate geometry, particularly in cases where the surface is highly curved or exhibits double curvature. This technique helps to maintain the smoothness and continuity of the surface, minimizing errors that can arise when working with complex.&#x20;\n\nOnce adjustments are made, you can finalize the design by accepting the modified piece.\n\nOne of the key benefits of using the 'Profile' command is its dynamic preview capability. As users make adjustments to the profile parameters, changes are instantly reflected in the viewport. This real-time feedback allows for a smooth and intuitive design process, enabling users to visualize their modifications immediately and make precise adjustments with confidence.\n\nYou will need to have at least 2 profiles created in order to generate valid geometry.\n\nWhen you confirm your changes, the Profile object will be listed on the Outliner toolbar.","metadata":{"title":"Profiles","section":"Profiles","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/profiles/#profiles","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/profiles/#profiles","collection":"docs7","hash":"4c23a280d5b13ba417e2332aabd3990f","indexed_by":"docs-index"}},{"content":"Pull Push — Pull Push\n\nThe PushPull command extrudes a polysurface face to interactively add or remove volumes on the polysurface.\n\nSteps\n\n1. Select a surface.\n* Curves lying on the surface can be detected for finding regions.\n* Use the Invert option to swap the selected and unselected regions.\n* Click on a region to toggle its selection state.\n2. Move the mouse to decide the extruding direction and distance.\n* The preview color changes to red if the operation is going to remove a volume from the object.\n* When you enter a distance, the mouse cursor location is the positive direction.\n\n\\*The scriptable command, -PushPull, always uses the surface normal as the positive direction.\n\n#### Command-line options\n\n-Invert: Swaps the selected an unselected regions. The Invert option is only available when the selected surface has curves lying on it that divide the surface into three or more regions.\n\n-Mode: The Mode option is only available when extending is possible that is when all the surrounding surfacees are planar.\n\n* Extrude: Extrudes the selected surface without extending or shortening the surrounding surfaces.\n* Extend: Extends or shortens the surrounding surfaces when extruding the selected surface.\n\n-Toggle: Switches the operation mode between Extrude and Extend.\n\n-Direction: Defines the direction by picking two points or typing two coordinates. The default direction is the normal direction of the selected surface.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Pull Push","section":"Pull Push","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/pull-push/#pull-push","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/pull-push/#pull-push","collection":"docs7","hash":"8cdfb6f60d5f19998e71d7c22b288901","indexed_by":"docs-index"}},{"content":"Recess — Recess\n\nThis command allows you to create depressions or protrusions on solid objects following the shape of a curve, which should be in contact with the solid.\n\n.png)\n\nWhen you run the command, its options will be displayed on the command prompt. It will first ask to select the curve, and then the solid object. Following will give you two parameters Height, which is the dimensions in millimeters of the recess or protrusion, and Mode, which can be Recess to make a depression in the object, or Protrusion to make a bump.\n\nPressing the Enter key confirms your changes and finishes the command.\n\nLearn more about this command in Academy","metadata":{"title":"Recess","section":"Recess","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/recess/#recess","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/recess/#recess","collection":"docs7","hash":"011a033d38e4e6cf096851ea051773a3","indexed_by":"docs-index"}},{"content":"Shell — Shell\n\nThe Shell command creates a hollowed out shell from a solid.\n\nShell only operates on simple, solid, manifold polysurfaces. These surfaces are removed and the remainder is offset inward, using the outer parts of the removed surfaces to join the inner and outer parts.\n\nSteps\n\n1. Select faces to remove from closed polysurface.\\ Leave at least one face unselected.\n2. Press Enter when done\\ This step specifies which surfaces will be removed to make the shelled object.\n\n#### Command-line options\n\n-Thickness: Specify the thickness for the shell.\n\n-DeleteInput: Specify if the input object will be deleted.\n\n-EditThickness: Select a shelled object with History recorded to change the thickness.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Shell","section":"Shell","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/shell/#shell","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/shell/#shell","collection":"docs7","hash":"49b0dcde9c8c6ff335e730059aec05be","indexed_by":"docs-index"}},{"content":"Solid Control Points — Solid Control Points\n\nThe SolidPtOn command turns on grips at the ends of surface and joined polysurface edges, including closed solids.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Solid Control Points","section":"Solid Control Points","url":"https://www.rhinoartisan.com/docs/7/tabs/solid/solid-control-points/#solid-control-points","source":"https://www.rhinoartisan.com/docs/7/tabs/solid/solid-control-points/#solid-control-points","collection":"docs7","hash":"32c895f25c0164324d0b8d20eaa70003","indexed_by":"docs-index"}},{"content":"SubD\n\nNine groups, left to right.\n\nConvert and display\nTo SubD Turns a mesh or surface into a SubD.\n\nDisplay Mode Switches between the smooth and the box view.\n\nPrimitives\nSingle Face One SubD face from four corners.\n\nPlane A flat SubD plane.\n\nBox A SubD box.\n\nSphere A SubD sphere.\n\nEllipsoid A SubD ellipsoid.\n\nCylinder A SubD cylinder.\n\nCone A SubD cone.\n\nTruncated Cone A SubD cone with its tip cut off.\n\nTorus A SubD ring.","metadata":{"title":"SubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/","collection":"docs7","hash":"22fc08e44395bfb34a4c7e32ffacbcea","indexed_by":"docs-index"}},{"content":"SubD — From curves\n\nSweep 1 Sweeps a profile along one rail as SubD.\n\nSweep 2 Sweeps a profile along two rails as SubD.\n\nMultipipe Builds a SubD pipe network around a curve skeleton.\n\nOffset Offsets a SubD, optionally solidifying it.\n\nReflect Adds a mirror plane so both halves stay in sync.\n\nRemove Symmetry Drops the symmetry constraint, freeing both halves.\n\nRevolve Revolves a profile into a SubD.\n\nLoft Lofts a SubD through profile curves.\n\nExtract Control Polygon Draws the control cage as a mesh.\n\nExtrude Extrudes a curve or face into a SubD.\n\nExtract Surface Pulls a face out as its own surface.\n\nRadiate Repeats geometry radially around an axis.","metadata":{"title":"SubD","section":"From curves","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/#from-curves","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/#from-curves","collection":"docs7","hash":"89af39908496bc3b1ceab43486572d3c","indexed_by":"docs-index"}},{"content":"SubD — Add geometry\n\nInsert Point Adds a vertex to a face.\n\nInsert Edge Inserts an edge loop.\n\nExpand Edges Widens an edge into a band of faces.\n\nAppend Adds a face onto a border edge.\n\nSubdivision Splits every face, raising the density.\n\nInset Insets a face inside its own border.\n\nEdit\nBevel Bevels the edges you pick.\n\nRemove Crease Softens an edge marked sharp.\n\nCrease Marks an edge as sharp.\n\nMerge Faces Merges the faces you pick into one.\n\nSmooth Relaxes the shape, evening out the vertices.\n\nSlide Edge Slides an edge along the surface.\n\nSpin Edge Rotates a shared edge to the other diagonal.\n\nMerge Coplanar Face Merges faces lying in the same plane.\n\nAlign Vertices Lines up the vertices you pick.\n\nSoft Transform Moves a vertex and lets the neighbours follow.","metadata":{"title":"SubD","section":"Add geometry","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/#add-geometry","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/#add-geometry","collection":"docs7","hash":"420275052c334418e3995345cb395891","indexed_by":"docs-index"}},{"content":"SubD — Close and repair\n\nStitch Sews two SubD borders together.\n\nFill Hole Closes an open border with new faces.\n\nBridge Connects two openings with a tube of faces.\n\nDelete Face Removes the faces you pick.\n\nRemesh\nQuad Mesh Rebuilds the shape as an even quad grid.\n\nRepair Mesh Fixes what stops a mesh becoming a SubD.\n\nPack SubD Faces Packs the faces into texture space.\n\nSet Per Face Color By Face Pack Colours each face by its pack, to read the layout.","metadata":{"title":"SubD","section":"Close and repair","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/#close-and-repair","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/#close-and-repair","collection":"docs7","hash":"5354bae3bfb3d5b018e9b7a588b4455a","indexed_by":"docs-index"}},{"content":"SubD — Selection\n\nSubD Edge Selects edges.\n\nSubD Face Selects faces.\n\nSubD Vertex Selects vertices.\n\nSubD Object Selects the whole SubD.\n\nLoop Edge Selects the edge loop through a picked edge.\n\nLoop Face Selects the face loop through a picked face.\n\nEdge Ring Selects the ring of parallel edges.\n\nSubD Edges Selects every edge of the SubD.\n\nToggle Face Edge Vertex Cycles the selection filter.\n\nSelect SubD Selects every SubD in the file.\n\nFaces To Boundary Grows a face selection out to a border.\n\nBrush Paints a selection with the cursor.\n\nNamed Selections Saves a selection to recall later.\n\nMake SubD Friendly Rebuilds a curve or surface so SubD tools accept it.","metadata":{"title":"SubD","section":"Selection","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/#selection","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/#selection","collection":"docs7","hash":"55c744d1dc2e996ee5c3c8181fd98346","indexed_by":"docs-index"}},{"content":"SubD — Convert out\n\nTo NURBS Converts the SubD back to NURBS surfaces.\n\nEvery command here is Rhino's own SubD toolset, gathered into one tab. For the organic workflow it belongs to — sculpting, relief and the generative tools — see Organic Modeling & Sculpting.","metadata":{"title":"SubD","section":"Convert out","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/#convert-out","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/#convert-out","collection":"docs7","hash":"de1eab230ecdb6d4e98fa9f8ef6d0b2c","indexed_by":"docs-index"}},{"content":"ExtractControlPolygon — ExtractControlPolygon\n\nThe ExtractControlPolygon command fits a polyline through the control points of a curve or a polygon mesh through the control points of a surface.\n\nSteps\n1. Select curves or surfaces.\\ This creates polylines and/or meshes that have vertices at the original objects' control points.\n\nSupported input\n* Curves, Polycurves, Surfaces\n* SubDs","metadata":{"title":"ExtractControlPolygon","section":"ExtractControlPolygon","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractcontrolpolygon/#extractcontrolpolygon","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractcontrolpolygon/#extractcontrolpolygon","collection":"docs7","hash":"d59a592503a20e845fbf68f3eb492a15","indexed_by":"docs-index"}},{"content":"ExtractControlPolygon — Command-line option\n\n* OutputLayer:&#x20;\n\nSpecifies the layer for the results of the command.\n\n1. Current: Places the results on the current layer.\n2. Input: Places the results on the same layer as the input curve.\n\n_Note: If the input object is in a model that is attached using Worksession, the object will be placed on the current layer._\n3. TargetObject: Places the results on the same layer as the target surface.\n* SubCrv:&#x20;\n\nType subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"ExtractControlPolygon","section":"Command-line option","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractcontrolpolygon/#command-line-option","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractcontrolpolygon/#command-line-option","collection":"docs7","hash":"aa4282195fa471d7ede1d2dd82bdc2ce","indexed_by":"docs-index"}},{"content":"ExtractSrf — ExtractSrf\n\nThe ExtractSrf command separates or duplicates polysurface, Extrusion, or SubD faces.\n\nInput\n* Polysurface face\n* Extrusion face\n* SubD face\n\nSteps\nSelect the faces on a polysurface, an Extrusion, or a SubD.\n\n> * The extracted faces will be removed from the group containing the source object.\n> * To remove a surface from the selection, press Ctrl(CMD) while clicking.","metadata":{"title":"ExtractSrf","section":"ExtractSrf","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractsrf/#extractsrf","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractsrf/#extractsrf","collection":"docs7","hash":"3a022a5364872a74fd974f7900493a20","indexed_by":"docs-index"}},{"content":"ExtractSrf — Command-line options\n\n#### Copy\n\nSpecifies whether or not the selected faces are copied. A plus sign appears at the cursor when Copy=Yes.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\n#### OutputLayer\n\n* Current\n\nPlaces the results on the current layer.\n* Input\n\nPlaces the results on the source object's layer.\n\n#### SubDAddCorners\n\nCreases the SubD corner vertices on the boundaries created by the extraction.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"ExtractSrf","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractsrf/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extractsrf/#command-line-options","collection":"docs7","hash":"7f64ac0272c5b37538d6972425b8f39a","indexed_by":"docs-index"}},{"content":"ExtrudeSubD — ExtrudeSubD\n\nThe ExtrudeSubD command extrudes SubD faces and boundary edges with different direction modes.\n\nSteps\n1. Start the command.\n2. Select SubD faces or boundary edges to extrude.\n\nTo extrude a whole SubD, select the SubD before starting the command.\n3. Set command-line options.\n4. Pick or enter the extrusion distance.","metadata":{"title":"ExtrudeSubD","section":"ExtrudeSubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extrudesubd/#extrudesubd","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extrudesubd/#extrudesubd","collection":"docs7","hash":"c26b55117aece6f8d8a340f8661d1379","indexed_by":"docs-index"}},{"content":"ExtrudeSubD — Command-line options\n\n#### EdgeLoop\n\nPick an edge on the boundary to select an edge loop.\n\n#### Basis\n\n* WCS\n\nAll faces or boundary edges extrude in the same direction based on world coordinates.\n\n* Direction\n\nFree\n\nThe direction is picked freely.\n\n&#x20; X/Y/Z\n\n&#x20; The direction is fixed to the world X, Y, or Z axis.\n\n* UVN\n\nEach face or edge extrudes in the direction based on UVN coordinates.\n* Direction\n\nFree\n\nThe direction is picked freely.\n\n&#x20; V (Boundary edges only)\n\n&#x20; Boundary edges extrude along the extending direction of the faces.\n\n&#x20; N\n\n&#x20; Faces extrude along vertex normal directions.\n\n&#x20; Boundary edges extrude perpendicular to the faces.\n\nSetBasePoint\n\nPicks a point as the starting point of the extruding distance.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"ExtrudeSubD","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extrudesubd/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/extrudesubd/#command-line-options","collection":"docs7","hash":"c1a1a1f8b08ec8bb6b4060e35404cf60","indexed_by":"docs-index"}},{"content":"Loft — Loft\n\nThe Loft command fits a surface through selected profile curves that define the surface shape.\n\nSteps\n* Select the curves in the order in which the surface should pass through them.\\ Select open curves near the same ends. For closed curves, adjust the curve seams.\n\nAdjust seam options (Closed curves only)\n#### Flip\n\nReverses the curve direction.\n\n#### Automatic\n\nAttempts to align the seam points and directions without intervention.\n\n#### Natural\n\nMoves the seam points to the way they were at the beginning of the command.\n\n#### SnapToKnots\n\n* Yes: The seam points are always at the knots. You can only move them among the knots.\n* No: The seam points may leave the knots. You can move them without restriction.","metadata":{"title":"Loft","section":"Loft","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft","collection":"docs7","hash":"2494d23be58c4390086eeb6cf2c7392f","indexed_by":"docs-index"}},{"content":"Loft — Command-line option\n\n* Point: Allows picking a location for the start or end of the loft at a point. This tapers the loft to the selected point.\n\nNo point object is necessary, but it is a good idea to have some reference geometry in place to aid in picking the point location.\n\nPoint steps\n\n1. At the start or the end of the loft, click the Point option.\n2. Pick a location for the start or end location.\n* SubCrv: Type subcrv to select part of a curve as input.","metadata":{"title":"Loft","section":"Command-line option","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#command-line-option","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#command-line-option","collection":"docs7","hash":"73274db3f1f4efa6742b8c3ea409992c","indexed_by":"docs-index"}},{"content":"Loft — Loft Options\n\n#### Style\n\nDetermines the knot and control point structure of the surface.\n\nWhen some, but not all, endpoints of loft shapes touch, the loft type is restricted to Straight sections to avoid self-intersecting loops in the resulting surfaces.\n\n* Loose\n\nThe surface control points are created at the same locations as the control points of the original. This is a good option if the control points will be edited later.\n* Normal\n\nThe surface has an average amount of stretching between the curves. This is a good choice when the curves are proceeding in a relatively straight path or there is a lot of space between the curves.\n* Straight sections\n\nCreates a ruled surface. The sections between the curves are straight.\n* Tight\n\nThe surface closely follows the original. This is a good choice when the input curves are going around a corner.\n* Uniform\n\nMakes the object knot vectors uniform.\n\nClosed loft\n\nCreates a closed surface, continuing the surface past the last curve and around to the first curve. Available when you have selected three shape curves.\n\nMatch start tangent\n\nIf the start curve is a surface edge, the lofted surface maintains tangency with the adjacent surface. You must use at least three curves to activate this option.\n\nMatch end tangent\n\nIf the end curve is a surface edge, maintains tangency with the adjacent surface. You must use at least three curves to activate this option.\n\nSplitAtTangents\n\nIf checked, the loft creates a single surface.\n\nIf unchecked, the loft creates a polysurface when the input curves are joined tangent curves. Faces in the resulting polysurface correspond to the tangent sub-curves in the input curves.\n\n#### Cross-section curve options\n\nAlign Curves\n\nClick the end of a shape curve to reverse the direction.","metadata":{"title":"Loft","section":"Loft Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft-options","collection":"docs7","hash":"c1c6378d52de7ceac7128e99fdcb0dc0","indexed_by":"docs-index"}},{"content":"Loft — Loft Options\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Loft","section":"Loft Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/loft/#loft-options","collection":"docs7","hash":"43a45a0d038d4fab6d0f4ec9ba1a3825","indexed_by":"docs-index"}},{"content":"MultiPipe — MultiPipe\n\nThe MultiPipe command creates a SubD pipe frame with smooth conjunctions from intersected curves.\n\nSteps\n1. Select curves that form a frame.\n\nOverlapped segments result in a single pipe segment.\n2. Enter the radius.\n3. Specify the Cap and Struts options.\n\n0 is suggested when the input curves are not linear.","metadata":{"title":"MultiPipe","section":"MultiPipe","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/multipipe/#multipipe","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/multipipe/#multipipe","collection":"docs7","hash":"00960b891ae5c4f9a789145da1866bae","indexed_by":"docs-index"}},{"content":"MultiPipe — Command-line options\n\n#### Radius\n\nThe approximate radius of the SubD pipe frame.\n\n#### Cap (On/Off)\n\nOn adds a face at each opening. Off does not.\n\n#### Struts\n\nLines are divided at intersections into \"struts\", and then the SubD pipe frame is created with the specified divisions on each strut.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"MultiPipe","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/multipipe/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/multipipe/#command-line-options","collection":"docs7","hash":"5b41c2be7bb067c5d9142410fb018889","indexed_by":"docs-index"}},{"content":"OffsetSubD — OffsetSubD\n\nThe OffsetSubD command makes a copy of a SubD by moving its vertices towards the normal direction with the specified distance.\n\nCommand-line options\n#### Distance\n\nSets the offset distance.\n\n*\n\nArrows indicate the positive direction. Enter a negative number to offset to the other direction.\n\n*\n\n#### Solid\n\nAdds faces to fill the gap between the boundaries to create a closed SubD.\n\n*\n\nThe boundaries will turn into creases.\n\nTo change creases into smooth edges, use the RemoveCrease command.\n\n*\n\n#### BothSides\n\nOffsets the SubD towards the positive and negative sides at the same time.\n\n&#x20;\n\n#### DeleteInput&#x20;\n\nDeletes (Yes) or keeps (No) the input objects.\n\n*\n\nSet DeleteInput=No to record History.\n\n*\n\n#### FlipAll\n\nFlips the offset direction of all selected SubDs.\n\n*\n\nClick on SubDs to flip respectively.\n\n*\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"OffsetSubD","section":"OffsetSubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/offsetsubd/#offsetsubd","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/offsetsubd/#offsetsubd","collection":"docs7","hash":"407fe153f245b4e6e55d54d3d2c0c187","indexed_by":"docs-index"}},{"content":"Radiate — Radiate\n\nThe Radiate command creates a radial-symmetrical SubD with specified segments. Editing of one segment applies to all the others.\n\nSteps\n1. Select a SubD.\n2. Enter the segment number.\n3. Pick a point for the radial center.\n\nPress Enter to use the current CPlane origin.\n4. Edit any one of the segments.","metadata":{"title":"Radiate","section":"Radiate","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/radiate/#radiate","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/radiate/#radiate","collection":"docs7","hash":"4b9350678a7662f6bb2b2a71f543857c","indexed_by":"docs-index"}},{"content":"Radiate — Command-line options\n\n#### RemoveExistingReflectSymmetry\n\nUnlinks both sides of a Reflect SubD before creating the new symmetry.\n\n#### UseLastAxis\n\nUses the previous axis to create the radial symmetry.\n\n#### Axis\n\nPick two points to define the radial center and axis direction.\n\n* Basepoint\n\nPick two points on existing objects as the reference of axis direction.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Radiate","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/radiate/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/radiate/#command-line-options","collection":"docs7","hash":"2dab77557d114d2e91f7decec24d23bc","indexed_by":"docs-index"}},{"content":"Reflect — Reflect\n\nThe Reflect command makes a SubD symmetrical across a reflection plane and merges both sides into a single SubD.\n\nSteps\n1. Select a SubD.\n2. Pick two points to define the reflection plane.\n\nOr, select the XAxis or YAxis option to use the active CPlane x or y axis.\n\nThe arrows indicate the side to keep.\n\nThe vertices close to the reflection plane will be moved onto the reflection plane.\n3. Edit the SubD.","metadata":{"title":"Reflect","section":"Reflect","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/reflect/#reflect","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/reflect/#reflect","collection":"docs7","hash":"a5ec69c805063c6b7e84cbb07c9bfcb9","indexed_by":"docs-index"}},{"content":"Reflect — Command-line options\n\n#### XAxis / YAxis\n\nReflects the SubD across the x or y axis of the active CPlane.\n\n*\n\nThe reflection plane set by XAxis or YAxis options does not move with the object.\n\nThe reflection plane set by picking two points moves with the object.\n\n*\n\n#### RemoveExistingReflectSymmetry\n\nUnlinks both sides of a Reflect SubD before creating the new symmetry.\n\n#### Flip\n\nChanges the side to keep for the Reflect symmetry.\n\n#### Two-direction reflection\n\nA second reflection can be added to an existing reflect symmetry.\n\n1. Select an existing reflected SubD.\n2. Move the mouse to decide the location and direction of the second reflection plane.\n\nThe second reflection is perpendicular to the first reflection plane.\n\n*\n\nThe Reflect command always records History, but History related commands (HistoryPurge, HistoryUpdate) and settings (Lock Children, Update Children) do not affect the reflected part.\n\nIf you need edges along the reflection axis, use the SetPt command to align the edges before reflecting the SubD object.\n\nDisplay of the reflected side and reflection plane can be changed. Where?\n\nOnly the faces and edges in the primary region can be extruded. The extrude handles of Gumball will not display when the faces and edges in a child region are selected.\n\nThe Reflect command removes the existing symmetry if the input is a Radiate or double-Reflect SubD.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Reflect","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/reflect/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/reflect/#command-line-options","collection":"docs7","hash":"131523e9e679bc91730da56dec46767c","indexed_by":"docs-index"}},{"content":"RemoveSymmetry — RemoveSymmetry\n\nThe RemoveSymmetry command removes the SubD symmetry constraints set by the Reflect and Radiate commands from selected SubDs.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"RemoveSymmetry","section":"RemoveSymmetry","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/removesymmetry/#removesymmetry","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/removesymmetry/#removesymmetry","collection":"docs7","hash":"a100a06bfc07a4ff5aa104d692accca7","indexed_by":"docs-index"}},{"content":"Revolve — Revolve\n\nThe Revolve command creates a surface or SubD by revolving a profile curve that defines the surface shape around an axis.\n\nSteps\n1. Select curves.\n2. Pick the start of the revolve axis.\n3. Pick the end of the revolve axis, or press Enter to use CPlane-Z direction.\n\nThe start and end of the revolve axis can be attached to existing objects using object snaps when History is recorded.\n4. Specify options.","metadata":{"title":"Revolve","section":"Revolve","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/revolve/#revolve","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/revolve/#revolve","collection":"docs7","hash":"7d908c15127ab084b37a10d3b9227cff","indexed_by":"docs-index"}},{"content":"Revolve — Command-line options\n\n#### Output (Surface/SubD)\n\nSpecifies to create a NURBS surface or SubD.\n\n#### DeleteInput\n\nDeletes (Yes) or keeps (No) the input objects.\n\n#### FullCircle\n\nRevolves the input curve 360 degrees as a shortcut for specifying 360 degrees as the revolve angle.\n\n#### AskForStartAngle\n\n* Yes: Allows setting the angle (a degree away from the current input curve location) the revolve will start.\n* No: Starts the revolve from 0 (the input curve location).\n\n#### Deformable\n\nThis option is only available when Output=Surface.\n\n* Yes: The surface is rebuilt in the revolving direction to a degree-3 non-rational surface. Specify how many points in that direction. Deformable revolves can be deformed smoothly with point editing.\n* No: The resulting revolved surface is an exact revolve: a rational surface with fully-multiple knots at the quadrants. This kind of surface is not easy to deform smoothly by point editing.\n\n#### PointCount\n\nSpecifies the number of control points in the revolving direction when Output=Surface and Deformable=Yes.\n\n#### SegmentCount\n\nSpecifies the number of faces in the revolving direction when Output=SubD.\n\n#### SplitAtTangents\n\nRevolves tangent points on the input curve into joined edges (Yes) or creases (No) when Output=Surface.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Revolve","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/revolve/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/revolve/#command-line-options","collection":"docs7","hash":"216338df74a9c68016e79d8da831c5bc","indexed_by":"docs-index"}},{"content":"Sweep1 — Sweep1\n\nThe Sweep1 command fits a surface through a series of profile curves that define the surface cross-sections and one curve that defines a surface edge.\n\nSteps\n1. Select a single rail curve.\n2. Select cross-section curves in the order that the surface will pass through them.\\ When multiple closed cross-section curves are selected, there will be an extra step for adjusting curve seams.","metadata":{"title":"Sweep1","section":"Sweep1","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep1","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep1","collection":"docs7","hash":"34bc9002aa3a99d051f7cb81cdff27ac","indexed_by":"docs-index"}},{"content":"Sweep1 — Command-line options\n\nChainEdges (rails only): Select connected edge/curve segments based on the continuity between segments. How to chain selection.\n\nPoint (cross‑sections only): Creates a surface that begins or ends at a point.\n\nAdjust seam options (Closed curves only)\n#### Flip\n\nReverses the curve direction.\n\n#### Automatic\n\nAttempts to align the seam points and directions without intervention.\n\n#### Natural\n\nMoves the seam points to the way they were at the beginning of the command.\n\n#### SnapToKnots\n\n1. Yes : The seam points are always at the knots. You can only move them among the knots.\n2. No : The seam points may leave the knots. You can move them without restriction.","metadata":{"title":"Sweep1","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#command-line-options","collection":"docs7","hash":"78038c3ef290b1a4e14885f6b573370b","indexed_by":"docs-index"}},{"content":"Sweep1 — Sweep 1 Rail Options\n\n#### Frame Style\n\nA frame is a 3-D point and three direction vectors. It can be drawn as something that looks like the Rhino world axes icon. It describes a unique coordinate system in space. Frames are calculated along the rail and are used to orient the cross-section curves at those locations. In a simple case with one cross-section, frames are made at the cross-section curve location and where the calculated cross-section is going to go. The 3-D rotation between those two frames determines the rotation of the cross-section curve at its new location.\n\nFreeform is the default Frame style. The selected Frame style will be remembered in the current Rhino for next use.\n\n* Freeform\n\nThe cross-section curve rotates to maintain its angle to the rail throughout the sweep.\n* Roadlike\n\nSpecify an axis for calculating the 3-D rotation of the cross-section.\n\nThe default Roadlike axis will be different depending on the rail curve. For a planar rail curve, the default axis is perpendicular to the curve plane. For a non-planar rail curve, world-Z axis will be used.\n\n&#x20; Set axis - Sets the axis direction for the Roadlike style.\n\n* Align with surface (surface edge as rail only)\n\nIf the rail is a surface edge, the cross-section curve will twist with the surface edge. If the shapes are tangent to the surface, the new surface should also be tangent.\n\n#### Sweep options\n\n* Closed sweep\n\nCreates a closed surface, continuing the surface past the last curve around to the first curve.\n\nThis option is only available after you select two cross-section curves.\n* Global shape blending","metadata":{"title":"Sweep1","section":"Sweep 1 Rail Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep-1-rail-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep-1-rail-options","collection":"docs7","hash":"479f7d60941948bf6cee39ea584941b4","indexed_by":"docs-index"}},{"content":"Sweep1 — Sweep 1 Rail Options\n\nThe sweep is linearly blended from one end to the other, creating sweeps that taper from one cross-section curve to the other. Otherwise, the sweep stays constant at the ends and changes more rapidly in the middle.\n* Untrimmed miters\n\nIf the sweep creates a polysurface with kinks, the component surfaces will be untrimmed.\n\n#### Curve options\n\n* Refit rail - Refits the rail curve before creating the sweep.\n* Align cross sections - Allows reversing the direction of the cross-section curves.\n* Do not change cross sections - Creates the sweep without altering the cross-section curves.\n* Rebuild cross sections with \\_\\_\\_ control points - before creating the sweep.\n* Refit cross sections within \\_\\_\\_ - Refits the cross-section curves before creating the sweep.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sweep1","section":"Sweep 1 Rail Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep-1-rail-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep1/#sweep-1-rail-options","collection":"docs7","hash":"3b99d037f3d44156a07521e7e8f72449","indexed_by":"docs-index"}},{"content":"Sweep2 — Sweep2\n\nThe Sweep2 command fits a surface through a series of profile curves that define the surface shape and two curves that define the surface edges.\n\nSteps\n\n1. Select two curves as the rails.\n2. Select cross-section curves in the order in which the surface will pass through them.\\ Select open curves near the same ends. For closed curves, adjust the curve seams.","metadata":{"title":"Sweep2","section":"Sweep2","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#sweep2","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#sweep2","collection":"docs7","hash":"379304c036b51bdf6b7b2c5081e428ac","indexed_by":"docs-index"}},{"content":"Sweep2 — Adjust seam options (Closed curves only)\n\n#### Flip\n\nReverses the curve direction.\n\n#### Automatic\n\nAttempts to align the seam points and directions without intervention.\n\n#### Natural\n\nMoves the seam points to the way they were at the beginning of the command.\n\n#### SnapToKnots\n\nYes - The seam points are always at the knots. You can only move them among the knots.\n\nNo - The seam points may leave the knots. You can move them without restriction.","metadata":{"title":"Sweep2","section":"Adjust seam options (Closed curves only)","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#adjust-seam-options-closed-curves-only","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#adjust-seam-options-closed-curves-only","collection":"docs7","hash":"d767fd25a4c688f9aecc7f1a9353fec0","indexed_by":"docs-index"}},{"content":"Sweep2 — Sweep 2 Rail Options dialog box\n\n#### Curve options\n\n* Do not change cross sections - Creates the sweep without altering the cross-section curves.\n* Rebuild cross sections with \\_\\_\\_ control points - before creating the sweep.\n* Refit cross sections within \\_\\_\\_ - Refits the cross-section curves before creating the sweep.\n* Preserve first cross section - When you are matching edge tangency or curvature, your surface may pull away from your cross-section curves. This option forces the surface to match the first cross-section curve.\n* Preserve last cross section - When you are matching edge tangency or curvature, your surface may pull away from your cross-section curves. This option forces the surface to match the last cross-section curve..\n* Maintain height - Removes the association between the height scaling from the width scaling. By default, cross-section curves normally scale in both the height and width dimensions.\n* Refit rails - Refits the rail curves before creating the sweep.\n\n#### Edge continuity\n\nContinuity is only enabled if the rails are surface edges and the shape curves are non-rational, that is, all control-point weights are 1. Exact arcs and ellipse segments are rational.\n\nOnly continuity options that the curve structure (point count and rational/non rational) supports will be available.\n\n* Closed sweep - The Closed sweep option creates a closed surface, continuing the surface past the last curve around to the first curve.\n\nThis option is only available after you select two cross-section curves.\n\n&#x20; Add Slash - Adds additional cross-section alignments to control how the surface is created between sections.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Sweep2","section":"Sweep 2 Rail Options dialog box","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#sweep-2-rail-options-dialog-box","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/creation/sweep2/#sweep-2-rail-options-dialog-box","collection":"docs7","hash":"abe9cf50e9e9c9e942df7dc60b270904","indexed_by":"docs-index"}},{"content":"Display — Display\n\nThe SubDDisplayToggle command switches the appearance of all SubD objects between smooth and flat modes.\n\nSteps\n* Press Tab.\n* The Tab key does not toggle SubD display while you are picking a direction in commands because, at this point, the Tab key is used for locking a direction. To toggle SubD display while picking a direction, click on the SubD Tools toolbar, or map the SubDDisplayToggle command to a key (e.g., F4) in Tools > Options > Keyboard and use it.\n\nThe SubDDisplayToggle command:\n\n* Is nestable (can be run while other commands are running).\n* Does not change object selection states.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Display","section":"Display","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/display/#display","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/display/#display","collection":"docs7","hash":"a8f5f46342ccbfe6aa46f7eccb7588c9","indexed_by":"docs-index"}},{"content":"Align Vertices — Align Vertices\n\nThe AlignVertices command forces mesh or SubD vertices to the same location.\n\n* Some STL/SLA printers have problems if meshes contain many long, thin facets. These facets can slow the printer down, produce odd results, or run the printer out of memory.\n* The MeshRepair command may be useful when tuning up meshes for STL/SLA printing.","metadata":{"title":"Align Vertices","section":"Align Vertices","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#align-vertices","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#align-vertices","collection":"docs7","hash":"72143217ce04a233437904602a46b61d","indexed_by":"docs-index"}},{"content":"Align Vertices — Steps\n\n* Select mesh or SubD objects, and specify command line options, press Enter.\n\nIf the distances between vertices are smaller than the value of DistanceToAdjust, the vertices are forced together.\n\nThis command is useful for fixing areas that have many vertices that should be in the same spot but for some reason are not.","metadata":{"title":"Align Vertices","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#steps","collection":"docs7","hash":"f591678531ac55bf2e78c1f9045d541d","indexed_by":"docs-index"}},{"content":"Align Vertices — Command-line options\n\nSelectVertices: Lets you select vertices to align.\n\nSelectNakedEdges: Lets you select naked edges to align all vertices on the naked edge.\n\nDistanceToAdjust: Sets the tolerance distance.\n\nAverageVertexesToAdjust: Moves vertices to the average location instead of moving one to the other.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Align Vertices","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/align-vertices/#command-line-options","collection":"docs7","hash":"ad9523444ff0815041fb26296cd4a3b9","indexed_by":"docs-index"}},{"content":"Append — Append\n\n#### Append\n\n#### Selects an existing mesh or SubD to which the new faces will be added.\n\n* During appending new faces, press ESC to cancel the current face creation. Press ESC one more time to cancel the command.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Append","section":"Append","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/append/#append","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/append/#append","collection":"docs7","hash":"111fc9ed64ad2580e45b2cb857f482c8","indexed_by":"docs-index"}},{"content":"Bevel — Bevel\n\nThe Bevel command chamfers/fillets mesh or SubD edges with the specified segments.\n\nInput\n* Mesh and SubD edge\n\n#### Steps\n\n1. Select one or more edges and press Enter.\n2. Move the cursor to decide the bevel amount and click.\\ Or, enter a number and press Enter.\\ The number can be an absolute distance or a proportional value based on the OffsetMode setting.","metadata":{"title":"Bevel","section":"Bevel","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bevel/#bevel","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bevel/#bevel","collection":"docs7","hash":"8948c9c2ec219eb01306123e40e81dc7","indexed_by":"docs-index"}},{"content":"Bevel — Command-line options\n\nEdge selection mode\n\n* (Default)\n\nClick selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n* EdgeLoop\n\nClick an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.\n\n#### Segments\n\nThe number of new faces added over the beveled edge.\n\n#### OffsetMode\n\n* Proportional\n\nThe bevel amount is proportional to each crossing edge length. The input number should be between 0 and 1.0.\n\n* Absolute\n\nThe bevel amount is same for all edges. The input number is a distance in the model unit.\n\n#### Straightness (0-1.0)\n\n0 creates the most rounded bevel. More segments are required.\n\n1.0 creates a flat bevel.\n\n#### WeldAngle (Mesh only)\n\nThe tolerance in degrees for welding mesh edges.\n\n#### RetainShape (Mesh only)\n\nAll new vertices added to the mesh will be on the original mesh edges.\n\n#### KeepCreases (SubD only)\n\nSpecifies if creased edges will be retained.\n\n| | | |\n| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Bevel","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bevel/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bevel/#command-line-options","collection":"docs7","hash":"95cb6397e728329b7e1601604661bd2b","indexed_by":"docs-index"}},{"content":"Bridge — Bridge\n\nThe Bridge command creates faces to connect two SubD/Mesh edge chains.\n\nInput\n* Two naked SubD/Mesh edge chains\n* Boundaries of two SubD/Mesh face groups\n\n#### Steps\n\n1. Start the command.\n2. Select the first naked edge chain or face group, press Enter.\n3. Select the second naked edge chain or face group, press Enter.\n\nThe two edge chains must have the same edge number.\n4. Click the bridge endpoints to adjust alignment as needed, press Enter.","metadata":{"title":"Bridge","section":"Bridge","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#bridge","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#bridge","collection":"docs7","hash":"1c5aefb6459be7d630a1fcc3bac2840b","indexed_by":"docs-index"}},{"content":"Bridge — Options\n\n#### Edge selection mode\n\n* (Default)\n\nClick selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n* EdgeLoop\n\nClick an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.\n\n#### Segments\n\nThe number of new faces added between the two edge chains.\n\n* Join\n\nJoins the bridge into the input objects. Uncheck to create a stand-alone bridge.\n* Crease (For Join=Yes only)\n\nEnabled\n\nMesh - The bridge is joined with the input meshes.\n\nSubD - The bridge connects to the input SubDs with creased edges.\n\nDisabled\n\nMesh - The bridge is welded with the input meshes.\n\nSubD - The bridge connects to the input SubDs with smooth edges.\n\n#### Straightness (0\\~100%)\n\nThe straight level of the bridge transition. 100% creates a straight bridge. Decreasing the value creates a smoother bridge. A smooth bridge requires more segments to achieve.","metadata":{"title":"Bridge","section":"Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#options","collection":"docs7","hash":"d195b7deca9d5d9fb5a802567d4461e4","indexed_by":"docs-index"}},{"content":"Bridge — Adjust alignment\n\n#### Change chain directions\n\nArrowheads indicate chain directions. Chain directions are automatically detected to create a non-tangled bridge. However, you can click an endpoint of a chain to reverse the direction.\n\n#### Move seam location (For closed loops only)\n\nThe seam location is selected based on the first picked edge. Click a point to move the seam location to that point. Click the seam point to reverse the chain direction.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Bridge","section":"Adjust alignment","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#adjust-alignment","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/bridge/#adjust-alignment","collection":"docs7","hash":"6427f7dcb42d049dcb36a81d6b429dc4","indexed_by":"docs-index"}},{"content":"Crease — Crease\n\nThe Crease command changes smooth SubD edges/vertices into creased edges/vertices, or welded mesh edges into unwelded edges.\n\nAdd creases to a SubD (left) and a mesh (right).\n\nInput\n* SubD edges and vertices\n* SubD control net edges and Points\n* Mesh edges\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Crease","section":"Crease","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/crease/#crease","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/crease/#crease","collection":"docs7","hash":"1517b58ff2bca7a83e236037f7f65c6e","indexed_by":"docs-index"}},{"content":"DeleteFaces — DeleteFaces\n\nThe DeleteFaces command removes selected faces from a mesh, SubD or Polysurface.\n\nIt is most effective in a shaded display mode since you can see and directly pick faces.\n\nSupported input\nMesh/SubD/Polysurface faces\n\nSteps\nSelect mesh, SubD or polysurface faces.\n\nMesh/SubD face loop selection (Post-selection)\n#### To select an entire face loop\n\n1. Click a face.\n2. Double-click the next face that decides the loop direction.\n\n#### To select a face loop range\n\n1. Click two faces in a loop.\n2. Double-click a face in between and next to one of the selected faces.\n\n#### To deselect a single face\n\n* Ctrl+click a selected face.\n\n#### To deselect a face loop\n\n* Ctrl+double-click a face in a selected loop.\n\n_Note:_\n\n&#x20; -Some STL/SLA printers have problems if meshes contain many long, thin facets. These facets can slow the printer down, produce odd results, or run the printer out of memory.\n\n&#x20; -The MeshRepair command may be useful when tuning up meshes for STL/SLA printing.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"DeleteFaces","section":"DeleteFaces","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/deletefaces/#deletefaces","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/deletefaces/#deletefaces","collection":"docs7","hash":"bb7a6f0f35bcda8a208bea4103bf5b40","indexed_by":"docs-index"}},{"content":"Fill — Fill\n\nThe Fill command creates SubD/mesh faces from SubD/mesh boundary edges.\n\nInput\n* Naked SubD or mesh edges\n\n#### Steps\n\n1. Start the command.\n2. Click SubD/mesh boundary edges one by one to select a chain.\n\nOr, double-click an edge to select a whole boundary chain.\n3. Press Enter.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Fill","section":"Fill","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/fill/#fill","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/fill/#fill","collection":"docs7","hash":"04bbb16865587be2b03930f247624290","indexed_by":"docs-index"}},{"content":"InsertEdge — InsertEdge\n\nThe InsertEdge command inserts edges beside an edge loop (left) or across an edge ring (right) on a SubD or mesh.\n\n*\n\nWhen edges fail to insert, the defective geometry is marked with a text dot. The secondary text in the text dot properties gives a hint of what should be repaired.\n\n*\n\nCommand-line options\n#### Type\n\n* Loop&#x20;\n\nInsert edges beside the selected edge loop.\n\nBothSides - Insert edges on both sides of the selected edge loop.\n* Ring&#x20;\n\nInsert edges across the selected edge ring.\n\n#### Mode\n\n* Full\n\nSelect an entire edge loop (left) or ring (right) based on the Type option to insert edges.\n\n* Range\n\nSelect the start and end edges in a range of loop (left) or ring (right) based on the Type option to insert edges.\n\n#### OffsetMode\n\n* Proportional\n\nThe amount is proportional to each crossing edge length. The input number should be between 0 and 1.0.\n* Absolute\n\nThe amount is same for all edges. The input number is a distance in the model unit.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"InsertEdge","section":"InsertEdge","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/insertedge/#insertedge","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/insertedge/#insertedge","collection":"docs7","hash":"bd2ad9aea3c57d35c228c901127efaca","indexed_by":"docs-index"}},{"content":"InsertPoint — InsertPoint\n\nThe InsertPoint command adds vertices and edges to a Mesh or SubD along the picked points on edges.\n\nInput\n* SubD / Mesh Edge\n\n#### Steps\n\n1. Select a mesh or SubD.\n2. Pick points on edges.\n\nOptions\n#### Undo\n\nRemoves the last picked point.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"InsertPoint","section":"InsertPoint","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/insertpoint/#insertpoint","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/insertpoint/#insertpoint","collection":"docs7","hash":"59478b1ca71552e2e2adb3bb791a48f3","indexed_by":"docs-index"}},{"content":"Inset — Inset\n\nThe Inset command inserts edges by offsetting the edges of selected mesh, SubD, or polysurface faces a certain distance inwards.\n\nInput\n* Mesh/SubD faces\n* Surfaces and polysurface faces\n\nTo inset selected faces\n\n1. Select mesh, SubD, or polysurface faces.\n2. Enter a distance or pick two points to define the distance.","metadata":{"title":"Inset","section":"Inset","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/inset/#inset","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/inset/#inset","collection":"docs7","hash":"935bd9d23deb4eaa0113bf62b6632812","indexed_by":"docs-index"}},{"content":"Inset — Command-line options\n\n#### Mode (For multiple SubD faces only)\n\n* Group (left) insets connected SubD faces as a unit.\n* Single (right) insets SubD faces individually.\n\n#### (Surface-only options below)\n\n#### ThroughPoint\n\nPick a point for the inset curve to pass through.\n\n#### Loose\n\nLoose=On does not refine the inset curves to be in the system tolerance as Loose=Off does. The refinement process could be time consuming so the preview uses Loose=On to speed up.\n\n#### IgnoreSeams\n\nIgnores the seam of the input surface.\n\na) Input, b) IgnoreSeams=No, c) IgnoreSeams=Yes\n\n#### Split\n\nSplits the input surface; otherwise creates the inset curves only.\n\n* JoinOutputs\n\nWhen Split=Yes, specifies whether the resulting surfaces will be joined.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Inset","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/inset/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/inset/#command-line-options","collection":"docs7","hash":"cb79cf558ecc9aaed951d9c0017b72e7","indexed_by":"docs-index"}},{"content":"Merge Faces — Merge Faces\n\nThe MergeFaces command merges a connected set of SubD or mesh faces into a single face.\n\nInput\n* SubD Face, Edge, Vertex\n* Mesh Face, Edge, Vertex\n\nHow faces are merged:\n\n* If a vertex is selected, the faces around the vertex are merged into a single face.\n* If an edge is selected, the faces on either side of the edge are merged into a single face.\n* If a collection of faces is selected, they are partitioned into subsets. Each subset is merged into a single face.\n* Faces separated by a SubD crease or an unwelded mesh edge cannot be merged. Use the RemoveCrease command to remove the crease or unwelded edge before merging the faces.\n* Use Ctrl(CMD)+Shift+Click to select vertices or edges and press Delete to merge the surrounding faces into a single face. Deleting faces with Delete will leave holes.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Merge Faces","section":"Merge Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/merge-faces/#merge-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/merge-faces/#merge-faces","collection":"docs7","hash":"41be04c59e4fb05db3bb9dc198a8d11b","indexed_by":"docs-index"}},{"content":"MergeFaces — MergeFaces\n\nThe MergeFaces command merges a connected set of SubD or mesh faces into a single face.\n\nInput\n* SubD Face, Edge, Vertex\n* Mesh Face, Edge, Vertex\n\nHow faces are merged:\n* If a vertex is selected, the faces around the vertex are merged into a single face.\n* If an edge is selected, the faces on either side of the edge are merged into a single face.\n* If a collection of faces is selected, they are partitioned into subsets. Each subset is merged into a single face.\n* Faces separated by a SubD crease or an unwelded mesh edge cannot be merged. Use the RemoveCrease command to remove the crease or unwelded edge before merging the faces.\n* Use Ctrl(CMD)+Shift+Click to select vertices or edges and press Delete to merge the surrounding faces into a single face. Deleting faces with Delete will leave holes.","metadata":{"title":"MergeFaces","section":"MergeFaces","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/mergefaces/#mergefaces","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/mergefaces/#mergefaces","collection":"docs7","hash":"3619bd786d0a1a80337694e62919ba8a","indexed_by":"docs-index"}},{"content":"MergeFaces — Command-line options\n\nResults = Selected / NotSelected\n\nSpecifies if the resulting merged face will be selected.\n\n#### Mesh/SubD face loop selection (Post-selection)\n\nTo select an entire face loop\n\n1. Click a face.\n2. Double-click the next face that decides the loop direction.\n\nTo select a face loop range\n\n1. Click two faces in a loop.\n2. Double-click a face in between and next to one of the selected faces.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"MergeFaces","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/mergefaces/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/mergefaces/#command-line-options","collection":"docs7","hash":"c914bdb937de91a209194fa089b2b59c","indexed_by":"docs-index"}},{"content":"PackSubDFaces — PackSubDFaces\n\nThe PackSubDFaces command resets a SubD to the default face packing if adding creases or deleting faces breaks the quad grids.\n\n&#x20; \\- The PackSubDFaces command does not change the topology or geometry of a SubD.\n\n&#x20; \\- SubD face packing always stops at creases.\n\n&#x20; \\- The ToNURBS commands creates larger and fewer surfaces from a packed SubD.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"PackSubDFaces","section":"PackSubDFaces","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/packsubdfaces/#packsubdfaces","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/packsubdfaces/#packsubdfaces","collection":"docs7","hash":"8d36f9c8a43d00f25180d253ec70cad2","indexed_by":"docs-index"}},{"content":"QuadRemesh — QuadRemesh\n\nThe QuadRemesh command quickly creates a quad mesh with optimized topology from existing surfaces, meshes, or SubDs. It uses a unique algorithm to generate manageable polygon meshes, ideal for rendering, animation, CFD, FEA, and reverse-engineering.","metadata":{"title":"QuadRemesh","section":"QuadRemesh","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#quadremesh","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#quadremesh","collection":"docs7","hash":"db513ab80500e09f87ef93527f8021ac","indexed_by":"docs-index"}},{"content":"QuadRemesh — Options\n\n#### Target Edge Length\n\nSets the approximate edge length of the output mesh.\n\n* This setting is scale dependent. The resulting face count increases with object scale.\n* Re-meshing would fail if the target edge length is set too large for the object size.\n\n#### Target Quad Count\n\nSets the approximate face count of the output mesh as a goal for the algorithm.\n\n* This setting is scale independent. An input object in different scales produces a similar face count.\n\nAdaptive Size (0-100)\n\nSet 0 to get a minimal number of quads and uniform sizes. A value above 30 will diminish your control of getting a smaller number of quads. Higher values result in smaller quads in high curvature areas. Set 100 to keep more details.\n\n| | 0 | 100 |\n| -------------------------------- | ----------------------- | -------------------------- |\n| Face shape | As square as possible | Varies in width and height |\n| Face size | Similar | Varies |\n| Face density | Uniform | Higher at details |\n| Fit to original shape | Less | More |\n| Respect to target face count | More | Less |\n| Risk | Topology irregularities | More faces |\n\nAdaptive Quad Count\n\n#### Use Surface Edges (Polysurface/Extrusion only)\n\nSpecifies if meshes edges will be created along the sub-face boundaries on the input object.\n\n* Off\n\nIgnores sub-face boundaries.\n\n* Smart\n\nRetains sub-face boundaries except for the ones being determined as meaningless by the algorithm. This is usually the best choice.\n\n* Strict\n\nRetains all sub-face boundaries.\n\n#### Symmetry Axis: X /Y /Z\n\nSelect to perform symmetrical re-meshing across the X, Y, or Z central plane of the object's bounding box. Multiple axes can be selected. It only makes sense for symmetrical objects and when the correct symmetrical plane is selected.\n\n#### Guide Curves","metadata":{"title":"QuadRemesh","section":"Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#options","collection":"docs7","hash":"b9f916147fac6f5a8acaf3f92b912f33","indexed_by":"docs-index"}},{"content":"QuadRemesh — Options\n\nThe quad re-meshing algorithm will try to place edge loops or edge rings along guide curves. Guide Curves can be used to define more details, or simply influence the direction of quad re-meshing in a region. Guide curves must be projected onto the input object to have an effect. Click Select Curves to select guide curves.\n\n* Curve Influence\n\nThese options control how guide curves affect the final quad mesh.\n* None\n\nNo effect on the result.\n* Approximate\n\nAdjusts the general direction of the quads by influencing their natural flow. The guide curves have a weak effect on the result.\n\n* Create Edge Ring\n\nOrients the crossing edges perpendicular to the guide curves. The guide curves have a stronger effect on the result, but edge rings may not follow guide curves exactly.\n\n* Create Edge Loop\n\nPlaces edge loops along guide curves. The guide curves have the strongest effect on the result.\n\n#### Detect Hard Edges\n\nUses a 30-degree break angle threshold to divide the quad mesh with hard edges (creased edges). If the break angle between two adjacent faces is larger than 30 degrees, a hard edge loop will be added.\n\n_Turn this option off if..._\n\n&#x20; \\- You do not want hard edges on the quad meshes.\n\n&#x20; \\- The input mesh is disorganized to avoid adding unintended hard edges.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"QuadRemesh","section":"Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/quadremesh/#options","collection":"docs7","hash":"9aaaafe74d20b647ccc76a3f282cc19e","indexed_by":"docs-index"}},{"content":"RemoveCrease — RemoveCrease\n\nThe RemoveCrease command smoothes creased SubD edges/vertices, or welds mesh edges.\n\nRemove creased edges on a SubD (left) and a mesh (right).\n\nInput\n* SubD edges and vertices\n* SubD control net edges and Points\n* Mesh edges\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"RemoveCrease","section":"RemoveCrease","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/removecrease/#removecrease","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/removecrease/#removecrease","collection":"docs7","hash":"beebf45fe9d95a8a0be3a28c4d58d110","indexed_by":"docs-index"}},{"content":"RepairSubD — RepairSubD\n\nThe RepairSubD command inspects and deletes damaged components, wire edges, and Non-manifold edges on SubDs.\n\nCommand-line options\n#### DamagedVertex=Delete/Keep\n\nDeletes or keeps damaged vertices.\n\n#### WireEdge=Delete/Keep\n\nDeletes or keeps wire edges.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"RepairSubD","section":"RepairSubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/repairsubd/#repairsubd","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/repairsubd/#repairsubd","collection":"docs7","hash":"0eaed4cb4a62d1194b57fc69e1478682","indexed_by":"docs-index"}},{"content":"SetPerFaceColorByFacePack — SetPerFaceColorByFacePack\n\nThe SetPerFaceColorByFacePack command changes colors of SubD faces based on the divisions of rectangular quad grids. It lets you preview how the ToNURBS command (Faces=Packed) converts a SubD to NURBS.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SetPerFaceColorByFacePack","section":"SetPerFaceColorByFacePack","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/setperfacecolorbyfacepack/#setperfacecolorbyfacepack","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/setperfacecolorbyfacepack/#setperfacecolorbyfacepack","collection":"docs7","hash":"705574f73c3be82b8e91330706ddbae0","indexed_by":"docs-index"}},{"content":"Slide — Slide\n\nThe Slide command moves selected vertices (or vertices of selected edges) along adjacent edges.\n\nInput:\n* Mesh/SubD edge or edge loop\n* Mesh/SubD vertex\n\n#### Steps\n\n1. Select mesh/SubD edges, edge loops, or vertices.\n2. Move the mouse cursor and click.\n\nOr, type a value and press Enter.\n\nThe arrows point out the positive direction that is used for value input.","metadata":{"title":"Slide","section":"Slide","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/slide/#slide","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/slide/#slide","collection":"docs7","hash":"e03fad7dc8d2669bf3720c1653b80a23","indexed_by":"docs-index"}},{"content":"Slide — Command options\n\n#### Edge selection mode\n\n* (Default)\n\nClick selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n* EdgeLoop\n\nClick an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.\n\n#### OffsetMode\n\n* Proportional\n\nThe amount is proportional to each crossing edge length. The input number should be between 0 and 1.0.\n* Absolute\n\nThe amount is same for all edges. The input number is a distance in the model unit.\n\n#### Smoothness (0 - 1.0)\n\n0 moves vertices linearly along the edges towards the next vertices. 1.0 moves vertices in the most curved path towards the next vertices.\n\n#### Direction=Across/Along\n\nMoves edges in the side direction (Across), or in the edge direction (Along).\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Slide","section":"Command options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/slide/#command-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/slide/#command-options","collection":"docs7","hash":"9a07c4240e8e971a9e77adb7165148c5","indexed_by":"docs-index"}},{"content":"Smooth — Smooth\n\nThe Smooth command averages the positions of object points or vertices. This command is useful for removing unwanted detail, and for removing loops in objects.\n\nWhen mesh vertices are selected, you may have to use the WeldVertices command before smoothing in order to prevent the mesh from pulling apart.","metadata":{"title":"Smooth","section":"Smooth","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#smooth","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#smooth","collection":"docs7","hash":"f2850621b9a1dca5f21160bc2cd2bde2","indexed_by":"docs-index"}},{"content":"Smooth — Input\n\n* Curves, surfaces, meshes and SubDs\n* Control points, edit points and mesh vertices\n* SubD control net points and edges\n* SubD surface points (Turned on by EditPtOn)\n* Mesh vertices, edges and faces (select with Ctrl+Shift)\n* SubD surface points, edges and faces (select with Ctrl+Shift\n\nSteps\n* Select supported object types and press Enter.\n\nThe selected objects will appear to melt, losing detail due to the averaging of the positions of the object points.\n\n#### To smooth part of a curve or surface\n\n1. Make a supported object type points on.\n\nOr, select object points, edges or faces with Ctrl+Shift.\n2. Start the Smooth command.\n3. Click the check boxes for the coordinate directions and adjust the Smooth factor.\\ The selected object points will move slightly to smooth the object.\n\n#### To set one check box and clear the others\n\n* Right-click the check box you want to check.","metadata":{"title":"Smooth","section":"Input","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#input","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#input","collection":"docs7","hash":"d0a6816b249b68997be476bee0209c06","indexed_by":"docs-index"}},{"content":"Smooth — Smooth Options\n\n#### Smooth X / Y / Z\n\nSmooths only in the specified x, y, or z direction.\n\n_Shortcuts:_\n\n&#x20; -Right-click a checkbox once to set one direction option and clear all others.\n\n&#x20; -Right-click a checkbox twice to set all direction options.\n\n#### Fix Boundaries\n\nPrevents naked edges or endpoints from being moved.\n\nMeshes: Vertices along naked edges will not be modified.\n\nCurves: End control points will not be modified.\n\nSurfaces: The control points along the boundaries of the surface will not be modified. The edges and trims of trimmed surfaces will be modified if they do not coincide with the surface boundary.\n\nSubD: Surface points or control net points along the boundaries will not be modified.\n\n_Note:_\n\n&#x20; \\- If all of the object points are selected, Rhino perceives this as the whole object being selected.\n\n&#x20; \\- Fix Boundaries may cause undesirable seams or singularities in closed curves and surfaces.\n\n#### World / CPlane / Object coordinates\n\nUse world or construction plane or object u, v, and n coordinates to determine the direction of the smoothing.\n\n#### Smooth factor per step\n\nSets an amount of smoothing.\n\n* 0 to 1\n\nObject points move toward the average.\n* Greater than 1\n\nObject points move past the average.\n* Negative\n\nObject point move away from the average (roughing).\n\n#### Number of smooth steps\n\nSpecifies the number of steps to iterate the smoothing factor through.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Smooth","section":"Smooth Options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#smooth-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/smooth/#smooth-options","collection":"docs7","hash":"35bc531c4776f80f9a9930f16083df60","indexed_by":"docs-index"}},{"content":"Soft Transform — Soft Transform\n\nThe SoftTransform command changes moving behavior of mesh and SubD vertices based on different radial falloff shapes.\n\nCommand-line options\n#### Enable (Yes/No)\n\nTurns on/off soft transform for SubD and mesh vertices.\n\n#### Radius\n\nDefines the falloff range.\n\n#### Shape (Smooth /Linear/ Round/ Sharp)\n\nChanges the radial falloff style.\n\n.gif).gif)\n\nSmoot Linear\n\nRound Sharp\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Soft Transform","section":"Soft Transform","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform-1/#soft-transform","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform-1/#soft-transform","collection":"docs7","hash":"7fd70825557816e2e244bbb8143bd128","indexed_by":"docs-index"}},{"content":"Soft Transform — Soft Transform\n\nThe SoftTransform command changes moving behavior of mesh and SubD vertices based on different radial falloff shapes.\n\n*\n\nSoft transform works with SubD/mesh vertices, edges, faces, and control points.\n\nMouse dragging, Gumball, and transform commands (Move, Scale, Rotate...) work with soft transform.\n\nLocked SubD vertices, edges, and faces will stay still.\n\n*","metadata":{"title":"Soft Transform","section":"Soft Transform","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform/#soft-transform","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform/#soft-transform","collection":"docs7","hash":"625f174063142709c11a14c674ef45d7","indexed_by":"docs-index"}},{"content":"Soft Transform — Command-line options\n\nEnable (Yes/No)&#x20;\n\nTurns on/off soft transform for SubD and mesh vertices.\n\nRadius\n\nDefines the falloff range.\n\n*\n\nPre-select SubD/mesh sub-objects to define the falloff range with a visual indicator.\n\n*\n\nShape (Smooth /Linear/ Round/ Sharp)\n\nChanges the radial falloff style.\n\n| | |\n| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |\n| Linear | Smooth |\n| | |\n| Sharp | Round |\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Soft Transform","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/soft-transform/#command-line-options","collection":"docs7","hash":"b4691b02d32e48c1e8064f5fff1a1080","indexed_by":"docs-index"}},{"content":"Spin Edge — Spin Edge\n\nThe SubDSpinEdge rotates a picked SubD edge by marching each end to the next vertex simultaneously.\n\nSteps\n\n1. Pick a SubD edge.\n2. Use the SpinEdgeAgain option to spin the same again, or pick another edge.\n3. Press Enter to exit the command.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Spin Edge","section":"Spin Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/spin-edge/#spin-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/spin-edge/#spin-edge","collection":"docs7","hash":"a5f88216547b3bdf15012e6b9d54871c","indexed_by":"docs-index"}},{"content":"Stitch — Stitch\n\nThe Stitch command matches the positions of a pair of mesh/SubD vertices.\n\nInput\n* Mesh edges, vertices, control points\n* SubD edges, vertices, control points\n\nCommand options\n#### Edge selection mode\n\n* (Default)\n\nClick selects a single edge. Double-click selects an edge loop.\n\nCtrl+click deselects a single edge. Ctrl+double-click deselects an edge loop.\n* EdgeLoop\n\nClick an edge to select an edge loop.\n\nThe clicked edge displays a brighter highlight than the other edges in the loop.\n\nCtrl+click the same edge to deselect the loop.\n\nThe Edges option also allows selecting a pair of vertices.\n\nStitch location\n\n* Average\n\nRight-click to stitch at the average location.\n* First\n\nStitch at the location of the first set.\n* Second\n\nStitch at the location of the second set.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Stitch","section":"Stitch","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/stitch/#stitch","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/stitch/#stitch","collection":"docs7","hash":"38a8e77a3149b314f6a2d6e16cdf514d","indexed_by":"docs-index"}},{"content":"SubDExpandEdges — SubDExpandEdges\n\nThe SubDExpandEdges command expands selected SubD edges into faces.\n\nCommand-line options\n#### Offset\n\nThe offset settings determine the width of the inserted quad faces. The width is the proportional amount of the crossing edge length in the flat SubD.\n\n* Small / Medium / Large\n\nSlides each vertex along the crossing edge with a proportional amount of 0.125 (small), 0.25 (Medium), or 0.5 (Large).\n\n* Custom\n\nAllows entering any number between 0.05 and 0.95 for the proportional amount.\n* Variable\n\nThis option is only available when a single edge chain is selected. It allows setting different widths at both ends of the edge chain.\n\nStyle\n\n* Single\n\nReplaces each input edge with a quad face.\n\n* Double\n\nAdds two quad faces adjacent to each input edge.\n\n* Ahalf / Bhalf\n\nAdds quad faces on the (A) or (B) side of input edges.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"SubDExpandEdges","section":"SubDExpandEdges","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/subdexpandedges/#subdexpandedges","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/subdexpandedges/#subdexpandedges","collection":"docs7","hash":"bd08b2640508a52b95ff9e8058bfa82c","indexed_by":"docs-index"}},{"content":"SubDivide — SubDivide\n\nThe SubDivide command applies iterations of the Catmull-Clark subdivision to whole Mesh/SubD objects or selected faces.\n\nInput\n* Mesh/SubD face (Select with Ctrl+Shift+Click)\n\n#### Steps\n\n1. Start the SubDivide command.\n2. Select a Mesh or SubD.\n\nUse Ctrl+Shift+Click to select Mesh or SubD faces.\n\nCommand-line options\n#### DeleteInput\n\nDeletes (Yes) or keeps (No) the input objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"SubDivide","section":"SubDivide","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/subdivide/#subdivide","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/edition/subdivide/#subdivide","collection":"docs7","hash":"5e52d78452bec58a4e96838466e9d670","indexed_by":"docs-index"}},{"content":"3DFace — 3DFace\n\nThe 3DFace command creates mesh or SubD faces that can be standalone or added to an existing mesh or SubD.\n\nA mesh face (left) and a SubD face (right)\n\n* When meshes or SubDs are pre-selected, the 3DFace command starts in the Append mode.","metadata":{"title":"3DFace","section":"3DFace","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/3dface/#3dface","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/3dface/#3dface","collection":"docs7","hash":"1bb6a05ac8fb5f2612f643c585a60b03","indexed_by":"docs-index"}},{"content":"3DFace — Command-line options\n\n#### Output\n\n* Mesh: Creates mesh faces.\n\n* SubD: Creates SubD faces.\n\nInterpolated (Yes/No)\n\nConceptually, this is the difference between what the Curve and InterpCrv commands do. The Curve command turns input points into the curve's control points. The InterpCrv command creates a curve to pass the input points.\n\n#### Append\n\n#### Selects an existing mesh or SubD to which the new faces will be added.\n\n* During appending new faces, press ESC to cancel the current face creation. Press ESC one more time to cancel the command.\n\n#### PolygonType (Triangle/Quad/Ngon)\n\n#### Specifies to create triangle, quad, or n-gon faces.\n\n* When PolygonType=Ngon, picking not enough points adds a triangle or quad face.\n\n#### FromEdge\n\n* Yes: Each new face is started by selecting an existing mesh or SubD boundary edge.\n* Chain (Yes/No): Create faces along an edge chain. The edge chain can be from an existing mesh or the current creating mesh.\n* FromEdgeReset\n* Yes: Resets FromEdge to No in the next 3DFace command session.\n* No: Remembers the setting of FromEdge for the next 3DFace command session.\n* No: Each new face is created by picking points.\n\nEach new face is created by picking points.\n\n#### InPlane (Yes/No)\n\nSet Yes to define a plane with the first three points and constrain the rest points of the current face on that plane. This option only takes effect when PolygonType=Quad/Ngon.\n\n#### WeldAngle (Only for Output=Mesh)\n\nThe welding tolerance for mesh edges in degrees. Welding applies to edges around new faces. The default angle is 180 degrees that welds all edges.\n\n#### Mode (SingleFace/MultipleFaces)\n\nSpecifies to create only one or more faces in a command session.\n\n#### Undo\n\nRemoves the previous pick.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"3DFace","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/3dface/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/3dface/#command-line-options","collection":"docs7","hash":"6e7e2a7dcfb633d860ad9b6f834f0f47","indexed_by":"docs-index"}},{"content":"SubDBox — SubDBox\n\nThe SubDBox command creates a subdivision box object.\n\nSteps\n1. Specify the face numbers in the X, Y, and Z directions.\n2. Pick two points for the opposite corners of the base rectangle.\n\nPress and hold Shift to draw a square.\n\nOr, select one of the options to draw the rectangle in a different way.\n3. Pick the height.\n\nPress Enter to use the width value for the height.","metadata":{"title":"SubDBox","section":"SubDBox","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdbox/#subdbox","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdbox/#subdbox","collection":"docs7","hash":"465fee9cbc3e3d51cb5a95bf4931a15c","indexed_by":"docs-index"}},{"content":"SubDBox — Command-line options\n\n#### Diagonal: Creates a box from the diagonal corners. If you pick the two corners on the CPlane, the command prompts for picking the height.\n\n* Cube: Creates a box with six square faces from the diagonal corners.\n\n#### (Default)\n\nDraws the rectangle using two opposite corners.\n\n#### 3Point\n\nDraws the rectangle using two adjacent corner locations and a location on the opposite side.\n\n* EdgeMidpoint: Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\n#### Vertical\n\nDraws the rectangle perpendicular to the construction plane.\n\n#### Center\n\nDraws the rectangle from the center point and a corner.\n\n#### AroundCurve\n\nDraws a rectangle perpendicular to a curve.\n\nSteps\n\n* Select a curve and pick the center of the rectangle on the curve.\n\n#### XCount/YCount/ZCount\n\nThe number of faces in the x/y/z direction.\n\n*\n\nType a number other than 0 and press Enter to set the same number for all directions. Typing 0 picks a point at the current CPlane origin.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDBox","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdbox/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdbox/#command-line-options","collection":"docs7","hash":"70af7fecd339124a935e9e5f277fbca4","indexed_by":"docs-index"}},{"content":"SubDCone — SubDCone\n\nThe SubDCone command creates a Subdivision cone object.\n\nCommand-line options\n#### DirectionConstraint\n\nDirection constraints restrict the direction of the cone.\n\n1. None: Pick or type a number to set the height.\n\n*\n\nUse elevator mode, object snaps, or other modeling aids to help picking a location.\n\nThe cursor location is the positive direction when you type a number to set the height.\n\n*\n\n2. Vertical\n\nCreates a cone perpendicular to the construction plane.\n\n*\n\nThe CPlane +Z direction is the positive direction when you type a number to set the height.\n\n*\n\n3. AroundCurve\n\nDraws the base circle perpendicular to the picked point on a curve. The center line of the cone will be tangent to the curve.\n\n* The curve direction is the positive direction when you type a number to set the height.\n\n#### Solid (Yes/No)\n\nDecides if the bottom will be capped to create a solid or open cone.\n\n#### Radius\n\nDraws the base circle by picking the center point and a radius point.\n\nDiameter - Circumference - Area - ProjectOsnap\n\n#### 2Point\n\nDraws the base circle from two opposite points.\n\n#### 3Point\n\nDraws the base circle through three points.\n\nRadius\n\n#### Tangent\n\nDraws the base circle tangent to one, two, or three curves.\n\nPoint - FromFirstPoint - Radius\n\n#### FitPoints\n\nDraws the base circle by fitting to selected points, control points, or mesh vertices.\n\n1. VerticalFaces: Sets the face count between the bottom and the apex.\n\n2. AroundFaces: Sets the face count in the east-west direction.\n\n3. CapFaceStyle (Tri/Quad): Select to use triangle or quad faces to fill the bottom opening.\n\n*\n\nThis option is only visible when AroundFaces is an even number (4, 6, 8...), and Solid=Yes.\n\nTri is always used when AroundFaces is an odd number.\n\n*","metadata":{"title":"SubDCone","section":"SubDCone","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcone/#subdcone","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcone/#subdcone","collection":"docs7","hash":"afebe4f296c4607a52d0c07b44cefdac","indexed_by":"docs-index"}},{"content":"SubDCone — SubDCone\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDCone","section":"SubDCone","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcone/#subdcone","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcone/#subdcone","collection":"docs7","hash":"c1a7fba9f47eddb6657dd5dba4f83ecf","indexed_by":"docs-index"}},{"content":"SubDCylinder — SubDCylinder\n\nThe SubDCylinder command creates a Subdivision cylinder object.\n\nSteps\n1. Draw the base circle.\n2. Pick a location or type a number to set the height.\n\nThe DirectionConstraint options define the positive height differently.","metadata":{"title":"SubDCylinder","section":"SubDCylinder","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcylinder/#subdcylinder","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcylinder/#subdcylinder","collection":"docs7","hash":"aae096259b9b35ad83ed559e1b8ee011","indexed_by":"docs-index"}},{"content":"SubDCylinder — Command-line options\n\n#### DirectionConstraint\n\n#### Direction constraints restrict the direction of the cylinder.\n\n1. None: Pick or type a number to set the height.\n\n*\n\nUse elevator mode, object snaps, or other modeling aids to help picking a location.\n\nThe cursor location defines the positive direction when you type a number to set the height.\n\n*\n\n2. Vertical\n\nCreates a cylinder perpendicular to the construction plane.\n\n*\n\nThe CPlane +Z direction defines the positive direction when you type a number to set the height.\n\n*\n\n#### AroundCurve\n\nDraws the base circle perpendicular to the picked point on a curve. The center line of the cylinder will be tangent to the curve.\n\n*\n\nThe curve direction defines the positive direction when you type a number to set the height.\n\n*\n\n#### Solid\n\nCaps the top and bottom openings or leave them open.\n\n#### Radius\n\nDraws the base circle by picking the center point and a radius point.\n\nDiameter - Circumference - Area - ProjectOsnap\n\n#### 2Point\n\nDraws the base circle from two opposite points.\n\n#### 3Point\n\nDraws the base circle through three points.\n\nRadius\n\n#### Tangent\n\nDraws the base circle tangent to one, two, or three curves.\n\nPoint - FromFirstPoint - Radius\n\n#### FitPoints\n\nDraws the base circle by fitting to selected points, control points, or mesh vertices.\n\n#### AroundFaces\n\nThe number of faces around the circumference.\n\n#### VerticalFaces\n\nThe number of faces in the vertical direction.\n\n#### BothSides\n\nCreates a cylinder symmetrical across the base circle. The height of the cylinder is twice as long as you specify.\n\n#### CapFaceStyle (Tri/Quad)\n\nSelect to use triangle or quad faces to fill the top and bottom openings.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDCylinder","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcylinder/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdcylinder/#command-line-options","collection":"docs7","hash":"ce4294ef47f55e50a21354e75d227ee8","indexed_by":"docs-index"}},{"content":"SubDEllipsoid — SubDEllipsoid\n\nThe SubDEllipsoid command draws a subdivision ellipsoid.\n\nCommand-line Options\n#### Radius\n\nCreates an ellipsoid by defining the half-length of each axis.\n\n1. Corner: Draws the base ellipse from the center point and a corner of the enclosing rectangle.\n\n#### Corner\n\nDraws the base ellipse from two opposite corners of the enclosing rectangle.\n\n#### Diameter\n\nCreates an ellipsoid by defining the length of each axis.\n\n1. Vertical: Draws the base ellipse perpendicular to the construction plane.\n\n#### FromFoci\n\nDraws the ellipse from focus points and a point on the curve.\n\n1. MarkFoci: Places a point object at the focus locations.\n\n#### AroundCurve\n\nDraws the base ellipse perpendicular to the picked point on a curve. The third axis will be tangent to the curve.\n\n#### VerticalFaces\n\nNumber of faces along the first axis.\n\n#### AroundFaces\n\nNumber of faces around the first axis.\n\n#### CapFaceStyle (Tri/Quad)\n\nSelect to use triangle or quad faces at the poles.\n\n*\n\nThis option is only visible when AroundFaces is an even number (4, 6, 8...).\n\nTri is always used when AroundFaces is an odd number.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDEllipsoid","section":"SubDEllipsoid","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdellipsoid/#subdellipsoid","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdellipsoid/#subdellipsoid","collection":"docs7","hash":"24786d018d5fa5a6c6856d8d7da67765","indexed_by":"docs-index"}},{"content":"SubDPlane — SubDPlane\n\nThe SubDPlane command creates a Subdivision plane object.\n\nSteps\n* Pick two points for the opposite corners of a rectangle.\n\nOr, select one of the options to draw the rectangle in a different way.\n* Specify the face numbers in X and Y directions.\n\nCommand-line options\n#### (Default): Draws the rectangle using two opposite corners.\n\n#### 3Point: Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\n#### EdgeMidpoint: Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\n#### Vertical: Draws the rectangle perpendicular to the construction plane.\n\n#### Center: Draws the rectangle from the center point and a corner.\n\nXCount: The number of faces in the x direction.\n\nYCount: The number of faces in the y direction.\n\n*\n\nType a number other than 0 and press Enter to set the same number for both directions. Typing 0 picks a point at the current CPlane origin.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDPlane","section":"SubDPlane","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdplane/#subdplane","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdplane/#subdplane","collection":"docs7","hash":"567bdad80168840e17bf6dda4bf1c70f","indexed_by":"docs-index"}},{"content":"SubDSphere — SubDSphere\n\nThe SubDSphere command creates a Subdivision sphere object with three different styles.\n\nCommand-line options\n#### Styles\n\n1. UV: Creates a UV SubD sphere made out of quad faces and a triangle fan at the poles.\n\nVerticalFaces: The face count in the vertical direction.\n\nAroundFaces: The face count in the horizontal direction.\n\n2. Quads\n\nCreates a quad SubD sphere with the vertices evenly distributed. A quad SubD sphere starts from a cube (a regular polyhedron with 6 faces). It is then subdivided by the times specified in the Subdivisions option.\n\nSubdivisions: Refines the quad SubD sphere by subdividing each quad into 4 smaller quads every time. The subdivision range is from 0 (6 faces) to 6 (24576 faces).\n\n3. Triangles\n\nCreates an icospherical SubD with the vertices evenly distributed. A SubD icosphere starts from an icosahedron (a regular polyhedron with 20 equilateral triangles). It is then subdivided by the times specified in the Subdivisions option.\n\nSubdivisions: Refines the icospherical SubD by subdividing each triangle into 4 smaller triangles every time. The subdivision range is from 0 (20 faces) to 5 (20480 faces).\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDSphere","section":"SubDSphere","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdsphere/#subdsphere","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdsphere/#subdsphere","collection":"docs7","hash":"15cad1e52bddf0d63edc9145744007c9","indexed_by":"docs-index"}},{"content":"SubDTorus — SubDTorus\n\nThe SubDTorus command draws a subdivision torus object.\n\nBase circle options\n#### Radius\n\nPick a point or enter a radius to decide the size of the base circle.\n\n#### Vertical\n\nDraws the base circle vertical to the construction plane.\n\n#### 2Point\n\nPick two opposite points on the base circle.\n\n#### 3Point\n\nDraws the base circle through three points.\n\n#### Tangent\n\nDraws the base circle tangent to one, two, or three curves.\n\n#### AroundCurve\n\nDraws the base circle perpendicular to the picked point on a curve. The center line of the torus will be tangent to the curve.\n\n#### FitPoints\n\nDraws the base circle by fitting to selected points, control points, or mesh vertices.\n\n#### VerticalFaces\n\nThe number of faces along the second circle.\n\n#### AroundFaces\n\nThe number of faces along the base circle.","metadata":{"title":"SubDTorus","section":"SubDTorus","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtorus/#subdtorus","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtorus/#subdtorus","collection":"docs7","hash":"ccfbb1f07a059e537bf48fa8f6733bfa","indexed_by":"docs-index"}},{"content":"SubDTorus — Second circle options\n\n#### Radius\n\nPick a point or enter a radius to decide the size of the second circle.\n\n#### Diameter\n\nPick a point or enter a diameter to decide the size of the second circle.\n\n#### FixInnerDimension\n\nThe first radius chosen sets the inner dimension of the torus and the second radius is constrained to be outside of the first radius.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDTorus","section":"Second circle options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtorus/#second-circle-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtorus/#second-circle-options","collection":"docs7","hash":"571d053c1f47864bff297234ea6d1ef3","indexed_by":"docs-index"}},{"content":"SubDTruncatedCone — SubDTruncatedCone\n\nThe SubDTruncatedCone command creates a subdivision truncated cone object.\n\nSteps\n1. Draw the base circle.\n2. Pick a location or type a number to set the height.\n\nThe positive direction of the height is different based on the selected DirectionConstraint option.\n3. Draw the end circle.","metadata":{"title":"SubDTruncatedCone","section":"SubDTruncatedCone","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#subdtruncatedcone","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#subdtruncatedcone","collection":"docs7","hash":"6ce538a743c11787cf7cd6eb5d6238cc","indexed_by":"docs-index"}},{"content":"SubDTruncatedCone — Base circle options\n\nDirectionConstraint\n\nDirection constraints restrict the direction of the truncated cone.\n\n1. None: Pick or type a number to set the height.\n\n*\n\nUse elevator mode, object snaps, or other modeling aids to help picking a location.\n\nThe cursor location is the positive direction when you type a number to set the height.\n\n*\n\n2. Vertical: Creates a truncated cone perpendicular to the construction plane.\n\n*\n\nThe CPlane +Z direction is the positive direction when you type a number to set the height.\n\n*\n\n3. AroundCurve\n\nDraws the base circle perpendicular to the picked point on a curve. The center line of the truncated cone will be tangent to the curve.\n\n*\n\nThe curve direction is the positive direction when you type a number to set the height.\n\n*\n\n#### Solid\n\nCaps the top and bottom openings or leave them open.\n\n#### Radius\n\nDraws the base circle by picking the center point and a radius point.\n\nDiameter - Circumference - Area - ProjectOsnap\n\n#### 2Point\n\nDraws the base circle from two opposite points.\n\n#### 3Point\n\nDraws the base circle through three points.\n\nRadius\n\n#### Tangent\n\nDraws the base circle tangent to one, two, or three curves.\n\nPoint - FromFirstPoint - Radius\n\n#### FitPoints\n\nDraws the base circle by fitting to selected points, control points, or mesh vertices.\n\n#### VerticalFaces\n\nThe number of faces in the vertical direction.\n\n#### AroundFaces\n\nThe number of faces around the circumference.\n\n#### CapFaceStyle (Tri/Quad)\n\nSelect to use triangle or quad faces to fill the top and bottom openings.\n\n*\n\nThis option is only visible when AroundFaces is an even number (4, 6, 8...), and Solid=Yes.\n\nTri is always used when AroundFaces is an odd number.\n\n*","metadata":{"title":"SubDTruncatedCone","section":"Base circle options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#base-circle-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#base-circle-options","collection":"docs7","hash":"ef41e7f4803fc7877d3730b1523ecd7e","indexed_by":"docs-index"}},{"content":"SubDTruncatedCone — End circle options\n\n#### Radius\n\nPick a location or enter a number to set the end circle radius.\n\n#### Diameter\n\nPick a location or enter a number to set the end circle diameter.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SubDTruncatedCone","section":"End circle options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#end-circle-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/primitives-subd/subdtruncatedcone/#end-circle-options","collection":"docs7","hash":"93de0034cc77e541136873fce869acd0","indexed_by":"docs-index"}},{"content":"Edge — Filter Edges\n\nThe SelectionFilterEdges command restricts selection to edges of surfaces, meshes, and SubDs.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Edge","section":"Filter Edges","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/edge/#filter-edges","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/edge/#filter-edges","collection":"docs7","hash":"e1c5339fcf2523126dbd4f9bd74a8f43","indexed_by":"docs-index"}},{"content":"Face — Filter Faces\n\nThe SelectionFilterFaces command restricts selection to surfaces, mesh faces, and SubD faces.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Face","section":"Filter Faces","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/face/#filter-faces","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/face/#filter-faces","collection":"docs7","hash":"ffc73d869e9896ff756f72dcf86cf7dd","indexed_by":"docs-index"}},{"content":"FaceEdgeVertexToggle — FaceEdgeVertexToggle\n\nThe SubDFaceEdgeVertexToggle command toggles SubD sub-object selection between SubD faces, edges, and vertices.\n\n* Assign the command to a keyboard shortcut, or an alias for convenience.\n\nSteps\n1. Ctrl(CMD)+Shift+Click one or more SubD faces.\n2. Run the SubDFaceEdgeVertexToggle command several times.\n\nThe selection cycles through faces, edges, and vertices.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"FaceEdgeVertexToggle","section":"FaceEdgeVertexToggle","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/faceedgevertextoggle/#faceedgevertextoggle","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/faceedgevertextoggle/#faceedgevertextoggle","collection":"docs7","hash":"a63a9203ad8bd00ec8e182787d9c6772","indexed_by":"docs-index"}},{"content":"MakeSubDFriendly — MakeSubDFriendly&#x20;\n\nThe MakeSubDFriendly command makes any curves SubD compatible.\n\n* A SubD friendly curve is a degree 3 uniform curve.\n* The second control points on both ends are constrained and locked. These points display with the locked object color.\n* The first and last three control points are always collinear to maintain zero curvature at both ends.\n* Moving or deleting Control Points or Edit Points will not destroy the SubD friendly characteristic.\n* SubD creation commands (SubDLoft, SubDSweep1, SubDSweep2...) create a better SubD object from SubD friendly curves.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"MakeSubDFriendly","section":"MakeSubDFriendly&#x20;","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/makesubdfriendly/#makesubdfriendlyx20","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/makesubdfriendly/#makesubdfriendlyx20","collection":"docs7","hash":"b014eb74fa801319827eda00fd8d5ec6","indexed_by":"docs-index"}},{"content":"Named Selections — Named Selections\n\nThe NamedSelections command opens the Named Selections panel that saves selection sets.\n\n*\n\nNamed Selections panel\n####\n\n#### To save a selection set\n\n1. Select objects or sub-objects.\n2. Click .\n3. Type a name for the selection, click OK.\n\nThe objects are listed by types under the named selection item.\n\nSelection sets are saved in the 3dm file.\n\nTo delete a selection set\n\n1. Select a selection set.\n2. Click .\n\nTo replace, or add more objects to, a selection set\n\n1. Select objects or sub-objects.\n2. Click .\n3. Enter the name of an existing selection set.\n4. When prompted, click Replace or Add.\n\nTo use a selection set**\n\n* Select a selection set before starting a command, or when a command prompts for selecting objects.\n\nTo sort selection sets\n\n* Click the Selection column header to sort the parent items in ascending or descending order.\n* Drag and drop a parent item name to a new location in the list.\n* Duplicating all objects in a selection set also duplicates the selection set.\n* Deleting all objects in a selection set also deletes the selection set.\n* Subobject selection sets duplicate with their top object.\n* Objects made into a block will be removed from selection sets.\n* When all objects in a selection set are made into a block, the selection set will be removed.\n\nTo access command-line options\n\n* Type a hyphen in front of the command name: -NamedSelections.","metadata":{"title":"Named Selections","section":"Named Selections","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/named-selections/#named-selections","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/named-selections/#named-selections","collection":"docs7","hash":"94ae0c48c3c02734038745a240aed76a","indexed_by":"docs-index"}},{"content":"Named Selections — Command-line options\n\nList\\ Outputs the selection set list to the command history window.\n\nSave\\ Creates a new selection set for selected objects.\n\nSelect\\ Specifies a selection set to select objects.\n\nTo script named selections\\ The scriptable -NamedSelections command can be run (nested) in other commands.\n\n* Use :: (two colons) to separate the top and child levels.\n* Names containing spaces have to be placed in double quotes.\\ Example: -\\_Move -\\_NamedSelections \\_Select \"Selection 01::Extrusion\" \\_Enter 0 10,20\\ This macro moves the Extrusion objects in the selection set of Selection 01 10 units in the x-axis and 20 units in the y-axis.\n\nDelete\\ Specifies a selection set to remove from the model.\\ Objects in the selection set will not be deleted.\n\nRename\\ Changes the name of an existing selection set.\n\nTabVisibility\\ Controls visibility of the Named Selections panel.\n\nTabVisible (Yes/No/Toggle)\\ Turns on, turns off, the Named Selections panel, or changes its visibility state.\n\nReplace (On/Off)\\ When the saved name exists, replace the existing named selection (On), or add more objects to it (Off).\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Named Selections","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/named-selections/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/named-selections/#command-line-options","collection":"docs7","hash":"bdf6bb616952c7051a0e6c9a5dc53c4a","indexed_by":"docs-index"}},{"content":"Object — Object\n\nThe SelectionFilterNone command resets the filter settings. Object selection returns to the default behavior.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Object","section":"Object","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/object/#object","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/object/#object","collection":"docs7","hash":"a2a3b133a4dfd36e48b42164f0364fca","indexed_by":"docs-index"}},{"content":"SelBrush — SelBrush\n\nThe SelBrush command selects objects based on painting a thick brush stroke.\n\nSteps\n* Click and drag or click repeatedly to draw the stroke.\n\nBy default it uses crossing select: objects touched by the stroke are selected.\n\nUse Selection Filters to change what types of objects/sub-objects are selectable.","metadata":{"title":"SelBrush","section":"SelBrush","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selbrush/#selbrush","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selbrush/#selbrush","collection":"docs7","hash":"9f884ddc5564c699bc4a74b3673609ac","indexed_by":"docs-index"}},{"content":"SelBrush — Command-line options\n\n#### Curve\n\nSelect an existing curve that represents the brush stroke.\n\n#### Polyline\n\n* Yes - Draw straight stroke between clicks.\n* No - Draw strokes by freehand.\n\n#### SelectionMode\n\n* Window\n\nSelects objects completely inside the brush stroke.\n* Crossing\n\nSelects objects completely or partially inside the brush stroke.\n* InvertWindow\n\nSelects objects completely outside the brush stroke.\n* InvertCrossing\n\nSelects objects completely or partially outside the brush stroke.\n\n#### BrushWidth\n\nSpecifies the brush width in pixels.\n\nOr, hold Shift and move the cursor up (increase size) or down (decrease size) to change the brush size dynamically.\n\n#### SelectThroughObjects\n\n* Yes - Selects objects/sub-objects regardless of their visibility.\n* No - Only selects visible objects/sub-objects.\n\nRealTimeSelection\n\n* Yes - Select instantly when the brush circle touches objects. Brush strokes do not display.\n\n&#x20;\\- Hold Ctrl(CMD) to deselect objects.\n\n&#x20;\\- Hold Ctrl(CMD) + Shift to select sub-objects.\n* No - Select objects under strokes when the command ends.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelBrush","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selbrush/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selbrush/#command-line-options","collection":"docs7","hash":"27c2c1d6e268a92f493771eda963410f","indexed_by":"docs-index"}},{"content":"Select SubD — Select SubD\n\nThe SelSubD command selects all subdivision objects.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Select SubD","section":"Select SubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/select-subd/#select-subd","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/select-subd/#select-subd","collection":"docs7","hash":"5f5d817f61eca58c938b8fbd9d4d77ec","indexed_by":"docs-index"}},{"content":"SelEdgeLoop — SelEdgeLoop\n\nThe SelEdgeLoop command selects a loop of mesh/SubD edges by picking an edge in the loop.\n\nSteps\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest of edges in the loop.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the loop.\n2. Press Enter to accept the selection.\\ An edge loop is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the edges to deselect individually.\n\n&#x20; \\- This command only works on meshes with UV information.\n\n&#x20; \\- This command can be used when a command prompts for selecting mesh/SubD edges.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelEdgeLoop","section":"SelEdgeLoop","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/seledgeloop/#seledgeloop","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/seledgeloop/#seledgeloop","collection":"docs7","hash":"3705ce09ebea54136d85e5c41d835244","indexed_by":"docs-index"}},{"content":"SelEdgeRing — SelEdgeRing\n\nThe SelEdgeRing command selects a ring of mesh/SubD edges by picking an edge in the ring.\n\nSteps\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest edges in the ring.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the ring.\n2. Press Enter to accept the selection.\\ An edge ring is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the edges to deselect individually.\n\n&#x20; \\- This command only works on meshes with UV information.\n\n&#x20; \\- This command can be used when a command prompts for selecting mesh/SubD edges.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelEdgeRing","section":"SelEdgeRing","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/seledgering/#seledgering","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/seledgering/#seledgering","collection":"docs7","hash":"086dfd53e256126ce6ed685dab70522e","indexed_by":"docs-index"}},{"content":"SelFaceLoop — SelFaceLoop\n\nThe SelEdgeLoop command selects a loop of mesh/SubD edges by picking an edge in the loop.\n\nSteps\n1. Pick a mesh/SubD edge.\n\nThe picked edge is highlighted brighter than the rest of edges in the loop.\n\nYou can hold down Ctrl(CMD) and pick the brighter edge to deselect the loop.\n2. Press Enter to accept the selection.\\ An edge loop is selected.\n3. Hold down Shift + Ctrl(CMD) and pick the edges to deselect individually.\n\n&#x20; \\- This command only works on meshes with UV information.\n\n&#x20; \\- This command can be used when a command prompts for selecting mesh/SubD edges.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelFaceLoop","section":"SelFaceLoop","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selfaceloop/#selfaceloop","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selfaceloop/#selfaceloop","collection":"docs7","hash":"127cd9ba58af7adf0ba7ac888d538f78","indexed_by":"docs-index"}},{"content":"SelFacesToBoundary — SelFacesToBoundary\n\nThe SelFacesToBoundary command selects SubD or mesh faces surrounded by selected faces, borders, or both.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelFacesToBoundary","section":"SelFacesToBoundary","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selfacestoboundary/#selfacestoboundary","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selfacestoboundary/#selfacestoboundary","collection":"docs7","hash":"0fd3aeb8841988cb83e4d499797e408e","indexed_by":"docs-index"}},{"content":"SelSubDEdges — SelSubDEdges\n\nThe SelSubDEdges command selects different types of edges on selected SubDs.\n\nSteps\n1. Select SubD objects, press Enter.\n\nThe command reports the numbers of different edge types.\n2. Sets what types of edges to be selected.\n\nThe command-line only shows the edge types that the selected SubDs have.\n\nCommand-line options\n#### Smooth (Yes/No)\n\nSpecifies whether smooth edges will be selected.\n\n#### Weighted (Yes/No)\n\nSpecifies whether soft crease edges will be selected.\n\nThe SubDCrease command adds soft crease edges to SubDs.\n\n#### Crease (Yes/No)\n\nSpecifies whether hard crease edges will be selected.\n\nThe Crease command adds hard crease edges to SubDs.\n\n#### Boundary (Yes/No)\n\nSpecifies whether naked edges will be selected.\n\nThe MakeSubDFriendly command makes any curves SubD compatible.\n\n&#x20;\n\n* A SubD friendly curve is a degree 3 uniform curve.\n* The second control points on both ends are constrained and locked. These points display with the locked object color.\n* The first and last three control points are always collinear to maintain zero curvature at both ends.\n* Moving or deleting Control Points or Edit Points will not destroy the SubD friendly characteristic.\n* SubD creation commands (SubDLoft, SubDSweep1, SubDSweep2...) create a better SubD object from SubD friendly curves.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"SelSubDEdges","section":"SelSubDEdges","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selsubdedges/#selsubdedges","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/selsubdedges/#selsubdedges","collection":"docs7","hash":"05178d353d05296c492898be7982d0a9","indexed_by":"docs-index"}},{"content":"Vertex — Filter Vertices\n\nThe SelectionFilterVertices command restricts selection to object grips.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Vertex","section":"Filter Vertices","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/vertex/#filter-vertices","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/selection/vertex/#filter-vertices","collection":"docs7","hash":"c5c655369ebab9f5b664d04442cdd158","indexed_by":"docs-index"}},{"content":"To SubD — To SubD\n\nThe ToSubD command converts supported object types into SubD objects.\n\nInput\nMesh, Extrusion, Surface, Sub-surface\n\nUseMesh\n* ControlPoints: Turns mesh vertices into SubD control points (left).\n* Location: Turns mesh vertices into SubD surface points (right).\n\nConceptually, this is the difference between what the Curve and InterpCrv commands do. The Curve command turns input points into the curve's control points. The InterpCrv command creates a curve to pass the input points.","metadata":{"title":"To SubD","section":"To SubD","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#to-subd","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#to-subd","collection":"docs7","hash":"5ea48d53ee62d19ddf0db81303994561","indexed_by":"docs-index"}},{"content":"To SubD — MeshCreases\n\nSpecifies whether unwelded mesh edges (red) will be turned into creased edges.\n\n_1) Input mesh 2) MeshCreases=Yes 3) MeshCreases=No_\n\nMeshCorners\nSpecifies whether the boundary corner vertex of a quad mesh face will be creased or smoothed.\n\n1\\) Input mesh 2) MeshCorners=Yes 3) MeshCorners=No\n\nUseSurface\n* ControlPoints: Turns NURBS surface control points into SubD control points.\n\nUse this option if you are doing \"Class A\" modeling and need to join separate SubDs into a single SubD.\n\n* Location: The output SubD has the best fit to the input NURBS surface. Extra faces might be inserted.","metadata":{"title":"To SubD","section":"MeshCreases","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#meshcreases","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#meshcreases","collection":"docs7","hash":"554acc5bc731314065c41a682db2b565","indexed_by":"docs-index"}},{"content":"To SubD — SurfaceCorners\n\nSpecifies whether NURBS surface corners will turn into creased or smooth SubD vertices.\n\n_1) Input NURBS surface 2) SurfaceCorners=Yes 3) SurfaceCorners=No_\n\nDeleteInput\nDeletes (Yes) or keeps (No) the input objects.\n\n* When a surface is SubD friendly (left), the SubD will match to the input surface shape.\\\n\n* Trims of a surface or sub-surface will be lost in the SubD.\\\n\n* Sub-surfaces of a polysurface will be converted individually.\\\n\n* Non-manifold mesh edges and related faces will be removed.\\\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"To SubD","section":"SurfaceCorners","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#surfacecorners","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/to-subd/#surfacecorners","collection":"docs7","hash":"3d827741343ac0d99a2dc085e3aeded6","indexed_by":"docs-index"}},{"content":"ToNURBS — ToNURBS\n\nThe ToNURBS command converts mesh objects and SubD objects/edges to NURBS surfaces or curves. It can also convert simple objects to NURBS for programs that only read NURBS. For example, Extrusion object is one of the simple object types. It is defined only by a profile curve and a length.\n\n_Note: The ToNURBS command replaces the ConvertExtrusion and MeshToNURB commands._\n\nTo create NURBS surfaces - Select a mesh or SubD object.\n\nTo create NURBS curves - Hold down Shift+Ctrl and click mesh or SubD edges. Double-click to select an edge loop.","metadata":{"title":"ToNURBS","section":"ToNURBS","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#tonurbs","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#tonurbs","collection":"docs7","hash":"47196a9263d1295b4d178bf22286f9a7","indexed_by":"docs-index"}},{"content":"ToNURBS — Command-line options\n\n#### DeleteInputObjects\n\n* Yes - The NURBS object will replace the non-NURBS object.\n* No - The NURBS object will simply be added on the current layer. Both the old and new objects will be in the same location.\n\n#### MeshOptions (Mesh input only)\n\nClick to set the options only used for mesh to NURBS conversion.\n\n* TrimTriangularFaces\n* Yes - Mesh triangles will be replaced by trimmed NURBS surfaces.\n* No - Mesh triangles will be replaced by untrimmed NURBS surfaces.\n\n#### SubDOptions (SubD input only)\n\nClick to set the options only used for SubD to NURBS conversion.\n\n* Faces\n\nSpecifies if quad face grids will be merged when converting a SubD into a polysurface.\n\n* Packed\n\nMerges a quad face grid into a larger NURBS surface.\n* Unpacked\n\nCreates a NURBS surface from each quad SubD face.\n\n* ExtraordinaryVertex\n\nContinuity on a SubD at extraordinary vertices is G2. When converting a SubD to a polysurface, extraordinary vertices can only be approximated. This option controls the continuity of the polysurface at extraordinary vertices. Away from extraordinary vertices, the polysurface is always G2 in smooth SubD regions. &#x20;\n\n&#x20;.png)\n\n* G0\n\nMakes the polysurface G0 at the extraordinary vertices. The shape of the polysurface will be as close as possible to the SubD.\n\n.png)\n\n* G1\n\nMakes the polysurface G1 at the extraordinary vertices. The polysurface deviates from the SubD a little bit more than G0.\n\n&#x20;.png)\n\n* G1x\n\nSimilar to the G1 option, but tries to make the edge normal deviation around extraordinary vertices 1 degree or less.\n* G1xx\n\nMakes the polysurface G1 at the extraordinary vertices and uses double knots on the isocurves near the edges. More control points will be added to improve the smoothness of Zebra stripes.\n* G2","metadata":{"title":"ToNURBS","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#command-line-options","collection":"docs7","hash":"733510457c368324e621c9d38a7863dd","indexed_by":"docs-index"}},{"content":"ToNURBS — Command-line options\n\nMakes the polysurface G2 at the extraordinary vertices.\n\nForcing G2 adds bulges or dents around extraordinary vertices.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"ToNURBS","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/subd/tonurbs/#command-line-options","collection":"docs7","hash":"c2ce4082f093cc0520af9b42c3d6f7cc","indexed_by":"docs-index"}},{"content":"Surface\n\nFive groups, left to right.\n\nSweeps\nAdd a Picture Plane Places a reference image on a plane.\n\nSweep 1 Rail Sweeps a profile along a single rail curve.\n\nSweep 2 Rail Sweeps a profile along two rail curves.\n\nCurves On 1 Rail Distributes profile curves along one rail, ready to sweep.\n\nCurves On 2 Rails Distributes profile curves between two rails.","metadata":{"title":"Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/","collection":"docs7","hash":"6a5e408d423c7f29287a5868b4ba5ac7","indexed_by":"docs-index"}},{"content":"Surface — Create\n\nCorners A surface through three or four corner points.\n\nRectangular A flat rectangular plane.\n\nRectangular Plane: 3 Points A plane placed by three picked points.\n\nEdges A surface from two, three or four edge curves.\n\nLoft A surface through a series of profile curves.\n\nPatch Fits a surface through curves, points and meshes.\n\nRevolve Revolves a profile curve around an axis.\n\nDrape Drapes a surface over objects like a sheet.\n\nFit Plane Through Points The best-fit plane through picked points.\n\nVertical Plane A plane perpendicular to the construction plane.\n\nCutting Plane A plane through an object, sized to cut it.\n\nFrom Planar Curves Caps planar closed curves with a surface.\n\nNetwork A surface from a network of crossing curves.\n\nBlend A smooth surface between two existing edges.\n\nRail Revolve Revolves a profile along a rail curve.\n\nHeightfield Builds relief from the greyscale of an image.","metadata":{"title":"Surface","section":"Create","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/#create","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/#create","collection":"docs7","hash":"3327b5ab9b19435165c81dd563a74842","indexed_by":"docs-index"}},{"content":"Surface — Extrude\n\nExtrude Curve Extrudes a curve in a straight direction.\n\nExtrude Curve Tapered Extrudes with a draft angle.\n\nNormal to Surface Extrudes a curve normal to the surface it lies on.\n\nExtrude Curve to Point Extrudes a curve to a single apex.\n\nExtrude Curve Along Curve Extrudes a curve following a path curve.\n\nRibbon Offsets a curve and surfaces the gap between.","metadata":{"title":"Surface","section":"Extrude","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/#extrude","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/#extrude","collection":"docs7","hash":"7ce1da3dd403c8a122993373159aa6b2","indexed_by":"docs-index"}},{"content":"Surface — Edit\n\nFillet Rounds the joint between two surfaces.\n\nFillet Surface to Rail Curve Fillets following a rail you pick.\n\nChamfer Bevels the joint between two surfaces.\n\nConnect Extends or trims two surfaces so they meet.\n\nOffset Copies a surface at a set distance.\n\nExtend Lengthens a surface past its edge.\n\nBlend Variable A fillet whose radius changes along the joint.\n\nFillet Surface to Curve Fillets a surface up to a curve.\n\nChamfer Variable A chamfer whose width changes along the joint.\n\nMatch Matches position, tangency or curvature at an edge.\n\nVariable Offset Offsets by a distance that varies across the surface.\n\nMerge Merges two untrimmed surfaces into one.","metadata":{"title":"Surface","section":"Edit","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/#edit","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/#edit","collection":"docs7","hash":"e51c36317c531983062634218eb8e5e4","indexed_by":"docs-index"}},{"content":"Surface — Advanced\n\nSplit and Refit Surface Splits a surface and refits the pieces.\n\nDivide Surface Along Creases Splits a surface wherever it kinks.\n\nSurface Tangent Sets the tangent direction at a surface edge.\n\nUnroll Developable Surface Flattens a developable surface for cutting.\n\nRefit Surface to Tolerance Refits a surface within a given tolerance.\n\nRebuild Rebuilds a surface with a set point count and degree.\n\nConvert to Single Spans Rewrites a surface as single-span patches.\n\nShrink Trimmed Surface Shrinks the untrimmed surface under a trim.\n\nSmash Flattens a surface even when not developable.\n\nFlatten Surface Flattens a surface into the construction plane.\n\nAdjust Closed Surface Seam Moves the seam of a closed surface.\n\nRebuild Edges Restores surface edges to their true geometry.","metadata":{"title":"Surface","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/#advanced","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/#advanced","collection":"docs7","hash":"f2e1dbef9c434affc72e4c804f3687e4","indexed_by":"docs-index"}},{"content":"Add a picture plane — Add a picture plane\n\nThe Picture command draws a rectangular planar surface with the specified image assigned to its material and sets the object to Rendered display mode similar to using the SetObjectDisplayMode command.\\\n\nSteps\n1. Select one of the supported image file types.\n\nOr, press Ctrl+V if there is an image stored in Clipboard.\n2. Pick the first corner of the plane.\n3. Pick the other corner, or type the length.\\ The defining rectangle retains the same aspect (length to width) ratio as the image.","metadata":{"title":"Add a picture plane","section":"Add a picture plane","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#add-a-picture-plane","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#add-a-picture-plane","collection":"docs7","hash":"e0ea424d5c2e179c53b970e4a7bb9dbb","indexed_by":"docs-index"}},{"content":"Add a picture plane — Tips\n\n* Isocurves and edges are turned off on picture objects in all display modes.\n* A Picture material will be created that can be edited in the Materials panel.\n* When a Picture plane is split and shrunk, a new material will be added for each new Picture plane. The goal is to make the texture display consistent.\n\n*","metadata":{"title":"Add a picture plane","section":"Tips","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#tips","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#tips","collection":"docs7","hash":"b7e42f2b0d4aad329333ac7fb9332590","indexed_by":"docs-index"}},{"content":"Add a picture plane — Command-line options\n\n(Default)\\ Draws the rectangle using two opposite corners.\n\n3Point\\ Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nEdgeMidpoint\\ Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\nVertical\\ Draws the rectangle perpendicular to the construction plane.\n\nCenter\\ Draws the rectangle from the center point and a corner.\n\nAroundCurve\\ Draws a rectangle perpendicular to a curve.\n\nSteps**\n\n* Select a curve and pick the center of the rectangle on the curve.\n\n1to1\n\nPick a point to place the Picture plane. The plane size will be the print size of the bitmap image calculated from the resolution (dots-per-inch) and the pixel dimension.\n\n*","metadata":{"title":"Add a picture plane","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#command-line-options","collection":"docs7","hash":"3ea3422fd5ff977e192b7d26d8f30620","indexed_by":"docs-index"}},{"content":"Add a picture plane — Picture material properties\n\nName**\\ The name of the material.\n\n* When an image file is dragged to a Rhino object, a Picture material is created and assigned to the object. The image file name becomes the material name.\n* Tiling cannot be modified for a picture texture.\n\nPicture\n\nThe Picture contains a simple bitmap image.\n\n*\n\nTexture\n\nName\\ The path and name of the bitmap file.\n\nSee also Bitmap Texture.\n\nSelf-illumination\n\nThe Self-Illumination option causes the image to always display at full intensity and is not affected by light or shadow.\n\n\\ &#xNAN;_&#x53;elf-Illumination off (left), and on (right)._\n\nGrayscale\\ The Grayscale option sets the image color to 256-gray.\n\nBrowse in folder\\ Select an external bitmap image file on the computer.\n\nRemove texture\\ Delete the texture being added.\n\n*\n\nTransparency\n\nSpecifies transparency settings for the image. Specify a transparent color to be used as an alpha channel if no alpha channel is specified in the image.\n\nTransparency is not supported when using JPEG (.jpg; .jpeg), PCX (.pcx), or Windows Bitmap (.bmp).\n\nUse alpha channel\\ Specifies that the image alpha channel be used to determine transparency.\n\nUse color mask\\ Specifies that a color in the image be used to determine transparency.\n\nColor selector\\ Tolerance:\\ The tolerance to be used to determine if the texture's color matches the transparency color.\n\nObject transparency\\ Sets the amount of transparency for the entire object.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Add a picture plane","section":"Picture material properties","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#picture-material-properties","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/add-a-picture-plane/#picture-material-properties","collection":"docs7","hash":"acab7b640570fd82b221275aaacdd627","indexed_by":"docs-index"}},{"content":"Adjust Closed Surface Seam — Adjust Closed Surface Seam\n\nThe SrfSeam command changes the location on a closed surface where the start and end edges of the surface meet.\n\nSteps\n\n1. Select a closed surface.\n2. The seam of the surface is indicated by a curve.\n3. Click to pick a new location for the seam point.\n\nOptions are only available if the surface is closed in two directions (such as a torus).","metadata":{"title":"Adjust Closed Surface Seam","section":"Adjust Closed Surface Seam","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/adjust-closed-surface-seam/#adjust-closed-surface-seam","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/adjust-closed-surface-seam/#adjust-closed-surface-seam","collection":"docs7","hash":"a8078824c95271085606fbf6000de472","indexed_by":"docs-index"}},{"content":"Adjust Closed Surface Seam — Command-line options\n\nU: Changes the seam in the u direction.\n\nV: Changes the seam in the v direction.\n\nBoth: Changes the seam in both u and v directions.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Adjust Closed Surface Seam","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/adjust-closed-surface-seam/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/adjust-closed-surface-seam/#command-line-options","collection":"docs7","hash":"ef8cf72030ff33afa80dcb00e7f54da3","indexed_by":"docs-index"}},{"content":"Blend — Blend\n\nThe BlendSrf command creates a transitional surface between two surface, polysurface, or extrusion edges.\n\nSteps\n1. Select the first edge.\n\nUse the ChainEdges option to select an edge chain.\n2. Select the second edge, or another edge chain.\n3. Adjust the blend settings or handle control points, click OK.","metadata":{"title":"Blend","section":"Blend","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#blend","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#blend","collection":"docs7","hash":"6f940d304116c71f370929eef14cef68","indexed_by":"docs-index"}},{"content":"Blend — Command-line option\n\nChainEdges: Selects connected edges that will be considered a single edge.\n\nEdit: Changes the blend settings and handles for the blend surface created with History. History locking temporarily turns off when editing a blend surface with History.\n\nKeys for control\nShift: By default the shape curves are separately edited at each end, Hold Shift to retain symmetry. With symmetry, point editing is mirrored to the other end of the curve.\n\nAlt: Hold Alt while dragging the handles to change the angle between the shape curve and the surface edge.","metadata":{"title":"Blend","section":"Command-line option","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#command-line-option","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#command-line-option","collection":"docs7","hash":"0e541f14ceff3b775ff3e00095594aec","indexed_by":"docs-index"}},{"content":"Blend — To Adjust seams\n\n1. Select each seam point and move it along the curve to line up all curve seams.\n2. Use the Flip option to make all seam arrows point to the same side.\n3. Press Enter to continue.\n\nAdjust seam options (Closed curves only)\nFlip: Reverses the curve direction.\n\nAutomatic: Attempts to align the seam points and directions without intervention.\n\nNatural: Moves the seam points to the way they were at the beginning of the command.","metadata":{"title":"Blend","section":"To Adjust seams","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#to-adjust-seams","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#to-adjust-seams","collection":"docs7","hash":"25ab9fd083c15f8a42227a2dffd27a31","indexed_by":"docs-index"}},{"content":"Blend — Adjust Surface Blend options\n\nLock: Maintains the relationship between the two curve ends.\n\nSlider: Determines the distance of influence the surface has on the edge curve.\n\n\\ To watch the video examples and for more information about Adjust seam and Surface Blend options, , please refer to the Rhino documentation.\n\n*\n\nTips**\n\n* Always blend from the largest radius to the smallest radius across a model.\n* Remove any edges you can prior to blending with MergeAllCoplanarFaces or by way of surfacing in a simpler manner. Fewer intersected edges = Fewer problems as the blend rolls along any edges and tries to trim and join with the adjacent surfaces.\n* Make sure there is enough room for the blend surface to trim and join with adjacent surfaces. The angle relationships between surfaces, sharpness of the bend in the edge around corners, and blend type all play a part in any particular case.","metadata":{"title":"Blend","section":"Adjust Surface Blend options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#adjust-surface-blend-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/blend/#adjust-surface-blend-options","collection":"docs7","hash":"1637d4a4448be888f7a8ef1ccbbeb477","indexed_by":"docs-index"}},{"content":"Convert to Single Spans — Convert to Single Spans\n\nThe ConvertToSingleSpans command splits a NURBS surface at knots to create untrimmed single-span surfaces.\n\nCommand-line options\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nDirection: Specifies to split the surface in the U, V, or Both directions.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Convert to Single Spans","section":"Convert to Single Spans","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/convert-to-single-spans/#convert-to-single-spans","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/convert-to-single-spans/#convert-to-single-spans","collection":"docs7","hash":"6bb7d408b7a945f88e247f7d89c962d6","indexed_by":"docs-index"}},{"content":"Corners — Corners\n\nThe SrfPt command draws a surface from specified corner points.\n\nSteps\n1. Pick the first corner.\n2. Pick the second corner.\n3. Pick the third corner.\n4. Pick the fourth corner.\\ Or press Enter to create a triangular surface.\n5. Use different construction planes or elevator mode to draw a non-planar surface.\n\nTo watch the video example, please refer to the Rhino documentation.","metadata":{"title":"Corners","section":"Corners","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/corners/#corners","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/corners/#corners","collection":"docs7","hash":"0e55801d62f12b76345d02ad56369e8f","indexed_by":"docs-index"}},{"content":"Curves On 1 Rail — Curves On 1 Rail\n\nThe \"Orient on 1 rail\" command is used to move and rotate curves along another curve called the rail. It utilizes the direction of the rail curve to determine the orientation of the curves being moved.&#x20;\n\nSteps\nEnsure you have created a rail curve and a separate curve that you want to orient along the rail.\n\nClick on the Curves on 1 Rail command icon.\n\nFirst, select the rail curve. Next, select the curve to be oriented on the rail. Press Enter to confirm your selections.\n\nThe selected curve will appear at the start of the rail curve, accompanied by gumballs. These gumballs allow you to modify the height and width of the curve, as well as rotate the curve to adjust its orientation as needed.\n\nThe command line will display several mode options to customize your operation:\n\n* Open: Leaves the shape open along the rail.\n* Close: Closes the shape along the rail.\n* Comfort: Adjusts the curve for a more ergonomic profile.\n* Thickness: Allows you to specify the thickness of the profile. Input the desired thickness value for precise adjustments.\n\nAdditional features include the ability to flip the curve's orientation and the option to create a sweep surface along the rail curve based on the oriented curve.\n\nAdjust all parameters as required and complete the operation by finalizing the adjustments or exiting the command.\n\nThis streamlined workflow offers precision and flexibility when using the Curves on 1 Rail command.","metadata":{"title":"Curves On 1 Rail","section":"Curves On 1 Rail","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-1-rail/#curves-on-1-rail","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-1-rail/#curves-on-1-rail","collection":"docs7","hash":"c10a4de534a8ac3535a967964346dfda","indexed_by":"docs-index"}},{"content":"Curves On 1 Rail — Command-line options\n\nMode:\n\n* Open: This mode creates an open curve.\n* Close: This mode creates a closed curve.\n* Comfort: This mode creates a smooth closed curve.\n* Thickness: This mode creates a closed curve by offsetting it from the main curve.","metadata":{"title":"Curves On 1 Rail","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-1-rail/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-1-rail/#command-line-options","collection":"docs7","hash":"793892d31e405940589b13367cc4183b","indexed_by":"docs-index"}},{"content":"Curves On 2 Rails — Curves On 2 Rails\n\nThe \"Orient on 2 Rails\" command in 2Shapes for Rhino uses two curves called \"rails\" to orientate a third curve. It utilizes the direction of the rails for orientation.&#x20;\n\nSteps\nThis command operates similarly to the Curves on 1 Rail command but uses two rails instead of one.\n\nEnsure you have created two rail curves and a separate curve that you want to orient between the rails.\n\nClick on the Curves on 2 Rails command icon.\n\nFirst, select the two rail curves. Next, select the curve to be oriented between the rails. Press Enter to confirm your selections.\n\nThe selected curve will appear at the start of the rail curves, accompanied by gumballs. These gumballs allow you to modify the height and width of the curve, as well as rotate the curve to adjust its orientation as needed.\n\nThe command line will display several mode options to customize your operation:\n\n* Open: Leaves the shape open along the rails.\n* Close: Closes the shape along the rails.\n* Comfort: Adjusts the curve for a more ergonomic profile.\n* Thickness: Allows you to specify the thickness of the profile. Input the desired thickness value for precise adjustments.\n\nAdditional features include the ability to flip the curve's orientation and the option to create a sweep surface along the two rail curves based on the oriented curve.\n\nAdjust all parameters as required and complete the operation by finalizing the adjustments or exiting the command.\n\nThis command provides flexibility and precision when working with profiles between two rails.","metadata":{"title":"Curves On 2 Rails","section":"Curves On 2 Rails","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-2-rails/#curves-on-2-rails","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-2-rails/#curves-on-2-rails","collection":"docs7","hash":"d580bf59739ddb1bddfda1f5c3539162","indexed_by":"docs-index"}},{"content":"Curves On 2 Rails — Command-line options\n\nKeep Proportion: Maintains the proportion of the curve or adapts it to the rails.\n\nMode: Sets the way the curve will be closed.\n\nSweep: Makes the curve follow the rails or only orientate itself.\n\nThickness: Sets the thickness measurements.","metadata":{"title":"Curves On 2 Rails","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-2-rails/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/curves-on-2-rails/#command-line-options","collection":"docs7","hash":"ec47c76d912045d2eb2d79230f108b11","indexed_by":"docs-index"}},{"content":"Cutting Plane — CuttingPlane\n\nThe CutPlane command creates planar surfaces through objects at designated locations.\n\nSteps\n1. Select the objects that the cutting planes will pass through and press Enter.\n2. Pick the start of a line that defines the cutting plane.\n3. Pick the end of a line that defines the cutting plane.\\ \\ The prompts repeat to make several cut planes. press Enter to stop making cut planes.\\ This command creates planes perpendicular to the current construction planes.\\ These planes pass through the selected objects and are large enough to intersect all of the objects.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cutting Plane","section":"CuttingPlane","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/cutting-plane/#cuttingplane","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/cutting-plane/#cuttingplane","collection":"docs7","hash":"1eb2f191ede17d9918c3f30fb4155749","indexed_by":"docs-index"}},{"content":"Divide Surface Along Creases — Divide Surface Along Creases\n\nThe DivideAlongCreases command creates a polysurface by dividing a surface into separate parts at kinks or tangents.\n\nCreased surfaces are divided into smooth pieces joined in a polysurface. Creased surfaces within a polysurface are divided and joined within that polysurface.\n\nCommand-line options\nSplitAtTangents: Divides surfaces at tangent locations.\n\nSplitAtKinks: Divides surfaces at kinks\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Divide Surface Along Creases","section":"Divide Surface Along Creases","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/divide-surface-along-creases/#divide-surface-along-creases","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/divide-surface-along-creases/#divide-surface-along-creases","collection":"docs7","hash":"62ea81d0fe0f03d427435a948458f01f","indexed_by":"docs-index"}},{"content":"Drape — Drape\n\nThe Drape command creates a surface through points defined at the intersection of objects and points projected toward the construction plane in the current viewport.\n\nSteps\n* Drag a rectangle over the objects.\\ A surface is created that drapes over the objects.\n\nNotes\n* Drape works over meshes or meshable objects (surfaces, polysurfaces, etc.). Non-meshable objects (curves, annotations, clipping planes, etc.) will be ignored.\n* Drape samples locations in the render depth buffer (z buffer) and then uses them for the surface control point locations. Because of this, the surface will always sag more than the original.\n* The Drape command uses the deepest point in the view for the base level of the drape surface. It only sees mesh or render mesh objects.","metadata":{"title":"Drape","section":"Drape","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/drape/#drape","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/drape/#drape","collection":"docs7","hash":"1acdea23e2bc9fafe6a3ac5b8154c9ff","indexed_by":"docs-index"}},{"content":"Drape — Command-line options\n\nAutoSpacing\n\n* Yes: All points within the draped surface are evenly-spaced at a distance set by the Spacing option. The lower the number, the more dense the surface will be.\n* Spacing: Sets the control point spacing.\n* No: Controls custom spacing for the points.\n* U/V: Sets the number of control points in the surface in the u and v directions.\n\nAutoDetectMaxDepth\n\n* Yes: Stops the draped surface at what is automatically determined to be the farthest visible point within the rectangle.\n* No: Controls the custom depth setting.\n* MaxDepth: Sets the maximum depth the draped surface. This can be farther away from (1.0) and/or closer to the camera (0.0), providing complete or partial coverage of an object.\n\n*\n\nTo watch the video example and for more information about DrapePt** , please refer to the Rhino documentation.","metadata":{"title":"Drape","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/drape/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/drape/#command-line-options","collection":"docs7","hash":"48a2c8dfcf4bf6d9bed9ed2976713363","indexed_by":"docs-index"}},{"content":"Edges — Edges\n\nThe EdgeSrf command creates a surface from two, three, or four selected curves.\n\nSteps\nSelect the curves, and press Enter.\n\nFor more information, please refer to the Rhino documentation.\n\nTips\n* You can use surface edges as the curves for a new surface.\n* For a surface from closed planar curves, use the PlanarSrf command.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Edges","section":"Edges","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/edges/#edges","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/edges/#edges","collection":"docs7","hash":"9cac879fc6b76c3ebee8b3ca4dd2ccf6","indexed_by":"docs-index"}},{"content":"Extrude Curve Along Curve — Extrude Curve Along Curve\n\nThe ExtrudeCrvAlongCrv command creates a surface by tracing the path of a curve along another path curve.\n\nSteps\n1. Select a curve.\n2. Select the path curve.\n\nCommand-line options\nOutput\n\n* Surface: Create a surface object.\n* SubD: Create a SubD object.\n\nSolid: If the profile curve is closed and planar, both ends of the extrude objects are filled with planar surfaces and joined to make a closed polysurface.\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nSubCurve: Extrudes a curve the distance specified by picking two points along a curve. The extruded surface starts from the beginning of the curve, not the first picked point. Picking the points only establishes the extrusion distance.\n\nSteps\n\n1. Select the path curve.\n2. Pick a start along the path curve.\n3. Pick an end along the path curve.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extrude Curve Along Curve","section":"Extrude Curve Along Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-along-curve/#extrude-curve-along-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-along-curve/#extrude-curve-along-curve","collection":"docs7","hash":"b3f98dcb2024a9d3e8d4f6f4a2cb69aa","indexed_by":"docs-index"}},{"content":"Extrude curve tapered — Extrude Curve Tapered\n\nThe ExtrudeCrvTapered command creates a surface by tracing the path of a curve in a straight line tapering in or out at a specified draft angle.\n\nSteps\n1. Select a curve.\n2. Specify a distance.\n\nCommand-line options\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extrusion distance.\n\nDirection: Two points establish the direction angle\n\n1. Pick a base point.\n2. Pick a second point that establishes the direction angle.\n\nDraftAngle: Specify the draft angle for the taper. The draft angle depends on the construction plane orientation. When the surface is vertical/perpendicular to the construction plane, the draft angle is zero. When the surface is parallel to the construction plane, the draft angle is 90 degrees.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded objects are filled with planar surfaces and joined to maje a closed polysurface.\n\nCorners: Specifies how corner continuity is handled.\n\n* Sharp: The corners of the tapered surfaces will extend to meet at sharp corners with position (G0) continuity.\n* Round: The corners of the tapered surfaces will be filled with filleted segments with tangent (G1) continuity.\n* Smooth: The corners of the tapered surfaces will be filled with blend segments with curvature (G2).\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nFlipAngle: Toggles the draft angle direction.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extrude curve tapered","section":"Extrude Curve Tapered","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-tapered/#extrude-curve-tapered","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-tapered/#extrude-curve-tapered","collection":"docs7","hash":"5299d9e3e62d3472eb351c5c638c5d47","indexed_by":"docs-index"}},{"content":"Extrude Curve to Point — Extrude Curve to Point\n\nThe ExtrudeCrvToPoint command creates a surface by tracing the path of a curve tapering to converge at a selected point.\n\nSteps\n1. Select a curve.\n2. Pick the point to extrude to.\n\nCommand-line options\nOutput\n\n* Surface: Create a surface object.\n* SubD: Create a SubD object.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extrude Curve to Point","section":"Extrude Curve to Point","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-to-point/#extrude-curve-to-point","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve-to-point/#extrude-curve-to-point","collection":"docs7","hash":"5f97abaab1a04edeb2634801a6de2799","indexed_by":"docs-index"}},{"content":"Extrude Curve — Extrude Curve\n\nThe ExtrudeCrv command creates a surface by tracing the path of a curve in a straight line.\n\nSteps\n1. Select a curve.\n2. Specify a distance.\n\nCommand-line options\nOutput\n\n* Surface: Create an extrusion or a surface object.\n* SubD: Create a SubD object.\n\nDirection: Pick two points to define the extruding direction.\n\nBothSides: Extrude towards the both sides of the input curve.\n\nSolid: If the profile curve is closed and planar, both ends of the extruded object are filled with planar surfaces and joined to make a closed polysurface.\n\nToBoundary: Extrude the object to a boundary surface.\n\nDeleteInput: Specify if the input object will be deleted.\n\nSplitAtTangents\n\n* Yes: Tangent points on the input curve extrude as joined edges.\n\n* No: Tangent points on the input curve extrude as surface kinks.\n\nSetBasePoint: Specify a location that serves as the first point when picking two points that et the extrusion distance.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extrude Curve","section":"Extrude Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve/#extrude-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/extrude-curve/#extrude-curve","collection":"docs7","hash":"169b97d202ab11d510833d4a257baac1","indexed_by":"docs-index"}},{"content":"Normal to Surface — Normal to Surface\n\nThe Fin command extrudes a curve on a surface in the surface normal direction or tangent to the surface.\n\nSteps\n1. Select a curve on the surface.\n2. Select the surface.\n3. Pick location to set another height, or press Enter if the surface should be uniform in height.\n\nCommand-line options\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extrusion distance.\n\nDirection\n\n* Normal: Creates the surface in the surface normal direction. (Left)\n* Tangent: Creates the surface tangent to the surface. (Right)\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Normal to Surface","section":"Normal to Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/normal-to-surface/#normal-to-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/normal-to-surface/#normal-to-surface","collection":"docs7","hash":"a774ffa71fc6e0edfa8227f5971a7534","indexed_by":"docs-index"}},{"content":"Ribbon — Ribbon\n\nThe Ribbon command Offsets a curve and creates a ruled surface between the two curves.\n\nSteps\n1. Select a curve.\n2. Drag the cursor to one side of the curve and pick.\n\nCommand-line options\nDistance: Sets the offset distance.\n\nLoose: The Corner and Tolerance options are not shown and do not affect the output. Polycurves are offset as a group of separate curve segments, and there is no corner trimming or filling.\n\nCorner: Specifies how corners are handled when they are offset to the \"convex\" side as pointed out in the image.\n\n* Sharp: Curves offset to the outside of a corner will be extended to meet at sharp corners with position (G0) continuity.\n\n* Round: Curves offset to the outside of a corner will be filled with arc segments with tangent (G1) continuity.\n\n* Smooth: Curves offset to the outside of a corner will be filled with blend segments with curvature (G2) continuity.\n\n* Chamfer: The corners of the offset curves will be filled with a straight line between their endpoints.\n\nThroughPoint: Offset through a picked point instead of at a distance.\n\nTolerance: Sets the tolerance for the offset curve. Type 0 to use the default system tolerance.\n\nBothSides: Offsets the curve on both sides of the input curve.\n\nInCPlane: The curve is offset in the plane of the original curve. This option offsets the curve in the plane of the current construction plane instead.\n\nOutputLayer\n\n* Current: Place the results on the current layer.\n* Input: Place the results on the same layer as the input objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Ribbon","section":"Ribbon","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/ribbon/#ribbon","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/extrude/ribbon/#ribbon","collection":"docs7","hash":"fdfc82c8d9cfabe438acc7b9079e1bb2","indexed_by":"docs-index"}},{"content":"Chamfer — Chamfer\n\nThe ChamferSrf command creates a ruled surface as a bevel between two input surface edges.\n\nSteps\n1. Select the first surface.\n\nClick the surface at the side you want to keep after chamfering.\n\n2. Select the second surface.\n\nClick the surface at the side you want to keep after chamfering.\n\nCommand-line options\nDistances: The distance from the intersection of the surfaces to the edge of the chamfer.\n\nExtend: When one input surface is longer than the other, the chamfer surface is extended on the longer edge.\n\nTrim\n\n* Yes: Trims the original surfaces to the intersections with the resulting surface.\n* No: Does not trim. Uses the output surface to trim the input surfaces when possible. History is supported when the Trim=No.\n* Split: Splits the original surfaces at the resulting surface edges.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Chamfer","section":"Chamfer","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/chamfer/#chamfer","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/chamfer/#chamfer","collection":"docs7","hash":"592879a1b8f0bfc1df6a09217634354a","indexed_by":"docs-index"}},{"content":"Connect — Connect\n\nThe ConnectSrf command extends or trims two surfaces to where they intersect.\n\nSteps\n* Pick two surfaces near the edge to extend (blue area), or at the side to keep (red area) if the surface will be trimmed.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Connect","section":"Connect","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/connect/#connect","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/connect/#connect","collection":"docs7","hash":"3a4227d1f925d1b4cd360a32720370e5","indexed_by":"docs-index"}},{"content":"Extend — Extend\n\nThe ExtendSrf command moves a surface edge to lengthen a surface.\n\nIf the surface edges is trimmed, a preview of the extension displays.\n\nSteps\n1. Select a trimmed or untrimmed surface edge.\\ If an untrimmed edge or an isocurve trimmed edge is picked, the extending path displays from the picking point.\n\n2. Specify a distance.","metadata":{"title":"Extend","section":"Extend","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/extend/#extend","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/extend/#extend","collection":"docs7","hash":"1f1bdb1e00faead93b9fc3ac07356203","indexed_by":"docs-index"}},{"content":"Extend — Command-line options\n\nType\n\n* Smooth: Extends the surface smoothly curving from the edge.\n* Line: Extends the surface in a straight line from the edge.\n\nSetBasePoint: Specify a location that serves as the first point when picking two points that set the extension distance.\n\nMerge\n\n* Yes: The extension will be merged with the original surface.\n* No: The extension will be created as a separate surface.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Extend","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/extend/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/extend/#command-line-options","collection":"docs7","hash":"9fde5d8a883382c937568ba65ee1e338","indexed_by":"docs-index"}},{"content":"Fillet Surface to Curve — Fillet Surface to Curve\n\nThe FilletSrfCrv command creates a fillet surface between a surface and a curve.\n\nSteps\n1. Select a surface.\n\nThe picking location decides the side to create the surface.\n2. Select a curve near the surface.\n\nOptions\nRadius: Move the slider to change the radius, or double-click on the slider to enter a value.\n\nRange: Click a number button to change the range of the slider for smaller or larger adjustment.\n\nBlend Type\n\n* Arc: Creates a fillet surface with arc sections and tangent (G1) to the input surfaces.\n\n* Deformable: Add more control points to the fillet sections for adjusting tangency and bulge.\n\n* Deformable degree: Sets the degree of fillet sections from 3 to 5.\n* Tangent: Moves the second points on both ends in the tangent direction.\n* Bulge (For degree 4 and 5): Moves the point(s) in the middle to make the fillet sections sharper or flatter.\n* G2 Blend: Creates a blend surface connecting to the input surfaces with curvature (G2) continuity.\n\nTrim: Uses the output surface to trim the input surfaces when possible. History is supported when the Trim checkbox is disabled.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Fillet Surface to Curve","section":"Fillet Surface to Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface-to-curve/#fillet-surface-to-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface-to-curve/#fillet-surface-to-curve","collection":"docs7","hash":"b45cac7aa6fa1229a88ee8e70a2c1e1b","indexed_by":"docs-index"}},{"content":"Fillet Surface to Rail Curve — Fillet Surface to Rail Curve\n\nThe FilletSrfToRail command creates a surface blending between a surface and a curve referencing the curvature of another surface.\n\nSteps\n1. Select a curve.\n2. Select the surface near the curve.\n3. Select another surface.\n\nOptions\nBlend Type\n\n* Arc: Creates a fillet surface with arc sections and tangent (G1) to the input surfaces.\n\n* Deformable: Add more control points to the filet sections for adjusting tangency and bulge.\n\n* Deformable degree: Sets the degree of fillet sections from 3 to 5.\n* Tangent: Moves the second points on both ends in the tangent direction.\n* Bulge (For degree 4 and 5): Moves the point(s) in the middle to make the fillet sections sharper or flattrer.\n* G2 Blend: Creates a blend surface connecting to the input surfaces with curvature (G2) continuity.\n\n* Trim: Uses the output surface to trim the input surfaces when possible. History is supported when the Trim checkbox is disabled.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Fillet Surface to Rail Curve","section":"Fillet Surface to Rail Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface-to-rail-curve/#fillet-surface-to-rail-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface-to-rail-curve/#fillet-surface-to-rail-curve","collection":"docs7","hash":"24e22f5ef7a278773469d6dfdb1a77dd","indexed_by":"docs-index"}},{"content":"Fillet Surface — Fillet Surface\n\nThe FilletSrf command creates a constant-radius round surface between two surfaces.\n\nSteps\n1. Select the first surface.\n\nClick the surface at the side you want to keep after filleting.\n2. Select second surface.\n\nClick the surface at the side you want to keep after filleting.\n\nCommand-line options\nRadius: Sets the radius of the fillet surface. It will be the initial value of the Radius slider in the options dialog.","metadata":{"title":"Fillet Surface","section":"Fillet Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface/#fillet-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface/#fillet-surface","collection":"docs7","hash":"0452627fd44c1eccccd89feca12fba37","indexed_by":"docs-index"}},{"content":"Fillet Surface — Options\n\nRadius: Move the slider to change the radius, or double-click on the slider to enter a value.\n\nRange: Click a number button to change the range of the slider for smaller or larger adjustment.\n\nBlend Type\n\n* Arc Creates a fillet surface with arc sections and tangent (G1) to the input surfaces.\n\n* Deformable: Adds more control points to the fillet sections for adjusting tangency and bulge.\n\n* Deformable degree: Sets the degree of fillet sections from 3 to 5\n* Tangent: Moves the second points on both ends in the tangent direction.\n* Bulge (For degree 4 and 5): Moves the point(s) in the middle to make the fillet sections sharper or flatter.\n* G2 Blend: Creates a blend surface connecting to the input surfaces with curvature (G2) continuity.\n\nTrim: Uses the output surface to trim the input surfaces when possible. History is supported when the Trim checkbox is disabled.\n\nExtend: When one input surface is longer than the other, the fillet surface is extended on the longer edge.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Fillet Surface","section":"Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface/#options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-surface/#options","collection":"docs7","hash":"9f0f62544fd71cf664385aa56fda6088","indexed_by":"docs-index"}},{"content":"Fillet Variable — Fillet Variable\n\nThe VariableFilletSrf command creates a round tangent surface between edges of intersecting surfaces with varying radius values.\n\nSteps\n1. Select two intersecting surfaces for variable fillet on the surfaces near the edge that will be filleted.\\ Surfaces must intersect.\\ Handles will appear on surface edges.\n2. Infinite Plane: Type IP for InfinitePlane options.\n3. Press Enter to use the default radii.\\ Or\\ Type a new radius distance any time the Radius option displays on the command line.\n4. Specify a command line option.\\ Or\\ Select a handle to edit.\\ Moving a handle at the end of the edge will cause the fillet to extend beyond the surface. This will have to be trimmed by other means.\n\nThe Radius and Distance options appear on the command line when you drag a handle grip.","metadata":{"title":"Fillet Variable","section":"Fillet Variable","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#fillet-variable","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#fillet-variable","collection":"docs7","hash":"7ff49e65385b1d2e744094ac97dfa8fe","indexed_by":"docs-index"}},{"content":"Fillet Variable — Radius/Distance options\n\nFromCurve: Select a curve. The radius of the curve at the picked location will be used.\n\nFromTwoPoints: Pick two points to show the radius distance.\n\nHandle options\nAddHandle: Adds a handle along the edges.\n\nCopyHandle: Adds a new handle using the distance from the selected handle.\n\nRemoveHandle: Visible only when at least one handle has been added.\n\nSetAll: Sets the distance or radius for all handles.\n\nLinkHandles: Editing a single handle updates all handles","metadata":{"title":"Fillet Variable","section":"Radius/Distance options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#radiusdistance-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#radiusdistance-options","collection":"docs7","hash":"31b63ed3a66ed258e16d3a47810d49ba","indexed_by":"docs-index"}},{"content":"Fillet Variable — RailType options\n\nDistFromEdge: The distance from the edge curves determines the intersection.\n\nRollingBall: The radius of a rolling ball determines the intersection.\n\nDistBetweenRails: The distance between the edge rails determines the intersection.\n\nTrimAndJoin: Trims and joins the resulting surface to the input surfaces. History only works if TrimAndJoint=No.\n\nPreview: Displays a dynamic preview. You can change the options and the previese will update.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Fillet Variable","section":"RailType options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#railtype-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/fillet-variable/#railtype-options","collection":"docs7","hash":"7021ec5b56d88ddb93c28bf216efe907","indexed_by":"docs-index"}},{"content":"Match — Match\n\nThe MatchSrf command adjusts the edge of a surface to have position, tangent, or curvature continuity with another surface.\n\nSteps\n\n1. Select an untrimmed surface edge.\n2. Select a surface edge or curve to match.\\ Pick the two surfaces near same ends. This surface can be either trimmed or untrimmed.\n3. Choose options.","metadata":{"title":"Match","section":"Match","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match","collection":"docs7","hash":"e896e0f3aa1f897c4021cb244d32bf21","indexed_by":"docs-index"}},{"content":"Match — Command-line options\n\nMultipleMatches: Allows selection of more than one edge to match.\n\nOnSurface: When the OnSurface option is on, you can select a curve that is on or near a surface as the target, and then a surface to match to at that curve. The curve is pulled to the surface.\n\nChainEdges: Selects surface edges that are touching the selected curve.\n\nSubCrv: Type subcrv to select part of a curve as input.","metadata":{"title":"Match","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#command-line-options","collection":"docs7","hash":"63af0faa766c0c7e8b2b15e2e8d87d4e","indexed_by":"docs-index"}},{"content":"Match — Match Surface Options\n\nContinuity: Sets the continuity for the match.\n\n* Position: Location only.\n* Tangency: Position and direction.\n* Curvature: Position, direction, and radius of curvature.\n\nPreserve other end: Change the surface structure to prevent modification of the curvature at the edge opposite the match.\n\n* None: No constraint.\n* Prosition: Location only.\n* Tangency: Position and curve direction.\n* Curvature: Position, direction, and radius of curvature\n* Average surfaces: Both surfaces are modified to an intermediate shape. If the target surface is also untrimmed, the surfaces match by averaging the two.\n* Match edges by closest points: Align the surface being changed to the target edge in two ways => Stretches or compresses the surface to match the entire edge end to end, or pulls each point object on the edge to the closest point object on the other edge.\n* Refine match: Determines if the match results should be tested for accuracy and refined so the faces match within tolerance. If necessary, Rhino adds knot lines to the modified surface or surfaces until the surfaces are within tolerance.\n* Distance \\_\\_ units: Position matching in model units.\n* Tangency \\_\\_ degrees: Tangency matching.\n* Curvature \\_\\_ percent: Curvature matching, in percent of the radius of curvature.\n* Flip (OnSurface Only): Changes the direction of the surface.\n\nIsocurve direction adjustment: Specifies the way the parameterization of the matched surfaces is determined.","metadata":{"title":"Match","section":"Match Surface Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match-surface-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match-surface-options","collection":"docs7","hash":"2117bd42ccfb6dc5c31092bfaf864236","indexed_by":"docs-index"}},{"content":"Match — Match Surface Options\n\n* Automatic: If the target edge is not trimmed, it works like the Match target isocurve direction option. If the target edge is trimmed, it works like the Make perpendicular to the target edge option.\n* Preserve isocurve direction: Does not change the existing isoparametric curves directions.\n* Match target isocurve direction: The isoparametric curves of the surface will be parallel to those of the target surface.\n* Make perpendicular to target edge: The isoparametric curves of the surface will be perpendicular to the target surface edge.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Match","section":"Match Surface Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match-surface-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/match/#match-surface-options","collection":"docs7","hash":"10b892fe0d516629dc3b45d90746f680","indexed_by":"docs-index"}},{"content":"Merge — Merge\n\nThe MergeSrf command combines two surfaces into one surface at untrimmed edges.\n\nSteps\n* Select two surfaces.\\ Both surfaces must be untrimmed and share an edge.\n\nCommand-line options\nSmooth: The resulting surface will be smooth. This makes the surface behave better for control point editing, but may alter the shape of both surfaces.\n\nTolerance: Surface edges must be within this tolerance for the two surfaces to merge. The Tolerance setting defaults to the Rhino global absolute toleranmce. Zero or a value less than the absolute tolerance is not acceptable.\n\nRoundness: Defines the roundness (smoothness, dullness, bluntness, non-sharpness) of the merge. The default is 1 (full smoothing). Acceptable values are between 0 (sharp) and 1 (smooth).\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Merge","section":"Merge","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/merge/#merge","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/merge/#merge","collection":"docs7","hash":"66d2640453e01119ac4bf4b3dcba7de2","indexed_by":"docs-index"}},{"content":"Offset — Offset\n\nThe OffsetSrf command copies a surface or polysurface so that locations on the copied surface are the same specified distance from the original surface.\n\nSteps\n1. Select a surface or polysurface.\n2. Infinite Plane: Type IP for InfinitePlane options.\n3. Type the offset distance, and press Enter.\n\nCommand-line options\nDistance: Sets the offset distance.\n\nCorner: Specifies how offset corner continuity handled. These options only apply if the offset direction is to the \"outside\" as shown in the image.\n\n* Sharp: Curves offset to the outside of a corner will be extended to meet at sharp corners with position (G0) continuity.\n\n* Round: Curves offset to the outside of a corner will be filled with arc segments with tangent (G1) continuity.\n\nThroughPoint: Offsets through a picked point instead of at a distance.\n\nFlipAll: Flips the offset direction of all selected surfaces. Arrows indicate the positive offset direction.\n\nSolid: Makes a closed solid from the input and offset surfaces by lofting a ruled surface between all of the matching edges.\n\nLoose (Surfaces only): The control point structure of the offset surface is identical to the original surface.\n\nTolerance: Sets the tolerance for the offset surface. Type 0 to use the default tolerance.\n\nBothSides: Draws the offset on both sides of the original.\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Offset","section":"Offset","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/offset/#offset","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/offset/#offset","collection":"docs7","hash":"8c16191a7cf0d87bf8b433e5e3e53ae5","indexed_by":"docs-index"}},{"content":"Variable Chamfer — Variable Chamfer\n\nThe VariableChamferSrf command creates a chamfer surface between edges of intersecting surfaces with varying distance values, trims the original surfaces faces, and joins the resulting surfaces.\n\nSteps\n1. Select two intersecting surfaces for variable radius chamfer on the surfaces near the edge that will be chamfered.\\ Surfaces must intersect.\\ Handles will appear on surface edges.\n2. Infinite Plane: Type IP for InfinitePlane options.\n3. Press Enter to use the default distances.\\ Or\\ Type a new distance any time the ChamferDistance option displays on the command line.\n4. Specify a command line option.\\ Or\\ Select a handle to edit.","metadata":{"title":"Variable Chamfer","section":"Variable Chamfer","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#variable-chamfer","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#variable-chamfer","collection":"docs7","hash":"fb59399ed7ab1a25d90d97e52b7e8979","indexed_by":"docs-index"}},{"content":"Variable Chamfer — Radius/Distance options\n\nFromCurve: Select a curve. The radius of the curve at the picked location will be used.\n\nFromTwoPoints: Pick two points to show the radius distance.\n\nHandle options\nAddHandle: Adds a handle along the edges.\n\nCopyHandle: Adds a new handle using the distance from the selected handle.\n\nRemoveHandle: Visible only when at least one handle has been added.\n\nSetAll: Sets the distance or radius for all handles.\n\nLinkHandles: Editing a single handle updates all handles.","metadata":{"title":"Variable Chamfer","section":"Radius/Distance options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#radiusdistance-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#radiusdistance-options","collection":"docs7","hash":"4ab367be492703e880b00dce930621d1","indexed_by":"docs-index"}},{"content":"Variable Chamfer — RailType options\n\nDistFromEdge: The distance from the edge curves determines the intersection.\n\nRollingBall: The radius of a rolling ball determines the intersection.\n\nDistBetweenRails: The distance between the edge rails determines the intersection.\n\nTrimAndJoin: Trims and joins the resulting surface to the input surfaces. History only works if TrimAndJoin=No.\n\nPreview: Displays a dynamic preview. You can change the options and the preview will update.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Variable Chamfer","section":"RailType options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#railtype-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-chamfer/#railtype-options","collection":"docs7","hash":"31011dd146d7bcc0a8d7d635efdfac26","indexed_by":"docs-index"}},{"content":"Variable Offset — Variable Offset\n\nThe VariableOffsetSrf command copies a surface in the normal direction with different distances at specified locations.\n\nSteps\n1. Select a surface.\n2. Click the AddHandle option to add more handles on the surface.\n3. Move handle points to adjust the offset distance.\n\nCommand-line options\nTolerance: Sets the tolerance for the command.\n\nFlip: Reverses the direction.\n\nSetAll: Sets all distances to the same value.\n\nLinkHandles: When editing the offset distance of a handle, all the other handles increase or decrease with the same ratio.\n\nAddHandle: Adds adjusting handle by picking locations on the surface\n\nSideTangency: Maintains the tangency direction of the original surface at an edge.\n\nSolid: Makes a closed solid from the input and offset surfaces by adding the side surfaces.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Variable Offset","section":"Variable Offset","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-offset/#variable-offset","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fillet/variable-offset/#variable-offset","collection":"docs7","hash":"89e4bdd5750e3a13c592b1688a9e3b54","indexed_by":"docs-index"}},{"content":"Fit Plane Through Points — Fit Plane Through Points\n\nThe PlaneThroughPt command fits a rectangular planar surface through point objects, control points, mesh vertices, or a point cloud.\n\nSteps\n* Select three or more point objects, control points, mesh vertices, or a point cloud.\n\nTo watch the video example, please refer to the Rhino documentation.","metadata":{"title":"Fit Plane Through Points","section":"Fit Plane Through Points","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/fit-plane-through-points/#fit-plane-through-points","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/fit-plane-through-points/#fit-plane-through-points","collection":"docs7","hash":"366d8e30e82d47430786c6b8180f0e6b","indexed_by":"docs-index"}},{"content":"Flatten Surface — Flatten Surface\n\nThe FlattenSrf command flattens surface edges onto the construction plane to create planar curves.\n\nSteps\n\n1. Select a surface edge.\n2. Select another edge.\\ Type a number for the sample point spacing.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Flatten Surface","section":"Flatten Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/flatten-surface/#flatten-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/flatten-surface/#flatten-surface","collection":"docs7","hash":"f314673c0e9a87a58bac0f52328e6452","indexed_by":"docs-index"}},{"content":"From Planar curves — From Planar curves\n\nThe PlanarSrf command creates a planar surface from a set of planar curves that define the surface edges.\n\nSteps\n* Select planar curves that are all in the same plane.\n\nTo watch the video example, please refer to the Rhino documentation.\n\nTips\n* If the curves partially overlap, each curve produces a separate surface.\n* If a curve is wholly within another curve, it will be treated as a hole boundary.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"From Planar curves","section":"From Planar curves","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/from-planar-curves/#from-planar-curves","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/from-planar-curves/#from-planar-curves","collection":"docs7","hash":"b72961a944a169cf400d1ec3e700d266","indexed_by":"docs-index"}},{"content":"Heightfield — Heightfield\n\nThe Heightfield command creates a NURBS surface or mesh based on grayscale values of the pixels in an image file.\n\nSteps\n1. Select an image file.\n2. Pick the first corner.\\ The base of the surface will be parallel to the current construction plane.\n3. Pick the second corner or type a length.\\ The shape of the pick rectangle will match the aspect ratio of the image file.\n4. Specify options.\n\n*","metadata":{"title":"Heightfield","section":"Heightfield","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/heightfield/#heightfield","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/heightfield/#heightfield","collection":"docs7","hash":"887f27391469dbcfe1884889912f44d5","indexed_by":"docs-index"}},{"content":"Heightfield — Heightfield Options\n\nNumber of sample points \\_\\_\\_ x \\_\\_\\_\\ The image's \"height\" is sampled at the specified number of control points along the u and v directions of the image.\n\nSample count is \\_\\_\\_ of 10000 (surface only)\\ Height \\_\\_\\_ \\ \\ Sets the scale of the height of the object.\n\nSet image as texture\\ Uses the image as a render texture for the created object.\n\nCreate vertex colors (mesh only)\\ Evaluates the color of the texture at each texture coordinate (u,v) and sets the vertex color to match.\n\nCreate object by\n\n&#x20; Mesh with vertexes at sample locations\\ &#x20; Creates a mesh with vertex points at each of the sample locations.\n\n&#x20; Surface with control points at sample location\\ &#x20; Creates a surface with control points at each of the sample locations.\n\n&#x20; Interpolate surface through samples\\ &#x20; Creates a surface that passes through each sample location's height.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Heightfield","section":"Heightfield Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/heightfield/#heightfield-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/heightfield/#heightfield-options","collection":"docs7","hash":"b85815a946efe7fde373b86cdee057d6","indexed_by":"docs-index"}},{"content":"Loft — Loft\n\nThe Loft command fits a surface through selected profile curves that define the surface shape.\n\nSteps\n* Select the curves in the order in which the surface should pass through them.\n* Select open curves near the same ends. For closed curves, adjust the curve seams.\n\nAdjust seam options (Closed curves only)\nFlip\\ Reverses the curve direction.\n\nAutomatic\\ Attempts to align the seam points and directions without intervention.\n\nNatural\\ Moves the seam points to the way they were at the beginning of the command.\n\nSnapToKnots\n\n* Yes: The seam points are always at the knots. You can only move them among the knots.\n* No: The seam points may leave the knots. You can move them without restriction.\n\n*","metadata":{"title":"Loft","section":"Loft","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#loft","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#loft","collection":"docs7","hash":"d9b28ef2bfdb2c34c7f220a9e99376c8","indexed_by":"docs-index"}},{"content":"Loft — To adjust seams\n\n1. Select each seam point and move it along the curve to line up all curve seams.\n2. Use the Flip option to make all seam arrows point to the same side.\\ Click here to watch the video example.\n3. Press Enter to continue.\n\nCommand-line option\nPoint**: Allows picking a location for the start or end of the loft at a point. This tapers the loft to the selected point. No point object is necessary, but it is a good idea to have some reference geometry in place to aid in picking the point location.\n\n* Point steps\n* 1.At the start or the end of the loft, click the Point option.\n* 2.Pick a location for the start or end location.\n\nSubCrv: Type subcrv to select part of a curve as input.","metadata":{"title":"Loft","section":"To adjust seams","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#to-adjust-seams","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#to-adjust-seams","collection":"docs7","hash":"868d7b106dcc0de8f385a61573d6154c","indexed_by":"docs-index"}},{"content":"Loft — Loft Options\n\nStyle: Determines the knot and control point structure of the surface. When some, but not all, endpoints of loft shapes touch, the loft type is restricted to Straight sections to avoid self-intersecting loops in the resulting surfaces.\n\n* Loose: The surface control points are created at the same locations as the contreol points of the original. This is a good option if the control points will be edited later.\n* Normal: The surface has an average amount of strtching between the curves. This is a good choice when the curves are proceeding in a relatively straight path or there is a lot of space between the curves.\n* Straight sections: Creates a ruled surface. The sections between the curves are straight.\n* Tight: The surface closely follows the original. This is a good choice when the input curves are going around a corner.\n* Uniform: Makes the object knot vectors uniform.\n\nClosed loft: Creates a closed surface, continuing the surface past the last curve and around to the first curve. Available when you have selected three shape curves.\n\nMatch start tangent: If the start curve is a surface edge, the lofted surface maintains tangency with the adjacent surface. You must use at least three curves to activate this option.\n\nMatch end tangent: If the end curve is a surface edge, maintains tangency with the adjacent surface. You must use at least three curves to activate this option.\n\nSplitAtTangents: If checked, the loft creates a single surface. If unchecked, the loft creates a polysurface when the input curves are joined tangent curves. Faces in the resulting polysurface correspond to the tangent sub-curves in the input curves.","metadata":{"title":"Loft","section":"Loft Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#loft-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#loft-options","collection":"docs7","hash":"00151f3330ac41abf2c5b0d14c641859","indexed_by":"docs-index"}},{"content":"Loft — Cross-section curve options\n\nAlign Curves: Click the end of a shape curve to reverse the direction.\n\n\\ Do not simplify (A): Curves will not be rebuilt.\n\nRebuild with \\_\\_\\_ control points (B): Rebuilds the shape curves before lofting.\n\nRefit within \\_\\_\\_ \\ (C): Refits the shape curves to the specified tolerance value.\n\nTo watch the video examples and for more information about Loft Options and DevLoft, please refer to the Rhino documentation.","metadata":{"title":"Loft","section":"Cross-section curve options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#cross-section-curve-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/loft/#cross-section-curve-options","collection":"docs7","hash":"a73a09dd3c941a51a787b1ec5e597c03","indexed_by":"docs-index"}},{"content":"Network — Network\n\nThe NetworkSrf command creates a surface from a network of crossing curves.\n\n* All curves in one direction must cross all curves in the other direction and cannot cross each other.\n* The command always smooths out the output surfaces even if the input curves have kinks.\n\nSteps\n* Pick the curves in two directions that form a network.\n\nOr, use Windows-selection.\n\nFor more information about NetworkSrf's Command-line Options, please refer to the Rhino documentation.","metadata":{"title":"Network","section":"Network","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/network/#network","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/network/#network","collection":"docs7","hash":"48d2222421d798c772cc0ee3d8eb7f3e","indexed_by":"docs-index"}},{"content":"Patch — Patch\n\nThe Patch command fits a surface through selected curves, meshes, point objects, and point clouds.\n\nSteps\n1. Select point objects, curves, and edges to base the patch on.\\ SubCrv: Type subcrv to select part of a curve as input.\n\n2. Specify the options\n\n*","metadata":{"title":"Patch","section":"Patch","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/patch/#patch","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/patch/#patch","collection":"docs7","hash":"8970970a6337deb91d85eb597e7cc02c","indexed_by":"docs-index"}},{"content":"Patch — Patch Surface Options\n\nSample point spacing\\ The physical distance along the input curve between sample points. The minimum is eight points per curve.\n\nSurface U spans\\ The u direction span count for the automatically generated surface. This value is also used if the starting surface is a 1x1 span plane.\n\nSurface V spans\\ The v direction span count for the automatically generated surface. This value is also used if the starting surface is a 1x1 span plane.\n\nStiffness\\ Rhino builds the patch surface by first finding the best fit plane (PlaneThroughPt) through the selected and sampled points along curves. Then the surface deforms to match the points and sampled points. The Stiffness setting tells how much you allow the best fit plane to deform. The bigger the number, the \"stiffer\" and more rectangular and planar the resulting surface will be. You can test this setting with small or even very big values (>1000).\\ Click the Preview button to check the result.\n\nAdjust tangency\\ Match to the tangent direction of surfaces if the input curves are edges of existing surfaces.\n\nAutomatic trim\\ Tries to find an outside curve and trims the surface to it.\n\nFor more information about Starting surface options, please refer to the Rhino documentation.\n\n*\n\n#### Tips\n\n* Try using the Sweep2 command if the Patch command does not give good results.\n* For a trimmed patch, select curves that form a closed shape. Select them in order, so each additional curve touches one you have already selected.\n* Select additional curves to influence the shape of the patch (such as dips or peaks in the middle of the patch). These do not have to be connected.\n* The patch may not pass exactly through all of the input curves.\n* If a starting surface is selected and Delete input is checked, History is not saved.","metadata":{"title":"Patch","section":"Patch Surface Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/patch/#patch-surface-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/patch/#patch-surface-options","collection":"docs7","hash":"3cf08f5347fbefa1043dd33e10718d82","indexed_by":"docs-index"}},{"content":"Rail Revolve — Rail Revolve\n\nThe RailRevolve command creates a surface by revolving a profile curve that defines the surface shape around a rail curve that defines the surface edge.\n\nSteps\n1. Select a profile curve.\n2. Select a rail curve.\n3. Pick the start of the revolve axis.\n4. Pick the end of the revolve axis. Press Enter to use the CPlane z-axis direction.","metadata":{"title":"Rail Revolve","section":"Rail Revolve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rail-revolve/#rail-revolve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rail-revolve/#rail-revolve","collection":"docs7","hash":"f9ba00727381b6ab89bd4bc45e6f6f6e","indexed_by":"docs-index"}},{"content":"Rail Revolve — Command-line options\n\nScaleHeight: The profile curve, in addition to being revolved, stretches along the revolve axis using the revolve axis origin as the scale base point. The distance from the revolve axis origin to the path curve start point along the revolve axis is the primary reference height, and the distances from the revolve axis origin to path curve control points along the revolve axis are the secondary reference heights.\n\nYou do not need ScaleHeight option if the rail curve is planar and perpendicular to the revolve axis. In this case, the result looks exactly the same both ways. This is the way RailRevolve is normally used.\n\nUse the ScaleHeight option if the rail curve is not on a plane perpendicular to the revolve axis and you want a part of the profile curve to only revolve around the revolve axis, not to move along the revolve axis as it is revolved. This is the case if you want to build rail-revolved surfaces with smooth round ends even if the rail curve is not planar.\n\nWith the ScaleHeight option, the revolve axis origin location matters. The revolve axis origin is also the scale origin. The one-dimensional scaling happens parallel to the revolve axis.\n\nIf the rail curve is closed, the seam must be where the profile touches the rail for good results.\n\nSplitAtTangents\n\n* Yes: Creates a single surface.\n* No: Creates a polysurface when the input curves are joined tangent curves. Faces in the resulting polysurface correspond to the tangent sub-curves in the input curves.\n\nTo watch the video examples and for more information about ScaleHeight, please refer to the Rhino documentation.","metadata":{"title":"Rail Revolve","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rail-revolve/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rail-revolve/#command-line-options","collection":"docs7","hash":"ee8ede414e25106a7495dc7f5fb3ea2d","indexed_by":"docs-index"}},{"content":"Rebuild Edges — Rebuild Edges\n\nThe RebuildEdges command restores original 3-D surface edges that have been forced away from the surface through editing.\n\nThis command is useful for restoring original 3-D edges of surfaces after exploding a polysurface into separate surfaces.\n\nSteps\n\n* Select an object.\n\nExample\n\n1. Draw two planes several units apart.\n2. Force Rhino to join the surfaces with the JoinEdge command.\n3. Explode the object and then use the RebuildEdges command to restore the edges.","metadata":{"title":"Rebuild Edges","section":"Rebuild Edges","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild-edges/#rebuild-edges","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild-edges/#rebuild-edges","collection":"docs7","hash":"0168a23e243a813c8678a507ac18d9af","indexed_by":"docs-index"}},{"content":"Rebuild Edges — Command-line option\n\nTolerance: Overrides the system tolerance setting.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Rebuild Edges","section":"Command-line option","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild-edges/#command-line-option","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild-edges/#command-line-option","collection":"docs7","hash":"78bd95e02b90cf088931644d1ef11d66","indexed_by":"docs-index"}},{"content":"Rebuild — Rebuild\n\nThe Rebuild command reconstructs selected curves or surfaces to a specified degree and control point number.\n\nSteps\n\n* Select the curves or surfaces.\n\nOr, press Ctrl (CMD) + Shift to select a polycurve segment.\n\nTo rebuild curves\n1. Click Preview to see what the rebuilt curves will look like.\n2. When you are satisfied with the results, click OK.","metadata":{"title":"Rebuild","section":"Rebuild","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild","collection":"docs7","hash":"d1d282b1778f4c8c0dcd34445efbb68c","indexed_by":"docs-index"}},{"content":"Rebuild — Rebuild options\n\nPoint count: Reports in parentheses the current number and sets the number of control points in the result.\n\nDegree: Reports in parentheses the current number and sets the degree of the curve. Degree in Rhino can be up to 11.\n\nPoint count and Degree values change automatically to fulfill the minimum requirement of Point count = Degree + 1. For example, when Point count=4 and Degree=3, reducing Point count also reduces Degree; increasing Degree also increases Point count. In closed curves/surfaces, the start and end points are overlapped and counted as one. They have one less point than open curves/surfaces.\n\nDelete input: Deletes the original geometry.\n\nCreate new object on current layer: Creates the new objects on the current layer. Clear this check box to place the new objects on the layer of the original curves.\n\nPreserve end tangent directions: The new curve matches the input curve end tangents if the curve is open, the degree is two or more, and the point count is four or more.\n\nMake SubD friendly: Makes the output curve compatible with SubD.\n\nWhen this option is enabled, the Degree option is disabled. The output curve can only be degree 3.\n\n* Select Master Curve:Rebuild a curve to match another curve's parameter structure. The SubD friendly state of the master curve will be ignored.\n\nThe Loft, Sweep1 and Sweep2 commands create a better surface from section curves with the same parameter structure.\n\nSpan counts: Reports in parentheses the minimum number of spans and the proposed number of spans.\n\nMaximum deviation: Reports the maximum deviation from the original curve when Preview is clicked.\n\n* Preview: Displays a preview of the output. If you change the settings, click the Preview button again to refresh the display.","metadata":{"title":"Rebuild","section":"Rebuild options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-options","collection":"docs7","hash":"0ba6da9546d15ea7bbda6939362f340c","indexed_by":"docs-index"}},{"content":"Rebuild — Command-line options\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nTo rebuild surfaces\n1. Click Preview to see what the rebuilt surfaces will look like.\n2. When you are satisfied with the results, click OK.","metadata":{"title":"Rebuild","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#command-line-options","collection":"docs7","hash":"c366a44a006116e53d027b92bed8317e","indexed_by":"docs-index"}},{"content":"Rebuild — Rebuild Surface Options\n\nPoint count\n\n* U: Reports in parentheses the current number and sets the number of points in the u direction.\n* V: Reports in parentheses the current number and sets the number of points in the v direction.\n\nDegree\n\n* U: Reports in parentheses the current number and sets the degree in the u direction.\n* V: Reports in parentheses the current number and sets the degree in the v direction.\n\nPoint count and Degree values change automatically to fulfill the minimum requirement of Point count = Degree + 1. For example, when Point count=4 and Degree=3, reducing Point count also reduces Degree; increasing Degree also increases Point count. In closed curves/surfaces, the start and end points are overlapped and counted as one. They have one less point than open curves/surfaces.\n\nOptions\n\n* DeleteInput: Deletes the original geometry.\n* Current Layer: Creates the new surfaces on the current layer. Clear this checkbox to place the new surfaces on the layer of the original surfaces.\n* Retrim: Trims the rebuilt surface with the original trimming curves.\n\nSpan counts\n\n* U: Reports in parentheses the minimum number of spans and the proposed number of spans in the u direction.\n* V: Reports in parentheses the minimum number of spans and the proposed number of spans in the v direction.\n* Maximum deviation: Reports the maximum deviation from the original surface.\n* Calculate: The calculation tests how far away the new surface is at knot line intersections and half-way between knot lines. Conducts tests at knot line intersections and halfway between knot lines.","metadata":{"title":"Rebuild","section":"Rebuild Surface Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-surface-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-surface-options","collection":"docs7","hash":"7ea3c0f29e7175fbd8913840604d3190","indexed_by":"docs-index"}},{"content":"Rebuild — Rebuild Surface Options\n\nThe display color indicates how far away the new surface is from the original. Points are green if the surface is within absolute tolerance, yellow if it is between tolerance and 10 times tolerance, and red if it is farther away than that.\n* Preview: Displays a preview of the output.\n\nIf you change the settings, click the Preview button again to refresh the display.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Rebuild","section":"Rebuild Surface Options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-surface-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rebuild/#rebuild-surface-options","collection":"docs7","hash":"c790b76052049ba20c382d37fe9c466f","indexed_by":"docs-index"}},{"content":"Rectangle — Rectangle\n\nThe Plane command draws a rectangular planar NURBS surface.\n\nSteps\n* Pick two points for the opposite corners of a rectangle.\n\nOr, select one of the options to draw the rectangle in a different way.\n\n*\n\nCommand-line options\n(Default)\\ Draws the rectangle using two opposite corners.\n\n3Point\\ Draws the rectangle using two adjacent corner locations and a location on the opposite side.\n\nEdgeMidpoint\\ Draws the rectangle from the midpoint of the first edge, an end of the edge, and a location on the opposite side.\n\nVertical\\ Draws the rectangle perpendicular to the construction plane.\n\nCenter\\ Draws the rectangle from the center point and a corner.\n\nAroundCurve**\\ Draws a rectangle perpendicular to a curve.\n\n#### Steps\n\n* Select a curve and pick the center of the rectangle on the curve.\n\n*","metadata":{"title":"Rectangle","section":"Rectangle","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rectangle/#rectangle","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rectangle/#rectangle","collection":"docs7","hash":"483540cb7bdfbc26d11c762b6a662720","indexed_by":"docs-index"}},{"content":"Rectangle — Deformable\n\nSets the degree in the u and v directions and the point count in the u and v directions.\n\nUDegree/VDegree\\ Sets the degree of the surface in the u and v directions.\n\nUPointCount/VPointCount**\\ The number of control points in the u and v directions.\n\nTo watch the video example, please refer to the Rhino documentation).","metadata":{"title":"Rectangle","section":"Deformable","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/rectangle/#deformable","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/rectangle/#deformable","collection":"docs7","hash":"c2b6640880fa7d90063248979a7719f2","indexed_by":"docs-index"}},{"content":"Refit Surface to Tolerance — Refit Surface to Tolerance\n\nThe FitSrf command tries to reduce the number of surface control points while maintaining the surface's same general shape.\n\nSteps\n\n1. Select surfaces.\n2. Type a new tolerance value or press Enter to accept the default.\n3. Type 0 (zero) to use the current absolute tolerance.\n\nCommand-line options\nDeleteInput\n\n* Yes: Deletes the original geometry.\n* No: Retains the original geometry.\n\nReTrim: Trims the new fit surface with the original trimming curves.\n\nUDegree/VDegree: The degree of the surface in the u or v direction\n\nOutputLayer: Specifies the layer for the results of the command.\n\n* Current: Places the results on the current layer.\n* Input: Places the results on the same layer as the input curve.\n* TargetObject: Places the results on the same layer as the target surface.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Refit Surface to Tolerance","section":"Refit Surface to Tolerance","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/refit-surface-to-tolerance/#refit-surface-to-tolerance","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/refit-surface-to-tolerance/#refit-surface-to-tolerance","collection":"docs7","hash":"71f45a0c5e96b55e442f2f7cfacdd0e4","indexed_by":"docs-index"}},{"content":"Revolve — Revolve\n\nThe Revolve command creates a surface or SubD by revolving a profile curve that defines the surface shape around an axis.\n\nSteps\n1. Select curves.\n2. Pick the start of the revolve axis.\n3. Pick the end of the revolve axis, or press Enter to use CPlane-Z direction.\n\nThe start and end of the revolve axis can be attached to existing objects using object snaps when History is recorded.\n4. Specify options.","metadata":{"title":"Revolve","section":"Revolve","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/revolve/#revolve","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/revolve/#revolve","collection":"docs7","hash":"a56487c4cf7f13e9b9b1949e4e4ee7c9","indexed_by":"docs-index"}},{"content":"Revolve — Command-line options\n\nOutput (Surface/SubD)\\ Specifies to create a NURBS surface or SubD.\n\nDeleteInput\\ Deletes (Yes) or keeps (No) the input objects.\n\nFullCircle\\ Revolves the input curve 360 degrees as a shortcut for specifying 360 degrees as the revolve angle.\n\nAskForStartAngle\n\n* Yes: Allows setting the angle (a degree away from the current input curve location) the revolve will start.\n* No: Starts the revolve from 0 (the input curve location).\n\nDeformable\\ This option is only available when Output=Surface.\n\n* Yes: The surface is rebuilt in the revolving direction to a degree-3 non-rational surface. Specify how many points in that direction. Deformable revolves can be deformed smoothly with point editing.\n* No: The resulting revolved surface is an exact revolve: a rational surface with fully-multiple knots at the quadrants. This kind of surface is not easy to deform smoothly by point editing.\n\nPointCount\\ Specifies the number of control points in the revolving direction when Output=Surface and Deformable=Yes.\n\nSegmentCount\\ Specifies the number of faces in the revolving direction when Output=SubD.\n\nSplitAtTangents\\ Revolves tangent points on the input curve into joined edges (Yes) or creases (No) when Output=Surface.\n\nSplitAtTangents=Yes (left) and No (right).\n\nSubCrv\\ Type subcrv to select part of a curve as input.\n\n***\n\nTo watch the video example, please refer to the Rhino documentation.","metadata":{"title":"Revolve","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/revolve/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/revolve/#command-line-options","collection":"docs7","hash":"76c798a2af9890d6fccec794494d73a0","indexed_by":"docs-index"}},{"content":"Shrink Trimmed Surface — Shrink Trimmed Surface\n\nThe ShrinkTrimmedSrf command contracts the underlying untrimmed surface close to trimming boundaries.\n\nShrinking a surface is like extending smoothly, only backwards. knot of full multiplicity are added where you want the surface to be cut off. Then the remaining control points are thrown away.\n\nSteps\n\n1. Select trimmed surfaces.\\ Trimmed surfaces are represented by an untrimmed surface with trimming boundaries. When textures are applied to surfaces, the textures map to the underlying untrimmed surface. Sometimes the underlying untrimmed surface is much larger than the trimmed surface, resulting in only a small portion of the texture showing up in the rendering.\\ To fix this, the ShrinkTrimmedSrf command shrinks the underlying untrimmed surface in order to make it as small as possible, resulting in the maximum amount of the texture map displaying in the rendering.\\ You will see no visible change in the surface. Only the underlying untrimmed surface alters.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Shrink Trimmed Surface","section":"Shrink Trimmed Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/shrink-trimmed-surface/#shrink-trimmed-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/shrink-trimmed-surface/#shrink-trimmed-surface","collection":"docs7","hash":"d2fc2b9475d213e74535260ca1868e04","indexed_by":"docs-index"}},{"content":"Smash — Smash\n\nThe Smash command flattens a surface without restriction to single-directional curvature.\n\nSteps\n1. Select surfaces or polysurfaces.\n2. Select curves, text dots, or points on the surface.\n\nCommand-line options\nExplode\n\n* Yes: The resultiong surfaces are not joined.\n* No: The resulting surfaces are joined along the same edges that were joined in the original polysurface.\n\nLabels: Determines whether or not matching numbered dots are placed on the edges of the selected object and the resulting objects.\n\nKeepProperties: Determines whether or not the selected object's properties are copied to the resulting object.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Smash","section":"Smash","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/smash/#smash","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/smash/#smash","collection":"docs7","hash":"07c45ff62b1010f1dafb79bc3c4de4e6","indexed_by":"docs-index"}},{"content":"Split and Refit Surface — Split and Refit Surface\n\nThe SplitRefitSurface command splits a surface using a curve, and refits the two parts so that the edges from the split operation become untrimmed edges of two surfaces.\n\nSteps\n1. Select a surface.\n2. Select a splitting curve.\n\nThe curve must traverse the surface in either the U or V direction.\n\nThe command-line reports the max deviation that is also marked in the viewport.\n3. Set options.","metadata":{"title":"Split and Refit Surface","section":"Split and Refit Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/split-and-refit-surface/#split-and-refit-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/split-and-refit-surface/#split-and-refit-surface","collection":"docs7","hash":"d123601b844cae18e0d26e45e45492c7","indexed_by":"docs-index"}},{"content":"Split and Refit Surface — Command-line options\n\nCreateBeziers: Splits the new surface along the selected edge. The new surfaces will be one-span in the fitting direction.\n\nDeleteInput: Deletes (Yes) or keeps (No) the input objects. DeleteInput=No creates the output on the current layer. Otherwise, the output is created on the layer of the input object.\n\nShowGrips: Displays control points of the output surfaces for reference.\n\nDegree: Specifies the degree of the output surfaces in the fitting direction. The surface degree in the fitting direction applies to the output surfaces by default. The degree option cannot be set smaller than the default degree.\n\nEditKnots: Allows adding more knots to the surfaces to achieve a closer fit at the expense of more complex surfaces. Use Ctrl(CMD)+click to remove the knots added by yourself.\n\n* Midpoints: Displays points at the middle points (of parameter space) between knots for snapping to.\n* Automatic: Adds a knot halfway between every two knots.\n* Undo: Reverts the last action.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Split and Refit Surface","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/split-and-refit-surface/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/split-and-refit-surface/#command-line-options","collection":"docs7","hash":"f64fe6181554ad933ccd683b4d09646c","indexed_by":"docs-index"}},{"content":"Surface Tangent — Surface Tangent\n\nThe SetSurfaceTangent command sets an untrimmed surface edge tangent direction.\n\nSteps\n\n1. Select an untrimmed surface edge.\n2. Pick the base point for tangent direction.\n3. Pick the second direction point.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Surface Tangent","section":"Surface Tangent","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/surface-tangent/#surface-tangent","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/surface-tangent/#surface-tangent","collection":"docs7","hash":"df84cc90b9ce8c41fcda655a4bf7951e","indexed_by":"docs-index"}},{"content":"Sweep 1 Rail — Sweep 1 Rail\n\nThe Sweep1 command fits a surface through a series of profile curves that define the surface cross-sections and one curve that defines a surface edge.\n\nSteps\n1. Select a single rail curve.\n2. Select cross-section curves in the order that the surface will pass through them.\\ When multiple closed cross-section curves are selected, there will be an extra step for adjusting curve seams.","metadata":{"title":"Sweep 1 Rail","section":"Sweep 1 Rail","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-1-rail/#sweep-1-rail","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-1-rail/#sweep-1-rail","collection":"docs7","hash":"666e20e58dbab797a3a7a178a2571b6e","indexed_by":"docs-index"}},{"content":"Sweep 1 Rail — Tips\n\n* Cross-section curves with the same structure create a better sweep surface. Cross-section curves will have the same structure if they are all copied from the same curve.\n* If the cross-section curves do not have the same structure, use the Rebuild cross sections or Refit cross sections options. The rebuilt or refitted copies of the cross-section curves will be used to sweep.\n* When Refit rail is enabled, the refitting tolerance is controlled by Document Properties -> Units -> Absolute tolerance.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sweep 1 Rail","section":"Tips","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-1-rail/#tips","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-1-rail/#tips","collection":"docs7","hash":"395fd0d9c64fb56b50fc7ee3acef0b7a","indexed_by":"docs-index"}},{"content":"Sweep 2 Rail — Sweep 2 Rail\n\nThe Sweep2 command fits a surface through a series of profile curves that define the surface shape and two curves that define the surface edges.\n\nSteps\n1. Select two curves as the rails.\n2. Select cross-section curves in the order in which the surface will pass through them.\n3. Select open curves near the same ends. For closed curves, adjust the curve seams.","metadata":{"title":"Sweep 2 Rail","section":"Sweep 2 Rail","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-2-rail/#sweep-2-rail","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-2-rail/#sweep-2-rail","collection":"docs7","hash":"cf571f83a011b0571adaba70e64f423b","indexed_by":"docs-index"}},{"content":"Sweep 2 Rail — Tips\n\n* Make the degree and structure of the rail curves match each other.\n* Place cross-section curves so the endpoints are on the ends of the rails or on edit points of the rails.\n* Turn on edit points and use Point object snap to place the section curves between matching edit points on the rails.\n* If only one section curve is used, the entire length of the rails are used for the surface, regardless of the settings.\n* Section curves can have differing structures. The surface takes the complexity of the most complex one.\n* To use same shape curve in the whole sweep, with control over where the sweep ends, use the Orient commands to create a scaled copy of the shape curve and place its ends at the places on the rail curves where you want the sweep to stop.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sweep 2 Rail","section":"Tips","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-2-rail/#tips","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/sweep-2-rail/#tips","collection":"docs7","hash":"9002145b3d9e113dcaf2c996820dec3e","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Unroll Developable Surface\n\nThe UnrollSrf command flattens (develops) a surface or polysurface with curvature in one direction to a planar surface.\n\nSteps\n\n1. Select surfaces or polysurfaces.\n2. Select curves, text dots, or points on the surface.\n\nThis is useful if you are trying to develop a trimmed polysurface. In situations in which the surface cannot be developed, remove the trim curves, develop the surface and curves, and then re-trim the developed surface with the trim curves.","metadata":{"title":"Unroll Developable Surface","section":"Unroll Developable Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#unroll-developable-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#unroll-developable-surface","collection":"docs7","hash":"8cbadd0c861bf929420676fbae2bef57","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Command-line options\n\nExplode\n\n* Yes: The resulting surfaces are not joined.\n* No: The resulting surfaces are re-joined along the same edges that were joined in the original polysurface.\n* To specify where the unrolled polysurface will split.\n* 1.Use the UnjoinEdge command\n* 2.Select the edges that should be open after unrolling.\n\nLabels: Determines whether or not matching numbered dots are placed on the edges of the selected object and the resulting objects.\n\nKeepProperties: Determines whether or not the selected object's properties are copied to the resulting object.\n\nWarning: Display a warning if the area of the unrolled surface is not within a percentage tolerance. These options are displayed only if the surface is selected after starting the command (post-select).\n\n* Area difference tolerance: Sets the percentage of difference between the area of the unrolled surface and the area of the original surface.\n* WarningDisplay: Specifies whether the warning will be displayed at the command line or in a dialog box that you must click to dismiss.\n* CommandLine: Displays the warning message on the command line. No action is required.\n* Dialog: Displays the warning message in a dialog box. You must dismiss the dialog box before continuing. This will interrupt scripting the command.","metadata":{"title":"Unroll Developable Surface","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#command-line-options","collection":"docs7","hash":"47d7a65f702f816f52f8c4c53d0f1412","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Developable Surface\n\nRhino has commands to create and unroll developable surfaces with holes and marking curves.\n\nDevelopable surfaces are surfaces that can be formed by rolling a flat sheet of material such that the material does not stretch, tear, or wrinkle. Examples of this type of shape are cylinders, cones, and some steel ship hulls.\n\nPicture trying to make your surface out of aluminum foil. If it crinkles or tears as you try to bend it into position, the surface is not developable. A sphere is an example of a surface that are not developable (try wrapping an apple with aluminum foil). So are most of the shapes on car bodies and most modern car windshields.\n\nSurfaces must still be linear in one direction for UnrollSrf to unroll them. You could lay a ruler along the surface and it would touch the surface from one edge to the other. These are called ruling lines.\n\nBecause these surfaces are linear in one direction, the Gaussian curvature is zero at every point on the surface. If the Gaussian curvature is not zero, Rhino will not be able to unroll the surface. If the surface is not linear in one direction, Rhino will not be able to unroll the surface.\n\nSince developable surfaces cannot be created from just any two curves, results from a developable style loft can be unpredictable. Curves of similar shape without kinks work best.\n\nYou can use Gaussian curvature analysis to determine which areas of a surface are not developable.\n\nThese developable surface tools work best for designing airfoil and hydrofoil type surfaces. They were not designed to be used for bending and unfolding sheet metal like duct work or for developing fabric patterns.\n\n#### Developable surface pitfalls","metadata":{"title":"Unroll Developable Surface","section":"Developable Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#developable-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#developable-surface","collection":"docs7","hash":"7b43924bf04025e51bd3dd3dd509558e","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Developable Surface\n\nWhen building a developable surface, you can get very different results depending on the complexity and similarity of the two edge curves. It is best if they are as simple as possible and have the same parameterization.\n\nPicking different ends of the curves can give different results. You can sometimes combine the different results to get a better developable surface.\n\nA developable surface is not necessarily a fair surface.\n\nIt is possible to make a developable surface that unrolls with a difference in area and ruling lengths from the 3-D surface. It is easy to miss the warning Rhino gives.\n\nYou can unroll surfaces that are not developable.\n\nRhino does not have any method of making a surface a bit more or less developable. Some programs have a way of spreading out the concentrated fans of rulings that often occur, thereby smoothing the surface. Since metal, especially aluminum, has some elasticity, you can deviate quite a bit from a mathematically correct developable surface and still plate it up. Some builders that use developable surfaces in their models, expand the plates, and then add up to 1-inch chord depth of radius to the flat sides in the sections to make the plate \"taut.\" The expanded plates fit up to the changed sections. They have not figured out how to get this \"blow\" into their 3-D models, though.\n\nOne way to approach the problem is to use the CurvatureAnalysis command to analyze the Gaussian curvature as a guide to surface creation instead of the developable loft. But there is no way in Rhino to expand surfaces created this way (unless they happen to meet the requirements for the UnrollSrf command).","metadata":{"title":"Unroll Developable Surface","section":"Developable Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#developable-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#developable-surface","collection":"docs7","hash":"c7c8a7d64b819766d458dde44d3c7aae","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Troubleshooting unrolling surfaces\n\nThe goal of many designers is to obtain flattened, two-dimensional patterns from their three-dimensional designs. The three-dimensional surfaces are analyzed using Gaussian curvature analysis and classified into two types of surfaces: developable and non-developable.\n\nDevelopable surfaces can be flattened using exact solutions. These are surfaces like cones, truncated cones, and cylinders.\n\nSpheres and other surfaces, that have compound curvature, cannot be unfolded or “developed” accurately without knowing something about the characteristics of the material (amount of stretch available and more.)\n\nNon-developable surfaces have compound curvature, that is, curvature in two directions. Flattening or developing these surfaces requires stretching or shrinking of the material used.\n\nThe Curvature command will show the curvature curve as you move your cursor over the surface. The non-developable surface show the curvature with two arcs, to illustrate the compound curvature. Developable surfaces will show curvature with a single arc and a line, illustrating the curvature in a single direction.\n\nThe unrolling or flattening of non-developable surfaces is based on complex transformation matrices that factor in material characteristics and transform the surface on to the xy plane as a two-dimensional boundary. The material’s characteristics help determine stretch that material will experience to produce the shape.","metadata":{"title":"Unroll Developable Surface","section":"Troubleshooting unrolling surfaces","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#troubleshooting-unrolling-surfaces","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#troubleshooting-unrolling-surfaces","collection":"docs7","hash":"37392c0f9e93ff6ff067021371001e7e","indexed_by":"docs-index"}},{"content":"Unroll Developable Surface — Troubleshooting unrolling surfaces\n\nIt is helpful to imagine cutting and folding paper. A developable surface can be folded or rolled from a sheet of paper. Clearly, a sphere does not fit that criterion. A sphere of sorts can be constructed from a series of developable panels and can be developed panel by panel, but of course it will not be a true sphere, but an approximation. In short, if a surface can be constructed with paper, then it is determined to be developable and Rhino should be able to unroll it. If you need a sheet of rubber to make the 3-D shape, then it is non-developable and the UnrollSrf command will not unroll it.\n\nThe Smash command makes an approximate 2-D development of surfaces that have compound curvature. This command can be used to deal with fabrics that have a certain amount of flexibility and stretch.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Unroll Developable Surface","section":"Troubleshooting unrolling surfaces","url":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#troubleshooting-unrolling-surfaces","source":"https://www.rhinoartisan.com/docs/7/tabs/surface/unroll-developable-surface/#troubleshooting-unrolling-surfaces","collection":"docs7","hash":"a4a552f27af175b81fe10661b3fb2b5f","indexed_by":"docs-index"}},{"content":"Transform\n\nTen groups, left to right. Buttons with a submenu list it underneath.\n\nMove\nCenter Moves the selection to the world origin.\n\nMove Moves objects from one point to another.\n\nMove by Normal Moves along the surface normal under the cursor.\n\nMove Random Scatters the selection within a range you set.\n\nMove on Objects Drags objects while they stay stuck to a surface.","metadata":{"title":"Transform","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/","collection":"docs7","hash":"33fc3c8d01c0e74ad9b9a017e45c587b","indexed_by":"docs-index"}},{"content":"Transform — Copy\n\nCopy Copies objects from one point to another.\n\nCopy on Objects Drops copies onto a surface as you click.\n\nRotate\nRotate Rotates around a point in the construction plane.\n\nRotate 3D Rotates around any axis in space.\n\nScale\nScale by Weight Scales a piece until it weighs what you ask for.\n\nScale by Dimensions Scales to a target measurement.\n\nScale by Center Scales about the object's own centre.\n\nScale 3D Uniform scaling in all three axes.\n\nScale 1D\n\nNon-Uniform\n\nScale by Plane\n\nScale 2D","metadata":{"title":"Transform","section":"Copy","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/#copy","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/#copy","collection":"docs7","hash":"39e8b17b815b4a2d41c7a7dfb3dc828a","indexed_by":"docs-index"}},{"content":"Transform — Mirror\n\nPair Makes the mirrored twin of a piece — the other earring.\n\nMirror Mirrors across a line you draw.\n\nOpposite Mirror Mirrors to the opposite side in one click.\n\nQuad Mirror Mirrors into all four quadrants at once.\n\nOrient\nOrient Moves and rotates from two reference points.\n\nOrient by 3 Points Places an object using three reference points.\n\nOrient Curve to Edge Wraps a curve onto a surface edge.\n\nOrient on Surface Places an object onto a surface, following its normal.\n\nQuick Orient on Surface The same, with the prompts cut to a minimum.\n\nPerpendicular to Curve Stands an object up perpendicular to a curve.\n\nSet XYZ Coordinates Sets the exact X, Y and Z of the selection.\n\nProject to CPlane Flattens the selection onto the construction plane.\n\nRemap to CPlane Moves objects onto a different construction plane.","metadata":{"title":"Transform","section":"Mirror","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/#mirror","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/#mirror","collection":"docs7","hash":"7342b366ac2b30549ada4e348213dbda","indexed_by":"docs-index"}},{"content":"Transform — Align\n\nAlign Lines several objects up on one edge or centre.\n\nAlign Top\n\nAlign Horizontal Centers\n\nAlign Bottom\n\nAlign Left\n\nAlign Vertical Centers\n\nAlign Right\n\nAlign Centers\n\nDistribute Objects\n\nAlign Gems Lines up gems by table, girdle or culet.\n\nArray\nPattern Repeats a shape as a pattern you can keep editing.\n\nQuick Polar Array A circular array with the prompts cut short.\n\nArray A rectangular grid of copies.\n\nPolar Array\n\nArray along Curve\n\nQuick Array on Curve Spreads copies along a curve, live.\n\nArray along Surface Spreads copies across a surface.","metadata":{"title":"Transform","section":"Align","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/#align","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/#align","collection":"docs7","hash":"bd0f8f192fd1628214aebca551447e79","indexed_by":"docs-index"}},{"content":"Transform — Deformation\n\nQuick Taper Tapers a shape along an axis, live.\n\nQuick Bend Bends a shape around an axis, live.\n\nQuick Twist Twists a shape around an axis, live.\n\nQuick Flow Flows a shape onto a curve, live.\n\nQuick Flow by Surface Flows a shape onto a surface, live.\n\nSplop Rhino's deformation set.\n\nTaper\n\nBend\n\nTwist\n\nFlow along Curve\n\nFlow along Surface\n\nShear","metadata":{"title":"Transform","section":"Deformation","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/#deformation","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/#deformation","collection":"docs7","hash":"91d1e0124a5dfa3a4ff04558927bb237","indexed_by":"docs-index"}},{"content":"Transform — Cage and Maelstrom\n\nMaelstrom Swirls objects around a centre.\n\nCreate Cage Builds a control cage around a shape.\n\nSelect Captives Selects what the cage drives.\n\nSelect Controls Selects the cage itself.\n\nEdit Cage Deforms the shape by dragging the cage.\n\nRelease Objects Frees objects from their cage.\n\nThe Quick commands are RhinoArtisan's own: same job as Rhino's, but with a live preview and the prompts cut to a minimum. Rhino's originals sit in the Splop and Array submenus when you need their full options.","metadata":{"title":"Transform","section":"Cage and Maelstrom","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/#cage-and-maelstrom","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/#cage-and-maelstrom","collection":"docs7","hash":"900a11920578f1fc421773d5f347c8b7","indexed_by":"docs-index"}},{"content":"Cage Edit — Cage Edit\n\nThe CageEdit command allows for smooth and flexible deformation of objects in Rhino by using a control object, such as a cage, to manipulate the shape of selected objects. This command is particularly useful for complex deformations, as it enables users to modify the object smoothly by adjusting the control points of the cage.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Cage Edit","section":"Cage Edit","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage-edit/#cage-edit","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage-edit/#cage-edit","collection":"docs7","hash":"226b1367cce40133ff0acc97a1f2be5c","indexed_by":"docs-index"}},{"content":"Cage Release — Cage Release\n\nThe ReleaseFromCage command removes selected objects from the influence of a control object set up by the CageEdit command.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cage Release","section":"Cage Release","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage-release/#cage-release","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage-release/#cage-release","collection":"docs7","hash":"cb822c4799afcc95e07eab0be1206094","indexed_by":"docs-index"}},{"content":"Cage — Cage\n\nThe Cage command creates a box-shaped cage object that can be used with the CageEdit command to deform other objects. This technique is useful for achieving smooth deformations on complex objects by manipulating fewer control points.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Cage","section":"Cage","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage/#cage","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/cage/#cage","collection":"docs7","hash":"dfc15a222352881e064903f27e01b97e","indexed_by":"docs-index"}},{"content":"Maelstrom — Maelstrom\n\nThe Maelstrom command deforms objects by twisting them into a spiral pattern, creating a vortex-like effect.\n\n#### Key Steps:\n\n1. Select the objects to deform.\n2. Choose the center point of the maelstrom and specify the first radius.\n3. Set the second radius for the spiral deformation.\n4. Define the coil angle to determine the spiral’s tightness and direction.\n\n#### Command-Line Options:\n\n* Copy: Creates a copy of the objects when applying the spiral deformation.\n* Rigid: If set to \"Yes,\" moves objects without deforming them. If set to \"No,\" both the positions and shapes of the objects are transformed.\n\nThese options provide control over how the objects are spiraled, allowing for creative and dynamic deformations.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Maelstrom","section":"Maelstrom","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/maelstrom/#maelstrom","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/maelstrom/#maelstrom","collection":"docs7","hash":"137d8d76d805875983ea13c3f2f6ebe0","indexed_by":"docs-index"}},{"content":"Sel Captives — Sel Captives\n\nThe SelCaptives command selects captive objects set up using the CageEdit command.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sel Captives","section":"Sel Captives","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/sel-captives/#sel-captives","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/sel-captives/#sel-captives","collection":"docs7","hash":"784fba3d7caaebc88b5038a8d81a106d","indexed_by":"docs-index"}},{"content":"Sel Controls — Sel Controls\n\nThe SelControls command selects cage control objects set up using the CageEdit command.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Sel Controls","section":"Sel Controls","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/sel-controls/#sel-controls","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/advanced/sel-controls/#sel-controls","collection":"docs7","hash":"13654851894c8b3fc5fed5c72f35a040","indexed_by":"docs-index"}},{"content":"Align Gems — Align Gems\n\nThe Align Gems command allows users to quickly align gems in the viewport to a selected surface, providing flexibility in positioning and orientation.\n\nKey features:\n\n1. Surface Alignment: Select a surface to which the gems will be aligned.\n2. Flip Option: Toggle the orientation of the gems for optimal placement.\n3. Adapt or Keep Orientation:\n* _Adapt to Object_: The gems will adjust their orientation to match the surface.\n* _Keep Orientation_: The gems will maintain their current orientation while aligning to the surface.\n4. Alignment Modes:\n* _Align from the Table_: Aligns the gems with the table (the top, flat facet).\n* _Align from the Girdle_: Aligns the gems with the girdle (the widest part of the gem).\n\nThis command simplifies gem alignment, ensuring precision while offering customizable orientation options.\n\nGoldsmith tip : This command is particularly useful when arranging a pavé on a domed or curved surface. You can first distribute circles in the CPlane to perfect the arrangement, and once you're satisfied with the layout, you can convert the circles into gems with the command Gems from Circles. Then, use the Align Gems command to snap the gems to the surface of the object you're designing. This ensures a smooth transition from a flat layout to a perfectly aligned design on a complex surface.","metadata":{"title":"Align Gems","section":"Align Gems","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/align-gems/#align-gems","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/align-gems/#align-gems","collection":"docs7","hash":"ce55e5e85506ef0a51d1583e39f667fd","indexed_by":"docs-index"}},{"content":"Align — Align\n\nThe Align command lines up the bounding boxes of objects and object grips.\n\n* When SubD faces, edges, or vertices are selected (with Ctrl+Shift), the associated control points are aligned.\n\nSteps\n1. Select the objects to align, and press Enter.\n2. Specify an alignment option.\n3. Pick a location, or press Enter to align based on the overall bounding box of all selected objects.","metadata":{"title":"Align","section":"Align","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#align","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#align","collection":"docs7","hash":"0d46931f7ab1e7189f42ee54f971370c","indexed_by":"docs-index"}},{"content":"Align — Command-line options\n\nAlignTo\n\n* CPlane: Aligns objects using construction plane coordinates.\n* World: Aligns objects using world coordinates.\n\nBottom: Aligns objects by the bottom-most locations of their bounding boxes.\n\nConcentric: Aligns objects by the horizontal and vertical centers of their bounding boxes.\n\nHorizCenter: Aligns objects by the horizontal centers of their bounding boxes.\n\nLeft: Aligns objects by the left-most locations of their bounding boxes.\n\nRight: Aligns objects by the right-most locations of their bounding boxes.\n\nTop: Aligns objects by the left-most locations of their bounding boxes.\n\nVertCenter: Aligns objects by the vertical centers of their bounding boxes.\n\nSteps\n\n1. Select the objects to align, and press Enter.\n2. Specify an alignment option.\n3. Pick a location, or press Enter to align based on the overall bounding box of all selected objects.\n\n#### Command-line options\n\n-AlignTo\n\n* CPlane\n\nAligns objects using construction plane coordinates.\n\n* World\n\nAligns objects using world coordinates.\n\n-Bottom\n\nAligns objects by the bottom-most locations of their bounding boxes.\n\n-Concentric\n\nAligns objects by the horizontal and vertical centers of their bounding boxes.\n\n-HorizCenter\n\nAligns objects by the horizontal centers of their bounding boxes.\n\n-Left\n\nAligns objects by the left-most locations of their bounding boxes.\n\n-Right\n\nAligns objects by the right-most locations of their bounding boxes.\n\n-Top\n\nAligns objects by the left-most locations of their bounding boxes.\n\n-VertCenter\n\nAligns objects by the vertical centers of their bounding boxes.\n\n-ToCurve\n\nPulls points to the selected curve.\n\n-ToLine\n\nPulls points to a line defined by picking two points.\n\n-ToFitPlane\n\nPulls points to the best fitting plane of the points.","metadata":{"title":"Align","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#command-line-options","collection":"docs7","hash":"7ba68b19e3ca5d0fbbb6f6dc97b97485","indexed_by":"docs-index"}},{"content":"Align — Command-line options\n\nAt least four points are required for this alignment type.\n\n-ToPlane\n\nPulls points to a plane defined by picking two points and the CPlane or World z-axis based on the AlignTo option. The selected objects or grips will not move in the z-axis.\n\n-3Points\n\nPick three points to define the alignment plane.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Align","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/align/#command-line-options","collection":"docs7","hash":"d67c4ba10ad5b63f8026e58f57d967ed","indexed_by":"docs-index"}},{"content":"Array — Array\n\nThe Array command copies objects spaced in columns, rows, and levels in the x, y, and z directions.\n\n#### Steps\n\n1. Select the objects.\\ The array directions are the x, y, and z directions of the active construction plane.\n2. Type the number of copies in the x direction, and press Enter.\n3. Type values of 1 or more for the number of copies.\n4. Type the number of copies in the y direction.\n5. Type the number of copies in the z direction.\n6. Pick the corners of a rectangle that defines the unit cell (x and y spacing) distance.\n7. Pick the height of the unit cell, or press Enter to use the width distance.\\ Or\\ Specify the distances for the x spacing, y spacing, and z spacing.\n8. Press Enter to accept the array or change the options.\n\n#### Command-line options\n\nMode\n\n* UnitCell: Sets the diagonal distance between the arrayed objects.\n* Fill: Sets a distance (1D), a rectangle (2D), or a bounding box (3D) to enclose the arrayed objects.\n\nNumber: Specifies the number of objects in the array.\n\n* XNumber / YNumber / ZNumber: Changes the number of objects in the x, y, and z directions.\n\nPreview: Displays a dynamic preview. You can change the options and the preview will update.\n\nSpacing: Specifies the spacing between objects in the array.\n\nXSpacing / YSpacing / ZSpacing: Changes the spacing in the x, y, and z directions.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Array","section":"Array","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/#array","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/#array","collection":"docs7","hash":"1e8ef8c66b3d639b72d8eefe7d790a56","indexed_by":"docs-index"}},{"content":"ArrayCrv — ArrayCrv\n\nThe ArrayCrv command copies objects spaced along a curve.\n\n#### Steps\n\n1. Select objects to array.\n2. Select a path curve near the end where you want the array to start.\\ Or\\ Use the Basepoint option.\n3. Specify the number of elements to array or the spacing distance along the curve.\n4. Type a value of 1 or more for the number of elements.\n\n#### Command-line options\n\nBasepoint: When the object to be arrayed is not on the curve and should be moved to the curve prior to the array, the Basepoint option establishes a reference location that will be move to the curve.\n\nItems: The number of items array along the curve.\n\nDistance: The distance between items. The number of items is determined by the length of the curve.\n\nOrientation: Think about an airplane. An airplane may Roll, Pitch, or Yaw when it flies in the air. The orientation styles control how the object rolls, pitches, or yaws when it arrays along a curve.\n\nSubCrv: When selecting the path curve, type subcrv to select part of a curve.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"ArrayCrv","section":"ArrayCrv","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/arraycrv/#arraycrv","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/arraycrv/#arraycrv","collection":"docs7","hash":"9805bdc3b2870c4c215b76fc1d4bdbe0","indexed_by":"docs-index"}},{"content":"ArrayPolar — ArrayPolar\n\nThe ArrayPolar command copies objects around a central location.\n\n#### Steps\n\n1. Select the objects.\n2. Pick the center of the array.\\ The rotation axis for the polar array is the z direction of the active construction plane at the chosen point.\n3. Type the number of items and press Enter.\n4. Enter a value of 2 or more.\n5. Type the angle to fill.\\ Copies of the selected objects appear, rotated around the axis defined by the center point.\n\n#### Command-line options\n\nAxis: Defines an axis line for the array to rotate around.\n\nAxis steps\n\n1. Pick the start of polar axis.\n2. Pick the end of polar axis.\\ The action is similar to the Rotate3D command.\\ Press Enter to rotate the array around the construction plane z axis.\n\nUseLastAxis: Uses the previously selected axis direction for the rotation.\n\nPreview: Displays a dynamic preview. You can change the options and the preview will update.\n\nStepAngle: Enter the angle between objects.\n\nRotate: Rotates the objects as they are arrayed.\n\nZOffset: Moves each arrayed object in the z direction by the value specified.\n\n* Type a negative value to offset objects in the negative CPlane-Z direction.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"ArrayPolar","section":"ArrayPolar","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/arraypolar/#arraypolar","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array/arraypolar/#arraypolar","collection":"docs7","hash":"b8eda086af5b85664aded859cad28e15","indexed_by":"docs-index"}},{"content":"Array along Surface — Array along Surface\n\nThe ArrayCrvOnSrf command copies objects spaced and rotated along a curve on a surface. The surface normal determines the orientation of the arrayed objects.\n\nSteps\n1. Select objects.\n2. Pick a base point.\\ This is usually located on the object to array.\n3. Select a path curve near the end where you want the array to start.\n4. Select the surface.\n5. Pick along the curve to position objects or type a distance from the last location.","metadata":{"title":"Array along Surface","section":"Array along Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array-along-surface/#array-along-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array-along-surface/#array-along-surface","collection":"docs7","hash":"7ed45e97d88d6468007f6a8b5f444145","indexed_by":"docs-index"}},{"content":"Array along Surface — Command-line options\n\nDivide: Type the number of objects.\n\nMultiple: Specify the distance between objects.\n\nSubCrv: Type subcrv to select part of a curve as input.","metadata":{"title":"Array along Surface","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array-along-surface/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/array-along-surface/#command-line-options","collection":"docs7","hash":"e33492fe52b2e562695a0963eaabc1cb","indexed_by":"docs-index"}},{"content":"Pattern — Pattern\n\nThis command allows you to select an object and replicate the number of rows and columns you want on a surface. It's ideal for quickly creating an extensive array of the same object, generating rich and beautiful patterns.\n\nThis command requires two elements: the object or group of objects and the surface on which to apply them.","metadata":{"title":"Pattern","section":"Pattern","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/pattern/#pattern","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/pattern/#pattern","collection":"docs7","hash":"d83fd088371b3ee24d0bb46772c6851d","indexed_by":"docs-index"}},{"content":"Pattern — Parameters\n\n* Object Selector: Clicking this left square allows you to select the object you want to use for the pattern.\n* Surface Selector: By clicking this right square, you can select a surface, to which the pattern will be oriented.\n* Column: The number of column reiterations that will be generated.\n* Rows: The number of rows your object will be repeated.\n* X Padding: The margin between columns in millimeters.\n* Y Padding: The margin between rows in millimeters.\n* X Rotation: It's the amount of horizontal rotation in degrees you want to apply to your pattern.\n* Y Rotation: It's the amount of vertical rotation in degrees you want your pattern to have.\n* Reverse Mode: Needs a selected surface. Has three options, None, to disable it, Reverse X, to invert the horizontal orientation on the selected surface, Reverse Y, to invert the vertical orientation, and Both, to invert the orientation in the X and Y axes.\n* Move on Z: The vertical distance above the surface where the pattern is being generated.\n* Enable Max Thickness: Activates the maximum thickness.\n* Max Thickness: Only applies if Enable Max Thickness is enabled. Sets the maximum extent in millimeters the pattern will not exceed.","metadata":{"title":"Pattern","section":"Parameters","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/pattern/#parameters","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/pattern/#parameters","collection":"docs7","hash":"71792da3c72cec60449fe3b8e279e8c1","indexed_by":"docs-index"}},{"content":"Quick Array On Curve — Quick Array on Curve\n\nThis command allows you to create multiple copies of an object following the orientation of a curve.\n\nThis command allows users to distribute objects along a curve with precise control. Upon activation, two panels appear:\n\n1. Selection Panel: Choose the objects to be distributed, the curve on which the distribution will occur, and optionally, select a mesh, solid, or surface to which the objects will be oriented.\n2. Parameters Panel: Adjust the distribution by specifying the number of copies to create. Choose an alignment method (if not justified, manually set the distance between objects). Fine-tune the objects' positions by moving them along the Z-axis and rotating them for better alignment. Additionally, you can decide the placement mode for the first object in one of two ways: Center to End or Bounding Box to End.\n\nThis command simplifies the process of arranging objects along a curve, offering versatile control over spacing, alignment, and orientation.","metadata":{"title":"Quick Array On Curve","section":"Quick Array on Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-on-curve/#quick-array-on-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-on-curve/#quick-array-on-curve","collection":"docs7","hash":"e71eb172ec38e2458ddf031dac944520","indexed_by":"docs-index"}},{"content":"Quick Array Polar — Quick Array Polar\n\nThis command allows you to create multiple copies of an object in a circular pattern.&#x20;\n\nParameters\nWhen running the command, click the selection square to select the object you want to copy. The menu below allows you to set the number of copies, the angle at which to fill them, and many other parameters.\n\n* Copies: Define the number of copies.\n* Angle: Define the angle to cover; default is 360°.\n* Orientation: Define which plane the copies are arranged on: front, top, side, and CPlane.\n* Alignment: This defines how to align the copies in a text editor: Left, Center, Right, or Justify.\n* Mode: Define the copy mode. Details below.\n* Delete Original","metadata":{"title":"Quick Array Polar","section":"Quick Array Polar","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-polar/#quick-array-polar","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-polar/#quick-array-polar","collection":"docs7","hash":"318c9f0992a849e70c18f95eb587e39b","indexed_by":"docs-index"}},{"content":"Quick Array Polar — Modes\n\nWe now present examples of the same model in different modes:\n\nSingle: This is the most common mode, simply making a circular copy of the selected elements.\n\nMultirow: When selecting Multirow mode, two new parameters appear: Rows and Distance Between Rows. Additionally, there is the option to enable Both Sides.\n\nMultirow Interpolate: Similar to Multirow, it alternates the copies in the even rows.\n\nMultirow Spherical: The rows are copies and displaced in a spherical shape.\n\nMultirow Spherical Interpolate: The rows are copies and displaced in a spherical shape, with the copies in the even rows alternated.","metadata":{"title":"Quick Array Polar","section":"Modes","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-polar/#modes","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/array/quick-array-polar/#modes","collection":"docs7","hash":"87efd9c8350ff2a9a230c151c01f1c9f","indexed_by":"docs-index"}},{"content":"Center — Center\n\nThis command places a selected object in the origin of the CPlane, so the object's 3D center matches the center of the CPlane. It's especially useful to reset transformations and relocate objects.\n\nAfter running this command, it will ask you to select which object you want to move to the origin of the CPlane, once selected, if you press the Enter key, it will be moved to the center of the CPlane, finishing the command.","metadata":{"title":"Center","section":"Center","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/center/#center","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/center/#center","collection":"docs7","hash":"d72ec9f506503a5c186f2c3ddfbf0c98","indexed_by":"docs-index"}},{"content":"Copy on Objects — Copy on Objects\n\nYou can find this command by expanding the Copy submenu.\n\nThis command allows you to copy an object, and place its duplicates on another object following its orientation while retaining their original distance. It's especially useful when adding fine details to your designs.\n\nWhen running this command, it will ask you to select the object you want to copy, and then the base object it will use as a reference. After that, you will be able to click on points where the duplicates will be placed. If you are hovering your mouse over a valid area, a preview of the copy will be visible where it will be placed.\n\nWe suggest making sure the original object you will copy it's on the angle and distance you want your copies to be placed in relation to the base object before running this command.\n\nTo exit the command, press the Enter or Escape keys.","metadata":{"title":"Copy on Objects","section":"Copy on Objects","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/copy/copy-on-objects/#copy-on-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/copy/copy-on-objects/#copy-on-objects","collection":"docs7","hash":"7488f3cf603dd389d6ef030c22073542","indexed_by":"docs-index"}},{"content":"Copy — Copy\n\nUsing this command you can create a custom Element following a curve, and use multiple shapes on multiple points along the curve. Ideal to make decorative elements, or sleek and amazing jewelry pieces.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Copy","section":"Copy","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/copy/copy/#copy","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/copy/copy/#copy","collection":"docs7","hash":"26b9e6bb5ac3795b0fb74e10472e9ede","indexed_by":"docs-index"}},{"content":"Quick Bend — Quick Bend\n\nThe Bend command allows for the deformation of objects by bending them along a spine arc. It provides the option to select either a single object or a group of objects. Additionally, curves, planes, surfaces, or solids can be used to facilitate the bending process.\n\n#### How It Works:\n\nOnce objects are selected in the selection panel, they are surrounded by a bounding box. Lines with arrowheads appear at each end of the box. By moving these arrows, you can bend the object in the direction indicated by the arrows, offering a visual and intuitive way to control the deformation.\n\n#### Customization Options:\n\nIn the parameters panel, you have the ability to:\n\n* Deformation Plane: Select the plane of action that will influence the bending direction.\n* Symmetry Mode: Choose whether the bending is symmetrical or asymmetrical.\n* Manual X and Y Adjustments: For greater precision, you can manually input values for the X and Y parameters instead of relying on the arrows.\n\nThis combination of visual controls and manual fine-tuning provides flexibility and precision when shaping your designs.\n\nGoldsmith Tip : By combining the Quick Bend transformation with the Quick Flow command, you can create pieces with smooth, gradual transitions across different sections. This technique allows for fluid and seamless changes in form, adding elegance and sophistication to your designs.","metadata":{"title":"Quick Bend","section":"Quick Bend","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-bend/#quick-bend","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-bend/#quick-bend","collection":"docs7","hash":"6b2bf35e63153ccb649e2bf39a40c9b0","indexed_by":"docs-index"}},{"content":"Quick Flow by Surface — Quick Flow by Surface\n\nThe Quick Flow on Surface command enables you to flow objects oriented to one surface onto another surface with precision and flexibility.\n\nHow It Works:\n\nThe command features three main panels:\n\n1. Surfaces Panel:\n* Base Surface: Select the surface from which the objects will be oriented.\n* Target Surface: Select the surface where the objects will be placed.\n2. Objects To Flow Panel:\n* Deformable Objects: These objects will stretch to fit and adapt to the target surface.\n* Rigid Objects: These objects will be distributed on the target surface without deformation.\n3. Parameters Panel:\n* Reverse U/V Directions: Adjust the U, V, or both UV surface directions to align the objects correctly with the target surface. You can apply these adjustments to either the Base surface or the Target surface to ensure precise orientation and fit.\n\nThis command provides comprehensive control over how objects are adapted or distributed across surfaces, offering both flexibility in deformation and accuracy in placement.\n\nGoldsmith Tip: This command is especially useful for dynamically adjusting complex gem distributions. After flowing the circles onto the base surface, you can move them interactively and immediately see how they align on the target surface. This allows you to easily check for issues such as objects being too close, intersecting, or being correctly positioned, and make real-time adjustments to achieve the perfect arrangement.","metadata":{"title":"Quick Flow by Surface","section":"Quick Flow by Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-flow-by-surface/#quick-flow-by-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-flow-by-surface/#quick-flow-by-surface","collection":"docs7","hash":"311f7143a8b96b8c11f3e5b20017762f","indexed_by":"docs-index"}},{"content":"Quick Flow — Quick Flow\n\nThe Quick Flow command allows you to flow selected objects from one curve to another, facilitating smooth transitions between shapes and curves.\n\n#### How It Works:\n\nThe command features two main panels:\n\n1. Curves Panel:\n* Base Curve: Select the original curve from which the objects will flow.\n* Target Curve: Select the curve where the objects will be adapted or distributed.\n2. Objects To Flow Panel:\n* Deformable Objects: These objects will stretch and conform to fit the target curve, adapting their shape to match the curvature.\n* Rigid Objects: These objects will be distributed along the target curve without altering their shape, maintaining their original form.\n\nThis command provides versatile options for transforming objects and fitting them into new designs, whether by adapting their shape or simply positioning them along a curve.\n\nThis command enables dynamic adjustments to the shape by allowing you to move parts of the flowed objects. You can instantly see the results of these changes in real-time, without needing to repeat the operation, making the design process more intuitive and efficient.","metadata":{"title":"Quick Flow","section":"Quick Flow","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-flow/#quick-flow","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-flow/#quick-flow","collection":"docs7","hash":"67583142af4e2093c1eacc1978a7675f","indexed_by":"docs-index"}},{"content":"Quick Taper — Quick Taper\n\nThe Quick Taper command is used to deform objects by tapering them towards or away from a specified axis. This command allows you to selectively modify the shape of objects, giving them a tapered appearance.\n\nTo use the Quick Taper command, you can select either a single object or multiple objects at once. Additionally, you have the flexibility to use curves, surfaces, solids, or other elements as reference geometry to define the tapering effect. When you select the axis, it will be drawn in the viewport with an arrow indicating the direction of the tapering effect.\n\nThe Quick Taper command provides various parameters to customize the deformation. You can specify the axis or direction along which the tapering will occur, allowing you to control the extent and direction of the taper. There are three different modes:\n\n1. Uniform: Tapers the object uniformly along the entire length of the axis.\n2. One Break: Allows you to move a dark dot at the beginning of the axis to determine where the tapering will start.\n3. Two Breaks: Enables you to move two dark dots along the axis to specify the portion of the object to be tapered.\n\nThis enables you to create a gradual or abrupt tapering effect based on your design requirements.\n\nGoldsmith Tip: By combining the Quick Taper and Quick Flow commands, you can achieve sophisticated gradual effects in your designs. For instance, you can use them to distribute the same motif with a gradient or create gradual subtractions using Boolean Difference, enhancing the complexity and fluidity of your pieces.","metadata":{"title":"Quick Taper","section":"Quick Taper","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-taper/#quick-taper","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-taper/#quick-taper","collection":"docs7","hash":"6c397151da780060df869f3d8c9fb7d0","indexed_by":"docs-index"}},{"content":"Quick Twist — Quick Twist\n\nThe Twist command deforms objects by rotating them around an axis. This command allows you to select either a single object or multiple objects simultaneously. Furthermore, you can use curves, surfaces, solids, or other elements as references to facilitate the twisting effect.\n\n#### How It Works:\n\nOnce you select the object to twist and define the direction of deformation in the Parameters panel, a line appears in the viewport, showing the axis along which the twist will occur. A rotation gumball also appears, allowing you to visually manipulate the twist directly in the viewport. For more precise adjustments, the Angle parameter in the Parameters panel can be modified.\n\n#### Twisting Modes:\n\n* Uniform: Applies a consistent twist along the entire length of the axis.\n* One Break: Allows you to control where the twist begins by moving a dark dot along the axis.\n* Two Breaks: Enables twisting a specific segment by adjusting two dark dots, defining the portion of the object to be twisted.\n\nThese options provide flexibility for creating both smooth and segmented twisting effects, depending on your design needs.\n\nGoldsmith Tip: By combining multiple deformations like Quick Taper and Quick Twist, and then flowing the result along a curve using Quick Flow, you can create truly exotic and intricate shapes. This process gives you full control over the design, allowing for complex and unique distributions in your piece.","metadata":{"title":"Quick Twist","section":"Quick Twist","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-twist/#quick-twist","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/quick-twist/#quick-twist","collection":"docs7","hash":"fa2c48aa6537eae8f0fc86904a5aa32b","indexed_by":"docs-index"}},{"content":"Bend — Bend\n\nThe Bend command deforms objects by bending them along a defined spine arc. To use it, select the objects, set the start and end points of the spine line, and choose a point to bend through.\n\nCommand-line options:\n\n* Copy: Creates a copy of the objects when bending.\n* Rigid: Changes object positions without deforming them.\n* LimitToSpine: Limits bending to the spine or allows bending beyond it.\n* Angle: Sets the bend angle.\n* Symmetric: Bends objects symmetrically around the center.\n* PreserveStructure: Maintains the control-point structure of curves and surfaces for accuracy.\n* NonAttenuated: Controls how the morph strength is applied along the bending arc.\n\nThese options provide flexibility for precise bending and deformation of objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Bend","section":"Bend","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/bend/#bend","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/bend/#bend","collection":"docs7","hash":"411798e3a6db44ad4279ca16bc0ff343","indexed_by":"docs-index"}},{"content":"Flow Along Curve — Flow Along Curve\n\nThe Flow command re-aligns objects from a base curve to a target curve, making it useful for mapping flat or straight shapes to curved ones.\n\nCommand-line options:\n\n* TargetSurface: Uses a surface to orient objects along a target curve based on surface normals.\n* Copy: Creates a copy of the objects during the flow operation.\n* Rigid: Moves objects along the target curve without deforming them.\n* RigidGroups: Applies the Rigid option to groups when enabled.\n* Line: Defines a line as the base curve for the flow operation.\n* Local: Defines a \"tube\" of influence around the input curve, affecting only objects within this tube.\n* Stretch: Stretches or compresses objects along the target curve to match their relationship to the base curve.\n* PreserveStructure: Maintains the knot structure of curves and surfaces during deformation.\n* Roadlike: Uses frames to calculate 3D rotation when objects are mapped to a 3D target curve.\n\nThese options allow for versatile transformations and precise control when aligning objects to curves.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Flow Along Curve","section":"Flow Along Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/flow-along-curve/#flow-along-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/flow-along-curve/#flow-along-curve","collection":"docs7","hash":"8669c0e4fb2411b6710f26230110fe15","indexed_by":"docs-index"}},{"content":"Flow Along Surface — Flow Along Surface\n\nThe FlowAlongSrf command deforms objects by morphing them from a source surface to a target surface. This command is useful for adapting objects to complex surfaces while maintaining their overall shape.\n\n#### Key Steps:\n\n1. Select the objects to morph.\n2. Choose the edge of the base surface near a corner.\n3. Select the corresponding edge of the target surface near a matching corner.\n\n#### Command-Line Options:\n\n* Copy: Creates a copy of the objects when morphing.\n* Rigid: Moves objects to the target surface without deforming them if set to \"Yes.\" If \"No,\" objects are relocated and deformed.\n* RigidGroups: Applies the Rigid option to groups of objects when enabled.\n* Plane: Allows using a plane instead of an existing surface as the base.\n* ConstrainNormal: Controls how the normal direction of the base surface maps onto the target surface.\n* AutoAdjust: Ignores UV directions, using the corner and edge of the surfaces to define the mapping, or uses the existing UV directions to determine the mapping.\n* PreserveStructure: Maintains the control-point structure of curves or surfaces for accuracy.\n\nThese options allow for flexible and precise morphing of objects between surfaces while controlling deformation and maintaining structural integrity.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Flow Along Surface","section":"Flow Along Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/flow-along-surface/#flow-along-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/flow-along-surface/#flow-along-surface","collection":"docs7","hash":"4e23a0616094088f9d9fbb72744ed821","indexed_by":"docs-index"}},{"content":"Shear — Shear\n\nThe Shear command skews objects by deforming them parallel to one axis at a specified angle, transforming shapes like rectangles into parallelograms while maintaining the original length of lines parallel to the axis of deformation.\n\n#### Key Steps:\n\n1. Select the objects to shear.\n2. Pick the origin point, which stays fixed during the transformation.\n3. Choose a reference point to define the shear angle.\n4. Set the shear angle.\n\n#### Command-Line Options:\n\n* Copy: Creates a copy of the objects when shearing.\n* Rigid: Moves objects without deforming them if set to \"Yes.\" If \"No,\" objects are deformed during the transformation.\n* SubCrv: Allows selecting part of a curve as input for the shear operation.\n\nThese options provide flexibility and precision when skewing objects, allowing for controlled deformation and positioning.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Shear","section":"Shear","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/shear/#shear","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/shear/#shear","collection":"docs7","hash":"29559edeeb9d7345784b70f262ae6777","indexed_by":"docs-index"}},{"content":"Splop — Splop\n\nThe Splop command copies, rotates, scales, and wraps objects onto a surface, similar to adding decorative elements to pottery.\n\nSteps:\n1. Select the objects to wrap.\n2. Draw a reference sphere around the objects to determine their size and orientation.\n3. Select a surface onto which the objects will be wrapped.\n4. Pick a point on the surface and drag out a sphere to position the objects.","metadata":{"title":"Splop","section":"Splop","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/splop/#splop","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/splop/#splop","collection":"docs7","hash":"906312ab2566c09f6bfaba26509d789f","indexed_by":"docs-index"}},{"content":"Splop — Command-Line Options:\n\n* Copy: Creates a copy of the objects when wrapping them onto the surface.\n* Rigid: Moves objects without deforming them if set to \"Yes.\" If \"No,\" objects are deformed during the transformation.\n* Flip: Reverses the direction in which the objects are applied to the surface.\n\nThese options allow for versatile manipulation and placement of objects onto surfaces, providing creative control over their final appearance.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Splop","section":"Command-Line Options:","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/splop/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/splop/#command-line-options","collection":"docs7","hash":"f250d296288e18c9967ca78d3832c142","indexed_by":"docs-index"}},{"content":"Taper — Taper\n\nThe Taper command deforms objects by tapering them toward or away from a specified axis. You define the start and end points of the axis, along with the taper distances. Several options modify how the tapering is applied, such as:\n\n* Copy: Creates a copy of the objects when tapering.\n* Rigid: Transforms object positions without deforming them.\n* Flat: Produces a one-dimensional taper.\n* Infinite: Applies the taper throughout the object, regardless of axis length.\n* PreserveStructure: Maintains the control-point structure of curves and surfaces for accuracy.\n\nThese options allow for flexible and precise deformation of objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Taper","section":"Taper","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/taper/#taper","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/taper/#taper","collection":"docs7","hash":"4d1bdcdb84d59311acd7a4d14ed938be","indexed_by":"docs-index"}},{"content":"Twist — Twist\n\nThe Twist command deforms objects by rotating them around a specified axis. To use it, select the objects, define the start and end points of the twist axis, and set the rotation angle either by typing or by picking two reference points.\n\nCommand-line options:\n\n* Copy: Creates a copy of the objects when twisting.\n* Rigid: Transforms object positions without deforming them.\n* Infinite: Applies twisting throughout the entire object or limits it to the length of the axis.\n* PreserveStructure: Maintains the control-point structure of curves and surfaces for precision.\n\nThese options allow for flexible twisting and precise deformation of objects.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Twist","section":"Twist","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/twist/#twist","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/deformation/rhino-tools/twist/#twist","collection":"docs7","hash":"1076288faacb546c2fed4bc706f5ad60","indexed_by":"docs-index"}},{"content":"Mirror Opposite — Mirror Opposite\n\nThis command allows us to create an opposite mirrored version of objects.\n\nWe will select the objects, and it will use the plane referenced to the CPlane.","metadata":{"title":"Mirror Opposite","section":"Mirror Opposite","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror-opposite/#mirror-opposite","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror-opposite/#mirror-opposite","collection":"docs7","hash":"29ca849144d4a054aa754c55c4e28653","indexed_by":"docs-index"}},{"content":"Mirror Quad — Mirror Quad\n\nThis command makes exact copies of an object following the original's position on the CPlane and mirrors them in 90º, 180º, and 270º. It's very useful when you want to create mirrored duplicates symmetrically with maximum precision.\n\nWhen running this command, you will be asked to select the object you want to copy. When you press the Enter key, the command will generate the mirrored copies and end.","metadata":{"title":"Mirror Quad","section":"Mirror Quad","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror-quad/#mirror-quad","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror-quad/#mirror-quad","collection":"docs7","hash":"e72b90199bc91b2a2d8e0f688072ef2d","indexed_by":"docs-index"}},{"content":"Mirror — Mirror\n\nThe Mirror command creates a mirror-image copy of objects.\n\nSteps\n1. Select the objects.\n2. Pick the start of the mirror plane.\n3. Pick the end of the mirror plane.\\ As you move the cursor, Rhino previews the location for the mirrored objects.\\ The two end points specify a mirror plane perpendicular to the construction plane.\\ Use object snaps to accurately place the mirror plane, especially if you want to Join a surface and its mirrored copy.","metadata":{"title":"Mirror","section":"Mirror","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror/#mirror","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror/#mirror","collection":"docs7","hash":"d415516eaec2229497477cc433986823","indexed_by":"docs-index"}},{"content":"Mirror — Command-line options\n\n3Point: Pick three points to define a mirror plane.\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nXAxis: Mirrors the object across the CPlane x axis (xz plane) of the current viewport.\n\nYAxis: Mirrors the object across the CPlane y axis (yz plane) of the current viewport.\n\nZAxis: Mirrors the object across the CPlane (xy plane) of the current viewport.\n\nObject: Select a planar surface as the mirror plane.\n\n* A planar single surface, polysurface face, or extrusion face border can be selected as the mirror plane.\n* The mirror plane can be attached to the planar surface with History. History update will be inactive if the surface is made non-planar until it is made planar again.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Mirror","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/mirror/#command-line-options","collection":"docs7","hash":"ad4d152508609d9fa80315d230d53760","indexed_by":"docs-index"}},{"content":"Pair — Pair\n\nThe Pair command, found in the Transform and Rendering tab, simplifies creating object pairs by allowing you to mirror and adjust their placement.\n\nSteps\n1. Select Objects: Choose the object or multiple objects to pair.\n2. Mirror Option: Decide if you want to mirror the objects.\n3. Set Distance: Specify the distance between the paired objects.\n4. Adjust Angle: Set the angle for orientation if needed.\n\nAfter configuring these options, press Enter. The command will create the paired objects based on your settings.","metadata":{"title":"Pair","section":"Pair","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/pair/#pair","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/mirror/pair/#pair","collection":"docs7","hash":"e4f7880457d06938dcd477479efca0ee","indexed_by":"docs-index"}},{"content":"Move By Normal — Move by Normal\n\nYou can find this command by expanding the Move submenu.\n\nUsing this command, you can move one or more objects closer or further from a surface, following its orientation. It's especially useful to move multiple related objects with exact precision.\n\nUpon running this command, it will ask you to select the object you want to move, and the surface you want to take as reference. You can then change the Height, the parameter that defines the distance in millimeters the objects will travel.\n\nIf you enter a positive number in Height, it will increase the distance between the objects and the surface. Typing in a negative value will instead pull closer the objects to the surface.\n\nPressing the Enter key confirms your changes and finishes the command.","metadata":{"title":"Move By Normal","section":"Move by Normal","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-by-normal/#move-by-normal","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-by-normal/#move-by-normal","collection":"docs7","hash":"fe3e7c23b7918f5b0562cd5ddee7c00d","indexed_by":"docs-index"}},{"content":"Move On Objects — Move on Objects\n\nYou can find this command in the transform Tab.\n\nThis command allows you to move an object to place it on another object following its orientation while retaining its original distance. It's especially useful when adding fine details to your designs.\n\nWhen running this command, it will ask you to select the object you want to move, and then the base object will use as a reference. After that, you will be able to click on the point where you want to place the object. If you are hovering your mouse over a valid area, a preview of the object will be visible where it will be placed.\n\nWe suggest making sure the object you will move is on the angle and distance you want to be placed in relation to the base object before running this command.","metadata":{"title":"Move On Objects","section":"Move on Objects","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-on-objects/#move-on-objects","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-on-objects/#move-on-objects","collection":"docs7","hash":"248ab744f6f83e8217df298b168814c6","indexed_by":"docs-index"}},{"content":"Move Random — ​ Move Random\n\nYou can find this command by expanding the Move submenu.\n\nThis command allows you to move one or multiple objects randomly both in vertical and horizontal directions.\n\nWhen running this command, it will ask you to select the objects you want to move, you can then click on the distance value to set how many millimeters you want the objects to be moved from their original positions. After pressing the Enter key, the command will finish.","metadata":{"title":"Move Random","section":"​ Move Random","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-random/#-move-random","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move-random/#-move-random","collection":"docs7","hash":"05395ddc635a2bb28f0b37a257ba055d","indexed_by":"docs-index"}},{"content":"Move — Move\n\nThe Move command in Rhino allows you to relocate objects by specifying a starting and ending point. It provides various options for precise control over the movement direction and distance.\n\n#### Key Steps:\n\n1. Select Objects: Choose the objects you want to move.\n2. Pick Start Point: Click the point from which you want to move the object. Press Enter to use the bounding box center of the selected object.\n3. Pick End Point: Click the point where you want to move the object to.\n\n#### Command-Line Options:\n\n* Normal: Moves objects in the direction normal to a selected point on another object. Useful for aligning objects to a surface or curve.\n* Select the object.\n* Use the `Normal` option.\n* Pick a location on another object to define the normal direction.\n* Enter or click to set the movement distance.\n* Vertical: Moves objects perpendicular to the current construction plane. Ideal for vertical adjustments.\n* SubCrv: Allows selecting a part of a curve for moving.\n\n#### Additional Movement Methods:\n\n* Move by Dragging:\n* Select and drag objects or control points directly.\n* Type a distance during dragging to constrain the movement.\n* Nudge:\n* Select and nudge objects using the arrow keys.\n* Hold Alt and press arrow keys to move in the x or y direction; PageUp/PageDn for the z direction.\n* The nudge distance and cumulative distance are shown on the command line.\n* Gumball:\n* Use the Gumball widget to move, scale, and rotate objects. The Gumball provides visual handles for easier manipulation.\n\nThese options allow for flexible and precise control over moving objects in 3D space.\n\nThe Move command options control mouse operation for selecting and dragging.\n\nSteps\n\n1. Select objects.\n2. Pick a point to move from.","metadata":{"title":"Move","section":"Move","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move/#move","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move/#move","collection":"docs7","hash":"35e45f038458ae0678c1735af7510f74","indexed_by":"docs-index"}},{"content":"Move — Move\n\nPress Enter to use the bounding box center of the object.\n3. Pick a point to move to.\n\n#### Command-line options\n\n-Normal: Moves objects in the normal direction of the picked location on another object.\n\n* The picked location will be the \"from point.\n* The object can be a curve, surface, polysurface, extrusion, or SubD.\n\n* Steps\n\n1.Select the object to move.\n\n* 2.Select the Normal command-line option.\n* 3.Select an object and pick a location on the object.\n* 4.Pick (with the mouse) or enter the distance.\n\n-Vertical: Moves objects perpendicular to the current construction plane.\n\n-SubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Move","section":"Move","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move/#move","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/move/move/#move","collection":"docs7","hash":"4b3de228de3accf419b5db33cc7db6dc","indexed_by":"docs-index"}},{"content":"Orient by 3 Points — Orient by 3 Points\n\nThe Orient3Pt command moves or copies and rotates objects using three reference and three target points.\n\nSteps\n1. Select the objects.\n2. Pick the first reference point.\n3. Pick the second reference point.\\ This defines a base direction from the first reference point.\n4. Pick the third reference point.\n5. Pick the first target point.\\ This corresponds to the first reference point.\n6. Pick the second target point.\\ This corresponds to the second reference point.\n7. Pick the third target point.\\ This corresponds to the third reference point.","metadata":{"title":"Orient by 3 Points","section":"Orient by 3 Points","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-by-3-points/#orient-by-3-points","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-by-3-points/#orient-by-3-points","collection":"docs7","hash":"7111b2ffeb63234cd396866dee67f9da","indexed_by":"docs-index"}},{"content":"Orient by 3 Points — Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on. The RememberCopyOptions command determines whether the selected option is used as the default.\n\nScale: Re-sizes the object as it is oriented. The scale factor is based on the ratio between the distance between the first two reference points and the first two target points. The third target point is used for orientation only.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Orient by 3 Points","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-by-3-points/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-by-3-points/#command-line-options","collection":"docs7","hash":"9300f42877a087a63f2eebfd7669fb5d","indexed_by":"docs-index"}},{"content":"Orient Curve To Edge — Orient Curve to Edge\n\nThe OrientCrvToEdge command copies and aligns a curve to a surface edge.\n\nSteps\n1. Select a curve near an end.\n2. Select a target surface edge.\n3. Pick target edge points along the edge to align the curve\n\nCommand-line options\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nFlipSurface: Changes the normal direction of the surface.\n\nReverseCurve: Changes the direction of the curve.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Orient Curve To Edge","section":"Orient Curve to Edge","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-curve-to-edge/#orient-curve-to-edge","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-curve-to-edge/#orient-curve-to-edge","collection":"docs7","hash":"bc5e2a419f54499858406a2b2a4de9e7","indexed_by":"docs-index"}},{"content":"Orient Curve — Orient On Curve\n\nThe OrientOnCrv command moves or copies and rotates objects along a curve using the curve direction for orientation.\n\nSteps\n1. Select objects.\n2. Pick a base point.\n3. Select the orientation curve.\n4. Pick a new base point on the curve\n\n*\n\nCommand-line options\nOnCurve\n\nPick a base point on the curve. This allows moving the object along the curve while maintaining its orientation to the curve.\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nFlip: Flips the direction of the oriented object on the target curve.\n\nBy default, the curve direction is used to orient the object.\n\nPerpendicular:** Orients the object perpendicular to the curve. The perpendicular plane is determined by the current construction plane when the base point is picked.&#x20;\n\n* XFlip/YFlip: Reverses the orientation relative to the original orientation to the construction plane.\n* Rotate: Enter an angle or pick two reference points to rotate the object.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Orient Curve","section":"Orient On Curve","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-curve/#orient-on-curve","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-curve/#orient-on-curve","collection":"docs7","hash":"5ee63dc5a066b46461195e5a27aae28e","indexed_by":"docs-index"}},{"content":"Orient on Surface — Orient on Surface\n\nThe OrientOnSrf command moves or copies and rotates objects on a surface using the surface's normal direction for orientation.\n\nSteps\n1. Select the objects.\n2. Pick two reference points.\\ The first reference point defines the new origin of the reference plane.\\ The vector created by second and first reference points defines the reference plane's x axis.\\ In addition, the distance between the first and second reference points is used as input when scaling the objects.\\ The z direction of the current construction plane determines the \"up\" direction for the object. The up direction will then follow the surface normal direction on the target surface.\n3. Select the surface.\n4. Pick target points on the surface.\n5. (Optional) \"Tip\": Infinite Plane: Type IP for Infinite POlane options.\n6. As you move the cursor over the surface, you will see a dynamic preview image of the transformed objects being reoriented by the varying normal direction of the surface.","metadata":{"title":"Orient on Surface","section":"Orient on Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-on-surface/#orient-on-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-on-surface/#orient-on-surface","collection":"docs7","hash":"7b2cd320e9a75cff9c49ccf268e5be10","indexed_by":"docs-index"}},{"content":"Orient on Surface — Command-line options\n\n-OnSurface: Sets the initial base point on the surface. This option is useful if the object is already on the target surface but must be copied or moved. The option uses initial base points on the target surface and uses the surface normal rather construction plane normal to determine the initial orientation of the object.\n\n-Flip: Reverses the direction.\n\n-Scale: Scales the object as it orients\n\n* Prompt: Prompts to pick a scale a for each copy.\n* Uniform: Sets the same scale for the x, y, and z directions.\n* X/Y/Z: Sets a separate scale for each direction\n\n-Rotation\n\n* Prompt: Prompts to pick a rotation angle for each copy.\n* Angle: Specify an angle of rotation. Rotation is around the surface normal at the target point.\n\n-Copy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on. The RememberCopyOptions command determines whether the selected option is used as the default.\n\n-Rigid: Specifies that individual objects will not be deformed as they are transformed. The illustration shows the Rigid option with the Bend command.\n\n* Yes: Individual objects will not change, only their positions will change.\n* No: Individual objects are transformed as well as their positions.\n\n-ConstrainNormal: Appears if Rigid is not selected. The direction used is the CPlane normal of the view you used for placing the copy. If you place multiple copies you can do it in multiple viewports.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Orient on Surface","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-on-surface/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient-on-surface/#command-line-options","collection":"docs7","hash":"8ce385a24ac4ef0dc1a2a879a3f8e2c7","indexed_by":"docs-index"}},{"content":"Orient — Orient\n\nThe Orient command moves or copies, rotates, and scales objects using two reference and two target points.\n\nSteps\n1. Select the objects.\n2. Pick two reference points.\\ Markers are drawn at the reference points.\n3. Pick two target points.\\ The first and second reference points will match these locations.\\ The objects are moved, scaled and rotated so the reference points transform to the target points.","metadata":{"title":"Orient","section":"Orient","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient/#orient","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient/#orient","collection":"docs7","hash":"a7e60320d6818fb8e7af0b803f694fd2","indexed_by":"docs-index"}},{"content":"Orient — Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nScale:&#x20;\n\n* No: The second target point defines the direction of the transformation, but objects remain the same size.\n* 1D: Scale the object only along the axis between the target points.\n* 3D: The second target point defines the direction of the transformation and the scale factor for the objects.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Orient","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/orient/#command-line-options","collection":"docs7","hash":"c61fca0c6259ffd46ec0a453444dbcdb","indexed_by":"docs-index"}},{"content":"Project to CPlane — Project to CPlane\n\nThe ProjectToCPlane command flattens objects onto the construction plane.\n\nSteps\n1. Select objects.\n2. Choose to either keep or delete the input objects.\\ The objects will project to the construction plane in the viewport that is current when the command ends.\n\n* The projected object has the same control point structure as the original object, except that all the control points are projected to the construction plane. This command works on points, curves, surfaces, polysurfaces, meshes, and block instances.\n* When block instances are selected, the block insertion points are projected. The block instances are moved along with their insertion points.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Project to CPlane","section":"Project to CPlane","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/project-to-cplane/#project-to-cplane","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/project-to-cplane/#project-to-cplane","collection":"docs7","hash":"dd22493b3f1885d2ada0fa9be9dfcc5f","indexed_by":"docs-index"}},{"content":"Quick Orient on Surface — Quick Orient on Surface\n\nThis command allows users to orient and place objects on a selected surface with precision and ease. Upon activation:\n\n1. The user is prompted to select the surface or geometry where the objects will be oriented.\n2. Then, the user selects the object they wish to orient.\n\nOnce these selections are made, the following occurs:\n\n* The command line will prompt the user to pick a point on the selected geometry to place the object. At this stage, options for flipping, scaling, rotating, moving along the Z-axis, and alignment adjustments are available.\n* As the mouse moves over the geometry, a Key Shortcut Menu appears on the left side of the viewport. This menu offers key-based controls:\n\n* A/Z: Scale the object larger or smaller.\n* S/X: Rotate the object clockwise or counterclockwise.\n* D/C: Move the object up or down along the Z-axis.\n* U: Remove the last placed object.\n\n* The key shortcut menu only appears when the mouse is hovering over the geometry, making this command dynamic and interactive. Once the object is positioned and adjustments are made, the user can left-click to place it. To finish placing multiple copies, simply right-click to exit the command.\n\nGoldsmith Tip: This tool is essential for designing pieces that require the addition of decorative elements in a balanced and visually appealing way. It allows you to intuitively experiment with the placement, adjusting the position and distribution of objects until you achieve the most aesthetically pleasing arrangement, relying on visual judgment.","metadata":{"title":"Quick Orient on Surface","section":"Quick Orient on Surface","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/quick-orient-on-surface/#quick-orient-on-surface","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/quick-orient-on-surface/#quick-orient-on-surface","collection":"docs7","hash":"1955e196a21b158093fb7527528ddd4e","indexed_by":"docs-index"}},{"content":"Remap to CPlane — Remap to Cplane\n\nThe RemapCPlane command reorients selected objects to a different construction plane.\n\nSteps\n1. Select objects.\n2. Click in the viewport that contains the construction plane to which you want to map the objects.\\ The objects are moved and rotated so they have the same relationship to the new construction plane as they had to the original construction plane.\n\n*","metadata":{"title":"Remap to CPlane","section":"Remap to Cplane","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/remap-to-cplane/#remap-to-cplane","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/remap-to-cplane/#remap-to-cplane","collection":"docs7","hash":"8297ad24315763ab52e1edfe2e35b8d4","indexed_by":"docs-index"}},{"content":"Remap to CPlane — Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nCPlane: Sets the target CPlane by typing the CPlane name. It can be a world plane (Top, Bottom, Front, Back, Left, Right) or a named CPlane.\n\nView: Sets the target CPlane by typing the viewport name. It can be a default (Top, Bottom, Front, Back, Left, Right), existing, or named view.\n\n*\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Remap to CPlane","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/remap-to-cplane/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/remap-to-cplane/#command-line-options","collection":"docs7","hash":"d887bc426631110dce7daca0188cc4b4","indexed_by":"docs-index"}},{"content":"Set XYZ Coordinates — Set XYZ Coordinates\n\nThe SetPt command moves selected points and control points of objects to a specified location in the x, y, and/or z directions.\n\n* If the entire objects such as curves or surfaces are selected without showing control points, SetPt will move all of the objects’ control points to that location. This may result in a flattening or distortion of the object.\n* This command is often used to accurately change the position of points and control points. It is also a fast way to be sure that a set of planar curves are all in the same plane.\n\n*","metadata":{"title":"Set XYZ Coordinates","section":"Set XYZ Coordinates","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#set-xyz-coordinates","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#set-xyz-coordinates","collection":"docs7","hash":"dc18d6d64666ddaedff8c7676b055d5c","indexed_by":"docs-index"}},{"content":"Set XYZ Coordinates — Steps\n\n1. Select objects.\n2. In the Set Points dialog box, click the check boxes for the coordinates.\n3. Pick a location to match.\n\nThe selected objects will line up with the set point in the direction(s) you chose.\n\n* To move in one direction, enable the checkbox only.\n* Right-click on a checkbox to enable the checkbox and clear all the others.\n* When repeating the SetPt command with the same settings, right-click the mouse button, press Enter, or press the space bar to accept the current settings.\n* When block instances are selected, the block instances are aligned with their insertion points\n\n***","metadata":{"title":"Set XYZ Coordinates","section":"Steps","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#steps","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#steps","collection":"docs7","hash":"479513f50424e9fd194f82631335cfba","indexed_by":"docs-index"}},{"content":"Set XYZ Coordinates — Set Points Options\n\n-Set X/Set Y/Set Z: Aligns objets in the x, y, and z directions.\n\n-Align to World/Align to CPlane: Align with the world or construction plane coordinates.\n\nCommand-line option\n-Copy: Specifies whether or not the objects are copied.\n\n* A plus sign appears at the cursor when copy mode is on.\n* Copy=Yes supports History recording.\n* The RememberCopyOptions command determines whether the selected option is used as the default.\n\n***\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Set XYZ Coordinates","section":"Set Points Options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#set-points-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/orient/set-xyz-coordinates/#set-points-options","collection":"docs7","hash":"903985ccde00627530133aea6915228a","indexed_by":"docs-index"}},{"content":"Rotate 3D — Rotate 3D\n\nThe Rotate3D command rotates objects around a specified axis in 3-D space.\n\nSteps\n\n1. Select the objects.\n2. Pick the start of the rotation axis.\n3. Pick the end of the rotation axis.\n4. Type the angle, or pick two reference points.\n\nCommand-line options\nSurfaceNormal: Select a surface and then a point on the surface. The rotation axis will be defined from the point on the surface and the normal to the surface at that location.\n\nUseLastAxis: Uses the previously selected axis direction for the rotation.\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Rotate 3D","section":"Rotate 3D","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate-3d/#rotate-3d","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate-3d/#rotate-3d","collection":"docs7","hash":"b8e58abe1f492642e91bdd0fbd40283c","indexed_by":"docs-index"}},{"content":"Rotate — Rotate\n\nThe Rotate command rotates objects around an axis perpendicular to the current construction plane.\n\nThe rotation plane is based on a picked point and the construction plane of the active viewport.\n\nSteps\n1. Select the objects.\n2. Pick the center of rotation.\n3. Type the angle, or pick two reference points","metadata":{"title":"Rotate","section":"Rotate","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate/#rotate","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate/#rotate","collection":"docs7","hash":"367af8aa16b11fc108c6937d0420c63e","indexed_by":"docs-index"}},{"content":"Rotate — Command-line options\n\nUseLastCenter: Uses the previously selected center point for the rotation.\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on. The RememberCopyOptions command determines whether the selected option is used as the default.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nSteps\n\n1. Select the objects.\n2. Pick the center of rotation.\n3. Type the angle, or pick two reference points.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Rotate","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/rotate/rotate/#command-line-options","collection":"docs7","hash":"18f3d7ae67fc29a7e350bc71915c4c07","indexed_by":"docs-index"}},{"content":"Scale — Scale\n\nThe Scale command changes the size of selected objects uniformly in the x, y, and z directions.\n\n#### Steps\n\n1. Select objects.\n2. Pick a base point, or press Enter to use the center of the bounding box of all selected objects as the base point.\n3. Type the scale factor, or pick two reference points.\n\nTo scale an object from an arbitrary size to a specific one\n\n1. Use the origin point and the first reference point to establish the original size of the object.\n2. Type the new size for the second reference point.\\ When scaling by dragging, the scale factor becomes the default the next time you use that scale command.\n\n#### Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nRigid: Specifies that individual objects will not be deformed as they are transformed.\n\n* Yes: Individual objects will not change, only their positions will change.\n* No: Individual objects are transformed as well as their positions.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation).","metadata":{"title":"Scale","section":"Scale","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/#scale","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/#scale","collection":"docs7","hash":"79859c6fcedb4858a004bfc129499ca4","indexed_by":"docs-index"}},{"content":"Non-Uniform — Non-Uniform\n\nThe ScaleNU command changes the size of selected objects in three directions using different lengths for each direction.\n\n#### Steps\n\n1. Select objects.\n2. Pick an origin.\n3. Type the x scale factor, or pick two reference points.\\ (Press Enter for a scale of 1.0.)\n4. Type the y scale factor, or pick two reference points.\\ (Press Enter for a scale of 1.0.)\n5. Type the z scale factor, or pick two reference points.\\ (Press Enter for a scale of 1.0.)\\ The objects expand or contract in the three directions with the scale factor values specified.\n\n#### Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nRigid: Specifies that individual objects will not be deformed as they are transformed.\n\n* Yes: Individual objects will not change, only their positions will change.\n* No: Individual objects are transformed as well as their positions.\n\nWorldCoordinates: Use world coordinates for the scaling direction.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Non-Uniform","section":"Non-Uniform","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/non-uniform/#non-uniform","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/non-uniform/#non-uniform","collection":"docs7","hash":"d96fbf8e4403f6d98d058d4e3ab41295","indexed_by":"docs-index"}},{"content":"Scale 1D — Scale 1D\n\nThe Scale1D command changes the size of selected objects in one direction.\n\n#### Steps\n\n1. Select objects.\n2. Pick a base point, or press Enter to use the center of the bounding box of all selected objects as the base point.\n3. Type the scale factor and a direction, or pick two reference points.\n\nTyping 0 for the scale factor flattens the object in the picked direction.\n\nThe objects expand or contract in the single direction specified, without expanding the objects in the other directions.\n\nWhen scaling by dragging, the scale factor becomes the default next time the Scale1D command is used.\n\n#### Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nRigid: Specifies that individual objects will not be deformed as they are transformed.\n\n* Yes: Individual objects will not change, only their positions will change.\n* No: Individual objects are transformed as well as their positions.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Scale 1D","section":"Scale 1D","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-1d/#scale-1d","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-1d/#scale-1d","collection":"docs7","hash":"a7e677c0f6bb3ddfbc556b325129fa31","indexed_by":"docs-index"}},{"content":"Scale 2D — Scale 2D\n\nThe Scale2D command changes the size of selected objects uniformly in two directions.\n\nSteps\n\n1. Select objects.\n2. Pick a base point, or press Enter to use the center of the bounding box of all selected objects as the base point.\n3. Type the scale factor, or pick two reference points.\n4. The objects are expanded or contracted uniformly in the two directions of the axes of the active viewport construction plane where you specify the scale factor.\\ When scaling by dragging, the scale factor becomes the default next time the Scale2D command is used.\n\n#### Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nRigid: Specifies that individual objects will not be deformed as they are transformed.\n\n* Yes: Individual objects will not change, only their positions will change.\n* No: Individual objects are transformed as well as their positions.\n\nSubCrv: Type subcrv to select part of a curve as input.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Scale 2D","section":"Scale 2D","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-2d/#scale-2d","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-2d/#scale-2d","collection":"docs7","hash":"ec2fc0a28956a1eee617da7b76773010","indexed_by":"docs-index"}},{"content":"Scale by Plane — Scale by Plane\n\nThe ScaleByPlane command changes the size of selected objects in two directions using different lengths for each direction.\n\n#### Steps\n\n1. Select objects.\n2. Pick an origin.\n3. Type the scale factor, or pick two reference points.\\ The objects are expanded or contracted in two directions along the axes of the specified plane.\n\n#### Command-line options\n\nCopy: Specifies whether or not the objects are copied. A plus sign appears at the cursor when copy mode is on.\n\nThe RememberCopyOptions command determines whether the selected option is used as the default.\n\nPlane: Specifies the plane.\n\n* ActiveCPlane: Uses the active construction plane as the reference plane.\n* 3Point: Pick three points to specify the reference plane.\n* Object: Select a planar object to specify the reference plane.\n* FromView: Uses the specified view plane as the reference plane.\n* WorldTop: Uses the world x,y plane as the current reference plane.\n* WorldRight: Uses the world y,z plane as the current reference plane.\n* WorldFront: Uses the world x,z plane as the current reference plane.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Scale by Plane","section":"Scale by Plane","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-by-plane/#scale-by-plane","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale/scale-by-plane/#scale-by-plane","collection":"docs7","hash":"a9a9757db912513a0acacdbba0c4f894","indexed_by":"docs-index"}},{"content":"Scale by Center — Scale by Center\n\nThis command is effortless but highly practical. It allows us to select and scale objects by a factor, but the difference is that the scaling centre point is calculated based on the objects' bounding boxes.","metadata":{"title":"Scale by Center","section":"Scale by Center","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-center/#scale-by-center","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-center/#scale-by-center","collection":"docs7","hash":"8d5a00da30bfa25f2d1633781fdd06db","indexed_by":"docs-index"}},{"content":"Scale By Dimensions — ​ Scale by Dimensions\n\nThis command allows us to scale any design using specific measurements rather than factors, as in other commands. It will enable us to scale independently on the X, Y, and Z axes or maintain proportions.\n\nWe will select the objects to scale, and it will show us a real-time preview of how the model will look. Any changes we make will be visible! It's excellent for dynamically adjusting parts to fit others.","metadata":{"title":"Scale By Dimensions","section":"​ Scale by Dimensions","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-dimensions/#-scale-by-dimensions","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-dimensions/#-scale-by-dimensions","collection":"docs7","hash":"db0e47bf0df5c5a859ac8555e54b5073","indexed_by":"docs-index"}},{"content":"Scale By Weight — ​ Scale by Weight\n\nThis command allows us to scale objects by their weight. It works straightforwardly yet powerfully. We select the objects, and the current weight is shown. Then, we can input the desired weight, and it calculates it instantly.","metadata":{"title":"Scale By Weight","section":"​ Scale by Weight","url":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-weight/#-scale-by-weight","source":"https://www.rhinoartisan.com/docs/7/tabs/transform/scale/scale-by-weight/#-scale-by-weight","collection":"docs7","hash":"61ea577720c135d5f208f6a46dde343e","indexed_by":"docs-index"}},{"content":"View\n\nSeven groups, left to right. Buttons with a submenu list it underneath.\n\nNavigate\nPan Slides the view without rotating it.\n\nRotate View Orbits the camera around the model.\n\nZoom Dynamic Zooms by dragging.\n\nZoom Extents Fits everything in the viewport.\n\nZoom Window Zooms to a rectangle you draw.\n\nZoom Selected Fits the current selection.\n\nUndo View Change Steps back through view changes.\n\nToggle Linked Views\n\nSingle Viewport Mode\n\nDolly Zoom Moves the camera in or out instead of zooming.\n\nZoom 1:1 Shows the model at actual size on screen.","metadata":{"title":"View","url":"https://www.rhinoartisan.com/docs/7/tabs/view/","source":"https://www.rhinoartisan.com/docs/7/tabs/view/","collection":"docs7","hash":"7330cac6aea290023bde211eb479d62a","indexed_by":"docs-index"}},{"content":"View — Standard views\n\nTop Looks straight down.\n\nBottom Looks straight up.\n\nFront Looks from the front.\n\nRight Looks from the right.\n\nLeft Looks from the left.\n\nBack Looks from behind.\n\nPerspective The three-quarter perspective view.\n\nNamed views and projection\nEdit Named Views Opens the named views manager.\n\nToggle Named Views Panel Shows or hides that panel.\n\nSave View by Name Stores the current view under a name.\n\nRead Viewport Layout from File Loads a saved viewport arrangement.\n\nToggle View Projection Switches between parallel and perspective.\n\nSet 2 Point Perspective Keeps verticals vertical, as in product shots.","metadata":{"title":"View","section":"Standard views","url":"https://www.rhinoartisan.com/docs/7/tabs/view/#standard-views","source":"https://www.rhinoartisan.com/docs/7/tabs/view/#standard-views","collection":"docs7","hash":"a5f0b361b9e63ee27ae534a2a09c7af2","indexed_by":"docs-index"}},{"content":"View — Camera\n\nPlace Target Sets what the camera looks at.\n\nMove Target to Objects Points the camera at the selection.\n\nPlan View of CPlane Looks straight down on the construction plane.\n\nLook at Surface Aims the camera square at a surface.\n\nMatch Perspective Projection Matches this viewport's projection to another.","metadata":{"title":"View","section":"Camera","url":"https://www.rhinoartisan.com/docs/7/tabs/view/#camera","source":"https://www.rhinoartisan.com/docs/7/tabs/view/#camera","collection":"docs7","hash":"7f1e112076d006168a65c24325333de7","indexed_by":"docs-index"}},{"content":"View — CPlane views\n\nBottom of CPlane Bottom view relative to the construction plane.\n\nTop of CPlane Top view relative to the construction plane.\n\nFront of CPlane Front view relative to the construction plane.\n\nBack of CPlane Back view relative to the construction plane.\n\nRight of CPlane Right view relative to the construction plane.\n\nLeft of CPlane Left view relative to the construction plane.","metadata":{"title":"View","section":"CPlane views","url":"https://www.rhinoartisan.com/docs/7/tabs/view/#cplane-views","source":"https://www.rhinoartisan.com/docs/7/tabs/view/#cplane-views","collection":"docs7","hash":"67968f16e6e640c8073d72b037a4c6cd","indexed_by":"docs-index"}},{"content":"View — Look around\n\nLook Left Turns the camera left on the spot.\n\nLook Right Turns the camera right on the spot.\n\nLook Up Tilts the camera up.\n\nLook Down Tilts the camera down.\n\nTurntable and lens\nTurntable Spins the model continuously, to inspect it.\n\nSet Rotate Increment Sets how far each rotate step turns.\n\nLens Length Sets the camera lens, which changes the perspective.\n\n17 mm\n\n25 mm\n\n50 mm\n\n100 mm\n\nSet Lens Length\n\nEvery command here is Rhino's own viewport toolset, gathered into one tab. A long lens (100 mm) flattens perspective and suits presentation shots; a short one (17 mm) exaggerates it.","metadata":{"title":"View","section":"Look around","url":"https://www.rhinoartisan.com/docs/7/tabs/view/#look-around","source":"https://www.rhinoartisan.com/docs/7/tabs/view/#look-around","collection":"docs7","hash":"d22934716730ba7efff63c1c8354a65b","indexed_by":"docs-index"}},{"content":"Technical Documentation\n\nA design nobody can read is a design nobody can make. This is the paperwork side of RhinoArtisan: the report sheet a client signs off, the gem and metal lists the setter and the caster work from, the cost breakdown, and the dimensioned drawing the bench needs.\n\nYou will find these commands in the ribbon's Drafting tab. Seven groups, left to right.","metadata":{"title":"Technical Documentation","url":"https://www.rhinoartisan.com/docs/7/tech-docs/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/","collection":"docs7","hash":"0ad3d1cbbb497fb70b1d82295f93dc50","indexed_by":"docs-index"}},{"content":"Technical Documentation — Report and layout\n\nReport The report panel: the whole document in one place.\n\nLayout The page the drawing is composed on.\n\nDetail A viewport on that page, each one showing the model from its own angle and scale.\n\nAdd Logo Your logo on the sheet.\n\nText Annotation text.\n\nGem maps\nGems Map The map for the whole piece — where every stone goes.\n\nGems Map by Selection The same for the stones you pick.","metadata":{"title":"Technical Documentation","section":"Report and layout","url":"https://www.rhinoartisan.com/docs/7/tech-docs/#report-and-layout","source":"https://www.rhinoartisan.com/docs/7/tech-docs/#report-and-layout","collection":"docs7","hash":"41fbf6ea452149fa3572fd320830717e","indexed_by":"docs-index"}},{"content":"Technical Documentation — Gem lists\n\nGem List Every stone in the model, by size and quantity.\n\nGems List by Selection\n\nGems List by Selection Groups\n\nGems List to Excel The same table as a spreadsheet.\n\nTo Excel by Selection\n\nTo Excel by Selection Groups\n\nMetal lists and templates\nMetals List The metals in the piece and how much of each.\n\nMetals List by Selection The same for what you pick.\n\nOpen Report Template Start from a report layout you saved.\n\nSave Report Template Save this layout so the next piece starts from it.","metadata":{"title":"Technical Documentation","section":"Gem lists","url":"https://www.rhinoartisan.com/docs/7/tech-docs/#gem-lists","source":"https://www.rhinoartisan.com/docs/7/tech-docs/#gem-lists","collection":"docs7","hash":"031277a4fe5090461f57904213f40b53","indexed_by":"docs-index"}},{"content":"Technical Documentation — Breakdowns\n\nBreakdown Metals What metal the piece uses, and what it costs.\n\nBreakdown Gems The same for the stones.\n\nBreakdown Processes The bench work the piece needs.\n\nBreakdown Extras Anything else that lands on the invoice.\n\nDimensions\nLinear Dimension Distance between two points.\n\nHorizontal Dimension Width, measured along the X axis.\n\nVertical Dimension Height, measured along the Y axis.\n\nAligned Dimension True distance along a slanted feature.\n\nRotated Dimension Distance along an axis you set by angle.\n\nAngle Dimension The opening between two directions, in degrees.\n\nRadial Dimension The radius of an arc or circle.\n\nDiameter Dimension The full width of a circle through its center.\n\nCenter Mark A cross marking the center of a curve.\n\nCurve Dimension The length of a curve.\n\nVolume Dimension The volume of a solid.\n\nDimensions by Box The bounding box of the piece, dimensioned.\n\nDimensions for Ring The measurements a ring is judged by.\n\nDimensions for Bangle The same for a bangle.\n\nReduce Dimensions Shrink the dimensions to declutter a crowded drawing.\n\nReduce by Selection\n\nRestore Dimensions Put them back to full size.\n\nRestore by Selection","metadata":{"title":"Technical Documentation","section":"Breakdowns","url":"https://www.rhinoartisan.com/docs/7/tech-docs/#breakdowns","source":"https://www.rhinoartisan.com/docs/7/tech-docs/#breakdowns","collection":"docs7","hash":"c03df19584d08db3a0a00fa65fcd70e9","indexed_by":"docs-index"}},{"content":"Technical Documentation — Drawing and sections\n\nHatch Fill a closed region with a pattern.\n\nSet Line Type Dashed, dotted, centre lines.\n\nMake 2D Flatten the model into 2D curves from the current view.\n\nAnnotate Dot A numbered dot that stays readable at any zoom.\n\nClipping Sections Cut the model with a plane to show what is inside.\n\nExtract Line Type Segments Turn a dashed line into its individual segments.\n\nThe breakdowns read the setup in Breakdown Settings. The individual dimension commands are Rhino's, gathered here; everything else on this tab is RhinoArtisan's own.","metadata":{"title":"Technical Documentation","section":"Drawing and sections","url":"https://www.rhinoartisan.com/docs/7/tech-docs/#drawing-and-sections","source":"https://www.rhinoartisan.com/docs/7/tech-docs/#drawing-and-sections","collection":"docs7","hash":"1635f8eca83dd5e201d1522d06a0f8cd","indexed_by":"docs-index"}},{"content":"Detail — Detail\n\nDetail places a new detail viewport on the current layout — a framed window into the model, with its own view angle and scale, that you draw as a rectangle on the sheet.\n\nA Report sheet starts with the four main views, but some pieces need more: a close-up of the setting, an extra angle on the gallery, a section. Each detail you add is independent — double-click inside it to set its own view, zoom, and display mode.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Detail","section":"Detail","url":"https://www.rhinoartisan.com/docs/7/tech-docs/add-details/#detail","source":"https://www.rhinoartisan.com/docs/7/tech-docs/add-details/#detail","collection":"docs7","hash":"cb30869cc4378c7f0f852363c37db93f","indexed_by":"docs-index"}},{"content":"Add Logo — Add Logo\n\nThis command allows us to add our logo to the Report command. As shown in the image below, the default logo is from 2Shapes, but we recommend adding your own.\n\nOnce you have run this command, you will be asked to select which objects you want to use as a logo. A scaled and centered copy of the selection is exported as `logo.3dm` into your User Folder; your original objects in the model are left untouched.\n\nThe ideal logo format is vectorial, such as SVG or Illustrator. If you don’t have a logo in these formats, you can create one from scratch, draw it directly, or vectorize an image using raster-to-vector command.","metadata":{"title":"Add Logo","section":"Add Logo","url":"https://www.rhinoartisan.com/docs/7/tech-docs/add-logo/#add-logo","source":"https://www.rhinoartisan.com/docs/7/tech-docs/add-logo/#add-logo","collection":"docs7","hash":"0e5d7f9d2956a2e51a4a8d02ac74ba7a","indexed_by":"docs-index"}},{"content":"Breakdown Extras — Breakdown Extras\n\nBreakdown Extras writes the extras into the viewport as a text block: run the command, pick a point, and the table is placed there — everything else that lands on the invoice beyond metal, stones, and bench work.\n\nThe figures come from the setup in Breakdown Details, so the text always matches the pricing side of the document.\n\nSee also Breakdown Metals, Breakdown Gems and Breakdown Processes for the other parts of the cost.","metadata":{"title":"Breakdown Extras","section":"Breakdown Extras","url":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-extras/#breakdown-extras","source":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-extras/#breakdown-extras","collection":"docs7","hash":"9dcbc33c061fe991c8d7a89b55e0d1da","indexed_by":"docs-index"}},{"content":"Breakdown Gems — Breakdown Gems\n\nBreakdown Gems writes the gemstone cost breakdown into the viewport as a text block: run the command, pick a point, and the table is placed there — the stones classified by type, size, and quantity, with their cost.\n\nThe figures come from the setup in Breakdown Details, so the text always matches the pricing side of the document. For a table of the stones without costs, use Gems List instead.\n\nSee also Breakdown Metals, Breakdown Processes and Breakdown Extras for the other parts of the cost.","metadata":{"title":"Breakdown Gems","section":"Breakdown Gems","url":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-gems/#breakdown-gems","source":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-gems/#breakdown-gems","collection":"docs7","hash":"1521f11b49e33a09b0f2e688f07c4cd5","indexed_by":"docs-index"}},{"content":"Breakdown Metals — Breakdown Metals\n\nBreakdown Metals writes the metal cost breakdown into the viewport as a text block: run the command, pick a point, and the table is placed there — each metal in the piece with its weight and cost, ready to sit on the report sheet next to the drawing.\n\nThe figures come from the setup in Breakdown Details: the metals it lists and the prices it applies are the ones configured there, so the text always matches the pricing side of the document.\n\nSee also Breakdown Gems, Breakdown Processes and Breakdown Extras for the other parts of the cost.","metadata":{"title":"Breakdown Metals","section":"Breakdown Metals","url":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-metals/#breakdown-metals","source":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-metals/#breakdown-metals","collection":"docs7","hash":"040d4b146dc4ff4df94fe9e72e020db2","indexed_by":"docs-index"}},{"content":"Breakdown Processes — Breakdown Processes\n\nBreakdown Processes writes the bench work into the viewport as a text block: run the command, pick a point, and the table is placed there — the processes the piece needs (casting, setting, polishing…) with their cost.\n\nThe figures come from the setup in Breakdown Details, so the text always matches the pricing side of the document.\n\nSee also Breakdown Metals, Breakdown Gems and Breakdown Extras for the other parts of the cost.","metadata":{"title":"Breakdown Processes","section":"Breakdown Processes","url":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-processes/#breakdown-processes","source":"https://www.rhinoartisan.com/docs/7/tech-docs/breakdown-processes/#breakdown-processes","collection":"docs7","hash":"d3afe7e92a88392734ab91912914e6f1","indexed_by":"docs-index"}},{"content":"Clipping Sections — Clipping Sections\n\nThe ClippingSections command creates clipping planes that cut through selected objects with settings to define direction, depth, label, and save section views as Named Views.\n\n#### Steps\n\n1. Select objects to clip (press Enter to section through all objects).\n2. Place one or more clipping sections in viewports.\n\nDuring placement, the clipping widget turns red if it does not intersect eligible objects' overall bounding box in World coordinates.\n\nCommand-line options for each clipping section can be set before placing it.","metadata":{"title":"Clipping Sections","section":"Clipping Sections","url":"https://www.rhinoartisan.com/docs/7/tech-docs/clipping-sections/#clipping-sections","source":"https://www.rhinoartisan.com/docs/7/tech-docs/clipping-sections/#clipping-sections","collection":"docs7","hash":"d964d07a6eedf4d009b0b3c338e36f05","indexed_by":"docs-index"}},{"content":"Clipping Sections — Command-line options\n\nDir: Sets the clipping section direction.\n\nCPlane : The clipping section is parallel to the current CPlane.\n\nX : The clipping section is vertical to the current CPlane and parallel to the X-axis.\n\nY : The clipping section is vertical to the current CPlane and parallel to the Y-axis.\n\nCustom : The clipping section is vertical to the current CPlane and parallel to the direction defined by two points.\n\nCustomDepth\n\nWhen set to No, the clipping plane depth is infinite. If set to Yes, the Depth option appears at the command line, allowing the user to set the depth.\n\nDepth: Defines the thickness of the visible portion of the clipped object. The default depth is zero.\n\nClip: This option enables or disables clipping of the view that is active when the command starts. The views to be clipped can be set or modified at any time in the clipping plane properties.\n\nName: Sets the prefix used for the section names. Section names are incremented. For example, if you set the Name=SEC, sections are named SEC\\_01, SEC\\_02, SEC\\_03, etc.\n\nLabelMode: Sets how to display section names in viewports. The default label mode is Text.\n\n* None: Do not display the name.\n* Dot: Displays the name as a Dot.\n\nThere is no control over the font and size of the dot labels.\n\nText: Displays the name as Text near the direction indicators.\n\nThe text label size is proportional to the widget size. The font of the current annotation style on Clipping Plane creation is applied.\n\nSaveToNamedView: Creates a named view that corresponds to a view of the section.\n\nNote: Sections placed in a perspective viewport will generate named views in perspective projections, not parallel ones.\n\nFlip: Swaps the clipping section direction.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Clipping Sections","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tech-docs/clipping-sections/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tech-docs/clipping-sections/#command-line-options","collection":"docs7","hash":"d98b2e1ee1a678d8a1141548ab0e6df5","indexed_by":"docs-index"}},{"content":"Dimensions\n\nA dimension is a measurement written on the drawing itself: pick two points — or a curve, an angle, a solid — and the value appears where the bench can read it, updating if the model changes. These are Rhino's dimension commands, gathered on the Drafting tab; there is one for each kind of measurement, and the right choice depends on what you are measuring.\n\nIf you want a whole set of measurements placed in one go instead, use Dimensions by Box, Dimensions for Ring or Dimensions for Bangle.","metadata":{"title":"Dimensions","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/","collection":"docs7","hash":"8ccb1d1500320db948908d5561b3a48e","indexed_by":"docs-index"}},{"content":"Dimensions — Linear Dimension\n\nThe Dim command draws horizontal or vertical linear dimensions — the straight-line distance between two points, measured along the X or Y axis of the view. The everyday dimension for widths and heights on a technical drawing.\n\nFor more information, please refer to the Rhino documentation.\n\nHorizontal Dimension\nThe Dim command draws horizontal linear dimensions: the distance between two points measured along the X axis, whatever the direction between them. Use it for widths — the shank at its base, the head across the top view.\n\nSteps\n\n1. Start the command.\n2. Pick two points.\n3. Pick the third point to locate the dimension line.\n\nWhen the dimension text does not fit between the extension lines, you can place it on the left or right.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Linear Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#linear-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#linear-dimension","collection":"docs7","hash":"c28b054459a621b87a87666b53e75c65","indexed_by":"docs-index"}},{"content":"Dimensions — Vertical Dimension\n\nThe Dim command draws vertical linear dimensions: the distance between two points measured along the Y axis of the view. Use it for heights — the total height of the ring in a front view, or how far the stone rises above the band.\n\nSteps\n\n1. Start the command.\n2. Pick two points.\n3. Pick the third point to locate the dimension line.\n\nWhen the dimension text does not fit between the extension lines, you can place the dimension text on left or right.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Vertical Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#vertical-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#vertical-dimension","collection":"docs7","hash":"4fd9c6121c42411bf20e1d57a94a7d5f","indexed_by":"docs-index"}},{"content":"Dimensions — Aligned Dimension\n\nThe DimAligned command draws a linear dimension lined up with two points: instead of projecting onto an axis, it measures the real distance along the direction between them. The one to use for slanted features, such as the length of a shoulder or a tapered prong.\n\nSteps\n\n1. Start the command.\n2. Pick two points.\n3. Pick the third point to locate the dimension line.\n\nWhen the dimension text does not fit between the extension lines, you can place the dimension text on left or right.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Aligned Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#aligned-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#aligned-dimension","collection":"docs7","hash":"ce8f089d991df255b8fc3d85fa9fe108","indexed_by":"docs-index"}},{"content":"Dimensions — Rotated Dimension\n\nThe DimRotated command draws a linear dimension rotated from the xy-axis: you set the angle of the dimension line first, and the distance is measured along that direction. Useful when several measures must follow the same inclined axis of the design.\n\nSteps\n\n1. Start the command.\n2. Enter a number to set the rotation angle of the dimension line.\\ The rotation angle can also be set by picking two points.\n3. Pick two points.\n4. Pick the third point to locate the dimension line.\\ When the dimension text does not fit between the extension lines, you can place it on the left or right side.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Rotated Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#rotated-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#rotated-dimension","collection":"docs7","hash":"ae7636c3e6030876e3a8be494133db83","indexed_by":"docs-index"}},{"content":"Dimensions — Angle Dimension\n\nThe DimAngle command dimensions the angle of an arc, or between two selected lines, or from three points — the opening between two directions, in degrees. In jewelry it answers questions like how much a prong leans or how wide a bypass opens.\n\nSteps\n\n1. Select an arc or select two lines, polyline segments, linear surfaces, or poly surface edges.\n2. Pick the dimension location.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Angle Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#angle-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#angle-dimension","collection":"docs7","hash":"3c227b138c61507450a2841837ad854f","indexed_by":"docs-index"}},{"content":"Dimensions — Radial Dimension\n\nThe DimRadius command dimensions the radius of an arc or circle — the distance from the center to the edge, the measure a goldsmith needs for every fillet and bend. Dimensions always measure like the object was projected to the current construction plane.\n\nSteps\n\n1. Select a curve\n2. Pick a dimension location\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Radial Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#radial-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#radial-dimension","collection":"docs7","hash":"bce1fb79081aa1a6c6612790c80ec23b","indexed_by":"docs-index"}},{"content":"Dimensions — Diameter Dimension\n\nThe DimDiameter command dimensions the diameter of a selected curve — the full width of a circle through its center. The natural dimension for the finger size circle and for round stones.\n\nSteps\n\n1. Select a curve.\n2. Pick the dimension location.\\ Dimensions always measure like the object was projected to the current construction plane.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Diameter Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#diameter-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#diameter-dimension","collection":"docs7","hash":"b8a37b4766185de15650da5466577c67","indexed_by":"docs-index"}},{"content":"Dimensions — Center Mark\n\nThe Centermark command draws a cross or cross and centre lines at the centre point of a curve — it does not measure anything, it marks where the center is, which is exactly what the setter needs to locate drill positions. The size and style of the center mark are controlled by the Annotation Style and the Centermark properties.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Center Mark","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#center-mark","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#center-mark","collection":"docs7","hash":"4b890a27f101374465a033358f1f6c4c","indexed_by":"docs-index"}},{"content":"Dimensions — Curve Dimension\n\nThe DimCurveLength command dimensions the length of a curve or edge — the true developed length following the curve, not the straight distance between its ends. This is the measure for how much wire or strip of metal a piece needs before bending.\n\nSteps\n\n1. Select a curve or an edge.\n2. Pick a starting point for the text or leader.\\ If the Leader option is used, continue to draw leader points for the Leader command.\\ The length of the curve is automatically entered.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Curve Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#curve-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#curve-dimension","collection":"docs7","hash":"d5a25320bdf2379828224e5b667c48f1","indexed_by":"docs-index"}},{"content":"Dimensions — Volume Dimension\n\nThe DimVolume command dimensions the volume of a closed extrusion, surface, poly surface, mesh, or SubD — the enclosed volume of the solid, which multiplied by the metal's density gives you its weight.\n\nSteps\n\n1. Select a closed extrusion, surface, polysurface, mesh, or SubD.\n2. Pick a starting point for the text or leader.\\ If the Leader option is used, continue to draw leader points for the Leader command.\\ The volume of the object is automatically entered.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Dimensions","section":"Volume Dimension","url":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#volume-dimension","source":"https://www.rhinoartisan.com/docs/7/tech-docs/dimensions/#volume-dimension","collection":"docs7","hash":"bf483753d4ac9f9f8eabf13deddb6bb0","indexed_by":"docs-index"}},{"content":"Extract Line Type Segments — Extract Line Type Segments\n\nThe ExtractLineTypeSegments command converts line type patterns of the selected curves to curve segments and points.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Extract Line Type Segments","section":"Extract Line Type Segments","url":"https://www.rhinoartisan.com/docs/7/tech-docs/extract-line-type-segments/#extract-line-type-segments","source":"https://www.rhinoartisan.com/docs/7/tech-docs/extract-line-type-segments/#extract-line-type-segments","collection":"docs7","hash":"108dd3af6a30bcf0a2e50a6f7d9db98c","indexed_by":"docs-index"}},{"content":"Gem List to Excel CSV — Gem List to Excel CSV\n\nExports the information of all the gems of the document into .csv format.&#x20;\n\nRun the command, and it will prompt you for the file name and the location where you want to save it. Each row lists a gem's shape, size (X and Y), carats per stone, quantity, and total carats for that group.\n\nThe save dialog offers two CSV formats: one using your system's regional decimal separator, and a \"Force Point as Decimal\" option that always writes decimals with a point, which is useful when the file will be opened on a system with a different regional format. The file is saved in CSV format, ideal for opening in Excel, Google Sheets, or any other spreadsheet application.","metadata":{"title":"Gem List to Excel CSV","section":"Gem List to Excel CSV","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gem-list-to-excel-csv/#gem-list-to-excel-csv","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gem-list-to-excel-csv/#gem-list-to-excel-csv","collection":"docs7","hash":"dce3f8ada2f3cac8426afe17efc03914","indexed_by":"docs-index"}},{"content":"Gems List by Selection\n\nThese two commands build the same gem list table as Gems List, but only for the gems you pick, instead of for the whole document. They live in the submenu of the Gems List button.\n\nGems List by Selection\nRun the command and Rhino asks you to select the gemstones to export. Anything in your selection that is not a diamond or a gemstone is simply ignored; if nothing valid is left, the command reports that no gemstones were found in the selection and stops.\n\nThen you are asked to click a point to add the gem list table, and the table is drawn from that point.\n\nIdentical gems are grouped into a single row. Two gems share a row when they have the same shape, the same material and the same X and Y sizes (within 0.005 mm), and rows are sorted from the smallest to the largest size. Each row shows:\n\n- Shape (ROUND, MARQUISE, PEAR…)\n- Size, as `X x Y`\n- Weight of one gem, in carats\n- Quantity\n- Total carats for the row\n- Material (Diamond, Sapphire…)\n\nFor round diamonds the carat weight comes from the commercial round-brilliant chart rather than from the volume of the mesh, so the totals match what a stone supplier would quote.\n\nAll the text objects are drawn in black and added to a Rhino group named `GEMS_LIST`, so you can move or scale the whole table with the Gumball. You can edit any value by double-clicking on the text.","metadata":{"title":"Gems List by Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-by-selection/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-by-selection/","collection":"docs7","hash":"444b101d30e4747461c3bfe8fcca7af0","indexed_by":"docs-index"}},{"content":"Gems List by Selection — Gems List by Selection Groups\n\nSame selection and same insertion point, but the result is split by Rhino group instead of being one single table.\n\nThe command looks at every Rhino group in the document and collects the selected gems belonging to it. Each group produces its own block: the group name in capitals as a header, followed by the gem rows of that group only. Blocks are stacked downwards from the picked point, separated by a blank line.\n\nSelected gems that do not belong to any group are collected in a final block headed Ungrouped.\n\nNote that a gem belonging to more than one Rhino group is counted in each of those groups, so the sum of the blocks can be larger than the number of gems you selected.\n\nThe whole result is added to a Rhino group named `GEMS_LIST_BY_SELECTION_GROUPS`.\n\nGoldsmith's Tip: Name your Rhino groups after the parts of the piece — *Halo*, *Shank*, *Side stones* — before running the Groups variant. The headers of the table then read as a setting sheet, and the setter knows exactly how many stones go into each area.","metadata":{"title":"Gems List by Selection","section":"Gems List by Selection Groups","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-by-selection/#gems-list-by-selection-groups","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-by-selection/#gems-list-by-selection-groups","collection":"docs7","hash":"bc04bba9e9c8341a08be8ec31d3f9362","indexed_by":"docs-index"}},{"content":"Gems List to Excel by Selection\n\nThese two commands export the gem list of a selection to a spreadsheet file instead of drawing it in the viewport. They live in the submenu of the Gems List to Excel button.\n\nGems List to Excel by Selection\nRun the command and Rhino asks you to select the gemstones to export. Objects that are not diamonds or gemstones are ignored; if the selection contains none, the command reports that no gemstones were found and stops.\n\nA Save as dialog then appears, pre-filled with the name of your Rhino file followed by *Gems Info*. The file type list offers two options:\n\n- CSV files — numbers are written using the decimal separator of your Windows regional settings.\n- CSV files Force Point as Decimal — numbers always use a point as decimal separator, which is what most non-local spreadsheets and production systems expect.\n\nThe exported file is a semicolon-separated CSV with one header row and one row per gem size:\n\n`Shape;Size X;Size Y;Carats;Quantity;Total Carats`\n\nAs in the viewport list, identical gems are merged into one row: same shape, same material and same X and Y sizes within 0.005 mm. Round diamonds are weighed with the commercial round-brilliant chart, so the carat totals match the ones shown by the Gems List table.","metadata":{"title":"Gems List to Excel by Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-to-excel-by-selection/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-to-excel-by-selection/","collection":"docs7","hash":"76fe9105c9e156730067954168b9b016","indexed_by":"docs-index"}},{"content":"Gems List to Excel by Selection — Gems List to Excel by Selection Groups\n\nSame selection and same save dialog, but the CSV is split by Rhino group.\n\nEach Rhino group that contains selected gems produces its own section: a line with the group name, then the `Shape;Size X;Size Y;Carats;Quantity;Total Carats` header, then the rows of that group, then a blank line. Selected gems that belong to no group are written in a last section headed Ungrouped Gems.\n\nA gem that belongs to more than one Rhino group appears in each of those sections, so read the sections as groups, not as a single running total.\n\nGoldsmith's Tip: Use the *Force Point as Decimal* option whenever the file leaves your workshop. A comma decimal separator is the most common reason a supplier's spreadsheet reads 1,50 ct as 150.","metadata":{"title":"Gems List to Excel by Selection","section":"Gems List to Excel by Selection Groups","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-to-excel-by-selection/#gems-list-to-excel-by-selection-groups","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list-to-excel-by-selection/#gems-list-to-excel-by-selection-groups","collection":"docs7","hash":"b1232adb2bd8edf370d57b9a6e9c8e37","indexed_by":"docs-index"}},{"content":"Gems List — Gems List\n\nGems List writes the stone table of the whole document into the scene: every gem's shape, material, dimensions, weight per stone in carats, quantity, and total carat weight — the list the setter and the buyer work from.\n\nRun the command and pick a point in the scene; the list is generated there. Scale and move it with the Gumball, and edit any text by double-clicking on it.\n\nTo list only part of the piece, use Gems List by Selection; to get the same table as a spreadsheet instead of text in the scene, use Gems List to Excel.","metadata":{"title":"Gems List","section":"Gems List","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list/#gems-list","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-list/#gems-list","collection":"docs7","hash":"e09982a202ff2d3caec7e9e9094e365a","indexed_by":"docs-index"}},{"content":"Gems Map by Selection — Gems Map by Selection\n\nThis command draws the same 2D gem map as Gems Map, but only for the gems you select, and with control over the plane the map is projected from.\n\nRun the command and Rhino asks you to select diamonds or gemstones. Whole groups can be picked in one click. Objects that are not gems are discarded, and if nothing valid remains a message reminds you that the selected objects must be gems.\n\nYou are then asked to click a point to add the gem list table. Before picking that point, the command line offers these options:\n\n- Scale — size factor applied to the map, default 2, between 0.01 and 10.\n- Projection — Planar (default) uses the position of each gem as it is; Spherical unrolls the gems around the world Z axis, which gives a much better result on curved surfaces such as a band or a bangle.\n- ExpandOverlapping — No by default. Set it to Yes to push overlapping outlines apart until they clear each other, keeping their relative arrangement.\n- ProjectionPlane — XY, ZX or YZ, the world plane the gems are flattened onto. While you cycle through the list a translucent pink plane preview is drawn in the viewport so you can see which one you are choosing.\n\nOnce you pick the point, each gem is drawn as its real outline, colored by size, with a hatch and its diameter written in the middle. The whole map is scaled by the Scale factor and centered on the point you picked.\n\nEverything is added to a Rhino group named `GEMS_MAP` and created as a single undo step, so you can move or scale the finished map with the Gumball, or undo it in one go.\n\nGoldsmith's Tip: On a ring, run the map with Projection = Spherical and ProjectionPlane = XY. The stones of the shank unroll into a flat strip at their real spacing, which is exactly the layout the setter needs at the bench.","metadata":{"title":"Gems Map by Selection","section":"Gems Map by Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-map-by-selection/#gems-map-by-selection","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-map-by-selection/#gems-map-by-selection","collection":"docs7","hash":"6e5730c4691046e6c4bc66cebb673ea0","indexed_by":"docs-index"}},{"content":"Gems Map — Gems Map\n\nGems Map draws a 2D map of every stone in the design — its outline in place and its weight in carats — so the drawing shows exactly where each gem goes. Gem setters love this tool.\n\nThere are three command-line options: Scale, Projection, and ExpandOverlapping. By default, the scale is set to 2, doubling the map's size (it can be set anywhere from 0.01 to 10). The projection can be Planar or Spherical: planar covers most cases, but on a piece where the stones wrap around a dome — like the model below — spherical gives the better result. ExpandOverlapping is off by default; turn it on to automatically push gem outlines that overlap in the 2D map apart from each other, so the map stays readable when stones sit close together.\n\nRun the command and pick a point in the scene; the map is generated there, and you can scale and move it with the Gumball.\n\nTo map only part of the piece, use Gems Map by Selection.","metadata":{"title":"Gems Map","section":"Gems Map","url":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-map/#gems-map","source":"https://www.rhinoartisan.com/docs/7/tech-docs/gems-map/#gems-map","collection":"docs7","hash":"2d25ed9cbb4dc69a624fbfb8c835dce8","indexed_by":"docs-index"}},{"content":"Generate Dimension from Bangle — Generate Dimension from Bangle\n\nGenerate Dimensions from Bangle extracts and displays the main dimensions of the selected bangle geometry.\n\nIt automatically detects and displays:\n\n* The width and height of the top and bottom sections\n* The width and height of the left and right sections\n* The overall width and overall depth of the piece\n\n#### Steps\n\n1. Select the bangle geometry (press Enter to confirm a pre-selection).\n2. Set the command-line options if needed, then confirm.","metadata":{"title":"Generate Dimension from Bangle","section":"Generate Dimension from Bangle","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-bangle/#generate-dimension-from-bangle","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-bangle/#generate-dimension-from-bangle","collection":"docs7","hash":"f132aacc12751502ea0b591be3be45ce","indexed_by":"docs-index"}},{"content":"Generate Dimension from Bangle — Command-line options\n\nOffset: Distance between the geometry and the dimension lines. Default is 2, adjustable from 0 to 100.\n\nBox: When set to Yes, also adds the bounding box as a solid to the document. Default is No.","metadata":{"title":"Generate Dimension from Bangle","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-bangle/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-bangle/#command-line-options","collection":"docs7","hash":"cef955cb88e22250b161d66b4614c7f0","indexed_by":"docs-index"}},{"content":"Generate Dimension from Ring — Generate Dimension from Ring\n\nGenerate Dimension from Ring is a one-click tool that analyzes every object in the document and automatically generates the ring's key dimensions:\n\n* Ring size diameter\n* Width and height of the lower shank section\n* Height of the shank at mid-point\n* Width and height of the central motif (head)\n\nIt does not simply measure the overall bounding box: it locates the ring's finger size from the design's parametric data and derives the shank and head measurements from it, so the result stays meaningful regardless of the ring's design or style.","metadata":{"title":"Generate Dimension from Ring","section":"Generate Dimension from Ring","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-ring/#generate-dimension-from-ring","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-ring/#generate-dimension-from-ring","collection":"docs7","hash":"bff23298c975f6985f4887541b396063","indexed_by":"docs-index"}},{"content":"Generate Dimension from Ring — What if I have an STL or imported ring?\n\nIf the Outliner panel does not contain ring size information—because the design wasn’t created with the Shanks commands or was imported—you can still use this tool. Just create the inner sizing curve of the ring with the Curve tool in the Shanks toolbar. This curve lets the system identify the ring size and extract all related dimensions.","metadata":{"title":"Generate Dimension from Ring","section":"What if I have an STL or imported ring?","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-ring/#what-if-i-have-an-stl-or-imported-ring","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimension-from-ring/#what-if-i-have-an-stl-or-imported-ring","collection":"docs7","hash":"ac30cd6dbfc0a5d1ec14eebbcc5ae4e9","indexed_by":"docs-index"}},{"content":"Generate Dimensions By Box — Generate Dimensions by Box\n\nGenerate Dimensions by Box extracts and displays the main overall dimensions of the selected objects by using their combined bounding box. It provides the width, length, and height of the selection, regardless of the type of jewel or object.\n\nIt’s especially useful when you need to quickly understand the size of a piece for presentation, packaging, or volume estimation, without requiring specific structural data.\n\n#### Steps\n\n1. Select the objects to dimension (press Enter to confirm a pre-selection).\n2. Set the command-line options if needed, then confirm.","metadata":{"title":"Generate Dimensions By Box","section":"Generate Dimensions by Box","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimensions-by-box/#generate-dimensions-by-box","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimensions-by-box/#generate-dimensions-by-box","collection":"docs7","hash":"16ca86c3f7f0fd3243e6a2e7ee6057ab","indexed_by":"docs-index"}},{"content":"Generate Dimensions By Box — Command-line options\n\nOffset: Distance between the geometry and the dimension lines. Default is 2, adjustable from 0 to 100.\n\nBox: When set to Yes, also adds the bounding box as a solid to the document. Default is No.","metadata":{"title":"Generate Dimensions By Box","section":"Command-line options","url":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimensions-by-box/#command-line-options","source":"https://www.rhinoartisan.com/docs/7/tech-docs/generate-dimensions-by-box/#command-line-options","collection":"docs7","hash":"42769e4f47418ab6ad29afabc6d0d565","indexed_by":"docs-index"}},{"content":"Hatch and Line Type\n\nThe two commands that give a 2D drawing its drafting conventions: hatching to show solid metal in a section, and line types to tell a visible edge from a hidden one. Both are Rhino commands, gathered on the Drafting tab.\n\nHatch\nHatch runs Rhino's *Hatch* command and fills closed planar curves with a pattern: select the boundary curves, then choose the pattern, scale, and rotation in the hatch dialog.\n\nOn a jewelry drawing its main job is the cut section — the diagonal lines that mark where the metal is solid. Hatch the section curves you get from Clipping Sections or Make 2D, and the drawing reads at a glance.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Hatch and Line Type","url":"https://www.rhinoartisan.com/docs/7/tech-docs/hatch-and-line-type/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/hatch-and-line-type/","collection":"docs7","hash":"457ae39e1aa6b78c3742e57cf16f0ff7","indexed_by":"docs-index"}},{"content":"Hatch and Line Type — Set Line Type\n\nSet Line Type runs Rhino's *SetLinetype* command and assigns a line type to the selected curves: select them, then pick a linetype — dashed, dotted, center, hidden — from the list.\n\nThis is how a flat Make 2D drawing gets its conventions: hidden edges dashed, symmetry axes as center lines. The line type is a display property of the curve — if you need the dashes as real, separate curves, use Extract Line Type Segments.\n\nFor more information, please refer to the Rhino documentation.\n\nGoldsmith's Tip: Keep hatching for sections only. A drawing where every closed region is filled reads slower, not faster — one 45° hatch on the cut metal and dashed lines for hidden edges are all the convention a bench needs.","metadata":{"title":"Hatch and Line Type","section":"Set Line Type","url":"https://www.rhinoartisan.com/docs/7/tech-docs/hatch-and-line-type/#set-line-type","source":"https://www.rhinoartisan.com/docs/7/tech-docs/hatch-and-line-type/#set-line-type","collection":"docs7","hash":"82d44bae0e62e7ae1b7d6448c5fafe6a","indexed_by":"docs-index"}},{"content":"Layout — Layout\n\nLayout creates a new layout page — the sheet of paper your drawing is composed on, and what ends up printed or exported as a PDF. It runs Rhino's *Layout* command: you give the page a name, a size, and how many detail viewports it should start with, and the new page appears as a tab at the bottom of the modeling area, next to the viewport tabs.\n\nThe model and the sheet live in different spaces. In the model viewports you work in real millimeters; on a layout you arrange details — framed views of that same model, each with its own angle and scale — together with everything that belongs on paper: dimensions, notes, the title block, your logo. Change the model and every detail on every layout updates with it.\n\nOn a layout you can:\n\n* Place one or more details with the Detail command, each at its own scale.\n* Annotate the sheet with dimensions, text and dots, and your logo.\n* Print the page or export it as a PDF at the exact paper size you chose.\n\nFor more information, please refer to the Rhino documentation.\n\nGoldsmith's Tip: You rarely need to build a sheet from a blank page — the Report command creates a fully arranged layout in one click. Reach for Layout when you want a custom sheet, and save the result as a report template so the next piece starts from it.","metadata":{"title":"Layout","section":"Layout","url":"https://www.rhinoartisan.com/docs/7/tech-docs/layout/#layout","source":"https://www.rhinoartisan.com/docs/7/tech-docs/layout/#layout","collection":"docs7","hash":"e56530c1dad84db17c21323e8a64c062","indexed_by":"docs-index"}},{"content":"Make 2D — Make 2D\n\nMake 2D runs Rhino's *Make2D* command: it flattens the model into 2D curves — edges and outlines — projected from the current view, in one or four views, on the World Top plane. Select the objects, then choose the view layout and whether hidden lines are included.\n\nThe result is the raw material of a line drawing: give the hidden edges a dashed line type and hatch the sections, and the flat curves become a technical drawing.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Make 2D","section":"Make 2D","url":"https://www.rhinoartisan.com/docs/7/tech-docs/make-2d/#make-2d","source":"https://www.rhinoartisan.com/docs/7/tech-docs/make-2d/#make-2d","collection":"docs7","hash":"e3fe9a1d9e087b87a25a5cc17ebb5fde","indexed_by":"docs-index"}},{"content":"Metals List By Selection — Metals List By Selection\n\nThe Metals List By Selection command works the same way as Metals List, but only calculates the weight of the objects you select (Breps, extrusions, meshes, and SubDs — gems and diamonds are ignored) instead of every solid object in the document.\n\nWhen the command is activated, RhinoArtisan prompts you to select the objects whose weight needs to be calculated. After making a selection, a checklist appears with the available metals, letting you choose the ones to calculate. Once the metals are selected, you specify a point in the modelling viewport or inside an open Report where the calculated weights will be written as text.","metadata":{"title":"Metals List By Selection","section":"Metals List By Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list-by-selection/#metals-list-by-selection","source":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list-by-selection/#metals-list-by-selection","collection":"docs7","hash":"261128631f440ef8ce09ae7c697a6ed5","indexed_by":"docs-index"}},{"content":"Metals List By Selection — How to Use\n\n* Select the objects in the viewport whose weight needs to be calculated.\n* Choose the desired metals from the checklist that appears.\n* Click a point in the viewport, or inside an open Report, to write the calculated weights there.\n\nAdvantages\n* Calculates the weight of only the selected elements, rather than everything in the document.\n* Lets you choose from a wide range of metals — gold in several karats and colors, gold chocolate, platinum, silver, palladium, and wax — for precise weight estimations.\n* For each metal, writes both the raw weight and a Processed weight (after subtracting the configured finishing loss percentage).\n* Speeds up the workflow by focusing on specific elements rather than the entire model.\n\nThis command is particularly useful for analyzing individual design components, providing accurate weight information for selected elements, and integrating data efficiently into project documentation.","metadata":{"title":"Metals List By Selection","section":"How to Use","url":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list-by-selection/#how-to-use","source":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list-by-selection/#how-to-use","collection":"docs7","hash":"6e1fbd6dd05878865d605a91c82c67f2","indexed_by":"docs-index"}},{"content":"Metals List — Metals List\n\nThe Metals List command calculates the weight of every solid object in the document (Breps, extrusions, meshes, and SubDs — gems and diamonds are ignored) and writes the result as text.\n\nWhen activated, it displays a checklist of available metals, letting you choose one or more to calculate:\n\nThe list includes 24k gold, yellow/white/rose/green gold in several karats (22k, 18k, 14k, 10k, 9k), gold chocolate, platinum, silver, palladium, and wax.\n\nAfter you pick the metals, you are asked to click a point — either in the modelling viewport or inside an open Report — where the calculated weights will be written as text.\n\nFor each selected metal, two weight columns are written: the raw weight, and a Processed weight that subtracts the finishing/polishing loss percentage configured in the plugin options. This tool ensures that the chosen materials are clearly documented, facilitating both internal workflow and client communication.","metadata":{"title":"Metals List","section":"Metals List","url":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list/#metals-list","source":"https://www.rhinoartisan.com/docs/7/tech-docs/metals-list/#metals-list","collection":"docs7","hash":"2ebf409d6f1284a7f68c2f3ce3f3b9fd","indexed_by":"docs-index"}},{"content":"Reduce and Restore Dimensions\n\nMetal shrinks when it is cast, so a technical drawing often has to show the value *before* shrinkage rather than the value measured on the 3D model. These two commands change the number a dimension displays without touching its geometry: the dimension keeps pointing at exactly the same points, only its text is overridden.\n\nBoth come as a main command that works on the whole document and a *by Selection* variant in their submenu. Angular dimensions are never modified — only distance dimensions.","metadata":{"title":"Reduce and Restore Dimensions","url":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/","collection":"docs7","hash":"73a78030a52adb25f0895d1c00502329","indexed_by":"docs-index"}},{"content":"Reduce and Restore Dimensions — Reduce Dimensions\n\nRun the command and Rhino asks for the percentage to reduce dimension values, default 5, between 0 and 100. Every visible distance dimension in the document that still shows its real measured value is then rewritten with the reduced number, rounded to two decimals.\n\nDimensions whose value has already been overridden — either by a previous run of this command or by hand — are left untouched. The command line reports how many dimensions were reduced and how many were skipped for that reason, which prevents reducing the same drawing twice by mistake.","metadata":{"title":"Reduce and Restore Dimensions","section":"Reduce Dimensions","url":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#reduce-dimensions","source":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#reduce-dimensions","collection":"docs7","hash":"7bae410f48d1f1790df3f6e825fe7b37","indexed_by":"docs-index"}},{"content":"Reduce and Restore Dimensions — Reduce Dimensions by Selection\n\nSame behaviour, but you are first asked to select dimensions. Preselection is honored and whole groups can be picked. The percentage is asked afterwards and applied only to what you selected.\n\nRestore Dimensions\nUndoes the override. Every visible distance dimension in the document that is showing an overridden number goes back to displaying its real measured value, and will keep updating with the geometry again. Dimensions that already show their real value are left alone. The command line reports how many were restored.","metadata":{"title":"Reduce and Restore Dimensions","section":"Reduce Dimensions by Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#reduce-dimensions-by-selection","source":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#reduce-dimensions-by-selection","collection":"docs7","hash":"6635f11e9134ecb95ff1009d55c127c9","indexed_by":"docs-index"}},{"content":"Reduce and Restore Dimensions — Restore Dimensions by Selection\n\nSame as above, restricted to the dimensions you select.\n\nGoldsmith's Tip: Reduce is a display override, not a model change. Restore the drawing before you measure or edit the model again, so the numbers on the plan and the geometry never disagree.","metadata":{"title":"Reduce and Restore Dimensions","section":"Restore Dimensions by Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#restore-dimensions-by-selection","source":"https://www.rhinoartisan.com/docs/7/tech-docs/reduce-and-restore-dimensions/#restore-dimensions-by-selection","collection":"docs7","hash":"80b68e121b2809460a07aa5a0a11cf59","indexed_by":"docs-index"}},{"content":"Report Panel — Report Panel\n\nThe Report Panel provides a complete report with all the details of the design created in RhinoArtisan.\n\nEntering Data\nWhen opening the Report Panel, you can enter key information such as:\n\n* Client Id\n* PO\n* Style\n* CAD Designer\n* Description\n\nAll these details will be included in the final report.","metadata":{"title":"Report Panel","section":"Report Panel","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#report-panel","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#report-panel","collection":"docs7","hash":"f987418c28e7f56b52ebd7c300f7aafa","indexed_by":"docs-index"}},{"content":"Report Panel — Template Selection\n\nIn the Templates section of the panel, you can choose between the default templates. Later, we will see how to customize them or create new ones according to our needs.\n\nBelow the template selector, a Gem Map Projection option lets you choose between Planar and Spherical. This controls how the gem map is drawn when a template includes the `[GEM_MAP]` tag.","metadata":{"title":"Report Panel","section":"Template Selection","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#template-selection","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#template-selection","collection":"docs7","hash":"68bfc9328fdf4ea49dbb1c8907103d40","indexed_by":"docs-index"}},{"content":"Report Panel — Generating the Report\n\nAt the top of the panel, there is a Create button. When activated, it will generate a report based on the selected template. This report will include:\n\n* The data entered in the panel\n* Views of the design\n* Design details, including the weight of the metals used","metadata":{"title":"Report Panel","section":"Generating the Report","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#generating-the-report","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#generating-the-report","collection":"docs7","hash":"cedff89c8744f0dc7e79a2215c92ffb9","indexed_by":"docs-index"}},{"content":"Report Panel — Creating My Own Templates\n\nIn RhinoArtisan, we can build our own report template by modifying an existing one or creating a completely new one. Below are the steps to create a template from scratch.\n\n#### Accessing the Creation of a New Layout\n\nJust below the viewport, you will see four tabs labeled Perspective, Top, Front, and Right, along with a + symbol. These tabs serve as quick access buttons to activate a specific viewport when multiple views are open or to navigate between views when working with a single viewport.\n\nIf we click the + button, a dropdown menu will appear with different options, the first two being:\n\n* New Layout\n* Import Layout\n\n#### Creating a New Template\n\nWhen creating a new template and setting up views, it is advisable to have a model loaded in RhinoArtisan, such as a ring. This allows you to properly check the proportions and orientation of the views, ensuring a well-structured and visually accurate report.\n\nTo create a new template, select the New Layout option, which will open a small window where you can define:\n\n* Viewport name\n* Initial view (which can be modified later)\n* Default printer assignment (if the goal is to print the viewport content)\n* Size and orientation\n* Measurement units\n\nOnce these parameters are confirmed, a new viewport will be generated with the specified name and size, inside a gray background representing the print area.\n\n#### Customizing the Template\n\nIn this new viewport, you can:\n\n* Add multiple views\n* Modify existing views\n* Include report details\n\nBy default, the viewport will occupy almost the entire template space with a border frame. If you click on the frame, edit points will activate, allowing you to:\n\n* Resize the view by selecting and moving the edges of the frame.\n* Reposition the view by dragging it within the template.","metadata":{"title":"Report Panel","section":"Creating My Own Templates","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-my-own-templates","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-my-own-templates","collection":"docs7","hash":"a19c5366c4dcdc7ac781a96560419436","indexed_by":"docs-index"}},{"content":"Report Panel — Creating My Own Templates\n\nTo modify the viewport display:\n\n* Double-click inside the view to activate it as a normal viewport.\n* You can zoom in with the mouse wheel and change the display mode to Shaded, Rendered, Wireframe, etc.\n* Once adjusted, double-click anywhere outside the view to exit the edit mode.\n\n#### Copying and Editing Views\n\nTo create multiple views within the template:\n\n* Select the view frame to activate its editing mode.\n* Hold the ALT key and drag the view to duplicate it.\n* Reposition the copy within the template.\n* Enter the new view by double-clicking and modifying its settings (e.g., change to Perspective or adjust the display mode)","metadata":{"title":"Report Panel","section":"Creating My Own Templates","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-my-own-templates","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-my-own-templates","collection":"docs7","hash":"7a0f94423e2e71f9df7bbc94d8545150","indexed_by":"docs-index"}},{"content":"Report Panel — Adding Design Details to the Report\n\nWithin the template, we can draw boxes that will contain the information to be included in the report. These boxes can be placed anywhere within the template and serve as structured sections to organize design details such as:\n\n* Material specifications\n* Stone details (type, size, weight, etc.)\n* Technical notes\n* Branding or logos\n\nWe can incorporate all available information from the Technical Chart and the details we enter in the Report Panel. Each piece of information is inserted into the report template using predefined tags. We just have to write those tags using the text command that is in the Drafting menu and place them in the template.\n\nSome tags are list markers: when the report is generated, each one is deleted and replaced at its position with a full breakdown block (the same content the corresponding Breakdown command places in the viewport, or the gem map image):\n\n* \\[METAL\\_LIST] – List of metals used\n* \\[GEM\\_LIST] – List of gemstones included\n* \\[PROCESS\\_LIST] – List of processes involved\n* \\[EXTRA\\_LIST] – List of extra components\n* \\[GEM\\_MAP] – An image showing the distribution of the gems with color coding based on their sizes (Planar or Spherical, per the option above)\n\nThe rest are field tags: each one is replaced with a single value.\n\n* \\[DATE] – Report generation date\n* \\[DATE\\_TIME] – Report generation date and time\n* \\[DESIGN\\_TYPE] – Type of design (ring, earring, pendant…)\n* \\[PRODUCT\\_SIZE] – Finger size, for rings only\n* \\[METAL\\_TOTAL\\_COST] – Combined cost of all metals\n* \\[CLIENT\\_ID] – Client identification\n* \\[PO] – Purchase order number\n* \\[STYLE] – Design style\n* \\[CAD\\_DESIGNER] – CAD designer's name\n* \\[DESCRIPTION] – Description of the design","metadata":{"title":"Report Panel","section":"Adding Design Details to the Report","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#adding-design-details-to-the-report","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#adding-design-details-to-the-report","collection":"docs7","hash":"b2c729d6749588ce1d64b257f00ce880","indexed_by":"docs-index"}},{"content":"Report Panel — Adding Design Details to the Report\n\nFor each of the first three metal slots (1 to 3, in the order they appear in the breakdown), you can also use: **\\[METAL*n*\\_NAME], \\[METAL*n*\\_TOTAL\\_COST], \\[METAL*n*\\_WEIGHT], \\[METAL*n*\\_TOTAL\\_WEIGHT], \\[METAL*n*\\_PRICE], \\[METAL*n*\\_WASTE], \\[METAL*n*\\_WAX\\_WEIGHT], and \\[METAL*n*\\_ALLOY\\_COLOR] — for example \\[METAL1\\_WEIGHT].","metadata":{"title":"Report Panel","section":"Adding Design Details to the Report","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#adding-design-details-to-the-report","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#adding-design-details-to-the-report","collection":"docs7","hash":"2ea697cf04f05b4c322ad3d407620190","indexed_by":"docs-index"}},{"content":"Report Panel — Creating Custom Fields in the Report Panel\n\nWe can create new fields** in the Report Panel to add any additional information needed for a personalized report. To do this:\n\n* Click on the + symbol in the header of the Report Panel.\n* A prompt will appear asking for the name of the new field.\n* Once created, the field will appear in the details list of the panel.\n* Hovering the mouse over the title of the new field will display its tag (in brackets, e.g., \\[SUPERVISOR]), which can then be incorporated into the report template.\n* Right-clicking a field's title opens a context menu to Move Up, Move Down, or Delete it.\n\nOnce we have finished configuring our new template, it is advisable to remove the ring model used to check proportions and proceed to save the template. To ensure that it appears alongside the other templates when generating a report, we need to save it in our user folder using the Save Report Template command. To find the correct path, we can check it by accessing it from the File menu and clicking on the user folder icon. Once saved, the template appears immediately in the Templates list within the Report panel — no need to restart RhinoArtisan.\n\nThis way, you can create as many views as needed, adjust them, and customize them to suit your requirements, ensuring your report is clear and functional.","metadata":{"title":"Report Panel","section":"Creating Custom Fields in the Report Panel","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-custom-fields-in-the-report-panel","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-panel/#creating-custom-fields-in-the-report-panel","collection":"docs7","hash":"6dc99a178ebccc084b8f894d6cb2c616","indexed_by":"docs-index"}},{"content":"Report Templates\n\nA report template is an ordinary Rhino file (.3dm) stored in the Artisan report folder. The Report panel lists every .3dm found there by file name, and uses the one you choose as the layout of the report it generates. These two commands are how you add templates to that folder and how you open one again to edit it.\n\nBoth commands need the report folder to be defined; if it is not, the command line reports that the folder for the report templates has not been specified and nothing happens.","metadata":{"title":"Report Templates","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/","collection":"docs7","hash":"b3cc0b667195131525c39589b7dff8a2","indexed_by":"docs-index"}},{"content":"Report Templates — Save Report Template\n\nSaves the current Rhino document as a report template. A Save as dialog opens directly in the report folder, filtered to Rhino (*.3dm) files. Choose a name, and the document is saved there with Rhino's own *SaveAs*, which means you keep working on that file from then on.\n\nThe template list of the Report panel is refreshed immediately, so the new template can be picked without restarting Rhino.","metadata":{"title":"Report Templates","section":"Save Report Template","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/#save-report-template","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/#save-report-template","collection":"docs7","hash":"ca6c3c5d089e01631c819831ae13a56c","indexed_by":"docs-index"}},{"content":"Report Templates — Open Report Template\n\nOpens an existing template for editing. If the document you currently have open has unsaved changes, Artisan asks whether you want to save it first: answering Yes saves it and continues, answering No cancels the command, so you can never lose work by opening a template.\n\nAn Open dialog then appears in the report folder, again filtered to .3dm files, and the template you choose is opened as the current Rhino document. Edit its layout, then run Save Report Template — or Rhino's own Save — to store it back.\n\nGoldsmith's Tip: Keep one template per customer or per workshop format. Since the Report panel lists templates by file name, a clear name is all you need to pick the right sheet when the report is generated.","metadata":{"title":"Report Templates","section":"Open Report Template","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/#open-report-template","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report-templates/#open-report-template","collection":"docs7","hash":"118c1d00c9ee7959f177a49bed74fae8","indexed_by":"docs-index"}},{"content":"Report — Report\n\nReport builds the whole report sheet in one click: a new layout with four viewports — Top, Perspective, Front, and Side — each zoomed to the model and framed to fit the squares of the sheet. Double-click any viewport to change its display mode, angle, or zoom.\n\nThe title block fills itself in: the design's name, its weight, metal, and type (with finger size for rings), today's date, and the first 60 characters of the document's Notes if any are set. Every text on the sheet is an ordinary text object — double-click to edit. The logo in the lower-left corner is the default 2Shapes one until you replace it with Add Logo.\n\nFor more control over what goes on the sheet — choosing a saved template, entering client and design data — use the Report Panel, which generates the report from the template you pick.","metadata":{"title":"Report","section":"Report","url":"https://www.rhinoartisan.com/docs/7/tech-docs/report/#report","source":"https://www.rhinoartisan.com/docs/7/tech-docs/report/#report","collection":"docs7","hash":"1c4f7bbacfb8f740e6c61b769b538849","indexed_by":"docs-index"}},{"content":"Technical Chart — Technical Chart\n\nThe Technical Chart panel provides key details about our design created with RhinoArtisan.\n\nThe details are divided into four collapsible sections — each one only appears once the design has a cost for it:\n\nMetal\nThis section displays, per metal used in the design, its weight and geometry. Elements linked to the Metal 01 layer in our layer system will be assigned the first metal available in the Outliner panel, while elements within the Metal 02 layer will be assigned the second metal listed in the Outliner.\n\nThe provided information includes:\n\n* Net weight of the metal.\n* Waste, the loss weight computed from the loss percentage defined in Breakdown Settings.\n* Weight, the total weight including waste.\n* Wax weight, allowing quick conversion to another metal if needed.\n* Volume and surface area of the metal, useful for 3D printing according to Breakdown Settings configurations.","metadata":{"title":"Technical Chart","section":"Technical Chart","url":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#technical-chart","source":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#technical-chart","collection":"docs7","hash":"b4a7465602249ec53b1a1f27f9702a90","indexed_by":"docs-index"}},{"content":"Technical Chart — Gems\n\nThis section displays a list of diamonds used in the design, sorted by size. Each row shows the shape icon and lets you select the setting type (Prong, Pave, Channel, Flush, Bezel, Pressure, Wax, or Other) and the color coding (defined in the Artisan Options). Additionally, it details:\n\n* Number of stones per size.\n* Size of each stone.\n* Corresponding sieve.\n* Weight in carats (ct).","metadata":{"title":"Technical Chart","section":"Gems","url":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#gems","source":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#gems","collection":"docs7","hash":"638e16a28701f8f4b2c7657e7f93f5b8","indexed_by":"docs-index"}},{"content":"Technical Chart — Processes\n\nThis section provides information about the manufacturing and finishing processes required for the piece, per metal:\n\n* Printing size.\n* Finishing, selectable between None, Brushed, Sandblasted, Hammered, or Other.\n* Plating, selectable between None or Rhodium.\n\nBelow that, it lists the setting types used and the total number of stones per setting type (matching the choices made in the Gems section), plus additional processes: a free-form list of extra manufacturing steps you can add by name, with a right-click Delete on each and an Add… link at the bottom.","metadata":{"title":"Technical Chart","section":"Processes","url":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#processes","source":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#processes","collection":"docs7","hash":"b18981e5af056be4387d1ead707c1a44","indexed_by":"docs-index"}},{"content":"Technical Chart — Extras\n\nA separate section lists extra components, such as posts or pressure clasps for earrings. Like additional processes, it's a free-form list: add a component by name with the Add… link, and remove one with a right-click Delete.\n\nData Export\nThe Export button at the top of the panel saves the current breakdown as a file, in one of two formats:\n\n* Excel (.xlsx) – a structured spreadsheet, ideal for analysis, tracking, or additional calculations.\n* JSON (.json) – the full breakdown object, intended for integrations with external applications, automations, or backend processes.\n\nThe Assistant panel builds its own natural-language summary of the same breakdown data to answer pricing questions about your design — that isn't a file you export from here, it's context the AI reads directly.","metadata":{"title":"Technical Chart","section":"Extras","url":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#extras","source":"https://www.rhinoartisan.com/docs/7/tech-docs/technical-chart/#extras","collection":"docs7","hash":"c98ac4257b8d3f0166b2af18d48eddc6","indexed_by":"docs-index"}},{"content":"Text and Dots\n\nTwo ways to write on a drawing. Text is a real annotation object that lives on the sheet and scales with it; Annotate Dot is a marker that stays the same size on screen no matter how far you zoom. Both are Rhino commands, gathered here because a report sheet is rarely finished without a few words on it.","metadata":{"title":"Text and Dots","url":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/","source":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/","collection":"docs7","hash":"64b131625e83cc97140bbeed88dff5a8","indexed_by":"docs-index"}},{"content":"Text and Dots — Text\n\nText runs Rhino's *Text* command and creates two-dimensional rich text: type the note, set its font, height, and style, and pick where it goes. Rich text can be formatted word by word, like in a word processor, so a single note can mix bold and regular text.\n\nUse it for anything that belongs on the printed sheet — manufacturing notes, the finger size, a stone-setting instruction next to the head. The text blocks of a Report title block are ordinary text objects too: double-click any of them to edit.\n\nFor more information, please refer to the Rhino documentation.","metadata":{"title":"Text and Dots","section":"Text","url":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/#text","source":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/#text","collection":"docs7","hash":"91fd73b3c7bc67d1a9a5deb1de71464f","indexed_by":"docs-index"}},{"content":"Text and Dots — Annotate Dot\n\nAnnotate Dot runs Rhino's *Dot* command and draws an annotation dot in screen space: type the label, pick the location. Zooming or rotating the view never changes its size or orientation, and dots always draw in front of other objects, so they cannot hide behind the model.\n\nThat makes them the right tool for working notes — numbering stones while you discuss a design, flagging a prong that needs rework — rather than for the finished sheet.\n\nFor more information, please refer to the Rhino documentation.\n\nGoldsmith's Tip: If a note must be readable on paper, use Text; if it must be impossible to miss on screen, use a dot. Dots are easy to place and easy to delete, which makes them perfect for review comments that will never reach the final print.","metadata":{"title":"Text and Dots","section":"Annotate Dot","url":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/#annotate-dot","source":"https://www.rhinoartisan.com/docs/7/tech-docs/text-and-dots/#annotate-dot","collection":"docs7","hash":"1b20713a2ab723b2bee3fa1333db1f55","indexed_by":"docs-index"}},{"content":"Launcher\n\nThe Launcher is the app that opens RhinoArtisan in the RhinoArtisan interface. It's what starts when you click the RhinoArtisan icon on your desktop — see How to download, install and activate your license.\n\nBesides launching the program, it gathers a list of tools and links that can help you.\n\nWhich Rhino to run\nIf you have more than one version of Rhino installed, the dropdown in the centre is where you pick the one to use — for example RhinoArtisan 7.0 for Rhino 8. Choose it there and click LAUNCH.\n\nOur recommendation is to always use the newest Rhino, but if you'd rather run RhinoArtisan on an older one such as Rhino 7, you can.\n\nThe Launcher remembers your choice for next time.\n\nIf you don't touch anything, the Launcher opens RhinoArtisan on its own after 2 seconds. To change the version, use the dropdown before that.\n\nThe Launcher's own version is shown in the bottom-right corner of the window.","metadata":{"title":"Launcher","url":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/","source":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/","collection":"docs7","hash":"12d42b8562a415ec04547858fa8ae3c8","indexed_by":"docs-index"}},{"content":"Launcher — Account\n\nA direct link to your user account, where you can download the latest releases along with the other tools and assets available to you. You can also reach it at rhinoartisan.com/account.\n\nDocumentation\nOpens the RhinoArtisan documentation on the web — exactly the pages you're reading right now.\n\nTutorials\nA collection of step-by-step tutorials showing how the commands are applied in practice.\n\nThe two go together: the documentation answers your questions about one specific command, and the tutorials show you how to put it to work.","metadata":{"title":"Launcher","section":"Account","url":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#account","source":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#account","collection":"docs7","hash":"440a0fd9fdcb0c8d178729c1665a8917","indexed_by":"docs-index"}},{"content":"Launcher — Videos\n\nHours of RhinoArtisan content, split into sections and with a search box to find exactly what you're after — search for paves, for gemsetting, for whatever you're working on. See Videos.\n\nHow to learn?\nWhere all the training material lives, and above all the courses — organised by level, so you can pick the one that matches where you are.\n\nIf you're new, our recommendation is to start with Kickstart: From idea to Creation, which is free. It may feel a little basic if you're an experienced user, but it covers the concepts that matter in RhinoArtisan.","metadata":{"title":"Launcher","section":"Videos","url":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#videos","source":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#videos","collection":"docs7","hash":"929fdd9cef317861de72af527e57c23f","indexed_by":"docs-index"}},{"content":"Launcher — Support\n\nSupport is where we put a lot of our value, and answering you is genuinely a pleasure for us. Write to us through the contact form, or by email at support@rhinoartisan.com.\n\nWe do have a phone line for customers, but email is often easier for everyone: being able to look at the actual file behind the question makes a real difference.\n\nYou can also ask Paula, our AI agent, at rhinoartisan.com/ask — she answers straight away. She's still in testing, but our users love her.","metadata":{"title":"Launcher","section":"Support","url":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#support","source":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#support","collection":"docs7","hash":"d70d26f04118bcc35de7da0e69d0c35b","indexed_by":"docs-index"}},{"content":"Launcher — Diagnostics & Repair\n\nA tool that comes in very handy on occasion — above all when Rhino won't load a plugin, or when it's running slow.\n\nSome updates or plugins leave residual entries in Rhino's registry, which can lead to conflicts and unexpected behaviour. Over time those leftovers may interfere with newer versions of the software, or cause instability when loading third-party extensions.\n\nHow to run it:\n\n1. Open the Launcher and click Diagnostics & Repair, at the bottom of the sidebar.\n2. When asked _\"Do you want to clean Windows registry of Rhino and Artisan?\"_, answer Yes.\n3. When asked _\"Do you want to delete the Artisan user folder?\"_, answer Yes.\n4. When asked _\"Do you want to check your connection to the Artisan license server?\"_, answer Yes — this checks whether a firewall is blocking the license verification.\n\nOnce the process finishes, restart Rhino. It will launch as if it were a fresh installation, clearing any registry issues that were stopping the RhinoArtisan plugin from loading properly.\n\nStep 3 deletes the user folder, which is where your element libraries, rendering materials, textures and images live. Back it up first if you've customised anything.\n\nFor the whole troubleshooting path — checking your Rhino version, sending us your system information, and reinstalling Rhino — see Rhino doesn't load RhinoArtisan. What can I do? in the FAQ.","metadata":{"title":"Launcher","section":"Diagnostics & Repair","url":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#diagnostics--repair","source":"https://www.rhinoartisan.com/docs/7/user-interface/launcher/#diagnostics--repair","collection":"docs7","hash":"3754546505b71c35f768f4713d034625","indexed_by":"docs-index"}},{"content":"Middle Button\n\nBy pressing the wheel on your mouse, this window will be displayed. You will find convenient shortcuts to commonly used commands and features.\n\nClicking icons will execute the corresponding command or open related command groups.\n\nVisibility\n\n* Hide: Hides selected objects. More info\n* Show: Shows all hidden objects. More info\n* ShowSelected: Shows only selected hidden objects. More info\n* Select objects to hide: Choose objects to hide.\n* Invert Hide: Inverts the visibility of hidden and shown objects.\n\nLock\n\n* Lock objects: Locks selected objects. More info\n* Unlock Objects: Unlocks all locked objects. More info\n* Unlock selected: Unlocks only selected objects.\n* Isolate/Unisolate objects: Isolates the selected objects or returns them to the prior state. More info\n* Swap locked and unlocked objects: Switches the lock state between locked and unlocked objects. More info\n\nGroup\n\n* Group objects: Groups selected objects. More info\n* Ungroup objects: Ungroups selected objects. More info\n* Add to group: Adds objects to an existing group. More info\n* Remove from group: Removes objects from an existing group. More info\n* Set group name: Assigns a name to a selected group. More info\n\nViews\n\n* Set top view: Switches to top view. More info\n* Set bottom view: Switches to bottom view. More info\n* Set front view: Switches to front view. More info\n* Set left/right view: Switches to left or right view. More info\n* Set perspective view: Switches to perspective view. More info\n\nEdit\n\n* Trim/Untrim: Trims or restores edges on surfaces. More info\n* Split/Split surface by isocurve: Splits surfaces by isocurve. More info\n* Join/Join surfaces: Joins surfaces. More info\n* Explode/Extract surface: Explodes or extracts surfaces. More info\n\nSelection","metadata":{"title":"Middle Button","url":"https://www.rhinoartisan.com/docs/7/user-interface/middle-button/","source":"https://www.rhinoartisan.com/docs/7/user-interface/middle-button/","collection":"docs7","hash":"b1be92a630907ff8fdb12e6fff217271","indexed_by":"docs-index"}},{"content":"Middle Button\n\n* Select all: Selects all objects. More info\n* Select none: Deselects all objects. More info\n* Invert selection: Inverts the current selection. More info\n* Show last object: Displays the last hidden object.\n* Select previous selection: Recalls the last selection.\n* Select exact duplicate objects: Selects objects that are exact duplicates.\n* Select rectangle region: Selects objects within a rectangular region.\n\nSelect by attribute\n\n* Select by color: Selects objects by color.\n* Select by layer: Selects objects by their layer. More info\n* Select dots: Selects dot annotations.\n* Select dimensions/select text blocks: Selects dimensions or text blocks. More info\n* Select by lasso: Selects objects using a free-form lasso.\n* Select group: Selects grouped objects.\n* Select clipping plane in viewport: Selects the clipping plane in the viewport.\n\nSolids & Meshes\n\n* Select solids: Selects solid objects.\n* Select closed solids: Selects closed solids. More info\n* Select open solids: Selects open solids.\n* Select meshes: Selects mesh objects.\n* Select closed meshes: Selects closed meshes.\n* Select open meshes: Selects open meshes.\n* Select mirrored blocks: Selects mirrored block instances.\n\nGeometry\n\n* Select points: Selects point objects.\n* Select curves: Selects curve objects.\n* Select short curves: Selects short curves.\n* Select surfaces: Selects surface objects.\n* Select SubD: Selects SubD geometry.\n* Select faces to boundary: Selects faces within boundaries.\n* Select bad objects: Selects any invalid or problematic objects. More info\n\nFiles\n\n* Edit: Opens edit commands.\n* Undo: Reverses the last action.\n* Redo: Re-applies the last undone action.\n* New document: Creates a new document.&#x20;","metadata":{"title":"Middle Button","url":"https://www.rhinoartisan.com/docs/7/user-interface/middle-button/","source":"https://www.rhinoartisan.com/docs/7/user-interface/middle-button/","collection":"docs7","hash":"b5f16c5a004b3992d3f703519c9fef51","indexed_by":"docs-index"}},{"content":"Options\n\nRhinoArtisan adds its own branch to the Rhino Options window.\n\nTo open it, run the standard Rhino `Options` command, or click the Settings icon under the File tab of the ribbon.\n\nThe pages\nRhinoArtisan 7 groups its settings into one root page and eight sub-pages. The root page holds the settings that change how the interface behaves; each sub-page owns one area that grew big enough — or specialised enough — to deserve its own screen.\n\n| Page | What it covers |\n| --- | --- |\n| Artisan | Interface, viewport, weight and licence settings. |\n| Folders | Where RhinoArtisan reads and writes your files. |\n| Colors | Gem colours by size and the colours of the automatic layer structure. |\n| File Search | Which folders the semantic file search indexes. |\n| Time Tracking | The passive per-file timer. |\n| Custom Gem Weight | Your own gemstone weight table. |\n| Custom Metal List | Your own metals and densities. |\n| Integrations | External services: Nivoda, OpenRouter and fal.ai. |\n| Assistant | The Assistant's models, its daily spending limit and your company standards. |\n\nSome settings only take effect after restarting Rhino, because they are read once when the plugin loads. RhinoArtisan tells you with a message when that is the case — it happens with Ribbon: Hide Text on Buttons, Disable Viewport Toolbar, the Cloud Zoo licence option and any change to the folders.\n\nStudio tip: the settings worth agreeing on across a whole workshop are Wax Density, Processed Weight (%), the Custom Metal List and the Custom Gem Weight table. They are the four numbers every quote is built on — export them once and import them on every machine.","metadata":{"title":"Options","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/","collection":"docs7","hash":"482562dd83691984917dcb046d552512","indexed_by":"docs-index"}},{"content":"Artisan\n\nThe root page of the RhinoArtisan branch in Rhino Options. It gathers the settings you are most likely to change once, when you set up your machine the way you like it.\n\nInterface and viewport\n* Show Grid — draws the construction grid in the viewports. Enabled by default.\n* Real-Time Weight — draws a bubble in the viewport, pointing at the object, with its weight updated live as you model. Enabled by default. It exists so you can see a piece drifting over its target weight while you are still shaping it, instead of discovering it in the report.\n* Ribbon: Hide Text on Buttons — hides the caption under each ribbon icon. Disabled by default. Made for laptops and low-resolution screens, where the vertical space the ribbon takes matters more than the labels. Requires a restart.\n* Disable Viewport Toolbar — turns off the floating toolbar that RhinoArtisan draws over the viewport. Disabled by default. Useful if you already work with Rhino's own toolbars and want the viewport clean. Requires a restart.","metadata":{"title":"Artisan","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/","collection":"docs7","hash":"9408c8519ce0654655bf89be39d1f8ad","indexed_by":"docs-index"}},{"content":"Artisan — Layers and colour\n\n* Organize Objects on Layers — when on, commands file the geometry they create into a layer structure (metals, gems, objects) instead of dropping everything on the current layer. It defaults to on in the RhinoArtisan scheme and off in plain Rhino, so the plugin never rearranges the layers of someone who opened Rhino to do something else. The colours of that structure are set in Colors.\n* Use Gem Color (not Layer) — gems are drawn with their own colour instead of the colour of their layer. Disabled by default. Turn it on when you want to read stone sizes at a glance in the viewport; leave it off when your layer colours carry the meaning.","metadata":{"title":"Artisan","section":"Layers and colour","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#layers-and-colour","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#layers-and-colour","collection":"docs7","hash":"a0d4394cc76b40b73dfb898426a54bb1","indexed_by":"docs-index"}},{"content":"Artisan — Sizes and theme\n\n| Setting | Values | Default |\n| --- | --- | --- |\n| Theme in Rhino | Use Rhino Theme · Light · Dark | — |\n| Ribbon Icon Size | Small (24 px) · Medium (32 px) · Large (40 px) | Medium |\n| Gumball Size | Small · Medium · Large · Extra Large | Medium |\n\n* Theme in Rhino controls how the RhinoArtisan panels are painted when the plugin runs inside standard Rhino, so they do not clash with a dark Rhino setup.\n* Ribbon Icon Size applies immediately, without restarting — the ribbon repaints as soon as you change the value.\n* Gumball Size exists because jewellery is small: on a 4K screen the default gumball can be larger than the ring you are editing, or too small to grab.","metadata":{"title":"Artisan","section":"Sizes and theme","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#sizes-and-theme","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#sizes-and-theme","collection":"docs7","hash":"f726575357cadabbadf6b5740e99a861","indexed_by":"docs-index"}},{"content":"Artisan — Weight and wax\n\n* Wax Color — Purple, Orange, Green or Blue. The colour used to display a design once it is converted for 3D printing, matching the resin you actually print with.\n* Wax Density — the density used for wax and resin weight calculations in the reports. `0.97` by default.\n* Processed Weight (%) — the extra percentage added on top of the raw weight to account for finishing, polishing and casting losses. `5` by default, accepted between 0 and 100. It exists so the weight you quote to a customer is the weight the piece actually ends up costing you.","metadata":{"title":"Artisan","section":"Weight and wax","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#weight-and-wax","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#weight-and-wax","collection":"docs7","hash":"1f8a10aeb7486cfeac45acd547e4a771","indexed_by":"docs-index"}},{"content":"Artisan — License\n\n* Enable the license through Cloud Zoo — takes the licence from Cloud Zoo instead of the local activation. Disabled by default. Requires a restart. See Cloud Zoo.\n\nRibbon: Hide Text on Buttons, Disable Viewport Toolbar and the Cloud Zoo option are read once when the plugin loads. RhinoArtisan shows a message asking you to restart Rhino when you change any of them.","metadata":{"title":"Artisan","section":"License","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#license","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/artisan/#license","collection":"docs7","hash":"10b0a1fe1fe50530a1bfa81425c66c2e","indexed_by":"docs-index"}},{"content":"Assistant\n\nEverything about how the Assistant works, in one page: the models it uses for each kind of job, how much it may spend in a day, the company standards it applies when it builds, and two advanced switches. The API keys it runs on stay in Integrations.\n\nEvery value is read on the next message, so nothing here needs a restart.","metadata":{"title":"Assistant","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/","collection":"docs7","hash":"fa6eac489c8be97b089dcf215c293465","indexed_by":"docs-index"}},{"content":"Assistant — Models\n\nThe Assistant uses a model for each kind of job, so a quick question doesn't pay for the strongest model and a hard build doesn't settle for a fast one.\n\n| Setting | What it does | Default |\n| --- | --- | --- |\n| AI model | Answers and acts: the model behind most of the conversation. | Claude Opus 4.8 |\n| Router model | Reads each message first and decides what kind of request it is — a question, a change, a how-to, a picture — so the Assistant brings out only the tools that request needs. A short job, so a small, fast model is enough. | The latest Claude Haiku |\n| Vision model | Looks at the images you attach. | Same as the AI model |\n| Reasoning model | Plans multi-step builds — *\"a ring with a halo and pavé on the shank\"* — where thinking ahead pays off. | Same as the AI model |\n| Image model | Makes a picture from another one: a render from your viewport, a try-on, a variation of a photo you attached. | Nano Banana Pro |\n| Text-to-image model | Makes a picture from a description alone. | Nano Banana 2 |\n\nThe first four run on your OpenRouter key, the two image models on your fal.ai key. Which model to pick, and why: Choosing models.","metadata":{"title":"Assistant","section":"Models","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#models","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#models","collection":"docs7","hash":"703119dbc765e3ffe0272a487c769e7a","indexed_by":"docs-index"}},{"content":"Assistant — Costs\n\n* Daily limit (US$) — the most the Assistant's AI calls may cost in a day, as OpenRouter bills them. Once today's calls reach it, the Assistant stops and says so in the chat; the call that crosses the limit still finishes. 0, the default, means no limit.\n* Spent today — what the Assistant has spent so far today, across conversations and Rhino sessions.\n\nThe Assistant panel shows what the current conversation has cost next to the Auto button. Images generated with fal.ai are billed by fal.ai and aren't counted here. More in Costs and Spending.","metadata":{"title":"Assistant","section":"Costs","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#costs","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#costs","collection":"docs7","hash":"b742e5e3e3e7cac9c81243556d62a3ad","indexed_by":"docs-index"}},{"content":"Assistant — Company standards\n\nThe rules your company always follows, in plain language — minimum sizes per metal, default metals, production steps — which the Assistant applies whenever it builds or changes a design. Write them in the editor, or use Open in text editor and Open folder to work on the file directly. How to write them, and what the Assistant does with them: Company standards.","metadata":{"title":"Assistant","section":"Company standards","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#company-standards","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#company-standards","collection":"docs7","hash":"991cec42ec13e9a36ed775abd3fc27f9","indexed_by":"docs-index"}},{"content":"Assistant — Advanced\n\n* Show answers as they're written — on by default. The answer appears word by word in the panel while the model writes it, then settles into its final formatting. Turned off, it appears whole when it is done.\n* Keep each file's conversation on this computer — on by default. Opening a saved file again brings back its Assistant chat (the text only). The conversation is stored in your user folder, never inside the .3dm, and Clear History deletes it. See The Assistant panel.\n* Route requests by capability (recommended) — on by default. Each message is read first by the router model, and the Assistant offers only the tools that kind of request needs: faster, cheaper and more focused. Turned off, every message gets every tool.\n* Write a debug trace — writes one line per turn (models used, tools run, timings) to the Logs folder, for troubleshooting with support. Off by default.","metadata":{"title":"Assistant","section":"Advanced","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#advanced","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/assistant/#advanced","collection":"docs7","hash":"3f9187e72aa9f1951a19254305f31f18","indexed_by":"docs-index"}},{"content":"Colors\n\nTwo colour tables, each with its own Reset to default colors button.\n\nGem Colors\nOne colour per stone size, from 0.8 mm to 3.5 mm in 0.1 mm steps — 28 sizes in all.\n\nWhen a report, a gems map or the Technical Chart is generated, each stone is drawn in the colour assigned to its size. That is the whole point: a setter can tell 1.3 mm from 1.4 mm at a glance instead of reading numbers off a list, and a stone in the wrong seat becomes visible instead of arithmetic.\n\n* Export Colors / Import Colors — save the palette to a file and load it on another machine, so the whole workshop reads the same colours.\n* Reset to default colors — restores the RhinoArtisan palette.","metadata":{"title":"Colors","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/colors/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/colors/","collection":"docs7","hash":"6f7ef156be419c9f77b5e5fcf5e1db2f","indexed_by":"docs-index"}},{"content":"Colors — Layer Colors\n\nThe colours of the automatic layer structure created by Organize Objects on Layers (see Artisan).\n\nFour categories — Metal, Gem, Object and User — with three colours each, so nested layers inside the same category stay distinguishable instead of collapsing into one shade.\n\n* Reset to default colors — restores the RhinoArtisan layer palette.\n\nIf your workshop already has a colour code on paper — sizes, metals, or who is responsible for what — import it here once and every report, map and layer tree comes out speaking the same language as the bench.","metadata":{"title":"Colors","section":"Layer Colors","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/colors/#layer-colors","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/colors/#layer-colors","collection":"docs7","hash":"ed73fa8a6067d2bcc66137f1bdf06387","indexed_by":"docs-index"}},{"content":"Custom Gem Weight\n\nLets you replace RhinoArtisan's standard gemstone weights with your own table.\n\nOptions\n* Use custom gemstone weight table — switches the table on. A gem is matched by Shape + Size X + Size Y + Material; when a row matches, its weight is used, and anything that does not match falls back to the standard RhinoArtisan weight. There is no all-or-nothing: you can override the twenty stones you buy regularly and leave the rest alone.\n* Import CSV — loads a table. The columns are Shape, Size X, Size Y, Material, Origin, Weight ct, with sizes in millimetres and weight in carats. Sizes match with a tolerance of 0.01 mm, so a row written as `3.00` still catches a stone measuring 3.001.\n* Origin — not part of the match, but the tie-breaker. Two rows identical except for their origin — say a natural and a lab-grown of the same cut and size — resolve to the one marked `Natural`. Leave the column empty if you do not distinguish them.\n* Export CSV — writes the current table out, so it can be edited in a spreadsheet or copied to another machine.\n* Reset to RhinoArtisan default weights — clears the custom table.\n\nThe grid previews every loaded row, read-only, with a counter above it — it reads\n*No custom table loaded* until you import one. Validation messages reports anything the import could not read — a malformed number, a missing column, a duplicated row — instead of silently dropping it. To change a weight, edit the CSV and import it again.","metadata":{"title":"Custom Gem Weight","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-gem-weight/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-gem-weight/","collection":"docs7","hash":"4fce2bdd86f1f19268b4aa2c08bbe722","indexed_by":"docs-index"}},{"content":"Custom Gem Weight — Why it exists\n\nSuppliers and labs do not all use the same weight for a stone of a given shape and size. Cut proportions differ, and so do the tables each house works from. When a quote is built on carats, a few per cent of difference on every stone in a pavé is real money — in the wrong direction, every time.\n\nThis page lets the weights in RhinoArtisan be the weights your supplier invoices you for.\n\nExport first. Exporting with no custom table loaded gives you the default weights as a starting template, which is far quicker than typing a CSV from scratch.","metadata":{"title":"Custom Gem Weight","section":"Why it exists","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-gem-weight/#why-it-exists","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-gem-weight/#why-it-exists","collection":"docs7","hash":"192252e4ba56ace88ca8d491db174159","indexed_by":"docs-index"}},{"content":"Custom Metal List\n\nThe same idea as Custom Gem Weight, applied to metals: your own alloys and their densities.\n\nOptions\n* Use custom metal list — switches the list on. Metals not in the list fall back to the RhinoArtisan default database, so you only need to declare the alloys that differ.\n* Import CSV — loads a list. The columns are Metal Name and Density (g/cm³).\n* Export CSV — writes the current list out. Exporting with an empty list gives you the default metals as a starting template.\n* Reset to RhinoArtisan default metals — clears the custom list.\n\nThe grid is editable in place — unlike the gem weight table — so correcting one density does not mean going back to the spreadsheet and re-importing. The counter above it reads *N custom metals loaded*, and Validation messages reports any row the import could not read.","metadata":{"title":"Custom Metal List","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-metal-list/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-metal-list/","collection":"docs7","hash":"6d9748e66775bee706d6f8ff1a5510c8","indexed_by":"docs-index"}},{"content":"Custom Metal List — Where it applies\n\nWhen the list is enabled, these all use your densities:\n\n* Breakdown Details\n* Weight estimation (Weight and related commands)\n* The manufacturing and pricing reports\n\nWhy it exists\nEvery workshop has house alloys whose density does not match a textbook value — a particular 18k rose, a recycled silver, a palladium white from one specific refiner. The weight of a piece is only as good as the density behind it, and that weight is what the customer is quoted and what the caster is paid for.\n\nAsk your refiner for the actual density of the alloys they supply you rather than using a published table. The difference between a nominal and a real 18k yellow is small per gram and very visible across a collection.","metadata":{"title":"Custom Metal List","section":"Where it applies","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-metal-list/#where-it-applies","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/custom-metal-list/#where-it-applies","collection":"docs7","hash":"73e11aa0e46bfefed58fa70514c4bc39","indexed_by":"docs-index"}},{"content":"File Search\n\nDefines the scope of the file index, so Search can open a design by typing a few words of its name instead of digging through folders.\n\nFolders\nThe list of folders to index.\n\n* Add folder… — opens a folder browser and appends the result. Folders already in the list are ignored, so you cannot add the same one twice.\n* Remove — takes the selected folder out of the list.","metadata":{"title":"File Search","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/","collection":"docs7","hash":"c8edeaf8c513bdcaa777fc34225ea199","indexed_by":"docs-index"}},{"content":"File Search — Options\n\n* Include subfolders — enabled by default. Turn it off when you only want the top level of a big archive.\n* Extensions — the file extensions to keep, separated by commas, semicolons or spaces. `.3dm` by default. Anything else in those folders is ignored, which is what keeps the index small and the search fast on an archive with twenty years of work in it.","metadata":{"title":"File Search","section":"Options","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/#options","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/#options","collection":"docs7","hash":"8e40e55af7220fe114ccc2c3847d523b","indexed_by":"docs-index"}},{"content":"File Search — Index\n\n* Reindex now — saves the current scope and rebuilds the index in the background. The label beside the button reports how many files are indexed and the progress while it works.\n\nSaving the page also triggers a background refresh, so the index always reflects the scope you just set.\n\nWhy it exists\nA jewellery archive is rarely tidy: work lives in folders named after clients, orders or dates, several drives deep. The index turns that into something you can type at. Every word you type has to appear in the file name, so three words narrow a thousand files down to the one you meant. It has to be told where to look — and told what to ignore, or it spends its time on renders, backups and STLs nobody will ever search for.\n\nIndexing is incremental and runs in the background, so adding a large archive does not block Rhino. The first pass on a big folder still takes a while — start it before a break rather than in front of a client.","metadata":{"title":"File Search","section":"Index","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/#index","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/file-search/#index","collection":"docs7","hash":"5968b010d1484e0513dffed5305c1b46","indexed_by":"docs-index"}},{"content":"Folders\n\nWhere RhinoArtisan keeps your own material. Each row is a path with a … button that opens a folder browser; leaving one empty restores the default location.\n\nPaths\n* User Folder — your assets, profiles, presets and libraries. Point it at a network drive or a synced folder and a whole studio shares the same libraries. See User Folder for what lives inside it.\n* Curator — where Curator files are stored. Putting it on a shared network folder is what lets several people work on the same Curator boards.\n* Boutique — where Boutique collections are stored.\n* Code Editor — the executable used when you choose *Edit code* in the Flow panel (Visual Studio Code, Sublime Text…). Leave it empty to use the system default.","metadata":{"title":"Folders","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/folders/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/folders/","collection":"docs7","hash":"da277044a5b80dc72ffe9aaa9740a274","indexed_by":"docs-index"}},{"content":"Folders — Why it exists\n\nThe defaults live under your Windows user profile, which is the right place for a single designer on a single machine. A workshop with several seats wants the opposite: one library, one Curator folder, one set of collections, shared. These four paths are what makes that possible without touching anything else.\n\nA folder inside Program Files is rejected: Windows makes it read-only for normal users, and RhinoArtisan would not be able to write your libraries there.\n\nEvery folder change asks you to restart Rhino — the paths are resolved once when the plugin loads.","metadata":{"title":"Folders","section":"Why it exists","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/folders/#why-it-exists","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/folders/#why-it-exists","collection":"docs7","hash":"0451c098c008973dc9d310d5fa4facd2","indexed_by":"docs-index"}},{"content":"Integrations\n\nThe credentials for the external services RhinoArtisan talks to. They live in one page so keys are set once and every feature that needs them just works — no service asks you for a key in the middle of a job.\n\nOpenRouter\nThe AI provider behind the Assistant, Flow Studio AI and the Smart mode of File Search.\n\n* API Key — your OpenRouter key. It is stored as a password field, not plain text.\n* Flow Studio model — the model used by Flow Studio AI. It defaults to Claude Opus 4.8: Flow Studio AI writes code, which is worth spending a strong model on.\n\nThe Assistant's models — and its spending limit and company standards — have their own page, Options → Artisan → Assistant. The full list of models, and how to choose, is in Choosing models.","metadata":{"title":"Integrations","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/","collection":"docs7","hash":"687e02a2a64ecbf38bad870f6b32f3c0","indexed_by":"docs-index"}},{"content":"Integrations — Generative AI (fal.ai)\n\n* API Key — used by Generative AI Studio to generate images, video and 3D from your designs, and by the Assistant when you ask it for a picture. Also stored as a password field. The Studio chooses its model for each generation; the Assistant's image models are in Assistant options.\n\nHow to create both keys, step by step: Accounts and API keys.","metadata":{"title":"Integrations","section":"Generative AI (fal.ai)","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/#generative-ai-falai","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/#generative-ai-falai","collection":"docs7","hash":"3469e94cebd2409cb515864b6cc018b3","indexed_by":"docs-index"}},{"content":"Integrations — Nivoda\n\nLive diamond stock inside Rhino, through the Nivoda panel.\n\n* Mode — Disabled (default) or Online. The credential fields only appear once you switch to Online, so the page stays quiet for the many users who do not have a Nivoda account.\n* Url — the Nivoda endpoint.\n* Username and Password — your Nivoda account.\n\nThese keys are stored in your RhinoArtisan settings on this machine and are billed to your own accounts with each provider. Treat them like any other credential: do not share a settings export that contains them.","metadata":{"title":"Integrations","section":"Nivoda","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/#nivoda","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/integrations/#nivoda","collection":"docs7","hash":"7212cc359d6b5a03a6f785802b6a1e7c","indexed_by":"docs-index"}},{"content":"Time Tracking\n\nA passive timer that records how long you spend on each file. It runs by itself — there is no start or stop button to forget — and feeds the Time Tracker panel.\n\nOptions\n* Track time per file automatically — enabled by default. Turn it off and nothing is recorded.\n* Pause after inactivity (minutes) — how long without activity before the timer stops counting. `5` by default, accepted between 1 and 120.","metadata":{"title":"Time Tracking","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/time-tracking/","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/time-tracking/","collection":"docs7","hash":"0d4f1fa6fb1020d3228088711d534f48","indexed_by":"docs-index"}},{"content":"Time Tracking — Why it exists\n\nDesign time is the hardest part of a quote to defend, because it is the part nobody writes down. A timer you have to remember to start is a timer that records half of your work; one that keeps running through lunch records too much. The inactivity threshold is the setting that makes the number believable: a coffee break should not be billed as design time, and a long look at a reference photo should not be discarded as idle.\n\nFive minutes suits most benches. Raise it if you work with long pauses to think or to check a stone, lower it if you keep several files open and switch between them all day.","metadata":{"title":"Time Tracking","section":"Why it exists","url":"https://www.rhinoartisan.com/docs/7/user-interface/options/time-tracking/#why-it-exists","source":"https://www.rhinoartisan.com/docs/7/user-interface/options/time-tracking/#why-it-exists","collection":"docs7","hash":"6e73a5eebae2f595f88bb56d91c4a40e","indexed_by":"docs-index"}},{"content":"Commands\n\nWhen you activate a RhinoArtisan command, the Artisan Panel will automatically open, displaying the command panel for the selected tool. Here, you'll find all the options you need for making selections (such as curves, surfaces, or objects) and for setting the parameters of the element you’re working on. For commands that require a curve, such as construction sections for building an element, you can either select a different curve from the assets collection or edit the currently selected one.\n\nUpon activating a command—whether you're creating a Shank, a Gemset, or a Component—the Artisan panel will present a comprehensive gallery of that specific type of element. Simultaneously, the default version of the element will appear in the viewport.\n\nThat gallery is the element library, and it's one of the biggest time-savers in RhinoArtisan. Instead of modelling every shank, basket or component from zero, you start from a finished element and you're seconds away from a result. And it's not a catalogue of fixed pieces: every element in the library is editable — pick the one closest to your idea and adjust it until it's yours. Add your own creations to it, and share them with your design team, so the whole studio designs from the same set of styles.\n\nAt this stage, you have three options:\n\n1. Accept the Default Element: If the default element meets your needs, simply click the checkmark icon above the gallery to confirm your choice.\n2. Edit the Default Element: If you wish to customize the default element, click the pen-shaped icon to modify it and create a new design.\n3. Select from the Collection: To choose a different element from the collection, double-click on the image of your preferred option to proceed with it.","metadata":{"title":"Commands","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/","collection":"docs7","hash":"0de205fb5f88968a2a1e0e15404e7784","indexed_by":"docs-index"}},{"content":"Commands\n\nAfter you complete the editing and click the checkmark icon , the newly created element will be added to the Outliner panel, where it will be listed alongside the other elements you've created.\n\nYou can easily save your new element to the gallery by editing the element and clicking the save icon. Simply give it a name, and it will be added to the gallery, ready for future use.\n\nAdditionally, if you right-click on any image in the galleries, a management menu will appear, allowing you to set your preferred elements as favorites, rename, duplicate, export, or delete any elements you no longer need.\n\nGoldsmith Tip : Marking your preferred elements as favorites is essential for streamlining your workflow and boosting efficiency.","metadata":{"title":"Commands","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/","collection":"docs7","hash":"596cfa629ce65846130faadd9872a9bc","indexed_by":"docs-index"}},{"content":"Commands — Edit every parameter\n\nAnd when the gallery isn't enough: click the pencil icon and you can edit every last parameter imaginable of the element — prong distances, diameters, heights over girdle, manufacturing expansions… This is for users with concrete, precise requirements: whatever dimension your workshop or your client demands, it's there to be set.\n\nAnd remember — once it's exactly the way you want it, you can save it to the gallery and reuse it forever.\n\nAnd there's one more step: you can make your values the ones every command starts with.\n\nDefault Settings — make every command open with your values","metadata":{"title":"Commands","section":"Edit every parameter","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/#edit-every-parameter","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/commands/#edit-every-parameter","collection":"docs7","hash":"f894d66b45622dfbc0afe1186851ba21","indexed_by":"docs-index"}},{"content":"Default Settings\n\nNew in RhinoArtisan 7 — and one of the features our users have asked for the most.\n\nWhen you enter a command, RhinoArtisan loads its default values. They're good starting points, but by definition they're generic — and your workshop isn't. Say the default prong size is 1.5 mm and in your designs it's always 2 mm: until now, you changed it by hand every single time you opened the command.\n\nNot any more. Now you can save your own defaults, command by command:\n\n1. Open the command and set the parameters exactly the way you like them.\n2. Click the gear icon in the command header.\n3. Choose Save as default.\n\nThat's it. From now on, that command opens with your values — every time.\n\nChanged your mind? The same menu has Restore RhinoArtisan defaults, which brings that command back to the factory values.","metadata":{"title":"Default Settings","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/default-settings/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/default-settings/","collection":"docs7","hash":"11c25f8e17ced2fd122109abd5fb3e09","indexed_by":"docs-index"}},{"content":"Default Settings — Why you'll love it\n\n* You stop repeating yourself. The adjustments you made on every single command run are now made once — and kept. Multiply the seconds saved by every command, every piece, every day.\n* **RhinoArtisan becomes *your* software.** Your prong sizes, your distances, your expansions — every tool opens speaking your workshop's language, not a generic one.","metadata":{"title":"Default Settings","section":"Why you'll love it","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/default-settings/#why-youll-love-it","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/default-settings/#why-youll-love-it","collection":"docs7","hash":"7302ead9e0a9dcabd4497d5d78921d54","indexed_by":"docs-index"}},{"content":"Layers\n\nYou never file your work into layers by hand: as you design, RhinoArtisan drops every gem, element and curve into its layer automatically. The panel organises them in four groups — Metal, Gem, Object and User — so however big the piece gets, everything has its place. And when you want a different arrangement, just reassign things: the structure is yours to change.","metadata":{"title":"Layers","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/","collection":"docs7","hash":"61aeee8ac9bf09626b120dec6289c114","indexed_by":"docs-index"}},{"content":"Layers — One row, four icons\n\nEvery layer works the same way. From left to right:\n\n* Play — assigns the layer to whatever you have selected in the viewport.\n* Colour — left-click to make it the active layer; right-click to select everything on it.\n* Padlock — locks or unlocks the layer's items.\n* Eye — shows or hides them.\n\nNext to the Metal group title there's one more button: Refresh Layer Structure, which resets the RhinoArtisan layer system back to its default properties whenever you need a clean start.","metadata":{"title":"Layers","section":"One row, four icons","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/#one-row-four-icons","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/#one-row-four-icons","collection":"docs7","hash":"7d0a65b21158195d2a25ee3f818d7f3d","indexed_by":"docs-index"}},{"content":"Layers — Your colours\n\nThe layer colours aren't fixed either. Head to Options > Artisan > Colors and give each layer the colour that makes sense in *your* studio — the same window also holds the per-size gem colours used in reports and gem maps.\n\nIn Rhino mode\nIn the Rhino interface, this behaviour is controlled by two options in Options > Artisan:\n\n* Organize Objects on Layers — RhinoArtisan files your objects into the layer structure automatically.\n* Use Gem Color (not Layer) — gems are displayed in their own gem colour instead of the layer's.\n\nPrefer to use Rhino's layer system the way you always have? Just untick both options, and RhinoArtisan will leave your layers alone.\n\nWhen using the Rhino UI, we adapt the colours to the light mode unless the user uses the new dark mode in Rhino 8, which is highly recommended.","metadata":{"title":"Layers","section":"Your colours","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/#your-colours","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/layers/#your-colours","collection":"docs7","hash":"d638231f140ffcf74d6cfd3815a339e6","indexed_by":"docs-index"}},{"content":"Outliner\n\nThe Outliner panel is responsible for organizing the global parameters of your design and all the elements it's made of.\n\nWe suggest docking this toolbar to the right side of your layout to optimise space, especially within the same area where you have other panels.\n\nSections\nThe Outliner consists of three sections: Header, Design and Elements.","metadata":{"title":"Outliner","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/","collection":"docs7","hash":"55aadb4b8b18b03865a9f18d841c011f","indexed_by":"docs-index"}},{"content":"Outliner — Header\n\nIt contains four commonly used tools for parametric editing.\n\nIn addition, this panel has four buttons in the top-left corner:\n\n* Apply Style: You can easily copy and paste the parameters of an element for a particular stone to another stone. Select an element as a basket, for instance, click on Apply Style, and then click on another stone. A basket with the same parameters will be applied to that stone. This works with all elements in RhinoArtisan.\n* Weight: When clicked on, it opens a window displaying the weight of metals in grams and the carat weight of gems from your design. This data will automatically be stored in your clipboard.\n* Edit: You can edit the selected element or elements after clicking this button. To cancel this operation, right-click on your viewport.\n* Refresh Design: RhinoArtisan will use this icon to unite stray gems and adapt the design to its new measurements. For example, if you change a shank's finger size, clicking this button will adjust the design's element to the new shank size.","metadata":{"title":"Outliner","section":"Header","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#header","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#header","collection":"docs7","hash":"c590101c295258fe5af2376f3fa5352b","indexed_by":"docs-index"}},{"content":"Outliner — Design area\n\nThis is where the global parameters of your design live: traits that affect all your design elements at once. Changing a global parameter will update all your elements to match the change.\n\nThese are all the possible Global Parameters:\n\n* Display mode:&#x20;\n* Rendering shows the piece as a finished product with materials and lighting.\n* Manufacturing previews how the piece would appear after 3D printing. In this mode, an additional _Manufacturing Extension_ parameter is applied to elements built with commands that include prongs, ensuring they are ready for production.\n* Design type: What kind of jewelry piece is your design, this parameter may be automatically set depending on what elements you add to your design.\n* Design Subtype: This setting defines the specific type of piece you are creating. While the system automatically detects the general category, such as a ring, you can use the subtype to specify what kind of ring it is: for example, a Halo, Trilogy, Solitaire, Cluster, among many others. Declaring the subtype helps the system better understand the design intent and supports the AI assistant in generating accurate technical descriptions of the piece.\n* Diamond Type: Within the Outliner, you can now specify whether the diamonds used in your design are Natural or Lab-Grown. This information is particularly useful when integrated with the Nivoda platform, as it allows the system to search their inventory for certified stones of the selected type. This helps generate a more accurate cost breakdown for production planning and pricing.\n* Melee Quality: Sets the quality grade of the melee diamonds — the small accent stones — used in your design. This grade is taken into account when generating the cost breakdown of the piece.","metadata":{"title":"Outliner","section":"Design area","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#design-area","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#design-area","collection":"docs7","hash":"ae7cf8c59f2b81025dfab7bc9738e769","indexed_by":"docs-index"}},{"content":"Outliner — Design area\n\n* Finger size and scale: This feature is only present in ring designs. It lets you set the shank's size and switch between multiple international ring size measurement scales. The button Cut by ring size allows you to cut objects that could be inside the ring curve so they would not intersect with the finger, assuring a perfect ring size.\\ \\ On the right side, there is an icon of a ring viewed from the front. This icon allows us to execute the Cut by Ring Size command, which will cut any object within the section of the ring where the finger would go.&#x20;\n\n* Metal : In the Outliner, it is possible to define multiple different metals, which are automatically linked to the Metal layers in the layer manager.\n\nIf only one metal is defined, it will be assigned to all three metal layers: Metal 01, Metal 02, and Metal 03.\n\nIf two metals are defined in the Outliner, the first metal will be assigned to the Metal 01 layer, while the Metal 02 and Metal 03 layers will have the metal listed second in the Outliner.\n\nIf three metals are defined, each will be assigned to one of the Metal layers following the order in which they appear in the Outliner.\n\nWe recommend clicking the Refresh button in the Outliner once a new metal has been added to the scene to ensure the proper assignment of metals across the different layers.","metadata":{"title":"Outliner","section":"Design area","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#design-area","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#design-area","collection":"docs7","hash":"93e84404eec3e2da5d7c04529831c362","indexed_by":"docs-index"}},{"content":"Outliner — Elements\n\nBelow the global parameters, the Outliner lists every element your design is made of — one row per element.\n\nReading a row from left to right:\n\n* Coloured line — click it to open the element's parameters, when it has them.\n* Icon — the type of element.\n* Name — click it to rename the element, so you can keep the list organised exactly the way you want.\n* Count — how many of that element the design contains, in parentheses.\n* Pencil — edit the element's parameters.\n* Eye — hide or show the element in your viewports.\n\nGems get two extras on their row:\n\n* The total carat weight of that group of gems.\n* A button that expands a detailed gem report. Inside it, each gem has an icon to select it individually, and the button in the lower-right corner places the report on your viewport — click where you want it, or right-click to cancel.\n\n#### Orange gradient: element pending refresh\n\nWhen a row shows an orange gradient, a parameter that element depends on has changed, and the element needs to be regenerated. It happens, for example, when you change a gem and another element is built on it — a basket, say.\n\nWhen you're ready, click Refresh Design in the header and everything updates.\n\nWhy doesn't RhinoArtisan refresh it on its own? Because we don't want to get in the way of your work: regenerating takes a moment, and doing it after every change would interrupt you constantly. You refresh when you decide — faster, more agile, cleaner.","metadata":{"title":"Outliner","section":"Elements","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#elements","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#elements","collection":"docs7","hash":"8bdecef702f1d14bd0a555ee3ea8c72d","indexed_by":"docs-index"}},{"content":"Outliner — Apply Style\n\nOne of the standout features of the software is the Apply Style command. This tool allows you to copy the parameters from one element—such as a basket—and apply them to other gemstones within your design, regardless of their size or shape. This greatly streamlines the design process when working with multiple gemstones, as you can create a single element, copy its settings, and efficiently paste those parameters to other stones, ensuring consistency and saving time.\n\nThis tool goes beyond a simple copy-and-paste function—let's explore an example to showcase its full potential. Imagine you're designing a fashion ring featuring six gemstones, each varying in size and shape. Instead of manually adjusting each setting, you can streamline the process with Apply Style.\n\nStart by arranging the six stones on a cylinder and creating a basket around one of the gems. Once you're satisfied with the look of the basket, use the Apply Style command to replicate the same design across all the other gemstones. After refreshing the Outliner, you'll have perfectly matched baskets for each gem, regardless of their shape or size!\n\nNext, reposition the gems to ensure the baskets don't overlap.\n\nNow, to create the shank, draw a curve from the lower rail of the baskets down to the bottom of the ring from each of the baskets.\n\nUse RhinoArtisan's Profile command on one of the curves and adjust the sections until you achieve your desired shape and proportions. Once you're happy with the result, use Apply Style again to transfer the profile to the other curves.\n\nIn just a few clicks, you've created a single basket and a single shank profile, then applied them to six unique gemstones and curves, allowing you to design a complex ring quickly and efficiently.","metadata":{"title":"Outliner","section":"Apply Style","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#apply-style","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/outliner/#apply-style","collection":"docs7","hash":"3ef0dad8baf942f1d626796be7bdda8a","indexed_by":"docs-index"}},{"content":"Recent Commands\n\nDesigning a piece is not a straight line. You place the stones, look at it, move them, rebuild the prongs, look again, change the shank, redo the cutters. The same small group of commands, over and over, with a look in between each one.\n\nThis panel is built for exactly that. Every command you run appears here as an icon, most recent first, and clicking it runs the command again. No ribbon tab to find, no name to remember, no menu to walk down.","metadata":{"title":"Recent Commands","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/","collection":"docs7","hash":"7a6b3dec500748366ca22b6702a14647","indexed_by":"docs-index"}},{"content":"Recent Commands — How it works\n\n* The panel holds the last twelve commands. The thirteenth pushes the oldest one out, so what you see is always the work you are doing now.\n* Click an icon to run that command again.\n* Hover over an icon to read the command's name, in your language.\n* The list follows the session: it fills up as you work, from whichever tab or command line you used.","metadata":{"title":"Recent Commands","section":"How it works","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/#how-it-works","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/#how-it-works","collection":"docs7","hash":"1826f7a8e759956d9b00c7a39b741f2b","indexed_by":"docs-index"}},{"content":"Recent Commands — Why it matters\n\nCount the clicks on a single stone setting: choose the tab, find the icon, run it, inspect, undo, change one number, run it again. The finding is never in the same tab as the setting, and the setting is never in the same tab as the cutter. Over a morning that navigation adds up to more time than the modelling.\n\nThe panel collapses all of it to one click per repeat, and it does it without you having to set anything up — unlike the Quick Bar, which you curate yourself. Recent Commands simply remembers.\n\nThe two work well together: when a command keeps coming back in Recent Commands day after day, that is your signal to right-click its ribbon button and pin it to the Quick Bar, where it stays for good.","metadata":{"title":"Recent Commands","section":"Why it matters","url":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/#why-it-matters","source":"https://www.rhinoartisan.com/docs/7/user-interface/panels/recent-commands/#why-it-matters","collection":"docs7","hash":"fa016c75a8847404f034f794c77c7341","indexed_by":"docs-index"}},{"content":"Quick Bar\n\nThe Quick Bar is a strip of favourite buttons that sits at the bottom of the RhinoArtisan ribbon, under every tab. Whatever you put there stays there — it does not change when you switch from Shanks to Diamonds to Manufacturing — so the ten or fifteen commands you actually use all day are always one click away.\n\nIt is your own toolbar, built by you, and it is remembered between sessions.","metadata":{"title":"Quick Bar","url":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/","source":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/","collection":"docs7","hash":"bafc399351b274cccdfc350f983b74bf","indexed_by":"docs-index"}},{"content":"Quick Bar — Adding a command\n\nRight-click any button in the ribbon and choose Add to Quick Bar.\n\nThat works everywhere in the ribbon: on the big icon buttons, on the buttons with text, and on the entries inside the drop-down submenus — so a command you can only reach through a popup, like Boolean Union (Rhino), can still become a one-click favourite.\n\nThe Quick Bar copies the button's icon and its tooltip, so the favourite looks and behaves exactly like the original.\n\nYou can also add commands from the Middle Button floating toolbar: right-click any of its buttons and the same Add to Quick Bar option appears. That is how selection, visibility, locking, grouping and view commands — SelAll, Hide, Lock, Group, Top view — end up on the bar next to your RhinoArtisan commands.\n\nA command can only be on the Quick Bar once. Right-clicking a button you have already added simply does nothing new — no duplicates appear.","metadata":{"title":"Quick Bar","section":"Adding a command","url":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#adding-a-command","source":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#adding-a-command","collection":"docs7","hash":"675ed6d96f53ebf4460aa7b2830d9051","indexed_by":"docs-index"}},{"content":"Quick Bar — Organising the bar\n\n* Run a command — left-click its button.\n* Reorder — drag a button left or right. A gold insertion line shows exactly where it will land, and dropping it on the empty area of the bar sends it to the end.\n* Add a separator — right-click a button and choose Add separator. A thin vertical divider is inserted after it, so you can group your favourites by task: modelling here, stone setting there, manufacturing at the end.\n* Remove — right-click a button and choose Remove from Quick Bar, or right-click a separator and choose Remove separator.\n\nSeparators can be dragged around like any other item.","metadata":{"title":"Quick Bar","section":"Organising the bar","url":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#organising-the-bar","source":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#organising-the-bar","collection":"docs7","hash":"493e7e3616542639b3997475ba79f9e4","indexed_by":"docs-index"}},{"content":"Quick Bar — Showing and hiding the bar\n\nThe Show / hide Quick Bar button lives in the File tab of the ribbon, next to Settings, Update, License and Support. Click it to collapse the strip when you need the extra vertical space, and again to bring it back.\n\nThe visibility state is saved with your settings, so the bar comes back the way you left it.","metadata":{"title":"Quick Bar","section":"Showing and hiding the bar","url":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#showing-and-hiding-the-bar","source":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#showing-and-hiding-the-bar","collection":"docs7","hash":"603d152b7ef5c7baf075d195b3057c50","indexed_by":"docs-index"}},{"content":"Quick Bar — Notes\n\n* The Quick Bar is centred in the ribbon and scrolls horizontally when you add more favourites than fit the width of the panel — nothing is ever lost off the edge.\n* Favourites and visibility are stored in your RhinoArtisan settings, not in the\n`.3dm`, so they follow you across every document on that machine.\n* An empty Quick Bar shows the hint *\"Right-click a ribbon button → Add to Quick Bar\"* instead of an empty strip.\n* Each favourite stores the macro the original button runs, so it does exactly what the ribbon button did — including commands that are really Rhino macros, like `SelAll` or `SetView`.\n\nGoldsmith Tip: build the Quick Bar around the way you actually work, not around the ribbon layout. A typical setting bench keeps Gem Studio, Dynamic Prongs and Cutter together, a separator, then Weight, Thickness and Quick Check for the manufacturing pass. Two seconds saved per command adds up over a working day.","metadata":{"title":"Quick Bar","section":"Notes","url":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#notes","source":"https://www.rhinoartisan.com/docs/7/user-interface/quick-bar/#notes","collection":"docs7","hash":"df4414a940a15ef7b22d45d22dbe0053","indexed_by":"docs-index"}},{"content":"Rhino and RhinoArtisan Interface\n\nRhinoArtisan works as a Rhinoceros plugin and has its interface. In terms of functionality, it is the same, so why have we created a different interface? The main reason is ease of use. We have created a focused interface for jewellery design by integrating RhinoArtisan's functionalities.\n\nWe recommend that you use the interface you are most comfortable with. :smile:","metadata":{"title":"Rhino and RhinoArtisan Interface","url":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/","source":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/","collection":"docs7","hash":"46dcf905a0b871c931ddd855c3c9614f","indexed_by":"docs-index"}},{"content":"Rhino and RhinoArtisan Interface — RhinoArtisan recommends Dark Mode, even in Rhino.\n\nRhinoArtisan 7 works on Rhino 8, which now features a Dark Mode for reduced eye strain during extended design sessions. RhinoArtisan's interface will automatically adjust to this mode. We recommend enabling Dark Mode if you prefer working with the Rhino interface.\n\nDark mode offers several advantages. It helps reduce eye strain by lowering screen brightness, making it more comfortable to use for long periods in low-light environments.&#x20;\n\nAdditionally, dark mode can improve sleep quality by reducing exposure to blue light, which can interfere with sleep patterns in the evening. On OLED and AMOLED displays, the dark mode also benefits battery life, as dark pixels consume less power than bright ones. Visually, dark mode enhances aesthetics by making certain elements, such as text and buttons, stand out more prominently, aiding focus. Moreover, it minimizes screen glare in dimly lit settings, making it easier to work or read in such environments.","metadata":{"title":"Rhino and RhinoArtisan Interface","section":"RhinoArtisan recommends Dark Mode, even in Rhino.","url":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/#rhinoartisan-recommends-dark-mode-even-in-rhino","source":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/#rhinoartisan-recommends-dark-mode-even-in-rhino","collection":"docs7","hash":"ea7df99ef7136ac8aee1afc5acd45c86","indexed_by":"docs-index"}},{"content":"Rhino and RhinoArtisan Interface — How to start in RhinoArtisan mode?\n\nTo run RhinoArtisan with its interface, you will find a RhinoArtisan icon on your desktop and in the Windows start menu.\n\nHow to start in Rhino mode?\nTo run it in Rhino mode, open Rhino as usual.","metadata":{"title":"Rhino and RhinoArtisan Interface","section":"How to start in RhinoArtisan mode?","url":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/#how-to-start-in-rhinoartisan-mode","source":"https://www.rhinoartisan.com/docs/7/user-interface/rhino-and-rhinoartisan-interface/#how-to-start-in-rhinoartisan-mode","collection":"docs7","hash":"873ab3be5d2f2a5144c52b2d51792a31","indexed_by":"docs-index"}},{"content":"Ribbon\n\nRhinoArtisan (and Rhino) commands are contained in the Ribbon. They are grouped into tabs according to their functionality — and as you can see, all Rhino commands are included together with RhinoArtisan commands.\n\nQuick Bar\nNew in RhinoArtisan 7. The strip right under the ribbon is the Quick Bar, and it's yours: customise it with the commands you use the most. Right-click any ribbon button, choose Add to Quick Bar, and it stays one click away no matter which tab you're on — a big usability win when you keep jumping between tabs for the same handful of tools.\n\nWe've written a whole section about it:\n\nQuick Bar — build your own toolbar","metadata":{"title":"Ribbon","url":"https://www.rhinoartisan.com/docs/7/user-interface/ribbon/","source":"https://www.rhinoartisan.com/docs/7/user-interface/ribbon/","collection":"docs7","hash":"debd7d6e3b85c3bbb4eddf9757306a1a","indexed_by":"docs-index"}},{"content":"Ribbon — Panels\n\nPanels allow us to organize the interface according to our preferences and needs. RhinoArtisan and Rhino panels can be docked anywhere within the application and even moved to other monitors, providing a larger graphical workspace. We recommend visiting the Panel section to get acquainted with each of them.","metadata":{"title":"Ribbon","section":"Panels","url":"https://www.rhinoartisan.com/docs/7/user-interface/ribbon/#panels","source":"https://www.rhinoartisan.com/docs/7/user-interface/ribbon/#panels","collection":"docs7","hash":"5d5a39084b6fa2ac74d12d729f75511c","indexed_by":"docs-index"}},{"content":"Toolbar and Menu in Rhino\n\nIn the Rhino user interface, we can run RhinoArtisan in three ways, just like in Rhino: Menu, Toolbar or by Command Prompt.\n\nRhino stores toolbar and menu files independently of the plugin, so the Artisan menu and toolbar can still show up even when the plugin itself isn't loaded. Seeing them is not proof that RhinoArtisan is running.","metadata":{"title":"Toolbar and Menu in Rhino","url":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/","source":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/","collection":"docs7","hash":"263e279cb7e2adc6d252b64cf9b57b37","indexed_by":"docs-index"}},{"content":"Toolbar and Menu in Rhino — Menu\n\nA new menu will appear in Rhino with the name Artisan.\n\nToolbar\nWhen RhinoArtisan is installed, the toolbar will also appear. As in any other Rhino toolbar, we can see that some icons have a small triangle at the bottom right, it will open a new toolbar.\n\nIf the toolbar doesn't appear, run `ArtisanToolbar` — it loads it automatically. You can also use Show Toolbar in the Artisan menu.","metadata":{"title":"Toolbar and Menu in Rhino","section":"Menu","url":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/#menu","source":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/#menu","collection":"docs7","hash":"23e5f162552b56016b595ba6fb1b2274","indexed_by":"docs-index"}},{"content":"Toolbar and Menu in Rhino — Commands\n\nAll RhinoArtisan tools are available at the command prompt, and every one of them starts with `Artisan`. Type `Artisan` and Rhino lists them all, so you can browse the whole set without leaving the keyboard.\n\nYou don't need the exact name either: type any part of it and Rhino filters the list down. For example, `ArtisanGemStudio` shows up if you just type `Studio`.","metadata":{"title":"Toolbar and Menu in Rhino","section":"Commands","url":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/#commands","source":"https://www.rhinoartisan.com/docs/7/user-interface/toolbar-and-menu-in-rhino/#commands","collection":"docs7","hash":"30af0cf7c7ae8e61ca53f5b85f5f3fd8","indexed_by":"docs-index"}},{"content":"User Folder — Where can I find the RhinoArtisan user folder?\n\nTo open the user folder, click User Folder in the File tab of the ribbon. You can also run the command ArtisanOpenUserFolder.\n\nIt opens in Windows Explorer, one folder per kind of content:\n\nImportant: Before making any changes to the files in this folder, I recommend creating a backup to prevent the loss of important information.","metadata":{"title":"User Folder","section":"Where can I find the RhinoArtisan user folder?","url":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#where-can-i-find-the-rhinoartisan-user-folder","source":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#where-can-i-find-the-rhinoartisan-user-folder","collection":"docs7","hash":"ad4ba8f03686355fef7f304197a1c5a2","indexed_by":"docs-index"}},{"content":"User Folder — Why might you be interested in accessing the RhinoArtisan user folder?\n\nThe RhinoArtisan user folder is a personal storage space where various files and settings related to your work in this program are saved. Accessing it can be useful for several reasons:\n\n* File recovery: If you accidentally deleted an important file (such as 3D models, scripts, or templates), searching this folder can help you recover it.\n* Customization: You can find configuration files that allow you to customize the appearance and behavior of RhinoArtisan according to your preferences.\n* Troubleshooting: If you are experiencing any problems with the program, reviewing configuration files or error logs within this folder can help you identify the cause and find a solution.\n* Backup: Creating a backup of this folder can help protect your work in case you need to reinstall the program or if your computer fails.\n* Sharing Configurations: If you work in a team, you can share certain configuration files with your colleagues to ensure a more consistent work experience.","metadata":{"title":"User Folder","section":"Why might you be interested in accessing the RhinoArtisan user folder?","url":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#why-might-you-be-interested-in-accessing-the-rhinoartisan-user-folder","source":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#why-might-you-be-interested-in-accessing-the-rhinoartisan-user-folder","collection":"docs7","hash":"296f3578a60c3e539042db9187ab26b7","indexed_by":"docs-index"}},{"content":"User Folder — What types of files can I find in the RhinoArtisan user folder?\n\nThe exact contents of this folder may vary depending on the version of RhinoArtisan you are using and the actions you have taken in the program. However, some of the most common files you can find are:\n\n* 3D models: Your designs and models created in RhinoArtisan are saved in this folder.\n* Scripts: If you have created or downloaded custom scripts to automate tasks, you will find them here.\n* Templates: The templates you have created or used to start new projects are also stored in this folder.\n* Configuration files: These files contain information about your personal preferences, such as the user interface, units of measurement, etc.\n* Error logs: If an error occurs in the program, log files are generated that can be helpful for diagnosing the problem.","metadata":{"title":"User Folder","section":"What types of files can I find in the RhinoArtisan user folder?","url":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#what-types-of-files-can-i-find-in-the-rhinoartisan-user-folder","source":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#what-types-of-files-can-i-find-in-the-rhinoartisan-user-folder","collection":"docs7","hash":"75506d63266142d9a394cd416122da65","indexed_by":"docs-index"}},{"content":"User Folder — How can I restore the user folder?&#x20;\n\nIf we want to restore the user folder, we need to follow these steps:\n\nImportant: Before making any changes to the files in this folder, I recommend creating a backup to prevent the loss of important information.\n\n1. Locate the user folder as shown at the beginning of the page using the `ArtisanOpenUserFolder` command.\n2. Close Rhino and RhinoArtisan (all instances).\n3. Delete all the folders.\n\nWhen you restart RhinoArtisan, it will recreate the folders and files.","metadata":{"title":"User Folder","section":"How can I restore the user folder?&#x20;","url":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#how-can-i-restore-the-user-folderx20","source":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#how-can-i-restore-the-user-folderx20","collection":"docs7","hash":"8c04a530c5b7c869d57c843485e67767","indexed_by":"docs-index"}},{"content":"User Folder — Do you need more help?\n\nIf you have any other questions or need more specific information about the RhinoArtisan user folder, feel free to ask. I'm happy to help.","metadata":{"title":"User Folder","section":"Do you need more help?","url":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#do-you-need-more-help","source":"https://www.rhinoartisan.com/docs/7/user-interface/user-folder/#do-you-need-more-help","collection":"docs7","hash":"5a2dcec95f5e06b663736aecb6aa7df8","indexed_by":"docs-index"}},{"content":"Viewport Commands\n\nThere's a toolbar hidden in the viewport that appears when we move the mouse to the bottom of any viewport. Hover over an icon and its name is shown above the strip, so you never have to guess which one you are about to click.\n\nNine icons, in two families: the first four frame what you are looking at, the last five change how it is drawn.","metadata":{"title":"Viewport Commands","url":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/","source":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/","collection":"docs7","hash":"e2d52c3a40f769047725c58a0ed7dacb","indexed_by":"docs-index"}},{"content":"Viewport Commands — Framing the view\n\n* Undo magnifier — steps back to the previous view, undoing the last zoom or orbit. Hold Shift to step forward again.\n* Magnify to selected — zooms until the selected objects fill the viewport. Hold Shift to do it in every viewport at once.\n* Magnify — zooms to fit everything in the model. Hold Shift for every viewport.\n* Scale to real size — sets the zoom so the model is displayed at its actual physical size on screen: a 16 mm ring measures 16 mm against a ruler. Hold Shift to calibrate it first, which you do once per monitor.\n\nScale to real size is worth calibrating on the monitor you design on. Once done, holding a ring against the screen is a genuine size check — useful before sending anything to print.","metadata":{"title":"Viewport Commands","section":"Framing the view","url":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/#framing-the-view","source":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/#framing-the-view","collection":"docs7","hash":"f461604528d18127bbec9905bd9b7d1f","indexed_by":"docs-index"}},{"content":"Viewport Commands — Display modes\n\nClicking a mode changes the active viewport. Holding Shift while you click changes all of them — Top, Front, Right and Perspective together.\n\n* Wireframe — edges only. The fastest mode, and the one where you can see through the piece.\n* Shaded — solid surfaces with flat colour. The everyday modelling mode.\n* Rendered — surfaces with their materials and the scene lighting, still drawn in real time.\n* Raytraced — Rhino's raytracer in the viewport: real reflections, refraction through stones and true shadows. The slowest to resolve, and the closest to a final image.\n* Realtime — opens the Realtime Render view, which keeps refining the image while you work.","metadata":{"title":"Viewport Commands","section":"Display modes","url":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/#display-modes","source":"https://www.rhinoartisan.com/docs/7/user-interface/viewport-commands/#display-modes","collection":"docs7","hash":"9a830ee110ce7eef632c138cf18288d9","indexed_by":"docs-index"}},{"content":"Windows Layout & Panels\n\nPanels allow us to organize the interface according to our preferences and needs. RhinoArtisan and Rhino panels can be docked anywhere within the application and even moved to other monitors, providing a larger graphical workspace.\n\nHow to display the RhinoArtisan panels?\nThe RhinoArtisan panels are visible when you install the software, but if you have closed them, you can reopen them from the Panels button in the File tab.","metadata":{"title":"Windows Layout & Panels","url":"https://www.rhinoartisan.com/docs/7/user-interface/windows-layout/","source":"https://www.rhinoartisan.com/docs/7/user-interface/windows-layout/","collection":"docs7","hash":"e9a9e981f4ecd0d4a26e5c0dae4fadaf","indexed_by":"docs-index"}},{"content":"Windows Layout & Panels — How to display the Rhino standard panels?\n\nRight-click on the tab strip at the edge of the panel area and the full list appears, RhinoArtisan's panels among Rhino's own. A tick means the panel is open; click any entry to show or hide it.\n\nHow to restore the default layout?\nIf the interface ends up scattered, or a panel refuses to come back where you want it, you do not have to fix it by hand: the Window Layout button in the File tab puts every panel back exactly as it shipped.\n\nOnce you have arranged the panels the way you like, Rhino's WindowLayouts command also lets you save the arrangement as a named layout, so you can switch between setups — for example one for modeling and one for rendering.","metadata":{"title":"Windows Layout & Panels","section":"How to display the Rhino standard panels?","url":"https://www.rhinoartisan.com/docs/7/user-interface/windows-layout/#how-to-display-the-rhino-standard-panels","source":"https://www.rhinoartisan.com/docs/7/user-interface/windows-layout/#how-to-display-the-rhino-standard-panels","collection":"docs7","hash":"a134588ce93ed73495b7b6f776220a8b","indexed_by":"docs-index"}},{"content":"MCP\n\nBeta — RhinoArtisan Labs. RhinoArtisan MCP ships in 7.0 as a beta: the tools work and you can use them today, but the surface may change while we refine it toward a stable v1. RhinoArtisan provides the tools; your AI assistant drives them — results depend on the assistant and the prompt, not only on RhinoArtisan. All license terms apply to beta features.\n\nConnect RhinoArtisan to your favorite AI assistant. RhinoArtisan exposes a local MCP server that lets compatible AI assistants work with RhinoArtisan directly inside Rhino — and not just for design. The same connection covers the whole RhinoArtisan workflow: designing, manufacturing checks, weights, pricing and reporting.\n\nThe Model Context Protocol (MCP) is the open standard the whole AI industry is converging on — Anthropic, OpenAI, Google and Microsoft all speak it, and McNeel is building RhinoMCP on the same standard for Rhino itself. RhinoArtisan MCP brings Artisan's jewelry tools into that world, and the two servers work side by side: connect both and your assistant gets Artisan's jewelry tools next to McNeel's Grasshopper and scripting tools. See Grasshopper + MCP for building ArtisanGrasshopper graphs by conversation.","metadata":{"title":"MCP","url":"https://www.rhinoartisan.com/docs/mcp/","source":"https://www.rhinoartisan.com/docs/mcp/","collection":"mcp","hash":"23b6a16182f06b184e73a57462780074","indexed_by":"docs-index"}},{"content":"MCP — Works with\n\nConnect from the AI assistants you already use:\n\n- Claude Desktop — Anthropic's Claude app, on every plan; a downloadable connector (or one command in Rhino) connects it\n- ChatGPT — through OpenAI's Secure MCP Tunnel\n- Google Gemini — through Antigravity, Google's agentic IDE\n\nAnd from the tools developers live in:\n\n- Codex · Cursor · Claude Code · VS Code / GitHub Copilot — plus any MCP client that supports streamable HTTP.\n\nPrefer to run a model on your own machine? LM Studio works too — with weaker results than a frontier model, serious hardware needs, and no support from us. Read the caveats before you try.\n\nTechnical support for MCP. RhinoArtisan's standard support covers the product itself — installation, licensing and how its tools work. MCP integrations are not covered by standard support: technical help with connecting assistants, building integrations or automating workflows over MCP is provided through RhinoArtisan Support Plus.","metadata":{"title":"MCP","section":"Works with","url":"https://www.rhinoartisan.com/docs/mcp/#works-with","source":"https://www.rhinoartisan.com/docs/mcp/#works-with","collection":"mcp","hash":"a5bbb808550d4c46ad1a84e2bff5edee","indexed_by":"docs-index"}},{"content":"MCP — What this looks like\n\nWith Rhino and RhinoArtisan running, you ask your AI assistant:\n\n> *\"Add an oval 2-carat ruby at the origin and a half-carat round diamond on each side.\"*\n\nThe assistant discovers Artisan's tools and the gems appear in your viewport — created by the exact same pipeline as the QuickGems tool, on the right layers, with the right materials, sized correctly for their carat weight.\n\nAnd design is only the beginning. RhinoArtisan MCP is built on the same automation surface that powers every Artisan module, so the same conversation extends across your whole workflow:\n\n> *\"How much does this ring weigh in 18k gold — and what would it cost?\"*\n>\n> *\"Is this model ready to print? Export the STL and prepare the production report.\"*\n\nThe whole workflow is there today — gems and every setting, shanks, pavé, booleans, relief, weight and price, printability, sprues, reports, exports, renders. The assistant can also *look* at your viewport, work with whatever you have selected, and script anything the typed tools don't cover through the same Scripting API that powers Flow Studio. See Tools for the full list.","metadata":{"title":"MCP","section":"What this looks like","url":"https://www.rhinoartisan.com/docs/mcp/#what-this-looks-like","source":"https://www.rhinoartisan.com/docs/mcp/#what-this-looks-like","collection":"mcp","hash":"b4044523ba17a22556899bac84595acb","indexed_by":"docs-index"}},{"content":"MCP — What's new in 7.0.0.11\n\n- Documentation search. `search_rhinoartisan_docs` answers questions about using RhinoArtisan from the official documentation, with links to the pages it used.\n- Company standards. `get_company_standards` returns the rules the user's company always follows — minimum sizes per metal, default metals, production steps — written once in RhinoArtisan's options. Read them before building and follow them.\n- Long operations finish. A tool that takes minutes — pricing a busy document, a batch export, the smoke test — now returns its result instead of a timeout after two minutes.\n- Boutique. `list_boutique_designs` searches the Boutique collections installed on the computer and `insert_boutique_design` imports a design, optionally in white, yellow or rose 18K gold. `get_boutique_catalog` and `download_boutique_kits` show and install the online kits.\n- AI images. `generate_ai_image` turns the viewport into a photographic render with fal.ai, edits an image file or creates one from text. fal.ai bills each image to the user's account.\n- Time tracking. `get_time_tracking` reports the hours spent on each file and each day, from the Time Tracker.\n- GLB in batch. `export_glb_batch` converts a folder of .3dm files to GLB without touching the open document.\n- Faster on big documents. Weights, prices, technical charts, the ring size estimate and `lie_on_ground` run several times faster on documents with hundreds of objects.\n- Change a stone's cut. `edit_gem` takes `shape`: the gem keeps its id, position, material and carat weight (add `carats` for \"a 1.5 ct oval\"), and the settings built on it — prongs, bezel, basket, halo — rebuild around the new cut. Resizing a gem with `edit_gem` rebuilds them too.","metadata":{"title":"MCP","section":"What's new in 7.0.0.11","url":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","source":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","collection":"mcp","hash":"d5be5c0543c9f1b2afa808516926863b","indexed_by":"docs-index"}},{"content":"MCP — What's new in 7.0.0.11\n\n- Claw prongs, one vocabulary. Every setting with prongs takes `prong_mode`: ROUND, CUSTOM or CLAW (the advanced basket also OFFSET, DOUBLE and TRIPLE; DEFAULT and CIRCLE still read as ROUND). That covers `add_basket_setting`, `add_advanced_basket`, `create_martini`, `create_tulip`, `create_trellis_setting`, `create_trilogy` and now `create_halo`, whose center prongs had no claw over MCP before. `edit_object` switches the mode later and tunes the claw, with the same four values wherever the new claw is used (`claw_cap_distance`, `claw_cap_height`, `claw_tip_width`, `claw_tip_smoothness`). Claw tips are drawn in Render mode only.\n- Advanced basket, prong by prong. `edit_object` reaches every value of the panel's per-prong and per-rail editors by path: `{\"prongs[*].inclination\": 12}` sets every prong, `{\"prongs[0].gem_inside\": 0.2}` or `{\"rails[1].width\": 1.2}` just one. `describe_object_parameters` shows the model and the paths.\n- Clients that send arguments as text. `edit_object` reads a section or a call sent as JSON text (`\"upper_rail\": \"{\\\"width\\\": 1.3}\"`) and `\"true\"` for a call such as `fit_to_gem`, so it works from clients that stringify the arguments the schema doesn't declare.","metadata":{"title":"MCP","section":"What's new in 7.0.0.11","url":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","source":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","collection":"mcp","hash":"d602ff486903457bdb780d16ff0ffbbe","indexed_by":"docs-index"}},{"content":"MCP — What's new in 7.0.0.11\n\n- Fixes. A ring size set with `set_document_settings` now applies to the rings created after it. Split shanks build on any plane and can still be edited after being moved. A row of gems on a curve reports its new stone count after a resize. A setting deleted in Rhino no longer stays in `list_objects` until the next refresh. `save_document` with a `path` leaves the document saved as that file (it used to stay \"unsaved\"). A profile on a basket's prongs switches them to CUSTOM, as on its rails, and a basket prong that becomes CUSTOM starts with its section turned 90° (pass `prong_rotation` for another angle). `create_cabochon` places the stone at `x`/`y`/`z` as documented and sizes it with `width`/`length`/`height`: the point used to become the stone's size, so \"a cabochon at x = 80\" came out 80 mm wide. Negative numbers inside lists keep their sign in tool results (a smart profile's `SectionMirrorOf` read `[1; 1; 1; 1]` for `[-1; -1; -1; 1]`).","metadata":{"title":"MCP","section":"What's new in 7.0.0.11","url":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","source":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70011","collection":"mcp","hash":"bd306664a70082492b61000180bbca21","indexed_by":"docs-index"}},{"content":"MCP — What's new in 7.0.0.10\n\n- Presets. Build from a saved element with `element` on about 25 create tools, apply one to an existing object with `edit_object {\"element\": …}`, store an object as a new preset with `save_element`, and organize the library with `manage_elements` (rename, duplicate, favorite, delete, export and import bundles).\n- Profile library. `export_asset_curve` draws a profile so the assistant can look at it before choosing it. `manage_assets` renames, duplicates, sets the default and deletes. Every `*profile` argument also accepts `\"id: \"`.\n- Smart Profiles. `create_smart_profile` sweeps profile sections along a curve, and `edit_object` edits them section by section.\n- Editable components. Bails, named pendants, bangles, beads, charms, links, milgrain, ropes, 3D textures and ring engravings can be edited after creation with `edit_object`, by path (`{\"top_profile.width\": 4.5}`).\n- Richer `edit_object`. It now calls a handle's edit methods too (`set_section`, `add_section`, `fit_to_gem`…). `describe_object_parameters` lists them as `calls`.\n- Cutters that fit the stone. `create_cutters` takes `fit_to_gem` for fancy cuts. A redesigned `create_bail` exposes every option of the Bail panel.\n- Panels. `close_panel` closes a command panel that `run_command` left open.\n\nThe Tools page lists everything.","metadata":{"title":"MCP","section":"What's new in 7.0.0.10","url":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70010","source":"https://www.rhinoartisan.com/docs/mcp/#whats-new-in-70010","collection":"mcp","hash":"be8d16a9a59d3aa2ede87c1f90c3aceb","indexed_by":"docs-index"}},{"content":"MCP — How it works\n\n```\nAI assistant (Claude, ChatGPT, Gemini, …)\n    │  Model Context Protocol (localhost only)\n    ▼\nRhinoArtisan MCP bridge  ──►  RhinoArtisan  ──►  your document\n```\n\n- Included with RhinoArtisan 7 — nothing extra to install.\n- The bridge runs entirely on your machine: it listens on `localhost` only and is never exposed to the network.\n- Tools execute through RhinoArtisan itself — same pipelines as the UI tools, same licensing, same friendly error messages.\n- Read-only tools (listing gems, discovering valid shapes and materials) are separated from tools that modify the document, so assistants can explore safely before they act.","metadata":{"title":"MCP","section":"How it works","url":"https://www.rhinoartisan.com/docs/mcp/#how-it-works","source":"https://www.rhinoartisan.com/docs/mcp/#how-it-works","collection":"mcp","hash":"a22e5940956fd77cb75a0af849fe05db","indexed_by":"docs-index"}},{"content":"MCP — Why it matters\n\nA jeweler's AI assistant is only as good as the tools it can use. MCP turns RhinoArtisan into a first-class tool for any capable agent — today for early experiments, tomorrow as the standard way AI works alongside professional software.\n\nReady to try it? Head to Getting Started, then see Tools for what the toolset covers today. Have a workflow in mind? Talk to us.","metadata":{"title":"MCP","section":"Why it matters","url":"https://www.rhinoartisan.com/docs/mcp/#why-it-matters","source":"https://www.rhinoartisan.com/docs/mcp/#why-it-matters","collection":"mcp","hash":"47a8f5633640a578d129a4a30a2f6d95","indexed_by":"docs-index"}},{"content":"Connect your AI\n\nRhinoArtisan works with every AI assistant that speaks the Model Context Protocol. Pick yours, follow a two-minute setup, and start designing by conversation.\n\nAI Assistants\n- Claude Desktop — Anthropic's Claude app. A downloadable connector or one command in Rhino, nothing else to install. Works on every Claude plan.\n- ChatGPT — through OpenAI's Secure MCP Tunnel (Business/Enterprise plans).\n- Google Gemini — through Antigravity, Google's agentic IDE and CLI.","metadata":{"title":"Connect your AI","url":"https://www.rhinoartisan.com/docs/mcp/connect/","source":"https://www.rhinoartisan.com/docs/mcp/connect/","collection":"mcp","hash":"1b8a3c3e54e24628ea890b79619f5bd5","indexed_by":"docs-index"}},{"content":"Connect your AI — Developer & advanced tools\n\nWorking from a terminal or an editor? These connect directly, no bridge needed.\n\n- Codex — OpenAI's coding agent, uses your ChatGPT account.\n- Cursor — with one-click install.\n- Claude Code — one command and you're connected.\n- VS Code / GitHub Copilot — works on every Copilot plan, including Free.\n\nLocal models\n- LM Studio — run a free, open-weights model on your own hardware. Read the caveats first: we recommend frontier models, local ones need serious hardware and give weaker results, and they are outside RhinoArtisan support.","metadata":{"title":"Connect your AI","section":"Developer & advanced tools","url":"https://www.rhinoartisan.com/docs/mcp/connect/#developer--advanced-tools","source":"https://www.rhinoartisan.com/docs/mcp/connect/#developer--advanced-tools","collection":"mcp","hash":"7602f3d0a54ec290aecc8c1a3f32ba0c","indexed_by":"docs-index"}},{"content":"Connect your AI — Anything else\n\nAny MCP client that supports streamable HTTP can connect — see Other MCP clients.\n\n> Before you connect: make sure Rhino is running with RhinoArtisan 7 — that's the whole server-side setup. See Getting Started.","metadata":{"title":"Connect your AI","section":"Anything else","url":"https://www.rhinoartisan.com/docs/mcp/connect/#anything-else","source":"https://www.rhinoartisan.com/docs/mcp/connect/#anything-else","collection":"mcp","hash":"035b0771e7b1d2d2f7adf4def763ac6a","indexed_by":"docs-index"}},{"content":"ChatGPT\n\nChatGPT's connectors run in OpenAI's cloud, so they can't see your computer directly. OpenAI's official answer is the Secure MCP Tunnel: a small program from OpenAI that runs on your machine and relays ChatGPT securely to RhinoArtisan — outbound-only, nothing on your computer is ever exposed to the internet.\n\nFair warning: this is currently the most involved setup of all the clients, aimed at businesses and advanced users.\n\n> Shortcut: Codex uses your same ChatGPT account, connects to RhinoArtisan directly, and takes two minutes to set up.\n\nYou need: an OpenAI Platform account, plus a ChatGPT plan with developer mode — Business, Enterprise or Edu for the full experience (creating gems), Pro for read-only access. Web only for now.","metadata":{"title":"ChatGPT","url":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/","source":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/","collection":"mcp","hash":"1ba0dd04c7fb0536b32204f0798f0a9f","indexed_by":"docs-index"}},{"content":"ChatGPT — Setup\n\n1. Install OpenAI's `tunnel-client` (Windows, Mac and Docker builds available).\n2. Create a tunnel at platform.openai.com → Settings → Organization → Tunnels and generate an API key with Tunnels permission.\n3. Point the tunnel at RhinoArtisan and start it:\n\n```bash\ntunnel-client init --profile artisan --tunnel-id <your-tunnel-id> --mcp-server-url http://127.0.0.1:9280/mcp\ntunnel-client run --profile artisan\n```\n\n4. In ChatGPT (with developer mode enabled): Settings → Apps → Create, choose Connection: Tunnel and select your tunnel. ChatGPT scans RhinoArtisan's tools and you can test right away.\n5. Keep `tunnel-client run` running while you work.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"ChatGPT","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/#setup","source":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/#setup","collection":"mcp","hash":"d3f571fc16ba32c9bca27c9c2e8a80ba","indexed_by":"docs-index"}},{"content":"ChatGPT — Try it\n\nWith Rhino open, ask ChatGPT:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"ChatGPT","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/chatgpt/#try-it","collection":"mcp","hash":"b96281d363ce3ef520f2b6dd95151101","indexed_by":"docs-index"}},{"content":"Claude Code — Setup\n\nOne command:\n\n```bash\nclaude mcp add --transport http artisan http://127.0.0.1:9280/mcp\n```\n\nAdd `--scope user` to make it available in every project.\n\nCheck it's connected\n```bash\nclaude mcp list\n```\n\nYou'll see artisan: ✔ Connected.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Claude Code","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-code/#setup","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-code/#setup","collection":"mcp","hash":"1fbdda83d579f5f568c10b2de916d384","indexed_by":"docs-index"}},{"content":"Claude Code — Try it\n\nWith Rhino open, ask Claude:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"Claude Code","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-code/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-code/#try-it","collection":"mcp","hash":"c6bd8592b7288431b68fab7cba810a7d","indexed_by":"docs-index"}},{"content":"Claude Desktop\n\nThe Claude app on your computer connects directly to RhinoArtisan. Available on every Claude plan — and, from RhinoArtisan 7.0.0.4, with nothing else to install: no Node.js, no configuration files to edit.\n\nYou need: the Claude Desktop app, opened at least once. The classic installer and the Microsoft Store version both work.","metadata":{"title":"Claude Desktop","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/","collection":"mcp","hash":"e5da9b4ddcab18eb8a8a29fab84bc8c9","indexed_by":"docs-index"}},{"content":"Claude Desktop — Setup A — download the connector\n\nInstall RhinoArtisan as a Claude Desktop extension:\n\nDownload RhinoArtisanMCP.mcpb (Windows)\n\nDrag the downloaded file into Claude Desktop's Settings → Extensions (double-clicking it also works when Windows has the file type associated) and confirm. Rhino does not need to be running: the tools appear automatically whenever Rhino with RhinoArtisan is open. If you moved the MCP port, change it in the extension's settings.","metadata":{"title":"Claude Desktop","section":"Setup A — download the connector","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#setup-a--download-the-connector","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#setup-a--download-the-connector","collection":"mcp","hash":"2acff566f0cdcb484131c8bfee212334","indexed_by":"docs-index"}},{"content":"Claude Desktop — Setup B — one command in Rhino\n\n1. In Rhino, run:\n\n```\nArtisanMcpConnectClaude\n```\n\nPress Enter. RhinoArtisan registers itself in Claude Desktop's configuration and prints where the entry went. Any other servers you had configured are left untouched, and a copy of the previous file is kept next to it as `.bak`.\n\n2. Quit Claude Desktop completely — File → Exit, or from the system tray; closing the window is not enough — and open it again.\n\nThat's it. Run the command again whenever you want to refresh the entry (for example after changing the port); `ArtisanMcpConnectClaude Remove=Yes` unregisters RhinoArtisan.\n\n> Tip: skip the \"Add custom connector\" option in Claude's settings — those connectors run in Anthropic's cloud and can't see RhinoArtisan on your computer. Use the downloadable connector or the command above instead.","metadata":{"title":"Claude Desktop","section":"Setup B — one command in Rhino","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#setup-b--one-command-in-rhino","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#setup-b--one-command-in-rhino","collection":"mcp","hash":"6600ed9530cb61da08dfe1e0e3c862d7","indexed_by":"docs-index"}},{"content":"Claude Desktop — Check it's connected\n\nClick the + button in the chat box → Connectors — RhinoArtisan appears in the list with its tools.\n\nRhino does not need to be open when Claude starts. Claude keeps the connection, and RhinoArtisan's tools show up automatically as soon as Rhino is running with RhinoArtisan loaded — and disappear again when you close it. If you ask for a tool while Rhino is closed, Claude simply tells you to start it.","metadata":{"title":"Claude Desktop","section":"Check it's connected","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#check-its-connected","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#check-its-connected","collection":"mcp","hash":"e3001bcecdf7d409069b3b3f9145f59a","indexed_by":"docs-index"}},{"content":"Claude Desktop — Try it\n\nWith Rhino open, ask Claude:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.\n\nManual setup\nPrefer to edit the configuration yourself? Open the Claude menu → Settings → Developer → Edit Config. This opens a file called `claude_desktop_config.json` (on Windows it lives in `%APPDATA%\\Claude\\`; the Microsoft Store version keeps it under `%LOCALAPPDATA%\\Packages\\Claude_…\\LocalCache\\Roaming\\Claude\\`).\n\nClaude Desktop only launches local *stdio* servers from that file, so the entry points at the small bridge program the RhinoArtisan installer ships, which relays Claude to the server running inside Rhino:\n\n```json\n{\n  \"mcpServers\": {\n    \"RhinoArtisan\": {\n      \"command\": \"C:\\\\Program Files\\\\RhinoArtisan 7\\\\MCP\\\\ArtisanMcpBridge.exe\",\n      \"args\": [\"http://127.0.0.1:9280/mcp\"]\n    }\n  }\n}\n```\n\nAdjust the path if you installed RhinoArtisan in another folder. Without the bridge, the `mcp-remote` adapter does the same job but needs Node.js on the machine:\n\n```json\n{\n  \"mcpServers\": {\n    \"RhinoArtisan\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"http://127.0.0.1:9280/mcp\"]\n    }\n  }\n}\n```\n\nSave, then quit Claude Desktop completely and open it again.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, run `ArtisanMcpConnectClaude` again (it registers the current port) — or, in a manual setup, use that address instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Claude Desktop","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/claude-desktop/#try-it","collection":"mcp","hash":"359ed17103c51430d49a82fa86fed3ee","indexed_by":"docs-index"}},{"content":"Codex\n\nOpenAI's coding agent — the CLI, the IDE extension and the ChatGPT desktop app all share one config. Sign in with your ChatGPT account; Codex is included across ChatGPT plans.\n\nSetup\nAdd to `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.artisan]\nurl = \"http://127.0.0.1:9280/mcp\"\n```\n\nCheck it's connected\nRun `codex mcp list` (or type `/mcp` inside a session) — artisan appears with its tools.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Codex","url":"https://www.rhinoartisan.com/docs/mcp/connect/codex/","source":"https://www.rhinoartisan.com/docs/mcp/connect/codex/","collection":"mcp","hash":"5c55972694e4b445582f8f0dc98ce2e8","indexed_by":"docs-index"}},{"content":"Codex — Try it\n\nWith Rhino open, ask Codex:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"Codex","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/codex/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/codex/#try-it","collection":"mcp","hash":"b6ed6cc6b56d2b8c09da101149f8b05b","indexed_by":"docs-index"}},{"content":"Cursor — Setup\n\nUse the one-click install: Add to Cursor\n\nOr add it by hand to `~/.cursor/mcp.json` (all projects) or `.cursor/mcp.json` (one project):\n\n```json\n{\n  \"mcpServers\": {\n    \"artisan\": {\n      \"url\": \"http://127.0.0.1:9280/mcp\"\n    }\n  }\n}\n```\n\nCheck it's connected\nThe server appears with a toggle under Settings → MCP, and its tools show up in Agent chats.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Cursor","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/connect/cursor/#setup","source":"https://www.rhinoartisan.com/docs/mcp/connect/cursor/#setup","collection":"mcp","hash":"28f45a791f47c85b96ad736674fdbcd9","indexed_by":"docs-index"}},{"content":"Cursor — Try it\n\nWith Rhino open, ask the Agent:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"Cursor","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/cursor/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/cursor/#try-it","collection":"mcp","hash":"3d3efa0fea0c6bb09ceaa295b59bf672","indexed_by":"docs-index"}},{"content":"Google Gemini\n\nThe Gemini app at gemini.google.com can't reach programs on your computer — its connections are made from Google's cloud. Google's tool for working with local software is Antigravity, its agentic IDE and CLI (the successor to Gemini CLI), powered by the same Gemini models.\n\nYou need: Antigravity (free download, sign in with your Google account).","metadata":{"title":"Google Gemini","url":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/","source":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/","collection":"mcp","hash":"6947be99daf06b55aa78ab4ef680ee4c","indexed_by":"docs-index"}},{"content":"Google Gemini — Setup\n\nOpen (or create) the file `~/.gemini/config/mcp_config.json` and add:\n\n```json\n{\n  \"mcpServers\": {\n    \"artisan\": {\n      \"serverUrl\": \"http://127.0.0.1:9280/mcp\"\n    }\n  }\n}\n```\n\n> Note: if your company uses Gemini Code Assist (Standard/Enterprise) you may still have the classic Gemini CLI — there, run `gemini mcp add --transport http artisan http://127.0.0.1:9280/mcp` instead.","metadata":{"title":"Google Gemini","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#setup","source":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#setup","collection":"mcp","hash":"2f765d52af7a55a85b32782e27e13919","indexed_by":"docs-index"}},{"content":"Google Gemini — Check it's connected\n\nIn the Antigravity CLI, type `/mcp` — the MCP Manager shows artisan as active. In the Antigravity IDE, check the ⋯ menu → MCP Servers in the agent panel.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Google Gemini","section":"Check it's connected","url":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#check-its-connected","source":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#check-its-connected","collection":"mcp","hash":"c20011b0619f099fa1d901dc09de828e","indexed_by":"docs-index"}},{"content":"Google Gemini — Try it\n\nWith Rhino open, ask Gemini:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"Google Gemini","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/gemini/#try-it","collection":"mcp","hash":"37457694755e37ea23175c6258299196","indexed_by":"docs-index"}},{"content":"Local models (LM Studio)\n\nEvery assistant in this section runs a frontier model in the cloud, and most of them are paid. LM Studio is the way to try RhinoArtisan MCP with a model running on your own machine: free, offline, and nothing leaves your computer.\n\nRead this before you start. We recommend frontier models. Local models are an option we make possible, not one we recommend.\n\n- Don't expect the same results. A local model will not design like Claude, ChatGPT or Gemini do. Some tasks will take several tries; some will not work at all.\n- They need serious hardware. A capable model needs a lot of memory — see Hardware.\n- Results are your responsibility. There are thousands of models, each in dozens of versions and quantizations. We don't test them and we can't answer for what they do. If you want to try, it is your experiment.\n- Not covered by support. MCP is not included in RhinoArtisan's standard support, and we don't provide support for third-party applications — LM Studio included — or for the models you run in them.","metadata":{"title":"Local models (LM Studio)","url":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/","source":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/","collection":"mcp","hash":"dadf357f24e823c69dd017cfa1588585","indexed_by":"docs-index"}},{"content":"Local models (LM Studio) — Frontier models vs local models\n\nA frontier model is one of the largest, most capable models that exist — Anthropic's Claude, OpenAI's GPT, Google's Gemini. They are trained and run by the big AI labs on hardware no desktop can match, and they are the models that make MCP shine: they follow a long list of tools, chain several calls to complete a task, recover from errors and understand jewelry vocabulary without being told.\n\nA local model is a smaller, open-weights model — the Llama, Qwen, Mistral, Gemma or gpt-oss families — compressed (*quantized*) so it fits on a consumer computer. Fewer parameters and less precision mean less capability: a local model may pick the wrong tool, invent an argument, lose the thread after a few steps, or give up on a long instruction. The best ones handle simple, one-step requests well. None of them matches a frontier model.\n\nRule of thumb: what a frontier model does in one prompt, a local model may need several — or may never do.","metadata":{"title":"Local models (LM Studio)","section":"Frontier models vs local models","url":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#frontier-models-vs-local-models","source":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#frontier-models-vs-local-models","collection":"mcp","hash":"92ed844c5b362fc325a96c26115815ae","indexed_by":"docs-index"}},{"content":"Local models (LM Studio) — Hardware\n\nA local model runs entirely on your machine, and the bigger the model, the better it follows tools and the more memory it needs. The model has to fit in memory: unified memory on Apple Silicon, GPU memory (VRAM) on Windows. If it doesn't fit, LM Studio falls back to the CPU and the model becomes too slow to be useful.\n\nRough sizes at 4-bit quantization, the usual compromise:\n\n| Model size | Memory needed | What to expect with RhinoArtisan MCP |\n|---|---|---|\n| 7–9B parameters | ~5–6 GB | Simple one-step tasks, frequent mistakes |\n| 14B | ~9–10 GB | Usable for short conversations |\n| 30B and up | 20 GB or more | The closest a local model gets to a frontier one |\n\nWhere to check:\n\n- LM Studio's system requirements — supported chips and operating systems. In short: Apple Silicon on macOS 14 or newer (Intel Macs are not supported), Windows x64 with AVX2 or ARM, 16 GB of RAM recommended, at least 4 GB of dedicated VRAM on Windows.\n- The model page inside LM Studio — every download shows its size and whether it fits your machine before you download it.\n- Context length. RhinoArtisan exposes more than 200 tools, and their definitions alone take a big slice of the model's context window. Load the model with the largest context your memory allows — 32k tokens or more — or the conversation overflows after a couple of messages. LM Studio's own docs warn that MCP servers built for Claude or ChatGPT \"may quickly bog down your local model\".","metadata":{"title":"Local models (LM Studio)","section":"Hardware","url":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#hardware","source":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#hardware","collection":"mcp","hash":"317a96484ed0e11e0f5ed76bce0b9192","indexed_by":"docs-index"}},{"content":"Local models (LM Studio) — Setup\n\nYou need LM Studio 0.3.17 or newer, a model with the hammer badge (native tool use — LM Studio shows it in the model browser), and Rhino running with RhinoArtisan 7.\n\n1. Install LM Studio and download a model with the hammer badge. Pick the largest one that fits your machine.\n2. Add RhinoArtisan with the one-click install: Add to LM Studio\n\nOr by hand: open the Program tab in the right sidebar, choose Install → Edit mcp.json, and add:\n\n```json\n   {\n     \"mcpServers\": {\n       \"artisan\": {\n         \"url\": \"http://127.0.0.1:9280/mcp\"\n       }\n     }\n   }\n   ```\n\n3. Load the model with a large context length, and turn the `artisan` server on for your chat from the Program tab.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Local models (LM Studio)","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#setup","source":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#setup","collection":"mcp","hash":"50bff16ac7c374b6334c3e994ae72bc7","indexed_by":"docs-index"}},{"content":"Local models (LM Studio) — Try it\n\nWith Rhino open, ask:\n\n> *\"Create a round 1 ct diamond.\"*\n\nLM Studio asks you to confirm the tool call the first time — you can allow it once or always, and manage those permissions later under App Settings → Tools & Integrations. The stone appears in your Rhino viewport.\n\nWhat to expect\n- The model never calls a tool. It has no native tool support, or the context is too small for the tool list. Try a model with the hammer badge and a larger context.\n- It calls the wrong tool or invents arguments. That is the model's capability, not a RhinoArtisan issue. A bigger model helps; if a bigger one doesn't fit, you have reached your hardware's ceiling.\n- Everything is slow. The model doesn't fit in GPU memory. Use a smaller model or a smaller quantization.\n- A tool returns an error with Rhino open. Check Troubleshooting first. If the same request works from Claude Desktop and fails from a local model, the difference is the model.\n\nSupport. RhinoArtisan's standard support covers the product itself — installation, licensing and how its tools work. It does not cover MCP, and we don't support external applications such as LM Studio or the models you run in them. Help connecting assistants over MCP is available through RhinoArtisan Support Plus; the results you get from a local model are yours to explore.","metadata":{"title":"Local models (LM Studio)","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/connect/lm-studio/#try-it","collection":"mcp","hash":"5daab860f6298adfd3e4246e440efed8","indexed_by":"docs-index"}},{"content":"Other MCP clients\n\nAny client that supports the MCP streamable HTTP transport can connect to:\n\n```\nhttp://127.0.0.1:9280/mcp\n```\n\nClients that only launch stdio servers\nSome clients (Claude Desktop among them) only start local *stdio* servers. The RhinoArtisan installer ships a small bridge for them, `ArtisanMcpBridge.exe`, in the `MCP` folder of the installation — usually `C:\\Program Files\\RhinoArtisan 7\\MCP\\`. It needs nothing else on the machine, and it keeps the client connected while Rhino is closed: the tools appear as soon as Rhino starts.\n\n```json\n{\n  \"mcpServers\": {\n    \"RhinoArtisan\": {\n      \"command\": \"C:\\\\Program Files\\\\RhinoArtisan 7\\\\MCP\\\\ArtisanMcpBridge.exe\",\n      \"args\": [\"http://127.0.0.1:9280/mcp\"]\n    }\n  }\n}\n```\n\nThe bridge also accepts `--port 9281` instead of a full URL. If you would rather not depend on the installer's copy, the `mcp-remote` adapter does the same job but needs Node.js:\n\n```json\n{\n  \"mcpServers\": {\n    \"RhinoArtisan\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"http://127.0.0.1:9280/mcp\"]\n    }\n  }\n}\n```\n\nOnce connected, test it with Rhino open:\n\n> *\"Create a round 1 ct diamond.\"*\n\nNot working? See Troubleshooting.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.","metadata":{"title":"Other MCP clients","url":"https://www.rhinoartisan.com/docs/mcp/connect/other/","source":"https://www.rhinoartisan.com/docs/mcp/connect/other/","collection":"mcp","hash":"8019f1dd65974d98dda115090b1e2271","indexed_by":"docs-index"}},{"content":"VS Code / GitHub Copilot\n\nWorks on every Copilot plan, including Free.\n\nSetup\nCommand Palette → MCP: Add Server → HTTP → enter `http://127.0.0.1:9280/mcp` → name it `artisan`.\n\nOr add to `.vscode/mcp.json`:\n\n```json\n{\n  \"servers\": {\n    \"artisan\": {\n      \"type\": \"http\",\n      \"url\": \"http://127.0.0.1:9280/mcp\"\n    }\n  }\n}\n```\n\n(Note the root key is `servers` here, not `mcpServers`.)","metadata":{"title":"VS Code / GitHub Copilot","url":"https://www.rhinoartisan.com/docs/mcp/connect/vs-code/","source":"https://www.rhinoartisan.com/docs/mcp/connect/vs-code/","collection":"mcp","hash":"b6cdad2d18dfd5718538e18331c6109d","indexed_by":"docs-index"}},{"content":"VS Code / GitHub Copilot — Check it's connected\n\nOpen Copilot Chat in Agent mode and click the tools icon — RhinoArtisan's tools are listed.\n\n> Using a different port? If Rhino printed another address when you ran `ArtisanMcpStart Port=…`, use that one instead of `http://127.0.0.1:9280/mcp`. See Changing the port.\n\nTry it\nWith Rhino open, ask Copilot:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your Rhino viewport. Not working? See Troubleshooting.","metadata":{"title":"VS Code / GitHub Copilot","section":"Check it's connected","url":"https://www.rhinoartisan.com/docs/mcp/connect/vs-code/#check-its-connected","source":"https://www.rhinoartisan.com/docs/mcp/connect/vs-code/#check-its-connected","collection":"mcp","hash":"600410bb769e5c8bc6b530a19c27bc72","indexed_by":"docs-index"}},{"content":"Getting Started\n\nRhinoArtisan speaks the language every major AI assistant is adopting: the Model Context Protocol. Connect your assistant once, and your whole workflow turns into a conversation:\n\n> *\"Design a solitaire ring with a 1 ct round diamond, give me its price in 18k gold, and export the STL for printing.\"*\n\nThat conversation works today — design, manufacturing, pricing and reporting through one connection, with the assistant able to look at your viewport, work with what you have selected, and script anything beyond the typed tools. Your assistant picks up every new tool automatically. Everything it does lands in your document as a normal Artisan operation you can undo with a regular Undo.","metadata":{"title":"Getting Started","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/","collection":"mcp","hash":"81fbb751158cb74d8d4cf524736d072d","indexed_by":"docs-index"}},{"content":"Getting Started — Before you start\n\nYou only need two things:\n\n- RhinoArtisan 7 (on Rhino 8 or 9), installed and licensed. The AI bridge ships with the RhinoArtisan 7 installer — there is nothing extra to install.\n- An AI assistant — see Connect your AI for the full list.\n\nYour seat covers MCP on your own workstation, with you supervising the assistant. Running it on a server — Windows Server, Rhino.Compute or any unattended host — needs an Automation license, and anything your customers drive needs an OEM agreement — talk to us.","metadata":{"title":"Getting Started","section":"Before you start","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/#before-you-start","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/#before-you-start","collection":"mcp","hash":"3ac4fad46207e5d5263f81eca9596f33","indexed_by":"docs-index"}},{"content":"Getting Started — Step 1 — Start Rhino\n\nThat's it, really. RhinoArtisan quietly runs a private server on your computer that assistants can talk to. It starts with Rhino, it is only visible to programs on your own machine — never to the internet — and you can switch it off at any time with the `ArtisanMcpStop` command (and back on with `ArtisanMcpStart`).","metadata":{"title":"Getting Started","section":"Step 1 — Start Rhino","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/#step-1--start-rhino","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/#step-1--start-rhino","collection":"mcp","hash":"94e3bee601120ebafeaa25ef280f3bed","indexed_by":"docs-index"}},{"content":"Getting Started — Changing the port\n\nThe server listens on `http://127.0.0.1:9280/mcp`. If that port is taken on your machine — a second Rhino instance, or another MCP server — pick a different one:\n\n```\nArtisanMcpStart Port=9281\n```\n\nRhino restarts the server on the new port, remembers it for the next sessions, and prints the address to use. Configure your assistant with that address instead of the default one.","metadata":{"title":"Getting Started","section":"Changing the port","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/#changing-the-port","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/#changing-the-port","collection":"mcp","hash":"4fff5018882c99448ed39f4cb3e7ad50","indexed_by":"docs-index"}},{"content":"Getting Started — Step 2 — Connect your assistant\n\nPick yours in Connect your AI and follow the two-minute setup:\n\n- AI assistants: Claude Desktop (one command in Rhino: `ArtisanMcpConnectClaude`) · ChatGPT · Google Gemini\n- Developer tools: Codex · Cursor · Claude Code · VS Code / Copilot · others\n\nStep 3 — Ask for jewelry\nWith Rhino open and your assistant connected, try:\n\n> *\"Create a round 1 ct diamond.\"*\n\nThe stone appears in your viewport — right layer, right material, correctly sized for its carat weight. Then try *\"put a bezel on it, make the wall 0.8 mm, and show me\"* — the assistant edits the setting and sends you a picture of the viewport. From there, explore what else it can do in Tools.","metadata":{"title":"Getting Started","section":"Step 2 — Connect your assistant","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/#step-2--connect-your-assistant","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/#step-2--connect-your-assistant","collection":"mcp","hash":"6985890bb6013c4fbe37de7db633bb13","indexed_by":"docs-index"}},{"content":"Getting Started — Troubleshooting\n\n- The assistant doesn't see RhinoArtisan — make sure Rhino is running; when Rhino starts, the command line should show `ArtisanMCP 7.0.0.1 loaded, MCP server on http://127.0.0.1:9280/mcp` (with your version number). If it doesn't, run `ArtisanMcpStart`.\n- The server didn't start because the port is busy — Rhino says `port 9280 is not available`. Usually a second Rhino instance, or another program, already owns that port. Either run `ArtisanMcpStart` in the Rhino you want to use, or move this one to a free port (see Changing the port).\n- You changed the port — the address in your assistant's configuration must match the one Rhino prints. Update it and reconnect.\n- Claude Desktop doesn't show RhinoArtisan — run `ArtisanMcpConnectClaude` in Rhino again, then quit Claude completely (File → Exit or from the system tray, not just the window) and reopen. If you set the entry up by hand with `mcp-remote`, it also needs Node.js installed.\n- Claude Desktop shows RhinoArtisan but no tools — Rhino is not running, or its MCP server is stopped. Start Rhino (or run `ArtisanMcpStart`): the tools appear in Claude automatically, no restart needed.\n- Tools fail with a license message — AI assistants work through RhinoArtisan itself, so they need your RhinoArtisan license to be active.","metadata":{"title":"Getting Started","section":"Troubleshooting","url":"https://www.rhinoartisan.com/docs/mcp/getting-started/#troubleshooting","source":"https://www.rhinoartisan.com/docs/mcp/getting-started/#troubleshooting","collection":"mcp","hash":"ab937412c31cb7b8715730a90922f60f","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP\n\nArtisanGrasshopper puts RhinoArtisan's parametric engine on the Grasshopper canvas — around 219 components across the Shanks, Gemset, Gems, Readers and Artisan tabs. Your AI assistant can build those graphs for you: McNeel's Rhino MCP Platform provides the generic Grasshopper tools (search, place, wire, solve), and RhinoArtisan MCP provides the knowledge those tools lack — what each Artisan component does, and the JSON shortcut that makes graphs fast to build.\n\nThe two servers are designed to work side by side in the same Rhino: connect both, and your assistant combines them in one conversation.\n\n| Server | What it contributes |\n|---|---|\n| RhinoArtisan MCP (this one) | The document workflow — design, editing, analysis, pricing, production — plus `gh_reference`: the ArtisanGrasshopper component reference |\n| Rhino MCP Platform (McNeel) | The canvas — `g1_search_components`, `g1_place_component`, `g1_place_slider`, `g1_connect`, `g1_apply_graph`, `g1_get_canvas_graph`, `g1_solve_graph` |","metadata":{"title":"Grasshopper + MCP","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/","collection":"mcp","hash":"fd70b3312e28eb3945b52d99607b0836","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP — Setup\n\n1. RhinoArtisan MCP — ships with RhinoArtisan 7; see Getting Started.\n2. Rhino MCP Platform — install the *Rhino MCP Platform* plugin from Rhino's PackageManager (free, by McNeel), then connect it to your assistant following McNeel's guide. For Claude Desktop, McNeel offers a one-click connector.\n3. Both servers appear in your assistant. That's all — ArtisanGrasshopper components are part of the Grasshopper library, so McNeel's tools find them like any native component.\n\nLicensing. ArtisanGrasshopper components check your RhinoArtisan license when they solve. Without a valid license the component reports a runtime error on the canvas — which `g1_solve_graph` relays to the assistant — and produces no geometry.","metadata":{"title":"Grasshopper + MCP","section":"Setup","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#setup","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#setup","collection":"mcp","hash":"05bac3c315a2b58a197556303fb5d3ef","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP — How the assistant works\n\nThe loop the two servers enable:\n\n1. `gh_reference` (RhinoArtisan MCP) — the assistant reads the Artisan component catalog: tabs and names first; then, filtered, each component's inputs, outputs and placement Guid.\n2. `g1_apply_graph` (Rhino MCP) — it places sliders and components and wires them in one call, using the Guids from step 1.\n3. `g1_solve_graph` — it solves the canvas and reads back any errors or warnings, correcting the graph until it computes.","metadata":{"title":"Grasshopper + MCP","section":"How the assistant works","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#how-the-assistant-works","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#how-the-assistant-works","collection":"mcp","hash":"ed6259e6af400d71eb10778fe15a7057","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP — The JSON shortcut\n\nMost Artisan generator components accept their whole parameter set as a single ` JSON` text input — the same models the panels use, serialized. `gh_reference` returns each component's JSON model *with the tool defaults filled in*, so instead of placing twenty sliders the assistant can edit a few fields and feed the model as one text panel:\n\n```json\n{\"Width\": 2.5, \"Height\": 1.8, \"FingerSize\": 54, ...}\n```\n\nThat keeps graphs small, fast to build, and easy to re-parameterize: change a value in the JSON, re-solve, done. The 49 `* Parameters` reader components do the reverse — they expose a baked element's model to the canvas.","metadata":{"title":"Grasshopper + MCP","section":"The JSON shortcut","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#the-json-shortcut","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#the-json-shortcut","collection":"mcp","hash":"ea8eddaf719ed94ee64e5db8d0944a2c","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP — Try it\n\nWith both servers connected and Rhino open:\n\n> *\"Open Grasshopper and build me a parametric eternity ring: an Artisan Eternity component fed by sliders for finger size and gem size. Solve it and show me.\"*\n\nThe assistant loads Grasshopper, looks up the Eternity component with `gh_reference`, places and wires it with `g1_apply_graph`, solves, and reads back the canvas status. From there, iteration is conversational: *\"add a channel\"*, *\"make the gems 1.5 mm\"*, *\"bake it and tell me the weight in 18k gold\"* — that last step crossing back to RhinoArtisan MCP for `calculate_weight`.\n\nGrasshopper must be loaded before the Grasshopper tools can see the component library. The assistant handles this itself (`g1_start`, or RhinoArtisan MCP's `run_command` with `-_Grasshopper`); if a Grasshopper tool reports an empty library, ask it to start Grasshopper first.","metadata":{"title":"Grasshopper + MCP","section":"Try it","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#try-it","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#try-it","collection":"mcp","hash":"3b6cfe7993488bc0c225a529c5276399","indexed_by":"docs-index"}},{"content":"Grasshopper + MCP — Notes and limits\n\n- Rhino 8 / Grasshopper 1. ArtisanGrasshopper targets Grasshopper 1 today. McNeel's `g2_*` tools drive Grasshopper 2 on Rhino 9; Artisan components will be re-validated there when ArtisanGrasshopper supports GH2.\n- Rhino MCP Platform is McNeel's product. Its tools, installation and behavior are documented and supported by McNeel; RhinoArtisan support covers the Artisan components and RhinoArtisan MCP.\n- Baking and document-side work (weights, pricing, exports, production checks) belong to RhinoArtisan MCP's tools — the assistant switches servers naturally within the same conversation.","metadata":{"title":"Grasshopper + MCP","section":"Notes and limits","url":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#notes-and-limits","source":"https://www.rhinoartisan.com/docs/mcp/grasshopper/#notes-and-limits","collection":"mcp","hash":"2fdc1f5f937fea467321f4a8ad602cf2","indexed_by":"docs-index"}},{"content":"Tools\n\nRhinoArtisan MCP exposes the same automation surface that powers Flow Studio scripts — design, editing, analysis, manufacturing, pricing and reporting. Your assistant picks up new tools automatically: connect once, and every release makes it more capable.\n\nRead-only tools are separated from tools that modify the document, so assistants can explore your design safely before they act. Anything they create lands in your document as a normal, undoable Artisan operation — parametric, grouped and layered exactly as if you had used the panel yourself.\n\nAll dimensions are millimetres. Omitting a dimensional argument (or passing 0) keeps the tool's default — the same defaults you have saved in RhinoArtisan.","metadata":{"title":"Tools","url":"https://www.rhinoartisan.com/docs/mcp/tools/","source":"https://www.rhinoartisan.com/docs/mcp/tools/","collection":"mcp","hash":"40d2af32924208bd62e0516550a757c7","indexed_by":"docs-index"}},{"content":"Tools — Gems\n\n| Tool | What it does |\n|---|---|\n| `get_gem_options` | Returns the valid values for the `shape` and `material` arguments of add_gem. *(read-only)* |\n| `list_gems` | Lists every Artisan gem in the active Rhino document with its id, shape, material, carat weight, size in mm and position. *(read-only)* |\n| `add_gem` | Creates a gem in the active Rhino document using RhinoArtisan (same pipeline as QuickGems: proportions derived from carat weight, material and layer applied). |\n| `edit_gem` | Edits an existing gem in place: shape (cut), material, carat weight, explicit size in mm, uniform scale, rotation around its own axis, translation, or flip upside down. |\n| `check_gem_collisions` | Finds pairs of gems that touch or overlap. *(read-only)* |","metadata":{"title":"Tools","section":"Gems","url":"https://www.rhinoartisan.com/docs/mcp/tools/#gems","source":"https://www.rhinoartisan.com/docs/mcp/tools/#gems","collection":"mcp","hash":"da84c3e818c634a9129c19d6bd9b7980","indexed_by":"docs-index"}},{"content":"Tools — Parametric objects (query / edit / delete)\n\n| Tool | What it does |\n|---|---|\n| `list_objects` | Lists the parametric Artisan objects in the document (shanks, halos, bezels, baskets, pegheads, clusters, micro-settings, gems-on-curve rows, channels, cutters...) with their ids and parameters. *(read-only)* |\n| `get_selection` | Lists what the user has selected in Rhino right now: Artisan gems (with shape, material, carats, size), parametric Artisan objects (kind and id), and any other object (Rhino type, name, layer, and the parametric group it belongs to). *(read-only)* |\n| `describe_object_parameters` | The contract of edit_object for one parametric object (object_id) or one type (type: BEZEL, BASKET, GRADUATED, CLASSIC...): current values, every snake_case key its setters accept with the value type, and its sections (support, cutters, air_gaps, prong, upper_rail, top_profile, gems...) with their own keys — generated from the live SDK, so it is exact. *(read-only)* |\n| `select_objects` | Selects objects in the Rhino document so the user sees them highlighted, or to feed tools that read the selection. |\n| `edit_object` | Edits a parametric Artisan object in place (it regenerates with the same id). |\n| `delete_objects` | Deletes objects by id: gems, parametric Artisan objects (the whole group) or plain Rhino geometry. *(destructive)* |","metadata":{"title":"Tools","section":"Parametric objects (query / edit / delete)","url":"https://www.rhinoartisan.com/docs/mcp/tools/#parametric-objects-query--edit--delete","source":"https://www.rhinoartisan.com/docs/mcp/tools/#parametric-objects-query--edit--delete","collection":"mcp","hash":"0ded24b91de50724f72798cb10d8acc9","indexed_by":"docs-index"}},{"content":"Tools — Shanks and ring bodies\n\n| Tool | What it does |\n|---|---|\n| `create_ring` | Creates a classic comfort-fit ring shank (band), optionally with a row of gems around the top. |\n| `create_cathedral` | Creates a cathedral shank: a band whose arms rise toward the setting — the classic body under halo and solitaire designs. |\n| `create_eternity` | Creates an eternity ring (a band with gems all around) at the document's finger size. |\n| `create_toi_et_moi` | Creates a Toi et Moi ring top: two independent stones straddling the top of the finger size, one leaning to each side (classic combinations mix shapes, e.g. pear + round). |\n| `create_three_stones` | Creates a Three Stones (trilogy) ring top: one center stone plus two symmetric side stones placed around the finger size. |\n| `create_ring_curve` | Creates the editable ring rail curve that curve shanks and gems-on-curve build on. kind: CLOSED (full circle at the finger size), OPEN (circle with a gap, for open/adjustable rings), BYPASS (crossed ends) or SHAPE (circle blended with a top shape). |\n| `create_graduated` | Creates a graduated shank: a band whose section grows toward the centre stone, carrying a run of stones that shrink toward the finger (the ArtisanGraduated tool). |\n| `create_bypass` | Creates a bypass shank: a band whose two arms cross past each other instead of meeting (the ArtisanBypass tool), optionally with a stone run along the arms. |\n| `create_signet_ring` | Creates a signet ring: a flat face carried on a band (the ArtisanSignetRing tool). |\n| `create_split_shank` | Creates a split shank: a band that opens into two arms toward the setting (the ArtisanSplitShank tool). |","metadata":{"title":"Tools","section":"Shanks and ring bodies","url":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies","source":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies","collection":"mcp","hash":"505a5add3ef3081b1cd0e9afa58a73d6","indexed_by":"docs-index"}},{"content":"Tools — Shanks and ring bodies\n\n| Tool | What it does |\n|---|---|\n| `create_advanced_cathedral` | Creates an advanced cathedral shank: the station-based cathedral body with a fully parametric arm and bridge, plus an optional stone run (the ArtisanAdvancedCathedralShank tool). |","metadata":{"title":"Tools","section":"Shanks and ring bodies","url":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies","source":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies","collection":"mcp","hash":"72600bc2f5bdf930191bb5215bb5bbf7","indexed_by":"docs-index"}},{"content":"Tools — Settings around gems\n\n| Tool | What it does |\n|---|---|\n| `add_prong_setting` | Creates a peghead (prong head) around an existing gem, as a parametric child of it. |\n| `add_bezel_setting` | Creates a bezel around an existing gem, as a parametric child of it. |\n| `add_basket_setting` | Creates a basket setting under existing gems (one basket per gem). |\n| `create_halo` | Builds a halo of small stones around an existing gem (halo-friendly shapes: ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER, PEAR). |\n| `create_cutters` | Builds one cutter per gem: the cutting/drilling solid used to open the gem seat in the metal (subtract it with boolean_operation). |\n| `create_microsetting` | Builds the micro-setting for a run of small gems: cutters, V-cutters, optional channel and row prongs (the pavé infrastructure). |\n| `create_cluster` | Builds a cluster (a ring of small stones with prongs hugging the mother gem, illusion-style). |\n| `create_hidden_halo` | Builds a hidden halo (the stone ring tucked under the setting, visible from the side). |\n| `create_tulip` | Builds a tulip setting (prongs blooming from a stem under the gem). prong_count 4 or 6; height is a vertical scale factor (default 1.7), not mm. |\n| `create_martini` | Builds a martini setting (the V-shaped basket for studs). |\n| `create_trellis_setting` | Builds a trellis setting (interwoven curved prongs). |\n| `create_cabochon` | Creates a cabochon (a domed, unfaceted stone) at the given point — it makes its own stone, no mother gem needed. |\n| `create_pearl` | Creates a pearl (with optional calotte cap and wire post — the stud-earring infrastructure). |\n| `add_advanced_bezel` | Creates an advanced bezel around an existing gem (the bezel with per-point profile control; this facade exposes the main dimensions). |","metadata":{"title":"Tools","section":"Settings around gems","url":"https://www.rhinoartisan.com/docs/mcp/tools/#settings-around-gems","source":"https://www.rhinoartisan.com/docs/mcp/tools/#settings-around-gems","collection":"mcp","hash":"bfb756047e6ded4d34510c4f1f01b393","indexed_by":"docs-index"}},{"content":"Tools — Settings around gems\n\n| Tool | What it does |\n|---|---|\n| `add_advanced_basket` | Creates an advanced basket under existing gems (one per gem): individually modeled prongs (ROUND, DOUBLE, TRIPLE, CLAW, OFFSET or CUSTOM with a profile) and configurable rails. 0/omitted keeps the tool default: 4 diagona… |\n| `gem_tools` | Utility operations over gems. operation: CENTERS (read-only: each gem's center), ADD_CENTER_POINTS (point object per center), CENTER_BETWEEN_GEMS (shared-prong circles between adjacent gems), CURVE_FROM_GEMS (curve through the centers, in list order), EXTRACT_GEM_CURVES (girdle curves), OFFSET_GEM_CURVES (outward girdle offsets at `distance` mm, history-linked), COPY_BY_GEMS (copy object_ids onto every target gem plane; scale No/2D/3D), COLOR_BY_SIZE (display color per stone size), ROTATE_GEMS (rotate each gem angle_degrees around its own axis), ADD_TAGS (measure/carat/material text on each gem), RECOVER_GEMS (rebuild Artisan gems from imported meshes). |\n| `create_trilogy` | Dresses a Three Stones set (center + 2 side gems) with one of the trilogy settings. style: BEZEL_SET (three bezels), EAST_WEST (three advanced baskets with shape-aware prong layouts), HALO (three halos of small stones, side halos fused into the center one), INDIVIDUAL (a tulip on the center and a single-rail basket on the sides, each slot switchable to TULIP / MARTINI / ADVANCED_BASKET) or TRELLIS (crossed prongs over the center stone plus under-girdle rails, down to the ring curve). |","metadata":{"title":"Tools","section":"Settings around gems","url":"https://www.rhinoartisan.com/docs/mcp/tools/#settings-around-gems","source":"https://www.rhinoartisan.com/docs/mcp/tools/#settings-around-gems","collection":"mcp","hash":"05d0761c35ca6d249744a115de028574","indexed_by":"docs-index"}},{"content":"Tools — Gems along geometry\n\n| Tool | What it does |\n|---|---|\n| `gems_on_curve` | Places a row of identical gems along an existing curve of the active Rhino document — RhinoArtisan's Gems on Curve tool: a parametric row (grouped, on the gems layer) that regenerates when its curve or parameters change. |\n| `create_channel` | Builds a channel setting — a metal channel with a run of gems inside — following an existing curve of the active Rhino document (RhinoArtisan's Channel tool, parametric). |\n| `pave_surface` | Pavé: fills the given surfaces/breps/meshes of the active Rhino document with diamonds of one size (and optional prongs and cutters), packed automatically — RhinoArtisan's Pavé tool. |\n| `list_elements` | Lists the saved ELEMENTS (the named presets the panels store: a bezel called \"Chunky\", a basket called \"Client A\"...). *(read-only)* |\n| `save_element` | Saves an existing parametric object's parameters as a new ELEMENT in the user's library (the panels' \"save as element\"), so it can be reused with the `element` argument of the create tools or applied with edit_object {\"element\": name}. object_id may be the object or any member of a parametric group (bail, basket, halo...). |\n| `manage_elements` | Organizes the user's ELEMENT library (saved presets): RENAME (to new_name), DUPLICATE (as new_name, default \" (Copy)\"), FAVORITE / UNFAVORITE, DELETE, EXPORT (a .zip bundle with its preview to file_path, to share it) and IMPORT (a bundle from file_path; type and name not needed). type + name pick the element (name or \"id: \", see list_elements); names stay unique within a type. |\n| `gems_on_network` | Fills a network of intersecting curves with stones, sized so they meet at the nodes — for lattice and filigree patterns. |","metadata":{"title":"Tools","section":"Gems along geometry","url":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","source":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","collection":"mcp","hash":"fffd5fb9b810a8cbbe7fee7c63d673fd","indexed_by":"docs-index"}},{"content":"Tools — Gems along geometry\n\n| Tool | What it does |\n|---|---|\n| `pave_automatic` | The automatic (relaxed) pavé: fills surfaces by relaxing a spring network over the mesh, which lets it MIX SEVERAL STONE SIZES and follow an irregular boundary — the difference from pave_surface, which packs one size in a regular grid. |\n| `gems_on_two_curves` | Fills the strip between two existing curves (any Rhino curves, e.g. a rail and its offset) with round gems whose diameter adapts to the local width — RhinoArtisan's Gems on 2 Curves tool, a parametric group. |\n| `gems_on_curve_advanced` | Distributes a PATTERN of gems along an existing curve (any Rhino curve id) — RhinoArtisan's Advanced Gems on Curve tool, and the way to place an EXACT number of stones (`quantities`): several groups run one after another, each with its own quantity, shape, rotation and a size graduating from sizes[i] to sizes2[i] mm (e.g. sizes [2.0, 1.5], quantities [1, 6], sizes2 [2.0, 1.0] = one 2 mm stone followed by six stones going 1.5 -> 1.0). |\n| `gems_from_circles` | Converts circle curves into ROUND Artisan gems of the same diameter, each placed on its circle's plane — the bridge from a generic layout to jewelry: draw or array circles with any Rhino tool (or a general Rhino MCP server) and turn them into real gems here. |\n| `tapered_baguettes` | Places tapered baguette gems spanning straight between two rail curves: each point in `points` is one gem, its wide (top) edge on the rail closest to the point and its length following the span to the other rail. |\n| `pave_along_surface` | Lays rows of round diamonds along the isocurves of a surface (Pave UV): each point in `points` yields one row along the isocurve through it, in direction U (default) or V. |","metadata":{"title":"Tools","section":"Gems along geometry","url":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","source":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","collection":"mcp","hash":"ecd5f4bff609b466d2adc577faef877a","indexed_by":"docs-index"}},{"content":"Tools — Gems along geometry\n\n| Tool | What it does |\n|---|---|\n| `add_gem_by_size` | Adds a single gem sized by its dimensions in millimetres instead of carats (use add_gem when the brief gives a carat weight). size_x is the width (diameter for ROUND); size_y (length) and size_z (depth) 0 = the shape's standard proportions. |\n| `find_gems_by_size` | Returns the ids of every gem in the document whose width (size_x) matches one of the reference gems (0.001 mm tolerance) -- e.g. 'all the 1.5 mm stones'. gem_ids empty = the selected gems. *(read-only)* |","metadata":{"title":"Tools","section":"Gems along geometry","url":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","source":"https://www.rhinoartisan.com/docs/mcp/tools/#gems-along-geometry","collection":"mcp","hash":"6c08d46f04b8b975d8ac33931d7b3352","indexed_by":"docs-index"}},{"content":"Tools — Booleans\n\n| Tool | What it does |\n|---|---|\n| `boolean_operation` | Artisan's parametric-aware booleans: UNION merges target_ids (+cutter_ids when given); DIFFERENCE, INTERSECTION and SPLIT apply cutter_ids to target_ids. *(destructive)* |","metadata":{"title":"Tools","section":"Booleans","url":"https://www.rhinoartisan.com/docs/mcp/tools/#booleans","source":"https://www.rhinoartisan.com/docs/mcp/tools/#booleans","collection":"mcp","hash":"a929914bdca1d136998469707f403d86","indexed_by":"docs-index"}},{"content":"Tools — Components and decoration\n\n| Tool | What it does |\n|---|---|\n| `create_bail` | Creates a bail (the pendant hanger loop) as an editable smart component, with every option of the ArtisanBail panel. |\n| `text_on_curve` | Creates text along an existing curve and returns the ids of the added objects. height = letter height in mm (default 1.5); thickness = extrusion depth in mm, 0 = flat curves only; horizontal_align LEFT\\|CENTER\\|RIGHT\\|JUSTI… |\n| `create_component` | Creates a smart component: BANGLE (rigid bracelet; options width 50, height 30, aperture 10, closed), BEAD (options width 10, height 10, hole_diameter 3), CHARM (options width 8, height 6, thickness 2.8), LINK (chain link; options width 9, height 6, diameter 3, twist_angle 90), NAMED_PENDANT (needs text; options height 5, thickness 0.4, font), HINGE (needs brep_id + point; DESTRUCTIVE: replaces the solid with the hinged parts; options diameter 0.7, cut_diameter 4, thickness 1, number_of_males 1, opening_angle 10), MILGRAIN (beaded edge; needs curve_id; options diameter 0.8, overlapping 0.1), ROPE (needs curve_id; options diameter 1.6, width 3, threads 3, turns 5), VORONOI (pattern inside a closed curve; needs curve_id; options points 100, thickness, height, both_sides), HONEYCOMB (needs curve_id; options diameter 6, thickness 0.8, height), TEXTURE3D (image-driven relief; needs surface_id; options texture_path, u 1, v 1, height 0.6, rotation), CHAIN (repeat objects along a curve; needs object_ids + curve_id; options copies). |\n| `vectorize_image` | Converts a raster image file into vector curves in the document (threshold-based tracing). |","metadata":{"title":"Tools","section":"Components and decoration","url":"https://www.rhinoartisan.com/docs/mcp/tools/#components-and-decoration","source":"https://www.rhinoartisan.com/docs/mcp/tools/#components-and-decoration","collection":"mcp","hash":"a84186c152ed3838e78bc425722ab661","indexed_by":"docs-index"}},{"content":"Tools — Relief\n\n| Tool | What it does |\n|---|---|\n| `create_relief` | One-shot relief bake (auto-fitted workbench): IMAGE from a grayscale heightmap (image_path, optional region_curve_ids to clip), CURVES from closed curves (curve_ids, with a profile), GEOMETRY from meshes/breps projected top-down (object_ids). |\n| `relief_operations` | The relief project's layered operation stack (same project the Relief panel edits). action ADD appends an operation: type PROFILE\\|EXTRUDE\\|IMAGE\\|TEXTURE\\|GEOMETRY with its inputs (curve_ids / image_path / texture_name / object_ids), or the brushes SCULPT\\|SMOOTH\\|CARBON (strokes, headless: a polyline of points with radius and height/strength; CARBON rubs an image_path onto the relief only where the points are, base_radius stripping the photo's broad tones), plus options (height, profile, feather, invert, base_radius, combine ADD\\|SUBTRACT\\|ZMAX\\|ZMIN\\|ABSOLUTE\\|MULTIPLY, name...). *(destructive)* |\n| `relief_project` | The relief project itself. action SETUP creates/reconfigures it (world_width, world_height, resolution, solid, cap_distance, delete_base — keeps the operation stack); INFO and PROFILES are read-only; BAKE recomputes at f… |","metadata":{"title":"Tools","section":"Relief","url":"https://www.rhinoartisan.com/docs/mcp/tools/#relief","source":"https://www.rhinoartisan.com/docs/mcp/tools/#relief","collection":"mcp","hash":"1fe78fe3e9e2c84eeae34a2b7df6bbbd","indexed_by":"docs-index"}},{"content":"Tools — Accessories extra\n\n| Tool | What it does |\n|---|---|\n| `user_elements` | LIST returns the named user elements in the document (the Outliner's user elements); CREATE tags the given objects as a new named element (object_ids + name). |\n\nDocument\n| Tool | What it does |\n|---|---|\n| `describe_document` | Returns a human-readable summary of the active document: design type and subtype, finger size, metals, gems and the parametric elements it contains. *(read-only)* |\n| `get_document_settings` | Returns the document's computation mode, the metals configured for the Metal 01/02/03 layers, the finger size, the valid finger size regions and the valid metal names. *(read-only)* |\n| `get_company_standards` | Returns the user's company standards: the rules their company always follows (minimum prong sizes per metal, default metals, production steps...), written by the user in RhinoArtisan's options. *(read-only)* |\n| `set_document_settings` | Changes document settings: the metal of a metal layer, the finger (ring) size, or the computation mode (Render = smooth display quality, Manufacturing = production-accurate geometry; switching regenerates every parametri… |\n| `regenerate_objects` | Regenerates the document's parametric objects, like the Outliner's Refresh button: by default only the ones pending regeneration (e.g. children whose mother gem or curve moved); force=true regenerates EVERYTHING (long on heavy documents). |","metadata":{"title":"Tools","section":"Accessories extra","url":"https://www.rhinoartisan.com/docs/mcp/tools/#accessories-extra","source":"https://www.rhinoartisan.com/docs/mcp/tools/#accessories-extra","collection":"mcp","hash":"0a64ca8955632502a1ab67e1a9d1e142","indexed_by":"docs-index"}},{"content":"Tools — File lifecycle\n\n| Tool | What it does |\n|---|---|\n| `open_document` | Opens a 3dm file, replacing the active document (like File > Open, but never prompting: it fails if the current document has unsaved changes unless discard_changes is true). *(destructive)* |\n| `save_document` | Saves the active document. |\n| `new_document` | Creates a new document, replacing the active one (like File > New without the template picker). *(destructive)* |","metadata":{"title":"Tools","section":"File lifecycle","url":"https://www.rhinoartisan.com/docs/mcp/tools/#file-lifecycle","source":"https://www.rhinoartisan.com/docs/mcp/tools/#file-lifecycle","collection":"mcp","hash":"f57764b4c6e0e3c4dfce647575c55dfe","indexed_by":"docs-index"}},{"content":"Tools — Viewports (batch rendering)\n\n| Tool | What it does |\n|---|---|\n| `describe_views` | Returns the open viewports (marking the active one), the saved named views and the available display modes — the vocabularies set_view and capture_viewport accept. *(read-only)* |\n| `set_view` | Points a Rhino viewport for rendering: restore a named view, place the camera explicitly (location + target, optional 35mm lens length), switch the display mode (e.g. |\n| `capture_viewport` | Captures a Rhino viewport. |","metadata":{"title":"Tools","section":"Viewports (batch rendering)","url":"https://www.rhinoartisan.com/docs/mcp/tools/#viewports-batch-rendering","source":"https://www.rhinoartisan.com/docs/mcp/tools/#viewports-batch-rendering","collection":"mcp","hash":"9fdf4b9e5d9b3e8a63bb548967b0e646","indexed_by":"docs-index"}},{"content":"Tools — Analysis, weight and price\n\n| Tool | What it does |\n|---|---|\n| `calculate_weight` | Weighs the metal geometry of the document (Metal 01/02/03 layers). *(read-only)* |\n| `calculate_price` | Recomputes the price of the current document with the active manufacturer/market (the same engine as the Breakdown panel). *(read-only)* |\n| `get_pricing_settings` | Returns the Breakdown's cost tables as JSON: Markets (Gold/Silver/Platinum/Palladium spot prices, plus Currency, Unit oz\\|g, ExchangeRate to the company currency and DutyGold/DutySilver/DutyPlatinum/DutyPalladium import duty percents; Compute folds all of that into Metals prices per gram), Metals, Diamonds (per-size and per-sieve price tables, CertificateFromCt threshold), Printing, Cfp (cast-finish-polish), AdditionalProcesses, GemSetting (labor per setting type), Timing and Info (currency). *(read-only)* |\n| `set_pricing_setting` | Updates ONE value of the Breakdown's cost settings by path and persists it (Manufacturer.json), e.g. path \"Markets.Gold\" value \"68.5\", or \"Diamonds.CertificateFromCt\" value \"0.30\". |\n| `analyze_thickness` | Measures the material thickness at a point on/near the surface of the given objects, in mm. |\n| `global_thickness` | Measures wall thickness over EVERY vertex of the given objects and returns min/max/average in mm, the percentage of thin samples, and the 100 thinnest spots (point + thickness) below thin_threshold_mm (default 0.6). |\n| `create_breakdown_table` | Draws one of the Breakdown cost tables into the document at `point` (production-sheet annotations): METALS, GEMS, PROCESSES or EXTRAS. |\n| `create_gems_table` | Draws the gems list table (shape, sizes, carats, quantities) into the document at `point` — the production-drawing companion of export_gems_list. |","metadata":{"title":"Tools","section":"Analysis, weight and price","url":"https://www.rhinoartisan.com/docs/mcp/tools/#analysis-weight-and-price","source":"https://www.rhinoartisan.com/docs/mcp/tools/#analysis-weight-and-price","collection":"mcp","hash":"28bb95fcd80ac74eb106c83fdd80cc10","indexed_by":"docs-index"}},{"content":"Tools — Analysis, weight and price\n\n| Tool | What it does |\n|---|---|\n| `create_metals_table` | Draws the metals weight table into the document at `point`, weighing the visible metal geometry in each named metal (see get_document_settings for valid names). |\n| `scale_to_dimensions` | Uniformly (or per-axis) scales the objects so their bounding box hits the target sizes in mm — \"make it 20 mm wide\". *(destructive)* |\n| `deform_objects` | Artisan's deformations, headless. *(destructive)* |\n| `place_on_objects` | COPY places copies of the objects onto the target surfaces at each point (frame from the target's render mesh: closest point + normal); MOVE relocates them once to `point`. |\n| `move_by_normal` | Moves the objects along the normal of `surface_id` at each object's closest point — lift or sink elements relative to the metal. |\n| `mirror_objects` | OPPOSITE mirrors the objects across the plane (history-linked copies); QUAD produces the three mirrored quadrant copies. plane omitted = the active construction plane. |\n| `transform_objects` | Basic transforms on any objects (gems, parametric groups, plain geometry). |\n| `array_objects` | Copies the objects in a pattern (Artisan arrays). |\n| `scale_by_weight` | Uniformly scales the objects so they weigh exactly target_grams when cast in `metal` (empty = the document's primary metal). *(destructive)* |","metadata":{"title":"Tools","section":"Analysis, weight and price","url":"https://www.rhinoartisan.com/docs/mcp/tools/#analysis-weight-and-price","source":"https://www.rhinoartisan.com/docs/mcp/tools/#analysis-weight-and-price","collection":"mcp","hash":"a5ca3ad8ba515975db8e5c887764dcb5","indexed_by":"docs-index"}},{"content":"Tools — Manufacturing\n\n| Tool | What it does |\n|---|---|\n| `check_printability` | Verifies each mesh is valid and watertight, and recolors it green when printable, red when not. |\n| `repair_for_printing` | Repairs the given objects into a single watertight printable mesh (closes gaps, fixes normals; gems are skipped automatically). *(destructive)* |\n| `add_identifier` | Adds an identifier tag to a closed ring mesh (the ArtisanIdentifier tool): a small pipe between two points on the mesh carrying an engraved reference text (model number, metal, size...). |\n| `add_sprue` | Adds casting connectors to closed meshes, in every style of the sprues family. kind: SINGLE (one tapered post at contact_points[0] on mesh_id), INNER_TREE (trunk at base_point + branches to contact_points), INNER_BRANCHES (central post + branches, options symmetry 0-3), EXTERNAL_TREE (trunk beside the mesh at base_point + branches), EXTERNAL_FRAMES (rounded frame around mesh_ids with inward stubs), TREE (radial casting tree at base_point with copies of mesh_ids), CLUSTER_TREE (helix-grid cylinder with a copy per node), CURVE (perimeter frame from the silhouette or curve_id, on mesh_id), HELIX / SPIRAL (chain-link casting trees for the mesh in mesh_id), MULTIPLE_COPIES (trunk from trunk_start to trunk_end + branch per contact point, over mesh_ids). |\n| `resize_ring` | Takes a CLOSED ring mesh and produces one resized copy per target inner diameter, laid out in a row on child layers under a Resizer parent layer. *(destructive)* |\n| `decimate_mesh` | Reduces the polygon count of the given meshes: by percentage (default 50) or, when tolerance_mm is given, to the coarsest mesh within that deviation. *(destructive)* |","metadata":{"title":"Tools","section":"Manufacturing","url":"https://www.rhinoartisan.com/docs/mcp/tools/#manufacturing","source":"https://www.rhinoartisan.com/docs/mcp/tools/#manufacturing","collection":"mcp","hash":"4361331a07d2f339a95586bd98b3cba9","indexed_by":"docs-index"}},{"content":"Tools — Reports, exports and render\n\n| Tool | What it does |\n|---|---|\n| `list_report_templates` | The report template names create_report accepts (the 3dm templates saved from the Report panel). *(read-only)* |\n| `create_report` | Creates a report layout page. |\n| `create_gems_map` | Draws the gems map (the per-size gem legend used in production drawings) at the given point. |\n| `generate_dimensions` | Generates automatic dimensions. kind: AUTO (default, generic), RING (ring-specific: bottom, top, size), BOX (bounding-box dimensions of object_ids) or BANGLE (bangle-specific over object_ids). |\n| `import_named_views` | Imports the named views saved in another 3dm file into the active document — keep your standard render angles in a template file, import them into each opened document, then set_view + capture_viewport per angle. |\n| `apply_materials` | Switches every visible object's materials: RENDER = the catalog render materials (gems by compound, metals per Metal 01/02/03 layer, studio environment installed if none) for shooting; DESIGN = back to the flat design ma… |\n| `batch_render` | Renders every .3dm in a folder with Rhino's current renderer, saving one image next to each file (same base name). |\n| `list_render_scenes` | Lists the Render Studio's scene environments and material families. *(read-only)* |\n| `apply_render_scene` | Applies Render Studio state: `environment` by name (omit for the studio default scene), and/or a material (`material_family` + `material`) to object_ids (omit for the selection; Grounds materials go to the ground plane). |\n| `render_still` | Renders a still with Rhino's current renderer (Cycles) through the Render Studio pipeline and saves it to `path`. |","metadata":{"title":"Tools","section":"Reports, exports and render","url":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","source":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","collection":"mcp","hash":"6236ea253ec863751112e146dc3fafd8","indexed_by":"docs-index"}},{"content":"Tools — Reports, exports and render\n\n| Tool | What it does |\n|---|---|\n| `render_turntable` | Renders a turntable MP4 orbiting the current camera target: per-frame Cycles renders (or fast viewport captures with raytraced=false) assembled with ffmpeg. |\n| `export_gems_list` | Exports the document's gems list to a CSV file. |\n| `export_stl` | Exports all visible geometry of the active document to a binary STL file for 3D printing. |\n| `export_pdf` | Exports a layout page to a 300-dpi PDF (vector where possible). page_name defaults to Template — the layout create_report produces. |\n| `export_glb` | Exports the whole document to a GLB file (the same conversion the Realtime Render pipeline uses). |\n| `show_realtime_render` | Opens (or activates) the web-based Realtime Render viewer window and pushes the current model to it. |\n| `set_viewer_material` | Applies a viewer catalog material to every part on a layer of the open Realtime Render viewer (viewer-only; the document is untouched). |\n| `set_viewer_background` | Sets the Realtime Render viewer's background gradient. |\n| `set_viewer_environment` | Sets the Realtime Render viewer's lighting environment: a preset (studio, sunset, dawn, night, warehouse, forest, apartment, city, park, lobby) or an HDR/EXR url. |\n| `set_viewer_option` | Sets one Realtime Render viewer option by key: bevelEnabled/bevelRadius, jewelryShadow* (Enabled, Darkness, Blur...), effectComposerN8ao* (AO), effectComposerDepthOfField* (Enabled, FocusDistance, BokehScale), effectComposerBloom* (Enabled, Intensity), effectComposerVignette*, effectComposerHueSaturation*, caustics*, autoRotate, toneMappingExposure... |","metadata":{"title":"Tools","section":"Reports, exports and render","url":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","source":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","collection":"mcp","hash":"9f28e165d4f7abed9786514900f50563","indexed_by":"docs-index"}},{"content":"Tools — Reports, exports and render\n\n| Tool | What it does |\n|---|---|\n| `viewer_camera` | Moves the camera of the Realtime Render viewer: a named preset (front, back, left, right, top, bottom, three-quarter, three-quarter-left, detail, dramatic-low), an explicit position + target in document millimetres, or zoom_extents=true to frame the whole design. |\n| `list_viewer_items` | Lists the parts loaded in the Realtime Render viewer with their uuids and current materials — the vocabulary for set_viewer_material / edit_viewer_material. *(read-only)* |\n| `update_render` | Re-exports the current document geometry to the Realtime Render viewer (the panel's Update button). |\n| `edit_viewer_material` | Live-edits a Realtime Render viewer catalog material everywhere it is applied: color (CSS color), roughness 0-1, ior (~1.4-2.4, gems), opacity 0-1. Ephemeral: re-applying the material from the catalog resets it. |\n| `capture_viewer_views` | Captures the 8 standard orbital views of the open Realtime Render viewer (front, back, left, right, two three-quarters, top, bottom) as PNGs into a folder, restoring the camera afterwards. |\n| `record_viewer_turntable` | Records a 360 turntable of the open Realtime Render viewer: turns auto-rotation on, records `seconds` seconds of video to `path`, and turns the rotation off when done. |\n| `record_viewer_video` | Records the open Realtime Render viewer to a video file at `path` for `seconds` seconds (1-3600) and saves automatically when done. |\n| `render_screenshot` | Opens (or activates) the Realtime Render viewer, optionally moves its camera to a preset, and saves a PNG of the frame. |","metadata":{"title":"Tools","section":"Reports, exports and render","url":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","source":"https://www.rhinoartisan.com/docs/mcp/tools/#reports-exports-and-render","collection":"mcp","hash":"9be60dc9e82cb6860c4758371be1b764","indexed_by":"docs-index"}},{"content":"Tools — Library and services\n\n| Tool | What it does |\n|---|---|\n| `list_assets` | Without `type`, lists the asset types (RING_PROFILE, BEZEL_PROFILE, CHANNEL_PROFILE, PEGHEAD_PROFILE...). *(read-only)* |\n| `export_asset_curve` | Adds an asset's profile to the document as a curve, to see its shape before choosing it: the shape the tools actually build from (mirrored and closed; RING_SIDE_CURVE stays open), sized width x height mm (default 5 x 3; side curves keep their aspect and follow height) and centered at `plane`. |\n| `manage_assets` | Organizes the user's ASSET library (profile curves): RENAME (to new_name), DUPLICATE (as new_name, default \" (Copy)\"; works on standard assets too — the way to get an editable copy), SET_DEFAULT (the profile every create tool uses when none is given) and DELETE. type + name pick the asset (name or \"id: \", see list_assets); names stay unique within a type. |\n| `search_diamonds` | Searches certified diamonds on Nivoda matching a shape and carat weight (range [carats-0.01, carats+0.1]). *(read-only)* |\n| `search_files` | Searches the indexed local design library (file names, gems, metals, design semantics). *(read-only)* |","metadata":{"title":"Tools","section":"Library and services","url":"https://www.rhinoartisan.com/docs/mcp/tools/#library-and-services","source":"https://www.rhinoartisan.com/docs/mcp/tools/#library-and-services","collection":"mcp","hash":"86f2386f3d0be2ca4ce93a03a436fd0b","indexed_by":"docs-index"}},{"content":"Tools — Scripting\n\n| Tool | What it does |\n|---|---|\n| `list_commands` | Lists the command names available in this Rhino (Artisan* first), optionally filtered by substring — to find the exact name before run_command. *(read-only)* |\n| `run_tool_smoke_test` | Diagnostic: opens a NEW document (discarding unsaved changes), runs a scripted design flow through the catalog (ring, gems, every setting, shanks, rows, solids, curves, edits, analysis, exports) and then probes every remaining tool with empty arguments, classifying OK / SOFT (friendly ArgumentException) / FAIL (any other exception). |\n| `gh_reference` | The reference of Artisan's ~219 Grasshopper components, for building graphs with the Rhino MCP Platform tools (g1_search_components / g1_place_component / g1_apply_graph / g1_solve_graph). *(read-only)* |\n| `get_scripting_reference` | Returns the reference for run_script: the idiom, and (part API) every *Api facade with its static methods plus each I* handle's read properties and Set*/Move/Delete mutators — generated from the live SDK, so it is exhaustive and exact. *(read-only)* |\n| `run_script` | Runs Python against the full RhinoArtisan Scripting API and Rhino itself — for anything without a typed tool: any handle setter or nested section, reading/setting the selection, loops over many objects, native Rhino curves/surfaces/booleans via rhinoscriptsyntax. *(destructive)* |\n| `run_command` | Runs a Rhino command-line script exactly as typed in Rhino's command prompt (RhinoApp.RunScript): native Rhino commands and Artisan commands alike. *(destructive)* |","metadata":{"title":"Tools","section":"Scripting","url":"https://www.rhinoartisan.com/docs/mcp/tools/#scripting","source":"https://www.rhinoartisan.com/docs/mcp/tools/#scripting","collection":"mcp","hash":"cff16e8d082e12735fa75d64fe5500e2","indexed_by":"docs-index"}},{"content":"Tools — Scripting\n\n| Tool | What it does |\n|---|---|\n| `close_panel` | Closes the Artisan command panel that is open (the side panel a panel command such as ArtisanBail opens, with its live preview) WITHOUT applying it, like its X button: the preview is discarded and objects hidden while editing come back. |","metadata":{"title":"Tools","section":"Scripting","url":"https://www.rhinoartisan.com/docs/mcp/tools/#scripting","source":"https://www.rhinoartisan.com/docs/mcp/tools/#scripting","collection":"mcp","hash":"aed2048ce4cab10f4ce3b84fd9b7e105","indexed_by":"docs-index"}},{"content":"Tools — Ring bodies\n\n| Tool | What it does |\n|---|---|\n| `create_advanced_ring` | Creates an advanced ring body (the ArtisanAdvancedRing tool): a ring curve swept through profile sections placed along it, each with its own width and height — the free-form way to shape a shank (tapered, knife-edge, bypass...). |\n| `create_class_ring` | Creates a class ring (the ArtisanClassRing tool): a heavy signet-style body with a flat top seat holding one stone — a faceted gem or a cabochon — regenerated together with the ring. |\n| `create_scoop_ring` | Hollows a ring shank from the inside (the ArtisanScoopRing tool): removes material behind the given faces of an existing closed ring solid, leaving a wall of `thickness` mm, fully scooped over central_angle degrees at the bottom of the ring plus transition_angle degrees of fade-out on each side. |\n| `ring_extrude` | Creates a ring body by extruding two silhouettes (the ArtisanRingExtrude tool): a frontal silhouette (EXTERNAL_RING_PROFILE asset) and a lateral silhouette (RING_SIDE_CURVE asset) grown around the finger circle and intersected — the quick way to get a wide, sculpted band. |","metadata":{"title":"Tools","section":"Ring bodies","url":"https://www.rhinoartisan.com/docs/mcp/tools/#ring-bodies","source":"https://www.rhinoartisan.com/docs/mcp/tools/#ring-bodies","collection":"mcp","hash":"a51732eb83afe97d0712ebb0bf5badd2","indexed_by":"docs-index"}},{"content":"Tools — Ring size tools\n\n| Tool | What it does |\n|---|---|\n| `cut_by_ring_size` | Cuts the finger hole through the given objects (the ArtisanCutByRingSize tool): subtracts a cylinder of the ring-size diameter running along world Y (rings are modelled at the origin) from each brep, extrusion, SubD or mesh. |\n| `estimate_ring_size` | Estimates the finger size of an existing ring model (the ArtisanEstimateRingSize tool): sections the geometry with the XY and YZ planes through the origin, measures the inner gap along X (diameter) and Z (inner height), scores how ring-like the result is (0-100) and looks up the closest catalog size in the given region. ids omitted = every visible brep/surface/mesh. *(read-only)* |","metadata":{"title":"Tools","section":"Ring size tools","url":"https://www.rhinoartisan.com/docs/mcp/tools/#ring-size-tools","source":"https://www.rhinoartisan.com/docs/mcp/tools/#ring-size-tools","collection":"mcp","hash":"66ddbec22fdc535fcb3e24e9a060d735","indexed_by":"docs-index"}},{"content":"Tools — Shanks and ring bodies (wedding, pavé, two rows, matching)\n\n| Tool | What it does |\n|---|---|\n| `create_wedding_band` | Creates a single wedding band (the ArtisanWeddingBand tool): a plain band lofted from a RING_PROFILE asset at the document's finger size, optionally with a row of stones around it. |\n| `create_wedding_ring` | Creates a wedding set (the ArtisanWeddingRing tool): two bands — his and hers — baked together as one group, each with its own section, metal, finger size and optional stones. |\n| `create_pave_shank` | Creates a pavé shank (the ArtisanPaveShank tool): a classic band carrying one or more longitudinal rows of round stones running along the band. |\n| `create_two_rows_shank` | Creates a two-rows shank (the ArtisanTwoRowsShank tool): a classic band with a channel carved on each face, each carrying a row of round stones held by prongs — the knife-edge pavé band. |\n| `create_matching_shank` | Creates a matching shank (the ArtisanMatchingShank tool): a band shaped to sit against an existing ring at the origin — the mother — so the pair stacks without a gap (wedding band next to an engagement ring). |","metadata":{"title":"Tools","section":"Shanks and ring bodies (wedding, pavé, two rows, matching)","url":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies-wedding-pavé-two-rows-matching","source":"https://www.rhinoartisan.com/docs/mcp/tools/#shanks-and-ring-bodies-wedding-pavé-two-rows-matching","collection":"mcp","hash":"5bceaa0989cdb9e72baa0258d09ed470","indexed_by":"docs-index"}},{"content":"Tools — Prongs, prong axis and azure\n\n| Tool | What it does |\n|---|---|\n| `create_dynamic_prongs` | Creates loose (non-parametric) prongs, the ArtisanDynamicProngs tool. |\n| `create_custom_prongs` | Copies a custom prong (your own surface, polysurface, mesh or SubD) onto every Artisan prong, the ArtisanCustomProngs tool: the source is mapped from the bottom-centre of its bounding box on the active CPlane to each prong's base plane. |\n| `create_prong_axis` | Draws the central axis line of every prong around each gem (curves only, no thickness), the ArtisanProngAxis tool: one editable ProngAxis group per gem, useful as a guide to sweep custom prongs. 0 keeps the tool default (or the user's saved defaults): prongs 4, height 4 mm, over_girdle 0.3, gem_inside 0, bottom_rail_inside 0, straight true. |\n| `create_azure` | Open-work under stones (the Azure / SmartAzure tool): one hexagonal hole per gem, centred under its girdle and projected onto a closed solid, then subtracted from it. |\n| `flip_gem_plane` | Flips the parametric plane stored in each gem (reverses its Z axis) WITHOUT moving the stone, the ArtisanGemsFlipPlane tool, and regenerates its children. |\n| `update_baskets` | Migrates baskets saved by old Artisan versions (a single object carrying its parameters) into the current editable basket groups, recomputing each one against its mother gem with the current kernel; the ArtisanBasketUpdate tool. |","metadata":{"title":"Tools","section":"Prongs, prong axis and azure","url":"https://www.rhinoartisan.com/docs/mcp/tools/#prongs-prong-axis-and-azure","source":"https://www.rhinoartisan.com/docs/mcp/tools/#prongs-prong-axis-and-azure","collection":"mcp","hash":"64f137653aeddd773c8b20aa9afd6f3a","indexed_by":"docs-index"}},{"content":"Tools — Solid modelling\n\n| Tool | What it does |\n|---|---|\n| `solid_cut` | Cuts one or more solids with planar closed curves (ArtisanCut): each curve is extruded straight through the solids, along its plane normal, and subtracted. |\n| `solid_recess` | Sinks (recess, default) or raises (protrusion) the region a closed curve marks on a solid's face (ArtisanRecess): the curve is pulled onto the face, the face is split and the inner piece is offset `height` mm and subtracted or united. |\n| `cap_round` | Builds a domed (rounded) cap over a closed planar curve (ArtisanCapRound): a parametric RoundCap object linked to the curve, placed on the metal layer with the metal material. |\n| `curve_shell` | Builds a hollow shell (a wall plus a floor) from one or more closed planar curves (ArtisanCurveShell): one parametric CurveShell object per curve on the metal layer with the metal material — the classic way to make a hollow signet top, a locket half or a bezel cup. |\n| `sweep_rails` | Orients flat profile curves along one rail (ArtisanCurves1Rail) or between two rails (ArtisanCurves2Rails) and sweeps a solid through them — the way Artisan builds free-form shanks and bands from section curves. |\n| `create_smart_profile` | Sweeps RING_PROFILE sections along existing curves (the ArtisanProfiles / Smart Profiles tool of the Solid tab) — bands, wires, frames and free-form rims whose section can change along the way. |","metadata":{"title":"Tools","section":"Solid modelling","url":"https://www.rhinoartisan.com/docs/mcp/tools/#solid-modelling","source":"https://www.rhinoartisan.com/docs/mcp/tools/#solid-modelling","collection":"mcp","hash":"6726a59f3d54e5e5900864fc4dc8a3a0","indexed_by":"docs-index"}},{"content":"Tools — Solid booleans (parametric)\n\n| Tool | What it does |\n|---|---|\n| `list_dismantled_booleans` | Lists the Artisan booleans that were dismantled by ArtisanEdit (the result was removed, the operands are visible again, the boolean group keeps its operation and operand ids): id, operation, target_ids, cutter_ids and missing_ids (operand ids that no longer exist, e.g. after a parametric edit recreated the object). *(read-only)* |\n| `update_booleans` | Recomputes the dismantled Artisan booleans (ArtisanBooleanUpdate) from their stored operands: the result breps go back into the boolean group and the operands are hidden again. |","metadata":{"title":"Tools","section":"Solid booleans (parametric)","url":"https://www.rhinoartisan.com/docs/mcp/tools/#solid-booleans-parametric","source":"https://www.rhinoartisan.com/docs/mcp/tools/#solid-booleans-parametric","collection":"mcp","hash":"129b3857bf454c70fdf67c2386324969","indexed_by":"docs-index"}},{"content":"Tools — Curve helpers\n\n| Tool | What it does |\n|---|---|\n| `curve_advanced` | Draws the ArtisanAdvancedCurve: a smooth degree-3 control-point curve through the given points, optionally mirrored (X, Y or XY = both axes) around the symmetry plane, optionally closed, plus an offset copy with connecting lines (offset 1 mm by default; 0 = no offset). |\n| `curves_auto_join` | Runs ArtisanAutoJoin: joins every open curve whose ends touch (document tolerance), like selecting all open curves and running Join. curve_ids restricts the candidates; omitted = every visible curve in the document. |\n| `curve_cross_builder` | Creates the ArtisanCrossBuilder outline: a closed cross-shaped curve centred at the world origin (move it afterwards with transform_objects), stored as a parametric Cross object on the primary user layer. |\n| `curves_connect` | Runs ArtisanCurveConnect: builds an arc blend that leaves the first solid/surface along its normal at the point closest to first_point and arrives at the second one against its normal near second_point. |\n| `curve_infinite` | Runs ArtisanInfiniteCurve: adds a very long reference line (type LINE, centred on base_point) or ray (type RAY, starting at base_point) to use as a construction guide. |\n| `curve_infinite_loop` | Runs ArtisanInfiniteLoopCurve: a closed lemniscate (infinity symbol, figure eight) centred at the given point on the construction plane. kind BERNOULLI (default, rounded lobes) or GERONO (figure-eight). width is the total width in mm (default 100), height_ratio scales the lobe height (default 0.5), height lifts the strands in Z at the crossing so one passes over the other (0 = flat, signed), flat_bottom raises only the upper lobe, samples = points per loop (default 180), rotation in degrees. |","metadata":{"title":"Tools","section":"Curve helpers","url":"https://www.rhinoartisan.com/docs/mcp/tools/#curve-helpers","source":"https://www.rhinoartisan.com/docs/mcp/tools/#curve-helpers","collection":"mcp","hash":"2743573e8c920177f0d402c2ed9e4968","indexed_by":"docs-index"}},{"content":"Tools — Curve helpers\n\n| Tool | What it does |\n|---|---|\n| `surface_iso_curves` | Runs ArtisanIsoCurve: extracts the isocurve(s) of a surface (or the face of a solid nearest to the point) passing through the point of the surface closest to the given point. direction U (default), V or BOTH. |\n| `curve_waves` | Runs ArtisanWaves: builds a smooth wave (waves = number of full periods, default 3; height = peak-to-peak amplitude in mm, default 3) and flows it along an existing curve from start to end. |\n| `add_sketch_images` | Runs ArtisanAddSketches: places reference sketch images (PNG/JPG file paths) on the faces of a 10 x 10 x 10 mm box at the origin, two textured surfaces per view (top: z=0 and z=10; front: y=0 and y=10; side: x=0 and x=10), rendered display mode, grouped together. |","metadata":{"title":"Tools","section":"Curve helpers","url":"https://www.rhinoartisan.com/docs/mcp/tools/#curve-helpers","source":"https://www.rhinoartisan.com/docs/mcp/tools/#curve-helpers","collection":"mcp","hash":"13df53069949b5b89edbe41e70b463e1","indexed_by":"docs-index"}},{"content":"Tools — Transform: placement and flow\n\n| Tool | What it does |\n|---|---|\n| `center_objects` | Moves the objects, as one set, so the center of their common bounding box lands on the world origin (0,0,0) — the ArtisanCenter command. |\n| `move_random` | Moves EACH object by `distance` mm along its own random direction (a different direction per object) — the ArtisanMoveRandom command, used to break the perfect regularity of pavé stones or beads so a render looks hand-set. distance 0/omitted = 0.05 mm (range -1000..1000). |\n| `scale_by_center` | Scales the objects uniformly by `factor` (> 0; 1 = no change) about the center of their common bounding box, so the set grows or shrinks in place — the ArtisanScaleByCenter command. |\n| `orient_on_surface` | Places copies of the objects on a surface, polysurface or extrusion, one copy set per point in `points`, each oriented to the surface normal at the point closest to the pick — the ArtisanOrientOnSurface command (a bead, a gem+setting or a pattern cell dropped on a ring surface). |\n| `flow_by_curve` | Flows objects from a base curve onto a target curve (Rhino Flow space morph) — the ArtisanSmartFlowbyCurve panel. |\n| `flow_by_surface` | Flows objects from a base surface onto a target surface (Rhino Sporph space morph) — the ArtisanSmartFlowbySurface panel. |","metadata":{"title":"Tools","section":"Transform: placement and flow","url":"https://www.rhinoartisan.com/docs/mcp/tools/#transform-placement-and-flow","source":"https://www.rhinoartisan.com/docs/mcp/tools/#transform-placement-and-flow","collection":"mcp","hash":"fb0dfa8124d15d36db0daba2bd0a9b1f","indexed_by":"docs-index"}},{"content":"Tools — Manufacturing: trays\n\n| Tool | What it does |\n|---|---|\n| `distribute_objects` | Lays the objects out in a row along +X for a print/casting tray — the ArtisanDistribute command: each piece rests on Z = 0 with its back edge on Y = 0, chained left to right with a 10% gap of each piece's width. |\n| `copy_objects` | Duplicates the objects `count` times along -Y for a production tray — the ArtisanCopies command: each copy is one selection-height further (the union bounding box's Y extent), all objects shift together so multi-part models stay assembled and the copies touch edge to edge. count 0/omitted = 1, max 100. Use distribute_objects afterwards to space them. |","metadata":{"title":"Tools","section":"Manufacturing: trays","url":"https://www.rhinoartisan.com/docs/mcp/tools/#manufacturing-trays","source":"https://www.rhinoartisan.com/docs/mcp/tools/#manufacturing-trays","collection":"mcp","hash":"f303a0e14dd2bbdd83af48572cfe07ef","indexed_by":"docs-index"}},{"content":"Tools — Parametric relations\n\n| Tool | What it does |\n|---|---|\n| `meet_mothers_and_children` | Re-matches every parametric child with its mother, like the ArtisanRefreshRelations command: each bezel, cutter, halo, basket, rope, milgrain... re-adopts the nearest gem or curve as mother. |\n| `apply_element` | Copies the parameters of one existing Artisan element in the document onto other mothers and builds the same element there — the ArtisanApplyElement command: 'put the bezel of this gem on those gems', 'apply this rope to those curves'. |","metadata":{"title":"Tools","section":"Parametric relations","url":"https://www.rhinoartisan.com/docs/mcp/tools/#parametric-relations","source":"https://www.rhinoartisan.com/docs/mcp/tools/#parametric-relations","collection":"mcp","hash":"9029f45f53f5226e1e154bfa61832147","indexed_by":"docs-index"}},{"content":"Tools — Production exports\n\n| Tool | What it does |\n|---|---|\n| `export_all_in_one` | Merges solids/meshes into ONE printable mesh and writes a binary STL (the ArtisanExportAllInOne tool). |\n| `export_from_layers` | Writes one STL per visible layer holding MESH objects, named ' .stl' inside folder (the ArtisanExportFromLayers tool) — the multi-part / multi-material print workflow. |\n| `import_to_layers` | Imports every .stl in folder, each file into a layer named after the file with a distinct color per layer (the ArtisanImportToLayers tool) — the reverse of export_from_layers, and the way to bring a set of printed parts back for checking. |","metadata":{"title":"Tools","section":"Production exports","url":"https://www.rhinoartisan.com/docs/mcp/tools/#production-exports","source":"https://www.rhinoartisan.com/docs/mcp/tools/#production-exports","collection":"mcp","hash":"69383f779212851d77b9b8d7d76a9d52","indexed_by":"docs-index"}},{"content":"Tools — Production checks\n\n| Tool | What it does |\n|---|---|\n| `reduce_thickness` | Hollows a wall down to a uniform minimum thickness to save metal (the ArtisanReduceThickness tool). |\n| `check_balance` | Checks how a pendant or earring hangs (the ArtisanBalancerChecker tool): the piece hangs from base_id (the bail, jump ring or hook) and gravity pulls the volume centroid of geometry_ids straight below it. |\n| `detect_non_printable` | Flags the objects that would not print (the ArtisanQuickNonPrintableDetector tool) using Rhino's own selectors: bad objects, duplicates, open surfaces and open polysurfaces. *(read-only)* |","metadata":{"title":"Tools","section":"Production checks","url":"https://www.rhinoartisan.com/docs/mcp/tools/#production-checks","source":"https://www.rhinoartisan.com/docs/mcp/tools/#production-checks","collection":"mcp","hash":"0de9a0b6b6cc6818e010ac918a28625f","indexed_by":"docs-index"}},{"content":"Tools — Document and library\n\n| Tool | What it does |\n|---|---|\n| `standardize_document` | Standardizes a document that came from elsewhere (the ArtisanStandardize tool), running the tool's sequence: explode every block instance, recover the gems (ArtisanGemsRecover), move solids/meshes/surfaces/SubDs to the metal layers (ArtisanOrganizeObjectsByLayers), purge all render materials, re-apply the Artisan design materials and estimate the ring size. |\n| `export_elements` | Exports every saved element of one library type (the user's presets: bezels, baskets, halos, pegheads...) to a JSON file (the ArtisanExportElementsByType tool) — the way to carry presets to another machine or to back them up. type is one of the names list_elements accepts (Bezel, Basket, Halo, Peghead, AdvancedBasket...). |\n| `import_elements` | Imports elements into the user's library (the ArtisanImportElementsByFile tool): either a single '.raelement' bundle (element + preview) or a '.json' array as written by export_elements. |\n| `save_as_template` | Saves the active document as the Artisan template (the ArtisanSaveAsTemplate tool): Rhino's SaveAsTemplate to ' /Templates/template.3dm', the file new Artisan documents start from — set up layers, units, metals and finger size once, then save it as the template. path overrides the destination ('.3dm' appended). |","metadata":{"title":"Tools","section":"Document and library","url":"https://www.rhinoartisan.com/docs/mcp/tools/#document-and-library","source":"https://www.rhinoartisan.com/docs/mcp/tools/#document-and-library","collection":"mcp","hash":"6b59a47ba56bf52b93fd039193507201","indexed_by":"docs-index"}},{"content":"Tools — Drafting extras\n\n| Tool | What it does |\n|---|---|\n| `reduce_dimensions` | Reduces the DISPLAYED value of distance dimensions by a percentage (the ArtisanDimensionsReduce command): only the dimension text is overridden, the geometry and the model are untouched. |\n| `restore_dimensions` | Restores distance dimensions to their real measured value by putting back the <> placeholder, removing any text override made by reduce_dimensions or by hand (the ArtisanDimensionsRestore command). |\n| `add_logo` | Creates the logo used by the report sheet from the given objects (curves, text, surfaces...), like the ArtisanAddLogo command: copies them, scales the copies so the largest extent is 28 mm, centers them at (65, 25, 0), saves them as logo.3dm in the Artisan user folder and deletes the copies. |\n| `export_gems_excel` | Exports the gems list of specific gems to a semicolon-delimited CSV that opens in Excel (the ArtisanGemsListToExcelBySelection / BySelectionGroups commands): columns Shape, Size X, Size Y, Carats, Quantity, Total Carats, identical gems merged with a quantity. |\n| `create_technical_chart` | Recomputes the production breakdown and returns the technical chart (the ArtisanTechnicalChart panel): per metal the net weight, waste, total and wax weight in grams, volume (mm3) and surface area (mm2); the gems by shape and size with count, carats, sieve and setting type; the printing sizes, setting processes, additional processes and extra components — everything except prices (for prices use calculate_price). |\n| `save_report_template` | Saves the ACTIVE document as a report template (the ArtisanSaveReportTemplate command): a Save As into the report-templates folder, so the document adopts that path. |","metadata":{"title":"Tools","section":"Drafting extras","url":"https://www.rhinoartisan.com/docs/mcp/tools/#drafting-extras","source":"https://www.rhinoartisan.com/docs/mcp/tools/#drafting-extras","collection":"mcp","hash":"55fd7d5b7cd836dc164baf298da477ea","indexed_by":"docs-index"}},{"content":"Tools — Drafting extras\n\n| Tool | What it does |\n|---|---|\n| `open_report_template` | Opens a report template file as the active document to edit its layout (the ArtisanOpenReportTemplate command). |\n| `apply_artisan_layout` | Applies the Artisan window layout to Rhino (the ArtisanLayout command / the ribbon's Window Layout button): imports ArtisanSkin.rhw and activates the 'Artisan' layout of panels and toolbars. *(read-only)* |","metadata":{"title":"Tools","section":"Drafting extras","url":"https://www.rhinoartisan.com/docs/mcp/tools/#drafting-extras","source":"https://www.rhinoartisan.com/docs/mcp/tools/#drafting-extras","collection":"mcp","hash":"9553fd6bf0a6ba700ca969a3630fe741","indexed_by":"docs-index"}},{"content":"Tools — Pricing profiles\n\n| Tool | What it does |\n|---|---|\n| `get_markup` | Returns the company's markup profile as JSON (the ArtisanMarkup dialog, Markup.json — NOT part of get_pricing_settings): Name, Notes, the main-stone cost bands P100_90 ... *(read-only)* |\n| `set_markup` | Updates one or more values of the markup profile and saves Markup.json (the ArtisanMarkup dialog's Accept). values maps field name to value, e.g. {\"P100_90\": 35, \"OnlySettingMarkup\": 120, \"Name\": \"Retail\"}; names are matched ignoring case and underscores, fields not given keep their value. |\n| `get_taxes` | Returns the company's tax profile as JSON (the ArtisanTaxes dialog, Taxes.json — NOT part of get_pricing_settings): Mode (None, European, American, Canadian, OtherCountry), the region and tax id of that mode (EuropeanCou… *(read-only)* |\n| `list_tax_regions` | Lists the valid regions for a tax mode, to pick the region of set_taxes: EU member countries (European), US states (American), Canadian provinces (Canadian) or every country (OtherCountry). *(read-only)* |\n| `set_taxes` | Updates the company's tax profile and saves Taxes.json (the ArtisanTaxes dialog's Accept). |","metadata":{"title":"Tools","section":"Pricing profiles","url":"https://www.rhinoartisan.com/docs/mcp/tools/#pricing-profiles","source":"https://www.rhinoartisan.com/docs/mcp/tools/#pricing-profiles","collection":"mcp","hash":"a7b893c7e2e5dadf18bd280d11abc90d","indexed_by":"docs-index"}},{"content":"Tools — Time tracking, Boutique, AI images, GLB batch\n\n| Tool | What it does |\n|---|---|\n| `get_time_tracking` | How long each saved file has been worked on (the Time Tracker panel), per file and per day. *(read-only)* |\n| `list_boutique_designs` | Ready-made designs of the Boutique collections installed on this computer (solitaires, trilogies, halos, bands, earrings, pendants...): collection, name, SKU, id, prices. *(read-only)* |\n| `get_boutique_catalog` | The kits (collections and components) published in the online Boutique catalog at rhinoartisan.com, each with whether it is installed on this computer and up to date. *(read-only)* |\n| `download_boutique_kits` | Downloads and installs kits from the online Boutique catalog into the user's Boutique folder: the ones named in `names`, or, when omitted, every kit not installed yet or updated since. |\n| `insert_boutique_design` | Imports a Boutique design into the document like the Boutique window does (a regular import: its objects keep their layers). |\n| `generate_ai_image` | Generates one image with fal.ai on the user's fal.ai key and saves it: a photographic render of the Rhino viewport, an edit of an image file, or an image from the prompt alone. |\n| `export_glb_batch` | Converts every .3dm in a folder (and its subfolders unless recursive=false) to a GLB next to it, with the same conversion as export_glb (the configurator's batch export). |","metadata":{"title":"Tools","section":"Time tracking, Boutique, AI images, GLB batch","url":"https://www.rhinoartisan.com/docs/mcp/tools/#time-tracking-boutique-ai-images-glb-batch","source":"https://www.rhinoartisan.com/docs/mcp/tools/#time-tracking-boutique-ai-images-glb-batch","collection":"mcp","hash":"75532fbd9ab10f335deb97c128c3debc","indexed_by":"docs-index"}},{"content":"Tools — Assistant\n\n| Tool | What it does |\n|---|---|\n| `get_design_summary` | Full snapshot of the current design: file name, design type, metals, ring size and available sizing regions, layer names, a semantic description of every element (gems, settings, shanks…) and the document notes. *(read-only)* |\n| `get_pricing_and_boutique` | Pricing data for the current design: the INTERNAL manufacturing cost breakdown (materials, weights, labor) and the Boutique RETAIL data (regular/sale price, SKU, description). *(read-only)* |\n| `search_rhinoartisan_docs` | Searches the official RhinoArtisan documentation (the knowledge base behind rhinoartisan.com/ask) and returns the most relevant excerpts with their page title and link. *(read-only)* |\n| `undo` | Undoes the last action in the document (Rhino undo). *(destructive)* |\n| `redo` | Redoes the last undone action in the document (Rhino redo). *(destructive)* |\n| `set_render_material` | Applies a metal or gem render material to everything on a layer. layer_name e.g. |\n| `lie_on_ground` | Rotates the design so it lies as flat as possible on the ground plane (render staging). |\n| `delete_dimensions` | Removes every annotation (dimensions) from the document. *(destructive)* |\n| `save_as` | Saves the document under a new file name, next to the current file (or in Documents when the file has never been saved). '.3dm' is appended when missing. |","metadata":{"title":"Tools","section":"Assistant","url":"https://www.rhinoartisan.com/docs/mcp/tools/#assistant","source":"https://www.rhinoartisan.com/docs/mcp/tools/#assistant","collection":"mcp","hash":"29c10672654f884b38db57c1e824c428","indexed_by":"docs-index"}},{"content":"Tools — Editing objects: values, methods and presets\n\n`edit_object` changes a parametric object in place, and the object keeps its id. A single call can mix three kinds of keys:\n\n- Values: `{\"prong_diameter\": 0.9}` calls the matching `Set…` setter. On objects stored as a JSON model (smart components, trilogies), a dotted path works: `{\"top_profile.width\": 4.5}`. Numbers always use a `.` decimal separator, whatever the Windows language.\n- Method calls: `{\"set_section\": {\"index\": 1, \"width\": 1.6}}` calls an edit method by its snake_case name (`set_…`, `add_…`, `remove_…`, `mirror_…`, `fit_…`, `apply_…`…). Pass an object of named arguments, a list of objects to repeat the call, a bare value when the method has one required argument, or `true` when every argument is optional (`{\"fit_to_gem\": true}`). If an argument is wrong, the error shows the method's signature.\n- Presets: `{\"element\": \"Chunky\"}` applies a saved element of the same type first, and the other keys in the call are applied after it.\n\n`describe_object_parameters` returns the exact contract for an object: its current values, every key it accepts, and the methods it can call (`calls`).","metadata":{"title":"Tools","section":"Editing objects: values, methods and presets","url":"https://www.rhinoartisan.com/docs/mcp/tools/#editing-objects-values-methods-and-presets","source":"https://www.rhinoartisan.com/docs/mcp/tools/#editing-objects-values-methods-and-presets","collection":"mcp","hash":"531bcb8f323bde41a241af5d98c2decd","indexed_by":"docs-index"}},{"content":"Tools — Example session\n\n> You: Make me a 1-carat halo engagement ring, size 54, and tell me what it weighs in 18k white gold.\n>\n> Your assistant places the center stone, builds the halo around it, creates the shank, adds the prong setting, and weighs the result — then shows you a render.\n>\n> A finished, editable, parametric design appears in your viewport.\n\nEvery tool requires the RhinoArtisan plugin to be loaded with a valid license. If there's a workflow you want your AI assistant to drive, tell us about it — real use cases decide what ships next.","metadata":{"title":"Tools","section":"Example session","url":"https://www.rhinoartisan.com/docs/mcp/tools/#example-session","source":"https://www.rhinoartisan.com/docs/mcp/tools/#example-session","collection":"mcp","hash":"1f7c35b6b588064c45a57d6ae2db9816","indexed_by":"docs-index"}},{"content":"Scripting API\n\nEverything you can do in RhinoArtisan by hand, you can do in code. The Scripting API turns the full jewelry toolset — gems, settings, shanks, weights, pricing, manufacturing exports — into a clean set of Python facades (`GemApi`, `BezelApi`, `PricingApi`, …) that run entire workflows with no dialogs and no mouse.\n\n```python\nfrom Rhino.Geometry import Plane\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\n\nwith Transaction.Begin(\"Add a one-carat round diamond\"):\n    gem.Create(\"ROUND\", \"Diamond\", 1.0, Plane.WorldXY)\n```\n\nFive lines, one undo step, and a gem identical to one placed through the UI.\n\nBeta — RhinoArtisan Labs. The Scripting API ships in 7.0 as a beta: it runs real production workflows today, but names and signatures may still change between releases while the surface settles into a stable v1. Once it graduates, changes will come with versioning and a deprecation window. A script you save now may need small updates along the way. All license terms apply to beta features.","metadata":{"title":"Scripting API","url":"https://www.rhinoartisan.com/docs/scripting/","source":"https://www.rhinoartisan.com/docs/scripting/","collection":"scripting","hash":"e752ac858ef5f315cffcfd622711431e","indexed_by":"docs-index"}},{"content":"Scripting API — What you can build with it\n\n- Size runs and variants. Generate a ring in every size, a pendant in three metals, a collection in one pass — instead of one file at a time.\n- Parametric designs. Drive stone counts, spacings and dimensions from data: a CSV of orders, a formula, a customer configurator.\n- Pricing and quoting. Pull metal weights and stone lists straight from the model and feed them into your own quoting or ERP flow.\n- Manufacturing pipelines. Validate, name, export and report on production files automatically, the same way every time.\n\nIf your studio does it more than once, it is worth a script.","metadata":{"title":"Scripting API","section":"What you can build with it","url":"https://www.rhinoartisan.com/docs/scripting/#what-you-can-build-with-it","source":"https://www.rhinoartisan.com/docs/scripting/#what-you-can-build-with-it","collection":"scripting","hash":"06db6d9c29f5d1245aeae0af9be594c0","indexed_by":"docs-index"}},{"content":"Scripting API — Design principles\n\nThe API follows the same rules everywhere, so what you learn on one facade applies to all of them:\n\n- A stable, jewelry-aware contract. Scripts work with clear interfaces like `IGem` and `IBezel` that stay compatible as RhinoArtisan evolves.\n- Friendly errors. Pass a bad argument — an unknown gem shape, a negative carat weight — and you get a clear, human-readable message, not a stack trace.\n- Undo in one step. Mutations are grouped in a `Transaction`, so an entire scripted operation reverts with a single Ctrl+Z.\n- Indistinguishable results. A gem placed by script is identical to a gem placed by hand — same geometry, same data, same downstream tools.","metadata":{"title":"Scripting API","section":"Design principles","url":"https://www.rhinoartisan.com/docs/scripting/#design-principles","source":"https://www.rhinoartisan.com/docs/scripting/#design-principles","collection":"scripting","hash":"659264833eb151abb2d15fc7b0ffb9b5","indexed_by":"docs-index"}},{"content":"Scripting API — Licensing\n\nThe Scripting API is part of your RhinoArtisan license — no extra module to buy. It requires a valid license just like the UI tools: every call that creates, modifies or deletes something in the document verifies it first and raises a clear, actionable error if it isn't valid. You don't manage any of this from your script; it's built into every facade.\n\nYour seat covers scripts you run and supervise yourself. Unattended pipelines (scheduled or server-side jobs) and systems that serve third parties have their own licenses — see the EULA and talk to us about Automation and OEM agreements. What counts is how the script runs, not where: Windows Server, Rhino.Compute or a workstation acting as a server are all the same case.","metadata":{"title":"Scripting API","section":"Licensing","url":"https://www.rhinoartisan.com/docs/scripting/#licensing","source":"https://www.rhinoartisan.com/docs/scripting/#licensing","collection":"scripting","hash":"7a12e40cc900d1bfa34f72526d20ee7f","indexed_by":"docs-index"}},{"content":"Scripting API — What's new in 7.0.0.10\n\n- Elements: build from a saved preset with `element=`, apply one with `SetElement`, save an object as a new preset, and manage the library (rename, duplicate, favorites, delete, export and import bundles).\n- Assets: reference a profile by `\"id: \"`, preview it with `ExportAsCurve`, and rename, duplicate, set the default or delete.\n- Smart profile: `SmartProfileApi` and the `ISmartProfile` handle, which edits section by section.\n- Editing smart components: `SmartComponentApi` finds bails, bangles, charms… and edits them after creation.\n- Cutters: `fitToGem` for fancy cuts, and `ICutter` setters.\n- Bail: wire profiles, side curves and O-ring options, placed on the metal layer.\n- Basket rails: `DEFAULT` / `CUSTOM` modes.\n- Command panels: `PanelsApi.Active()` and `Close()`.","metadata":{"title":"Scripting API","section":"What's new in 7.0.0.10","url":"https://www.rhinoartisan.com/docs/scripting/#whats-new-in-70010","source":"https://www.rhinoartisan.com/docs/scripting/#whats-new-in-70010","collection":"scripting","hash":"0d65f770a82641854b0f71e1ada3bcb1","indexed_by":"docs-index"}},{"content":"Scripting API — Where to go next\n\n- Getting Started — your first script, step by step.\n- Core Concepts — transactions, handles, error handling, units.\n- Handles — every handle interface, one page each.\n- API Reference — guides by area, with examples.\n- .NET API — every facade, method, parameter and default, generated from the plugin (one page per facade).\n- Python package — Rhino 8+: `import rhinoartisan as ra`, the same API as plain Python 3 (generated reference, one page per module).","metadata":{"title":"Scripting API","section":"Where to go next","url":"https://www.rhinoartisan.com/docs/scripting/#where-to-go-next","source":"https://www.rhinoartisan.com/docs/scripting/#where-to-go-next","collection":"scripting","hash":"72a7230496cf43722bb2ebbfd8a65258","indexed_by":"docs-index"}},{"content":"Scripting API — What the API deliberately does not do\n\n- It does not expose raw meshes or breps — use `rhinoscriptsyntax` / `RhinoCommon` for freeform geometry.\n- Not every parametric field is editable yet. Most shank and gemset handles have setters, and smart components are edited by path, but some handles are still read-only for part of their model. Coverage grows release by release, and the API Reference shows what each facade can create, edit and query.\n\nA note on support. Scripting is not covered by standard RhinoArtisan support, which is limited to the product itself — installation, licensing and how its tools work. For help with scripts, architecture, integration and development questions around what your team builds with the Scripting API, RhinoArtisan Support Plus gives you direct access to our technical team.","metadata":{"title":"Scripting API","section":"What the API deliberately does not do","url":"https://www.rhinoartisan.com/docs/scripting/#what-the-api-deliberately-does-not-do","source":"https://www.rhinoartisan.com/docs/scripting/#what-the-api-deliberately-does-not-do","collection":"scripting","hash":"02bd566f66ae8f1f18df50d9a48a9e68","indexed_by":"docs-index"}},{"content":"Core Concepts\n\nEvery facade in `ArtisanPlugin.Scripting` follows the same conventions. Learn them once and the whole API reads the same way.\n\nFacades and handles\nThe API is organized as static facade classes, one per area: `GemApi`, `BezelApi`, `RingCurveApi`, `PricingApi`, and so on. Facades do two things:\n\n- Query the active document (`GemApi.All()`, `GemApi.Selected()`, `GemApi.Find(id)`) — these return handles.\n- Create new objects (`GemApi.Create(...)`) — these also return a handle to what was just made.\n\nA handle (`IGem`, `IBezel`, …) is a live view of one object in the document. It exposes read-only properties (`Shape`, `CaratWeight`, `Position`, `LayerName`) and mutation methods (`Move`, `SetMaterial`, `Copy`, `Delete`). Handles are intentionally narrow: they are the *only* thing a script can touch, and they never expose RhinoArtisan's internal kernel objects. Every handle interface has its own page under Handles.","metadata":{"title":"Core Concepts","url":"https://www.rhinoartisan.com/docs/scripting/core-concepts/","source":"https://www.rhinoartisan.com/docs/scripting/core-concepts/","collection":"scripting","hash":"e19c9727053bf19844ddf2324ab12861","indexed_by":"docs-index"}},{"content":"Core Concepts — Transactions: undo as a unit\n\nWrap every mutating script in a `Transaction` with a descriptive name:\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\n\nwith Transaction.Begin(\"Move 3 round diamonds down\"):\n    for g in gem.Selected():\n        g.Move(Vector3d(0, 0, -1))\n```\n\nEverything inside the `with` block — Artisan calls *and* plain Rhino calls — becomes one undo step with that name. The user presses Ctrl+Z once and the whole scripted operation reverts. Read-only scripts (reports, measurements, price checks) don't need a transaction.","metadata":{"title":"Core Concepts","section":"Transactions: undo as a unit","url":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#transactions-undo-as-a-unit","source":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#transactions-undo-as-a-unit","collection":"scripting","hash":"df09481cfebc6da23e81988d96d79b64","indexed_by":"docs-index"}},{"content":"Core Concepts — The error contract\n\nThe API distinguishes two kinds of failure, and it matters for anything that shows messages to a user:\n\n- `ArgumentException` — *you* passed something invalid (unknown shape name, carat weight ≤ 0). The message is human-readable and safe to show as-is: `\"Unknown gem shape 'SQUIRCLE'.\"`\n- Any other exception — something unexpected happened inside Artisan. These are bugs to report, not messages to relay.\n\nValidate inputs with the discovery methods (`Shapes()`, `Materials()`, …) when you can, and let `ArgumentException` messages speak for themselves when you can't.","metadata":{"title":"Core Concepts","section":"The error contract","url":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#the-error-contract","source":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#the-error-contract","collection":"scripting","hash":"8a254bb8c1add8c1b05a0418ffbf5fde","indexed_by":"docs-index"}},{"content":"Core Concepts — Units and conventions\n\n- Sizes are in millimeters; gem sizes derive from carat weight through the same proportion tables the UI tools use.\n- Placement uses `Rhino.Geometry.Plane` — the plane's origin is where the object goes and its Z axis is \"up\" for the object. `Plane.WorldXY` means \"at the origin, flat\".\n- String parameters that map to fixed vocabularies (shapes, materials, metals) are case-insensitive and tolerate dashes/spaces (`\"rose-gold\"` → `ROSE_GOLD`).\n- Objects created by script land on the same layers the equivalent UI tool would use, with the same materials applied.","metadata":{"title":"Core Concepts","section":"Units and conventions","url":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#units-and-conventions","source":"https://www.rhinoartisan.com/docs/scripting/core-concepts/#units-and-conventions","collection":"scripting","hash":"2d8734cbb8f03760a1735ef37ca79453","indexed_by":"docs-index"}},{"content":".NET API\n\nEvery facade of `ArtisanPlugin.Scripting` — API 0.9.0, RhinoArtisan 7.0.0.10 — with the exact C# signature of each method, its parameters and defaults, and the handles, sections and results it hands back. This reference is generated from the plugin itself, so it always matches the version it names. For walkthroughs and examples, see the API reference guides; for Python 3, the rhinoartisan package.\n\nConventions: millimetres everywhere; an optional number left at `0` keeps the default (the user's saved defaults for that element, else the tool's); a `Guid` list left `null` or empty uses the current selection; every mutating call needs a valid license; wrap changes in a `Transaction` so they land as one undo step.\n\n* Core types — `Transaction`, `ScriptingInfo`, `LicenseGate` and the exceptions a script can catch.\n* Results — the read-only records methods return (prices, weights, exports...).\n* Other interfaces — the shared bases of the handles (`IParametricObject`, `IGemSetting`...).","metadata":{"title":".NET API","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/","collection":"scripting","hash":"93fbfa18c65c9dcdd2fa4f40a429783b","indexed_by":"docs-index"}},{"content":".NET API — Gems\n\n| Facade | |\n|---|---|\n| `AdvancedGemsOnCurveApi` | Runs of stones along a curve with per-stone sizes, shapes and rotations. |\n| `GemApi` | Create, query and edit stones: shapes, materials, carats, placement, copies, collisions. |\n| `GemOrientationApi` | Fix the orientation plane of stones without moving them. |\n| `GemSizeApi` | Stones by millimetre size instead of carats. |\n| `GemToolsApi` | Utilities over existing stones: centers, tags, alignment, curves from gems, copy by gems, colors by size. |\n| `GemsByNetworkApi` | Stones over a network of intersecting curves, sized to meet at the nodes. |\n| `GemsFromCircleApi` | Turn circles into round stones of the matching size. |\n| `GemsOn2CurvesApi` | Stones fitted between two rails, sized to the gap. |\n| `GemsOnCurveApi` | A run of stones along one curve, with prongs and cutters, editable afterwards. |\n| `TaperedBaguettesApi` | Tapered baguettes between two curves. |\n| `ThreeStonesApi` | The classic three-stone layout. |\n| `ToiEtMoiApi` | Two stones facing each other. |\n| `TrilogyApi` | Three-stone families: trellis, halo, individual, bezel set, east-west. |","metadata":{"title":".NET API","section":"Gems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#gems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#gems","collection":"scripting","hash":"c8df5954068c4887b310b0abe7fe5f45","indexed_by":"docs-index"}},{"content":".NET API — Settings\n\n| Facade | |\n|---|---|\n| `AdvancedBasketApi` | Baskets with independent prong and rail profiles. |\n| `AdvancedBezelApi` | Bezels with a custom profile. |\n| `BasketApi` | Basket settings: prongs, upper and base rails. |\n| `BasketUpdateApi` | Basket settings: prongs, upper and base rails. |\n| `BezelApi` | Bezel settings with support, cutter and air-gap sections. |\n| `CabochonApi` | Cabochon stones and their settings. |\n| `ChannelApi` | Channel settings along a curve. |\n| `ClusterApi` | Cluster settings around a centre stone. |\n| `CutterApi` | The cutters that carve the seat of a stone into the metal. |\n| `HaloApi` | A halo of small stones around a centre stone. |\n| `HiddenHaloApi` | A hidden halo under the centre stone. |\n| `MartiniApi` | Martini settings. |\n| `MicroSettingApi` | Micro settings (micro-pave heads). |\n| `PearlApi` | Pearls and their cups. |\n| `PegheadApi` | Peghead seats under a stone: prongs, height, thickness. |\n| `TrellisGemsetApi` | Trellis settings. |\n| `TulipApi` | Tulip settings. |","metadata":{"title":".NET API","section":"Settings","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#settings","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#settings","collection":"scripting","hash":"4f7df4d5b6bbda65bff2340777a8973a","indexed_by":"docs-index"}},{"content":".NET API — Shanks and rings\n\n| Facade | |\n|---|---|\n| `AdvancedCathedralApi` | Cathedral shanks with station-by-station control. |\n| `AdvancedRingApi` | Rings built from positioned sections along the finger curve. |\n| `AdvancedSignetRingApi` | Signet rings with independent top and side profiles. |\n| `BypassApi` | Bypass shanks whose arms cross past each other. |\n| `CathedralApi` | Cathedral shanks: arms rising toward the setting. |\n| `ClassRingApi` | Class rings. |\n| `ClassicApi` | Classic ring shanks: comfort-fit bands at the document finger size, optionally with a stone row. |\n| `EternityApi` | Eternity bands with stones all around. |\n| `GraduatedApi` | Graduated shanks: a run of stones shrinking away from the centre. |\n| `MatchingShankApi` | Matching shanks fitted against an engagement ring. |\n| `MatchingShankBuilderApi` | Matching shanks fitted against an engagement ring. |\n| `PaveShankApi` | Pave shanks: rows of stones along the band. |\n| `PaveShankBuilderApi` | Pave shanks: rows of stones along the band. |\n| `RingCurveApi` | Ring rail curves at the document finger size (closed, open, bypass, shaped). |\n| `RingExtrudeApi` | Rings extruded from a frontal profile. |\n| `RingToolsApi` | Utilities on ring geometry: cut by ring size, estimate size, rail helpers. |\n| `ScoopRingApi` | Scoop rings. |\n| `SignetRingApi` | Signet rings with a shaped top face. |\n| `SplitShankApi` | Split shanks. |\n| `TwoRowsShankApi` | Two-row shanks. |\n| `TwoRowsShankBuilderApi` | Two-row shanks. |\n| `WeddingApi` | Wedding sets (band pairs) built as one editable object. |\n| `WeddingBandApi` | Single wedding bands. |\n| `WeddingBuilderApi` | Wedding sets (band pairs) built as one editable object. |","metadata":{"title":".NET API","section":"Shanks and rings","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#shanks-and-rings","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#shanks-and-rings","collection":"scripting","hash":"1926785b3b2045add6a0bee8274412fc","indexed_by":"docs-index"}},{"content":".NET API — Pave and prongs\n\n| Facade | |\n|---|---|\n| `AutomaticPaveApi` | Relaxed multi-size pave fill with symmetry. |\n| `AzureApi` | Azure cutters under a pave: the openwork underneath. |\n| `PaveAlongSurfaceApi` | Pave rows following a surface direction. |\n| `PaveApi` | Automatic pave over surfaces: one size in a regular grid, with prongs and cutters. |\n| `ProngApi` | Prongs: dynamic (between stones), automatic, custom and axis-aligned. |","metadata":{"title":".NET API","section":"Pave and prongs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#pave-and-prongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#pave-and-prongs","collection":"scripting","hash":"3234427e0b295c36a0873ab40594b220","indexed_by":"docs-index"}},{"content":".NET API — Components\n\n| Facade | |\n|---|---|\n| `BailApi` | Pendant bails. |\n| `BangleApi` | Bangles. |\n| `BeadApi` | Beads. |\n| `ChainApi` | Chains along a curve. |\n| `CharmApi` | Charms. |\n| `EngravingApi` | Ring engravings. |\n| `HingeApi` | Hinges. |\n| `HoneyCombApi` | Honeycomb patterns over surfaces. |\n| `HuggieApi` | Huggie earrings. |\n| `LinkApi` | Chain links. |\n| `MilgrainApi` | Milgrain beading along curves. |\n| `NamedPendantApi` | Name pendants from text. |\n| `PatternApi` | Repeated patterns over surfaces. |\n| `ProfileSweepApi` | Sweeps of a profile along rails. |\n| `RopeApi` | Rope twists. |\n| `SmartComponentApi` | Edit bails, named pendants, bangles, beads, charms, links, milgrain, ropes, 3D textures and ring engravings after creation (their model as JSON). |\n| `TextOnCurveApi` | Text laid along a curve. |\n| `Texture3DApi` | 3D textures applied to surfaces. |\n| `UserElementApi` | User-defined elements. |\n| `VoronoiApi` | Voronoi patterns over surfaces. |","metadata":{"title":".NET API","section":"Components","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#components","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#components","collection":"scripting","hash":"d4637dee9e16a3b37220e36c2fa1ad94","indexed_by":"docs-index"}},{"content":".NET API — Solids, curves and transforms\n\n| Facade | |\n|---|---|\n| `BooleanApi` | Artisan booleans that keep the pieces editable: union, difference, intersection, split, update. |\n| `BooleanUpdateApi` | Artisan booleans that keep the pieces editable: union, difference, intersection, split, update. |\n| `CurveApi` | Curve helpers for jewelry layouts. |\n| `MeshApi` | Mesh decimation. |\n| `RasterToVectorApi` | Trace an image into curves. |\n| `RelationsApi` | Parent/child relations between parametric objects. |\n| `ReliefApi` | 2.5D reliefs: creators, the operation stack, sculpt/smooth by points, bake, heightmaps. |\n| `SmartProfileApi` | Smart Profiles: profile sections swept along a curve, varying along the way. |\n| `SolidApi` | Solid modelling helpers: caps, shells, sweeps, offsets. |\n| `TransformApi` | Move, rotate, scale, mirror, arrays, deformations (bend, twist, taper), flow, placement on objects. |","metadata":{"title":".NET API","section":"Solids, curves and transforms","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#solids-curves-and-transforms","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#solids-curves-and-transforms","collection":"scripting","hash":"fc927e2984c705ee897378c0aaa100b5","indexed_by":"docs-index"}},{"content":".NET API — Analysis and pricing\n\n| Facade | |\n|---|---|\n| `AnalyzeApi` | Wall thickness: at points and globally. |\n| `PricingApi` | Prices and cost breakdowns, markup and taxes profiles. |\n| `PricingExtraApi` | Prices and cost breakdowns, markup and taxes profiles. |\n| `WeightApi` | Metal weights: per layer, per selection, by area. |","metadata":{"title":".NET API","section":"Analysis and pricing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#analysis-and-pricing","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#analysis-and-pricing","collection":"scripting","hash":"59d76f798bd947cbc5c7bb544ac36e6c","indexed_by":"docs-index"}},{"content":".NET API — Production\n\n| Facade | |\n|---|---|\n| `FileApi` | File utilities: standardize, elements import/export, layer exports. |\n| `ManufacturingApi` | Production: repair, printability checks, identifiers, sprues, resizing, exports. |\n\nDrafting\n| Facade | |\n|---|---|\n| `DraftingApi` | Reports, gems maps, cost tables, dimensions. |\n| `DraftingExtraApi` | Reports, gems maps, cost tables, dimensions. |","metadata":{"title":".NET API","section":"Production","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#production","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#production","collection":"scripting","hash":"9bdb8b3a68fb5d1853f86dc858db9098","indexed_by":"docs-index"}},{"content":".NET API — Render and views\n\n| Facade | |\n|---|---|\n| `RealtimeRenderApi` | The web Realtime Render viewer: open, update, camera, materials, screenshots. |\n| `RenderApi` | Render materials, staging and batch rendering. |\n| `RenderStudioApi` | Render Studio: environments, materials, stills and turntables. |\n| `ViewApi` | Viewport cameras, display modes, named views and captures. |","metadata":{"title":".NET API","section":"Render and views","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#render-and-views","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#render-and-views","collection":"scripting","hash":"e1a4c7d6df86acc6ff6234ba25085ad8","indexed_by":"docs-index"}},{"content":".NET API — Document and library\n\n| Facade | |\n|---|---|\n| `AssetsApi` | The profile library the parametric tools build from. |\n| `DocumentApi` | The document: open/save/new, computation mode, metals, ring size, STL/PDF/GLB exports. |\n| `ElementsApi` | Saved element presets: build from them, apply them, save objects as new ones, organize the library. |\n| `PanelsApi` | The open Artisan command panel: which one it is, and closing it without applying. |\n| `SemanticsApi` | Semantic descriptions of the design. |","metadata":{"title":".NET API","section":"Document and library","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#document-and-library","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#document-and-library","collection":"scripting","hash":"20a06f2ca2b758f22dbf22692ed84c19","indexed_by":"docs-index"}},{"content":".NET API — Integrations\n\n| Facade | |\n|---|---|\n| `FileSearchApi` | Instant search over indexed design files. |\n| `NivodaApi` | Nivoda certified-diamond search. |\n\nOther\n| Facade | |\n|---|---|\n| `AiImageApi` | AI images with fal.ai, the engine of Generative AI Studio and of the Assistant's generate_image: a photoreal render of the viewport, an edit of an image file, or an image from a prompt alone. |\n| `BoutiqueApi` | The Boutique: ready-made designs (solitaires, trilogies, halos, bands, earrings...) grouped in collections that are downloaded from the RhinoArtisan catalog to this computer and imported into the document like the Boutique window does. |\n| `TimeTrackingApi` | The time tracker's records (the ArtisanTimeTracker panel), read-only: how long each saved file has been worked on, per day. |","metadata":{"title":".NET API","section":"Integrations","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/#integrations","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/#integrations","collection":"scripting","hash":"6dd20cefa0b50f58aae32d8efbe01d18","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi\n\nBaskets with independent prong and rail profiles.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBasketApi\n```\n\nSee also the guide, Gemsets › Advanced basket, and the Python package, `ra.advanced_basket`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IAdvancedBasket` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedBasket` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds an advanced basket setting under an existing gem -- the ArtisanAdvancedBasket tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IAdvancedBasket` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Presets` | The prong layouts the tool ships for a gem shape, by name -- the same list the panel draws as its preset row. |\n| `Selected` | Advanced baskets currently selected in the active doc. |","metadata":{"title":"AdvancedBasketApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/","collection":"scripting","hash":"7434424ceae8ea34c24a627980987fd5","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — All\n\n```csharp\nIReadOnlyList<IAdvancedBasket> AdvancedBasketApi.All()\n```\n\n`IAdvancedBasket` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedBasket> AdvancedBasketApi.ByLayer(string layerName)\n```\n\n`IAdvancedBasket` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBasketApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#all","collection":"scripting","hash":"a5a39d265a26eca964e7c20d1a17febd","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Count\n\n```csharp\nint AdvancedBasketApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"AdvancedBasketApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#count","collection":"scripting","hash":"9e241bb1d1e1885b75de97aad8463b5a","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Create\n\n```csharp\nIReadOnlyList<IAdvancedBasket> AdvancedBasketApi.Create(\n    IEnumerable<Guid> gemIds = null,\n    int prongs = 0,\n    string prongMode = null,\n    double prongDiameter = 0,\n    double prongHeight = 0,\n    int? rails = null,\n    double railWidth = 0,\n    string profile = null,\n    string preset = null,\n    array<double> positions = null,\n    string element = null)\n```","metadata":{"title":"AdvancedBasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","collection":"scripting","hash":"dadd2ff2070e832feb159fa31cf14912","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Create\n\nBuilds an advanced basket setting under an existing gem -- the ArtisanAdvancedBasket tool, headless. One basket (its own group) per gem; `gemIds` null/empty = the currently selected gems. Unlike the basic Basket, the advanced basket is a free layout: a list of individually placed prongs plus a list of rails. This facade lays both out evenly, like the tool's presets. Millimetres; 0/null keeps the tool default (or the user's saved defaults): `prongs` 0 keeps the saved layout, or 4 prongs at the diagonals when there is none (the tool's \"4\" preset); a positive count places that many prongs evenly around the gem. `prongMode` null = ROUND; also DOUBLE (the 2-2 presets), TRIPLE (3-3), CLAW, OFFSET or CUSTOM, applied to every prong (DEFAULT and CIRCLE also mean ROUND; claw tips are built in Render mode only and are tuned through the handle). `prongDiameter` 0 keeps 1.5 (sets top and bottom together), `prongHeight` 0 keeps 4. `rails` null keeps the saved rails (a fresh basket has none); 0 = no rails, 1 = one rail 1 mm under the girdle, 2 adds a second at 3.66 (the tool's 1-rail / 2-rail presets; more keep the same spacing). `railWidth` 0 keeps 1.5, applied to every rail. `profile` names a CLOSED_PROFILE asset for the prongs (see AssetsApi.List) and switches them to CUSTOM mode unless `prongMode` says otherwise; null keeps each mode's built-in section. Returns one IAdvancedBasket handle per gem, in input order. `element` = name of a saved AdvancedBasket element (ElementsApi.List(\"AdvancedBasket\")) to start from instead of the defaults, re-seeded onto each gem; explicit arguments override it.","metadata":{"title":"AdvancedBasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","collection":"scripting","hash":"60cd759f4d5f9f3e435c0ebca3349c28","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `prongs` | `int` | `0` |\n| `prongMode` | `string` | `null` |\n| `prongDiameter` | `double` | `0` |\n| `prongHeight` | `double` | `0` |\n| `rails` | `int?` | `null` |\n| `railWidth` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `preset` | `string` | `null` |\n| `positions` | `array ` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#create","collection":"scripting","hash":"7494c89470ca6889d499c63ad76a52f3","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Find\n\n```csharp\nIAdvancedBasket AdvancedBasketApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedBasket`.\n\nForGem\n```csharp\nIReadOnlyList<IAdvancedBasket> AdvancedBasketApi.ForGem(Guid gemId)\n```\n\n`IAdvancedBasket` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBasketApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#find","collection":"scripting","hash":"379e4b5d0c6c2bcb3f920bf601616d10","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Presets\n\n```csharp\nIReadOnlyList<string> AdvancedBasketApi.Presets(Guid gemId)\n```\n\nThe prong layouts the tool ships for a gem shape, by name -- the same list the panel draws as its preset row. Pass one of these as Create's `preset`. Names look like \"4\", \"4-V\", \"2-2\", \"3-3\", \"6\", \"8\" or \"NONE\"; which ones exist depends on the shape (an emerald gets corner layouts, a marquise gets tip layouts...).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBasketApi","section":"Presets","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#presets","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#presets","collection":"scripting","hash":"5f0af0922b5f38dc7405f335bc803324","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — Selected\n\n```csharp\nIReadOnlyList<IAdvancedBasket> AdvancedBasketApi.Selected()\n```\n\nAdvanced baskets currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"AdvancedBasketApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#selected","collection":"scripting","hash":"0c1b9bcb1d37334bc9068c97a21e2b72","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — IAdvancedBasket\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ClawCapDistance` | `double` | get | The claw tips of CLAW prongs (built in Render mode only), first prong's values. mm the apex is pulled in toward the gem centre. |\n| `ClawCapHeight` | `double` | get | mm the apex moves up (+) or down (-) |\n| `ClawTipSmoothness` | `double` | get | body-to-tip blend, 0-1 |\n| `ClawTipWidth` | `double` | get | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | Every value of every prong and rail, as the panel's per-prong and per-rail editors hold them: the model's JSON, whose paths GetParameter / SetParameter take. |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngCount` | `int` | get | Unlike the basic Basket, the advanced basket stores one entry per prong/rail, each with its own settings. The scalar getters report the first prong's values (0 when there are none). |\n| `ProngDiameter` | `double` | get | |\n| `ProngHeight` | `double` | get | |\n| `ProngMode` | `string` | get | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\" \\| \"OFFSET\" \\| \"DOUBLE\" \\| \"TRIPLE\" when every prong shares it, \"MIXED\" when the prongs differ (the panel's per-prong editor), \"\" with no prongs. |\n| `RailCount` | `int` | get | |","metadata":{"title":"AdvancedBasketApi","section":"IAdvancedBasket","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","collection":"scripting","hash":"660387e4e164e95e57cfdd4cc0c27880","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — IAdvancedBasket\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | One value by path: \"Prongs[0].Inclination\", \"rails[1].fillet_radius\" (case and underscores ignored); null for an unknown path. |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetClawCapDistance(double distance)` | signed; every prong |\n| `void SetClawCapHeight(double height)` | signed; every prong |\n| `void SetClawTipSmoothness(double smoothness)` | 0-1; every prong |\n| `void SetClawTipWidth(double width)` | 0-1; every prong |\n| `void SetElement(string element)` | Applies a saved AdvancedBasket element (ElementsApi.List(\"AdvancedBasket\")) to this basket: its prongs and rails replace the current ones, re-seeded onto the mother gem (which stays) so the layout keeps its direction on this cut, and the basket regenerates in place (same id). |\n| `void SetParameter(string path, string value)` | Sets one value by path, as text (\"0.4\", \"true\"); \"[*]\" sets it on every prong or rail (\"prongs[*].gem_inside\"). Enum fields take their number. edit_object sends the keys it has no setter for here. |\n| `void SetProngCount(int prongs)` | Parametric edits -- each regenerates the basket (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. Millimetres. The Set*Count methods rebuild the prong/rail set evenly spaced, cloning the first existing entry's settings (tool defaults when empty); the other setters apply to every prong. |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMode(string mode)` | ROUND \\| CUSTOM \\| CLAW \\| OFFSET \\| DOUBLE \\| TRIPLE, on every prong (DEFAULT and CIRCLE also mean ROUND) |","metadata":{"title":"AdvancedBasketApi","section":"IAdvancedBasket","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","collection":"scripting","hash":"8bdddadad3e4e40aa66e1707e6f0020a","indexed_by":"docs-index"}},{"content":"AdvancedBasketApi — IAdvancedBasket\n\n| Method | |\n|---|---|\n| `void SetRailCount(int rails)` | |","metadata":{"title":"AdvancedBasketApi","section":"IAdvancedBasket","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-basket/#iadvancedbasket","collection":"scripting","hash":"217e274c01c46769c84f214538f8e8cb","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi\n\nBezels with a custom profile.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBezelApi\n```\n\nSee also the guide, Gemsets › Advanced bezel, and the Python package, `ra.advanced_bezel`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IAdvancedBezel` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedBezel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds an advanced bezel around an existing gem (`gemId` must be a gem in the active document -- the bezel is a parametric child of that gem). |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IAdvancedBezel` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Advanced bezels currently selected in the active doc. |","metadata":{"title":"AdvancedBezelApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/","collection":"scripting","hash":"7dd02b1ffcdbabba04f535be4802e3c4","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — All\n\n```csharp\nIReadOnlyList<IAdvancedBezel> AdvancedBezelApi.All()\n```\n\n`IAdvancedBezel` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedBezel> AdvancedBezelApi.ByLayer(string layerName)\n```\n\n`IAdvancedBezel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBezelApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#all","collection":"scripting","hash":"9a8b8b698137d8874adee10f29403df6","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — Count\n\n```csharp\nint AdvancedBezelApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"AdvancedBezelApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#count","collection":"scripting","hash":"5069f4fe25cda1eff4a35ebf93c9d166","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — Create\n\n```csharp\nIAdvancedBezel AdvancedBezelApi.Create(\n    Guid gemId,\n    double height = 0,\n    double width = 0,\n    double girdleHeight = 0,\n    double girdleWidth = 0,\n    double gemInside = 0,\n    string profile = null,\n    string element = null)\n```\n\nBuilds an advanced bezel around an existing gem (`gemId` must be a gem in the active document -- the bezel is a parametric child of that gem). Same compute pipeline as the ArtisanAdvancedBezel tool, so the result is identical to accepting one from the panel. The wall cross-section comes from the model's point profile (the saved defaults' profile when the user stored one, the 6-point default otherwise); cutters and airgaps stay as the defaults configure them. All dimensional arguments are millimetres. Pass 0 (or omit) to keep the tool's default -- or the user's saved defaults -- for that parameter (height 3.8, width 1.5, girdle height 0.3, girdle width 1.5, gem inside 0). `profile` picks a BEZEL_PROFILE asset from the library by name (see AssetsApi.List(\"BEZEL_PROFILE\")); omitted = the default profile (an explicit profile also skips the saved defaults so it cannot be overwritten by them). `element` = name of a saved AdvancedBezel element (ElementsApi.List(\"AdvancedBezel\")) to start from instead of the defaults; explicit arguments (profile included) override it. Throws ArgumentException if `gemId` is not a gem and InvalidOperationException when the geometry fails to compute.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `height` | `double` | `0` |\n| `width` | `double` | `0` |\n| `girdleHeight` | `double` | `0` |\n| `girdleWidth` | `double` | `0` |\n| `gemInside` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IAdvancedBezel`.","metadata":{"title":"AdvancedBezelApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#create","collection":"scripting","hash":"2e2399397c1dbebc41bc3797b089bc81","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — Find\n\n```csharp\nIAdvancedBezel AdvancedBezelApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedBezel`.\n\nForGem\n```csharp\nIReadOnlyList<IAdvancedBezel> AdvancedBezelApi.ForGem(Guid gemId)\n```\n\n`IAdvancedBezel` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedBezelApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#find","collection":"scripting","hash":"cd1c1e68d317e59132398493eb22cd8d","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — Selected\n\n```csharp\nIReadOnlyList<IAdvancedBezel> AdvancedBezelApi.Selected()\n```\n\nAdvanced bezels currently selected in the active doc. Empty list if nothing is selected or the selection contains no advanced bezels.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"AdvancedBezelApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#selected","collection":"scripting","hash":"54d5a6091910aff19a92ce2a2de4b89c","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — IAdvancedBezel\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\nAn advanced bezel wraps exactly one mother gem, like IBezel, but its wall is a freely editable point profile instead of a swept asset. The setters below recompute it against the current mother gem and replace it in place (same Guid); SetElement applies a saved preset.\n\n| Property | Type | | |\n|---|---|---|---|\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `GirdleHeight` | `double` | get | millimetres |\n| `GirdleWidth` | `double` | get | millimetres |\n| `Height` | `double` | get | wall height, millimetres |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Width` | `double` | get | wall width, millimetres |","metadata":{"title":"AdvancedBezelApi","section":"IAdvancedBezel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#iadvancedbezel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#iadvancedbezel","collection":"scripting","hash":"2605e4f73e11f90a52d1e18a12fe3e2a","indexed_by":"docs-index"}},{"content":"AdvancedBezelApi — IAdvancedBezel\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved AdvancedBezel element (ElementsApi.List(\"AdvancedBezel\")) to this bezel: its parameters replace the current ones, the mother gem stays, and the bezel is recomputed in place (same Guid). |\n| `void SetGemInside(double gemInside)` | how deep the gem sits inside, millimetres |\n| `void SetGirdleHeight(double girdleHeight)` | |\n| `void SetGirdleWidth(double girdleWidth)` | |\n| `void SetHeight(double height)` | Parametric edits -- each recomputes against the CURRENT mother gem and replaces the bezel in place (same Guid), calling LicenseGate.RequireValid() first. Millimetres; GemInside is signed. |\n| `void SetWidth(double width)` | |","metadata":{"title":"AdvancedBezelApi","section":"IAdvancedBezel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#iadvancedbezel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-bezel/#iadvancedbezel","collection":"scripting","hash":"8bb2f7ee801a89f0dbb07a0b8adefd28","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi\n\nAdvanced cathedral shanks — the station-based cathedral body. Query-only for now: run ArtisanAdvancedCathedralShank in the UI once, then script every variant from the handle it leaves behind.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedCathedralApi\n```\n\nSee also the guide, Shanks › Advanced cathedral, and the Python package, `ra.advanced_cathedral`.","metadata":{"title":"AdvancedCathedralApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/","collection":"scripting","hash":"2759a0c251aa54f9dd59d20108db7f45","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IAdvancedCathedral` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedCathedral` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds an advanced cathedral shank -- the ArtisanAdvancedCathedral tool, headless: the cathedral band with a fully parametric arm and bridge, plus an optional stone run. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IAdvancedCathedral` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"AdvancedCathedralApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#methods","collection":"scripting","hash":"27045ed26ad8833c4190a0546d1c8d40","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — All\n\n```csharp\nIReadOnlyList<IAdvancedCathedral> AdvancedCathedralApi.All()\n```\n\n`IAdvancedCathedral` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedCathedral> AdvancedCathedralApi.ByLayer(string layerName)\n```\n\n`IAdvancedCathedral` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedCathedralApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#all","collection":"scripting","hash":"1e04ee12f252619d86faf0be246d9c5e","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — Count\n\n```csharp\nint AdvancedCathedralApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIAdvancedCathedral AdvancedCathedralApi.Create(\n    double fingerDiameter = 0,\n    double armHeight = 0,\n    double armOpening = 0,\n    double tipInclination = double.NaN,\n    double bridgeWidth = 0,\n    double bridgeThickness = 0,\n    bool withGems = false,\n    double gemSize = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds an advanced cathedral shank -- the ArtisanAdvancedCathedral tool, headless: the cathedral band with a fully parametric arm and bridge, plus an optional stone run. Millimetres / degrees; 0 keeps the tool default (or the user's saved defaults). `fingerDiameter` 0 = the document's finger size. `withGems` turns the stone run on. `element` = name of a saved AdvancedCathedralShank element (ElementsApi.List(\"AdvancedCathedralShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an IAdvancedCathedral handle: its ~25 setters cover the rest of the model.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `armHeight` | `double` | `0` |\n| `armOpening` | `double` | `0` |\n| `tipInclination` | `double` | `double.NaN` |\n| `bridgeWidth` | `double` | `0` |\n| `bridgeThickness` | `double` | `0` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IAdvancedCathedral`.","metadata":{"title":"AdvancedCathedralApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#count","collection":"scripting","hash":"b92eaea2457c11f98d097585200d648c","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — Find\n\n```csharp\nIAdvancedCathedral AdvancedCathedralApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedCathedral`.\n\nSelected\n```csharp\nIReadOnlyList<IAdvancedCathedral> AdvancedCathedralApi.Selected()\n```\n\n`IAdvancedCathedral` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedCathedralApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#find","collection":"scripting","hash":"cd0da4f029c5080a332180d18a63a0fc","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIAdvancedCathedral\n*Handle* — extends `IParametricObject`.\n\nAdvanced cathedral shank: like the classic cathedral, but the band's cross-section is defined by editable stations along the arm instead of a single fixed profile. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `GemGradient` | `IAdvancedCathedralGemGradient` | get | |\n| `Gems` | `ICathedralGems` | get | The gems row uses the same model as the classic cathedral. |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `Shank` | `IAdvancedCathedralShank` | get | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved AdvancedCathedralShank element (ElementsApi.List(\"AdvancedCathedralShank\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |","metadata":{"title":"AdvancedCathedralApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#handles-and-sections","collection":"scripting","hash":"c5e8053a8db0bfc96558eec92f51d4d0","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — IAdvancedCathedralShank\n\n*Section*.\n\nThe band: the stations that shape it, the arm and the bridge.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ArmHeight` | `double` | get | mm |\n| `ArmOpening` | `double` | get | mm |\n| `BridgeAngle` | `double` | get | degrees |\n| `BridgeDiameter` | `double` | get | mm |\n| `BridgeEnabled` | `bool` | get | |\n| `BridgeFillet` | `double` | get | mm |\n| `BridgeOpenAngle` | `double` | get | degrees |\n| `BridgeThickness` | `double` | get | mm |\n| `BridgeWidth` | `double` | get | mm |\n| `SharedProfile` | `bool` | get | every station uses the same profile asset |\n| `Stations` | `IReadOnlyList ` | get | |\n| `TangentPoint` | `double` | get | 1 = 90 degrees, 0 = 140, -1 = 190 |\n| `TipInclination` | `double` | get | |\n| `TipRound` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetArmHeight(double height)` | |\n| `void SetArmOpening(double opening)` | |\n| `void SetBridgeAngle(double degrees)` | |\n| `void SetBridgeDiameter(double diameter)` | |\n| `void SetBridgeEnabled(bool enabled)` | |\n| `void SetBridgeFillet(double fillet)` | |\n| `void SetBridgeOpenAngle(double degrees)` | |\n| `void SetBridgeThickness(double thickness)` | |\n| `void SetBridgeWidth(double width)` | |\n| `void SetProfile(string assetName)` | applies to every station — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetSharedProfile(bool shared)` | |\n| `void SetStation( int index, double position, double width, double height, string profileName = null)` | |\n| `void SetStations(IEnumerable stations)` | Replaces the whole station list (at least 2, positions 0..1). Every station needs a profile: profileName omitted reuses the first station's current asset. |\n| `void SetTangentPoint(double tangentPoint)` | |\n| `void SetTipInclination(double inclination)` | |\n| `void SetTipRound(double round)` | |","metadata":{"title":"AdvancedCathedralApi","section":"IAdvancedCathedralShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralshank","collection":"scripting","hash":"86a7f6ed846c1a1f06fdc6bc989cb318","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — IAdvancedCathedralStation\n\n*Section*.\n\nOne cross-section along the arm. Stations let the band change width, height and profile as it runs from the arm tip to the ring bottom.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Height` | `double` | get | mm |\n| `Position` | `double` | get | 0 = arm tip, 1 = ring bottom |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Width` | `double` | get | mm |","metadata":{"title":"AdvancedCathedralApi","section":"IAdvancedCathedralStation","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralstation","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralstation","collection":"scripting","hash":"2c27bc05bd5ad8e12374f587d85e38b2","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — ICathedralGems\n\n*Section*.\n\nThe pavé row a cathedral carries along its top — one run per arm.","metadata":{"title":"AdvancedCathedralApi","section":"ICathedralGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","collection":"scripting","hash":"36b9879623397f222dbddc9bce7fb086","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — ICathedralGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | degrees of the band covered by gems (180 = top half) |\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BrightCut` | `double` | get | bright-cut width, mm |\n| `DoubleProngSetting` | `bool` | get | |\n| `DrillAllowIntersection` | `bool` | get | |\n| `DrillEnabled` | `bool` | get | |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillVisible` | `bool` | get | bake the drill cutters as visible objects |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `ExtensionForManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | how deep the gems sit inside, mm |\n| `GemShape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `GemSize` | `double` | get | mm |\n| `InnerHeight` | `double` | get | inner channel height, mm |\n| `InnerMargin` | `double` | get | inner margin, mm |\n| `InnerWidth` | `double` | get | inner channel width, mm |\n| `Margin` | `double` | get | side margin, mm |\n| `MinDistance` | `double` | get | minimum distance between gems, mm |\n| `ProngDiameter` | `double` | get | mm — used when AutomaticProngDiameter is false |\n| `ProngHeight` | `double` | get | mm |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `ScallopGemHeight` | `double` | get | |\n| `ScallopGemWidth` | `double` | get | Scalloped-setting proportions (percentages, not mm). |\n| `ScallopProngHeight` | `double` | get | |\n| `ScallopProngWidth` | `double` | get | |\n| `ScallopRailHeight` | `double` | get | |\n| `ScallopRailWidth` | `double` | get | |\n| `ScallopRemoveChannel` | `bool` | get | |\n| `Vertical` | `double` | get | vertical displacement of the row, mm |","metadata":{"title":"AdvancedCathedralApi","section":"ICathedralGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","collection":"scripting","hash":"fba2cb302870fabaf340ad2c4c198c8f","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — ICathedralGems\n\n| Method | |\n|---|---|\n| `void SetAngle(double degrees)` | |\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetDoubleProngSetting(bool enabled)` | |\n| `void SetDrillAllowIntersection(bool allow)` | |\n| `void SetDrillEnabled(bool enabled)` | |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillVisible(bool visible)` | |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemShape(string shape)` | |\n| `void SetGemSize(double size)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerMargin(double margin)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMargin(double margin)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetScallopGem(double width, double height)` | |\n| `void SetScallopProng(double width, double height)` | |\n| `void SetScallopRail(double width, double height)` | |\n| `void SetScallopRemoveChannel(bool enabled)` | |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"AdvancedCathedralApi","section":"ICathedralGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#icathedralgems","collection":"scripting","hash":"1b22ef1eb823bc78ab2065ab13e987d9","indexed_by":"docs-index"}},{"content":"AdvancedCathedralApi — IAdvancedCathedralGemGradient\n\n*Section*.\n\nHow stone size and prongs vary along the gem run.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Enabled` | `bool` | get | |\n| `EndProngCount` | `int` | get | |\n| `GemSizeEnd` | `double` | get | mm |\n| `GemSizeMiddle` | `double` | get | mm |\n| `GemSizeStart` | `double` | get | mm |\n| `MiddlePosition` | `double` | get | 0..1 |\n| `Points` | `int` | get | 2 = start/end, 3 = start/middle/end |\n| `ProngDistance` | `double` | get | mm |\n| `ProngGrow` | `double` | get | mm |\n| `ProngMinDiameter` | `double` | get | mm |\n| `ProngSpacing` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetEnabled(bool enabled)` | |\n| `void SetEndProngCount(int count)` | |\n| `void SetGemSizes(double start, double middle, double end)` | |\n| `void SetMiddlePosition(double position)` | |\n| `void SetPoints(int points)` | 2 or 3 |\n| `void SetProngDistance(double distance)` | |\n| `void SetProngGrow(double grow)` | |\n| `void SetProngMinDiameter(double diameter)` | |\n| `void SetProngSpacing(double spacing)` | |","metadata":{"title":"AdvancedCathedralApi","section":"IAdvancedCathedralGemGradient","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralgemgradient","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-cathedral/#iadvancedcathedralgemgradient","collection":"scripting","hash":"dba81cf7dd78bea7f0c3b1042c1b3717","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi\n\nRuns of stones along a curve with per-stone sizes, shapes and rotations.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedGemsOnCurveApi\n```\n\nSee also the Python package, `ra.advanced_gems_on_curve`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IAdvancedGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Lays a PATTERN of gem groups along a curve -- the ArtisanAdvancedGemsOnCurve tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IAdvancedGemsOnCurve` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"AdvancedGemsOnCurveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/","collection":"scripting","hash":"2f79533180ec6575d52b1a1c0beeaafe","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — All\n\n```csharp\nIReadOnlyList<IAdvancedGemsOnCurve> AdvancedGemsOnCurveApi.All()\n```\n\n`IAdvancedGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedGemsOnCurve> AdvancedGemsOnCurveApi.ByLayer(string layerName)\n```\n\n`IAdvancedGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedGemsOnCurveApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#all","collection":"scripting","hash":"644f5ba8af1b5adc13a1fa808f362eed","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — Count\n\n```csharp\nint AdvancedGemsOnCurveApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"AdvancedGemsOnCurveApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#count","collection":"scripting","hash":"df0d889b09d9200556e14974d72f7d3a","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — Create\n\n```csharp\nAdvancedGemsOnCurveResult AdvancedGemsOnCurveApi.Create(\n    Guid curveId,\n    IEnumerable<double> sizes,\n    IEnumerable<int> quantities = null,\n    IEnumerable<double> sizes2 = null,\n    IEnumerable<string> shapes = null,\n    IEnumerable<double> rotations = null,\n    double distance = 0,\n    double moveByZ = double.NaN,\n    double rotationOnCurve = double.NaN,\n    string alignmentOnCurve = null,\n    string alignmentVertical = null,\n    bool? startCentered = null,\n    bool? upsideDown = null,\n    bool flipCurve = false,\n    IEnumerable<Guid> orientationIds = null,\n    double t0 = double.NaN,\n    double t1 = double.NaN)\n```\n\nLays a PATTERN of gem groups along a curve -- the ArtisanAdvancedGemsOnCurve tool, headless. Unlike GemsOnCurveApi (one size, one shape) each group i has `quantities[i]` gems graduating from `sizes[i]` to `sizes2[i]` mm (same size when omitted), of `shapes[i]` (default ROUND) rotated `rotations[i]` degrees; the groups run one after another from the curve start. Diamonds only (the tool has no material choice). Millimetres; 0 keeps the tool default (or the user's saved defaults): distance 0.2 between gems. `alignmentOnCurve` START (default) / CENTER / END, `alignmentVertical` ON_GIRDLE (default) / TOP. `t0`/`t1` limit the run to a curve parameter range. Returns the group id plus the gem ids.","metadata":{"title":"AdvancedGemsOnCurveApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#create","collection":"scripting","hash":"313be7bfead5b3617122c66581ae1e4f","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `sizes` | `IEnumerable ` | required |\n| `quantities` | `IEnumerable ` | `null` |\n| `sizes2` | `IEnumerable ` | `null` |\n| `shapes` | `IEnumerable ` | `null` |\n| `rotations` | `IEnumerable ` | `null` |\n| `distance` | `double` | `0` |\n| `moveByZ` | `double` | `double.NaN` |\n| `rotationOnCurve` | `double` | `double.NaN` |\n| `alignmentOnCurve` | `string` | `null` |\n| `alignmentVertical` | `string` | `null` |\n| `startCentered` | `bool?` | `null` |\n| `upsideDown` | `bool?` | `null` |\n| `flipCurve` | `bool` | `false` |\n| `orientationIds` | `IEnumerable ` | `null` |\n| `t0` | `double` | `double.NaN` |\n| `t1` | `double` | `double.NaN` |\n\nReturns `AdvancedGemsOnCurveResult`.","metadata":{"title":"AdvancedGemsOnCurveApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#create","collection":"scripting","hash":"5dfc7fae33e403175f5aaa94b0975245","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — Find\n\n```csharp\nIAdvancedGemsOnCurve AdvancedGemsOnCurveApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedGemsOnCurve`.\n\nSelected\n```csharp\nIReadOnlyList<IAdvancedGemsOnCurve> AdvancedGemsOnCurveApi.Selected()\n```\n\n`IAdvancedGemsOnCurve` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedGemsOnCurveApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#find","collection":"scripting","hash":"8cfdbc81f2ab29eedac78621aa9fc452","indexed_by":"docs-index"}},{"content":"AdvancedGemsOnCurveApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIAdvancedGemsOnCurve\n*Handle* — extends `IParametricGroup`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CurveId` | `Guid` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MemberCount` | `int` | get | Rhino objects in the group *(from IParametricGroup)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | the kernel model, as stored in the group *(from IParametricGroup)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | dotted JSON path; null when absent *(from IParametricGroup)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"AdvancedGemsOnCurveApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-gems-on-curve/#handles-and-sections","collection":"scripting","hash":"f9ef002dbe42c0ee78f1169e08385e6e","indexed_by":"docs-index"}},{"content":"AdvancedRingApi\n\nRings built from positioned sections along the finger curve.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedRingApi\n```\n\nSee also the Python package, `ra.advanced_ring`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IAdvancedRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds an advanced ring body (the ArtisanAdvancedRing tool, headless): a ring curve swept through profile sections placed along it. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Advanced rings currently selected in the active doc. |","metadata":{"title":"AdvancedRingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/","collection":"scripting","hash":"6f4201cd55f05697bd158d166ae5c30a","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — All\n\n```csharp\nIReadOnlyList<IAdvancedRing> AdvancedRingApi.All()\n```\n\n`IAdvancedRing` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedRing> AdvancedRingApi.ByLayer(string layerName)\n```\n\n`IAdvancedRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedRingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#all","collection":"scripting","hash":"f73abe567df90555568cc445fd4a8bdf","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — Count\n\n```csharp\nint AdvancedRingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"AdvancedRingApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#count","collection":"scripting","hash":"fda0919c60b6f52f1a18daae04fa6f39","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — Create\n\n```csharp\nIAdvancedRing AdvancedRingApi.Create(\n    IEnumerable<double> positions = null,\n    IEnumerable<double> widths = null,\n    IEnumerable<double> heights = null,\n    double width = 0,\n    double height = 0,\n    string sectionType = null,\n    double thickness = 0,\n    double comfort = 0,\n    string curveType = null,\n    double openingLength = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds an advanced ring body (the ArtisanAdvancedRing tool, headless): a ring curve swept through profile sections placed along it. Each section sits at a normalized position t in 0..1 along the curve (0 = bottom of the finger, 0.5 = top) and has its own width/height. `positions` omitted = the user's saved default sections, or two identical sections at t 0 and 0.5 (open curves: 0 and 1). `widths` / `heights` are per-section lists parallel to `positions`; `width` / `height` apply one value to every section (0 = section default 2.25 x 1.5 mm). `sectionType` COMFORT (default) | SOLID | THICKNESS with `thickness` (0.7) and `comfort` (0.3). `curveType` CLOSE (default) | OPEN | BYPASS | SHAPE, `openingLength` mm for the open types (5 / 14 / 14). `fingerDiameter` 0 = document ring size. `profile` = RING_PROFILE asset name. `plane` omitted = world XY. `element` = name of a saved AdvancedRing element (ElementsApi.List(\"AdvancedRing\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an IAdvancedRing handle to the new ring body.","metadata":{"title":"AdvancedRingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#create","collection":"scripting","hash":"a66d32072a81654e9a40e75eb902ff1f","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `positions` | `IEnumerable ` | `null` |\n| `widths` | `IEnumerable ` | `null` |\n| `heights` | `IEnumerable ` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `sectionType` | `string` | `null` |\n| `thickness` | `double` | `0` |\n| `comfort` | `double` | `0` |\n| `curveType` | `string` | `null` |\n| `openingLength` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IAdvancedRing`.","metadata":{"title":"AdvancedRingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#create","collection":"scripting","hash":"d61c4ee3bc47547d2b629e8b1483143a","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — Find\n\n```csharp\nIAdvancedRing AdvancedRingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedRing`.\n\nSelected\n```csharp\nIReadOnlyList<IAdvancedRing> AdvancedRingApi.Selected()\n```\n\nAdvanced rings currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedRingApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#find","collection":"scripting","hash":"bafb21378e0d199282c80614a7ce744e","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"AdvancedRingApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#handles-and-sections","collection":"scripting","hash":"fddfd44781b47c1b6b8ee0e88e17c001","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — IAdvancedRing\n\n*Handle* — extends `IParametricObject`.\n\nAdvanced ring body (the ArtisanAdvancedRing tool): a ring curve (closed / open / bypass / shape) swept through N profile sections, each placed at a normalized position `t` along the curve (0 = bottom of the finger, 0.5 = top). No single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CurveType` | `string` | get | \"CLOSE\", \"OPEN\", \"BYPASS\" or \"SHAPE\". |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `SectionCount` | `int` | get | |\n| `SectionHeights` | `IReadOnlyList ` | get | mm, same order |\n| `SectionPositions` | `IReadOnlyList ` | get | t of each section, sorted |\n| `SectionWidths` | `IReadOnlyList ` | get | mm, same order |","metadata":{"title":"AdvancedRingApi","section":"IAdvancedRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#iadvancedring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#iadvancedring","collection":"scripting","hash":"124002e7a72f014581ae5f34a073a003","indexed_by":"docs-index"}},{"content":"AdvancedRingApi — IAdvancedRing\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAllSections(double width, double height)` | |\n| `void SetCurveType(string curveType)` | CLOSE \\| OPEN \\| BYPASS \\| SHAPE |\n| `void SetElement(string element)` | Applies a saved AdvancedRing element (ElementsApi.List(\"AdvancedRing\")) to this ring: its sections, curve and options replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n| `void SetFingerDiameter(double fingerDiameter)` | |\n| `void SetHeight(double height)` | every section |\n| `void SetOpeningLength(double openingLength)` | of the current open curve type |\n| `void SetSection(int index, double width = 0, double height = 0)` | Mutations regenerate the ring in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres; 0 keeps the value. |\n| `void SetSectionPosition(int index, double t)` | |\n| `void SetSectionRotation(int index, double degrees)` | |\n| `void SetWidth(double width)` | every section |","metadata":{"title":"AdvancedRingApi","section":"IAdvancedRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#iadvancedring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-ring/#iadvancedring","collection":"scripting","hash":"82f4e53ee7648271045ca356646e2cdd","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi\n\nAdvanced signet rings — the same face plus a lateral profile and an optional wedge cut at the bottom of the band.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedSignetRingApi\n```\n\nSee also the Python package, `ra.advanced_signet_ring`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IAdvancedSignetRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IAdvancedSignetRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IAdvancedSignetRing` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"AdvancedSignetRingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/","collection":"scripting","hash":"c150da83869bc32141cc57b8903976c6","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi — All\n\n```csharp\nIReadOnlyList<IAdvancedSignetRing> AdvancedSignetRingApi.All()\n```\n\n`IAdvancedSignetRing` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IAdvancedSignetRing> AdvancedSignetRingApi.ByLayer(string layerName)\n```\n\n`IAdvancedSignetRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AdvancedSignetRingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#all","collection":"scripting","hash":"88f1ba3ea02d712e5e79771c95032505","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi — Count\n\n```csharp\nint AdvancedSignetRingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nIAdvancedSignetRing AdvancedSignetRingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IAdvancedSignetRing`.","metadata":{"title":"AdvancedSignetRingApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#count","collection":"scripting","hash":"db682e2391d3e659f31e637ec9ce3327","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi — Selected\n\n```csharp\nIReadOnlyList<IAdvancedSignetRing> AdvancedSignetRingApi.Selected()\n```\n\n`IAdvancedSignetRing` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"AdvancedSignetRingApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#selected","collection":"scripting","hash":"7a164e40002eb37d63d5862d8e096663","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi — IAdvancedSignetRing\n\n*Handle* — extends `IParametricObject`.\n\nAdvanced signet ring: the same face, plus a lateral profile that shapes the sides and an optional wedge cut at the bottom of the band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomCutAngle` | `double` | get | total opening of the bottom wedge cut, degrees; 0 = no cut |\n| `Face` | `ISignetFace` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LateralProfileName` | `string` | get | asset shaping the sides, \"\" when unset |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBottomCutAngle(double degrees)` | 0 disables the cut |\n| `void SetElement(string element)` | Applies a saved AdvancedSignetRing element (ElementsApi.List(\"AdvancedSignetRing\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n| `void SetLateralProfile(string assetName)` | |","metadata":{"title":"AdvancedSignetRingApi","section":"IAdvancedSignetRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#iadvancedsignetring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#iadvancedsignetring","collection":"scripting","hash":"47f74925216a9430071fb23f40f0de85","indexed_by":"docs-index"}},{"content":"AdvancedSignetRingApi — ISignetFace\n\n*Section*.\n\nThe signet face and the band under it — shared by the classic signet and the advanced one. A live view over the ring's stored parameters: getters read the current values, setters regenerate the ring in place (same Guid) and are license-gated.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Height` | `double` | get | face height, mm |\n| `HeightBottomProfile` | `double` | get | mm |\n| `HeightMiddleProfile` | `double` | get | mm |\n| `HeightPosition` | `double` | get | how high the face sits over the finger, mm |\n| `InnerHeight` | `double` | get | mm — used when Recess is on |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Recess` | `bool` | get | hollow the back of the face |\n| `Rotation` | `double` | get | degrees |\n| `ShapeMode` | `string` | get | \"Circle\" or \"Custom\" |\n| `Tangent` | `double` | get | |\n| `Thickness` | `double` | get | mm — used when Recess is on |\n| `Width` | `double` | get | face width, mm |\n| `WidthBottomProfile` | `double` | get | band section at the bottom, mm |\n| `WidthMiddleProfile` | `double` | get | band section at the middle, mm |\n\n| Method | |\n|---|---|\n| `void SetBottomProfile(double width, double height)` | |\n| `void SetHeight(double height)` | |\n| `void SetHeightPosition(double position)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetMiddleProfile(double width, double height)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetRecess(bool recess)` | |\n| `void SetRotation(double degrees)` | |\n| `void SetShapeMode(string shapeMode)` | \"Circle\" or \"Custom\" |\n| `void SetTangent(double tangent)` | |\n| `void SetThickness(double thickness)` | |\n| `void SetWidth(double width)` | |","metadata":{"title":"AdvancedSignetRingApi","section":"ISignetFace","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#isignetface","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/advanced-signet-ring/#isignetface","collection":"scripting","hash":"2fa116cfdb5f8e6f168f3db4dea518c3","indexed_by":"docs-index"}},{"content":"AiImageApi\n\nAI images with fal.ai, the engine of Generative AI Studio and of the Assistant's generate_image: a photoreal render of the viewport, an edit of an image file, or an image from a prompt alone. Runs on the user's fal.ai key (Options > Integrations) and every call is billed by fal.ai.\n\n```python\nfrom ArtisanPlugin.Scripting import AiImageApi\n```\n\nSee also the Python package, `ra.ai_image`.","metadata":{"title":"AiImageApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ai-image/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ai-image/","collection":"scripting","hash":"28af09d1d6072ad69f97cd6161950e73","indexed_by":"docs-index"}},{"content":"AiImageApi — Methods\n\n| Method | |\n|---|---|\n| `Generate` | Generates one image with fal.ai and saves it. |\n\nGenerate\n```csharp\nAiImageResult AiImageApi.Generate(\n    string prompt,\n    string source = null,\n    string preset = null,\n    string path = null)\n```\n\nGenerates one image with fal.ai and saves it. `source`: \"viewport\" (default; captures the active viewport), \"none\" (the prompt alone) or the path of an image file to edit. `preset`: \"photoreal_render\" (a photographic jewelry render of the source, or of the description with no source), \"try_on\" (the piece worn) or omitted (the prompt says what to do). `path`: where to save it (default: a new file under the user folder's Falai\\Generated). Takes from a few seconds to a minute; each call is billed to the user's fal.ai account.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `prompt` | `string` | required |\n| `source` | `string` | `null` |\n| `preset` | `string` | `null` |\n| `path` | `string` | `null` |\n\nReturns `AiImageResult`.","metadata":{"title":"AiImageApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ai-image/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ai-image/#methods","collection":"scripting","hash":"f8386c544faa3539d82b72a8ca2b1f0c","indexed_by":"docs-index"}},{"content":"AnalyzeApi\n\nAnalysis helpers. Same math as the Analyze commands, headless.\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi\n```\n\nSee also the guide, Analysis › Global thickness, and the Python package, `ra.analyze`.\n\nMethods\n| Method | |\n|---|---|\n| `GlobalThickness` | Whole-piece wall-thickness map (the ArtisanGlobalThickness command, headless): meshes the given objects at high resolution and measures the wall thickness at EVERY vertex of that analysis mesh, returning the numbers the display-only command can only show as colors. |\n| `ThicknessAt` | Wall thickness at a point (the ArtisanThickness probe, scriptable): meshes the given objects at high resolution and measures the material thickness at `point` (which should lie on/near the surface). |\n| `ThicknessAtPoints` | Same probe for a list of points, meshing the objects only once. |","metadata":{"title":"AnalyzeApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/","collection":"scripting","hash":"da5ba26e43e60e28794542479c67dfb1","indexed_by":"docs-index"}},{"content":"AnalyzeApi — GlobalThickness\n\n```csharp\nGlobalThicknessResult AnalyzeApi.GlobalThickness(\n    IEnumerable<Guid> objectIds,\n    double thinThresholdMm = 0,\n    bool colorize = false)\n```\n\nWhole-piece wall-thickness map (the ArtisanGlobalThickness command, headless): meshes the given objects at high resolution and measures the wall thickness at EVERY vertex of that analysis mesh, returning the numbers the display-only command can only show as colors. objectIds objects to analyze; meshed together on every call. thinThresholdMm walls thinner than this count as thin spots; 0 = the command's default (0.6 mm). colorize true = also add the command's vertex-colored mesh to the document (red = thin, green = ok, black = not measurable), the same mesh its KeepMesh=Yes exit leaves behind. That is a document mutation -- wrap in a Transaction and expect a license check. false = pure read-only measurement. ThinSpots lists the measurable vertices below the threshold, thinnest first, capped at the worst 100. All values in millimetres. Long operation on dense geometry: one ray cast per mesh vertex.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `thinThresholdMm` | `double` | `0` |\n| `colorize` | `bool` | `false` |\n\nReturns `GlobalThicknessResult`.","metadata":{"title":"AnalyzeApi","section":"GlobalThickness","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#globalthickness","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#globalthickness","collection":"scripting","hash":"b4dd45f4061f2190f9999c50895007f3","indexed_by":"docs-index"}},{"content":"AnalyzeApi — ThicknessAt\n\n```csharp\ndouble AnalyzeApi.ThicknessAt(\n    IEnumerable<Guid> objectIds,\n    Point3d point,\n    bool annotate = false)\n```\n\nWall thickness at a point (the ArtisanThickness probe, scriptable): meshes the given objects at high resolution and measures the material thickness at `point` (which should lie on/near the surface). Returns the thickness in model units, or 0 when no measurement is possible at that point. With annotate=true it also draws the same measure the command leaves behind (line + label dot + end points, grouped), which is a document mutation -- wrap in a Transaction and expect a license check. Plain measuring is read-only and free. Note: the objects are meshed on EVERY call. To probe many points on the same geometry, prefer ThicknessAtPoints -- it meshes once.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `point` | `Point3d` | required |\n| `annotate` | `bool` | `false` |\n\nReturns `double`.","metadata":{"title":"AnalyzeApi","section":"ThicknessAt","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#thicknessat","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#thicknessat","collection":"scripting","hash":"d897b63112a3d462249ee869676d5e34","indexed_by":"docs-index"}},{"content":"AnalyzeApi — ThicknessAtPoints\n\n```csharp\nIReadOnlyList<double> AnalyzeApi.ThicknessAtPoints(\n    IEnumerable<Guid> objectIds,\n    IEnumerable<Point3d> points,\n    bool annotate = false)\n```\n\nSame probe for a list of points, meshing the objects only once. Result list is parallel to `points` (0 = not measurable there).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `points` | `IEnumerable ` | required |\n| `annotate` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AnalyzeApi","section":"ThicknessAtPoints","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#thicknessatpoints","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/analyze/#thicknessatpoints","collection":"scripting","hash":"1187fe23c0ac86c8010251707f0b62bc","indexed_by":"docs-index"}},{"content":"AssetsApi\n\nThe user's asset library (the profile curves the parametric tools build from). Assets are never CREATED from scripts -- an asset is a half profile with per-type rules a free curve doesn't follow; the user draws them in the Assets editor. Scripts can list them, draw one as a curve (ExportAsCurve) and organize the library: rename, duplicate, set the default, delete user assets (standard ones are protected).\n\n```python\nfrom ArtisanPlugin.Scripting import AssetsApi\n```\n\nSee also the guide, API Reference › Assets, and the Python package, `ra.assets`.","metadata":{"title":"AssetsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/","collection":"scripting","hash":"1a1362ac2c54318bdc20d166d8ab26a8","indexed_by":"docs-index"}},{"content":"AssetsApi — Methods\n\n| Method | |\n|---|---|\n| `Delete` | Permanently deletes a user asset from the library. |\n| `Duplicate` | Copies an asset (standard ones included) as a new user asset named `newName` (empty = \" (Copy)\"), preview included. |\n| `ExportAsCurve` | Adds the asset's profile to the document as a curve so it can be seen before choosing it: the shape the tools build from (mirrored and closed, or open for RING_SIDE_CURVE), sized width x height mm (0 = 5 x 3, like the Assets panel's insert; side curves keep their aspect and only follow height) and centered on `plane`'s origin (default: the active construction plane). |\n| `GetDefault` | The default asset for a type -- the one every Create uses when no profile name is given. |\n| `List` | Lists the assets in the library, optionally filtered by type (\"RING_PROFILE\", \"BEZEL_PROFILE\", \"CHARM_PROFILE\", ...). |\n| `Rename` | Renames a user asset. |\n| `SetDefault` | Makes an asset the default of its type: every Create uses it when no profile is given. |\n| `Types` | Valid values for the `type` arguments. |","metadata":{"title":"AssetsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#methods","collection":"scripting","hash":"2836ec74e68a94a15f2f70e5decb0ecc","indexed_by":"docs-index"}},{"content":"AssetsApi — Delete\n\n```csharp\nbool AssetsApi.Delete(string type, string name)\n```\n\nPermanently deletes a user asset from the library. Standard assets are protected. Objects already built from it keep their embedded copy. Returns true when deleted.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n\nReturns `bool`.","metadata":{"title":"AssetsApi","section":"Delete","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#delete","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#delete","collection":"scripting","hash":"457461c76ed13567b260855c9d4a5953","indexed_by":"docs-index"}},{"content":"AssetsApi — Duplicate\n\n```csharp\nAssetInfo AssetsApi.Duplicate(string type, string name, string newName = null)\n```\n\nCopies an asset (standard ones included) as a new user asset named `newName` (empty = \" (Copy)\"), preview included.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `newName` | `string` | `null` |\n\nReturns `AssetInfo`.","metadata":{"title":"AssetsApi","section":"Duplicate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#duplicate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#duplicate","collection":"scripting","hash":"3fc8537361709bfbbadfe44bafe65683","indexed_by":"docs-index"}},{"content":"AssetsApi — ExportAsCurve\n\n```csharp\nGuid AssetsApi.ExportAsCurve(\n    string type,\n    string name,\n    double width = 0,\n    double height = 0,\n    Plane? plane = null)\n```\n\nAdds the asset's profile to the document as a curve so it can be seen before choosing it: the shape the tools build from (mirrored and closed, or open for RING_SIDE_CURVE), sized width x height mm (0 = 5 x 3, like the Assets panel's insert; side curves keep their aspect and only follow height) and centered on `plane`'s origin (default: the active construction plane). `name` accepts the asset name or \"id: \". Returns the curve id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n\nReturns `Guid`.","metadata":{"title":"AssetsApi","section":"ExportAsCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#exportascurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#exportascurve","collection":"scripting","hash":"f10cc084ecfb3f0f9216d2202e74482d","indexed_by":"docs-index"}},{"content":"AssetsApi — GetDefault\n\n```csharp\nAssetInfo AssetsApi.GetDefault(string type)\n```\n\nThe default asset for a type -- the one every Create uses when no profile name is given.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n\nReturns `AssetInfo`.\n\nList\n```csharp\nIReadOnlyList<AssetInfo> AssetsApi.List(string type = null)\n```\n\nLists the assets in the library, optionally filtered by type (\"RING_PROFILE\", \"BEZEL_PROFILE\", \"CHARM_PROFILE\", ...).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AssetsApi","section":"GetDefault","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#getdefault","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#getdefault","collection":"scripting","hash":"be871c976ab1e534b7c118836acd6c95","indexed_by":"docs-index"}},{"content":"AssetsApi — Rename\n\n```csharp\nAssetInfo AssetsApi.Rename(string type, string name, string newName)\n```\n\nRenames a user asset. Standard (factory) assets cannot be renamed: tool defaults and scripts refer to them by name. The new name must be free within the type.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `newName` | `string` | required |\n\nReturns `AssetInfo`.","metadata":{"title":"AssetsApi","section":"Rename","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#rename","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#rename","collection":"scripting","hash":"6ff82a4224c9993474d43e29e1e173ba","indexed_by":"docs-index"}},{"content":"AssetsApi — SetDefault\n\n```csharp\nAssetInfo AssetsApi.SetDefault(string type, string name)\n```\n\nMakes an asset the default of its type: every Create uses it when no profile is given.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n\nReturns `AssetInfo`.\n\nTypes\n```csharp\nIReadOnlyList<string> AssetsApi.Types()\n```\n\nValid values for the `type` arguments.\n\nReturns `IReadOnlyList `.","metadata":{"title":"AssetsApi","section":"SetDefault","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#setdefault","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/assets/#setdefault","collection":"scripting","hash":"d7e7a1d4896b10b12ff50adadd64032e","indexed_by":"docs-index"}},{"content":"AutomaticPaveApi\n\nAutomatic pavé (the ArtisanAutomaticPave tool, headless): fills a surface with stones by relaxing a spring network over its mesh, which is what lets it mix several stone sizes and follow an irregular boundary. This is the SLOW pavé: the relaxation runs on a background worker and a busy surface takes seconds. PaveApi.OnSurface is the fast, regular alternative when a single size on a simple surface is enough.\n\n```python\nfrom ArtisanPlugin.Scripting import AutomaticPaveApi\n```\n\nSee also the Python package, `ra.automatic_pave`.","metadata":{"title":"AutomaticPaveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/automatic-pave/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/automatic-pave/","collection":"scripting","hash":"fcda5744628eb2eefca07b5e63f1bb27","indexed_by":"docs-index"}},{"content":"AutomaticPaveApi — Methods\n\n| Method | |\n|---|---|\n| `OnSurface` | Fills `surfaceIds` with stones and bakes them as loose gems. |\n\nOnSurface\n```csharp\nIReadOnlyList<Guid> AutomaticPaveApi.OnSurface(\n    IEnumerable<Guid> surfaceIds = null,\n    array<double> gemSizes = null,\n    double minDistance = 0,\n    double borderDistance = 0,\n    string fillMode = null,\n    string symmetry = null,\n    Point3d? startPoint = null,\n    int relaxIterations = 0)\n```\n\nFills `surfaceIds` with stones and bakes them as loose gems. `gemSizes` is the size palette in millimetres -- the tool's distinguishing feature: pass several and the relaxation picks per stone (e.g. [1.5, 1.2, 0.9]); null/empty uses the user's saved palette (the panel's save-as-default), otherwise 1.3. `minDistance` is the metal left between stones, `borderDistance` the margin to the surface edge (both mm; 0 keeps the user's saved value, otherwise 0.1). `fillMode` is FROM_BORDER (default, seeds the outline first) or FROM_CENTER, which grows from `startPoint`. `symmetry` mirrors the layout: NONE (default), X, Y or BOTH. `relaxIterations` runs extra relaxation passes for a tidier result. Returns the ids of the baked gems.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceIds` | `IEnumerable ` | `null` |\n| `gemSizes` | `array ` | `null` |\n| `minDistance` | `double` | `0` |\n| `borderDistance` | `double` | `0` |\n| `fillMode` | `string` | `null` |\n| `symmetry` | `string` | `null` |\n| `startPoint` | `Point3d?` | `null` |\n| `relaxIterations` | `int` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"AutomaticPaveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/automatic-pave/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/automatic-pave/#methods","collection":"scripting","hash":"89dd06640020fdbf34746b4c200cd081","indexed_by":"docs-index"}},{"content":"AzureApi\n\nAzure cutters under a pave: the openwork underneath.\n\n```python\nfrom ArtisanPlugin.Scripting import AzureApi\n```\n\nSee also the Python package, `ra.azure`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | The Azure panel (AzureCommand / SmartAzure ribbon button), headless: open-work under stones. |\n\nCreate\n```csharp\nAzureResult AzureApi.Create(\n    Guid solidId,\n    IEnumerable<Guid> gemIds = null,\n    double thickness = 0,\n    double height = 0,\n    double depth = 0,\n    double angle = double.NaN,\n    double rotation = double.NaN,\n    bool boolean = true,\n    bool deleteOriginal = false)\n```\n\nThe Azure panel (AzureCommand / SmartAzure ribbon button), headless: open-work under stones. One hexagonal hole per gem in `gemIds` (null = the selected gems), centred under the gem girdle and projected onto `solidId` (a closed polysurface or extrusion), then subtracted from it. Millimetres; 0 keeps the tool default (or the user's saved defaults): thickness 0.6 (wall between holes), height 0.5 (rise above the surface), depth 4 (cut depth). `angle` is the wall taper in degrees and `rotation` spins the hexagon (both default 0; NaN = default). `boolean` true (default) replaces the solid by the carved result (`deleteOriginal` removes the original; default false keeps both, like the panel); false adds the cutters to the document and leaves the solid intact.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `solidId` | `Guid` | required |\n| `gemIds` | `IEnumerable ` | `null` |\n| `thickness` | `double` | `0` |\n| `height` | `double` | `0` |\n| `depth` | `double` | `0` |\n| `angle` | `double` | `double.NaN` |\n| `rotation` | `double` | `double.NaN` |\n| `boolean` | `bool` | `true` |\n| `deleteOriginal` | `bool` | `false` |\n\nReturns `AzureResult`.","metadata":{"title":"AzureApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/azure/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/azure/","collection":"scripting","hash":"3c3c5738967f98f01b07e8f59c2c34e3","indexed_by":"docs-index"}},{"content":"BailApi\n\nBail smart component (the pendant hanger loop) -- the ArtisanBail tool, headless. The result is the same editable smart component the panel inserts: a group carrying the serialized parameters, with the bail (and optional o-ring) breps as Artisan brep objects with the metal material.\n\n```python\nfrom ArtisanPlugin.Scripting import BailApi\n```\n\nSee also the guide, Accessories › Bail, and the Python package, `ra.bail`.","metadata":{"title":"BailApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/","collection":"scripting","hash":"3fef19406846006e43c8c49ffd915fd6","indexed_by":"docs-index"}},{"content":"BailApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Creates a bail on `plane` (defaults to the active view's construction plane, like the tool). |","metadata":{"title":"BailApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#methods","collection":"scripting","hash":"e934708ff1c659557b97ece10764c5fb","indexed_by":"docs-index"}},{"content":"BailApi — Create\n\n```csharp\nIReadOnlyList<Guid> BailApi.Create(\n    Plane? plane = null,\n    double diameterTop = 0,\n    double diameterBottom = 0,\n    double distance = 0,\n    bool withORing = false,\n    string name = null,\n    string profile = null,\n    double topWidth = 0,\n    double topHeight = 0,\n    double bottomWidth = 0,\n    double bottomHeight = 0,\n    string topProfile = null,\n    string bottomProfile = null,\n    double startingOnTop = double.NaN,\n    double startingOnBottom = double.NaN,\n    double curveTension = double.NaN,\n    double oRingThickness = 0,\n    double oRingDiameter = 0,\n    double oRingOverlap = 0,\n    double oRingRotation = double.NaN,\n    string element = null)\n```\n\nCreates a bail on `plane` (defaults to the active view's construction plane, like the tool). Millimetres; 0 keeps the tool default (or the user's saved defaults): diameterTop 3, diameterBottom 1, distance 5. `withORing` true also builds the torus o-ring; false (default) builds none. The wire cross-section drives the weight: topWidth/topHeight (default 4 x 1.4) and bottomWidth/bottomHeight (default 1 x 1); `profile` sets both profile assets, topProfile/bottomProfile each one. startingOnTop, startingOnBottom (default 0.5) and curveTension (default 1) shape the side curves; NaN keeps the default. oRingThickness (1), oRingDiameter (2), oRingOverlap (1) size the o-ring; oRingRotation in degrees (0; NaN keeps it). Returns the ids of the created breps. `element` = name of a saved Bail element (ElementsApi.List(\"Bail\")) to start from; explicit arguments override it (profile names replace its profiles; withORing false keeps its o-ring setting).","metadata":{"title":"BailApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#create","collection":"scripting","hash":"3dc777dc8d983cbb4b76a018d8d3b323","indexed_by":"docs-index"}},{"content":"BailApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `diameterTop` | `double` | `0` |\n| `diameterBottom` | `double` | `0` |\n| `distance` | `double` | `0` |\n| `withORing` | `bool` | `false` |\n| `name` | `string` | `null` |\n| `profile` | `string` | `null` |\n| `topWidth` | `double` | `0` |\n| `topHeight` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `bottomHeight` | `double` | `0` |\n| `topProfile` | `string` | `null` |\n| `bottomProfile` | `string` | `null` |\n| `startingOnTop` | `double` | `double.NaN` |\n| `startingOnBottom` | `double` | `double.NaN` |\n| `curveTension` | `double` | `double.NaN` |\n| `oRingThickness` | `double` | `0` |\n| `oRingDiameter` | `double` | `0` |\n| `oRingOverlap` | `double` | `0` |\n| `oRingRotation` | `double` | `double.NaN` |\n| `element` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BailApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bail/#create","collection":"scripting","hash":"af989f8c889fdea3197e0c8a9058e5c7","indexed_by":"docs-index"}},{"content":"BangleApi\n\nRigid bracelet body (the ArtisanBangle tool).\n\n```python\nfrom ArtisanPlugin.Scripting import BangleApi\n```\n\nSee also the guide, Accessories › Bangle, and the Python package, `ra.bangle`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `closed` true makes a full bangle (type CLOSED); default is the open type with `aperture` mm of opening. |","metadata":{"title":"BangleApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bangle/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bangle/","collection":"scripting","hash":"507b61d881486d2d0cd01a51e2201c97","indexed_by":"docs-index"}},{"content":"BangleApi — Create\n\n```csharp\nGuid BangleApi.Create(\n    Plane? plane = null,\n    double width = 0,\n    double height = 0,\n    double aperture = 0,\n    bool closed = false,\n    string profile = null,\n    string element = null)\n```\n\n`closed` true makes a full bangle (type CLOSED); default is the open type with `aperture` mm of opening. Defaults: width 50, height 30, aperture 10. `element` = name of a saved Bangle element (ElementsApi.List(\"Bangle\")) to start from; explicit arguments override it (`profile` replaces its three profiles).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `aperture` | `double` | `0` |\n| `closed` | `bool` | `false` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"BangleApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bangle/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bangle/#create","collection":"scripting","hash":"c07153538446da462eb88c3e4704f694","indexed_by":"docs-index"}},{"content":"BasketUpdateApi\n\nMaintenance for baskets saved by old Artisan versions. Creating and editing baskets is BasketApi; this facade only migrates the legacy single-object format (BasketApi is not partial, hence a separate class).\n\n```python\nfrom ArtisanPlugin.Scripting import BasketUpdateApi\n```\n\nSee also the Python package, `ra.basket`.","metadata":{"title":"BasketUpdateApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/","collection":"scripting","hash":"d99e6adce40189004a4932dc3bda4301","indexed_by":"docs-index"}},{"content":"BasketUpdateApi — Methods\n\n| Method | |\n|---|---|\n| `UpdateLegacyBaskets` | The ArtisanBasketUpdate command, headless: finds every legacy basket (one object carrying \"ObjectType = Basket\" + parameters in its geometry dictionary, as saved by old Artisan versions, hidden or not), recomputes it against its mother gem with the current kernel and replaces it by the modern editable \"Basket\" group (metal material, RaObjectUserData with the parameters and the mother). |","metadata":{"title":"BasketUpdateApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/#methods","collection":"scripting","hash":"5208e25e43ca2f7e941aaa084a3362b3","indexed_by":"docs-index"}},{"content":"BasketUpdateApi — UpdateLegacyBaskets\n\n```csharp\nIReadOnlyList<Guid> BasketUpdateApi.UpdateLegacyBaskets()\n```\n\nThe ArtisanBasketUpdate command, headless: finds every legacy basket (one object carrying \"ObjectType = Basket\" + parameters in its geometry dictionary, as saved by old Artisan versions, hidden or not), recomputes it against its mother gem with the current kernel and replaces it by the modern editable \"Basket\" group (metal material, RaObjectUserData with the parameters and the mother). Baskets whose mother gem is gone or that fail to compute are left untouched. Returns the ids of the new baskets (BasketApi.Find / handles); empty when the document has no legacy baskets.\n\nReturns `IReadOnlyList `.","metadata":{"title":"BasketUpdateApi","section":"UpdateLegacyBaskets","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/#updatelegacybaskets","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket-update/#updatelegacybaskets","collection":"scripting","hash":"d636b206c6b82c6165e0512f6dc43efa","indexed_by":"docs-index"}},{"content":"BasketApi\n\nBasket settings: prongs, upper and base rails.\n\n```python\nfrom ArtisanPlugin.Scripting import BasketApi\n```\n\nSee also the guide, Gemsets › Basket, and the Python package, `ra.basket`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IBasket` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByGemMaterial` | |\n| `ByLayer` | `IBasket` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a basket setting under an existing gem -- the ArtisanBasket tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IBasket` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Baskets currently selected in the active doc. |","metadata":{"title":"BasketApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/","collection":"scripting","hash":"20e235e5907bf01f9a465d40be810aef","indexed_by":"docs-index"}},{"content":"BasketApi — All\n\n```csharp\nIReadOnlyList<IBasket> BasketApi.All()\n```\n\n`IBasket` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByGemMaterial\n```csharp\nIReadOnlyList<IBasket> BasketApi.ByGemMaterial(string materialName)\n```\n\n| Parameter | Type | Default |\n|---|---|---|\n| `materialName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BasketApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#all","collection":"scripting","hash":"d4f43b609a750cfe9be4d2711dce27ac","indexed_by":"docs-index"}},{"content":"BasketApi — ByLayer\n\n```csharp\nIReadOnlyList<IBasket> BasketApi.ByLayer(string layerName)\n```\n\n`IBasket` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.\n\nCount\n```csharp\nint BasketApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"BasketApi","section":"ByLayer","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#bylayer","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#bylayer","collection":"scripting","hash":"4a8817547482c5bfb2d313e7d4863d9a","indexed_by":"docs-index"}},{"content":"BasketApi — Create\n\n```csharp\nIReadOnlyList<IBasket> BasketApi.Create(\n    IEnumerable<Guid> gemIds = null,\n    int prongs = 0,\n    double prongDiameter = 0,\n    double prongHeight = 0,\n    double prongHeightOverGirdle = 0,\n    double gemInside = double.NaN,\n    bool? upperRail = null,\n    bool? baseRail = null,\n    string support = null,\n    string prongMode = null,\n    string prongProfile = null,\n    double prongDiameterBottom = 0,\n    double prongRotation = double.NaN,\n    bool? straightProng = null,\n    double supportWidth = 0,\n    double supportThickness = 0,\n    double upperRailWidth = 0,\n    double upperRailHeight = 0,\n    double upperRailHeightUnderGirdle = 0,\n    double upperRailGemSizePercentage = 0,\n    string upperRailProfile = null,\n    double baseRailWidth = 0,\n    double baseRailHeight = 0,\n    double baseRailMoveInZ = double.NaN,\n    double baseRailGemSizePercentage = 0,\n    string baseRailProfile = null,\n    string element = null)\n```","metadata":{"title":"BasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","collection":"scripting","hash":"27c61f9b994cda50170c1ca35c806b58","indexed_by":"docs-index"}},{"content":"BasketApi — Create\n\nBuilds a basket setting under an existing gem -- the ArtisanBasket tool, headless. One basket (its own group) per gem; `gemIds` null/empty = the currently selected gems. Millimetres; 0 keeps the tool default (or the user's saved defaults): prongDiameter 1.5 (sets top/girdle/bottom together), prongHeight 4, prongHeightOverGirdle 0.3. `prongs` 0 keeps the default (4 rotated); positive/negative counts follow the tool (negative = rotated variant). `gemInside` defaults to 0.35. `upperRail`/`baseRail` null keep the defaults (both enabled). `support` is NONE (default), SINGLE or DOUBLE. `prongMode` is ROUND (default), CUSTOM (the `prongProfile` section; a profile alone implies it, and the section starts turned 90 degrees unless `prongRotation` says otherwise) or CLAW; DEFAULT and CIRCLE also mean ROUND. Claw tips are built in Render mode only; tune them through the handle's Prong section (SetClawGemInside...). Returns one IBasket handle per gem, in input order. `element` = name of a saved Basket element (ElementsApi.List(\"Basket\")) to start from instead of the defaults; explicit arguments override it.","metadata":{"title":"BasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","collection":"scripting","hash":"db0cc35f34cd16a3e7118b5035c1dd92","indexed_by":"docs-index"}},{"content":"BasketApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `prongs` | `int` | `0` |\n| `prongDiameter` | `double` | `0` |\n| `prongHeight` | `double` | `0` |\n| `prongHeightOverGirdle` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n| `upperRail` | `bool?` | `null` |\n| `baseRail` | `bool?` | `null` |\n| `support` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n| `prongProfile` | `string` | `null` |\n| `prongDiameterBottom` | `double` | `0` |\n| `prongRotation` | `double` | `double.NaN` |\n| `straightProng` | `bool?` | `null` |\n| `supportWidth` | `double` | `0` |\n| `supportThickness` | `double` | `0` |\n| `upperRailWidth` | `double` | `0` |\n| `upperRailHeight` | `double` | `0` |\n| `upperRailHeightUnderGirdle` | `double` | `0` |\n| `upperRailGemSizePercentage` | `double` | `0` |\n| `upperRailProfile` | `string` | `null` |\n| `baseRailWidth` | `double` | `0` |\n| `baseRailHeight` | `double` | `0` |\n| `baseRailMoveInZ` | `double` | `double.NaN` |\n| `baseRailGemSizePercentage` | `double` | `0` |\n| `baseRailProfile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BasketApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#create","collection":"scripting","hash":"6310c0ce6c20f17ef4df2c1c1d697b0e","indexed_by":"docs-index"}},{"content":"BasketApi — Find\n\n```csharp\nIBasket BasketApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IBasket`.\n\nForGem\n```csharp\nIReadOnlyList<IBasket> BasketApi.ForGem(Guid gemId)\n```\n\n`IBasket` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BasketApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#find","collection":"scripting","hash":"eb306a8ac8716221fb575aa9e7297458","indexed_by":"docs-index"}},{"content":"BasketApi — Selected\n\n```csharp\nIReadOnlyList<IBasket> BasketApi.Selected()\n```\n\nBaskets currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"BasketApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#selected","collection":"scripting","hash":"b24e2d793eacbc305380f4a7588c7772","indexed_by":"docs-index"}},{"content":"BasketApi — IBasket\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BaseRail` | `IBasketRail` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Prong` | `IBasketProng` | get | The rest of the tool's parameters, grouped as the panel groups them. |\n| `ProngCount` | `int` | get | signed: negative = the rotated layout |\n| `ProngDiameterBottom` | `double` | get | |\n| `ProngDiameterGirdle` | `double` | get | stored for older files only: the prong's girdle section is built from ProngDiameterTop |\n| `ProngDiameterTop` | `double` | get | |\n| `ProngHeight` | `double` | get | |\n| `ProngMode` | `string` | get | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\": the prong construction, as on every setting with prongs. The claw values live in the Prong section. |\n| `ProngsRotated` | `bool` | get | |\n| `UpperRail` | `IBasketRail` | get | |","metadata":{"title":"BasketApi","section":"IBasket","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasket","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasket","collection":"scripting","hash":"0fdd4d633032a720946494dd7fd1847e","indexed_by":"docs-index"}},{"content":"BasketApi — IBasket\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Basket element (ElementsApi.List(\"Basket\")) to this basket: its parameters replace the current ones, the mother gem stays, and the basket regenerates in place (same id). |\n| `void SetProngCount(int prongs)` | Parametric edits -- each regenerates the basket (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. Millimetres; negative prong counts follow the tool's rotated-variant convention. |\n| `void SetProngDiameter(double diameter)` | writes all three diameters |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMode(string mode)` | ROUND \\| CUSTOM \\| CLAW (DEFAULT and CIRCLE also mean ROUND). A prong that becomes CUSTOM starts with its section turned 90 degrees (Prong.Rotation). Claw tips are built in Render mode only. |","metadata":{"title":"BasketApi","section":"IBasket","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasket","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasket","collection":"scripting","hash":"7fbfedd7f74b99d0360e8fe4858f3193","indexed_by":"docs-index"}},{"content":"BasketApi — IBasketRail\n\n*Section*.\n\nOne of the basket's two rails. The upper rail additionally carries the chamfer; the base rail carries its vertical offset. Members that do not apply to a rail throw NotSupportedException rather than silently doing nothing.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Chamfer` | `bool` | get | upper rail only |\n| `ChamferOffset` | `double` | get | upper rail only |\n| `Enabled` | `bool` | get | |\n| `GemSizePercentage` | `double` | get | rail diameter as % of the gem |\n| `Height` | `double` | get | mm |\n| `HeightUnderGirdle` | `double` | get | upper rail only |\n| `Mode` | `string` | get | DEFAULT (elliptical section) or CUSTOM (the CLOSED_PROFILE) |\n| `MoveInZ` | `double` | get | base rail only, signed |\n| `ProfileName` | `string` | get | CLOSED_PROFILE asset name (used in CUSTOM mode) |\n| `Rotation` | `double` | get | degrees, signed |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetChamfer(bool chamfer)` | upper rail only |\n| `void SetChamferOffset(double offset)` | upper rail only, signed |\n| `void SetEnabled(bool enabled)` | |\n| `void SetGemSizePercentage(double percentage)` | |\n| `void SetHeight(double height)` | |\n| `void SetHeightUnderGirdle(double height)` | upper rail only |\n| `void SetMode(string mode)` | DEFAULT (elliptical section) or CUSTOM (the rail's CLOSED_PROFILE) |\n| `void SetMoveInZ(double moveInZ)` | base rail only, signed |\n| `void SetProfile(string assetName)` | also switches the rail to CUSTOM mode, where the profile is used |\n| `void SetRotation(double degrees)` | signed |\n| `void SetWidth(double width)` | |","metadata":{"title":"BasketApi","section":"IBasketRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketrail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketrail","collection":"scripting","hash":"f940f610a4a9c87766bbd10c5b9b7935","indexed_by":"docs-index"}},{"content":"BasketApi — IBasketProng\n\n*Section*.\n\nThe prongs and their support posts.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomRailInside` | `double` | get | |\n| `CapBump` | `double` | get | mm |\n| `ClawGemInside` | `double` | get | The basket's claw tip, CLAW mode only (built in Render mode only). mm the tip reaches in toward the gem. |\n| `ClawHeight` | `double` | get | mm added to the height over the girdle, signed |\n| `ClawOnCurve` | `int` | get | the panel's \"Smoothness\" (1-30): on STRAIGHT prongs, where the claw starts to bend, as a % of the girdle-to-base distance; curved prongs (the default) ignore it |\n| `ClawTension` | `double` | get | degrees, the panel's \"Tip direction\" (10-60) |\n| `Count` | `int` | get | negative = the rotated layout |\n| `DiameterBottom` | `double` | get | mm |\n| `DiameterTop` | `double` | get | mm |\n| `ExtensionForManufacturing` | `double` | get | |\n| `GemInside` | `double` | get | mm, signed |\n| `Height` | `double` | get | mm |\n| `HeightOverGirdle` | `double` | get | mm |\n| `Mode` | `string` | get | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\" (the same as IBasket.ProngMode) |\n| `ProfileName` | `string` | get | CLOSED_PROFILE asset name, \"\" when unset |\n| `Rotation` | `double` | get | degrees, signed |\n| `Straight` | `bool` | get | straight vs curved prong body |\n| `Support` | `string` | get | \"NONE\" \\| \"SINGLE\" \\| \"DOUBLE\" |\n| `SupportThickness` | `double` | get | mm |\n| `SupportWidth` | `double` | get | mm |","metadata":{"title":"BasketApi","section":"IBasketProng","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketprong","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketprong","collection":"scripting","hash":"06a61704a179d645993a79769b7e8fe8","indexed_by":"docs-index"}},{"content":"BasketApi — IBasketProng\n\n| Method | |\n|---|---|\n| `void SetBottomRailInside(double value)` | |\n| `void SetCapBump(double capBump)` | |\n| `void SetClawGemInside(double gemInside)` | |\n| `void SetClawHeight(double height)` | signed |\n| `void SetClawOnCurve(int onCurve)` | |\n| `void SetClawTension(double tension)` | |\n| `void SetCount(int count)` | negative = rotated; 0 = no prongs |\n| `void SetDiameterBottom(double diameter)` | |\n| `void SetDiameterTop(double diameter)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | signed |\n| `void SetHeight(double height)` | |\n| `void SetHeightOverGirdle(double height)` | |\n| `void SetMode(string mode)` | ROUND \\| CUSTOM \\| CLAW (DEFAULT and CIRCLE also mean ROUND); becoming CUSTOM starts Rotation at 90 |\n| `void SetProfile(string assetName)` | CLOSED_PROFILE asset; also switches the prongs to CUSTOM mode, where the profile is used (from another mode, Rotation starts at 90) |\n| `void SetRotation(double degrees)` | signed |\n| `void SetStraight(bool straight)` | |\n| `void SetSupport(string support)` | NONE \\| SINGLE \\| DOUBLE |\n| `void SetSupportThickness(double thickness)` | |\n| `void SetSupportWidth(double width)` | |","metadata":{"title":"BasketApi","section":"IBasketProng","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketprong","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/basket/#ibasketprong","collection":"scripting","hash":"ffce52c4277ae2c59c2067a1fe80ca1a","indexed_by":"docs-index"}},{"content":"BeadApi\n\nPierced bead (the ArtisanBead tool).\n\n```python\nfrom ArtisanPlugin.Scripting import BeadApi\n```\n\nSee also the guide, Accessories › Bead, and the Python package, `ra.bead`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `profile` is \"SQUARE\" (default) or \"ROUND\". |\n\nCreate\n```csharp\nGuid BeadApi.Create(\n    Plane? plane = null,\n    double width = 0,\n    double height = 0,\n    double holeDiameter = 0,\n    string profile = null,\n    string element = null)\n```\n\n`profile` is \"SQUARE\" (default) or \"ROUND\". Defaults: width 10, height 10, holeDiameter 3. `element` = name of a saved Bead element (ElementsApi.List(\"Bead\")) to start from; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `holeDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"BeadApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bead/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bead/","collection":"scripting","hash":"2b22665875fdde4cac983718f7b092d3","indexed_by":"docs-index"}},{"content":"BezelApi\n\nBezel settings with support, cutter and air-gap sections.\n\n```python\nfrom ArtisanPlugin.Scripting import BezelApi\n```\n\nSee also the guide, Gemsets › Bezel, and the Python package, `ra.bezel`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IBezel` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IBezel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a bezel around an existing gem (`gemId` must be a gem in the active document -- the bezel is a parametric child of that gem). |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IBezel` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Bezels currently selected in the active doc. |","metadata":{"title":"BezelApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/","collection":"scripting","hash":"bca535c54f10f6072a92605d80c198f6","indexed_by":"docs-index"}},{"content":"BezelApi — All\n\n```csharp\nIReadOnlyList<IBezel> BezelApi.All()\n```\n\n`IBezel` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IBezel> BezelApi.ByLayer(string layerName)\n```\n\n`IBezel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BezelApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#all","collection":"scripting","hash":"90e5919962810e76cdba59ee344bb8b1","indexed_by":"docs-index"}},{"content":"BezelApi — Count\n\n```csharp\nint BezelApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"BezelApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#count","collection":"scripting","hash":"456b7cbf5faf659e48501a4472e1c2bc","indexed_by":"docs-index"}},{"content":"BezelApi — Create\n\n```csharp\nIBezel BezelApi.Create(\n    Guid gemId,\n    double height = 0,\n    double width = 0,\n    double girdleHeight = 0,\n    double girdleWidth = 0,\n    double gemInside = 0,\n    string profile = null,\n    int supportCount = 0,\n    double supportWidth = 0,\n    double supportThickness = 0,\n    int cutterCount = 0,\n    double cutterWidth = 0,\n    double cutterHeight = 0,\n    string cutterProfile = null,\n    int airgapCount = 0,\n    double airgapWidth = 0,\n    double airgapHeight = 0,\n    string airgapProfile = null,\n    string element = null)\n```","metadata":{"title":"BezelApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","collection":"scripting","hash":"bbfb34417d90195862752fcdb1303ade","indexed_by":"docs-index"}},{"content":"BezelApi — Create\n\nBuilds a bezel around an existing gem (`gemId` must be a gem in the active document -- the bezel is a parametric child of that gem). Uses the same default profile assets and compute pipeline as the ArtisanBezel tool, so the result is identical to inserting one from the panel. All dimensional arguments are millimetres. Pass 0 (or omit) to keep the default for that parameter: the user's saved Bezel defaults when there are any (the panel's save-as-default), otherwise the tool's (height 3.8, width 1.5, girdle height 0.3, girdle width 1.5, gem inside 0). `profile` picks a BEZEL_PROFILE asset from the library by name (see AssetsApi.List(\"BEZEL_PROFILE\")); omitted = the default profile. The support posts and the two piercing blocks (cutters and air gaps, both OFF by default) are opened here by their count: passing `cutterCount`/`airgapCount` > 0 enables that block. Their signed parameters -- displacement and the three rotations -- are not arguments here, because 0 is a meaningful value for them and this signature reads 0 as \"keep the default\"; set those through the returned handle (`bezel.Cutters.SetVerticalRotation(...)`), which takes literal values. Throws if `gemId` is not a gem, if the bezel geometry fails to compute, or if the license is invalid.","metadata":{"title":"BezelApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","collection":"scripting","hash":"580ab4dfbfe10a5d685a0cac30d2d511","indexed_by":"docs-index"}},{"content":"BezelApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `height` | `double` | `0` |\n| `width` | `double` | `0` |\n| `girdleHeight` | `double` | `0` |\n| `girdleWidth` | `double` | `0` |\n| `gemInside` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `supportCount` | `int` | `0` |\n| `supportWidth` | `double` | `0` |\n| `supportThickness` | `double` | `0` |\n| `cutterCount` | `int` | `0` |\n| `cutterWidth` | `double` | `0` |\n| `cutterHeight` | `double` | `0` |\n| `cutterProfile` | `string` | `null` |\n| `airgapCount` | `int` | `0` |\n| `airgapWidth` | `double` | `0` |\n| `airgapHeight` | `double` | `0` |\n| `airgapProfile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IBezel`.","metadata":{"title":"BezelApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#create","collection":"scripting","hash":"c5379f0befdce9c4a82cc99fc0bf5f76","indexed_by":"docs-index"}},{"content":"BezelApi — Find\n\n```csharp\nIBezel BezelApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IBezel`.\n\nForGem\n```csharp\nIReadOnlyList<IBezel> BezelApi.ForGem(Guid gemId)\n```\n\n`IBezel` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BezelApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#find","collection":"scripting","hash":"fe1551155eddc4deaaecb7cc524e8090","indexed_by":"docs-index"}},{"content":"BezelApi — Selected\n\n```csharp\nIReadOnlyList<IBezel> BezelApi.Selected()\n```\n\nBezels currently selected in the active doc. Empty list if nothing is selected or the selection contains no bezels.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"BezelApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#selected","collection":"scripting","hash":"b580a7c0bab1057bf9cbf67f7340f3a6","indexed_by":"docs-index"}},{"content":"BezelApi — IBezel\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `AirGaps` | `IBezelPiercing` | get | |\n| `Cutters` | `IBezelPiercing` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `GirdleHeight` | `double` | get | |\n| `GirdleWidth` | `double` | get | |\n| `Height` | `double` | get | Current values of the bezel wall (millimetres). |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProfileName` | `string` | get | BEZEL_PROFILE asset name, \"\" when unset |\n| `Support` | `IBezelSupport` | get | The rest of the tool's parameters, grouped as the panel groups them. |\n| `Width` | `double` | get | |","metadata":{"title":"BezelApi","section":"IBezel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezel","collection":"scripting","hash":"c79fb6c3190db45876cc860d2c63accf","indexed_by":"docs-index"}},{"content":"BezelApi — IBezel\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Bezel element (ElementsApi.List(\"Bezel\")) to this bezel: its parameters replace the current ones, the mother gem stays, and the bezel regenerates in place (same Guid). |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGirdleHeight(double girdleHeight)` | |\n| `void SetGirdleWidth(double girdleWidth)` | |\n| `void SetHeight(double height)` | Parametric edits -- each regenerates the bezel in place (same Guid) and calls LicenseGate.RequireValid() first. Millimetres. |\n| `void SetProfile(string assetName)` | BEZEL_PROFILE asset name |\n| `void SetWidth(double width)` | |","metadata":{"title":"BezelApi","section":"IBezel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezel","collection":"scripting","hash":"058b1813f2be39cc38fa5e49a114e544","indexed_by":"docs-index"}},{"content":"BezelApi — IBezelSupport\n\n*Section*.\n\nThe posts that hold the bezel over the shank.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Count` | `int` | get | number of support posts, 0 = none (max 6) |\n| `Thickness` | `double` | get | mm |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetCount(int count)` | 0-6; 0 removes the supports |\n| `void SetThickness(double thickness)` | mm, > 0 |\n| `void SetWidth(double width)` | mm, > 0 |","metadata":{"title":"BezelApi","section":"IBezelSupport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezelsupport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezelsupport","collection":"scripting","hash":"4e179c07bb568f20c55a31976f25c092","indexed_by":"docs-index"}},{"content":"BezelApi — IBezelPiercing\n\n*Section*.\n\nThe repeated solids pierced around the bezel wall. The same shape drives two independent sections: the CUTTERS (subtracted, the classic scalloped windows) and the AIR GAPS (the openings under the girdle).\n\n| Property | Type | | |\n|---|---|---|---|\n| `Count` | `int` | get | how many are distributed around the bezel |\n| `Displacement` | `double` | get | mm along the bezel axis, SIGNED |\n| `Enabled` | `bool` | get | |\n| `GlobalRotation` | `double` | get | degrees, the whole ring of piercings, SIGNED |\n| `Height` | `double` | get | mm |\n| `ProfileName` | `string` | get | CLOSED_PROFILE asset name, \"\" when unset |\n| `Rotation` | `double` | get | degrees, each piercing around its own axis, SIGNED |\n| `VerticalRotation` | `double` | get | degrees, tilt of each piercing, SIGNED |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetCount(int count)` | > 0; also enables the section |\n| `void SetDisplacement(double displacement)` | mm, signed |\n| `void SetEnabled(bool enabled)` | |\n| `void SetGlobalRotation(double degrees)` | signed |\n| `void SetHeight(double height)` | mm, > 0 |\n| `void SetProfile(string assetName)` | CLOSED_PROFILE asset name |\n| `void SetRotation(double degrees)` | signed |\n| `void SetVerticalRotation(double degrees)` | signed |\n| `void SetWidth(double width)` | mm, > 0 |","metadata":{"title":"BezelApi","section":"IBezelPiercing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezelpiercing","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bezel/#ibezelpiercing","collection":"scripting","hash":"0216a0a8bfd359114be2b55d5bdb0cb1","indexed_by":"docs-index"}},{"content":"BooleanUpdateApi\n\nHeadless ArtisanBooleanUpdate. An Artisan boolean (BooleanApi or the ArtisanBoolean* commands) lives in a group whose RaObjectUserData stores the operation and the operand ids; ArtisanEdit \"dismantles\" it (deletes the result, shows the operands, keeps the empty group). Update rebuilds those dismantled booleans from the stored operands and hides them again. Where the command asks the user to reselect an operand whose id died (a parametric edit recreated the object), the API takes `replacements` (old id -> new id) and stores the new ids back, exactly like the command.\n\n```python\nfrom ArtisanPlugin.Scripting import BooleanUpdateApi\n```\n\nSee also the Python package, `ra.boolean`.","metadata":{"title":"BooleanUpdateApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/","collection":"scripting","hash":"e01f75de2fe8cd3e948ff15c65b2aa22","indexed_by":"docs-index"}},{"content":"BooleanUpdateApi — Methods\n\n| Method | |\n|---|---|\n| `ListDismantled` | Read-only: the dismantled Artisan booleans in the document (boolean groups with no members), with their operation, stored operand ids and the operand ids that no longer exist (those need `replacements` in Update). |\n| `Update` | Rebuilds one dismantled boolean by its unique id (see ListDismantled). |\n| `UpdateAll` | Rebuilds every dismantled Artisan boolean (the ArtisanBooleanUpdate command, no prompts): recomputes each one from its stored operands, puts the result breps back in the boolean group and hides the operands. |","metadata":{"title":"BooleanUpdateApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#methods","collection":"scripting","hash":"03bfb72c0f1adae7829c58274c926e0c","indexed_by":"docs-index"}},{"content":"BooleanUpdateApi — ListDismantled\n\n```csharp\nIReadOnlyList<DismantledBoolean> BooleanUpdateApi.ListDismantled()\n```\n\nRead-only: the dismantled Artisan booleans in the document (boolean groups with no members), with their operation, stored operand ids and the operand ids that no longer exist (those need `replacements` in Update). Id is the boolean's unique id (RaObjectUserData.Unique).\n\nReturns `IReadOnlyList `.","metadata":{"title":"BooleanUpdateApi","section":"ListDismantled","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#listdismantled","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#listdismantled","collection":"scripting","hash":"5ccce8945728b2f8374fa5534ab2439b","indexed_by":"docs-index"}},{"content":"BooleanUpdateApi — Update\n\n```csharp\nUpdateResult BooleanUpdateApi.Update(\n    Guid booleanId,\n    IDictionary<string, string> replacements = null)\n```\n\nRebuilds one dismantled boolean by its unique id (see ListDismantled). `replacements` maps a dead operand id to the object that replaces it (old id -> new id, as strings); the new ids are stored in the boolean so later updates work without them. Returns counts and result ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `booleanId` | `Guid` | required |\n| `replacements` | `IDictionary ` | `null` |\n\nReturns `UpdateResult`.","metadata":{"title":"BooleanUpdateApi","section":"Update","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#update","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#update","collection":"scripting","hash":"eff22ca9595df1c97f38e0dea229590f","indexed_by":"docs-index"}},{"content":"BooleanUpdateApi — UpdateAll\n\n```csharp\nUpdateResult BooleanUpdateApi.UpdateAll()\n```\n\nRebuilds every dismantled Artisan boolean (the ArtisanBooleanUpdate command, no prompts): recomputes each one from its stored operands, puts the result breps back in the boolean group and hides the operands. Booleans with a dead operand id or a failed computation are skipped and reported in Messages. Returns counts and the result ids.\n\nReturns `UpdateResult`.","metadata":{"title":"BooleanUpdateApi","section":"UpdateAll","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#updateall","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean-update/#updateall","collection":"scripting","hash":"c36f4a95b2303ce8bef886eebfdf5c2d","indexed_by":"docs-index"}},{"content":"BooleanApi\n\nArtisan booleans, headless. Unlike plain rs.Boolean*, these bake the Artisan boolean group: the result breps live in a group carrying RaObjectUserData (\"Boolean\" + the operation parameters), the originals are HIDDEN (not deleted), and ArtisanEdit / ArtisanBooleanUpdate can dismantle and recompute the operation later. Same engine as the ArtisanBooleanUnion/Difference/Intersection/Split commands.\n\n```python\nfrom ArtisanPlugin.Scripting import BooleanApi\n```\n\nSee also the guide, API Reference › Booleans, and the Python package, `ra.boolean`.","metadata":{"title":"BooleanApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/","collection":"scripting","hash":"e039d58d58d40bf8b8eeb4a02afa899c","indexed_by":"docs-index"}},{"content":"BooleanApi — Methods\n\n| Method | |\n|---|---|\n| `Difference` | Subtracts `cutterIds` from `targetIds`. |\n| `Intersection` | Intersection of the two sets. |\n| `Split` | Splits `targetIds` with `cutterIds`. |\n| `Union` | Union of two or more solids. |\n\nDifference\n```csharp\nIReadOnlyList<Guid> BooleanApi.Difference(\n    IEnumerable<Guid> targetIds,\n    IEnumerable<Guid> cutterIds)\n```\n\nSubtracts `cutterIds` from `targetIds`. Returns the result brep ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `targetIds` | `IEnumerable ` | required |\n| `cutterIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BooleanApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#methods","collection":"scripting","hash":"79ba17bb0ebe74fd57cc13bb15d3291c","indexed_by":"docs-index"}},{"content":"BooleanApi — Intersection\n\n```csharp\nIReadOnlyList<Guid> BooleanApi.Intersection(\n    IEnumerable<Guid> targetIds,\n    IEnumerable<Guid> cutterIds)\n```\n\nIntersection of the two sets. Returns the result brep ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `targetIds` | `IEnumerable ` | required |\n| `cutterIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BooleanApi","section":"Intersection","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#intersection","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#intersection","collection":"scripting","hash":"67fb07b726ce9824ab7856cd70b53762","indexed_by":"docs-index"}},{"content":"BooleanApi — Split\n\n```csharp\nIReadOnlyList<Guid> BooleanApi.Split(\n    IEnumerable<Guid> targetIds,\n    IEnumerable<Guid> cutterIds)\n```\n\nSplits `targetIds` with `cutterIds`. Returns the result brep ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `targetIds` | `IEnumerable ` | required |\n| `cutterIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BooleanApi","section":"Split","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#split","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#split","collection":"scripting","hash":"df3412ec7d0ade2caeaf4c34c6a25fdc","indexed_by":"docs-index"}},{"content":"BooleanApi — Union\n\n```csharp\nIReadOnlyList<Guid> BooleanApi.Union(IEnumerable<Guid> objectIds)\n```\n\nUnion of two or more solids. Returns the ids of the result breps.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BooleanApi","section":"Union","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#union","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boolean/#union","collection":"scripting","hash":"ecaa374ddcee7557db2dd7acc554bfa3","indexed_by":"docs-index"}},{"content":"BoutiqueApi\n\nThe Boutique: ready-made designs (solitaires, trilogies, halos, bands, earrings...) grouped in collections that are downloaded from the RhinoArtisan catalog to this computer and imported into the document like the Boutique window does.\n\n```python\nfrom ArtisanPlugin.Scripting import BoutiqueApi\n```\n\nSee also the Python package, `ra.boutique`.","metadata":{"title":"BoutiqueApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/","collection":"scripting","hash":"5af8264a52a177218fe4e7769788e337","indexed_by":"docs-index"}},{"content":"BoutiqueApi — Methods\n\n| Method | |\n|---|---|\n| `Catalog` | The kits of the online Boutique catalog (rhinoartisan.com), each with whether it is installed and up to date. |\n| `Designs` | The designs of the Boutique collections installed on this computer. |\n| `Download` | Downloads and installs Boutique kits from the online catalog: the ones named in `names` (kit name or folder), or, when omitted, every kit not installed yet or updated since. |\n| `Insert` | Imports a Boutique design into the document, like the Boutique window's Open: `design` is its id or SKU (`collection`, a name or folder, narrows the search when several collections use the same one). |","metadata":{"title":"BoutiqueApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#methods","collection":"scripting","hash":"d9f35c03d7c601b73783bb8b83638b11","indexed_by":"docs-index"}},{"content":"BoutiqueApi — Catalog\n\n```csharp\nIReadOnlyList<BoutiqueKit> BoutiqueApi.Catalog()\n```\n\nThe kits of the online Boutique catalog (rhinoartisan.com), each with whether it is installed and up to date. Needs the internet; read-only.\n\nReturns `IReadOnlyList `.\n\nDesigns\n```csharp\nIReadOnlyList<BoutiqueCatalogDesign> BoutiqueApi.Designs(\n    string query = null,\n    string collection = null)\n```\n\nThe designs of the Boutique collections installed on this computer. `query` keeps those whose collection, name, description, SKU or id contain every word of it (case-insensitive); `collection` keeps one collection (name or folder). Read-only. Install more collections with Download().\n\n| Parameter | Type | Default |\n|---|---|---|\n| `query` | `string` | `null` |\n| `collection` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BoutiqueApi","section":"Catalog","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#catalog","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#catalog","collection":"scripting","hash":"3860c3d58509701388c65960271dedec","indexed_by":"docs-index"}},{"content":"BoutiqueApi — Download\n\n```csharp\nIReadOnlyList<BoutiqueKit> BoutiqueApi.Download(IEnumerable<string> names = null)\n```\n\nDownloads and installs Boutique kits from the online catalog: the ones named in `names` (kit name or folder), or, when omitted, every kit not installed yet or updated since. An update replaces the kit's folder. Returns the kits installed. Needs the internet.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `names` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BoutiqueApi","section":"Download","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#download","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#download","collection":"scripting","hash":"888e4c30c2e471dbf971971e5413a073","indexed_by":"docs-index"}},{"content":"BoutiqueApi — Insert\n\n```csharp\nIReadOnlyList<Guid> BoutiqueApi.Insert(\n    string design,\n    string collection = null,\n    string metal = null)\n```\n\nImports a Boutique design into the document, like the Boutique window's Open: `design` is its id or SKU (`collection`, a name or folder, narrows the search when several collections use the same one). `metal` WHITE, YELLOW or ROSE also sets the document's metal to that 18K gold, as the window's metal selector does. Returns the ids of the imported objects.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `design` | `string` | required |\n| `collection` | `string` | `null` |\n| `metal` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BoutiqueApi","section":"Insert","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#insert","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/boutique/#insert","collection":"scripting","hash":"ff540f2c4f3af73d01ced6cb44bd7c3b","indexed_by":"docs-index"}},{"content":"BypassApi\n\nBypass shanks — the ring body whose two arms cross past each other. Query-only for now: run ArtisanBypass in the UI once, then script every variant from the handle it leaves behind.\n\n```python\nfrom ArtisanPlugin.Scripting import BypassApi\n```\n\nSee also the guide, Shanks › Bypass, and the Python package, `ra.bypass`.","metadata":{"title":"BypassApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/","collection":"scripting","hash":"bed48ec16fed462c06aa23e3064db903","indexed_by":"docs-index"}},{"content":"BypassApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IBypass` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IBypass` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a bypass shank -- the ArtisanBypass tool, headless: a band whose two arms cross past each other instead of meeting. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IBypass` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"BypassApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#methods","collection":"scripting","hash":"52ae5331e4ad94fc21ab302332d918ca","indexed_by":"docs-index"}},{"content":"BypassApi — All\n\n```csharp\nIReadOnlyList<IBypass> BypassApi.All()\n```\n\n`IBypass` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IBypass> BypassApi.ByLayer(string layerName)\n```\n\n`IBypass` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"BypassApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#all","collection":"scripting","hash":"0e75796ea07aafe1f203e19c021df769","indexed_by":"docs-index"}},{"content":"BypassApi — Count\n\n```csharp\nint BypassApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIBypass BypassApi.Create(\n    double fingerDiameter = 0,\n    double topWidth = 0,\n    double topHeight = 0,\n    double bottomWidth = 0,\n    double bottomHeight = 0,\n    double armAngle = double.NaN,\n    double armHeight = 0,\n    double armWidth = 0,\n    bool withGems = false,\n    double gemSize = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a bypass shank -- the ArtisanBypass tool, headless: a band whose two arms cross past each other instead of meeting. Millimetres / degrees; 0 keeps the tool default (or the user's saved defaults). `fingerDiameter` 0 = the document's finger size. `withGems` turns on the stone run along the arms. Returns an IBypass handle: use its setters for the rest of the model (the handle covers the full parameter set). `element` = name of a saved bypass element (ElementsApi.List(\"ByPass\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `topWidth` | `double` | `0` |\n| `topHeight` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `bottomHeight` | `double` | `0` |\n| `armAngle` | `double` | `double.NaN` |\n| `armHeight` | `double` | `0` |\n| `armWidth` | `double` | `0` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IBypass`.","metadata":{"title":"BypassApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#count","collection":"scripting","hash":"c7e125cbd9a787ea2b5e10f8cd725253","indexed_by":"docs-index"}},{"content":"BypassApi — Find\n\n```csharp\nIBypass BypassApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IBypass`.\n\nSelected\n```csharp\nIReadOnlyList<IBypass> BypassApi.Selected()\n```\n\n`IBypass` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"BypassApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#find","collection":"scripting","hash":"4db562a195a268a19b1df36089af1b6b","indexed_by":"docs-index"}},{"content":"BypassApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIBypass\n*Handle* — extends `IParametricObject`.\n\nBypass ring shank: two arms that cross past each other instead of meeting. Multiple gems possible, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Gems` | `IBypassGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `Shank` | `IBypassShank` | get | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved ByPass element (ElementsApi.List(\"ByPass\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |","metadata":{"title":"BypassApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#handles-and-sections","collection":"scripting","hash":"8b8686d1b37803b2be61ef751924367a","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassShank\n\n*Section*.\n\nThe bypass band: the two band sections, the crossing arms and the optional bridge, plus the per-station cross-sections.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ArmAngle` | `double` | get | degrees |\n| `ArmHeight` | `double` | get | mm |\n| `ArmTangent` | `double` | get | |\n| `ArmWidth` | `double` | get | mm |\n| `BottomHeight` | `double` | get | mm |\n| `BottomWidth` | `double` | get | mm |\n| `BridgeAngle` | `double` | get | degrees |\n| `BridgeDiameter` | `double` | get | mm |\n| `BridgeEnabled` | `bool` | get | |\n| `BridgeThickness` | `double` | get | mm |\n| `BridgeWidth` | `double` | get | mm |\n| `CapDistance` | `double` | get | mm |\n| `Displacement` | `double` | get | how far the arms pass each other, mm |\n| `DisplacementStart` | `int` | get | rail point where the displacement starts |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `SharedProfile` | `bool` | get | every station uses the same profile asset |\n| `Stations` | `IReadOnlyList ` | get | |\n| `TipRotation` | `double` | get | roll of the tip about the rail tangent, degrees |\n| `TopHeight` | `double` | get | mm |\n| `TopWidth` | `double` | get | mm |\n| `UseStations` | `bool` | get | build from Stations instead of the top/bottom gradient |","metadata":{"title":"BypassApi","section":"IBypassShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassshank","collection":"scripting","hash":"3d46bf62edec2c41622082437c0839dd","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassShank\n\n| Method | |\n|---|---|\n| `void SetArmAngle(double degrees)` | |\n| `void SetArmHeight(double height)` | |\n| `void SetArmTangent(double tangent)` | |\n| `void SetArmWidth(double width)` | |\n| `void SetBottomHeight(double height)` | |\n| `void SetBottomWidth(double width)` | |\n| `void SetBridgeAngle(double degrees)` | |\n| `void SetBridgeDiameter(double diameter)` | |\n| `void SetBridgeEnabled(bool enabled)` | |\n| `void SetBridgeThickness(double thickness)` | |\n| `void SetBridgeWidth(double width)` | |\n| `void SetCapDistance(double distance)` | |\n| `void SetDisplacement(double displacement)` | |\n| `void SetDisplacementStart(int start)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetSharedProfile(bool shared)` | |\n| `void SetStation( int index, double position, double width, double height, string profileName = null)` | |\n| `void SetStations(IEnumerable stations)` | Replaces the whole station list. Positions run 0 (arm tip) to 1 (ring bottom); profileName omitted keeps the shank's profile. |\n| `void SetTipRotation(double degrees)` | |\n| `void SetTopHeight(double height)` | |\n| `void SetTopWidth(double width)` | |\n| `void SetUseStations(bool useStations)` | |","metadata":{"title":"BypassApi","section":"IBypassShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassshank","collection":"scripting","hash":"fe1e9a2dd661a783e64a272d1a76c979","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassStation\n\n*Section*.\n\nOne cross-section along the bypass rail. Stations let the band change width, height and profile as it runs from the arm tip to the ring bottom.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Height` | `double` | get | mm |\n| `Position` | `double` | get | 0 = arm tip, 1 = ring bottom |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Width` | `double` | get | mm |","metadata":{"title":"BypassApi","section":"IBypassStation","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassstation","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassstation","collection":"scripting","hash":"2a4e56120420bc6a1cc271e6e5926f6d","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassGems\n\n*Section*.\n\nThe gems row a bypass shank carries along each arm. A live view over the shank's stored parameters: getters read the current values, setters regenerate the shank in place (same Guid) and are license-gated.","metadata":{"title":"BypassApi","section":"IBypassGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","collection":"scripting","hash":"373e7385ec824d5763d539ae550a6470","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | arc covered by the row from each tip, degrees |\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BrightCut` | `double` | get | mm |\n| `DoubleProngSetting` | `bool` | get | |\n| `DrillAllowIntersection` | `bool` | get | |\n| `DrillEnabled` | `bool` | get | |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillVisible` | `bool` | get | |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `EndProngCount` | `int` | get | |\n| `ExtensionForManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | mm |\n| `GemShape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `GemSize` | `double` | get | mm |\n| `GemSizeEnd` | `double` | get | mm |\n| `GemSizeMiddle` | `double` | get | mm |\n| `GemSizeStart` | `double` | get | mm |\n| `Gradient` | `bool` | get | Stone-size gradient along the row. |\n| `GradientMiddlePosition` | `double` | get | 0..1 |\n| `GradientPoints` | `int` | get | |\n| `InnerHeight` | `double` | get | inner channel height, mm |\n| `InnerMargin` | `double` | get | mm |\n| `InnerWidth` | `double` | get | inner channel width, mm |\n| `Margin` | `double` | get | mm |\n| `MinDistance` | `double` | get | mm |\n| `ProngDiameter` | `double` | get | mm |\n| `ProngDistance` | `double` | get | mm |\n| `ProngGrow` | `double` | get | mm |\n| `ProngHeight` | `double` | get | mm |\n| `ProngMinDiameter` | `double` | get | mm |\n| `ProngSpacing` | `double` | get | mm |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `ScallopGemHeight` | `double` | get | |\n| `ScallopGemWidth` | `double` | get | Scalloped-setting proportions (percentages, not mm). |\n| `ScallopProngHeight` | `double` | get | |","metadata":{"title":"BypassApi","section":"IBypassGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","collection":"scripting","hash":"168e241d8f9f87827ce7a2eb443ae27c","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `ScallopProngWidth` | `double` | get | |\n| `ScallopRailHeight` | `double` | get | |\n| `ScallopRailWidth` | `double` | get | |\n| `ScallopRemoveChannel` | `bool` | get | |\n| `Vertical` | `double` | get | mm |","metadata":{"title":"BypassApi","section":"IBypassGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","collection":"scripting","hash":"f06dff2b5def8b6ae61819231ce21e02","indexed_by":"docs-index"}},{"content":"BypassApi — IBypassGems\n\n| Method | |\n|---|---|\n| `void SetAngle(double degrees)` | |\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetDoubleProngSetting(bool enabled)` | |\n| `void SetDrillAllowIntersection(bool allow)` | |\n| `void SetDrillEnabled(bool enabled)` | |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillVisible(bool visible)` | |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetEndProngCount(int count)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemShape(string shape)` | |\n| `void SetGemSize(double size)` | |\n| `void SetGemSizeGradient(double start, double middle, double end)` | |\n| `void SetGradient(bool enabled)` | |\n| `void SetGradientMiddlePosition(double position)` | 0..1 |\n| `void SetGradientPoints(int points)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerMargin(double margin)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMargin(double margin)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngDistance(double distance)` | |\n| `void SetProngGrow(double grow)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMinDiameter(double diameter)` | |\n| `void SetProngSpacing(double spacing)` | |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetScallopGem(double width, double height)` | |\n| `void SetScallopProng(double width, double height)` | |\n| `void SetScallopRail(double width, double height)` | |\n| `void SetScallopRemoveChannel(bool enabled)` | |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"BypassApi","section":"IBypassGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/bypass/#ibypassgems","collection":"scripting","hash":"c528950af09a2e519a344cdee461af59","indexed_by":"docs-index"}},{"content":"CabochonApi\n\nCabochon stones and their settings.\n\n```python\nfrom ArtisanPlugin.Scripting import CabochonApi\n```\n\nSee also the guide, Gemsets › Cabochon, and the Python package, `ra.cabochon`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ICabochon` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ICabochon` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Creates a cabochon stone (the ArtisanCabochon tool, headless) and adds it to the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Cabochons currently selected in the active doc. |","metadata":{"title":"CabochonApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/","collection":"scripting","hash":"6309a088a0d006c20ecea8df739cdf36","indexed_by":"docs-index"}},{"content":"CabochonApi — All\n\n```csharp\nIReadOnlyList<ICabochon> CabochonApi.All()\n```\n\n`ICabochon` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ICabochon> CabochonApi.ByLayer(string layerName)\n```\n\n`ICabochon` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CabochonApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#all","collection":"scripting","hash":"8acd390f66af88e2eb5768a3f38187d5","indexed_by":"docs-index"}},{"content":"CabochonApi — Count\n\n```csharp\nint CabochonApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nICabochon CabochonApi.Create(\n    double x = 0,\n    double y = 0,\n    double z = 0,\n    string shape = null,\n    string type = null,\n    double? angle = null,\n    double? girdleHeight = null,\n    Plane? plane = null,\n    double? girdleAngle = null)\n```\n\nCreates a cabochon stone (the ArtisanCabochon tool, headless) and adds it to the active document. Unlike Bezel/AdvancedBezel, a cabochon does NOT wrap a mother gem: it is its own stone, placed on `plane` (omitted = world XY, like the panel's \"add on plane\"). All dimensional arguments are millimetres. Pass 0 (or omit) to keep the tool's default -- or the user's saved defaults -- for that parameter (x 4, y 8, z 2, angle 15 degrees, girdleHeight 1). `shape` accepts case-insensitive CabochonShape names (\"Round\", \"Oval\", \"Rectangular\", \"Heart\", \"Pear\", \"Marquise\", \"Diamond\"); `type` accepts CabochonType names (\"Cabochon\", \"FlatTopSingleBevel\", \"FlatTopDoubleBevel\", \"BuffTopSingleBevel\", \"BuffTopDoubleBevel\"). Omitted/null keeps the default (Round / Cabochon or the saved defaults). Throws ArgumentException for an unknown shape/type name and InvalidOperationException when the geometry fails to compute.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `x` | `double` | `0` |\n| `y` | `double` | `0` |\n| `z` | `double` | `0` |\n| `shape` | `string` | `null` |\n| `type` | `string` | `null` |\n| `angle` | `double?` | `null` |\n| `girdleHeight` | `double?` | `null` |\n| `plane` | `Plane?` | `null` |\n| `girdleAngle` | `double?` | `null` |\n\nReturns `ICabochon`.","metadata":{"title":"CabochonApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#count","collection":"scripting","hash":"bd338af1d2777c7ee7d4b9c1e12665eb","indexed_by":"docs-index"}},{"content":"CabochonApi — Find\n\n```csharp\nICabochon CabochonApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ICabochon`.\n\nSelected\n```csharp\nIReadOnlyList<ICabochon> CabochonApi.Selected()\n```\n\nCabochons currently selected in the active doc. Empty list if nothing is selected or the selection contains no cabochons.\n\nReturns `IReadOnlyList `.","metadata":{"title":"CabochonApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#find","collection":"scripting","hash":"9b226a550d9db46d2f3a821654b79c68","indexed_by":"docs-index"}},{"content":"CabochonApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"CabochonApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#handles-and-sections","collection":"scripting","hash":"ff6eeeaa0fe0a2cbe6e9fa7628588818","indexed_by":"docs-index"}},{"content":"CabochonApi — ICabochon\n\n*Handle* — extends `IParametricObject`.\n\nA cabochon is its own stone (round / oval / rectangular / ... dome cut): it is not built around a mother gem, so it extends IParametricObject directly and MotherGemId is always Guid.Empty. The setters recompute the stone and replace it in place, keeping its Guid (the same thing the panel does on accept), and take LITERAL values: a 0 angle is a straight wall and a 0 girdle height is no girdle.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | degrees |\n| `CutType` | `string` | get | CabochonType name (\"Cabochon\", \"FlatTopSingleBevel\", ...) |\n| `GirdleAngle` | `double` | get | degrees |\n| `GirdleHeight` | `double` | get | millimetres |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Shape` | `string` | get | CabochonShape name (\"Round\", \"Oval\", ...) |\n| `SizeX` | `double` | get | millimetres |\n| `SizeY` | `double` | get | millimetres |\n| `SizeZ` | `double` | get | dome height, millimetres |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAngle(double degrees)` | 0 = straight wall |\n| `void SetCutType(string cutType)` | see CabochonApi.Types() |\n| `void SetGirdleAngle(double degrees)` | |\n| `void SetGirdleHeight(double girdleHeight)` | 0 = no girdle |\n| `void SetShape(string shape)` | see CabochonApi.Shapes() |\n| `void SetSize(double x, double y, double z)` | |\n| `void SetSizeX(double x)` | |\n| `void SetSizeY(double y)` | |\n| `void SetSizeZ(double z)` | |","metadata":{"title":"CabochonApi","section":"ICabochon","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#icabochon","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cabochon/#icabochon","collection":"scripting","hash":"6b2a70dd4f33c36b5aa13c77542c15d9","indexed_by":"docs-index"}},{"content":"CathedralApi\n\nCathedral shanks: arms rising toward the setting.\n\n```python\nfrom ArtisanPlugin.Scripting import CathedralApi\n```\n\nSee also the guide, Shanks › Cathedral, and the Python package, `ra.cathedral`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ICathedral` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ICathedral` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a cathedral ring shank (the ArtisanCathedral tool, headless): a band whose arms rise toward the setting, optionally with a pavé row of gems along the top. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Cathedrals currently selected in the active doc. |","metadata":{"title":"CathedralApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/","collection":"scripting","hash":"75121dbb0db0c5124de24b331c6b8c06","indexed_by":"docs-index"}},{"content":"CathedralApi — All\n\n```csharp\nIReadOnlyList<ICathedral> CathedralApi.All()\n```\n\n`ICathedral` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ICathedral> CathedralApi.ByLayer(string layerName)\n```\n\n`ICathedral` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CathedralApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#all","collection":"scripting","hash":"bf6dd35abbc21a195c4c025fe44fe229","indexed_by":"docs-index"}},{"content":"CathedralApi — Count\n\n```csharp\nint CathedralApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"CathedralApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#count","collection":"scripting","hash":"8a229a80208c67139f3eb16508253ede","indexed_by":"docs-index"}},{"content":"CathedralApi — Create\n\n```csharp\nICathedral CathedralApi.Create(\n    double topWidth = 0,\n    double topHeight = 0,\n    double bottomWidth = 0,\n    double bottomHeight = 0,\n    double armWidth = 0,\n    double armHeight = 0,\n    double fingerDiameter = 0,\n    bool withGems = false,\n    double gemSize = 0,\n    double gemsAngle = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a cathedral ring shank (the ArtisanCathedral tool, headless): a band whose arms rise toward the setting, optionally with a pavé row of gems along the top. This is the shank under most halo and solitaire designs. Millimetres; 0 keeps the tool default (or the user's saved defaults): topWidth 2.5, topHeight 1.9, bottomWidth 3.5, bottomHeight 1.8, armWidth 4.5, armHeight 3.5. `fingerDiameter` 0 = the document's configured finger size. `withGems` true enables the gem row (`gemSize` default 1.3 mm, `gemsAngle` default 180 degrees of the shank covered). `profile` picks a RING_PROFILE asset by name; omitted = the default profile. `plane` omitted = world XY. Returns an ICathedral handle to the new shank. `element` = name of a saved cathedral element (ElementsApi.List(\"Cathedral\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `topWidth` | `double` | `0` |\n| `topHeight` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `bottomHeight` | `double` | `0` |\n| `armWidth` | `double` | `0` |\n| `armHeight` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `gemsAngle` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `ICathedral`.","metadata":{"title":"CathedralApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#create","collection":"scripting","hash":"4ab59aeeca523c21f19032d22f97226c","indexed_by":"docs-index"}},{"content":"CathedralApi — Find\n\n```csharp\nICathedral CathedralApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ICathedral`.\n\nSelected\n```csharp\nIReadOnlyList<ICathedral> CathedralApi.Selected()\n```\n\nCathedrals currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"CathedralApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#find","collection":"scripting","hash":"baa27ad4a3ffc05310d462557ffadff3","indexed_by":"docs-index"}},{"content":"CathedralApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `ICathedralGems`.\n\nICathedral\n*Handle* — extends `IParametricObject`.\n\nCathedral ring shank (multiple gems possible) — no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Gems` | `ICathedralGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `Shank` | `ICathedralShank` | get | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBottomHeight(double height)` | |\n| `void SetBottomWidth(double width)` | |\n| `void SetElement(string element)` | Applies a saved Cathedral element (ElementsApi.List(\"Cathedral\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `void SetTopHeight(double height)` | |\n| `void SetTopWidth(double width)` | Shortcuts for the most common edits — same effect as the equivalent Shank setters. |","metadata":{"title":"CathedralApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#handles-and-sections","collection":"scripting","hash":"dfc26f1e2c884f64c0c9cab8b8c5c02d","indexed_by":"docs-index"}},{"content":"CathedralApi — ICathedralShank\n\n*Section*.\n\nThe cathedral band itself: the two band sections, the rising arms and the bridge that spans between them.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ArmAngle` | `double` | get | degrees |\n| `ArmHeight` | `double` | get | how high the arms climb over the finger circle, mm |\n| `ArmTangent` | `double` | get | tangency of the arm transition |\n| `ArmWidth` | `double` | get | opening between the rising arms, mm |\n| `BottomHeight` | `double` | get | mm |\n| `BottomWidth` | `double` | get | band section at the bottom, mm |\n| `BridgeDiameter` | `double` | get | mm |\n| `BridgeEnabled` | `bool` | get | the bridge spanning between the arms |\n| `BridgeFillet` | `double` | get | mm |\n| `BridgeThickness` | `double` | get | mm |\n| `BridgeWidth` | `double` | get | mm |\n| `CapDistance` | `double` | get | mm |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `TopHeight` | `double` | get | mm |\n| `TopWidth` | `double` | get | band section at the top, mm |\n\n| Method | |\n|---|---|\n| `void SetArmAngle(double degrees)` | |\n| `void SetArmHeight(double height)` | |\n| `void SetArmTangent(double tangent)` | |\n| `void SetArmWidth(double width)` | |\n| `void SetBottomHeight(double height)` | |\n| `void SetBottomWidth(double width)` | |\n| `void SetBridgeDiameter(double diameter)` | |\n| `void SetBridgeEnabled(bool enabled)` | |\n| `void SetBridgeFillet(double fillet)` | |\n| `void SetBridgeThickness(double thickness)` | |\n| `void SetBridgeWidth(double width)` | |\n| `void SetCapDistance(double distance)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetTopHeight(double height)` | |\n| `void SetTopWidth(double width)` | |","metadata":{"title":"CathedralApi","section":"ICathedralShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#icathedralshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cathedral/#icathedralshank","collection":"scripting","hash":"a1ecae039610c09f23628a3768bdeb62","indexed_by":"docs-index"}},{"content":"ChainApi\n\nRepeat link objects along a curve (the ArtisanChain tool).\n\n```python\nfrom ArtisanPlugin.Scripting import ChainApi\n```\n\nSee also the guide, Accessories › Chain, and the Python package, `ra.chain`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Places `copies` transformed copies of the given objects along the curve (alternating odd/even rotations are the tool's advanced options and keep their saved defaults). |","metadata":{"title":"ChainApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/chain/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/chain/","collection":"scripting","hash":"fc62600cd3aed6c8240ab4704282650d","indexed_by":"docs-index"}},{"content":"ChainApi — Create\n\n```csharp\nIReadOnlyList<Guid> ChainApi.Create(\n    IEnumerable<Guid> objectIds,\n    Guid curveId,\n    int copies = 0)\n```\n\nPlaces `copies` transformed copies of the given objects along the curve (alternating odd/even rotations are the tool's advanced options and keep their saved defaults). Returns the ids of the copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `curveId` | `Guid` | required |\n| `copies` | `int` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ChainApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/chain/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/chain/#create","collection":"scripting","hash":"c47cf40a75d69c64ed5f37a483b7db2a","indexed_by":"docs-index"}},{"content":"ChannelApi\n\nChannel setting along a curve -- the ArtisanChannel tool, headless: a metal channel with a run of gems inside, following an existing curve.\n\n```python\nfrom ArtisanPlugin.Scripting import ChannelApi\n```\n\nSee also the guide, Gemsets › Channel, and the Python package, `ra.channel`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | Channels are baked as groups carrying RaObjectUserData, so they resolve like the other group-based types. |\n| `ByLayer` | `IChannel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds the channel along `curveId`. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForCurve` | The channels built on `curveId`. |\n| `Selected` | `IChannel` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"ChannelApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/","collection":"scripting","hash":"4a2e8f1e9ff50aa0aeedbf58f3728574","indexed_by":"docs-index"}},{"content":"ChannelApi — All\n\n```csharp\nIReadOnlyList<IChannel> ChannelApi.All()\n```\n\nChannels are baked as groups carrying RaObjectUserData, so they resolve like the other group-based types. Create returns the member ids; these return handles you can read and edit.\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IChannel> ChannelApi.ByLayer(string layerName)\n```\n\n`IChannel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ChannelApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#all","collection":"scripting","hash":"0bc5c415b2af0ff163ed612f6d2c95d4","indexed_by":"docs-index"}},{"content":"ChannelApi — Count\n\n```csharp\nint ChannelApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"ChannelApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#count","collection":"scripting","hash":"5e8d67d0a0895ffcc919fa45a1ddfbe8","indexed_by":"docs-index"}},{"content":"ChannelApi — Create\n\n```csharp\nIReadOnlyList<Guid> ChannelApi.Create(\n    Guid curveId,\n    double gemSize = 0,\n    double width = 0,\n    double height = 0,\n    double minDistance = 0,\n    IEnumerable<Guid> orientationIds = null,\n    string profile = null,\n    string prongType = null,\n    string gemShape = null,\n    string runMode = null,\n    double positionZ = double.NaN,\n    double rotation = double.NaN,\n    double gemInside = double.NaN,\n    double vertical = double.NaN,\n    bool? forceEvenNumber = null,\n    double prongHeight = 0)\n```\n\nBuilds the channel along `curveId`. Millimetres; 0 keeps the tool default (or the user's saved defaults): gemSize 1.8, width 3, height 2, minDistance 0.1. `orientationIds` optionally orient the channel onto those surfaces/breps. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the tool's default (the \"domed rectangle\" profile when available). Open curves run as a segment, closed curves all the way around, exactly like the tool. Returns the ids of the created objects (metal, then gems), all grouped as one editable Channel.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `gemSize` | `double` | `0` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `minDistance` | `double` | `0` |\n| `orientationIds` | `IEnumerable ` | `null` |\n| `profile` | `string` | `null` |\n| `prongType` | `string` | `null` |\n| `gemShape` | `string` | `null` |\n| `runMode` | `string` | `null` |\n| `positionZ` | `double` | `double.NaN` |\n| `rotation` | `double` | `double.NaN` |\n| `gemInside` | `double` | `double.NaN` |\n| `vertical` | `double` | `double.NaN` |\n| `forceEvenNumber` | `bool?` | `null` |\n| `prongHeight` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ChannelApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#create","collection":"scripting","hash":"67d653293132e1b196c02f3ed3b1a740","indexed_by":"docs-index"}},{"content":"ChannelApi — Find\n\n```csharp\nIChannel ChannelApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IChannel`.\n\nForCurve\n```csharp\nIReadOnlyList<IChannel> ChannelApi.ForCurve(Guid curveId)\n```\n\nThe channels built on `curveId`.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ChannelApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#find","collection":"scripting","hash":"c5181dfc246a70cdb172a8f6ce2246b7","indexed_by":"docs-index"}},{"content":"ChannelApi — Selected\n\n```csharp\nIReadOnlyList<IChannel> ChannelApi.Selected()\n```\n\n`IChannel` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"ChannelApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#selected","collection":"scripting","hash":"261e169ceffcdb86bd7be0740177631f","indexed_by":"docs-index"}},{"content":"ChannelApi — IChannel\n\n*Handle* — extends `IParametricObject`.\n\nA channel setting: the metal rail built along a curve plus the run of stones set into it. Setters regenerate it in place (the group keeps its id) and take LITERAL values -- 0 and negatives are allowed where the parameter is signed.","metadata":{"title":"ChannelApi","section":"IChannel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","collection":"scripting","hash":"3383ba1dd3dd0cb17a12a624ee97afa5","indexed_by":"docs-index"}},{"content":"ChannelApi — IChannel\n\n| Property | Type | | |\n|---|---|---|---|\n| `AutomaticProngSize` | `bool` | get | |\n| `BooleanCutters` | `bool` | get | |\n| `BrightCut` | `double` | get | |\n| `CurveId` | `Guid` | get | Rhino id of the curve the channel was built on. |\n| `FilletFactor` | `double` | get | |\n| `FlipCurve` | `bool` | get | reverse the stone order and start point |\n| `ForceEvenNumber` | `bool` | get | |\n| `GemInside` | `double` | get | signed |\n| `GemShape` | `string` | get | The stones and how they are held. \"ROUND\" or \"PRINCESS\" |\n| `GemSize` | `double` | get | |\n| `Height` | `double` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `InnerHeight` | `double` | get | |\n| `InnerWidth` | `double` | get | |\n| `InvertSegment` | `bool` | get | closed curve: take the other arc |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `Margin` | `double` | get | SEGMENT: gap left at each end, mm |\n| `MinDistance` | `double` | get | |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `PositionZ` | `double` | get | signed |\n| `ProfileName` | `string` | get | CHANNEL_PROFILE asset name |\n| `ProngDistance` | `double` | get | signed |\n| `ProngEndMode` | `string` | get | \"SINGLE\" or \"DOUBLE\" |\n| `ProngExternalDiameter` | `double` | get | |\n| `ProngHeight` | `double` | get | |\n| `ProngInternalDiameter` | `double` | get | |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `Rotation` | `double` | get | degrees, signed |\n| `RunMode` | `string` | get | How much of the curve is used: \"FULL\" (the whole loop) or \"SEGMENT\". |\n| `Vertical` | `double` | get | signed |\n| `Width` | `double` | get | The metal rail section. |","metadata":{"title":"ChannelApi","section":"IChannel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","collection":"scripting","hash":"7a4e44c79ae4fd4f3ab690c89ef3224e","indexed_by":"docs-index"}},{"content":"ChannelApi — IChannel\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAutomaticProngSize(bool automatic)` | |\n| `void SetBooleanCutters(bool booleanCutters)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetFilletFactor(double factor)` | |\n| `void SetFlipCurve(bool flip)` | |\n| `void SetForceEvenNumber(bool forceEven)` | |\n| `void SetGemInside(double gemInside)` | signed |\n| `void SetGemShape(string shape)` | ROUND \\| PRINCESS |\n| `void SetGemSize(double size)` | |\n| `void SetHeight(double height)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetInvertSegment(bool invert)` | |\n| `void SetMargin(double margin)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetPositionZ(double positionZ)` | signed |\n| `void SetProfile(string assetName)` | CHANNEL_PROFILE asset |\n| `void SetProngDiameters(double external, double internalDiameter)` | |\n| `void SetProngDistance(double distance)` | signed |\n| `void SetProngEndMode(string endMode)` | SINGLE \\| DOUBLE |\n| `void SetProngHeight(double height)` | |\n| `void SetProngType(string prongType)` | NONE \\| SHARED \\| SCALLOPED |\n| `void SetRotation(double degrees)` | signed |\n| `void SetRunMode(string runMode)` | FULL \\| SEGMENT |\n| `void SetVertical(double vertical)` | signed |\n| `void SetWidth(double width)` | |","metadata":{"title":"ChannelApi","section":"IChannel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/channel/#ichannel","collection":"scripting","hash":"9cce4ec01ddf5a42f794f766679846b0","indexed_by":"docs-index"}},{"content":"CharmApi\n\nFlat charm from the default charm profile (the ArtisanCharm tool).\n\n```python\nfrom ArtisanPlugin.Scripting import CharmApi\n```\n\nSee also the guide, Accessories › Charm, and the Python package, `ra.charm`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: width 8, height 6, thickness 2.8. |\n\nCreate\n```csharp\nGuid CharmApi.Create(\n    Plane? plane = null,\n    double width = 0,\n    double height = 0,\n    double thickness = 0,\n    string profile = null,\n    string element = null)\n```\n\nDefaults: width 8, height 6, thickness 2.8. `element` = name of a saved Charm element (ElementsApi.List(\"Charm\")) to start from; explicit arguments override it (`profile` replaces its curve).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"CharmApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/charm/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/charm/","collection":"scripting","hash":"a5c8cdb009268731f8154f60e157bdb5","indexed_by":"docs-index"}},{"content":"ClassRingApi\n\nClass rings.\n\n```python\nfrom ArtisanPlugin.Scripting import ClassRingApi\n```\n\nSee also the Python package, `ra.class_ring`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IClassRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IClassRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a class ring (the ArtisanClassRing tool, headless): a heavy signet-style body with a flat top seat and one stone on it — a faceted gem or a cabochon, regenerated with the ring. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Class rings currently selected in the active doc. |","metadata":{"title":"ClassRingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/","collection":"scripting","hash":"1fbbc8eb79f8297e3a1198ca00a3ff24","indexed_by":"docs-index"}},{"content":"ClassRingApi — All\n\n```csharp\nIReadOnlyList<IClassRing> ClassRingApi.All()\n```\n\n`IClassRing` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IClassRing> ClassRingApi.ByLayer(string layerName)\n```\n\n`IClassRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClassRingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#all","collection":"scripting","hash":"e486d751be03501214036e5fe6fa438c","indexed_by":"docs-index"}},{"content":"ClassRingApi — Count\n\n```csharp\nint ClassRingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"ClassRingApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#count","collection":"scripting","hash":"6613fdbe9b137d87ad89793bcc1bd5e3","indexed_by":"docs-index"}},{"content":"ClassRingApi — Create\n\n```csharp\nIClassRing ClassRingApi.Create(\n    double topWidth = 0,\n    double topHeight = 0,\n    double depth = 0,\n    double offset = 0,\n    double standHeight = 0,\n    double bottomWidth = 0,\n    double bottomHeight = 0,\n    double sideWidth = 0,\n    double topSurfaceHeight = 0,\n    double angle = 0,\n    string gemShape = null,\n    string stoneType = null,\n    double cabochonHeight = 0,\n    double moveZ = double.NaN,\n    double fingerDiameter = 0,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a class ring (the ArtisanClassRing tool, headless): a heavy signet-style body with a flat top seat and one stone on it — a faceted gem or a cabochon, regenerated with the ring. Millimetres; 0 keeps the tool default (or the user's saved defaults). Top seat: topWidth 2, topHeight 3, depth 1, offset 1, standHeight 1. Shank: bottomWidth 2, bottomHeight 2, sideWidth 2, topSurfaceHeight 1, angle 3 degrees. `gemShape` ROUND | OVAL (default) | CUSHION; `stoneType` GEMSTONE (default) | CABOCHON with `cabochonHeight` (2) and `moveZ` (stone lift, NaN = default 0). `fingerDiameter` 0 = document ring size. `plane` omitted = world ZX (the tool's own frame: finger axis along world Y). `element` = name of a saved ClassRing element (ElementsApi.List(\"ClassRing\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an IClassRing handle to the new ring (its stone is a child).","metadata":{"title":"ClassRingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#create","collection":"scripting","hash":"f364bfd3e86864ec3e69702b1c338e45","indexed_by":"docs-index"}},{"content":"ClassRingApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `topWidth` | `double` | `0` |\n| `topHeight` | `double` | `0` |\n| `depth` | `double` | `0` |\n| `offset` | `double` | `0` |\n| `standHeight` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `bottomHeight` | `double` | `0` |\n| `sideWidth` | `double` | `0` |\n| `topSurfaceHeight` | `double` | `0` |\n| `angle` | `double` | `0` |\n| `gemShape` | `string` | `null` |\n| `stoneType` | `string` | `null` |\n| `cabochonHeight` | `double` | `0` |\n| `moveZ` | `double` | `double.NaN` |\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IClassRing`.","metadata":{"title":"ClassRingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#create","collection":"scripting","hash":"979a4907c2cfc207950e56484d008890","indexed_by":"docs-index"}},{"content":"ClassRingApi — Find\n\n```csharp\nIClassRing ClassRingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IClassRing`.\n\nSelected\n```csharp\nIReadOnlyList<IClassRing> ClassRingApi.Selected()\n```\n\nClass rings currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClassRingApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#find","collection":"scripting","hash":"856579c6c01d0d2223fa7a36ba0d934d","indexed_by":"docs-index"}},{"content":"ClassRingApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"ClassRingApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#handles-and-sections","collection":"scripting","hash":"95b100d9f334c3ebfbdfae08517aa7b1","indexed_by":"docs-index"}},{"content":"ClassRingApi — IClassRing\n\n*Handle* — extends `IParametricObject`.\n\nClass ring (the ArtisanClassRing tool): a signet-like body with a flat top seat holding one stone (faceted gem or cabochon). The stone is a child object regenerated together with the ring — it is NOT a free-standing gem, so it has no MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | |\n| `BottomHeight` | `double` | get | |\n| `BottomWidth` | `double` | get | Shank (mm / degrees) |\n| `CabochonHeight` | `double` | get | |\n| `Children` | `IReadOnlyList ` | get | The baked stone (gem or cabochon brep), if any. |\n| `Depth` | `double` | get | |\n| `GemShape` | `string` | get | Stone: \"ROUND\" \\| \"OVAL\" \\| \"CUSHION\"; \"GEMSTONE\" \\| \"CABOCHON\". |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `MoveZ` | `double` | get | |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Offset` | `double` | get | |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `SideWidth` | `double` | get | |\n| `StandHeight` | `double` | get | |\n| `StoneType` | `string` | get | |\n| `TopHeight` | `double` | get | |\n| `TopSurfaceHeight` | `double` | get | |\n| `TopWidth` | `double` | get | Top seat (mm) |","metadata":{"title":"ClassRingApi","section":"IClassRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#iclassring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#iclassring","collection":"scripting","hash":"f6f9891f0e197ef46b4736c8d5064287","indexed_by":"docs-index"}},{"content":"ClassRingApi — IClassRing\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAngle(double angle)` | |\n| `void SetBottomHeight(double bottomHeight)` | |\n| `void SetBottomWidth(double bottomWidth)` | |\n| `void SetCabochonHeight(double cabochonHeight)` | |\n| `void SetDepth(double depth)` | |\n| `void SetElement(string element)` | Applies a saved ClassRing element (ElementsApi.List(\"ClassRing\")) to this ring: its top, shank and stone replace the current ones, the ring size stays, and the ring and its stone regenerate in place (same id). |\n| `void SetFingerDiameter(double fingerDiameter)` | |\n| `void SetGem( string gemShape = null, string stoneType = null, double cabochonHeight = 0, double moveZ = double.NaN)` | |\n| `void SetGemShape(string gemShape)` | |\n| `void SetMoveZ(double moveZ)` | |\n| `void SetOffset(double offset)` | |\n| `void SetShank( double bottomWidth = 0, double bottomHeight = 0, double sideWidth = 0, double topSurfaceHeight = 0, double angle = 0)` | |\n| `void SetSideWidth(double sideWidth)` | |\n| `void SetStandHeight(double standHeight)` | |\n| `void SetStoneType(string stoneType)` | |\n| `void SetTopHeight(double topHeight)` | |\n| `void SetTopSide( double topWidth = 0, double topHeight = 0, double depth = 0, double offset = 0, double standHeight = 0)` | Mutations regenerate the ring and its stone in place (same ring Guid; the stone gets a new id) and call LicenseGate.RequireValid() first. Millimetres; 0 keeps the current value. |\n| `void SetTopSurfaceHeight(double topSurfaceHeight)` | |\n| `void SetTopWidth(double topWidth)` | Single-value shortcuts (the ones edit_object can drive). |","metadata":{"title":"ClassRingApi","section":"IClassRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#iclassring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/class-ring/#iclassring","collection":"scripting","hash":"1ca3a650551cdc14de614dfcd6f10dd6","indexed_by":"docs-index"}},{"content":"ClassicApi\n\nClassic ring shanks: comfort-fit bands at the document finger size, optionally with a stone row.\n\n```python\nfrom ArtisanPlugin.Scripting import ClassicApi\n```\n\nSee also the guide, Shanks › Classic, and the Python package, `ra.classic`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IClassic` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IClassic` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a classic ring shank (the ArtisanClassic tool, headless): a comfort-fit band at the document's finger size, optionally with a row of gems around the top. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Classics currently selected in the active doc. |","metadata":{"title":"ClassicApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/","collection":"scripting","hash":"2095296be4ecee564cbf1cd6ca861c44","indexed_by":"docs-index"}},{"content":"ClassicApi — All\n\n```csharp\nIReadOnlyList<IClassic> ClassicApi.All()\n```\n\n`IClassic` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IClassic> ClassicApi.ByLayer(string layerName)\n```\n\n`IClassic` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClassicApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#all","collection":"scripting","hash":"2784a0411b86adccbf4ea1a137569987","indexed_by":"docs-index"}},{"content":"ClassicApi — Count\n\n```csharp\nint ClassicApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIClassic ClassicApi.Create(\n    double width = 0,\n    double height = 0,\n    double fingerDiameter = 0,\n    bool withGems = false,\n    double gemSize = 0,\n    double gemsAngle = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a classic ring shank (the ArtisanClassic tool, headless): a comfort-fit band at the document's finger size, optionally with a row of gems around the top. This is the scriptable way to give a design its ring body. Millimetres; 0 keeps the tool default (or the user's saved defaults): width 3, height 2. `fingerDiameter` 0 = the document's configured finger size. `withGems` true enables the gem row (`gemSize` default 1.2 mm, `gemsAngle` default 180 degrees of the shank covered). `profile` picks a RING_PROFILE asset by name; omitted = the default profile. `plane` omitted = world XY. Returns an IClassic handle to the new shank. `element` = name of a saved Classic element (ElementsApi.List(\"Classic\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `gemsAngle` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IClassic`.","metadata":{"title":"ClassicApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#count","collection":"scripting","hash":"0fc2935811012831b5d790bdf80ed42d","indexed_by":"docs-index"}},{"content":"ClassicApi — Find\n\n```csharp\nIClassic ClassicApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IClassic`.\n\nSelected\n```csharp\nIReadOnlyList<IClassic> ClassicApi.Selected()\n```\n\nClassics currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClassicApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#find","collection":"scripting","hash":"a5caba1f1fad7aacfa4c20e3050dc1f8","indexed_by":"docs-index"}},{"content":"ClassicApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIClassic\n*Handle* — extends `IParametricObject`.\n\nClassic ring shank (multiple gems possible) — no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Advanced` | `IClassicAdvanced` | get | |\n| `BottomProfile` | `IClassicProfile` | get | |\n| `ExternalProfile` | `IClassicExternalProfile` | get | |\n| `Gems` | `IClassicGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MidProfile` | `IClassicProfile` | get | |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `TopProfile` | `IClassicProfile` | get | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Classic element (ElementsApi.List(\"Classic\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `void SetHeight(double height)` | |\n| `void SetWidth(double width)` | Shortcuts for the two most common edits — same effect as TopProfile.SetWidth / TopProfile.SetHeight. |","metadata":{"title":"ClassicApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#handles-and-sections","collection":"scripting","hash":"ead8254c938e7e2725b1794ffcaa94aa","indexed_by":"docs-index"}},{"content":"ClassicApi — IClassicProfile\n\n*Section*.\n\nOne of the shank's three section profiles (top / mid / bottom). The top profile is always enabled; mid and bottom are optional.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Comfort` | `double` | get | mm — used when Type is \"COMFORT\" |\n| `Displacement` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `Height` | `double` | get | mm |\n| `Orientation` | `int` | get | 0 = Natural, 1 = Reverse (flips the profile curve) |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Rotation` | `double` | get | degrees |\n| `Thickness` | `double` | get | mm — used when Type is \"THICKNESS\" |\n| `Type` | `string` | get | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetComfort(double comfort)` | |\n| `void SetDisplacement(double displacement)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetHeight(double height)` | |\n| `void SetOrientation(int orientation)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetRotation(double degrees)` | |\n| `void SetThickness(double thickness)` | |\n| `void SetType(string type)` | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `void SetWidth(double width)` | |","metadata":{"title":"ClassicApi","section":"IClassicProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicprofile","collection":"scripting","hash":"f55d536af0e83ad54ec70cecb4673f27","indexed_by":"docs-index"}},{"content":"ClassicApi — IClassicGems\n\n*Section*.\n\nThe gems row a shank can carry around its band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | degrees of the band covered by gems (180 = top half) |\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BrightCut` | `double` | get | bright-cut width, mm |\n| `DrillAllowIntersection` | `bool` | get | |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `ExtensionForManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | how deep the gems sit inside, mm |\n| `GemShape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `GemSize` | `double` | get | mm |\n| `InnerHeight` | `double` | get | inner channel height, mm |\n| `InnerWidth` | `double` | get | inner channel width, mm |\n| `Margin` | `double` | get | side margin, mm |\n| `MinDistance` | `double` | get | minimum distance between gems, mm |\n| `ProngDiameter` | `double` | get | mm — used when AutomaticProngDiameter is false |\n| `ProngHeight` | `double` | get | mm |\n| `ProngMoveInZ` | `double` | get | mm |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `Vertical` | `double` | get | vertical displacement of the row, mm |","metadata":{"title":"ClassicApi","section":"IClassicGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicgems","collection":"scripting","hash":"f08a56911bf898e3edbec2629983b264","indexed_by":"docs-index"}},{"content":"ClassicApi — IClassicGems\n\n| Method | |\n|---|---|\n| `void SetAngle(double degrees)` | |\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetDrillAllowIntersection(bool allow)` | |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemShape(string shape)` | |\n| `void SetGemSize(double size)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMargin(double margin)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMoveInZ(double move)` | |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"ClassicApi","section":"IClassicGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicgems","collection":"scripting","hash":"b8abc236e07547c0931578b47bc68402","indexed_by":"docs-index"}},{"content":"ClassicApi — IClassicExternalProfile\n\n*Section*.\n\nThe optional external profile carved on the shank's outside face.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Bottom` | `double` | get | external height at the bottom, mm |\n| `Enabled` | `bool` | get | |\n| `Mid` | `double` | get | external height at the middle, mm |\n| `ProfileName` | `string` | get | EXTERNAL_RING_PROFILE asset name, \"\" when unset |\n| `Top` | `double` | get | external height at the top, mm |\n\n| Method | |\n|---|---|\n| `void SetBottom(double height)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetMid(double height)` | |\n| `void SetProfile(string assetName)` | EXTERNAL_RING_PROFILE asset by name — list them with AssetsApi.List(\"EXTERNAL_RING_PROFILE\") |\n| `void SetTop(double height)` | |","metadata":{"title":"ClassicApi","section":"IClassicExternalProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicexternalprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicexternalprofile","collection":"scripting","hash":"5b1b1384336e5aefdf279bc73877830d","indexed_by":"docs-index"}},{"content":"ClassicApi — IClassicAdvanced\n\n*Section*.\n\nThe classic shank's Advanced section: the opening at the bottom of the band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CutBumping` | `double` | get | mm — used when OpeningType is \"CUT\" |\n| `CutLength` | `double` | get | mm — used when OpeningType is \"CUT\" |\n| `OpeningType` | `string` | get | \"NONE\", \"CUT\" or \"STRANGLE\" |\n| `StrangleBaseX` | `double` | get | mm |\n| `StrangleBaseY` | `double` | get | mm |\n| `StrangleBaseZ` | `double` | get | mm |\n| `StrangleOpening` | `double` | get | mm — used when OpeningType is \"STRANGLE\" |\n\n| Method | |\n|---|---|\n| `void SetCutBumping(double bumping)` | |\n| `void SetCutLength(double length)` | |\n| `void SetOpeningType(string openingType)` | \"NONE\", \"CUT\" or \"STRANGLE\" |\n| `void SetStrangleBase(double x, double y, double z)` | |\n| `void SetStrangleOpening(double opening)` | |","metadata":{"title":"ClassicApi","section":"IClassicAdvanced","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicadvanced","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/classic/#iclassicadvanced","collection":"scripting","hash":"505bf5d3b864a05584e7201ac81b0733","indexed_by":"docs-index"}},{"content":"ClusterApi\n\nCluster settings around a centre stone.\n\n```python\nfrom ArtisanPlugin.Scripting import ClusterApi\n```\n\nSee also the guide, Gemsets › Cluster, and the Python package, `ra.cluster`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ICluster` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ICluster` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a cluster of small stones around an existing gem -- the ArtisanCluster tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `ICluster` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Clusters currently selected in the active doc. |","metadata":{"title":"ClusterApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/","collection":"scripting","hash":"bf1f036730c3fe3719f4b98a44a5a75d","indexed_by":"docs-index"}},{"content":"ClusterApi — All\n\n```csharp\nIReadOnlyList<ICluster> ClusterApi.All()\n```\n\n`ICluster` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ICluster> ClusterApi.ByLayer(string layerName)\n```\n\n`ICluster` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClusterApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#all","collection":"scripting","hash":"00f56fdea163a9d9f322509db07ce865","indexed_by":"docs-index"}},{"content":"ClusterApi — Count\n\n```csharp\nint ClusterApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"ClusterApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#count","collection":"scripting","hash":"b1dc32605cac1d598d47cbcaf9b4d0da","indexed_by":"docs-index"}},{"content":"ClusterApi — Create\n\n```csharp\nICluster ClusterApi.Create(\n    Guid gemId,\n    double stoneSize = 0,\n    double stoneDistance = 0,\n    double distanceToGem = 0,\n    int prongNumber = 0,\n    double prongDiameter = 0,\n    double railDiameter = 0,\n    bool? doubleRail = null,\n    double railDiameter2 = 0,\n    string prongOrientation = null,\n    double internalProngDiameter = 0,\n    double externalProngDiameter = 0,\n    double centralProngDiameter = 0,\n    double stonesZPosition = double.NaN,\n    double stonesRotation = double.NaN,\n    string element = null)\n```\n\nBuilds a cluster of small stones around an existing gem -- the ArtisanCluster tool, headless. `gemId` must be a gem in the active document with a cluster-friendly shape (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER); the kernel picks the matching shape variant internally. Millimetres; 0 keeps the tool default (or the user's saved defaults): stoneSize 1.6, stoneDistance 0.2, distanceToGem 1.0, prongDiameter 0.8 (applied to the internal, external and central prongs alike), railDiameter 1.0. `prongNumber` is 3, 4 or 5 (default 4). `element` = name of a saved Cluster element (ElementsApi.List(\"Cluster\")) to start from instead of the defaults; explicit arguments override it. Returns an ICluster handle to the new cluster group.","metadata":{"title":"ClusterApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#create","collection":"scripting","hash":"0d0e7cb1ad609f960f3670598b61fa74","indexed_by":"docs-index"}},{"content":"ClusterApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `stoneSize` | `double` | `0` |\n| `stoneDistance` | `double` | `0` |\n| `distanceToGem` | `double` | `0` |\n| `prongNumber` | `int` | `0` |\n| `prongDiameter` | `double` | `0` |\n| `railDiameter` | `double` | `0` |\n| `doubleRail` | `bool?` | `null` |\n| `railDiameter2` | `double` | `0` |\n| `prongOrientation` | `string` | `null` |\n| `internalProngDiameter` | `double` | `0` |\n| `externalProngDiameter` | `double` | `0` |\n| `centralProngDiameter` | `double` | `0` |\n| `stonesZPosition` | `double` | `double.NaN` |\n| `stonesRotation` | `double` | `double.NaN` |\n| `element` | `string` | `null` |\n\nReturns `ICluster`.","metadata":{"title":"ClusterApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#create","collection":"scripting","hash":"3d91bbf20060e37ff5470d28d1c4e996","indexed_by":"docs-index"}},{"content":"ClusterApi — Find\n\n```csharp\nICluster ClusterApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ICluster`.\n\nForGem\n```csharp\nIReadOnlyList<ICluster> ClusterApi.ForGem(Guid gemId)\n```\n\n`ICluster` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ClusterApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#find","collection":"scripting","hash":"b7224a46a051b3a322258d44b69efaaf","indexed_by":"docs-index"}},{"content":"ClusterApi — Selected\n\n```csharp\nIReadOnlyList<ICluster> ClusterApi.Selected()\n```\n\nClusters currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"ClusterApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#selected","collection":"scripting","hash":"326d657dfa340d07a42a0f1f7f70bea3","indexed_by":"docs-index"}},{"content":"ClusterApi — ICluster\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CentralProngDiameter` | `double` | get | |\n| `ClusterStoneCount` | `int` | get | Stones forming the cluster (around the center gem) |\n| `ClusterStoneSize` | `double` | get | |\n| `ClusterStoneWeight` | `double` | get | |\n| `ClusterTotalWeight` | `double` | get | |\n| `DistanceToGem` | `double` | get | |\n| `DoubleRail` | `bool` | get | |\n| `ExternalProngDiameter` | `double` | get | |\n| `FilletFactor` | `double` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `InternalProngDiameter` | `double` | get | |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngCount` | `int` | get | 3, 4 or 5 |\n| `ProngOrientation` | `string` | get | \"CURVE\" \\| \"CENTER\" |\n| `RailDiameter1` | `double` | get | |\n| `RailDiameter2` | `double` | get | |\n| `StoneDistance` | `double` | get | |\n| `StoneSize` | `double` | get | Current values. Millimetres / degrees; several are signed. |\n| `StonesRotation` | `double` | get | signed |\n| `StonesZPosition` | `double` | get | signed |","metadata":{"title":"ClusterApi","section":"ICluster","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#icluster","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#icluster","collection":"scripting","hash":"b0e8822d610068489d855f6c0dff863f","indexed_by":"docs-index"}},{"content":"ClusterApi — ICluster\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBaseHeight(double height)` | |\n| `void SetBaseMoveInZ(double moveInZ)` | signed |\n| `void SetBaseWidth(double width)` | |\n| `void SetCentralProngDiameter(double diameter)` | |\n| `void SetDistanceToGem(double distance)` | |\n| `void SetDoubleRail(bool enabled)` | |\n| `void SetElement(string element)` | Applies a saved Cluster element (ElementsApi.List(\"Cluster\")) to this cluster: its parameters replace the current ones, the mother gem stays, and the cluster regenerates in place (same id). |\n| `void SetExternalProngDiameter(double diameter)` | |\n| `void SetFilletFactor(double factor)` | |\n| `void SetInternalProngDiameter(double diameter)` | |\n| `void SetProngCount(int count)` | 3, 4 or 5 |\n| `void SetProngDiameter(double diameter)` | all three families at once |\n| `void SetProngOrientation(string orientation)` | CURVE \\| CENTER |\n| `void SetRailDiameter1(double diameter)` | |\n| `void SetRailDiameter2(double diameter)` | |\n| `void SetRailMoveInZ1(double moveInZ)` | signed |\n| `void SetRailMoveInZ2(double moveInZ)` | signed |\n| `void SetStoneDistance(double distance)` | |\n| `void SetStoneSize(double size)` | Parametric edits -- each regenerates the cluster (the group keeps its id) and calls LicenseGate.RequireValid() first. These take LITERAL values: 0 and negatives are allowed where the parameter is signed. |\n| `void SetStonesRotation(double degrees)` | signed |\n| `void SetStonesZPosition(double z)` | signed |","metadata":{"title":"ClusterApi","section":"ICluster","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#icluster","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cluster/#icluster","collection":"scripting","hash":"b91b5af237facf7f1f2440b64f9aac05","indexed_by":"docs-index"}},{"content":"Core types — Transaction\n\nLets a script group multiple mutating calls into a single undo step -- otherwise every Move/Delete/Create fires its own Views.Redraw and lands as a separate undo entry, polluting the user's history. From Python: from ArtisanPlugin.Scripting import Transaction with Transaction.Begin(\"Move all gems\"): for g in gem.All(): g.Move(...) The \"with\" block guarantees the record is closed even on exception, which is critical because a leaked undo record corrupts the doc's history for the rest of the session.\n\n| Member | |\n|---|---|\n| `IDisposable Transaction.Begin(string description)` | |","metadata":{"title":"Core types","section":"Transaction","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#transaction","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#transaction","collection":"scripting","hash":"cbca9ce7025aea4f6fc6565a4d3e01bd","indexed_by":"docs-index"}},{"content":"Core types — ScriptingInfo\n\nVersion and status of the scripting API, independent of the plugin version. Scripts can branch on it (`if ScriptingInfo.ApiVersion < ...`) and support can ask for it. Bumped by hand together with docs/CHANGELOG-API.md (semantic versioning: MAJOR for removals or behaviour changes, MINOR for additions, PATCH for fixes). While the major version is 0 the API is in beta: names may still change, but never without an [Obsolete] alias kept for at least six months, which is what the public docs promise.","metadata":{"title":"Core types","section":"ScriptingInfo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#scriptinginfo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#scriptinginfo","collection":"scripting","hash":"866a257bd42a0cf6293ec81cbb7e4ee4","indexed_by":"docs-index"}},{"content":"Core types — LicenseGate\n\nCentral choke-point for license enforcement on the scripting facade. Every public mutating call in the scripting API must go through one of these before touching anything in the kernel or the Rhino document.\n\n| Member | |\n|---|---|\n| `void LicenseGate.RequireTier(string tier)` | Hook reserved for tier-based features later (e.g. Pro/Enterprise-only commands). Today this is a no-op beyond the validity check; we'll specialize it as soon as the license layer exposes tier info we can branch on. |\n| `void LicenseGate.RequireValid()` | Always required: a valid RhinoArtisan license must exist for any scripted operation. Runs the SAME authoritative validation the commands run (ShapesPlugin.ValidateLicense, which caches internally with a TTL and fails closed), so a license expiring mid-session blocks scripts exactly like it blocks commands. Falls back to the kernel's last-known status only if the plugin instance isn't available. |","metadata":{"title":"Core types","section":"LicenseGate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#licensegate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#licensegate","collection":"scripting","hash":"a858da0db6802b0c13c8f980f2eb2e9d","indexed_by":"docs-index"}},{"content":"Core types — Exceptions\n\n| Exception | Base | When |\n|---|---|---|\n| `ScriptingComputeException` | `ArgumentException` | The arguments were accepted but the kernel could not build the geometry with them (a profile that cannot be swept, a shank too thin for its gems, sections that overlap). is the kernel's error key when there is one, e.g. INVALID_PROFILE; the message is its translation in the UI language followed by the key in parentheses, so a script can match on either. |\n| `ScriptingNotLicensedException` | `ArgumentException` | The call needs a valid RhinoArtisan license and there is none. Read-only queries never throw this. |\n| `ScriptingStateException` | `InvalidOperationException` | The document is not in a state where the call makes sense: no active document, the object no longer exists, the handle points at an object of another kind, nothing is selected. |\n| `ScriptingValidationException` | `ArgumentException` | An argument was rejected before anything was computed: wrong enum name, value out of range, unknown id, malformed JSON. The message names the parameter and, where there is a closed set, the valid values. |","metadata":{"title":"Core types","section":"Exceptions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#exceptions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/core/#exceptions","collection":"scripting","hash":"b0cb0d14515834e8918e449652c14e16","indexed_by":"docs-index"}},{"content":"CurveApi\n\nScriptable versions of the Artisan curve helpers that do not have a facade of their own (ring curve, text on curve, raster to vector, patterns and profile sweeps live in their own *Api classes): Advanced ArtisanAdvancedCurve symmetric control-point curve with offset AutoJoin ArtisanAutoJoin joins every open curve of the document Cross ArtisanCrossBuilder parametric cross outline (CrossCustomObject) Connect ArtisanCurveConnect arc blend between two points on solids Infinite ArtisanInfiniteCurve very long construction line / ray InfiniteLoop ArtisanInfiniteLoopCurve lemniscate (\"infinity symbol\") curve IsoCurves ArtisanIsoCurve smart isocurves of a surface at a point Waves ArtisanWaves sine-like wave flowed along a curve AddSketches ArtisanAddSketches reference images on a 10 mm box (top/front/side) Millimetres everywhere; numeric 0 (or null/omitted) keeps the tool's default. Every method returns the Guid(s) of the curves it added.\n\n```python\nfrom ArtisanPlugin.Scripting import CurveApi\n```\n\nSee also the Python package, `ra.curve`.","metadata":{"title":"CurveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/","collection":"scripting","hash":"f3e6f824eab8cedfff70a7a805737c79","indexed_by":"docs-index"}},{"content":"CurveApi — Methods\n\n| Method | |\n|---|---|\n| `AddSketches` | Replicates the ArtisanAddSketches panel's Accept: places reference sketch images on the faces of a 10 x 10 x 10 mm box at the origin -- two textured surfaces per image (top: z=0 and z=10; front: y=0 and y=10; side: x=0 and x=10, the far one mirrored), rendered display mode, all in one group. |\n| `Advanced` | Replicates ArtisanAdvancedCurve: a degree-3 control-point curve through `points`, mirrored by `symmetry` (NONE \\| X \\| Y \\| XY -- the \"Quad\" option), optionally closed, plus an offset copy with connecting lines when `offset` != 0 (default 1 mm; NaN/omitted = default, 0 = no offset). |\n| `AutoJoin` | Replicates ArtisanAutoJoin: joins the open, visible curves of the document whose ends touch (document tolerance), like running _Join on all of them. |\n| `Connect` | Replicates ArtisanCurveConnect: an arc blend leaving `firstId` at the point of its surface closest to `firstPoint` (along the normal) and arriving at `secondId` near `secondPoint` against its normal. |\n| `Cross` | Replicates the ArtisanCrossBuilder panel's Accept: a closed cross outline centred at the world origin (the panel does the same), stored as a parametric CrossCustomObject on the primary user layer. |\n| `Infinite` | Replicates ArtisanInfiniteCurve: a very long line (`type` LINE, centred on `basePoint`) or ray (RAY, starting at `basePoint`) used as a construction reference. |\n| `InfiniteLoop` | Replicates ArtisanInfiniteLoopCurve: a closed lemniscate (\"infinity symbol\") interpolated through sampled points, centred at `center`. |\n| `IsoCurves` | Replicates ArtisanIsoCurve: extracts the isocurve(s) of `surfaceId` (a surface, or the face of a solid nearest to `point`) passing through the point of the surface closest to `point`. |","metadata":{"title":"CurveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#methods","collection":"scripting","hash":"3a39a55979bb0aab7d1f1fa3e8e1b993","indexed_by":"docs-index"}},{"content":"CurveApi — Methods\n\n| Method | |\n|---|---|\n| `Waves` | Replicates ArtisanWaves: a smooth wave (`waves` full periods, default 3, peak-to-peak `height` mm, default 3) flowed along `curveId` from its start to its end. |","metadata":{"title":"CurveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#methods","collection":"scripting","hash":"542da673fa2c7f5195b9249a833a5eda","indexed_by":"docs-index"}},{"content":"CurveApi — AddSketches\n\n```csharp\nIReadOnlyList<Guid> CurveApi.AddSketches(\n    string topImagePath = null,\n    string frontImagePath = null,\n    string sideImagePath = null)\n```\n\nReplicates the ArtisanAddSketches panel's Accept: places reference sketch images on the faces of a 10 x 10 x 10 mm box at the origin -- two textured surfaces per image (top: z=0 and z=10; front: y=0 and y=10; side: x=0 and x=10, the far one mirrored), rendered display mode, all in one group. Give at least one image path (PNG/JPG). Returns the ids of the surfaces added.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `topImagePath` | `string` | `null` |\n| `frontImagePath` | `string` | `null` |\n| `sideImagePath` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CurveApi","section":"AddSketches","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#addsketches","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#addsketches","collection":"scripting","hash":"015fd47d150a8bd6c318adc6db65b136","indexed_by":"docs-index"}},{"content":"CurveApi — Advanced\n\n```csharp\nIReadOnlyList<Guid> CurveApi.Advanced(\n    IEnumerable<Point3d> points,\n    IEnumerable<int> sharpIndices = null,\n    string symmetry = \"NONE\",\n    bool close = false,\n    double offset = double.NaN,\n    Plane? plane = null)\n```\n\nReplicates ArtisanAdvancedCurve: a degree-3 control-point curve through `points`, mirrored by `symmetry` (NONE | X | Y | XY -- the \"Quad\" option), optionally closed, plus an offset copy with connecting lines when `offset` != 0 (default 1 mm; NaN/omitted = default, 0 = no offset). `sharpIndices` are 0-based indices of the points picked with Shift in the command (kinks). `plane` is the symmetry/offset plane; omitted = the active view's construction plane. Returns the ids of the curves added to the primary user layer.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `points` | `IEnumerable ` | required |\n| `sharpIndices` | `IEnumerable ` | `null` |\n| `symmetry` | `string` | `\"NONE\"` |\n| `close` | `bool` | `false` |\n| `offset` | `double` | `double.NaN` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CurveApi","section":"Advanced","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#advanced","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#advanced","collection":"scripting","hash":"44978fee436036b31663a461f1dfec78","indexed_by":"docs-index"}},{"content":"CurveApi — AutoJoin\n\n```csharp\nIReadOnlyList<Guid> CurveApi.AutoJoin(IEnumerable<Guid> curveIds = null)\n```\n\nReplicates ArtisanAutoJoin: joins the open, visible curves of the document whose ends touch (document tolerance), like running _Join on all of them. `curveIds` restricts the candidates (closed curves are always skipped); null/empty = every visible curve. Curves that do not touch anything are left untouched. Each joined result keeps the attributes of its first member. Returns the ids of the NEW joined curves.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CurveApi","section":"AutoJoin","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#autojoin","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#autojoin","collection":"scripting","hash":"67c8fefee2dba73c21a9e4fb81632344","indexed_by":"docs-index"}},{"content":"CurveApi — Connect\n\n```csharp\nGuid CurveApi.Connect(Guid firstId, Point3d firstPoint, Guid secondId, Point3d secondPoint)\n```\n\nReplicates ArtisanCurveConnect: an arc blend leaving `firstId` at the point of its surface closest to `firstPoint` (along the normal) and arriving at `secondId` near `secondPoint` against its normal. Both ids must be solids/surfaces (breps); the two may be the same object. The result is a ConnectCurveCustomObject that remembers both parents. Returns the curve id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `firstId` | `Guid` | required |\n| `firstPoint` | `Point3d` | required |\n| `secondId` | `Guid` | required |\n| `secondPoint` | `Point3d` | required |\n\nReturns `Guid`.","metadata":{"title":"CurveApi","section":"Connect","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#connect","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#connect","collection":"scripting","hash":"88d5da1fcade39fc69a6d0052a0a03ae","indexed_by":"docs-index"}},{"content":"CurveApi — Cross\n\n```csharp\nGuid CurveApi.Cross(\n    double width = 0,\n    double height = 0,\n    double thickness = 0,\n    double displacement = 0,\n    double radius = 0,\n    string mode = null)\n```\n\nReplicates the ArtisanCrossBuilder panel's Accept: a closed cross outline centred at the world origin (the panel does the same), stored as a parametric CrossCustomObject on the primary user layer. Defaults come from the user's saved Cross Builder defaults, else width 4, height 6, thickness 1, displacement 1, mode ROUND. `mode` is NONE | ROUND | CHAMFER; `radius` is the corner radius for ROUND/CHAMFER (0 = saved default, minimum 0.1 like the panel). Returns the curve id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `displacement` | `double` | `0` |\n| `radius` | `double` | `0` |\n| `mode` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"CurveApi","section":"Cross","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#cross","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#cross","collection":"scripting","hash":"0339b4ac047b2f841eedc1e478576d25","indexed_by":"docs-index"}},{"content":"CurveApi — Infinite\n\n```csharp\nGuid CurveApi.Infinite(\n    Point3d basePoint,\n    string mode = \"TWO_POINTS\",\n    Point3d? secondPoint = null,\n    Point3d? thirdPoint = null,\n    double angle = 0,\n    double length = 0,\n    string type = \"LINE\",\n    bool useCPlane = true)\n```\n\nReplicates ArtisanInfiniteCurve: a very long line (`type` LINE, centred on `basePoint`) or ray (RAY, starting at `basePoint`) used as a construction reference. `mode` chooses the direction: TWO_POINTS (needs secondPoint) | HORIZONTAL | VERTICAL | ANGLE (uses `angle` in degrees) | AXIS_X | AXIS_Y | AXIS_Z | BISECTOR (needs secondPoint and thirdPoint: bisector of the angle they form at basePoint) HORIZONTAL/VERTICAL/ANGLE follow the active construction plane when `useCPlane` is true, else World XY. `length` 0 = 10x the scene's bounding-box diagonal (minimum 1000 mm). Returns the line id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `basePoint` | `Point3d` | required |\n| `mode` | `string` | `\"TWO_POINTS\"` |\n| `secondPoint` | `Point3d?` | `null` |\n| `thirdPoint` | `Point3d?` | `null` |\n| `angle` | `double` | `0` |\n| `length` | `double` | `0` |\n| `type` | `string` | `\"LINE\"` |\n| `useCPlane` | `bool` | `true` |\n\nReturns `Guid`.","metadata":{"title":"CurveApi","section":"Infinite","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#infinite","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#infinite","collection":"scripting","hash":"fb1700af9e102fb35545bb60e4218433","indexed_by":"docs-index"}},{"content":"CurveApi — InfiniteLoop\n\n```csharp\nGuid CurveApi.InfiniteLoop(\n    Point3d center,\n    string kind = \"BERNOULLI\",\n    double width = 0,\n    double heightRatio = 0,\n    double height = 0,\n    bool flatBottom = false,\n    int samples = 0,\n    double rotation = 0,\n    bool useCPlane = true)\n```\n\nReplicates ArtisanInfiniteLoopCurve: a closed lemniscate (\"infinity symbol\") interpolated through sampled points, centred at `center`. `kind` BERNOULLI (default) or GERONO; `width` total width in mm (default 100); `heightRatio` scales the natural lobe height (default 0.5); `height` lifts the strands in Z at the crossing so one passes over the other (0 = flat; signed); `flatBottom` raises only the upper lobe; `samples` points per loop (default 180); `rotation` in degrees around the plane normal; plane = active CPlane or World XY. Returns the curve id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `center` | `Point3d` | required |\n| `kind` | `string` | `\"BERNOULLI\"` |\n| `width` | `double` | `0` |\n| `heightRatio` | `double` | `0` |\n| `height` | `double` | `0` |\n| `flatBottom` | `bool` | `false` |\n| `samples` | `int` | `0` |\n| `rotation` | `double` | `0` |\n| `useCPlane` | `bool` | `true` |\n\nReturns `Guid`.","metadata":{"title":"CurveApi","section":"InfiniteLoop","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#infiniteloop","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#infiniteloop","collection":"scripting","hash":"2c4bec9f55623ab2fb363c486e0f0a08","indexed_by":"docs-index"}},{"content":"CurveApi — IsoCurves\n\n```csharp\nIReadOnlyList<Guid> CurveApi.IsoCurves(\n    Guid surfaceId,\n    Point3d point,\n    string direction = \"U\")\n```\n\nReplicates ArtisanIsoCurve: extracts the isocurve(s) of `surfaceId` (a surface, or the face of a solid nearest to `point`) passing through the point of the surface closest to `point`. `direction` U | V | BOTH (default U). Each result is a smart IsoCurveCustomObject (remembers its surface) on the primary user layer. Returns the ids (1 or 2 curves).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceId` | `Guid` | required |\n| `point` | `Point3d` | required |\n| `direction` | `string` | `\"U\"` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CurveApi","section":"IsoCurves","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#isocurves","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#isocurves","collection":"scripting","hash":"b8b5a21b6f9fe3ad244034df098a86e0","indexed_by":"docs-index"}},{"content":"CurveApi — Waves\n\n```csharp\nGuid CurveApi.Waves(Guid curveId, int waves = 0, double height = 0)\n```\n\nReplicates ArtisanWaves: a smooth wave (`waves` full periods, default 3, peak-to-peak `height` mm, default 3) flowed along `curveId` from its start to its end. Plain curve added with the document's current attributes; the source curve is left untouched. Returns the new curve id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `waves` | `int` | `0` |\n| `height` | `double` | `0` |\n\nReturns `Guid`.","metadata":{"title":"CurveApi","section":"Waves","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#waves","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/curve/#waves","collection":"scripting","hash":"cfdf26f79ae3591f30385af3c23fd338","indexed_by":"docs-index"}},{"content":"CutterApi\n\nThe cutters that carve the seat of a stone into the metal.\n\n```python\nfrom ArtisanPlugin.Scripting import CutterApi\n```\n\nSee also the guide, Gemsets › Cutters, and the Python package, `ra.cutter`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ICutter` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ICutter` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds one cutter per gem (the ArtisanCutters tool, headless): the cutting/drilling solid used to open the gem seat in the metal. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `ICutter` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Cutters currently selected in the active doc. |","metadata":{"title":"CutterApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/","collection":"scripting","hash":"781b7d3e50d9979c10409a667defc7bf","indexed_by":"docs-index"}},{"content":"CutterApi — All\n\n```csharp\nIReadOnlyList<ICutter> CutterApi.All()\n```\n\n`ICutter` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ICutter> CutterApi.ByLayer(string layerName)\n```\n\n`ICutter` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CutterApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#all","collection":"scripting","hash":"fc1909d81986d4cd57bbef9c1d4a62c1","indexed_by":"docs-index"}},{"content":"CutterApi — Count\n\n```csharp\nint CutterApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"CutterApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#count","collection":"scripting","hash":"873a5dbaf69391d57249be2ca8dd4d82","indexed_by":"docs-index"}},{"content":"CutterApi — Create\n\n```csharp\nIReadOnlyList<ICutter> CutterApi.Create(\n    IEnumerable<Guid> gemIds = null,\n    double sizeTop = 0,\n    double sizeBottom = 0,\n    double sizeDrill = 0,\n    double heightTop = 0,\n    double heightCrown = 0,\n    double heightGirdle = 0,\n    double heightPavilion = 0,\n    double heightDrill = -1,\n    double gemInside = double.NaN,\n    int drillType = -1,\n    bool fitToGem = false,\n    double clearance = double.NaN)\n```","metadata":{"title":"CutterApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","collection":"scripting","hash":"bcb55f0899b3250bc5e23ecd0e574f95","indexed_by":"docs-index"}},{"content":"CutterApi — Create\n\nBuilds one cutter per gem (the ArtisanCutters tool, headless): the cutting/drilling solid used to open the gem seat in the metal. `gemIds` null/empty = the currently selected gems. Size arguments are PERCENTAGES of the gem size (the tool's own convention), except `gemInside`, which is millimetres added to the gem outline (negative shrinks). Pass 0 to keep the tool default (sizeTop 40, sizeBottom 40, sizeDrill 40, heightTop 100, heightCrown 34, heightGirdle 3, heightPavilion 71). `heightDrill` uses -1 as \"keep default (200)\" because 0 is meaningful: it disables the drill body entirely. `drillType` -1 keeps the default; valid values are 0 = gem shape, 1 = round, 2 = square, 3 = hexagon. Same geometry as the panel: the size arguments scale the gem outline, the heights are % of the gem height, and the pavilion is a straight cone from the girdle outline to one point `heightPavilion` % below it. It does not follow the real pavilion of fancy cuts (cushion, oval...), where it can sit inside the stone just below the girdle: raise heightPavilion / heightGirdle or give gemInside a positive margin when the cutter must enclose the stone. `fitToGem` true computes gemInside, heightGirdle and heightPavilion per gem so the cutter encloses the gem's real girdle and pavilion with `clearance` mm (NaN = 0.05), overriding those three arguments; the crown, top and drill stay as given. Returns one ICutter handle per gem, in input order.","metadata":{"title":"CutterApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","collection":"scripting","hash":"dfe14c2fcbc4652fe91008c485b5a9b7","indexed_by":"docs-index"}},{"content":"CutterApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `sizeTop` | `double` | `0` |\n| `sizeBottom` | `double` | `0` |\n| `sizeDrill` | `double` | `0` |\n| `heightTop` | `double` | `0` |\n| `heightCrown` | `double` | `0` |\n| `heightGirdle` | `double` | `0` |\n| `heightPavilion` | `double` | `0` |\n| `heightDrill` | `double` | `-1` |\n| `gemInside` | `double` | `double.NaN` |\n| `drillType` | `int` | `-1` |\n| `fitToGem` | `bool` | `false` |\n| `clearance` | `double` | `double.NaN` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CutterApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#create","collection":"scripting","hash":"06b266ffcecc79af0080591d708a0c9d","indexed_by":"docs-index"}},{"content":"CutterApi — Find\n\n```csharp\nICutter CutterApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ICutter`.\n\nForGem\n```csharp\nIReadOnlyList<ICutter> CutterApi.ForGem(Guid gemId)\n```\n\n`ICutter` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"CutterApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#find","collection":"scripting","hash":"42072530db80ec061570be66a347fd54","indexed_by":"docs-index"}},{"content":"CutterApi — Selected\n\n```csharp\nIReadOnlyList<ICutter> CutterApi.Selected()\n```\n\nCutters currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"CutterApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#selected","collection":"scripting","hash":"9783e62004446421cc7ce56e21e7387d","indexed_by":"docs-index"}},{"content":"CutterApi — ICutter\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `DrillType` | `int` | get | 0 gem shape, 1 round, 2 square, 3 hexagon |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `HeightCrown` | `double` | get | |\n| `HeightDrill` | `double` | get | |\n| `HeightGirdle` | `double` | get | |\n| `HeightPavilion` | `double` | get | |\n| `HeightTop` | `double` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `SizeBottom` | `double` | get | |\n| `SizeDrill` | `double` | get | |\n| `SizeTop` | `double` | get | Sizes and heights are PERCENTAGES of the mother gem, except GemInside which is millimetres. 0 is legal for all of them (a 0 drill height means no drill body at all). |","metadata":{"title":"CutterApi","section":"ICutter","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#icutter","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#icutter","collection":"scripting","hash":"b296252b31558dead2d5825f0ebd6d4f","indexed_by":"docs-index"}},{"content":"CutterApi — ICutter\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void FitToGem(double clearance = double.NaN)` | Fit to gem: sets GemInside, HeightGirdle and HeightPavilion so the cutter encloses this gem's real pavilion and girdle with `clearance` mm (NaN = 0.05). The crown, top and drill stay. Regenerates in place. |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetDrillType(int drillType)` | 0-3 |\n| `void SetGemInside(double gemInside)` | mm, signed |\n| `void SetHeightCrown(double heightCrown)` | |\n| `void SetHeightDrill(double heightDrill)` | 0 = no drill body |\n| `void SetHeightGirdle(double heightGirdle)` | |\n| `void SetHeightPavilion(double heightPavilion)` | |\n| `void SetHeightTop(double heightTop)` | |\n| `void SetSizeBottom(double sizeBottom)` | |\n| `void SetSizeDrill(double sizeDrill)` | |\n| `void SetSizeTop(double sizeTop)` | Parametric edits -- each regenerates the cutter in place (same Guid) and calls LicenseGate.RequireValid() first. These take LITERAL values, so 0 is a real 0. |","metadata":{"title":"CutterApi","section":"ICutter","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#icutter","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/cutter/#icutter","collection":"scripting","hash":"564682d38838ed5bd32a045c5a38e47b","indexed_by":"docs-index"}},{"content":"DocumentApi\n\nDocument-level Artisan settings, starting with the computation mode (the Rendering/Manufacturing switch at the top of the Outliner).\n\n```python\nfrom ArtisanPlugin.Scripting import DocumentApi\n```\n\nSee also the guide, API Reference › Document, and the Python package, `ra.document`.","metadata":{"title":"DocumentApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/","collection":"scripting","hash":"a897f6569b759fc0e92e40910d836862","indexed_by":"docs-index"}},{"content":"DocumentApi — Methods\n\n| Method | |\n|---|---|\n| `GetComputationMode` | Current computation mode as a string (\"Render\" or \"Manufacturing\"). |\n| `GetMetals` | The document's metals by position, honoring how many the document uses (1, 2 or 3 entries). |\n| `GetPath` | Full path of the active document, or empty for an unsaved document. |\n| `GetRingSize` | The document's current finger size, or null when the document has no ring size (non-ring designs). |\n| `Glb` | Exports the whole document to a GLB file (the same conversion the Realtime Render pipeline uses). |\n| `GlbBatch` | Converts every .3dm in `folder` (and its subfolders when `recursive`) to a GLB next to it, with the same conversion as Glb() -- the configurator's batch export (ArtisanConfFolderToGlb) without touching the open document: each file is read on its own, in the background. |\n| `IsModified` | True when the active document has unsaved changes. |\n| `New` | Creates a new document, replacing the active one — like File > New, but without the template picker: `template` is a .3dm template file path, or null for Rhino's default template. |\n| `Open` | Opens a 3dm file. |\n| `RefreshAll` | Regenerates the parametric objects, exactly like the Outliner's Refresh button: by default only the ones flagged as pending (RequireRegenerate — e.g. |\n| `ReportPdf` | Exports a layout page to a 300-dpi PDF (vector where possible). |\n| `RingSizeRegions` | The available sizing regions (\"EU\", \"US\", ...) for SetRingSize. |\n| `Save` | Saves the active document. |\n| `SaveCopy` | Saves a COPY of the active document to `path` (File > SaveCopyAs): the document keeps its own path and modified state, you keep working in the original file — checkpoints and versioning from a flow. |","metadata":{"title":"DocumentApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#methods","collection":"scripting","hash":"3bc58feeb60bfef2428d424ca9a9b55a","indexed_by":"docs-index"}},{"content":"DocumentApi — Methods\n\n| Method | |\n|---|---|\n| `SetComputationMode` | Switches the computation mode, exactly like the Outliner's Rendering/Manufacturing selector: when the mode actually changes, every parametric object is REGENERATED at the new quality (a long operation on heavy documents). |\n| `SetMetal` | Sets a document metal, exactly like the Outliner's metal selector: the change re-applies the metal materials on the layers. |\n| `SetRingSize` | Changes the ring's finger size, exactly like the Outliner's size selector: the parametric ring geometry is UPDATED to the new size and every object refreshed (long on heavy documents). |\n| `SetRingSizeByDiameter` | Same, but from an inner diameter in mm -- resolves to the nearest catalog size of `region` (omitted = the document's current region). |\n| `Stl` | Exports geometry to a binary STL for 3D printing: everything visible, or only the current selection with `onlySelection`. |","metadata":{"title":"DocumentApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#methods","collection":"scripting","hash":"91da40e57c01b90b5e84a4cae356d27d","indexed_by":"docs-index"}},{"content":"DocumentApi — GetComputationMode\n\n```csharp\nstring DocumentApi.GetComputationMode()\n```\n\nCurrent computation mode as a string (\"Render\" or \"Manufacturing\").\n\nReturns `string`.\n\nGetMetals\n```csharp\nIReadOnlyList<string> DocumentApi.GetMetals()\n```\n\nThe document's metals by position, honoring how many the document uses (1, 2 or 3 entries).\n\nReturns `IReadOnlyList `.","metadata":{"title":"DocumentApi","section":"GetComputationMode","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#getcomputationmode","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#getcomputationmode","collection":"scripting","hash":"85e69c5eb2c3a2aeb04e5e32a4232fd0","indexed_by":"docs-index"}},{"content":"DocumentApi — GetPath\n\n```csharp\nstring DocumentApi.GetPath()\n```\n\nFull path of the active document, or empty for an unsaved document.\n\nReturns `string`.\n\nGetRingSize\n```csharp\nRingSizeInfo DocumentApi.GetRingSize()\n```\n\nThe document's current finger size, or null when the document has no ring size (non-ring designs).\n\nReturns `RingSizeInfo`.","metadata":{"title":"DocumentApi","section":"GetPath","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#getpath","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#getpath","collection":"scripting","hash":"09c6ec7bf996e35826b37d5fa529758a","indexed_by":"docs-index"}},{"content":"DocumentApi — Glb\n\n```csharp\nstring DocumentApi.Glb(string path)\n```\n\nExports the whole document to a GLB file (the same conversion the Realtime Render pipeline uses).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n\nReturns `string`.\n\nGlbBatch\n```csharp\nIReadOnlyList<GlbBatchItem> DocumentApi.GlbBatch(\n    string folder,\n    bool recursive = true,\n    bool overwrite = false)\n```\n\nConverts every .3dm in `folder` (and its subfolders when `recursive`) to a GLB next to it, with the same conversion as Glb() -- the configurator's batch export (ArtisanConfFolderToGlb) without touching the open document: each file is read on its own, in the background. GLBs already there are kept unless `overwrite`. Returns one row per file.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `folder` | `string` | required |\n| `recursive` | `bool` | `true` |\n| `overwrite` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"DocumentApi","section":"Glb","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#glb","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#glb","collection":"scripting","hash":"3ae3ad3ea3177452c0a3b6bad5193a88","indexed_by":"docs-index"}},{"content":"DocumentApi — IsModified\n\n```csharp\nbool DocumentApi.IsModified()\n```\n\nTrue when the active document has unsaved changes.\n\nReturns `bool`.\n\nNew\n```csharp\nvoid DocumentApi.New(string template = null, bool discardChanges = false)\n```\n\nCreates a new document, replacing the active one — like File > New, but without the template picker: `template` is a .3dm template file path, or null for Rhino's default template. Fails on unsaved changes unless `discardChanges` is true.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `template` | `string` | `null` |\n| `discardChanges` | `bool` | `false` |","metadata":{"title":"DocumentApi","section":"IsModified","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#ismodified","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#ismodified","collection":"scripting","hash":"0e46388978e94ebede871ef27ff8714f","indexed_by":"docs-index"}},{"content":"DocumentApi — Open\n\n```csharp\nstring DocumentApi.Open(string path, bool discardChanges = false)\n```\n\nOpens a 3dm file. The active document is replaced, like File > Open. Fails when the current document has unsaved changes, unless `discardChanges` is true (there is never a save prompt). Returns the full path opened.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `discardChanges` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DocumentApi","section":"Open","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#open","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#open","collection":"scripting","hash":"ef7567ea0aecefecdd79560f6db9026a","indexed_by":"docs-index"}},{"content":"DocumentApi — RefreshAll\n\n```csharp\nvoid DocumentApi.RefreshAll(bool force = false)\n```\n\nRegenerates the parametric objects, exactly like the Outliner's Refresh button: by default only the ones flagged as pending (RequireRegenerate — e.g. children whose mother moved); `force` true regenerates EVERYTHING (the button's double-click), a long operation on heavy documents.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `force` | `bool` | `false` |","metadata":{"title":"DocumentApi","section":"RefreshAll","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#refreshall","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#refreshall","collection":"scripting","hash":"155f29a38738a74713afc1af437da436","indexed_by":"docs-index"}},{"content":"DocumentApi — ReportPdf\n\n```csharp\nstring DocumentApi.ReportPdf(string path, string pageName = \"Template\")\n```\n\nExports a layout page to a 300-dpi PDF (vector where possible). `pageName` defaults to \"Template\" -- the layout the report-template tools produce. Throws listing the available layouts when the page doesn't exist (the underlying service only logged it).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `pageName` | `string` | `\"Template\"` |\n\nReturns `string`.","metadata":{"title":"DocumentApi","section":"ReportPdf","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#reportpdf","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#reportpdf","collection":"scripting","hash":"986015547eec584427f6c8c19459e1f2","indexed_by":"docs-index"}},{"content":"DocumentApi — RingSizeRegions\n\n```csharp\nIReadOnlyList<string> DocumentApi.RingSizeRegions()\n```\n\nThe available sizing regions (\"EU\", \"US\", ...) for SetRingSize.\n\nReturns `IReadOnlyList `.\n\nSave\n```csharp\nstring DocumentApi.Save(string path = null)\n```\n\nSaves the active document. With `path` it saves a copy there and the document adopts that path (File > Save As); without it the document must already have a path. Returns the full path written.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | `null` |\n\nReturns `string`.","metadata":{"title":"DocumentApi","section":"RingSizeRegions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#ringsizeregions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#ringsizeregions","collection":"scripting","hash":"08225990d871086ac1a73f44d557e07f","indexed_by":"docs-index"}},{"content":"DocumentApi — SaveCopy\n\n```csharp\nstring DocumentApi.SaveCopy(string path)\n```\n\nSaves a COPY of the active document to `path` (File > SaveCopyAs): the document keeps its own path and modified state, you keep working in the original file — checkpoints and versioning from a flow. Returns the full path written.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n\nReturns `string`.","metadata":{"title":"DocumentApi","section":"SaveCopy","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#savecopy","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#savecopy","collection":"scripting","hash":"baa9b9d7cff89d77019121a677dfae7d","indexed_by":"docs-index"}},{"content":"DocumentApi — SetComputationMode\n\n```csharp\nvoid DocumentApi.SetComputationMode(string mode)\n```\n\nSwitches the computation mode, exactly like the Outliner's Rendering/Manufacturing selector: when the mode actually changes, every parametric object is REGENERATED at the new quality (a long operation on heavy documents). \"Render\" = smooth display quality; \"Manufacturing\" = production-accurate geometry.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `mode` | `string` | required |","metadata":{"title":"DocumentApi","section":"SetComputationMode","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setcomputationmode","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setcomputationmode","collection":"scripting","hash":"dc4627a1d85cafdc208db854b59addea","indexed_by":"docs-index"}},{"content":"DocumentApi — SetMetal\n\n```csharp\nvoid DocumentApi.SetMetal(string metal, int position = 0)\n```\n\nSets a document metal, exactly like the Outliner's metal selector: the change re-applies the metal materials on the layers. metal Metal enum name (\"GOLD_YELLOW_18\", \"PLATINUM\", ... -- see WeightApi.Metals()) position 0 (default) = the WHOLE document uses this metal (single-metal mode); 1, 2 or 3 = that metal position (using different metals per position turns the document into a 2- or 3-metal design, as in the Outliner).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `metal` | `string` | required |\n| `position` | `int` | `0` |","metadata":{"title":"DocumentApi","section":"SetMetal","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setmetal","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setmetal","collection":"scripting","hash":"ec29dc46237c9339b8651e06cf128682","indexed_by":"docs-index"}},{"content":"DocumentApi — SetRingSize\n\n```csharp\nvoid DocumentApi.SetRingSize(string region, string size)\n```\n\nChanges the ring's finger size, exactly like the Outliner's size selector: the parametric ring geometry is UPDATED to the new size and every object refreshed (long on heavy documents). `region` accepts the catalog ids (\"USA\", \"EUROPE\", \"BRITISH\", ...) and the common short aliases (\"US\", \"EU\", \"UK\", ...). Only valid on ring designs with a current size.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `region` | `string` | required |\n| `size` | `string` | required |","metadata":{"title":"DocumentApi","section":"SetRingSize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setringsize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setringsize","collection":"scripting","hash":"5571e28dcd793c57ca060c08d77ef893","indexed_by":"docs-index"}},{"content":"DocumentApi — SetRingSizeByDiameter\n\n```csharp\nvoid DocumentApi.SetRingSizeByDiameter(double diameter, string region = null)\n```\n\nSame, but from an inner diameter in mm -- resolves to the nearest catalog size of `region` (omitted = the document's current region).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `diameter` | `double` | required |\n| `region` | `string` | `null` |","metadata":{"title":"DocumentApi","section":"SetRingSizeByDiameter","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setringsizebydiameter","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#setringsizebydiameter","collection":"scripting","hash":"f283bf3579856d1b89467fada8ffa28d","indexed_by":"docs-index"}},{"content":"DocumentApi — Stl\n\n```csharp\nstring DocumentApi.Stl(string path, bool onlySelection = false)\n```\n\nExports geometry to a binary STL for 3D printing: everything visible, or only the current selection with `onlySelection`. Runs Rhino's native STL exporter with its default meshing parameters.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `onlySelection` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DocumentApi","section":"Stl","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#stl","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/document/#stl","collection":"scripting","hash":"6cbb913b3b3bd98202463acf6181f7a6","indexed_by":"docs-index"}},{"content":"DraftingExtraApi\n\nDrafting / documentation helpers that DraftingApi does not cover: dimension value overrides, the logo file, the technical chart, the grouped gems CSV, report templates and the Artisan window layout. Companion of DraftingApi (which is not partial, hence a second class).\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingExtraApi\n```\n\nSee also the Python package, `ra.drafting`.","metadata":{"title":"DraftingExtraApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/","collection":"scripting","hash":"d3449dfb082d5c27dbda3eda63ea8b61","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — Methods\n\n| Method | |\n|---|---|\n| `AddLogo` | Creates the report logo file from the given objects (same as ArtisanAddLogo): copies them, scales the copies so the largest extent is 28 mm, centers them at (65, 25, 0), exports the copies as logo.3dm in the Artisan user folder and deletes the copies. |\n| `ApplyArtisanLayout` | Applies the Artisan window layout (ArtisanLayout / the ribbon's Window Layout button): imports ArtisanSkin.rhw and activates the \"Artisan\" layout. |\n| `CreateTechnicalChart` | The technical chart (ArtisanTechnicalChart panel, headless): the production breakdown WITHOUT prices — per metal the net weight, waste, total and wax weight, volume and surface area; the gems by shape and size with carats and setting type; the setting, printing and extra processes. |\n| `ExportGemsListByIds` | Writes the gems list of the given gems as a semicolon-delimited CSV (ArtisanGemsListToExcelBySelection / ...BySelectionGroups without the pick and the save dialog; columns Shape, Size X, Size Y, Carats, Quantity, Total Carats). |\n| `OpenReportTemplate` | Opens a report template for editing (ArtisanOpenReportTemplate without the file dialog). |\n| `ReduceDimensions` | Reduces the DISPLAYED value of distance dimensions by `percentage` (same as ArtisanDimensionsReduce / ...BySelection): only the text is overridden, the geometry is untouched. |\n| `RestoreDimensions` | Restores distance dimensions to their real measured value by putting back the \"<>\" placeholder (same as ArtisanDimensionsRestore / ...BySelection). |\n| `SaveReportTemplate` | Saves the ACTIVE document as a report template (ArtisanSaveReportTemplate without the save dialog): a \"Save As\" into the report-templates folder, so the document adopts that path. |","metadata":{"title":"DraftingExtraApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#methods","collection":"scripting","hash":"078c50e5d690d4d86ba0931ac1cbd8c5","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — AddLogo\n\n```csharp\nstring DraftingExtraApi.AddLogo(IEnumerable<Guid> ids)\n```\n\nCreates the report logo file from the given objects (same as ArtisanAddLogo): copies them, scales the copies so the largest extent is 28 mm, centers them at (65, 25, 0), exports the copies as logo.3dm in the Artisan user folder and deletes the copies. The originals are untouched. Returns the full path of logo.3dm.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ids` | `IEnumerable ` | required |\n\nReturns `string`.","metadata":{"title":"DraftingExtraApi","section":"AddLogo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#addlogo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#addlogo","collection":"scripting","hash":"4d5a301b743f25af5aed467c6ab74f28","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — ApplyArtisanLayout\n\n```csharp\nbool DraftingExtraApi.ApplyArtisanLayout()\n```\n\nApplies the Artisan window layout (ArtisanLayout / the ribbon's Window Layout button): imports ArtisanSkin.rhw and activates the \"Artisan\" layout. Rhino 8 or later only. Returns true when applied.\n\nReturns `bool`.\n\nCreateTechnicalChart\n```csharp\nTechnicalChartResult DraftingExtraApi.CreateTechnicalChart(\n    string path = null,\n    bool quoteCertified = true)\n```\n\nThe technical chart (ArtisanTechnicalChart panel, headless): the production breakdown WITHOUT prices — per metal the net weight, waste, total and wax weight, volume and surface area; the gems by shape and size with carats and setting type; the setting, printing and extra processes. The breakdown is recomputed first (the panel's Create button) and stored in the document. path optional export: \".xlsx\" (the panel's Excel, no prices) or \".json\" (the raw breakdown object); null = no file quoteCertified false = skip the live Nivoda quote of certified diamonds (faster, offline) Returns the chart as data (plus Path when a file was written).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | `null` |\n| `quoteCertified` | `bool` | `true` |\n\nReturns `TechnicalChartResult`.","metadata":{"title":"DraftingExtraApi","section":"ApplyArtisanLayout","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#applyartisanlayout","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#applyartisanlayout","collection":"scripting","hash":"4989fc80e0481eae03ef37a7f54dfb82","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — ExportGemsListByIds\n\n```csharp\nstring DraftingExtraApi.ExportGemsListByIds(\n    string path,\n    IEnumerable<Guid> ids = null,\n    bool groupByRhinoGroups = false,\n    bool useSystemDecimals = false)\n```\n\nWrites the gems list of the given gems as a semicolon-delimited CSV (ArtisanGemsListToExcelBySelection / ...BySelectionGroups without the pick and the save dialog; columns Shape, Size X, Size Y, Carats, Quantity, Total Carats). Non-gem ids are ignored. ids gem ids; null = every visible gem groupByRhinoGroups true = one section per Rhino group the gems belong to (group name as header) plus an \"Ungrouped Gems\" section at the end useSystemDecimals true = system decimal separator (default point) Returns the full path written (\".csv\" appended when missing).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `ids` | `IEnumerable ` | `null` |\n| `groupByRhinoGroups` | `bool` | `false` |\n| `useSystemDecimals` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DraftingExtraApi","section":"ExportGemsListByIds","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#exportgemslistbyids","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#exportgemslistbyids","collection":"scripting","hash":"4547545a27fdbe837e677e715d52d1d1","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — OpenReportTemplate\n\n```csharp\nstring DraftingExtraApi.OpenReportTemplate(\n    string template,\n    bool saveChangesFirst = false,\n    bool discardChanges = false)\n```\n\nOpens a report template for editing (ArtisanOpenReportTemplate without the file dialog). The active document is REPLACED by the template file — every id of the previous document becomes invalid. template name from DraftingApi.ReportTemplates() or a full .3dm path saveChangesFirst true = save the current document before (it must already have a path) discardChanges true = lose unsaved changes silently Fails when the document has unsaved changes and neither flag is set. Returns the full path opened.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `template` | `string` | required |\n| `saveChangesFirst` | `bool` | `false` |\n| `discardChanges` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DraftingExtraApi","section":"OpenReportTemplate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#openreporttemplate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#openreporttemplate","collection":"scripting","hash":"a56cb2cbde54229f60878d5c4b3a74aa","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — ReduceDimensions\n\n```csharp\nDimensionValueReport DraftingExtraApi.ReduceDimensions(\n    double percentage = 5,\n    IEnumerable<Guid> ids = null)\n```\n\nReduces the DISPLAYED value of distance dimensions by `percentage` (same as ArtisanDimensionsReduce / ...BySelection): only the text is overridden, the geometry is untouched. Metal shrinks when cast, so plans often need the pre-shrinkage value. Angular dimensions and dimensions already overridden are skipped. percentage 0 = the command default (5); valid 0-100 ids dimension ids; null = every dimension in the document Returns the counts: Changed and Skipped (already overridden).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `percentage` | `double` | `5` |\n| `ids` | `IEnumerable ` | `null` |\n\nReturns `DimensionValueReport`.","metadata":{"title":"DraftingExtraApi","section":"ReduceDimensions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#reducedimensions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#reducedimensions","collection":"scripting","hash":"28535694555a03be6b033ac01eef32d5","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — RestoreDimensions\n\n```csharp\nint DraftingExtraApi.RestoreDimensions(IEnumerable<Guid> ids = null)\n```\n\nRestores distance dimensions to their real measured value by putting back the \"<>\" placeholder (same as ArtisanDimensionsRestore / ...BySelection). Dimensions that already show the real value are left alone. ids dimension ids; null = every dimension in the document Returns the number of dimensions restored.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ids` | `IEnumerable ` | `null` |\n\nReturns `int`.","metadata":{"title":"DraftingExtraApi","section":"RestoreDimensions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#restoredimensions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#restoredimensions","collection":"scripting","hash":"b5d32fe1dc428cde7f530ea3ffd726b5","indexed_by":"docs-index"}},{"content":"DraftingExtraApi — SaveReportTemplate\n\n```csharp\nstring DraftingExtraApi.SaveReportTemplate(string name, bool overwrite = false)\n```\n\nSaves the ACTIVE document as a report template (ArtisanSaveReportTemplate without the save dialog): a \"Save As\" into the report-templates folder, so the document adopts that path. Design a layout page with the [TAGS] first; afterwards it is listed by DraftingApi.ReportTemplates() and usable with DraftingApi.CreateReportFromTemplate(name). name template name (\".3dm\" optional) or a full .3dm path overwrite true = replace an existing template of that name Returns the full path written.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `name` | `string` | required |\n| `overwrite` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DraftingExtraApi","section":"SaveReportTemplate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#savereporttemplate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting-extra/#savereporttemplate","collection":"scripting","hash":"2372d82b26d1c939ace1ff82e807a2a0","indexed_by":"docs-index"}},{"content":"DraftingApi\n\nDocumentation / drafting helpers: the report sheet and the gems map, scriptable without their interactive prompts.\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi\n```\n\nSee also the guide, Drafting, and the Python package, `ra.drafting`.","metadata":{"title":"DraftingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/","collection":"scripting","hash":"c2117d3773d38e8bba0742f67f4f9cbe","indexed_by":"docs-index"}},{"content":"DraftingApi — Methods\n\n| Method | |\n|---|---|\n| `CreateBreakdownTable` | Draws one of the four Breakdown cost tables into the document at `point` (the ArtisanBreakdownMetals / ArtisanBreakdownGems / ArtisanBreakdownProcesses / ArtisanBreakdownExtras commands without their pick prompt). |\n| `CreateGemsMap` | Draws the gems map (the 2D stone chart: one colored circle + size label per gem in the document) centered at `point`, same as the ArtisanGemsMap command but without the pick prompt. |\n| `CreateGemsTable` | Draws the gems list table (the ArtisanGemsList command family) starting at `point`: one row per distinct gem with SHAPE, size \"X x Y\", carats, quantity, total carats and compound, rows 1.5 units apart, in black. |\n| `CreateMetalsTable` | Draws the metals weight table (the ArtisanMetalsList / ArtisanMetalsListBySelection commands without their checklist dialog and prompts) at `point`: a header row (Weight / Processed) and one row per requested metal with the estimated cast weight computed from the summed volume of the measured objects -- gems are skipped; Breps, extrusions, meshes and SubDs count. |\n| `CreateReport` | Creates the A4 report layout page for the current design (same as the ArtisanReport command): logo, four detail views (top, perspective, front, side), title block with name, metal + weight, finger size, notes and date. |\n| `CreateReportFromTemplate` | Creates a report from a TEMPLATE (the Report panel's Create button, headless): imports the template's layout as the next \"Report N\" page, zooms every detail, and replaces the template tags ([CLIENT_ID], [PO], [STYLE], [CAD_DESIGNER], [DESCRIPTION], metals, [PRODUCT_SIZE], custom fields...) plus the special list markers (METAL_LIST, GEM_LIST, PROCESS_LIST, EXTRA_LIST, GEM_MAP). |","metadata":{"title":"DraftingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#methods","collection":"scripting","hash":"0152ed07fee9d6655559a7d6c819a166","indexed_by":"docs-index"}},{"content":"DraftingApi — Methods\n\n| Method | |\n|---|---|\n| `ExportGemsList` | Writes the gems list as a semicolon-delimited CSV (same columns as the ArtisanGemsListToExcel command: Shape, Size X, Size Y, Carats, Quantity, Total Carats), without the save-file dialog. |\n| `GenerateDimensions` | Generic auto-dimensioning of the design. |\n| `GenerateDimensionsByBox` | Bounding-box dimensions (the ArtisanGenerateDimensionsByBox command without its selection prompt): meshes the given objects together at low resolution and draws three linear dimensions around the global bounding box -- width in X above the model, depth in Y at its right and the real height in Z. |\n| `GenerateDimensionsFromBangle` | Bangle dimensions (the ArtisanGenerateDimensionsFromBangle command without its selection prompt): meshes the given objects together at low resolution, sections the mesh with the world XY / YZ planes and dimensions the four cross sections (top, bottom, left, right) plus the two global spans between them. |\n| `GenerateDimensionsFromRing` | Ring-specific dimensions: bottom, top and size annotations built from the ring mesh and the document's finger size. |\n| `ReportTemplates` | The report template names available to CreateReportFromTemplate — the *.3dm files in the configured report-templates folder, without extension. |","metadata":{"title":"DraftingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#methods","collection":"scripting","hash":"e490500fd31ce3da197205aa52ed1e32","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateBreakdownTable\n\n```csharp\nvoid DraftingApi.CreateBreakdownTable(string category, Point3d point, double scale = 0)\n```\n\nDraws one of the four Breakdown cost tables into the document at `point` (the ArtisanBreakdownMetals / ArtisanBreakdownGems / ArtisanBreakdownProcesses / ArtisanBreakdownExtras commands without their pick prompt). One method instead of four because the commands are identical except for the table they draw. category METALS | GEMS | PROCESSES | EXTRAS (case-insensitive). point insertion point (top-left corner of the table). scale layout / text-height scale factor; 0 = the tool default (2). Like the commands, when no breakdown has been computed yet (or it is empty) it is computed first from the active manufacturer -- the commands ask with a yes/no dialog, here it happens silently through the same engine PricingApi.Calculate() uses. The texts are grouped as BREAKDOWN_METALS / BREAKDOWN_GEMS / BREAKDOWN_PROCESSES / BREAKDOWN_EXTRAS respectively.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `category` | `string` | required |\n| `point` | `Point3d` | required |\n| `scale` | `double` | `0` |","metadata":{"title":"DraftingApi","section":"CreateBreakdownTable","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createbreakdowntable","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createbreakdowntable","collection":"scripting","hash":"3935cdea81ecee9c0f265e8371aa0aa3","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateGemsMap\n\n```csharp\nvoid DraftingApi.CreateGemsMap(\n    Point3d point,\n    double scale = 2,\n    bool spherical = false,\n    bool expandOverlapping = false)\n```\n\nDraws the gems map (the 2D stone chart: one colored circle + size label per gem in the document) centered at `point`, same as the ArtisanGemsMap command but without the pick prompt. scale drawing scale factor (command default 2; valid 0.01-10) spherical false = planar projection (default), true = spherical expandOverlapping true = push overlapping circles apart so every label is readable The resulting curves/texts/hatches are grouped as \"GEMS_MAP\". With no gems in the document it draws nothing and reports it on the command line, same as the command.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `point` | `Point3d` | required |\n| `scale` | `double` | `2` |\n| `spherical` | `bool` | `false` |\n| `expandOverlapping` | `bool` | `false` |","metadata":{"title":"DraftingApi","section":"CreateGemsMap","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#creategemsmap","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#creategemsmap","collection":"scripting","hash":"0603898c39349b68cb9455ee1d23a807","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateGemsTable\n\n```csharp\nvoid DraftingApi.CreateGemsTable(\n    Point3d point,\n    bool onlySelection = false,\n    bool groupBySelection = false)\n```\n\nDraws the gems list table (the ArtisanGemsList command family) starting at `point`: one row per distinct gem with SHAPE, size \"X x Y\", carats, quantity, total carats and compound, rows 1.5 units apart, in black. onlySelection true = only the currently selected gems (the ArtisanGemsListBySelection command); false = every visible gem in the document (ArtisanGemsList). groupBySelection true = the ArtisanGemsListBySelectionGroups variant: the SELECTED gems are bucketed by their Rhino group and drawn as one sub-table per group, each with the group's name as a header row (plus an \"Ungrouped\" section for gems in no group). Implies onlySelection. The texts are grouped as \"GEMS_LIST\" (\"GEMS_LIST_BY_SELECTION_GROUPS\" for the grouped variant). With no visible gems it draws nothing, like the command; the selection variants throw when the selection holds no gems, mirroring the commands' cancel.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `point` | `Point3d` | required |\n| `onlySelection` | `bool` | `false` |\n| `groupBySelection` | `bool` | `false` |","metadata":{"title":"DraftingApi","section":"CreateGemsTable","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#creategemstable","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#creategemstable","collection":"scripting","hash":"796752caaf62d264864864a612d7361a","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateMetalsTable\n\n```csharp\nvoid DraftingApi.CreateMetalsTable(\n    Point3d point,\n    IEnumerable<string> metals,\n    bool includeWax = false,\n    bool onlySelection = false)\n```\n\nDraws the metals weight table (the ArtisanMetalsList / ArtisanMetalsListBySelection commands without their checklist dialog and prompts) at `point`: a header row (Weight / Processed) and one row per requested metal with the estimated cast weight computed from the summed volume of the measured objects -- gems are skipped; Breps, extrusions, meshes and SubDs count. The Processed column is the weight after finishing (the configured processed-weight percentage removed); the wax row has none. Everything is added to a new unnamed group, like the commands. metals Metal enum names to list (the command's checklist: GOLD_24 ... PALLADIUM), case-insensitive. Rows keep the checklist order regardless of input order. includeWax true = append the wax weight row (the checklist's Wax entry), using the configured wax density. onlySelection true = measure only the currently selected objects (ArtisanMetalsListBySelection); false = every non-hidden object in the document.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `point` | `Point3d` | required |\n| `metals` | `IEnumerable ` | required |\n| `includeWax` | `bool` | `false` |\n| `onlySelection` | `bool` | `false` |","metadata":{"title":"DraftingApi","section":"CreateMetalsTable","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createmetalstable","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createmetalstable","collection":"scripting","hash":"996d2dd71ab12144e77c854d5c23643b","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateReport\n\n```csharp\nbool DraftingApi.CreateReport()\n```\n\nCreates the A4 report layout page for the current design (same as the ArtisanReport command): logo, four detail views (top, perspective, front, side), title block with name, metal + weight, finger size, notes and date. Returns true when the command reports success. Implemented by invoking the command itself -- it needs no input, and wrapping it keeps the report identical to the one users get from the ribbon (and picks up future improvements automatically).\n\nReturns `bool`.","metadata":{"title":"DraftingApi","section":"CreateReport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createreport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createreport","collection":"scripting","hash":"f1455f1fb6b369f1d1a27743f418f6b8","indexed_by":"docs-index"}},{"content":"DraftingApi — CreateReportFromTemplate\n\n```csharp\nstring DraftingApi.CreateReportFromTemplate(\n    string template = null,\n    string style = null,\n    string clientId = null,\n    string po = null,\n    string cadDesigner = null,\n    string description = null,\n    IDictionary<string, string> customFields = null,\n    bool sphericalGemsMap = false)\n```\n\nCreates a report from a TEMPLATE (the Report panel's Create button, headless): imports the template's layout as the next \"Report N\" page, zooms every detail, and replaces the template tags ([CLIENT_ID], [PO], [STYLE], [CAD_DESIGNER], [DESCRIPTION], metals, [PRODUCT_SIZE], custom fields...) plus the special list markers (METAL_LIST, GEM_LIST, PROCESS_LIST, EXTRA_LIST, GEM_MAP). template template name from ReportTemplates(); null = the first one (the panel's default selection) style/clientId/po/cadDesigner/description the title-block fields; null keeps the value the document already carries (the panel's fields) customFields extra [MY_FIELD] tag values by field name; merged over the document's saved custom fields sphericalGemsMap projection of the GEM_MAP marker The breakdown is recomputed silently when missing (the tags read it). Returns the name of the new layout page (e.g. \"Report 1\") — print it to PDF with DocumentApi.ReportPdf(path, pageName: thatName).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `template` | `string` | `null` |\n| `style` | `string` | `null` |\n| `clientId` | `string` | `null` |\n| `po` | `string` | `null` |\n| `cadDesigner` | `string` | `null` |\n| `description` | `string` | `null` |\n| `customFields` | `IDictionary ` | `null` |\n| `sphericalGemsMap` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DraftingApi","section":"CreateReportFromTemplate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createreportfromtemplate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#createreportfromtemplate","collection":"scripting","hash":"72dfcec70984abc52497792655e54980","indexed_by":"docs-index"}},{"content":"DraftingApi — ExportGemsList\n\n```csharp\nstring DraftingApi.ExportGemsList(\n    string path,\n    bool onlySelection = false,\n    bool useSystemDecimals = false)\n```\n\nWrites the gems list as a semicolon-delimited CSV (same columns as the ArtisanGemsListToExcel command: Shape, Size X, Size Y, Carats, Quantity, Total Carats), without the save-file dialog. path destination file; \".csv\" is appended when missing onlySelection true = only the currently selected gems useSystemDecimals true = format numbers with the system's decimal separator (the command's \"Force Point\" option inverted); default is invariant (point) Returns the full path actually written.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `onlySelection` | `bool` | `false` |\n| `useSystemDecimals` | `bool` | `false` |\n\nReturns `string`.","metadata":{"title":"DraftingApi","section":"ExportGemsList","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#exportgemslist","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#exportgemslist","collection":"scripting","hash":"1dd55e0d93abc2a4cd94edf254134d19","indexed_by":"docs-index"}},{"content":"DraftingApi — GenerateDimensions\n\n```csharp\nbool DraftingApi.GenerateDimensions()\n```\n\nGeneric auto-dimensioning of the design.\n\nReturns `bool`.\n\nGenerateDimensionsByBox\n```csharp\nvoid DraftingApi.GenerateDimensionsByBox(\n    IEnumerable<Guid> objectIds,\n    double offset = 2,\n    bool addBox = false)\n```\n\nBounding-box dimensions (the ArtisanGenerateDimensionsByBox command without its selection prompt): meshes the given objects together at low resolution and draws three linear dimensions around the global bounding box -- width in X above the model, depth in Y at its right and the real height in Z. Exactly like the command, the low resolution analysis mesh and a marker point at the Y dimension's plane origin are also left in the document. objectIds objects to dimension (the command's selection). offset gap between the geometry and the dimension lines (the command's Offset option; default 2, valid 0-100). addBox true = also add the bounding box as a Brep (the command's Box option).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `offset` | `double` | `2` |\n| `addBox` | `bool` | `false` |","metadata":{"title":"DraftingApi","section":"GenerateDimensions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensions","collection":"scripting","hash":"b8aa243aee433799d456453d26edf39e","indexed_by":"docs-index"}},{"content":"DraftingApi — GenerateDimensionsFromBangle\n\n```csharp\nvoid DraftingApi.GenerateDimensionsFromBangle(\n    IEnumerable<Guid> objectIds,\n    double offset = 2,\n    bool addBox = false)\n```\n\nBangle dimensions (the ArtisanGenerateDimensionsFromBangle command without its selection prompt): meshes the given objects together at low resolution, sections the mesh with the world XY / YZ planes and dimensions the four cross sections (top, bottom, left, right) plus the two global spans between them. The bangle is expected centered on the world origin, like the command expects. objectIds objects to dimension (the command's selection). offset gap between the geometry and the dimension lines (the command's Offset option; default 2, valid 0-100). addBox true = also add the bounding box as a Brep (the command's Box option).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `offset` | `double` | `2` |\n| `addBox` | `bool` | `false` |","metadata":{"title":"DraftingApi","section":"GenerateDimensionsFromBangle","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensionsfrombangle","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensionsfrombangle","collection":"scripting","hash":"81ed039a9085d102ce6c9d16b1aea98c","indexed_by":"docs-index"}},{"content":"DraftingApi — GenerateDimensionsFromRing\n\n```csharp\nbool DraftingApi.GenerateDimensionsFromRing()\n```\n\nRing-specific dimensions: bottom, top and size annotations built from the ring mesh and the document's finger size.\n\nReturns `bool`.\n\nReportTemplates\n```csharp\nIReadOnlyList<string> DraftingApi.ReportTemplates()\n```\n\nThe report template names available to CreateReportFromTemplate — the *.3dm files in the configured report-templates folder, without extension. Read-only.\n\nReturns `IReadOnlyList `.","metadata":{"title":"DraftingApi","section":"GenerateDimensionsFromRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensionsfromring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/drafting/#generatedimensionsfromring","collection":"scripting","hash":"548619b49ff33d1acc02518d10531f6b","indexed_by":"docs-index"}},{"content":"ElementsApi\n\nThe user's saved ELEMENTS: the named presets the panels store from their \"save as element\" button (a bezel called \"Chunky\", a basket called \"Client A\"...). They were invisible to scripting -- a whole category of the user's own work that no script could see or reuse. Queries and the parameters themselves, so every creator can build from a preset (element=...) and handles can apply one (SetElement), plus SaveFromObject to store an object as a new element, and library management: rename, duplicate, favorite, delete (permanent), export and import bundles.\n\n```python\nfrom ArtisanPlugin.Scripting import ElementsApi\n```\n\nSee also the guide, API Reference › Elements, and the Python package, `ra.elements`.","metadata":{"title":"ElementsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/","collection":"scripting","hash":"48dd2e9a9f5db98c45fb2931bc939654","indexed_by":"docs-index"}},{"content":"ElementsApi — Methods\n\n| Method | |\n|---|---|\n| `Count` | Number of objects of this kind in the active document. |\n| `Delete` | PERMANENTLY deletes a saved element (as the panels' delete does; there is no trash). |\n| `Duplicate` | Copies a saved element as `newName` (empty = \" (Copy)\"), sharing its preview image. |\n| `ExportBundle` | Exports a saved element as a bundle file (its parameters and preview) to `filePath` (.zip), to share it or move it to another machine. |\n| `Find` | Finds one saved element by name within a type (case-insensitive). |\n| `GetParametersJson` | The stored parameters of a saved element, as JSON. |\n| `ImportBundle` | Imports an element bundle exported by ExportBundle (or the panels) into the library. |\n| `List` | The saved elements of one type, newest library order. |\n| `Rename` | Renames a saved element; the new name must be free within its type. |\n| `SaveFromObject` | Saves an existing parametric object's parameters as a new element (the panels' \"save as element\"): `objectId` is the object, or any member of a parametric group (bail, basket, halo...); `name` must be new within its type. |\n| `SetFavorite` | Marks or unmarks a saved element as favorite (favorites list first). |\n| `Types` | The element types the library can hold, as the names List() takes. |","metadata":{"title":"ElementsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#methods","collection":"scripting","hash":"6f22a64ba37dcd47b65ba7bb5488455e","indexed_by":"docs-index"}},{"content":"ElementsApi — Count\n\n```csharp\nint ElementsApi.Count(string type)\n```\n\nNumber of objects of this kind in the active document.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n\nReturns `int`.\n\nDelete\n```csharp\nbool ElementsApi.Delete(string type, string name)\n```\n\nPERMANENTLY deletes a saved element (as the panels' delete does; there is no trash). Objects built from it are not affected. Returns true when it is gone.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n\nReturns `bool`.","metadata":{"title":"ElementsApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#count","collection":"scripting","hash":"91f8d73efc970f26f27f8176198931bb","indexed_by":"docs-index"}},{"content":"ElementsApi — Duplicate\n\n```csharp\nElementInfo ElementsApi.Duplicate(string type, string name, string newName = null)\n```\n\nCopies a saved element as `newName` (empty = \" (Copy)\"), sharing its preview image.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `newName` | `string` | `null` |\n\nReturns `ElementInfo`.","metadata":{"title":"ElementsApi","section":"Duplicate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#duplicate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#duplicate","collection":"scripting","hash":"24a01bdbd1014cc745965038f5989eb3","indexed_by":"docs-index"}},{"content":"ElementsApi — ExportBundle\n\n```csharp\nstring ElementsApi.ExportBundle(string type, string name, string filePath)\n```\n\nExports a saved element as a bundle file (its parameters and preview) to `filePath` (.zip), to share it or move it to another machine. Returns the written path.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `filePath` | `string` | required |\n\nReturns `string`.","metadata":{"title":"ElementsApi","section":"ExportBundle","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#exportbundle","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#exportbundle","collection":"scripting","hash":"13931792279de26e7488774984e0f381","indexed_by":"docs-index"}},{"content":"ElementsApi — Find\n\n```csharp\nElementInfo ElementsApi.Find(string type, string name)\n```\n\nFinds one saved element by name within a type (case-insensitive). Throws listing the available names when it does not match, so a script or an agent can correct itself.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n\nReturns `ElementInfo`.","metadata":{"title":"ElementsApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#find","collection":"scripting","hash":"16ed4a537fe3351a460ccaeee46004e3","indexed_by":"docs-index"}},{"content":"ElementsApi — GetParametersJson\n\n```csharp\nstring ElementsApi.GetParametersJson(string type, string name)\n```\n\nThe stored parameters of a saved element, as JSON. Mostly useful to inspect a preset; the facades take the element by name instead.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n\nReturns `string`.","metadata":{"title":"ElementsApi","section":"GetParametersJson","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#getparametersjson","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#getparametersjson","collection":"scripting","hash":"dcbd2117807a99e1c51c947e5a11cf2a","indexed_by":"docs-index"}},{"content":"ElementsApi — ImportBundle\n\n```csharp\nElementInfo ElementsApi.ImportBundle(string filePath)\n```\n\nImports an element bundle exported by ExportBundle (or the panels) into the library. Returns the imported element.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `filePath` | `string` | required |\n\nReturns `ElementInfo`.\n\nList\n```csharp\nIReadOnlyList<ElementInfo> ElementsApi.List(string type)\n```\n\nThe saved elements of one type, newest library order. `type` is one of Types() -- \"Bezel\", \"Basket\", \"Halo\", \"Peghead\"...\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ElementsApi","section":"ImportBundle","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#importbundle","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#importbundle","collection":"scripting","hash":"0c998606c139c14de9369c8d2d2fe8fa","indexed_by":"docs-index"}},{"content":"ElementsApi — Rename\n\n```csharp\nElementInfo ElementsApi.Rename(string type, string name, string newName)\n```\n\nRenames a saved element; the new name must be free within its type.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `newName` | `string` | required |\n\nReturns `ElementInfo`.","metadata":{"title":"ElementsApi","section":"Rename","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#rename","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#rename","collection":"scripting","hash":"58fc5abd7d628024eda05dcbb698d39c","indexed_by":"docs-index"}},{"content":"ElementsApi — SaveFromObject\n\n```csharp\nElementInfo ElementsApi.SaveFromObject(Guid objectId, string name)\n```\n\nSaves an existing parametric object's parameters as a new element (the panels' \"save as element\"): `objectId` is the object, or any member of a parametric group (bail, basket, halo...); `name` must be new within its type. No preview image. Returns the saved element.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectId` | `Guid` | required |\n| `name` | `string` | required |\n\nReturns `ElementInfo`.","metadata":{"title":"ElementsApi","section":"SaveFromObject","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#savefromobject","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#savefromobject","collection":"scripting","hash":"39283b82984ddf106dbe111605ef68fe","indexed_by":"docs-index"}},{"content":"ElementsApi — SetFavorite\n\n```csharp\nElementInfo ElementsApi.SetFavorite(string type, string name, bool favorite = true)\n```\n\nMarks or unmarks a saved element as favorite (favorites list first).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `name` | `string` | required |\n| `favorite` | `bool` | `true` |\n\nReturns `ElementInfo`.","metadata":{"title":"ElementsApi","section":"SetFavorite","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#setfavorite","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#setfavorite","collection":"scripting","hash":"79061a06d8beb93950a47b3dbfd1bf6d","indexed_by":"docs-index"}},{"content":"ElementsApi — Types\n\n```csharp\nIReadOnlyList<string> ElementsApi.Types()\n```\n\nThe element types the library can hold, as the names List() takes.\n\nReturns `IReadOnlyList `.","metadata":{"title":"ElementsApi","section":"Types","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#types","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/elements/#types","collection":"scripting","hash":"f49cbfe1307658b65333f2443421d2bd","indexed_by":"docs-index"}},{"content":"EngravingApi\n\nText engraved around a ring band (the ArtisanEngraveRing tool -- the Engraving entry of the Smart Components tab).\n\n```python\nfrom ArtisanPlugin.Scripting import EngravingApi\n```\n\nSee also the guide, Accessories › Engraving, and the Python package, `ra.engraving`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Engraves `text` around a ring of the given inner `diameter` (mm; 0 = the session's current finger size, default 17.35). |","metadata":{"title":"EngravingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/engraving/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/engraving/","collection":"scripting","hash":"e5e1df790eb01b4d1c1ddbee0d301c01","indexed_by":"docs-index"}},{"content":"EngravingApi — Create\n\n```csharp\nIReadOnlyList<Guid> EngravingApi.Create(\n    string text,\n    double diameter = 0,\n    double angle = 0,\n    double height = 0,\n    double spacing = 0,\n    double thickness = 0,\n    string font = null,\n    string fontStyle = null,\n    string horizontalAlign = null,\n    string verticalAlign = null,\n    Plane? plane = null)\n```\n\nEngraves `text` around a ring of the given inner `diameter` (mm; 0 = the session's current finger size, default 17.35). `angle` rotates the text around the ring (the tool's gumball, degrees). `thickness` 0 keeps flat engraving curves only; > 0 also builds the solid text. Defaults: font Bienchen regular, height 1.5, spacing 0.5, horizontal align CENTER, vertical align CENTER. `plane` is the text orientation plane (default: active construction plane). Returns the ids of the created objects (solid text on the metal layer, engraving curves on the user layer, all grouped as an editable Engrave Ring component).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `text` | `string` | required |\n| `diameter` | `double` | `0` |\n| `angle` | `double` | `0` |\n| `height` | `double` | `0` |\n| `spacing` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `font` | `string` | `null` |\n| `fontStyle` | `string` | `null` |\n| `horizontalAlign` | `string` | `null` |\n| `verticalAlign` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"EngravingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/engraving/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/engraving/#create","collection":"scripting","hash":"a90b5cdbef4547007c33fcc34da224dc","indexed_by":"docs-index"}},{"content":"EternityApi\n\nEternity bands with stones all around.\n\n```python\nfrom ArtisanPlugin.Scripting import EternityApi\n```\n\nSee also the guide, Shanks › Eternity, and the Python package, `ra.eternity`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IEternity` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IEternity` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds an eternity ring (the ArtisanEternity tool, headless): a band with gems all around, at the document's finger size. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Eternities currently selected in the active doc. |","metadata":{"title":"EternityApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/","collection":"scripting","hash":"6809a54f1f4ff891abfeca7af2ec88e2","indexed_by":"docs-index"}},{"content":"EternityApi — All\n\n```csharp\nIReadOnlyList<IEternity> EternityApi.All()\n```\n\n`IEternity` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IEternity> EternityApi.ByLayer(string layerName)\n```\n\n`IEternity` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"EternityApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#all","collection":"scripting","hash":"6fdb7ec3a1fa2f1ffe8347f502c6738c","indexed_by":"docs-index"}},{"content":"EternityApi — Count\n\n```csharp\nint EternityApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIEternity EternityApi.Create(\n    double gemSize = 0,\n    string gemShape = null,\n    double shankWidth = 0,\n    double shankHeight = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds an eternity ring (the ArtisanEternity tool, headless): a band with gems all around, at the document's finger size. Standalone -- no mother gem or curve needed. Millimetres; 0 keeps the tool default (or the user's saved defaults): gemSize ~2 (round diamonds), shankWidth 2.25, shankHeight 1.5. `gemShape` accepts GemShape names (default ROUND). `fingerDiameter` 0 = the document's finger size. `plane` omitted = world XY. `profile` picks a RING_PROFILE asset by name for the shank; omitted = the default profile. Returns an IEternity handle to the new ring group. `element` = name of a saved eternity element (ElementsApi.List(\"Eternity\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemSize` | `double` | `0` |\n| `gemShape` | `string` | `null` |\n| `shankWidth` | `double` | `0` |\n| `shankHeight` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IEternity`.","metadata":{"title":"EternityApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#count","collection":"scripting","hash":"9fd13aef33121f4c146171d9c2759177","indexed_by":"docs-index"}},{"content":"EternityApi — Find\n\n```csharp\nIEternity EternityApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IEternity`.\n\nSelected\n```csharp\nIReadOnlyList<IEternity> EternityApi.Selected()\n```\n\nEternities currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"EternityApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#find","collection":"scripting","hash":"3590394313a122963ff88e9962175c80","indexed_by":"docs-index"}},{"content":"EternityApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIEternity\n*Handle* — extends `IParametricObject`.\n\nEternity ring: a band with gems all around. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Bezels` | `IEternityBezels` | get | |\n| `Gems` | `IEternityGems` | get | Parameter sections — each is a live view over the ring's stored parameters; their setters regenerate the ring in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Prongs` | `IEternityProngs` | get | |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | e.g. \"6\", \"M\" |\n| `RingSizeRegion` | `string` | get | e.g. \"US\", \"EU\" |\n| `Shank` | `IEternityShank` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Eternity element (ElementsApi.List(\"Eternity\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |","metadata":{"title":"EternityApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#handles-and-sections","collection":"scripting","hash":"adc0ed167080752094e990c333e2c281","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityShank\n\n*Section*.\n\nThe band: an upper and a lower half plus the caps where they meet.\n\n| Property | Type | | |\n|---|---|---|---|\n| `EndingCap` | `double` | get | mm |\n| `Lower` | `IEternityShankParams` | get | |\n| `StartingCap` | `double` | get | mm |\n| `Upper` | `IEternityShankParams` | get | |\n\n| Method | |\n|---|---|\n| `void SetEndingCap(double cap)` | |\n| `void SetStartingCap(double cap)` | |","metadata":{"title":"EternityApi","section":"IEternityShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityshank","collection":"scripting","hash":"a421cc880baa415a81c144c9692d6298","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityShankParams\n\n*Section*.\n\nOne of the two band halves (upper / lower) of an eternity ring.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Height` | `double` | get | mm |\n| `HeightComfort` | `double` | get | mm |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `ProfileOrientation` | `int` | get | 0 = Natural, 1 = Reverse |\n| `ProfileThickness` | `double` | get | mm |\n| `ProfileType` | `int` | get | |\n| `Type` | `string` | get | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetHeight(double height)` | |\n| `void SetHeightComfort(double comfort)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetProfileOrientation(int orientation)` | |\n| `void SetProfileThickness(double thickness)` | |\n| `void SetProfileType(int profileType)` | |\n| `void SetType(string type)` | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `void SetWidth(double width)` | |","metadata":{"title":"EternityApi","section":"IEternityShankParams","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityshankparams","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityshankparams","collection":"scripting","hash":"20be4dc838194d6c14a12e41bf5143f8","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityProngs\n\n*Section*.\n\nThe prongs holding the stones.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomDiameter` | `double` | get | mm |\n| `BottomDistance` | `double` | get | mm |\n| `Distribution` | `string` | get | \"SHARED\" or \"INDIVIDUAL_FOR_EACH_GEM\" |\n| `ExpansionManufacturing` | `double` | get | mm |\n| `HeightOverGirdle` | `double` | get | mm |\n| `IndividualBottomDistance` | `double` | get | mm — used when Distribution is individual |\n| `IndividualTopDistance` | `double` | get | mm — used when Distribution is individual |\n| `Mode` | `string` | get | \"STRAIGHT\" or \"CURVED\" |\n| `TopDiameter` | `double` | get | mm |\n| `TopDistance` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetBottomDiameter(double diameter)` | |\n| `void SetBottomDistance(double distance)` | |\n| `void SetDistribution(string distribution)` | \"SHARED\" or \"INDIVIDUAL_FOR_EACH_GEM\" |\n| `void SetExpansionManufacturing(double expansion)` | |\n| `void SetHeightOverGirdle(double height)` | |\n| `void SetIndividualBottomDistance(double distance)` | |\n| `void SetIndividualTopDistance(double distance)` | |\n| `void SetMode(string mode)` | \"STRAIGHT\" or \"CURVED\" |\n| `void SetTopDiameter(double diameter)` | |\n| `void SetTopDistance(double distance)` | |","metadata":{"title":"EternityApi","section":"IEternityProngs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityprongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityprongs","collection":"scripting","hash":"19bc4441b43f84d25222ca8d38354f41","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityGems\n\n*Section*.\n\nThe stones that run around the band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CaratWeight` | `double` | get | |\n| `Distribution` | `string` | get | \"FULL\", \"HALF\", \"THREEQUARTERS\", \"FIVESTONES\", \"SEVENSTONES\", \"NINESTONES\" |\n| `Material` | `string` | get | \"Diamond\", \"Ruby\", ... |\n| `MinDistance` | `double` | get | minimum distance between stones, mm |\n| `MoveInZ` | `double` | get | radial displacement of the stone row, mm |\n| `Orientation` | `string` | get | \"NATURAL\" or \"ROTATED\" |\n| `Shape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `SizeX` | `double` | get | mm |\n| `SizeY` | `double` | get | mm |\n| `SizeZ` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetCaratWeight(double carat)` | |\n| `void SetDistribution(string distribution)` | |\n| `void SetMaterial(string material)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetMoveInZ(double moveInZ)` | |\n| `void SetOrientation(string orientation)` | \"NATURAL\" or \"ROTATED\" |\n| `void SetShape(string shape)` | |\n| `void SetSize(double sizeX, double sizeY, double sizeZ)` | |","metadata":{"title":"EternityApi","section":"IEternityGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternitygems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternitygems","collection":"scripting","hash":"ce67f22719c1cb762bf8dacd2d797315","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityBezels\n\n*Section*.\n\nThe bezel rails wrapping the stone row.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomRail` | `IEternityRail` | get | |\n| `ProfileShape` | `string` | get | \"ROUND\" or \"SQUARE\" |\n| `RailMode` | `string` | get | \"SINGLE\" or \"DOUBLE\" |\n| `RailShape` | `string` | get | \"ROUND\", \"RECTANGLE\" or \"OVAL\" |\n| `RemoveFinger` | `bool` | get | |\n| `TopRail` | `IEternityRail` | get | |\n\n| Method | |\n|---|---|\n| `void SetProfileShape(string shape)` | \"ROUND\" or \"SQUARE\" |\n| `void SetRailMode(string mode)` | \"SINGLE\" or \"DOUBLE\" |\n| `void SetRailShape(string shape)` | \"ROUND\", \"RECTANGLE\" or \"OVAL\" |\n| `void SetRemoveFinger(bool remove)` | |","metadata":{"title":"EternityApi","section":"IEternityBezels","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternitybezels","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternitybezels","collection":"scripting","hash":"121d3393f9e1760d80fcf34d6cb44d76","indexed_by":"docs-index"}},{"content":"EternityApi — IEternityRail\n\n*Section*.\n\nOne of the two rails that form the bezel around the stones.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Diameter` | `double` | get | mm |\n| `Height` | `double` | get | mm |\n| `MoveInZ` | `double` | get | mm |\n| `ThreadDiameter` | `double` | get | mm |\n| `ThreadX` | `double` | get | mm |\n| `ThreadY` | `double` | get | mm |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetDiameter(double diameter)` | |\n| `void SetHeight(double height)` | |\n| `void SetMoveInZ(double moveInZ)` | |\n| `void SetThread(double x, double y)` | |\n| `void SetThreadDiameter(double diameter)` | |\n| `void SetWidth(double width)` | |","metadata":{"title":"EternityApi","section":"IEternityRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityrail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/eternity/#ieternityrail","collection":"scripting","hash":"58216a3573de92a6058e3389edbaca61","indexed_by":"docs-index"}},{"content":"FileSearchApi\n\nScriptable access to the ArtisanFileSearch index: instant in-RAM search over the user's indexed design files (by file name). Read-only.\n\n```python\nfrom ArtisanPlugin.Scripting import FileSearchApi\n```\n\nSee also the guide, API Reference › File Search, and the Python package, `ra.file_search`.\n\nMethods\n| Method | |\n|---|---|\n| `Count` | Number of files currently in the index. |\n| `Reindex` | Rebuilds the index from the configured folders on a background thread and returns immediately -- results of a Search right after may still be from the old index. |\n| `Search` | Searches the file index. |","metadata":{"title":"FileSearchApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/","collection":"scripting","hash":"b23882a19b3dc5ded0e9c7643ffee2fa","indexed_by":"docs-index"}},{"content":"FileSearchApi — Count\n\n```csharp\nint FileSearchApi.Count()\n```\n\nNumber of files currently in the index.\n\nReturns `int`.\n\nReindex\n```csharp\nvoid FileSearchApi.Reindex(bool full = false)\n```\n\nRebuilds the index from the configured folders on a background thread and returns immediately -- results of a Search right after may still be from the old index. `full` forces a clean re-scan.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `full` | `bool` | `false` |","metadata":{"title":"FileSearchApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/#count","collection":"scripting","hash":"45372f6db51eb2e0eb976dc0a6b5c496","indexed_by":"docs-index"}},{"content":"FileSearchApi — Search\n\n```csharp\nIReadOnlyList<FileSearchEntry> FileSearchApi.Search(string query, int max = 50)\n```\n\nSearches the file index. Multiple whitespace-separated tokens must ALL match (order-independent); results are ranked exact-name, starts-with, contains. An EMPTY query returns the most recently modified files. Each entry has: FullPath, FileName, Extension, Size (bytes) and ModifiedUtc.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `query` | `string` | required |\n| `max` | `int` | `50` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"FileSearchApi","section":"Search","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/#search","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file-search/#search","collection":"scripting","hash":"3967b028a2de32387545a62f172e3f8d","indexed_by":"docs-index"}},{"content":"FileApi\n\nFile-menu utilities that are not the plain open/save lifecycle (that one lives in DocumentApi): standardizing an imported document, moving the user's element library between machines, and the template.\n\n```python\nfrom ArtisanPlugin.Scripting import FileApi\n```\n\nSee also the Python package, `ra.files`.","metadata":{"title":"FileApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/","collection":"scripting","hash":"5dd72bdcb0c327a302774e9a04aeb742","indexed_by":"docs-index"}},{"content":"FileApi — Methods\n\n| Method | |\n|---|---|\n| `ExportElements` | Exports every saved element of one type to a JSON file (the ArtisanExportElementsByType tool, headless) -- the way to carry the user's presets (bezels, baskets, halos...) to another machine. |\n| `ImportElements` | Imports elements into the user's library (the ArtisanImportElementsByFile tool, headless): either a single \".raelement\" bundle (element + preview) or a \".json\" array as written by ExportElements. |\n| `SaveAsTemplate` | Saves the active document as the Artisan template (the ArtisanSaveAsTemplate tool, headless): Rhino's SaveAsTemplate to \" /Templates/template.3dm\", the file ArtisanNew starts from. |\n| `Standardize` | Standardizes a document that came from elsewhere (the ArtisanStandardize tool, headless), running the same sequence as the command: explode every block instance, recover the gems (ArtisanGemsRecover), move solids/meshes to the metal layers (ArtisanOrganizeObjectsByLayers), purge all render materials, re-apply the Artisan design materials, and estimate the ring size. |","metadata":{"title":"FileApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#methods","collection":"scripting","hash":"2b8963db9ccbd93dfd3cff0618ad62e1","indexed_by":"docs-index"}},{"content":"FileApi — ExportElements\n\n```csharp\nElementsExport FileApi.ExportElements(string type, string path)\n```\n\nExports every saved element of one type to a JSON file (the ArtisanExportElementsByType tool, headless) -- the way to carry the user's presets (bezels, baskets, halos...) to another machine. `type` is one of ElementsApi.Types() (\"Bezel\", \"Basket\", \"Halo\", \"Peghead\"...); the store's own names (\"ADVANCED_BASKET\") are also accepted. '.json' is appended when missing; the folder is created.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `type` | `string` | required |\n| `path` | `string` | required |\n\nReturns `ElementsExport`.","metadata":{"title":"FileApi","section":"ExportElements","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#exportelements","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#exportelements","collection":"scripting","hash":"018df7aad48f5f424996213a162c03da","indexed_by":"docs-index"}},{"content":"FileApi — ImportElements\n\n```csharp\nElementsImport FileApi.ImportElements(string path)\n```\n\nImports elements into the user's library (the ArtisanImportElementsByFile tool, headless): either a single \".raelement\" bundle (element + preview) or a \".json\" array as written by ExportElements. Elements that already exist (same id) are skipped, like the tool; where the tool asks \"add the new ones?\" this just adds them. Returns what was imported.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n\nReturns `ElementsImport`.","metadata":{"title":"FileApi","section":"ImportElements","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#importelements","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#importelements","collection":"scripting","hash":"cbe81513cbabe082a687ff14ba0c8290","indexed_by":"docs-index"}},{"content":"FileApi — SaveAsTemplate\n\n```csharp\nstring FileApi.SaveAsTemplate(string path = null)\n```\n\nSaves the active document as the Artisan template (the ArtisanSaveAsTemplate tool, headless): Rhino's SaveAsTemplate to \" /Templates/template.3dm\", the file ArtisanNew starts from. `path` overrides the destination ('.3dm' appended, folder created). Returns the full path written.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | `null` |\n\nReturns `string`.","metadata":{"title":"FileApi","section":"SaveAsTemplate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#saveastemplate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#saveastemplate","collection":"scripting","hash":"a9c61c339010f0b5f3c7a1c4b0c872cf","indexed_by":"docs-index"}},{"content":"FileApi — Standardize\n\n```csharp\nStandardizeResult FileApi.Standardize()\n```\n\nStandardizes a document that came from elsewhere (the ArtisanStandardize tool, headless), running the same sequence as the command: explode every block instance, recover the gems (ArtisanGemsRecover), move solids/meshes to the metal layers (ArtisanOrganizeObjectsByLayers), purge all render materials, re-apply the Artisan design materials, and estimate the ring size. Long on heavy documents. Returns counts of what was cleaned.\n\nReturns `StandardizeResult`.","metadata":{"title":"FileApi","section":"Standardize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#standardize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/file/#standardize","collection":"scripting","hash":"a2c856f38974f1968b404fbdae036041","indexed_by":"docs-index"}},{"content":"GemOrientationApi\n\nGem plane orientation fixes. Rotating a gem in place is GemToolsApi.RotateGems / IGem.Rotate; turning the stone over is IGem.Flip. This facade covers the remaining command, ArtisanGemsFlipPlane, which touches only the gem's stored plane.\n\n```python\nfrom ArtisanPlugin.Scripting import GemOrientationApi\n```\n\nSee also the Python package, `ra.gem_orientation`.","metadata":{"title":"GemOrientationApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-orientation/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-orientation/","collection":"scripting","hash":"6752751d5b087307dc1793866144cf21","indexed_by":"docs-index"}},{"content":"GemOrientationApi — Methods\n\n| Method | |\n|---|---|\n| `FlipPlane` | The ArtisanGemsFlipPlane command, headless: flips the parametric plane stored in each gem (its Z axis is reversed) WITHOUT moving the stone's geometry. |\n\nFlipPlane\n```csharp\nint GemOrientationApi.FlipPlane(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanGemsFlipPlane command, headless: flips the parametric plane stored in each gem (its Z axis is reversed) WITHOUT moving the stone's geometry. Use it when a gem's settings (prongs, baskets, cutters...) come out upside down: after the flip they regenerate on the other side. `gemIds` null/empty = the selected gems (the command requires an explicit selection). Returns the number of gems whose plane was flipped.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `int`.","metadata":{"title":"GemOrientationApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-orientation/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-orientation/#methods","collection":"scripting","hash":"0637af7d7ed02f8e756f2238667cfd6b","indexed_by":"docs-index"}},{"content":"GemSizeApi\n\nGems by millimetre size instead of carats. GemApi.Create sizes a stone from its carat weight; this facade takes the dimensions directly (the way the Gem Creator panel does) and reuses the exact same insertion pipeline, so the result is indistinguishable from a hand-placed gem.\n\n```python\nfrom ArtisanPlugin.Scripting import GemSizeApi\n```\n\nSee also the Python package, `ra.gem_size`.","metadata":{"title":"GemSizeApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/","collection":"scripting","hash":"8aeb1d443bab456b1d49f134ed4d2dee","indexed_by":"docs-index"}},{"content":"GemSizeApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Creates a gem from its dimensions in mm and adds it to the active document, returning the same IGem handle GemApi.Create returns. |\n| `SameSize` | The actual ArtisanGemBySize command: given some reference gems, finds every gem in the document with the same width (SizeX, 0.001 mm tolerance) -- e.g. |","metadata":{"title":"GemSizeApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#methods","collection":"scripting","hash":"7dd53e60ae6a7d6bbe13e0c117ce03e9","indexed_by":"docs-index"}},{"content":"GemSizeApi — Create\n\n```csharp\nIGem GemSizeApi.Create(\n    string shape,\n    string material,\n    double sizeX,\n    double sizeY = 0,\n    double sizeZ = 0,\n    Plane? plane = null)\n```\n\nCreates a gem from its dimensions in mm and adds it to the active document, returning the same IGem handle GemApi.Create returns. `shape` / `material` accept the GemApi vocabularies (GemApi.Shapes() / GemApi.Materials()). `sizeX` is the width (diameter for ROUND); `sizeY` (length) and `sizeZ` (depth) 0 = the shape's standard proportions. `plane` is where the gem sits (default: world XY at the origin); the carat weight is derived from the mesh volume.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `shape` | `string` | required |\n| `material` | `string` | required |\n| `sizeX` | `double` | required |\n| `sizeY` | `double` | `0` |\n| `sizeZ` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IGem`.","metadata":{"title":"GemSizeApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#create","collection":"scripting","hash":"340b74ed7fa063f6fd29944c308b9dc7","indexed_by":"docs-index"}},{"content":"GemSizeApi — SameSize\n\n```csharp\nIReadOnlyList<Guid> GemSizeApi.SameSize(IEnumerable<Guid> gemIds = null)\n```\n\nThe actual ArtisanGemBySize command: given some reference gems, finds every gem in the document with the same width (SizeX, 0.001 mm tolerance) -- e.g. \"all the 1.5 mm stones\". `gemIds` empty/null uses the selected gems. Read-only, no license: returns the matching ids (reference gems included); pair with select_objects / GemApi.Find.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemSizeApi","section":"SameSize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#samesize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#samesize","collection":"scripting","hash":"5c22ef66c7cb77750aaafaa1ae4f3397","indexed_by":"docs-index"}},{"content":"GemSizeApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IGem`.","metadata":{"title":"GemSizeApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-size/#handles-and-sections","collection":"scripting","hash":"eb26b6c3f62c15ccdf133441f797ae1d","indexed_by":"docs-index"}},{"content":"GemToolsApi\n\nHeadless facade for the gem utility commands (the Gems ribbon tools that are not gem creators): center points, prong guides, curves from/around gems, copy-by-gems, color-by-size, rotation, tags and recovery of dumb gems exported by other CADs. Conventions shared by every method: - all lengths are millimetres (in a mm document); - a null/empty `gemIds` list means \"the gems currently selected in the viewport\" (the same commands accept preselection); the three tools whose command also accepts Enter-with-nothing-selected (CenterBetweenGems, ColorBySize, AddTags) additionally fall back to EVERY gem in the document when the selection has no gems, exactly like the command; - ids passed explicitly must be Artisan diamonds/gemstones, otherwise an ArgumentException names the offending id; - methods that modify the document call LicenseGate.RequireValid() first and end with a viewport redraw.\n\n```python\nfrom ArtisanPlugin.Scripting import GemToolsApi\n```\n\nSee also the guide, Gems › Gem tools, and the Python package, `ra.gem_tools`.","metadata":{"title":"GemToolsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/","collection":"scripting","hash":"6cff2b7af74185791c0f7babe3bc62a5","indexed_by":"docs-index"}},{"content":"GemToolsApi — Methods\n\n| Method | |\n|---|---|\n| `AddCenterPoints` | The ArtisanGemsCenter command, headless: adds a point object at the center (plane origin) of each gem. |\n| `AddTags` | The ArtisanGemTags command, headless: places a 3-line text entity on the top face (table) of each gem -- measures (\"X x Y\" in mm), carat weight and material -- with the text height scaled to the stone (18% of its largest side). |\n| `AlignGems` | The ArtisanAlignGems command, headless: drops each gem onto the target objects by shooting a ray from the gem's center along its own axis (+Z first, then -Z, so a gem already past the surface still lands on it) and translating the gem to the hit point. |\n| `CenterBetweenGems` | The ArtisanCenterBetweenGems command, headless: for every triple of mutually adjacent gems (center distance below the sum of their diameters, near-equilateral unless the stones are big enough to still share a prong) it fits the circle tangent to the three girdle circles and adds it to the document -- the classic shared-prong guide. |\n| `Centers` | Center of each gem (its plane origin, on the girdle), read-only: nothing is added to the document, no license needed. |\n| `ColorBySize` | The ArtisanGemsColorBySize command, headless: paints every gem with a per-size display color (sizes grouped with a 1e-3 mm tolerance; color 0 is always the smallest size), so equal stones read at a glance. |\n| `CopyByGems` | The ArtisanCopyByGems command, headless: copies `objectIds` (a prong, a cutter, a bezel...) onto every gem in `targetGemIds`, mapping from the origin gem's plane to each target gem's plane (history-linked copies, like the command). |","metadata":{"title":"GemToolsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#methods","collection":"scripting","hash":"5e9a206028a133340a13f2eb38966bdb","indexed_by":"docs-index"}},{"content":"GemToolsApi — Methods\n\n| Method | |\n|---|---|\n| `CurveFromGems` | The ArtisanCurveFromGems command, headless: interpolates a degree-3 curve through the centers of the gems, IN THE ORDER of `gemIds` (selection order when null) -- the order defines the shape of the curve, just like the pick order does in the command. |\n| `ExtractGemCurves` | The ArtisanGemsCurve command, headless: duplicates the girdle curve of each gem as a plain document curve (useful as a cutting/section profile). |\n| `OffsetGemCurves` | The ArtisanGemOffset command, headless: offsets the girdle curve of each gem OUTWARD by `distance` mm (the command's default is 1.0) and adds the result as the parametric gem-offset curve, linked with history to its gem so it follows when the gem moves. |\n| `RecoverGems` | The ArtisanGemsRecover command, headless: scans the WHOLE document for dumb gem geometry exported by Matrix, MatrixGold, RhinoGold or an older RhinoArtisan (recognized by their exact mesh/brep topology) and replaces each one with a parametric Artisan gemstone of the measured shape and size. |\n| `RotateGems` | The document effect of the ArtisanGemsOrientation handles (and of ArtisanRotateGemsLeft/Right), headless: rotates each gem around its own plane normal, in place. |","metadata":{"title":"GemToolsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#methods","collection":"scripting","hash":"08093b417baaaac6484b400e2246e1f3","indexed_by":"docs-index"}},{"content":"GemToolsApi — AddCenterPoints\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.AddCenterPoints(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanGemsCenter command, headless: adds a point object at the center (plane origin) of each gem. Returns the ids of the created points.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"AddCenterPoints","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#addcenterpoints","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#addcenterpoints","collection":"scripting","hash":"1d7d6ec0474d80fa4b84427178e149f1","indexed_by":"docs-index"}},{"content":"GemToolsApi — AddTags\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.AddTags(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanGemTags command, headless: places a 3-line text entity on the top face (table) of each gem -- measures (\"X x Y\" in mm), carat weight and material -- with the text height scaled to the stone (18% of its largest side). The tags land on the primary user layer. null/empty `gemIds` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the ids of the created text entities.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"AddTags","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#addtags","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#addtags","collection":"scripting","hash":"b323e77dab4a4d11417986b8aebc1e29","indexed_by":"docs-index"}},{"content":"GemToolsApi — AlignGems\n\n```csharp\nint GemToolsApi.AlignGems(\n    IEnumerable<Guid> targetIds,\n    IEnumerable<Guid> gemIds = null,\n    bool flip = false,\n    bool adaptToSurface = false,\n    bool alignTop = false)\n```\n\nThe ArtisanAlignGems command, headless: drops each gem onto the target objects by shooting a ray from the gem's center along its own axis (+Z first, then -Z, so a gem already past the surface still lands on it) and translating the gem to the hit point. The targets are meshed as one high-resolution mesh, like the command. Positions are aligned; the gem keeps its own orientation unless told otherwise: `flip` true = turn the gem upside down at the landing point (the command's Flip toggle; default No); `adaptToSurface` true = orient the gem's axis to the surface normal at the landing point (the command's Orientation toggle, Keep by default); `alignTop` true = sink the gem along its axis by its own height above the girdle, so the top face (table) sits on the surface (the command's Alignment toggle, On Girdle by default). Gems whose axis never hits the targets are skipped, like in the command. null/empty `gemIds` = the selected gems. In-place moves: returns the number of gems aligned.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `targetIds` | `IEnumerable ` | required |\n| `gemIds` | `IEnumerable ` | `null` |\n| `flip` | `bool` | `false` |\n| `adaptToSurface` | `bool` | `false` |\n| `alignTop` | `bool` | `false` |\n\nReturns `int`.","metadata":{"title":"GemToolsApi","section":"AlignGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#aligngems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#aligngems","collection":"scripting","hash":"146fdd5f79e23b856b3a7f3890105e43","indexed_by":"docs-index"}},{"content":"GemToolsApi — CenterBetweenGems\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.CenterBetweenGems(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanCenterBetweenGems command, headless: for every triple of mutually adjacent gems (center distance below the sum of their diameters, near-equilateral unless the stones are big enough to still share a prong) it fits the circle tangent to the three girdle circles and adds it to the document -- the classic shared-prong guide. The circles are grouped so one click picks the whole guide set. null/empty `gemIds` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the ids of the created circles (may be empty when no triple qualifies).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"CenterBetweenGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#centerbetweengems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#centerbetweengems","collection":"scripting","hash":"a04f4a576661b8bcde7c287020648983","indexed_by":"docs-index"}},{"content":"GemToolsApi — Centers\n\n```csharp\nIReadOnlyList<Point3d> GemToolsApi.Centers(IEnumerable<Guid> gemIds = null)\n```\n\nCenter of each gem (its plane origin, on the girdle), read-only: nothing is added to the document, no license needed. The points come back in the same order as `gemIds` (selection order when null).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"Centers","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#centers","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#centers","collection":"scripting","hash":"ff540d96083f4563954256c2b8a9e590","indexed_by":"docs-index"}},{"content":"GemToolsApi — ColorBySize\n\n```csharp\nint GemToolsApi.ColorBySize(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanGemsColorBySize command, headless: paints every gem with a per-size display color (sizes grouped with a 1e-3 mm tolerance; color 0 is always the smallest size), so equal stones read at a glance. null/empty `gemIds` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the number of gems recolored.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `int`.","metadata":{"title":"GemToolsApi","section":"ColorBySize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#colorbysize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#colorbysize","collection":"scripting","hash":"88dd579a89fc8ac9e778f8647ad1cbd7","indexed_by":"docs-index"}},{"content":"GemToolsApi — CopyByGems\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.CopyByGems(\n    IEnumerable<Guid> objectIds,\n    IEnumerable<Guid> targetGemIds,\n    Guid? originGemId = null,\n    string scale = \"No\")\n```\n\nThe ArtisanCopyByGems command, headless: copies `objectIds` (a prong, a cutter, a bezel...) onto every gem in `targetGemIds`, mapping from the origin gem's plane to each target gem's plane (history-linked copies, like the command). `originGemId` = Guid.Empty means the objects are modeled on the world XY plane (the command's \"Enter = CPlane\" answer). `scale` is the command's option list: \"No\" (default) copy as-is \"2D\" scale X/Y by targetGemSizeX / originGemSizeX \"3D\" scale X/Y/Z by the same factor null/empty `objectIds` = the current selection. Returns the ids of the created copies (targets x objects).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `targetGemIds` | `IEnumerable ` | required |\n| `originGemId` | `Guid?` | `null` |\n| `scale` | `string` | `\"No\"` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"CopyByGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#copybygems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#copybygems","collection":"scripting","hash":"8e6f17e05f046960d6312b39d0d2c77b","indexed_by":"docs-index"}},{"content":"GemToolsApi — CurveFromGems\n\n```csharp\nGuid GemToolsApi.CurveFromGems(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanCurveFromGems command, headless: interpolates a degree-3 curve through the centers of the gems, IN THE ORDER of `gemIds` (selection order when null) -- the order defines the shape of the curve, just like the pick order does in the command. Consecutive coincident centers (stacked duplicates) are skipped. At least two distinct centers are required. Returns the id of the created curve.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `Guid`.","metadata":{"title":"GemToolsApi","section":"CurveFromGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#curvefromgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#curvefromgems","collection":"scripting","hash":"7186e838a99f72dffccc065f40fd718a","indexed_by":"docs-index"}},{"content":"GemToolsApi — ExtractGemCurves\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.ExtractGemCurves(IEnumerable<Guid> gemIds = null)\n```\n\nThe ArtisanGemsCurve command, headless: duplicates the girdle curve of each gem as a plain document curve (useful as a cutting/section profile). Returns the ids of the created curves.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"ExtractGemCurves","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#extractgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#extractgemcurves","collection":"scripting","hash":"99a07b2eacf5cbac8fbdbb4d839b521d","indexed_by":"docs-index"}},{"content":"GemToolsApi — OffsetGemCurves\n\n```csharp\nIReadOnlyList<Guid> GemToolsApi.OffsetGemCurves(\n    IEnumerable<Guid> gemIds = null,\n    double distance = 1)\n```\n\nThe ArtisanGemOffset command, headless: offsets the girdle curve of each gem OUTWARD by `distance` mm (the command's default is 1.0) and adds the result as the parametric gem-offset curve, linked with history to its gem so it follows when the gem moves. A `distance` smaller than the document tolerance adds the girdle curve unchanged (same as answering 0 in the command). Gems whose offset fails (self intersecting result, etc.) are skipped, like in the command. Returns the ids of the created curves.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `distance` | `double` | `1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemToolsApi","section":"OffsetGemCurves","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#offsetgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#offsetgemcurves","collection":"scripting","hash":"d5855dc861cdb3acf8d87b58ee13ab95","indexed_by":"docs-index"}},{"content":"GemToolsApi — RecoverGems\n\n```csharp\nint GemToolsApi.RecoverGems()\n```\n\nThe ArtisanGemsRecover command, headless: scans the WHOLE document for dumb gem geometry exported by Matrix, MatrixGold, RhinoGold or an older RhinoArtisan (recognized by their exact mesh/brep topology) and replaces each one with a parametric Artisan gemstone of the measured shape and size. The command already runs without prompts, so it is invoked directly -- that keeps the recovery byte-identical to the ribbon button and picks up new fingerprints automatically. Returns the number of gems recovered (0 = nothing recognizable).\n\nReturns `int`.","metadata":{"title":"GemToolsApi","section":"RecoverGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#recovergems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#recovergems","collection":"scripting","hash":"5bffb3d4f34443864f44f160b217085a","indexed_by":"docs-index"}},{"content":"GemToolsApi — RotateGems\n\n```csharp\nint GemToolsApi.RotateGems(IEnumerable<Guid> gemIds = null, double angleDegrees = 90)\n```\n\nThe document effect of the ArtisanGemsOrientation handles (and of ArtisanRotateGemsLeft/Right), headless: rotates each gem around its own plane normal, in place. `angleDegrees` is counter-clockwise when positive (each click of the orientation gumball is +90, the default); pass a negative angle to rotate clockwise. Returns the number of gems rotated.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `angleDegrees` | `double` | `90` |\n\nReturns `int`.","metadata":{"title":"GemToolsApi","section":"RotateGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#rotategems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem-tools/#rotategems","collection":"scripting","hash":"38b65d47bfbc476d40bb6edf827d40a9","indexed_by":"docs-index"}},{"content":"GemApi\n\nStatic entry point for the gem scripting facade. This is what LLM-generated Python scripts call (via clr.AddReference(\"Artisan\"); from ArtisanPlugin.Scripting import GemApi as gem). Read-only methods don't gate on the license — they let unlicensed users at least inspect their own document. Anything that modifies the document goes through GemHandle which calls LicenseGate.RequireValid().\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi\n```\n\nSee also the guide, Gems › Create, and the Python package, `ra.gems`.","metadata":{"title":"GemApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/","collection":"scripting","hash":"5ce1a5a18eec775e91dba5096cc39df5","indexed_by":"docs-index"}},{"content":"GemApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IGem` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IGem` handles on the layer with the given full path (empty when the layer does not exist). |\n| `ByMaterial` | |\n| `Collisions` | Returns every pair of gems whose meshes intersect (each entry is an array of the two colliding gems). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Creates a new gem and adds it to the active document, returning a handle to it. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Materials` | Valid values for the `material` argument (\"DIAMOND\", \"RUBY\", ...). |\n| `Selected` | Returns the gems that are currently selected in the active doc. |\n| `Shapes` | Valid values for the `shape` argument of Create / SetShape-style calls (\"ROUND\", \"PRINCESS\", \"MARQUISE\", ...). |","metadata":{"title":"GemApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#methods","collection":"scripting","hash":"be395435e59534eb8463c82264584177","indexed_by":"docs-index"}},{"content":"GemApi — All\n\n```csharp\nIReadOnlyList<IGem> GemApi.All()\n```\n\n`IGem` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IGem> GemApi.ByLayer(string layerName)\n```\n\n`IGem` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#all","collection":"scripting","hash":"346a55d6fb648544a2a16d3fd97a9a57","indexed_by":"docs-index"}},{"content":"GemApi — ByMaterial\n\n```csharp\nIReadOnlyList<IGem> GemApi.ByMaterial(string materialName)\n```\n\n| Parameter | Type | Default |\n|---|---|---|\n| `materialName` | `string` | required |\n\nReturns `IReadOnlyList `.\n\nCollisions\n```csharp\nIReadOnlyList<array<IGem>> GemApi.Collisions()\n```\n\nReturns every pair of gems whose meshes intersect (each entry is an array of the two colliding gems). Same mesh-mesh test as the ArtisanGemsCollision command, scoped to the gems GemApi manages. Read-only: safe without a Transaction and without a license.\n\nReturns `IReadOnlyList >`.","metadata":{"title":"GemApi","section":"ByMaterial","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#bymaterial","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#bymaterial","collection":"scripting","hash":"0ee949986adeccac4c59824419b9942d","indexed_by":"docs-index"}},{"content":"GemApi — Count\n\n```csharp\nint GemApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIGem GemApi.Create(string shape, string material, double caratWeight, Plane plane)\n```\n\nCreates a new gem and adds it to the active document, returning a handle to it. `shape` accepts case-insensitive GemShape names (\"ROUND\", \"PRINCESS\", \"MARQUISE\", \"EMERALD\", ...). `material` accepts compound names (\"Diamond\", \"Ruby\", \"Sapphire\", ...) -- the string is normalized (dashes / spaces become underscores) before matching the GemCompound enum. `caratWeight` drives the gem's size via the same proportion table QuickGems uses. `plane` is where the gem is placed; pass Plane.WorldXY for \"at the origin\". Throws ScriptingNotLicensedException if the license is invalid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `shape` | `string` | required |\n| `material` | `string` | required |\n| `caratWeight` | `double` | required |\n| `plane` | `Plane` | required |\n\nReturns `IGem`.","metadata":{"title":"GemApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#count","collection":"scripting","hash":"1dd16423f50dc0f9cd69053026830d16","indexed_by":"docs-index"}},{"content":"GemApi — Find\n\n```csharp\nIGem GemApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IGem`.\n\nMaterials\n```csharp\nIReadOnlyList<string> GemApi.Materials()\n```\n\nValid values for the `material` argument (\"DIAMOND\", \"RUBY\", ...). Read-only, no license.\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#find","collection":"scripting","hash":"eb0977ac5853497f7a1d5afbb1d1362a","indexed_by":"docs-index"}},{"content":"GemApi — Selected\n\n```csharp\nIReadOnlyList<IGem> GemApi.Selected()\n```\n\nReturns the gems that are currently selected in the active doc. Empty list if nothing is selected (or selection contains no gems).\n\nReturns `IReadOnlyList `.\n\nShapes\n```csharp\nIReadOnlyList<string> GemApi.Shapes()\n```\n\nValid values for the `shape` argument of Create / SetShape-style calls (\"ROUND\", \"PRINCESS\", \"MARQUISE\", ...). Read-only, no license.\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#selected","collection":"scripting","hash":"91acfa1c1590a9832cf6fe787604ce01","indexed_by":"docs-index"}},{"content":"GemApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"GemApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#handles-and-sections","collection":"scripting","hash":"33ae3b3077c253a6bb2da612aa6ab6d2","indexed_by":"docs-index"}},{"content":"GemApi — IGem\n\n*Handle*.\n\nPublic scripting view of a gem placed in the current RhinoDoc. This is intentionally narrow — it does NOT expose the underlying ShapesKernel GemObject. The LLM-generated Python scripts (and any third party) can only do what this surface allows, and every mutation passes through LicenseGate.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CaratWeight` | `double` | get | |\n| `Id` | `Guid` | get | |\n| `LayerName` | `string` | get | |\n| `Material` | `string` | get | compound name, e.g. \"Diamond\" |\n| `Plane` | `Plane` | get | the gem's full placement plane (origin + orientation) |\n| `Position` | `Point3d` | get | origin of the gem's plane |\n| `Shape` | `string` | get | \"ROUND\", \"PRINCESS\", \"MARQUISE\", ... |\n| `SizeX` | `double` | get | mm |\n| `SizeY` | `double` | get | mm |\n| `SizeZ` | `double` | get | mm |","metadata":{"title":"GemApi","section":"IGem","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#igem","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#igem","collection":"scripting","hash":"76e5aa5ba069b09311dc47e5661969ab","indexed_by":"docs-index"}},{"content":"GemApi — IGem\n\n| Method | |\n|---|---|\n| `IGem Copy()` | duplicate in place, returns the new gem |\n| `IGem Copy(Vector3d translation)` | duplicate displaced by `translation`, returns the new gem |\n| `void Delete()` | |\n| `void Flip()` | turn the gem upside down (180° around its own X axis) |\n| `void Move(Vector3d translation)` | |\n| `void Rotate(double degrees)` | spin around the gem's own Z axis (positive = counter-clockwise) |\n| `void Scale(double factor)` | uniform scale of the current size (factor > 0) |\n| `void Select(bool on)` | Selection state in the viewport. Not a document mutation (no undo record, no license gate) — useful for scripts that end by highlighting their result. |\n| `void SetCaratWeight(double caratWeight)` | resize by carat, keeping shape/material/plane/layer |\n| `void SetMaterial(string materialName)` | Mutations — each calls LicenseGate.RequireValid() before doing anything. |\n| `void SetPlane(Plane plane)` | re-place the gem: moves AND orients to the given plane |\n| `void SetShape(string shape)` | change the cut (\"OVAL\", \"PEAR\", \"EMERALD\"... see GemApi.Shapes()) in place: same Id, plane, material, layer and carat weight; the settings built on the gem rebuild around the new shape. For \"a 1.5 ct oval\", SetShape then SetCaratWeight. |\n| `void SetSize(double sizeX, double sizeY, double sizeZ)` | resize to explicit mm dimensions |","metadata":{"title":"GemApi","section":"IGem","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#igem","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gem/#igem","collection":"scripting","hash":"aba3f0420b5519c2a2ff8fe21c76d1ef","indexed_by":"docs-index"}},{"content":"GemsByNetworkApi\n\nGems on a network of curves (the ArtisanGemsByNetwork tool, headless): fills a network of intersecting curves with stones, sizing them so they meet at the nodes. This is NOT a parametric type: the tool bakes loose gems in a plain group, there is no Regenerate and ArtisanEdit does nothing with it. So this facade creates and returns gem ids -- there is no handle to enumerate or edit afterwards, and the gems are edited individually like any other loose stone (GemApi).\n\n```python\nfrom ArtisanPlugin.Scripting import GemsByNetworkApi\n```\n\nSee also the guide, Gemsets › Gems by network, and the Python package, `ra.gems_by_network`.","metadata":{"title":"GemsByNetworkApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-by-network/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-by-network/","collection":"scripting","hash":"178a0b314d50d39d5698e41c2dc3946c","indexed_by":"docs-index"}},{"content":"GemsByNetworkApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Fills `curveIds` with stones and bakes them as loose gems. |\n\nCreate\n```csharp\nIReadOnlyList<Guid> GemsByNetworkApi.Create(\n    IEnumerable<Guid> curveIds = null,\n    double gemSize = 0,\n    double minDistance = 0,\n    double moveInZ = double.NaN,\n    bool? fitToEnd = null)\n```\n\nFills `curveIds` with stones and bakes them as loose gems. Millimetres; 0 keeps the default: the user's saved Gems on Network defaults when there are any, otherwise the tool's (gemSize 1.0, minDistance 0.1, moveInZ 0: the stones sit on the curves). `curveIds` null/empty uses the current selection. Returns the ids of the baked gems.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | `null` |\n| `gemSize` | `double` | `0` |\n| `minDistance` | `double` | `0` |\n| `moveInZ` | `double` | `double.NaN` |\n| `fitToEnd` | `bool?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsByNetworkApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-by-network/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-by-network/#methods","collection":"scripting","hash":"534f8149a6f2e85efbe0843d630ae4a7","indexed_by":"docs-index"}},{"content":"GemsFromCircleApi\n\nTurn circles into round stones of the matching size.\n\n```python\nfrom ArtisanPlugin.Scripting import GemsFromCircleApi\n```\n\nSee also the Python package, `ra.gems_from_circle`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Turns circles into round gems -- the ArtisanGemsFromCircle tool, headless. |\n\nCreate\n```csharp\nIReadOnlyList<Guid> GemsFromCircleApi.Create(\n    IEnumerable<Guid> curveIds,\n    string gemMaterial = null)\n```\n\nTurns circles into round gems -- the ArtisanGemsFromCircle tool, headless. Every curve in `curveIds` that is a circle (0.001 mm tolerance) becomes a ROUND gem of that diameter, placed on the circle's plane and added to the secondary gems layer; other curves are skipped. `gemMaterial` accepts the GemApi vocabulary (default Diamond). Returns the ids of the created gems (empty if no circle).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `gemMaterial` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsFromCircleApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-from-circle/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-from-circle/","collection":"scripting","hash":"e5df954844ba0bf324b7ae576760fb8a","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi\n\nA run of stones along one curve, with prongs and cutters, editable afterwards.\n\n```python\nfrom ArtisanPlugin.Scripting import GemsOnCurveApi\n```\n\nSee also the guide, Gemsets › Gems on curve, and the Python package, `ra.gems_on_curve`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Distributes a row of identical gems along an existing curve -- the ArtisanGemsOnCurve tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForCurve` | |\n| `Selected` | GemsOnCurves currently selected in the active doc. |","metadata":{"title":"GemsOnCurveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/","collection":"scripting","hash":"a2a3dc52c8b7ecf23342cc76fb52828f","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — All\n\n```csharp\nIReadOnlyList<IGemsOnCurve> GemsOnCurveApi.All()\n```\n\n`IGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IGemsOnCurve> GemsOnCurveApi.ByLayer(string layerName)\n```\n\n`IGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsOnCurveApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#all","collection":"scripting","hash":"a686d40663aaf3365e570162736615b8","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — Count\n\n```csharp\nint GemsOnCurveApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIGemsOnCurve GemsOnCurveApi.Create(\n    Guid curveId,\n    double gemSize = 0,\n    double distance = 0,\n    string gemShape = null,\n    string gemMaterial = null,\n    bool prongs = false,\n    bool cutters = false,\n    IEnumerable<Guid> orientationIds = null)\n```\n\nDistributes a row of identical gems along an existing curve -- the ArtisanGemsOnCurve tool, headless. `curveId` must be a curve in the active document; it becomes the row's parent (see ForCurve). Millimetres; 0 keeps the tool default (or the user's saved defaults): gemSize 1.5, distance 0.2. `gemShape`/`gemMaterial` accept the GemApi vocabularies (default ROUND Diamond). `prongs` true also builds the shared prongs; `cutters` true bakes one cutter per gem into a separate group. `orientationIds` optionally orient the gems onto those surfaces/breps. Returns an IGemsOnCurve handle to the new row.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `gemSize` | `double` | `0` |\n| `distance` | `double` | `0` |\n| `gemShape` | `string` | `null` |\n| `gemMaterial` | `string` | `null` |\n| `prongs` | `bool` | `false` |\n| `cutters` | `bool` | `false` |\n| `orientationIds` | `IEnumerable ` | `null` |\n\nReturns `IGemsOnCurve`.","metadata":{"title":"GemsOnCurveApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#count","collection":"scripting","hash":"8a2072ff18d245dffab5f72d8b7a7aed","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — Find\n\n```csharp\nIGemsOnCurve GemsOnCurveApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IGemsOnCurve`.\n\nForCurve\n```csharp\nIReadOnlyList<IGemsOnCurve> GemsOnCurveApi.ForCurve(Guid curveId)\n```\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsOnCurveApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#find","collection":"scripting","hash":"4dda4d2b066882bb7b76a6943305f8bd","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — Selected\n\n```csharp\nIReadOnlyList<IGemsOnCurve> GemsOnCurveApi.Selected()\n```\n\nGemsOnCurves currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"GemsOnCurveApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#selected","collection":"scripting","hash":"c54b22e208b3c9c1f56c9da46b8de244","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — IGemsOnCurve\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\nA row of identical gems distributed along a parent curve. The \"Mother\" here is the curve, not a single gem — accessible via CurveId. GemShape/Material/CaratWeight describe the gem template that gets repeated along the curve.\n\n| Property | Type | | |\n|---|---|---|---|\n| `AlignmentVertical` | `string` | get | \"TOP\" \\| \"ON_GIRDLE\" |\n| `CurveId` | `Guid` | get | |\n| `CuttersEnabled` | `bool` | get | |\n| `Distance` | `double` | get | |\n| `FlipCurve` | `bool` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemOrientation` | `string` | get | \"NATURAL\" \\| \"UPSIDE_DOWN\" |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `GemSize` | `double` | get | Current values (millimetres / degrees; several are signed). |\n| `GemSizeY` | `double` | get | 0 = symmetric; only used by asymmetric shapes |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `MoveByZ` | `double` | get | signed |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngDiameter` | `double` | get | |\n| `ProngEndMode` | `string` | get | \"SINGLE\" \\| \"DOUBLE\" |\n| `ProngHeightOverGirdle` | `double` | get | |\n| `ProngHeightUnderGirdle` | `double` | get | |\n| `ProngType` | `string` | get | \"INDIVIDUAL\" \\| \"SHARED\" |\n| `ProngsEnabled` | `bool` | get | |\n| `Rotate90` | `bool` | get | |\n| `RotationOnCurve` | `double` | get | degrees, signed |\n| `StartingPoint` | `string` | get | \"BOUNDARY\" \\| \"CENTER\" |\n| `StoneCount` | `int` | get | |","metadata":{"title":"GemsOnCurveApi","section":"IGemsOnCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#igemsoncurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#igemsoncurve","collection":"scripting","hash":"7892845951c0db36a7836c4bf5c9342f","indexed_by":"docs-index"}},{"content":"GemsOnCurveApi — IGemsOnCurve\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAlignmentVertical(string alignment)` | TOP \\| ON_GIRDLE |\n| `void SetCuttersEnabled(bool enabled)` | |\n| `void SetDistance(double distance)` | |\n| `void SetFlipCurve(bool flip)` | |\n| `void SetGemMaterial(string material)` | |\n| `void SetGemOrientation(string orientation)` | NATURAL \\| UPSIDE_DOWN |\n| `void SetGemShape(string shape)` | |\n| `void SetGemSize(double size)` | Parametric edits -- each regenerates the row in place (the group keeps its id) and calls LicenseGate.RequireValid() first. LITERAL values: 0 and negatives are allowed where the parameter is signed. |\n| `void SetGemSizeY(double sizeY)` | 0 = back to symmetric |\n| `void SetMoveByZ(double moveByZ)` | signed |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngDistanceShared(double distance)` | |\n| `void SetProngEndMode(string endMode)` | SINGLE \\| DOUBLE |\n| `void SetProngHeightOverGirdle(double height)` | signed |\n| `void SetProngHeightUnderGirdle(double height)` | signed |\n| `void SetProngType(string prongType)` | INDIVIDUAL \\| SHARED |\n| `void SetProngsEnabled(bool enabled)` | |\n| `void SetRotate90(bool rotate90)` | |\n| `void SetRotationOnCurve(double degrees)` | signed |\n| `void SetStartingPoint(string startingPoint)` | BOUNDARY \\| CENTER |","metadata":{"title":"GemsOnCurveApi","section":"IGemsOnCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#igemsoncurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on-curve/#igemsoncurve","collection":"scripting","hash":"5c5a44fc74a7cdc67613318ada5b7216","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi\n\nStones fitted between two rails, sized to the gap.\n\n```python\nfrom ArtisanPlugin.Scripting import GemsOn2CurvesApi\n```\n\nSee also the Python package, `ra.gems_on_two_curves`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IGemsOn2Curves` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IGemsOn2Curves` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Fills the space between two curves with round gems whose diameter adapts to the local width -- the ArtisanGemsOn2Curves tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IGemsOn2Curves` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"GemsOn2CurvesApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/","collection":"scripting","hash":"22d2dd97311396d6e18d397effacabf3","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — All\n\n```csharp\nIReadOnlyList<IGemsOn2Curves> GemsOn2CurvesApi.All()\n```\n\n`IGemsOn2Curves` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IGemsOn2Curves> GemsOn2CurvesApi.ByLayer(string layerName)\n```\n\n`IGemsOn2Curves` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsOn2CurvesApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#all","collection":"scripting","hash":"fbdee7d5d92f5e9da249c33886517189","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — Count\n\n```csharp\nint GemsOn2CurvesApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"GemsOn2CurvesApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#count","collection":"scripting","hash":"47da532d9f35aa6d2a02723c71a0e7c2","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — Create\n\n```csharp\nGemsOn2CurvesResult GemsOn2CurvesApi.Create(\n    Guid curve1Id,\n    Guid curve2Id,\n    double distance = 0,\n    double minSize = 0,\n    double moveInZ = double.NaN,\n    string gemMaterial = null,\n    string algorithm = null,\n    bool? alignOnTop = null,\n    bool? flip = null,\n    bool? flip1 = null,\n    bool? flip2 = null,\n    bool? rebuildCurves = null,\n    bool prongs = false,\n    string prongType = null,\n    string prongEndMode = null,\n    double prongDiameter = 0,\n    double prongDistance = 0,\n    double prongHeightOverGirdle = 0,\n    double prongHeightUnderGirdle = 0,\n    bool group = true)\n```\n\nFills the space between two curves with round gems whose diameter adapts to the local width -- the ArtisanGemsOn2Curves tool, headless. Millimetres; 0 keeps the tool default (or the user's saved defaults): distance 0.2 between gems, minSize 1 (smaller gems are dropped). `algorithm` is SPINE (default) or TANGENCY; `gemMaterial` accepts the GemApi vocabulary (default Diamond). `prongs` true also bakes the prongs (SHARED by default, or INDIVIDUAL) as metal. Returns the group id plus the gem/prong ids; `group` false bakes loose gems instead.","metadata":{"title":"GemsOn2CurvesApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#create","collection":"scripting","hash":"d88752c6a4dd9db418a37438e35b7e77","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curve1Id` | `Guid` | required |\n| `curve2Id` | `Guid` | required |\n| `distance` | `double` | `0` |\n| `minSize` | `double` | `0` |\n| `moveInZ` | `double` | `double.NaN` |\n| `gemMaterial` | `string` | `null` |\n| `algorithm` | `string` | `null` |\n| `alignOnTop` | `bool?` | `null` |\n| `flip` | `bool?` | `null` |\n| `flip1` | `bool?` | `null` |\n| `flip2` | `bool?` | `null` |\n| `rebuildCurves` | `bool?` | `null` |\n| `prongs` | `bool` | `false` |\n| `prongType` | `string` | `null` |\n| `prongEndMode` | `string` | `null` |\n| `prongDiameter` | `double` | `0` |\n| `prongDistance` | `double` | `0` |\n| `prongHeightOverGirdle` | `double` | `0` |\n| `prongHeightUnderGirdle` | `double` | `0` |\n| `group` | `bool` | `true` |\n\nReturns `GemsOn2CurvesResult`.","metadata":{"title":"GemsOn2CurvesApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#create","collection":"scripting","hash":"223a69d7a8718c1d058f573cc1e354df","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — Find\n\n```csharp\nIGemsOn2Curves GemsOn2CurvesApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IGemsOn2Curves`.\n\nSelected\n```csharp\nIReadOnlyList<IGemsOn2Curves> GemsOn2CurvesApi.Selected()\n```\n\n`IGemsOn2Curves` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"GemsOn2CurvesApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#find","collection":"scripting","hash":"b47b4908d788df77479de5578b915749","indexed_by":"docs-index"}},{"content":"GemsOn2CurvesApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIGemsOn2Curves\n*Handle* — extends `IParametricGroup`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Curve1Id` | `Guid` | get | |\n| `Curve2Id` | `Guid` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MemberCount` | `int` | get | Rhino objects in the group *(from IParametricGroup)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | the kernel model, as stored in the group *(from IParametricGroup)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | dotted JSON path; null when absent *(from IParametricGroup)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"GemsOn2CurvesApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/gems-on2-curves/#handles-and-sections","collection":"scripting","hash":"399dd5420eaf1fd4cf723aa7a5ddf772","indexed_by":"docs-index"}},{"content":"GraduatedApi\n\nGraduated shanks - a band whose section grows toward the centre stone, carrying a run of stones that shrink toward the finger. Create takes the handful of parameters that define the piece; everything else (the ~50 gem, prong and under-bezel values) is adjusted afterwards through the returned handle's Shank and Gems sections.\n\n```python\nfrom ArtisanPlugin.Scripting import GraduatedApi\n```\n\nSee also the guide, Shanks › Graduated, and the Python package, `ra.graduated`.","metadata":{"title":"GraduatedApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/","collection":"scripting","hash":"e6ca3d09b3da86ad4d3a854e14327be0","indexed_by":"docs-index"}},{"content":"GraduatedApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IGraduated` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IGraduated` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a graduated shank -- the ArtisanGraduated tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IGraduated` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"GraduatedApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#methods","collection":"scripting","hash":"8b5256a69c4a2d51deca33797b7388e6","indexed_by":"docs-index"}},{"content":"GraduatedApi — All\n\n```csharp\nIReadOnlyList<IGraduated> GraduatedApi.All()\n```\n\n`IGraduated` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IGraduated> GraduatedApi.ByLayer(string layerName)\n```\n\n`IGraduated` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"GraduatedApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#all","collection":"scripting","hash":"04aa86d7ba1e7335aec44b6574b566bc","indexed_by":"docs-index"}},{"content":"GraduatedApi — Count\n\n```csharp\nint GraduatedApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIGraduated GraduatedApi.Create(\n    double fingerDiameter = 0,\n    int numberOfStones = 0,\n    double sizeStart = 0,\n    double sizeEnd = 0,\n    double centerStoneSize = 0,\n    double topWidth = 0,\n    double topHeight = 0,\n    double bottomWidth = 0,\n    double bottomHeight = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a graduated shank -- the ArtisanGraduated tool, headless. Millimetres; 0 keeps the tool default (or the user's saved defaults): numberOfStones 4 per side, sizeStart 2.5, sizeEnd 1.5, centerStoneSize 6.1, top profile 1.5 x 1.6, bottom profile 3.0 x 1.6. `fingerDiameter` 0 = the document's finger size. `profile` picks a RING_PROFILE asset by name for both band sections. Returns an IGraduated handle: use handle.Shank / handle.Gems to adjust the rest of the parameters. `element` = name of a saved graduated element (ElementsApi.List(\"Graduated\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `numberOfStones` | `int` | `0` |\n| `sizeStart` | `double` | `0` |\n| `sizeEnd` | `double` | `0` |\n| `centerStoneSize` | `double` | `0` |\n| `topWidth` | `double` | `0` |\n| `topHeight` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `bottomHeight` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IGraduated`.","metadata":{"title":"GraduatedApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#count","collection":"scripting","hash":"e91d74e5b2d0144f186ce7ca3cd0dd9d","indexed_by":"docs-index"}},{"content":"GraduatedApi — Find\n\n```csharp\nIGraduated GraduatedApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IGraduated`.\n\nSelected\n```csharp\nIReadOnlyList<IGraduated> GraduatedApi.Selected()\n```\n\n`IGraduated` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"GraduatedApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#find","collection":"scripting","hash":"6e57ad9d83a25c71e7aae24d2fc2482c","indexed_by":"docs-index"}},{"content":"GraduatedApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIGraduated\n*Handle* — extends `IParametricObject`.\n\nGraduated shank: a band whose section grows from the centre stone down toward the finger, carrying a run of stones that shrink along the way. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Gems` | `IGraduatedGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `Shank` | `IGraduatedShank` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Graduated element (ElementsApi.List(\"Graduated\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |","metadata":{"title":"GraduatedApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#handles-and-sections","collection":"scripting","hash":"c3de005d7858229d8106416622b87028","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedShank\n\n*Section*.\n\nThe graduated band: two profiles that the section morphs between, plus the opening at the bottom.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomProfile` | `IGraduatedProfile` | get | |\n| `CutBumping` | `double` | get | mm |\n| `OpeningMargin` | `double` | get | mm |\n| `TopProfile` | `IGraduatedProfile` | get | |\n\n| Method | |\n|---|---|\n| `void SetCutBumping(double bumping)` | |\n| `void SetOpeningMargin(double margin)` | |","metadata":{"title":"GraduatedApi","section":"IGraduatedShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedshank","collection":"scripting","hash":"638f9816a97b322edbaa4d6a9f613e1d","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedProfile\n\n*Section*.\n\nOne of a graduated band's two profiles (top / bottom). Same shape as a classic profile, on its own model.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Comfort` | `double` | get | mm — used when Type is \"COMFORT\" |\n| `Displacement` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `Height` | `double` | get | mm |\n| `Orientation` | `int` | get | 0 = Natural, 1 = Reverse |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Rotation` | `double` | get | degrees |\n| `Thickness` | `double` | get | mm — used when Type is \"THICKNESS\" |\n| `Type` | `string` | get | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetComfort(double comfort)` | |\n| `void SetDisplacement(double displacement)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetHeight(double height)` | |\n| `void SetOrientation(int orientation)` | |\n| `void SetProfile(string assetName)` | RING_PROFILE asset by name |\n| `void SetRotation(double degrees)` | |\n| `void SetThickness(double thickness)` | |\n| `void SetType(string type)` | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `void SetWidth(double width)` | |","metadata":{"title":"GraduatedApi","section":"IGraduatedProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedprofile","collection":"scripting","hash":"ad94733f6f0353dd3451fb1af6e3cc4a","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedGems\n\n*Section*.\n\nThe graduated stone run: stones stepping down in size from the centre stone toward the band, with prongs that taper along the way.","metadata":{"title":"GraduatedApi","section":"IGraduatedGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","collection":"scripting","hash":"6335eac3c2edb720e16319503fffd1b6","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BrightCut` | `double` | get | mm |\n| `CenterStoneSize` | `double` | get | mm |\n| `Distance` | `double` | get | gap between adjacent stones, mm |\n| `DrillAllowIntersection` | `bool` | get | |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `EndProngCount` | `int` | get | |\n| `ExtensionForManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | mm |\n| `GemMoveInZEnd` | `double` | get | mm |\n| `GemMoveInZStart` | `double` | get | mm |\n| `GemShape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `InnerHeight` | `double` | get | mm |\n| `InnerWidth` | `double` | get | mm |\n| `Lift` | `double` | get | mm |\n| `NumberOfStones` | `int` | get | per side |\n| `ProngCutByRingSize` | `bool` | get | |\n| `ProngDiameterEnd` | `double` | get | |\n| `ProngDiameterStart` | `double` | get | |\n| `ProngDistance` | `double` | get | |\n| `ProngGrow` | `double` | get | |\n| `ProngHeightEnd` | `double` | get | |\n| `ProngHeightStart` | `double` | get | |\n| `ProngMinDiameter` | `double` | get | |\n| `ProngMoveInZ` | `double` | get | |\n| `ProngOverGirdleEnd` | `double` | get | |\n| `ProngOverGirdleStart` | `double` | get | |\n| `ProngSeparationEnd` | `double` | get | |\n| `ProngSeparationStart` | `double` | get | |\n| `ProngSpacing` | `double` | get | |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `ProngsEnabled` | `bool` | get | Prongs — most sizes taper from the centre stone (Start) to the band (End). |\n| `SizeEnd` | `double` | get | nearest the band, mm |\n| `SizeStart` | `double` | get | nearest the centre stone, mm |","metadata":{"title":"GraduatedApi","section":"IGraduatedGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","collection":"scripting","hash":"4e378ca56c7f73a64105a4dcb29b0246","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `UnderBezelBottomWidth` | `double` | get | mm |\n| `UnderBezelEnabled` | `bool` | get | The rail under the stones. |\n| `UnderBezelGemInside` | `double` | get | rail offset into the stone, mm |\n| `UnderBezelGirdleWidth` | `double` | get | top diameter span, mm |\n| `UnderBezelHeight` | `double` | get | 0 = auto (drop to the finger curve) |\n| `UnderBezelOverGirdle` | `double` | get | rise above the girdle, mm |\n| `UnderBezelWidth` | `double` | get | total radial width, mm |\n| `Vertical` | `double` | get | mm |","metadata":{"title":"GraduatedApi","section":"IGraduatedGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","collection":"scripting","hash":"c71e356a8674955eb34860c462101bab","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedGems\n\n| Method | |\n|---|---|\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetCenterStoneSize(double size)` | |\n| `void SetDistance(double distance)` | |\n| `void SetDrillAllowIntersection(bool allow)` | |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetEndProngCount(int count)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemMoveInZ(double start, double end)` | |\n| `void SetGemShape(string shape)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetLift(double lift)` | |\n| `void SetNumberOfStones(int count)` | |\n| `void SetProngCutByRingSize(bool cut)` | |\n| `void SetProngDiameters(double start, double end)` | |\n| `void SetProngDistance(double distance)` | |\n| `void SetProngGrow(double grow)` | |\n| `void SetProngHeights(double start, double end)` | |\n| `void SetProngMinDiameter(double diameter)` | |\n| `void SetProngMoveInZ(double move)` | |\n| `void SetProngOverGirdle(double start, double end)` | |\n| `void SetProngSeparation(double start, double end)` | |\n| `void SetProngSpacing(double spacing)` | |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetProngsEnabled(bool enabled)` | |\n| `void SetSizes(double start, double end)` | start = nearest the centre stone |\n| `void SetUnderBezelBottomWidth(double width)` | |\n| `void SetUnderBezelEnabled(bool enabled)` | |\n| `void SetUnderBezelGemInside(double gemInside)` | |\n| `void SetUnderBezelGirdleWidth(double width)` | |","metadata":{"title":"GraduatedApi","section":"IGraduatedGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","collection":"scripting","hash":"2b47855d53e053ed749c2b880efb8ab9","indexed_by":"docs-index"}},{"content":"GraduatedApi — IGraduatedGems\n\n| Method | |\n|---|---|\n| `void SetUnderBezelHeight(double height)` | 0 = auto |\n| `void SetUnderBezelOverGirdle(double overGirdle)` | |\n| `void SetUnderBezelWidth(double width)` | |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"GraduatedApi","section":"IGraduatedGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/graduated/#igraduatedgems","collection":"scripting","hash":"3c1286f1b6ba89a9b7a914e23cf382b9","indexed_by":"docs-index"}},{"content":"HaloApi\n\nA halo of small stones around a centre stone.\n\n```python\nfrom ArtisanPlugin.Scripting import HaloApi\n```\n\nSee also the guide, Gemsets › Halo, and the Python package, `ra.halo`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IHalo` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IHalo` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a halo of small stones around an existing gem -- the ArtisanHalo tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IHalo` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Halos currently selected in the active doc. |","metadata":{"title":"HaloApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/","collection":"scripting","hash":"40c00b6f6ba5dc0d84b39e39f089614d","indexed_by":"docs-index"}},{"content":"HaloApi — All\n\n```csharp\nIReadOnlyList<IHalo> HaloApi.All()\n```\n\n`IHalo` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IHalo> HaloApi.ByLayer(string layerName)\n```\n\n`IHalo` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HaloApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#all","collection":"scripting","hash":"d7666fba424681c82a288e1c0ef411e9","indexed_by":"docs-index"}},{"content":"HaloApi — Count\n\n```csharp\nint HaloApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"HaloApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#count","collection":"scripting","hash":"0ec45de100b53be27d9bc72db7093378","indexed_by":"docs-index"}},{"content":"HaloApi — Create\n\n```csharp\nIHalo HaloApi.Create(\n    Guid gemId,\n    double stoneSize = 0,\n    double stoneDistance = 0,\n    double distanceToGem = 0,\n    double channelWidth = 0,\n    double channelHeight = 0,\n    string prongType = null,\n    string profile = null,\n    double channelPositionZ = double.NaN,\n    double channelRotation = double.NaN,\n    double channelBrightCut = double.NaN,\n    double channelInnerWidth = 0,\n    double channelInnerHeight = 0,\n    double stoneVertical = double.NaN,\n    double stoneGemInside = double.NaN,\n    string drillType = null,\n    bool? forceEvenNumber = null,\n    int prongCount = 0,\n    double prongDiameter = 0,\n    string prongProfile = null,\n    string element = null,\n    string prongMode = null)\n```\n\nBuilds a halo of small stones around an existing gem -- the ArtisanHalo tool, headless. `gemId` must be a gem in the active document with a halo-friendly shape (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER, PEAR). Millimetres; 0 keeps the tool default (or the user's saved defaults): stoneSize 1.2, stoneDistance 0.2, distanceToGem 1.2, channelWidth 1.5, channelHeight 1.5. `prongType` is NONE (default), SHARED or SCALLOPED: how the halo stones are held. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the default profile. The center stone's prongs: `prongMode` ROUND, CUSTOM (the `prongProfile` section; a profile alone implies it) or CLAW (DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and tuned through the handle (SetClawGemInside...). `element` = name of a saved Halo element (ElementsApi.List(\"Halo\")) to start from instead of the defaults; explicit arguments override it. Returns an IHalo handle to the new halo group.","metadata":{"title":"HaloApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#create","collection":"scripting","hash":"445c495bb4946831207ebd487854a51b","indexed_by":"docs-index"}},{"content":"HaloApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `stoneSize` | `double` | `0` |\n| `stoneDistance` | `double` | `0` |\n| `distanceToGem` | `double` | `0` |\n| `channelWidth` | `double` | `0` |\n| `channelHeight` | `double` | `0` |\n| `prongType` | `string` | `null` |\n| `profile` | `string` | `null` |\n| `channelPositionZ` | `double` | `double.NaN` |\n| `channelRotation` | `double` | `double.NaN` |\n| `channelBrightCut` | `double` | `double.NaN` |\n| `channelInnerWidth` | `double` | `0` |\n| `channelInnerHeight` | `double` | `0` |\n| `stoneVertical` | `double` | `double.NaN` |\n| `stoneGemInside` | `double` | `double.NaN` |\n| `drillType` | `string` | `null` |\n| `forceEvenNumber` | `bool?` | `null` |\n| `prongCount` | `int` | `0` |\n| `prongDiameter` | `double` | `0` |\n| `prongProfile` | `string` | `null` |\n| `element` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n\nReturns `IHalo`.","metadata":{"title":"HaloApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#create","collection":"scripting","hash":"3c8e2581242c329c33dd235858a56dc6","indexed_by":"docs-index"}},{"content":"HaloApi — Find\n\n```csharp\nIHalo HaloApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IHalo`.\n\nForGem\n```csharp\nIReadOnlyList<IHalo> HaloApi.ForGem(Guid gemId)\n```\n\n`IHalo` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HaloApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#find","collection":"scripting","hash":"474c029a36d086c0d3765e84ae3ae934","indexed_by":"docs-index"}},{"content":"HaloApi — Selected\n\n```csharp\nIReadOnlyList<IHalo> HaloApi.Selected()\n```\n\nHalos currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"HaloApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#selected","collection":"scripting","hash":"fc536c5b232183707cdc8f2a15cdc054","indexed_by":"docs-index"}},{"content":"HaloApi — IHalo\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.","metadata":{"title":"HaloApi","section":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","collection":"scripting","hash":"67f33058b2364a1651c110ca7515eabb","indexed_by":"docs-index"}},{"content":"HaloApi — IHalo\n\n| Property | Type | | |\n|---|---|---|---|\n| `ChannelBrightCut` | `double` | get | |\n| `ChannelDistanceToGem` | `double` | get | |\n| `ChannelHeight` | `double` | get | |\n| `ChannelInnerHeight` | `double` | get | |\n| `ChannelInnerWidth` | `double` | get | |\n| `ChannelPositionZ` | `double` | get | signed |\n| `ChannelRotation` | `double` | get | degrees, signed |\n| `ChannelWidth` | `double` | get | The metal rail carrying the halo stones. PositionZ and Rotation are what make a halo sit flush, float or tilt. |\n| `ClawGemInside` | `double` | get | The halo's own claw tip, CLAW mode only (built in Render mode only), under the panel's names: how far in toward the gem the tip reaches (a fraction of the way to the gem centre; 0 builds no tip). |\n| `ClawTension` | `double` | get | 1-100 |\n| `ClawTipDistance` | `double` | get | the panel's \"Tip distance\": height of the rounded tip |\n| `ClawTipHeight` | `double` | get | |\n| `ClawTipWidth` | `double` | get | |\n| `DrillType` | `string` | get | \"NONE\" \\| \"ROUND\" \\| \"QUAD\" |\n| `ForceEvenNumber` | `bool` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `HaloStoneCount` | `int` | get | Stones forming the halo ring (around the center gem) |\n| `HaloStoneSize` | `double` | get | |\n| `HaloStoneWeight` | `double` | get | |\n| `HaloTotalWeight` | `double` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |","metadata":{"title":"HaloApi","section":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","collection":"scripting","hash":"f6fdfc947c8affa19fd025ae903dcb3c","indexed_by":"docs-index"}},{"content":"HaloApi — IHalo\n\n| Property | Type | | |\n|---|---|---|---|\n| `ProngCount` | `int` | get | the MOTHER gem's prongs |\n| `ProngDiameter` | `double` | get | |\n| `ProngMode` | `string` | get | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\": the mother gem's prongs, as on every setting with prongs. |\n| `StoneSetting` | `string` | get | \"NONE\" \\| \"SHARED\" \\| \"SCALLOPED\" |","metadata":{"title":"HaloApi","section":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","collection":"scripting","hash":"cda929cb472f014ac977b05fe914a046","indexed_by":"docs-index"}},{"content":"HaloApi — IHalo\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetAutomaticProngSize(bool automatic)` | |\n| `void SetChannelBrightCut(double brightCut)` | |\n| `void SetChannelDistanceToGem(double distance)` | signed |\n| `void SetChannelHeight(double height)` | |\n| `void SetChannelInnerHeight(double height)` | |\n| `void SetChannelInnerWidth(double width)` | |\n| `void SetChannelPositionZ(double positionZ)` | signed |\n| `void SetChannelProfile(string assetName)` | CHANNEL_PROFILE asset |\n| `void SetChannelRotation(double degrees)` | signed |\n| `void SetChannelWidth(double width)` | |\n| `void SetClawGemInside(double gemInside)` | not 0 |\n| `void SetClawTension(double tension)` | 1-100 |\n| `void SetClawTipDistance(double distance)` | |\n| `void SetClawTipHeight(double height)` | |\n| `void SetClawTipWidth(double width)` | |\n| `void SetDrillSize(double width, double height)` | |\n| `void SetDrillType(string drillType)` | NONE \\| ROUND \\| QUAD |\n| `void SetElement(string element)` | Applies a saved Halo element (ElementsApi.List(\"Halo\")) to this halo: its parameters replace the current ones, the mother gem stays, and the halo regenerates in place (same id). |\n| `void SetFilletFactor(double factor)` | |\n| `void SetForceEvenNumber(bool forceEven)` | |\n| `void SetProngCount(int count)` | the MOTHER gem's prongs |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngGemInside(double gemInside)` | signed |\n| `void SetProngHeightOverGirdle(double height)` | |\n| `void SetProngMode(string mode)` | ROUND \\| CUSTOM \\| CLAW (DEFAULT and CIRCLE also mean ROUND). CLAW on a halo whose claw values are all 0 starts from the tool's defaults. |","metadata":{"title":"HaloApi","section":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","collection":"scripting","hash":"29a1681f09348dcb03af8822a7c4a526","indexed_by":"docs-index"}},{"content":"HaloApi — IHalo\n\n| Method | |\n|---|---|\n| `void SetProngProfile(string assetName)` | CLOSED_PROFILE asset; switches the prongs to CUSTOM |\n| `void SetProngRotation(double degrees)` | signed |\n| `void SetStoneDistance(double stoneDistance)` | |\n| `void SetStoneGemInside(double gemInside)` | signed |\n| `void SetStoneSetting(string setting)` | NONE \\| SHARED \\| SCALLOPED |\n| `void SetStoneSize(double stoneSize)` | Parametric edits -- each regenerates the halo (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. Millimetres, and LITERAL values: 0 and negatives are allowed where the parameter is signed. |\n| `void SetStoneVertical(double vertical)` | signed |","metadata":{"title":"HaloApi","section":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/halo/#ihalo","collection":"scripting","hash":"8a81d9e698f5b2c1b7617ca9f6433c94","indexed_by":"docs-index"}},{"content":"HiddenHaloApi\n\nA hidden halo under the centre stone.\n\n```python\nfrom ArtisanPlugin.Scripting import HiddenHaloApi\n```\n\nSee also the guide, Gemsets › Hidden halo, and the Python package, `ra.hidden_halo`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IHiddenHalo` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IHiddenHalo` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a hidden halo -- a ring of small stones tucked UNDER an existing gem, facing outward -- the ArtisanHiddenHalo tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IHiddenHalo` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Hidden halos currently selected in the active doc. |","metadata":{"title":"HiddenHaloApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/","collection":"scripting","hash":"fd8fb3f5959e71e7e797903ecac94d60","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — All\n\n```csharp\nIReadOnlyList<IHiddenHalo> HiddenHaloApi.All()\n```\n\n`IHiddenHalo` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IHiddenHalo> HiddenHaloApi.ByLayer(string layerName)\n```\n\n`IHiddenHalo` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HiddenHaloApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#all","collection":"scripting","hash":"58f2942b98f9da5ed4ae9b1a24f84fe3","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — Count\n\n```csharp\nint HiddenHaloApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"HiddenHaloApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#count","collection":"scripting","hash":"5d3633d33e1f41775a7977f998deb477","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — Create\n\n```csharp\nIHiddenHalo HiddenHaloApi.Create(\n    Guid gemId,\n    double stoneSize = 0,\n    double stoneDistance = 0,\n    double channelWidth = 0,\n    double channelHeight = 0,\n    string railShape = null,\n    string prongType = null,\n    string profile = null,\n    double railXLength = 0,\n    double railYLength = 0,\n    string stoneShape = null,\n    double distanceToGem = double.NaN,\n    double channelPositionZ = double.NaN,\n    double channelRotation = double.NaN,\n    double prongDistance = double.NaN,\n    bool? forceEvenNumber = null)\n```\n\nBuilds a hidden halo -- a ring of small stones tucked UNDER an existing gem, facing outward -- the ArtisanHiddenHalo tool, headless. `gemId` must be a gem in the active document; any center-gem shape works (the rail is parametric, chosen by `railShape`, and does not follow the gem's outline). Millimetres; 0 keeps the tool default (or the user's saved defaults): stoneSize 0.9, stoneDistance 0.10, channelWidth 1.1, channelHeight 1.0. `railShape` is CIRCLE (default), SQUARE (opens at 5.50 x 5.50) or OVAL (5.50 x 8.70). `prongType` is NONE (default), SHARED or SCALLOPED. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the tool's \"014\" channel profile (falling back to the type default). Returns an IHiddenHalo handle to the new hidden halo group.","metadata":{"title":"HiddenHaloApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#create","collection":"scripting","hash":"dbb8aa841a8ddf9181a024d6bf2ccfad","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `stoneSize` | `double` | `0` |\n| `stoneDistance` | `double` | `0` |\n| `channelWidth` | `double` | `0` |\n| `channelHeight` | `double` | `0` |\n| `railShape` | `string` | `null` |\n| `prongType` | `string` | `null` |\n| `profile` | `string` | `null` |\n| `railXLength` | `double` | `0` |\n| `railYLength` | `double` | `0` |\n| `stoneShape` | `string` | `null` |\n| `distanceToGem` | `double` | `double.NaN` |\n| `channelPositionZ` | `double` | `double.NaN` |\n| `channelRotation` | `double` | `double.NaN` |\n| `prongDistance` | `double` | `double.NaN` |\n| `forceEvenNumber` | `bool?` | `null` |\n\nReturns `IHiddenHalo`.","metadata":{"title":"HiddenHaloApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#create","collection":"scripting","hash":"92c381aa766381f266b4e41d721993c7","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — Find\n\n```csharp\nIHiddenHalo HiddenHaloApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IHiddenHalo`.\n\nForGem\n```csharp\nIReadOnlyList<IHiddenHalo> HiddenHaloApi.ForGem(Guid gemId)\n```\n\n`IHiddenHalo` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HiddenHaloApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#find","collection":"scripting","hash":"dccd9dd73fc0170b9a5d7ee58b37f946","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — Selected\n\n```csharp\nIReadOnlyList<IHiddenHalo> HiddenHaloApi.Selected()\n```\n\nHidden halos currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"HiddenHaloApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#selected","collection":"scripting","hash":"ad58b9dbc2a78fa18ab3b5eaed37d625","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — IHiddenHalo\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ChannelDistanceToGem` | `double` | get | |\n| `ChannelHeight` | `double` | get | |\n| `ChannelPositionZ` | `double` | get | signed |\n| `ChannelRotation` | `double` | get | degrees, signed |\n| `ChannelWidth` | `double` | get | The rail section. Rotation defaults to 90 and PositionZ to -0.6: together they are what makes the halo \"hidden\". |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngDistance` | `double` | get | |\n| `RailShape` | `string` | get | Ring shape of the hidden halo rail: \"CIRCLE\", \"SQUARE\" or \"OVAL\". |\n| `RailXLength` | `double` | get | Extents of the SQUARE / OVAL rail (ignored by CIRCLE), millimetres. |\n| `RailYLength` | `double` | get | |\n| `StoneCount` | `int` | get | Small stones forming the hidden ring (under the center gem) |\n| `StoneSetting` | `string` | get | \"NONE\" \\| \"SHARED\" \\| \"SCALLOPED\" |\n| `StoneShape` | `string` | get | \"ROUND\" \\| \"PRINCESS\" |\n| `StoneSize` | `double` | get | |\n| `StoneWeight` | `double` | get | |\n| `TotalStoneWeight` | `double` | get | |","metadata":{"title":"HiddenHaloApi","section":"IHiddenHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#ihiddenhalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#ihiddenhalo","collection":"scripting","hash":"f6cf6cb695f5fdee54ac9238bbc137e9","indexed_by":"docs-index"}},{"content":"HiddenHaloApi — IHiddenHalo\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetChannelBrightCut(double brightCut)` | |\n| `void SetChannelDistanceToGem(double distance)` | signed |\n| `void SetChannelHeight(double height)` | |\n| `void SetChannelInnerHeight(double height)` | |\n| `void SetChannelInnerWidth(double width)` | |\n| `void SetChannelPositionZ(double positionZ)` | signed |\n| `void SetChannelProfile(string assetName)` | CHANNEL_PROFILE asset |\n| `void SetChannelRotation(double degrees)` | signed |\n| `void SetChannelWidth(double width)` | |\n| `void SetForceEvenNumber(bool forceEven)` | |\n| `void SetProngDistance(double distance)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetRailShape(string railShape)` | CIRCLE \\| SQUARE \\| OVAL |\n| `void SetRailSize(double xLength, double yLength)` | SQUARE / OVAL only |\n| `void SetStoneDistance(double stoneDistance)` | |\n| `void SetStoneGemInside(double gemInside)` | signed |\n| `void SetStoneSetting(string setting)` | NONE \\| SHARED \\| SCALLOPED |\n| `void SetStoneShape(string shape)` | ROUND \\| PRINCESS |\n| `void SetStoneSize(double stoneSize)` | Parametric edits -- each regenerates the hidden halo (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. Millimetres, and LITERAL values: 0 and negatives are allowed where the parameter is signed. |\n| `void SetStoneVertical(double vertical)` | signed |","metadata":{"title":"HiddenHaloApi","section":"IHiddenHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#ihiddenhalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hidden-halo/#ihiddenhalo","collection":"scripting","hash":"fa0fafe7f42d8cb854d58e204914fb38","indexed_by":"docs-index"}},{"content":"HingeApi\n\nHinge (the ArtisanHinge tool). DESTRUCTIVE on the input: the solid is REPLACED by the hinged parts, like the tool's Accept.\n\n```python\nfrom ArtisanPlugin.Scripting import HingeApi\n```\n\nSee also the guide, Accessories › Hinge, and the Python package, `ra.hinge`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `point` marks where the hinge goes ON the brep (the tool's pick-point-on-solid). |","metadata":{"title":"HingeApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hinge/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hinge/","collection":"scripting","hash":"8a6f35db8be5c18e024ef39ec4f9c24c","indexed_by":"docs-index"}},{"content":"HingeApi — Create\n\n```csharp\nIReadOnlyList<Guid> HingeApi.Create(\n    Guid brepId,\n    Point3d point,\n    double diameter = 0,\n    double cutDiameter = 0,\n    double thickness = 0,\n    int numberOfMales = 0,\n    double openingAngle = -1)\n```\n\n`point` marks where the hinge goes ON the brep (the tool's pick-point-on-solid). Defaults: pin diameter 0.7, cut diameter 4, thickness 1, 1 male, opening angle 10. Returns the ids of the resulting breps.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `brepId` | `Guid` | required |\n| `point` | `Point3d` | required |\n| `diameter` | `double` | `0` |\n| `cutDiameter` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `numberOfMales` | `int` | `0` |\n| `openingAngle` | `double` | `-1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HingeApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/hinge/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/hinge/#create","collection":"scripting","hash":"2b589a92f4bcef8bab9e9fe740dacbaa","indexed_by":"docs-index"}},{"content":"HoneyCombApi\n\nHoneycomb pattern inside a closed curve (the ArtisanHoneyComb tool).\n\n```python\nfrom ArtisanPlugin.Scripting import HoneyCombApi\n```\n\nSee also the guide, Accessories › Honeycomb, and the Python package, `ra.honeycomb`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: cell diameter 6, wall thickness 0.8. |","metadata":{"title":"HoneyCombApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/honey-comb/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/honey-comb/","collection":"scripting","hash":"6fb0c06fb1568255c4cac9b4b9bd1e63","indexed_by":"docs-index"}},{"content":"HoneyCombApi — Create\n\n```csharp\nIReadOnlyList<Guid> HoneyCombApi.Create(\n    Guid curveId,\n    double diameter = 0,\n    double thickness = 0,\n    double height = 0)\n```\n\nDefaults: cell diameter 6, wall thickness 0.8. Returns the created object ids (pattern breps and helper curves).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `diameter` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `height` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"HoneyCombApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/honey-comb/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/honey-comb/#create","collection":"scripting","hash":"f32acd2697d038d21ad03bb2a058b0ca","indexed_by":"docs-index"}},{"content":"HuggieApi\n\nHuggie earring (the ArtisanHuggie tool): closed hoop with hinge, or opened hoop with post.\n\n```python\nfrom ArtisanPlugin.Scripting import HuggieApi\n```\n\nSee also the Python package, `ra.huggie`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `mode` is \"CLOSED\" (hoop with hinge, default) or \"OPENED\" (partial hoop with post). |","metadata":{"title":"HuggieApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/huggie/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/huggie/","collection":"scripting","hash":"bb62a47e3488686b94503fa11d491745","indexed_by":"docs-index"}},{"content":"HuggieApi — Create\n\n```csharp\nGuid HuggieApi.Create(\n    Plane? plane = null,\n    double innerWidth = 0,\n    double innerHeight = 0,\n    string mode = null,\n    double aperture = 0,\n    double aperturePercentage = -1,\n    string profile = null)\n```\n\n`mode` is \"CLOSED\" (hoop with hinge, default) or \"OPENED\" (partial hoop with post). `aperture` is the closed-mode opening in mm (default 6.5); `aperturePercentage` is the opened-mode opening as a 0..1 fraction (default 0.25, pass -1 to keep it). `profile` names a ring-profile asset applied to the three huggie profiles. Defaults: inner width 15, inner height 20.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `innerWidth` | `double` | `0` |\n| `innerHeight` | `double` | `0` |\n| `mode` | `string` | `null` |\n| `aperture` | `double` | `0` |\n| `aperturePercentage` | `double` | `-1` |\n| `profile` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"HuggieApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/huggie/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/huggie/#create","collection":"scripting","hash":"4ce02d1b6bcf512e592fdd5186ab8e54","indexed_by":"docs-index"}},{"content":"Other interfaces\n\nThe bases the handles share, and interfaces no facade returns directly. A handle lists their members as its own, marked *(from ...)*.\n\nIGemSetting\n*Handle* — extends `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `GemCaratWeight` | `double` | get | |\n| `GemMaterial` | `string` | get | |\n| `GemShape` | `string` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"Other interfaces","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/","collection":"scripting","hash":"ea3bb3197cf384c396ec16bcbb38d925","indexed_by":"docs-index"}},{"content":"Other interfaces — IParametricGroup\n\n*Handle* — extends `IParametricObject`.\n\nHandles for the parametric GROUPS whose model is exposed as JSON rather than as a typed section tree: the model is read with GetParameter(path) and, where the ParametricEngine can regenerate the group, changed with SetParameter(path, value) — the path is the JSON property path of the kernel model (\"Center.Height\", \"Prongs.Diameter\"), which describe_object_parameters / ParametersJson show. edit_object falls back to SetParameter for keys the handle has no Set* for.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MemberCount` | `int` | get | Rhino objects in the group |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | the kernel model, as stored in the group |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | dotted JSON path; null when absent |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"Other interfaces","section":"IParametricGroup","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/#iparametricgroup","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/#iparametricgroup","collection":"scripting","hash":"8cef424eba76cba76b783ebcdd8e2871","indexed_by":"docs-index"}},{"content":"Other interfaces — IParametricObject\n\n*Handle*.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Id` | `Guid` | get | |\n| `LayerName` | `string` | get | |\n| `MotherGemId` | `Guid` | get | |\n| `ObjectType` | `string` | get | |\n| `Position` | `Point3d` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | |\n| `void Move(Vector3d translation)` | |","metadata":{"title":"Other interfaces","section":"IParametricObject","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/#iparametricobject","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/interfaces/#iparametricobject","collection":"scripting","hash":"d93a490134c0681689bcc53074cbe87d","indexed_by":"docs-index"}},{"content":"LinkApi\n\nSingle chain link (the ArtisanLink tool).\n\n```python\nfrom ArtisanPlugin.Scripting import LinkApi\n```\n\nSee also the guide, Accessories › Link, and the Python package, `ra.link`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: width 9, height 6, wire diameter 3, twist angle 90. |\n\nCreate\n```csharp\nGuid LinkApi.Create(\n    Plane? plane = null,\n    double width = 0,\n    double height = 0,\n    double diameter = 0,\n    double twistAngle = -1)\n```\n\nDefaults: width 9, height 6, wire diameter 3, twist angle 90. Pass twistAngle -1 to keep the default (0 is a valid twist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `plane` | `Plane?` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `diameter` | `double` | `0` |\n| `twistAngle` | `double` | `-1` |\n\nReturns `Guid`.","metadata":{"title":"LinkApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/link/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/link/","collection":"scripting","hash":"6e80ad42f160c9929624f105c6e76778","indexed_by":"docs-index"}},{"content":"ManufacturingApi\n\nManufacturing helpers, starting with the Automatic Repair tool.\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi\n```\n\nSee also the guide, Manufacturing, and the Python package, `ra.manufacturing`.","metadata":{"title":"ManufacturingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/","collection":"scripting","hash":"3eeca64f7321ecde63a800ce21549135","indexed_by":"docs-index"}},{"content":"ManufacturingApi — Methods\n\n| Method | |\n|---|---|\n| `AddIdentifier` | Adds an identifier tag to a closed ring mesh (the ArtisanIdentifier tool, headless): a pipe between the two given points on the mesh carrying an engraved reference text. |\n| `AutomaticRepair` | Repairs the given objects into a single printable mesh (the ArtisanAutomaticRepair tool, headless): closes gaps, fixes normals, makes the result watertight. |\n| `BalanceCheck` | Checks how a pendant/earring hangs (the ArtisanBalancerChecker tool): the piece hangs from `baseId` (the bail or hook), and gravity pulls its volume centroid straight below the hook. |\n| `DetectNonPrintable` | Flags the objects that would not print (the ArtisanQuickNonPrintableDetector tool): bad objects, duplicates, open surfaces and open polysurfaces, using Rhino's own selectors. |\n| `ExportAllInOne` | Merges solids/meshes into ONE printable mesh and writes a binary STL (the ArtisanExportAllInOne tool, headless). |\n| `ExportFromLayers` | Writes one STL per visible layer holding meshes, named \" .stl\" inside `folder` (the ArtisanExportFromLayers tool, headless). |\n| `ImportToLayers` | Imports every STL in `folder`, each file into its own layer named after the file with a distinct color per layer (the ArtisanImportToLayers tool, headless). |\n| `QuickCheck` | The ArtisanQuickCheck tool, scriptable: verifies each mesh is valid and watertight, and (like the tool) recolors it green when printable, red when not. |\n| `ReduceThickness` | Hollows a wall down to a uniform minimum thickness (the ArtisanReduceThickness tool, headless). |","metadata":{"title":"ManufacturingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","collection":"scripting","hash":"b13656d2cbd0fb8e0befc8a98b5f996c","indexed_by":"docs-index"}},{"content":"ManufacturingApi — Methods\n\n| Method | |\n|---|---|\n| `ResizeRing` | Batch ring resizer (the ArtisanResizer tool, headless): takes a CLOSED ring mesh and produces one resized copy per target diameter, laid out in a row (spaced by the tool's ring distance) on child layers under a \"Resizer\" parent layer, one group per size -- same output as the tool's Layers mode. |\n| `SprueClusterTree` | Cluster casting tree (the ArtisanSprueClusterTree tool, headless): a cylinder built as a grid of two crossed helix families (rhombic cells) standing on `basePoint`, with an anchor node at every crossing; a copy of the given meshes is placed on the nodes in round-robin, each held by a mini-connector (diameter 1, length 6). |\n| `SprueCurve` | Perimeter-frame sprue (the ArtisanSprueCurve tool, headless): a closed pipe frame around the piece with tapered connectors reaching it and a horizontal injection post on the front side. |\n| `SprueExternalFrames` | External-frame sprue (the ArtisanSprueExternalFrames tool, headless), meant for elongated pieces laid in a row (chains, bracelets): a rounded-rectangle runner around the combined bounding box of the given meshes, with pairs of thin stubs reaching inward from the long sides and, optionally, one from each short end. |\n| `SprueExternalTree` | External-tree sprue for casting (the ArtisanSprueExternalTree tool, headless): a tapered trunk standing OUTSIDE the mesh at `trunkBasePoint` with one branch per contact point reaching the outside of the closed mesh. |\n| `SprueHelix` | Helix casting tree (the ArtisanSprueHelix tool, headless): a conical base, a vertical trunk and a helical wire climbing around it, with `copies` copies of the link mesh hung along the wire -- the tool for printing whole chains in one tree. |","metadata":{"title":"ManufacturingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","collection":"scripting","hash":"bc91e48184fa263972718c593f927067","indexed_by":"docs-index"}},{"content":"ManufacturingApi — Methods\n\n| Method | |\n|---|---|\n| `SprueInnerBranches` | Inner-branches sprue for casting (the ArtisanSprueInnerBranches tool, headless): a central post rising from `basePoint` with one branch per contact point reaching the inside of the closed mesh (typically a ring), optionally mirrored by symmetry. |\n| `SprueInnerTree` | Builds an inner-tree sprue for casting (the ArtisanSprueInnerTree tool, headless): a trunk from `basePoint` with branches reaching each of `contactPoints` on the closed mesh. |\n| `SprueMultipleCopies` | Multiple-copies sprue (the ArtisanSprueMultipleCopies tool, headless): a tapered trunk between `trunkStart` and `trunkEnd` with one curved branch from the trunk to each of `contactPoints` on the mesh(es). |\n| `SprueSingle` | Single sprue post (the ArtisanSprueSingle tool, headless): one tapered connector at `point`, which should lie ON the mesh (it plays the role of the tool's pick-point-on-mesh prompt). |\n| `SprueSpiral` | Flat spiral casting sprue (the ArtisanSprueSpiral tool, headless): the same chain-printing idea as the helix but with the wire coiled FLAT, standing on legs, each link hung from a single vertical connector. |\n| `SprueTree` | Radial casting tree (the ArtisanSprueTree tool, headless): a base + conical trunk rising from `basePoint`, with `floors` floors x `piecesPerFloor` branches around it, and a copy of the given meshes distributed over the branches in round-robin. |","metadata":{"title":"ManufacturingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#methods","collection":"scripting","hash":"01f3e6281a026b196c67fa7af3f9c831","indexed_by":"docs-index"}},{"content":"ManufacturingApi — AddIdentifier\n\n```csharp\nGuid ManufacturingApi.AddIdentifier(\n    Guid meshId,\n    Point3d point1,\n    Point3d point2,\n    string text = null,\n    double diameter = 0,\n    double thickness = 0,\n    double fontSize = 0,\n    double overlapping = 0)\n```\n\nAdds an identifier tag to a closed ring mesh (the ArtisanIdentifier tool, headless): a pipe between the two given points on the mesh carrying an engraved reference text. The two points play the role of the tool's two interactive picks -- both should lie on/near the mesh. Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): diameter 1.5, thickness 1.5, fontSize 2, overlapping 0.15. Returns the Guid of the new mesh (ring + tag); the original mesh is left in the document, same as the tool.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `point1` | `Point3d` | required |\n| `point2` | `Point3d` | required |\n| `text` | `string` | `null` |\n| `diameter` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `fontSize` | `double` | `0` |\n| `overlapping` | `double` | `0` |\n\nReturns `Guid`.","metadata":{"title":"ManufacturingApi","section":"AddIdentifier","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#addidentifier","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#addidentifier","collection":"scripting","hash":"9947dedf803a39f5ac84d465a324b086","indexed_by":"docs-index"}},{"content":"ManufacturingApi — AutomaticRepair\n\n```csharp\nRepairResult ManufacturingApi.AutomaticRepair(\n    IEnumerable<Guid> objectIds = null,\n    double precision = 0,\n    bool deleteOriginal = false)\n```\n\nRepairs the given objects into a single printable mesh (the ArtisanAutomaticRepair tool, headless): closes gaps, fixes normals, makes the result watertight. Rhino 8+ only (uses ShrinkWrap). objectIds objects to repair; null/empty = current selection. Gems are skipped automatically, like the tool. precision repair precision in mm; 0 = the tool's configured default (typically 0.025). Smaller = more faithful and slower. deleteOriginal true = remove the source objects after the repair. The repaired mesh is added to the last user layer with the wax color from the settings, same as the tool's Accept button. Long operation: Rhino stays busy while it computes.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `precision` | `double` | `0` |\n| `deleteOriginal` | `bool` | `false` |\n\nReturns `RepairResult`.","metadata":{"title":"ManufacturingApi","section":"AutomaticRepair","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#automaticrepair","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#automaticrepair","collection":"scripting","hash":"8dee096607ec91daa5612b81788c804c","indexed_by":"docs-index"}},{"content":"ManufacturingApi — BalanceCheck\n\n```csharp\nBalanceReport ManufacturingApi.BalanceCheck(\n    Guid baseId,\n    IEnumerable<Guid> geometryIds,\n    bool apply = false,\n    bool deleteOriginal = false,\n    double tolerance = 1)\n```\n\nChecks how a pendant/earring hangs (the ArtisanBalancerChecker tool): the piece hangs from `baseId` (the bail or hook), and gravity pulls its volume centroid straight below the hook. The report gives the tilt the piece would take, in degrees (0 = it hangs straight). apply true = replicate the tool's Accept: adds ROTATED COPIES of the geometry so the centroid hangs below the base point (the originals stay unless deleteOriginal). Default false = report only. deleteOriginal with apply, removes the source geometry. tolerance degrees under which IsBalanced is true (default 1). Read-only unless `apply` is true.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `baseId` | `Guid` | required |\n| `geometryIds` | `IEnumerable ` | required |\n| `apply` | `bool` | `false` |\n| `deleteOriginal` | `bool` | `false` |\n| `tolerance` | `double` | `1` |\n\nReturns `BalanceReport`.","metadata":{"title":"ManufacturingApi","section":"BalanceCheck","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#balancecheck","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#balancecheck","collection":"scripting","hash":"ec6e57d39215789fa557bc5ab7c1ebb8","indexed_by":"docs-index"}},{"content":"ManufacturingApi — DetectNonPrintable\n\n```csharp\nNonPrintableReport ManufacturingApi.DetectNonPrintable()\n```\n\nFlags the objects that would not print (the ArtisanQuickNonPrintableDetector tool): bad objects, duplicates, open surfaces and open polysurfaces, using Rhino's own selectors. Like the tool it leaves the offenders SELECTED so you can see them; the report lists them by category. Cheap; run it before an STL export. Nothing flagged = Count 0 and an empty selection.\n\nReturns `NonPrintableReport`.","metadata":{"title":"ManufacturingApi","section":"DetectNonPrintable","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#detectnonprintable","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#detectnonprintable","collection":"scripting","hash":"7a832b0c20d30f71c032dadebe9e4fd7","indexed_by":"docs-index"}},{"content":"ManufacturingApi — ExportAllInOne\n\n```csharp\nAllInOneExport ManufacturingApi.ExportAllInOne(\n    string path,\n    IEnumerable<Guid> objectIds = null,\n    bool allowNonPrintable = false)\n```\n\nMerges solids/meshes into ONE printable mesh and writes a binary STL (the ArtisanExportAllInOne tool, headless). Breps, extrusions and SubDs are meshed with the tool's fine analysis parameters; every part is repaired and checked. path destination .stl (extension appended, folder created) objectIds objects to export; null/empty = current selection, and when nothing is selected every visible solid/mesh that is not a gem (like the tool's filter) allowNonPrintable the tool asks \"part of the geometry is not printable, export anyway?\": false (default) fails listing the offending ids (and selects them, like the tool); true exports the valid part anyway. Returns the path plus the check summary.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `objectIds` | `IEnumerable ` | `null` |\n| `allowNonPrintable` | `bool` | `false` |\n\nReturns `AllInOneExport`.","metadata":{"title":"ManufacturingApi","section":"ExportAllInOne","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#exportallinone","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#exportallinone","collection":"scripting","hash":"87eba5541d010f642570cffb9a1d736c","indexed_by":"docs-index"}},{"content":"ManufacturingApi — ExportFromLayers\n\n```csharp\nIReadOnlyList<LayerExport> ManufacturingApi.ExportFromLayers(\n    string folder,\n    bool overwrite = true)\n```\n\nWrites one STL per visible layer holding meshes, named \" .stl\" inside `folder` (the ArtisanExportFromLayers tool, headless). Only MESH objects are exported, exactly like the tool: mesh your solids first (AutomaticRepair / ExportAllInOne mesh on the fly, this one does not). Layers without meshes are ignored. overwrite the tool asks per existing file; false skips those files (reported with Skipped = true), true (default) replaces them. Returns one entry per layer with meshes.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `folder` | `string` | required |\n| `overwrite` | `bool` | `true` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"ExportFromLayers","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#exportfromlayers","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#exportfromlayers","collection":"scripting","hash":"34445ec93628b779c938faa41a790071","indexed_by":"docs-index"}},{"content":"ManufacturingApi — ImportToLayers\n\n```csharp\nIReadOnlyList<LayerImport> ManufacturingApi.ImportToLayers(string folder)\n```\n\nImports every STL in `folder`, each file into its own layer named after the file with a distinct color per layer (the ArtisanImportToLayers tool, headless). Files that bring no objects are skipped without creating a layer. Returns one entry per imported file. Any previous selection is cleared.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `folder` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"ImportToLayers","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#importtolayers","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#importtolayers","collection":"scripting","hash":"ce438241e41f4cc7d28403af5f516dff","indexed_by":"docs-index"}},{"content":"ManufacturingApi — QuickCheck\n\n```csharp\nIReadOnlyList<MeshCheckResult> ManufacturingApi.QuickCheck(\n    IEnumerable<Guid> objectIds = null)\n```\n\nThe ArtisanQuickCheck tool, scriptable: verifies each mesh is valid and watertight, and (like the tool) recolors it green when printable, red when not. `objectIds` null/empty = current selection; non-mesh objects are skipped. Returns one result per checked mesh.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"QuickCheck","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#quickcheck","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#quickcheck","collection":"scripting","hash":"7d998fb51f2f8c552f7faa82fff2d7ae","indexed_by":"docs-index"}},{"content":"ManufacturingApi — ReduceThickness\n\n```csharp\nReduceThicknessResult ManufacturingApi.ReduceThickness(\n    Guid objectId,\n    IEnumerable<Point3d> points,\n    double thickness = 0,\n    double radius = 0,\n    int steps = 0)\n```\n\nHollows a wall down to a uniform minimum thickness (the ArtisanReduceThickness tool, headless). The tool is a brush: you paint the side of the wall you want to sink and it drops to the target thickness, measured against the opposite wall and the gems (gems count as walls and their seats are masked, so nothing thins under a stone). Here the brush strokes become `points`: every point is a brush center ON the object's surface, on the side to hollow (usually the inside of the shank). objectId mesh, polysurface, extrusion or SubD; the result is always a mesh that REPLACES it (same attributes/layer) points brush centers on the surface, in order thickness target wall thickness in mm; 0 = the tool default 0.8 radius brush radius in mm; 0 = the tool default (8% of the object's bounding-box diagonal) steps brush steps applied at each point; 0 = 4. The center lands on the target at once, the rim converges with more steps. The tool warns when vertices end below the target; here that count is returned as ThinVertices instead. Returns the new mesh id and the grams saved with the document's first metal.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectId` | `Guid` | required |\n| `points` | `IEnumerable ` | required |\n| `thickness` | `double` | `0` |\n| `radius` | `double` | `0` |\n| `steps` | `int` | `0` |\n\nReturns `ReduceThicknessResult`.","metadata":{"title":"ManufacturingApi","section":"ReduceThickness","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#reducethickness","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#reducethickness","collection":"scripting","hash":"8a7973c035b12a03219561e87537f1d5","indexed_by":"docs-index"}},{"content":"ManufacturingApi — ResizeRing\n\n```csharp\nIReadOnlyList<ResizedRing> ManufacturingApi.ResizeRing(\n    Guid meshId,\n    double fromDiameter,\n    IEnumerable<double> toDiameters,\n    IEnumerable<string> names = null)\n```\n\nBatch ring resizer (the ArtisanResizer tool, headless): takes a CLOSED ring mesh and produces one resized copy per target diameter, laid out in a row (spaced by the tool's ring distance) on child layers under a \"Resizer\" parent layer, one group per size -- same output as the tool's Layers mode. meshId the ring mesh to resize fromDiameter the ring's CURRENT inner diameter in mm; 0 = the document's finger size toDiameters target inner diameters in mm (e.g. [16.5, 17.35, 18.2]) names optional labels, parallel to toDiameters; default is the diameter formatted (\"17.35\") The user's saved Resizer defaults (mode, alignment, identifier tag, sprue, ring spacing) apply when there are any, like in the tool; an identifier tag or sprue they enable goes into its ring's layer and group. Long operation (one boolean pipeline per size).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `fromDiameter` | `double` | required |\n| `toDiameters` | `IEnumerable ` | required |\n| `names` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"ResizeRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#resizering","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#resizering","collection":"scripting","hash":"3e320f9dc914a70286c583402fa1194a","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueClusterTree\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueClusterTree(\n    IEnumerable<Guid> meshIds = null,\n    Point3d? basePoint = null,\n    int copiesPerMesh = 0,\n    double diameter = 0,\n    double height = 0,\n    int cellsAround = 0,\n    int rows = 0,\n    double wireDiameter = 0)\n```\n\nCluster casting tree (the ArtisanSprueClusterTree tool, headless): a cylinder built as a grid of two crossed helix families (rhombic cells) standing on `basePoint`, with an anchor node at every crossing; a copy of the given meshes is placed on the nodes in round-robin, each held by a mini-connector (diameter 1, length 6). Copies anchor by the bottom-center of their bounding box, like the tool's default pick. meshIds the model meshes; null/empty = current selection. basePoint where the base sits (default: world origin). copiesPerMesh copies of EACH mesh; 0 = fill the free nodes. Numeric arguments with 0 keep the tool defaults: diameter 65, height 90, cellsAround 8, rows 7, wireDiameter 3 (mm). Long operation. Returns the ids of ALL the meshes added (grid, base, connectors and every model copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshIds` | `IEnumerable ` | `null` |\n| `basePoint` | `Point3d?` | `null` |\n| `copiesPerMesh` | `int` | `0` |\n| `diameter` | `double` | `0` |\n| `height` | `double` | `0` |\n| `cellsAround` | `int` | `0` |\n| `rows` | `int` | `0` |\n| `wireDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueClusterTree","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueclustertree","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueclustertree","collection":"scripting","hash":"f6dc064211e9875e72a19239555017e1","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueCurve\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueCurve(\n    Guid meshId,\n    Guid? curveId = null,\n    double offset = 0,\n    int smooth = -1,\n    double width = 0,\n    double height = 0,\n    int connectionCount = 0,\n    double connectionDiameter = 0,\n    string symmetry = null)\n```\n\nPerimeter-frame sprue (the ArtisanSprueCurve tool, headless): a closed pipe frame around the piece with tapered connectors reaching it and a horizontal injection post on the front side. The frame is the automatic silhouette of the piece pushed outwards by `offset`, or the curve `curveId` when given (the tool's custom-curve pick). Connections are seeded equidistant along the frame, exactly like the tool's initial layout. meshId the piece mesh. curveId optional closed perimeter curve; Guid.Empty/omitted = automatic silhouette. symmetry \"None\", \"X\", \"Y\" or \"Quad\" (case-insensitive); null = None. Numeric arguments with 0 keep the tool defaults: offset 2, width 1, height 1, connectionCount 4, connectionDiameter 0.3 (mm); `smooth` uses -1 = default (8 iterations) because 0 is a real value (no smoothing). The injection post keeps the tool defaults (external diameter 3, length 5). Returns the ids of the meshes added (frame, injection and connectors), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `curveId` | `Guid?` | `null` |\n| `offset` | `double` | `0` |\n| `smooth` | `int` | `-1` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `connectionCount` | `int` | `0` |\n| `connectionDiameter` | `double` | `0` |\n| `symmetry` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruecurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruecurve","collection":"scripting","hash":"ec6e8834aabb1c2f4066be258bc34eeb","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueExternalFrames\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueExternalFrames(\n    IEnumerable<Guid> meshIds = null,\n    double margin = 0,\n    double cornerRadius = 0,\n    double frameDiameter = 0,\n    int connectorCount = 0,\n    double connectorSeparation = 0,\n    double connectorLength = 0,\n    bool endConnectors = true)\n```\n\nExternal-frame sprue (the ArtisanSprueExternalFrames tool, headless), meant for elongated pieces laid in a row (chains, bracelets): a rounded-rectangle runner around the combined bounding box of the given meshes, with pairs of thin stubs reaching inward from the long sides and, optionally, one from each short end. meshIds the pieces the frame is built around; null/empty = current selection endConnectors true = include the two short-side stubs (the tool's default) Numeric arguments with 0 keep the tool defaults: margin 3, cornerRadius 3, frameDiameter 2, connectorSeparation 5, connectorLength 4 (mm); connectorCount 0 = one stub pair per given object (what the tool seeds on selection). Returns the ids of the frame meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshIds` | `IEnumerable ` | `null` |\n| `margin` | `double` | `0` |\n| `cornerRadius` | `double` | `0` |\n| `frameDiameter` | `double` | `0` |\n| `connectorCount` | `int` | `0` |\n| `connectorSeparation` | `double` | `0` |\n| `connectorLength` | `double` | `0` |\n| `endConnectors` | `bool` | `true` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueExternalFrames","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueexternalframes","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueexternalframes","collection":"scripting","hash":"34b354070dd176e7a3a9a05cb1f4c95e","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueExternalTree\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueExternalTree(\n    Guid meshId,\n    Point3d trunkBasePoint,\n    IEnumerable<Point3d> contactPoints,\n    double height = 0,\n    double topDiameter = 0,\n    double bottomDiameter = 0,\n    double branchTrunkDiameter = 0,\n    double branchContactDiameter = 0)\n```\n\nExternal-tree sprue for casting (the ArtisanSprueExternalTree tool, headless): a tapered trunk standing OUTSIDE the mesh at `trunkBasePoint` with one branch per contact point reaching the outside of the closed mesh. The tool's two interactive picks become explicit arguments; the tool seeds the trunk beside the mesh (bounding-box Max.X + 5, centre Y, Z = 0). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 20, topDiameter 3, bottomDiameter 5, branchTrunkDiameter 2, branchContactDiameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `trunkBasePoint` | `Point3d` | required |\n| `contactPoints` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `topDiameter` | `double` | `0` |\n| `bottomDiameter` | `double` | `0` |\n| `branchTrunkDiameter` | `double` | `0` |\n| `branchContactDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueExternalTree","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueexternaltree","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueexternaltree","collection":"scripting","hash":"461406ecb8b6d3878fd3191b3c015330","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueHelix\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueHelix(\n    Guid linkMeshId,\n    Point3d basePoint = null,\n    int copies = 0,\n    double wireDiameter = 0,\n    double trunkDiameter = 0,\n    double connectorLength = 0,\n    double connectorDiameter = 0,\n    double clearanceMargin = 0)\n```\n\nHelix casting tree (the ArtisanSprueHelix tool, headless): a conical base, a vertical trunk and a helical wire climbing around it, with `copies` copies of the link mesh hung along the wire -- the tool for printing whole chains in one tree. Like the tool's Generate button, the helix is auto-sized (turns, diameter, trunk length, one support arm per turn) so the requested copies fit without collisions; the link is chained along its longest axis, same as the tool's initial pick. linkMeshId the chain link (mesh or SubD) basePoint where the tree stands on the plate; (0,0,0) = origin, the tool's starting position Numeric arguments with 0 keep the tool defaults: copies 125, wireDiameter 3, trunkDiameter 10, connectorLength 3.25, connectorDiameter 1.5, clearanceMargin 0 (mm). Long operation (the auto-sizing searches for a collision-free layout). Returns the ids of ALL the meshes added (tree + one mesh per copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `linkMeshId` | `Guid` | required |\n| `basePoint` | `Point3d` | `null` |\n| `copies` | `int` | `0` |\n| `wireDiameter` | `double` | `0` |\n| `trunkDiameter` | `double` | `0` |\n| `connectorLength` | `double` | `0` |\n| `connectorDiameter` | `double` | `0` |\n| `clearanceMargin` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueHelix","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruehelix","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruehelix","collection":"scripting","hash":"e3c4638804b8d5b6216f527b0149ce4a","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueInnerBranches\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueInnerBranches(\n    Guid meshId,\n    Point3d basePoint,\n    IEnumerable<Point3d> contactPoints,\n    double height = 0,\n    double topDiameter = 0,\n    double branchContactDiameter = 0,\n    int symmetry = 0)\n```\n\nInner-branches sprue for casting (the ArtisanSprueInnerBranches tool, headless): a central post rising from `basePoint` with one branch per contact point reaching the inside of the closed mesh (typically a ring), optionally mirrored by symmetry. The tool's two interactive picks become explicit arguments. meshId the closed mesh to sprue basePoint where the central post stands; the tool seeds it under the mesh centre at Z = 0 contactPoints points ON the mesh where the branches attach symmetry 0 = none (default), 1 = vertical mirror (X), 2 = horizontal mirror (Y), 3 = quad -- the tool's Symmetry combo, which multiplies each contact point Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height = the mesh bounding-box centre height (what the tool seeds on selection), topDiameter 3, branchContactDiameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `basePoint` | `Point3d` | required |\n| `contactPoints` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `topDiameter` | `double` | `0` |\n| `branchContactDiameter` | `double` | `0` |\n| `symmetry` | `int` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueInnerBranches","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueinnerbranches","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueinnerbranches","collection":"scripting","hash":"a9a51769691589f1819e2cbc0750be4f","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueInnerTree\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueInnerTree(\n    Guid meshId,\n    Point3d basePoint,\n    IEnumerable<Point3d> contactPoints,\n    double height = 0,\n    double topDiameter = 0,\n    double bottomDiameter = 0,\n    double branchContactDiameter = 0)\n```\n\nBuilds an inner-tree sprue for casting (the ArtisanSprueInnerTree tool, headless): a trunk from `basePoint` with branches reaching each of `contactPoints` on the closed mesh. The two interactive picks of the tool become explicit arguments. Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 10, topDiameter 3, bottomDiameter 5, branchContactDiameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, same as the tool's Accept).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `basePoint` | `Point3d` | required |\n| `contactPoints` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `topDiameter` | `double` | `0` |\n| `bottomDiameter` | `double` | `0` |\n| `branchContactDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueInnerTree","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueinnertree","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#sprueinnertree","collection":"scripting","hash":"bb2f843c34322f71dd15f9bd687d5191","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueMultipleCopies\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueMultipleCopies(\n    IEnumerable<Guid> meshIds,\n    Point3d trunkStart,\n    Point3d trunkEnd,\n    IEnumerable<Point3d> contactPoints,\n    double topDiameter = 0,\n    double bottomDiameter = 0,\n    double branchTrunkDiameter = 0,\n    double branchContactDiameter = 0)\n```\n\nMultiple-copies sprue (the ArtisanSprueMultipleCopies tool, headless): a tapered trunk between `trunkStart` and `trunkEnd` with one curved branch from the trunk to each of `contactPoints` on the mesh(es). The tool's three interactive picks become arguments; where the tool asks for a matching point ON the trunk per contact, this method projects each contact onto the trunk line instead (closest point), which is the natural headless equivalent. meshIds the piece mesh(es), merged like the tool's selector; null/empty = current selection. trunkStart bottom end of the trunk. trunkEnd top end of the trunk. contactPoints points on the mesh the branches reach (at least one). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): topDiameter 1.3, bottomDiameter 2.3, branchTrunkDiameter 1.2, branchContactDiameter 0.8 (mm). Returns the ids of the meshes added (trunk + one per branch), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshIds` | `IEnumerable ` | required |\n| `trunkStart` | `Point3d` | required |\n| `trunkEnd` | `Point3d` | required |\n| `contactPoints` | `IEnumerable ` | required |\n| `topDiameter` | `double` | `0` |\n| `bottomDiameter` | `double` | `0` |\n| `branchTrunkDiameter` | `double` | `0` |\n| `branchContactDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueMultipleCopies","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruemultiplecopies","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruemultiplecopies","collection":"scripting","hash":"2723c6912977668a878fc98ab5a87ca4","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueSingle\n\n```csharp\nGuid ManufacturingApi.SprueSingle(\n    Guid meshId,\n    Point3d point,\n    double height = 0,\n    double topX = 0,\n    double topY = 0,\n    double bottomX = 0,\n    double bottomY = 0,\n    double insideRing = 0)\n```\n\nSingle sprue post (the ArtisanSprueSingle tool, headless): one tapered connector at `point`, which should lie ON the mesh (it plays the role of the tool's pick-point-on-mesh prompt). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 2, top 1.5 x 1.5, bottom 1.5 x 1.5, insideRing 0.2 (mm). Returns the Guid of the sprue mesh (added as-is, same as the tool's Accept).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshId` | `Guid` | required |\n| `point` | `Point3d` | required |\n| `height` | `double` | `0` |\n| `topX` | `double` | `0` |\n| `topY` | `double` | `0` |\n| `bottomX` | `double` | `0` |\n| `bottomY` | `double` | `0` |\n| `insideRing` | `double` | `0` |\n\nReturns `Guid`.","metadata":{"title":"ManufacturingApi","section":"SprueSingle","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruesingle","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruesingle","collection":"scripting","hash":"baa45244865f063521af61b2d07c9654","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueSpiral\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueSpiral(\n    Guid linkMeshId,\n    Point3d basePoint = null,\n    int copies = 0,\n    double maxDiameter = 0,\n    double wireDiameter = 0,\n    double connectorLength = 0,\n    double clearanceMargin = 0,\n    bool showBase = false)\n```\n\nFlat spiral casting sprue (the ArtisanSprueSpiral tool, headless): the same chain-printing idea as the helix but with the wire coiled FLAT, standing on legs, each link hung from a single vertical connector. Like the tool's Generate button, the spiral is auto-sized (turns, turn spacing, inner eye) so the requested copies fit within `maxDiameter`; the link hangs from its Y axis, same as the tool's initial pick. linkMeshId the chain link (mesh or SubD) basePoint centre of the spiral on the plate; (0,0,0) = origin, the tool's starting position showBase true = add the honeycomb base plate under the legs (off by default, like the tool) Numeric arguments with 0 keep the tool defaults: copies 60, maxDiameter 100, wireDiameter 3, connectorLength 3.25, clearanceMargin 0 (mm). Long operation (the auto-sizing searches for a collision-free layout). Returns the ids of ALL the meshes added (spiral + one mesh per copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `linkMeshId` | `Guid` | required |\n| `basePoint` | `Point3d` | `null` |\n| `copies` | `int` | `0` |\n| `maxDiameter` | `double` | `0` |\n| `wireDiameter` | `double` | `0` |\n| `connectorLength` | `double` | `0` |\n| `clearanceMargin` | `double` | `0` |\n| `showBase` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueSpiral","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruespiral","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruespiral","collection":"scripting","hash":"5a92e89947bceb9f6137e9114b011724","indexed_by":"docs-index"}},{"content":"ManufacturingApi — SprueTree\n\n```csharp\nIReadOnlyList<Guid> ManufacturingApi.SprueTree(\n    IEnumerable<Guid> meshIds = null,\n    Point3d? basePoint = null,\n    int copiesPerMesh = 0,\n    double height = 0,\n    double bottomDiameter = 0,\n    double topDiameter = 0,\n    int floors = 0,\n    int piecesPerFloor = 0,\n    double branchDiameter = 0)\n```\n\nRadial casting tree (the ArtisanSprueTree tool, headless): a base + conical trunk rising from `basePoint`, with `floors` floors x `piecesPerFloor` branches around it, and a copy of the given meshes distributed over the branches in round-robin. Each copy hangs from its branch by the bottom-center of its bounding box (the tool's default anchor) with the default branch (length 8.5, angle 15 deg). meshIds the model meshes; null/empty = current selection. basePoint where the base sits (default: world origin, like the tool). copiesPerMesh copies of EACH mesh; 0 = fill the free branches (the tool's automatic mode). Numeric arguments with 0 keep the tool defaults: height 150, bottomDiameter 10, topDiameter 10, floors 7, piecesPerFloor 8, branchDiameter 1.5 (mm). Long operation. Returns the ids of ALL the meshes added (base, trunk, connectors and every model copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `meshIds` | `IEnumerable ` | `null` |\n| `basePoint` | `Point3d?` | `null` |\n| `copiesPerMesh` | `int` | `0` |\n| `height` | `double` | `0` |\n| `bottomDiameter` | `double` | `0` |\n| `topDiameter` | `double` | `0` |\n| `floors` | `int` | `0` |\n| `piecesPerFloor` | `int` | `0` |\n| `branchDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ManufacturingApi","section":"SprueTree","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruetree","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/manufacturing/#spruetree","collection":"scripting","hash":"b8569b3089e88c1c0a67978b85f14ae1","indexed_by":"docs-index"}},{"content":"MartiniApi\n\nMartini settings.\n\n```python\nfrom ArtisanPlugin.Scripting import MartiniApi\n```\n\nSee also the guide, Gemsets › Martini, and the Python package, `ra.martini`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IMartini` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IMartini` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a martini setting -- four tapering prongs meeting in a point below an existing gem, with an optional upper rail and two lateral side gems -- the ArtisanMartini tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IMartini` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Martinis currently selected in the active doc. |","metadata":{"title":"MartiniApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/","collection":"scripting","hash":"dcb33637cc68620a58dd40460357ae64","indexed_by":"docs-index"}},{"content":"MartiniApi — All\n\n```csharp\nIReadOnlyList<IMartini> MartiniApi.All()\n```\n\n`IMartini` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IMartini> MartiniApi.ByLayer(string layerName)\n```\n\n`IMartini` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"MartiniApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#all","collection":"scripting","hash":"7170682e83495b5e550fc0afb76cf094","indexed_by":"docs-index"}},{"content":"MartiniApi — Count\n\n```csharp\nint MartiniApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"MartiniApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#count","collection":"scripting","hash":"214ed501ef42062899bdb60aee6b3157","indexed_by":"docs-index"}},{"content":"MartiniApi — Create\n\n```csharp\nIMartini MartiniApi.Create(\n    Guid gemId,\n    double prongHeight = 0,\n    double prongDiameterTop = 0,\n    double prongDiameterBottom = 0,\n    bool? upperRail = null,\n    bool? sideGems = null,\n    double sideGemSize = 0,\n    string prongMode = null,\n    bool? faceTangent = null,\n    string prongProfileName = null,\n    double railWidth = 0,\n    double railHeight = 0,\n    double railHeightUnderGirdle = 0,\n    string railProfileName = null,\n    string sideGemShape = null,\n    double sideBezelWidth = 0,\n    double sideDistance = 0)\n```\n\nBuilds a martini setting -- four tapering prongs meeting in a point below an existing gem, with an optional upper rail and two lateral side gems -- the ArtisanMartini tool, headless. `gemId` must be a gem in the active document with a martini-friendly shape (any shape except TRIANGLE and COFFIN). Millimetres; 0 (or null) keeps the tool default (or the user's saved defaults): prongHeight 5.40, prongDiameterTop 1.30, prongDiameterBottom 1.30, sideGemSize 1.40; upperRail and sideGems are both enabled by default. As in the panel, the prong \"face tangent\" behaviour is seeded from the gem's symmetry unless `faceTangent` says otherwise. `prongMode` picks the prong construction: ROUND (default), CUSTOM (the `prongProfileName` section; a profile alone implies it) or CLAW; DEFAULT and CIRCLE also mean ROUND. Claw tips are built in Render mode only, and are shaped through the returned handle (martini.SetClawCapHeight(...) and friends), because their defaults are signed and this signature reads 0 as \"keep the default\". Returns an IMartini handle to the new martini group.","metadata":{"title":"MartiniApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#create","collection":"scripting","hash":"dbc594a8b5be0e3b8f05ee09c43ca702","indexed_by":"docs-index"}},{"content":"MartiniApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `prongHeight` | `double` | `0` |\n| `prongDiameterTop` | `double` | `0` |\n| `prongDiameterBottom` | `double` | `0` |\n| `upperRail` | `bool?` | `null` |\n| `sideGems` | `bool?` | `null` |\n| `sideGemSize` | `double` | `0` |\n| `prongMode` | `string` | `null` |\n| `faceTangent` | `bool?` | `null` |\n| `prongProfileName` | `string` | `null` |\n| `railWidth` | `double` | `0` |\n| `railHeight` | `double` | `0` |\n| `railHeightUnderGirdle` | `double` | `0` |\n| `railProfileName` | `string` | `null` |\n| `sideGemShape` | `string` | `null` |\n| `sideBezelWidth` | `double` | `0` |\n| `sideDistance` | `double` | `0` |\n\nReturns `IMartini`.","metadata":{"title":"MartiniApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#create","collection":"scripting","hash":"b50f5b4ce7785e1a8138114a8286f5db","indexed_by":"docs-index"}},{"content":"MartiniApi — Find\n\n```csharp\nIMartini MartiniApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IMartini`.\n\nForGem\n```csharp\nIReadOnlyList<IMartini> MartiniApi.ForGem(Guid gemId)\n```\n\n`IMartini` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"MartiniApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#find","collection":"scripting","hash":"c078147c3272b53544c4eaf840942732","indexed_by":"docs-index"}},{"content":"MartiniApi — Selected\n\n```csharp\nIReadOnlyList<IMartini> MartiniApi.Selected()\n```\n\nMartinis currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"MartiniApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#selected","collection":"scripting","hash":"66b7279a67fd27cc0596407d8bc45276","indexed_by":"docs-index"}},{"content":"MartiniApi — IMartini\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ClawCapDistance` | `double` | get | mm the claw apex is pulled in toward the gem centre |\n| `ClawCapHeight` | `double` | get | mm the apex moves up (+) or down (-) |\n| `ClawTipSmoothness` | `double` | get | body-to-tip blend, 0-1 |\n| `ClawTipWidth` | `double` | get | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `FaceTangent` | `bool` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngDiameterBottom` | `double` | get | |\n| `ProngDiameterTop` | `double` | get | |\n| `ProngHeight` | `double` | get | Prongs (4, tapering to a point below the gem). Millimetres. |\n| `ProngMode` | `string` | get | Prong construction: \"ROUND\", \"CUSTOM\" or \"CLAW\". The claw values only shape the prong tips in CLAW mode, and claw tips are built in Render mode only. |\n| `SideGemSize` | `double` | get | |\n| `SideGemsEnabled` | `bool` | get | |\n| `UpperRailEnabled` | `bool` | get | Upper rail and lateral side gems |","metadata":{"title":"MartiniApi","section":"IMartini","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#imartini","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#imartini","collection":"scripting","hash":"318faeb1b6a84ec553287fad7cc7b488","indexed_by":"docs-index"}},{"content":"MartiniApi — IMartini\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetClawCapDistance(double distance)` | signed |\n| `void SetClawCapHeight(double height)` | signed |\n| `void SetClawTipSmoothness(double smoothness)` | 0-1 |\n| `void SetClawTipWidth(double width)` | 0-1 |\n| `void SetFaceTangent(bool faceTangent)` | |\n| `void SetProngDiameterBottom(double diameter)` | |\n| `void SetProngDiameterTop(double diameter)` | |\n| `void SetProngHeight(double prongHeight)` | Parametric edits -- each regenerates the martini (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. Millimetres, and unlike the Create arguments these take literal values (0 and negatives included). |\n| `void SetProngMode(string mode)` | ROUND \\| CUSTOM \\| CLAW (DEFAULT and CIRCLE also mean ROUND) |\n| `void SetSideGemSize(double sideGemSize)` | |\n| `void SetSideGemsEnabled(bool enabled)` | |\n| `void SetUpperRailEnabled(bool enabled)` | |","metadata":{"title":"MartiniApi","section":"IMartini","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#imartini","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/martini/#imartini","collection":"scripting","hash":"24f0e315ff74936313fdcec28fe91f84","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi\n\nHeadless builder for the matching shank. MatchingShankApi stays query-only (All/Find/ForRing/Selected); the IMatchingShank handle returned here is the same one it hands out, so `MatchingShankApi.ForRing(ringId)` lists what Create fitted to it.\n\n```python\nfrom ArtisanPlugin.Scripting import MatchingShankBuilderApi\n```\n\nSee also the Python package, `ra.matching_shank`.","metadata":{"title":"MatchingShankBuilderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/","collection":"scripting","hash":"9232ddaa31e97bcc40ed75e2d156e5a2","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Builds a matching shank (the ArtisanMatchingShank tool, headless): a band shaped to sit against an existing ring -- the mother -- so the pair stacks without a gap. |","metadata":{"title":"MatchingShankBuilderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#methods","collection":"scripting","hash":"f9f9dca3824fdca85021f8d720c71887","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi — Create\n\n```csharp\nIMatchingShank MatchingShankBuilderApi.Create(\n    IEnumerable<Guid> ringIds,\n    double width = 0,\n    double height = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    string metal = null,\n    double clearance = double.NaN,\n    double distance = double.NaN,\n    double topDistance = double.NaN,\n    string interiorType = null,\n    double comfort = 0,\n    int numberOfPoints = 0,\n    bool flipSide = false,\n    bool bothSides = false,\n    bool withGems = false,\n    double gemSize = 0,\n    string gemDistribution = null,\n    string element = null)\n```","metadata":{"title":"MatchingShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","collection":"scripting","hash":"d8d31e23abcac677b049e22f33e6ebfd","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi — Create\n\nBuilds a matching shank (the ArtisanMatchingShank tool, headless): a band shaped to sit against an existing ring -- the mother -- so the pair stacks without a gap. The mother ring must sit at the origin like every Artisan ring (the rail is the finger-size circle there). `ringIds`: the ring to hug -- document ids of its solids (breps, extrusions, meshes) or the Id of an Artisan shank handle (classic, eternity, wedding band...; its stones are ignored). Millimetres; 0 keeps the tool default (or the user's saved defaults): width 3, height 2, numberOfPoints 8, comfort 0.3. NaN keeps the default for the signed / zero-legit ones: clearance 0.3 (gap kept against the mother), distance 0 (axial gap; negative presses into the mother), topDistance 0. `interiorType` \"SOLID\" | \"COMFORT\". `flipSide` builds on the other side of the mother, `bothSides` one band on each side (both baked in the same group). `withGems` adds a row of round stones along the crest: `gemSize` (default 1.5), `gemDistribution` \"FULL\" | \"SIDE\" | \"TOP\". `fingerDiameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name; `metal` a Metal name (omitted = the document's Metal 01). `element` = name of a saved MatchingShank element (ElementsApi.List(\"MatchingShank\")) to start from; explicit arguments override it (its finger size and ring are always replaced). Returns the IMatchingShank handle of the new group; the mother ring is its parametric mother, so the band follows the ring's edits.","metadata":{"title":"MatchingShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","collection":"scripting","hash":"799eed000ecb4de4c478f030ad027a60","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ringIds` | `IEnumerable ` | required |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `metal` | `string` | `null` |\n| `clearance` | `double` | `double.NaN` |\n| `distance` | `double` | `double.NaN` |\n| `topDistance` | `double` | `double.NaN` |\n| `interiorType` | `string` | `null` |\n| `comfort` | `double` | `0` |\n| `numberOfPoints` | `int` | `0` |\n| `flipSide` | `bool` | `false` |\n| `bothSides` | `bool` | `false` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `gemDistribution` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IMatchingShank`.","metadata":{"title":"MatchingShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#create","collection":"scripting","hash":"933cc39703be2ed2f261ec53b674724e","indexed_by":"docs-index"}},{"content":"MatchingShankBuilderApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IMatchingShank`, `IMatchingShankGems`.","metadata":{"title":"MatchingShankBuilderApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank-builder/#handles-and-sections","collection":"scripting","hash":"c6371218d3b19a9a900e93b6fa5b30c5","indexed_by":"docs-index"}},{"content":"MatchingShankApi\n\nMatching shanks — bands fitted against an existing ring so the pair stacks without a gap. Query-only for now: run ArtisanMatchingShank in the UI to fit the first one, then script every variant from its handle.\n\n```python\nfrom ArtisanPlugin.Scripting import MatchingShankApi\n```\n\nSee also the guide, Shanks › Matching shank, and the Python package, `ra.matching_shank`.","metadata":{"title":"MatchingShankApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/","collection":"scripting","hash":"76f706225612dc7857ed8849aa0b41f6","indexed_by":"docs-index"}},{"content":"MatchingShankApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IMatchingShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IMatchingShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForRing` | The matching shanks fitted against a given ring. |\n| `Selected` | `IMatchingShank` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"MatchingShankApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#methods","collection":"scripting","hash":"d1724789b9bb037221e130d93412c2af","indexed_by":"docs-index"}},{"content":"MatchingShankApi — All\n\n```csharp\nIReadOnlyList<IMatchingShank> MatchingShankApi.All()\n```\n\n`IMatchingShank` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IMatchingShank> MatchingShankApi.ByLayer(string layerName)\n```\n\n`IMatchingShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"MatchingShankApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#all","collection":"scripting","hash":"67fe9f540e6ffad6db66eb6be1912b0a","indexed_by":"docs-index"}},{"content":"MatchingShankApi — Count\n\n```csharp\nint MatchingShankApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nIMatchingShank MatchingShankApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IMatchingShank`.","metadata":{"title":"MatchingShankApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#count","collection":"scripting","hash":"af852aa7f96da56e84382204a182f1c9","indexed_by":"docs-index"}},{"content":"MatchingShankApi — ForRing\n\n```csharp\nIReadOnlyList<IMatchingShank> MatchingShankApi.ForRing(Guid ringId)\n```\n\nThe matching shanks fitted against a given ring.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ringId` | `Guid` | required |\n\nReturns `IReadOnlyList `.\n\nSelected\n```csharp\nIReadOnlyList<IMatchingShank> MatchingShankApi.Selected()\n```\n\n`IMatchingShank` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"MatchingShankApi","section":"ForRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#forring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#forring","collection":"scripting","hash":"677833ff5ba4d6e061d1f91c030e03bf","indexed_by":"docs-index"}},{"content":"MatchingShankApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"MatchingShankApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#handles-and-sections","collection":"scripting","hash":"c970ec1b15f9f0e1cac8b0787699881a","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShank\n\n*Handle* — extends `IParametricObject`.\n\nA matching shank: a band shaped to sit against an existing ring (the \"mother\"), so the pair stacks without a gap. Holds several gems, so no single MotherGem — the mothers it was fitted to are in MotherRingIds.","metadata":{"title":"MatchingShankApi","section":"IMatchingShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","collection":"scripting","hash":"6879374a0d9e4e43290f5dd9cb84d1c2","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShank\n\n| Property | Type | | |\n|---|---|---|---|\n| `BothSides` | `bool` | get | build one band on each side |\n| `BottomHeight` | `double` | get | mm — 0 = same as the top |\n| `BottomWidth` | `double` | get | band section at the bottom, mm — 0 = same as the top |\n| `Clearance` | `double` | get | gap kept against the mother, mm |\n| `Comfort` | `double` | get | mm — used when InteriorType is \"COMFORT\" |\n| `CurveFromRingSize` | `bool` | get | rail generated from the ring size instead of a picked curve |\n| `Distance` | `double` | get | axial gap; negative presses the band into the mother, mm |\n| `FlipSide` | `bool` | get | build on the other side of the mother |\n| `Gems` | `IMatchingShankGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `InteriorType` | `string` | get | \"SOLID\" or \"COMFORT\" |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `Metal` | `string` | get | e.g. \"GOLD_YELLOW_18\" |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `MotherRingIds` | `IReadOnlyList ` | get | The ring(s) this shank was fitted against, and the rail it follows. |\n| `NumberOfPoints` | `int` | get | sections used to follow the mother — always even |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProfileHeight` | `double` | get | mm |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `ProfileWidth` | `double` | get | band section at the top, mm |\n| `RingCurveId` | `Guid` | get | Guid.Empty when built from the ring size |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `SectionContactOffsets` | `IReadOnlyList ` | get | |","metadata":{"title":"MatchingShankApi","section":"IMatchingShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","collection":"scripting","hash":"6c1be234e41afc81d5cf64702aede86b","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShank\n\n| Property | Type | | |\n|---|---|---|---|\n| `SectionDeltas` | `IReadOnlyList ` | get | Per-section fit. Deltas are yours to set; contact offsets are what the last computation measured (read-only output). |\n| `TopDistance` | `double` | get | extra axial gap at the ring top, fading to 0 at 90 degrees, mm |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBothSides(bool bothSides)` | |\n| `void SetBottomHeight(double height)` | 0 = same as the top |\n| `void SetBottomWidth(double width)` | 0 = same as the top |\n| `void SetClearance(double clearance)` | |\n| `void SetComfort(double comfort)` | |\n| `void SetDistance(double distance)` | |\n| `void SetElement(string element)` | Applies a saved MatchingShank element (ElementsApi.List(\"MatchingShank\")) to this shank: its band and gems replace the current ones, the ring size, mother ring(s) and rail stay, and the shank regenerates in place. |\n| `void SetFlipSide(bool flip)` | |\n| `void SetInteriorType(string interiorType)` | \"SOLID\" or \"COMFORT\" |\n| `void SetNumberOfPoints(int points)` | |\n| `void SetProfile(string assetName)` | Setters — each regenerates the shank in place (same Guid), re-baking its gems and prongs, and calls LicenseGate.RequireValid() first. RING_PROFILE asset by name — list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetProfileHeight(double height)` | |\n| `void SetProfileWidth(double width)` | |\n| `void SetSectionDeltas(IEnumerable deltas)` | one per section, mm |\n| `void SetTopDistance(double distance)` | |","metadata":{"title":"MatchingShankApi","section":"IMatchingShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshank","collection":"scripting","hash":"776982e16046a8486ab542b2cb6f8686","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShankGems\n\n*Section*.\n\nThe gems row a matching shank can carry. A live view over the shank's stored parameters: getters read the current values, setters regenerate the shank in place (same Guid) and are license-gated.","metadata":{"title":"MatchingShankApi","section":"IMatchingShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","collection":"scripting","hash":"21a056d7fe631ba9e3ef82825cf4049e","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShankGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `Angle` | `double` | get | degrees |\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BottomInnerHeight` | `double` | get | mm — 0 = same as the top |\n| `BottomInnerWidth` | `double` | get | mm — 0 = same as the top |\n| `BrightCut` | `double` | get | mm |\n| `Distribution` | `string` | get | \"FULL\", \"SIDE\" or \"TOP\" |\n| `DoubleProngSetting` | `bool` | get | |\n| `DrillAllowIntersection` | `bool` | get | |\n| `DrillEnabled` | `bool` | get | |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillVisible` | `bool` | get | |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `EndAngle` | `double` | get | degrees — used when Distribution is \"SIDE\" |\n| `EndProngCount` | `int` | get | |\n| `ExtensionForManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | mm |\n| `GemShape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `GemSize` | `double` | get | mm |\n| `GemSizeEnd` | `double` | get | mm |\n| `GemSizeMiddle` | `double` | get | mm |\n| `GemSizeStart` | `double` | get | mm |\n| `Gradient` | `bool` | get | Stone-size gradient along the row. |\n| `GradientMiddlePosition` | `double` | get | 0..1 |\n| `GradientPoints` | `int` | get | |\n| `InnerHeight` | `double` | get | inner channel height at the top, mm |\n| `InnerMargin` | `double` | get | mm |\n| `InnerWidth` | `double` | get | inner channel width at the top, mm |\n| `Margin` | `double` | get | mm |\n| `MinDistance` | `double` | get | mm |\n| `ProngBottomDiameter` | `double` | get | mm — 0 = same as the top |\n| `ProngDiameter` | `double` | get | mm |\n| `ProngDistance` | `double` | get | mm |\n| `ProngGrow` | `double` | get | mm |\n| `ProngHeight` | `double` | get | mm |","metadata":{"title":"MatchingShankApi","section":"IMatchingShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","collection":"scripting","hash":"c4c15c6aebc7a6b10074bf885d1abb48","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShankGems\n\n| Property | Type | | |\n|---|---|---|---|\n| `ProngMinDiameter` | `double` | get | mm |\n| `ProngSpacing` | `double` | get | mm |\n| `ProngTopDiameter` | `double` | get | mm — 0 = automatic |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `RowOffset` | `double` | get | mm |\n| `ScallopGemHeight` | `double` | get | |\n| `ScallopGemWidth` | `double` | get | Scalloped-setting proportions (percentages, not mm). |\n| `ScallopProngHeight` | `double` | get | |\n| `ScallopProngWidth` | `double` | get | |\n| `ScallopRailHeight` | `double` | get | |\n| `ScallopRailWidth` | `double` | get | |\n| `ScallopRemoveChannel` | `bool` | get | |\n| `StartAngle` | `double` | get | degrees from the top — used when Distribution is \"SIDE\" |\n| `TopAngle` | `double` | get | total arc in degrees — used when Distribution is \"TOP\" |\n| `Vertical` | `double` | get | mm |","metadata":{"title":"MatchingShankApi","section":"IMatchingShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","collection":"scripting","hash":"979861b8e5d003496c2fcd0ab03ec800","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShankGems\n\n| Method | |\n|---|---|\n| `void SetAngle(double degrees)` | |\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBottomInnerHeight(double height)` | 0 = same as the top |\n| `void SetBottomInnerWidth(double width)` | 0 = same as the top |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetDistribution(string distribution)` | \"FULL\", \"SIDE\" or \"TOP\" |\n| `void SetDoubleProngSetting(bool enabled)` | |\n| `void SetDrillAllowIntersection(bool allow)` | |\n| `void SetDrillEnabled(bool enabled)` | |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillVisible(bool visible)` | |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetEndProngCount(int count)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemShape(string shape)` | |\n| `void SetGemSize(double size)` | |\n| `void SetGemSizeGradient(double start, double middle, double end)` | |\n| `void SetGradient(bool enabled)` | |\n| `void SetGradientMiddlePosition(double position)` | 0..1 |\n| `void SetGradientPoints(int points)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerMargin(double margin)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMargin(double margin)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetProngBottomDiameter(double diameter)` | 0 = same as the top |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngDistance(double distance)` | |\n| `void SetProngGrow(double grow)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMinDiameter(double diameter)` | |\n| `void SetProngSpacing(double spacing)` | |","metadata":{"title":"MatchingShankApi","section":"IMatchingShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","collection":"scripting","hash":"3c30fd71fe2583b89348fea4b0eb7f3d","indexed_by":"docs-index"}},{"content":"MatchingShankApi — IMatchingShankGems\n\n| Method | |\n|---|---|\n| `void SetProngTopDiameter(double diameter)` | 0 = automatic |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetRowOffset(double offset)` | |\n| `void SetScallopGem(double width, double height)` | |\n| `void SetScallopProng(double width, double height)` | |\n| `void SetScallopRail(double width, double height)` | |\n| `void SetScallopRemoveChannel(bool enabled)` | |\n| `void SetSideAngles(double startAngle, double endAngle)` | |\n| `void SetTopAngle(double degrees)` | |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"MatchingShankApi","section":"IMatchingShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/matching-shank/#imatchingshankgems","collection":"scripting","hash":"4415b5e432a3e3e6c7d0dea14bf829e1","indexed_by":"docs-index"}},{"content":"MeshApi\n\nMesh utilities from the Commands/Meshes family.\n\n```python\nfrom ArtisanPlugin.Scripting import MeshApi\n```\n\nSee also the guide, Manufacturing › Decimator, and the Python package, `ra.mesh`.\n\nMethods\n| Method | |\n|---|---|\n| `Decimate` | Decimates meshes with Rhino's quadric edge-collapse reduction (the ArtisanMeshDecimate command, headless). |\n| `DecimateToTolerance` | Decimates meshes as much as a deviation budget allows (the ArtisanMeshDecimateTolerance command, headless). |","metadata":{"title":"MeshApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/","collection":"scripting","hash":"2b3c1cf1971d7c651688864b03e1d5a3","indexed_by":"docs-index"}},{"content":"MeshApi — Decimate\n\n```csharp\nDecimateResult MeshApi.Decimate(IEnumerable<Guid> objectIds = null, double percentage = 50)\n```\n\nDecimates meshes with Rhino's quadric edge-collapse reduction (the ArtisanMeshDecimate command, headless). Distortion is allowed: the reducer prioritizes hitting the target face count over shape fidelity, so heavy percentages give a faceted low-poly look. objectIds meshes to decimate; null/empty = current selection. percentage faces to REMOVE, 1-99 (default 50). Each mesh is replaced in place (same Guid). Returns totals so the script can report \"N meshes: X faces -> Y faces\".\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `percentage` | `double` | `50` |\n\nReturns `DecimateResult`.","metadata":{"title":"MeshApi","section":"Decimate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/#decimate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/#decimate","collection":"scripting","hash":"4b0b69611cbe5f581fc568cfabb2afde","indexed_by":"docs-index"}},{"content":"MeshApi — DecimateToTolerance\n\n```csharp\nDecimateToleranceResult MeshApi.DecimateToTolerance(\n    IEnumerable<Guid> objectIds = null,\n    double toleranceMm = 0)\n```\n\nDecimates meshes as much as a deviation budget allows (the ArtisanMeshDecimateTolerance command, headless). Each mesh is reduced to the heaviest percentage whose result still stays within toleranceMm of the original surface, so the shape is guaranteed and the face count is whatever falls out. objectIds meshes to decimate; null/empty = current selection. toleranceMm max deviation in MILLIMETRES, 0 = default (0.05). Each mesh is replaced in place (same Guid). Meshes that cannot lose a single percent within tolerance are left untouched and counted in MeshesUnchanged.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `toleranceMm` | `double` | `0` |\n\nReturns `DecimateToleranceResult`.","metadata":{"title":"MeshApi","section":"DecimateToTolerance","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/#decimatetotolerance","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/mesh/#decimatetotolerance","collection":"scripting","hash":"bcd1726143cf321e4a8ee62f1a85aacf","indexed_by":"docs-index"}},{"content":"MicroSettingApi\n\nMicro settings (micro-pave heads).\n\n```python\nfrom ArtisanPlugin.Scripting import MicroSettingApi\n```\n\nSee also the guide, Gemsets › Micro setting, and the Python package, `ra.micro_setting`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | A micro setting is baked as a GROUP carrying RaObjectUserData (both here and in the panel); nothing in the product ever creates a MicroSettingCustomObject, so resolving that type found nothing and every query below returned empty. |\n| `ByLayer` | `IMicroSetting` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds the micro-setting (pavé infrastructure: cutters, V-cutters, optional channel and row prongs) for a run of small gems -- the ArtisanMicroSetting tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | MicroSettings currently selected in the active doc. |","metadata":{"title":"MicroSettingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/","collection":"scripting","hash":"dfb992f3253b243cfe506d6b4058ee95","indexed_by":"docs-index"}},{"content":"MicroSettingApi — All\n\n```csharp\nIReadOnlyList<IMicroSetting> MicroSettingApi.All()\n```\n\nA micro setting is baked as a GROUP carrying RaObjectUserData (both here and in the panel); nothing in the product ever creates a MicroSettingCustomObject, so resolving that type found nothing and every query below returned empty.\n\nReturns `IReadOnlyList `.","metadata":{"title":"MicroSettingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#all","collection":"scripting","hash":"d98249de8f647f643d5618bb6686747b","indexed_by":"docs-index"}},{"content":"MicroSettingApi — ByLayer\n\n```csharp\nIReadOnlyList<IMicroSetting> MicroSettingApi.ByLayer(string layerName)\n```\n\n`IMicroSetting` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.\n\nCount\n```csharp\nint MicroSettingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"MicroSettingApi","section":"ByLayer","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#bylayer","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#bylayer","collection":"scripting","hash":"1956df3d682f49ee235e3162c6e441bc","indexed_by":"docs-index"}},{"content":"MicroSettingApi — Create\n\n```csharp\nIReadOnlyList<Guid> MicroSettingApi.Create(\n    IEnumerable<Guid> gemIds = null,\n    bool? cutters = null,\n    bool? vCutters = null,\n    bool? channel = null,\n    bool? rowProngs = null)\n```\n\nBuilds the micro-setting (pavé infrastructure: cutters, V-cutters, optional channel and row prongs) for a run of small gems -- the ArtisanMicroSetting tool, headless. `gemIds` null/empty = the currently selected gems; at least one gem is required. The enable flags default to the tool's behavior (cutters and V-cutters on, channel and row prongs off); pass true/false to override, or null to keep the default (or the user's saved defaults). Numeric parameters keep the tool defaults. Returns the ids of every object baked (cutters, V-cutters, channel and prongs), all grouped under one MicroSetting group.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `cutters` | `bool?` | `null` |\n| `vCutters` | `bool?` | `null` |\n| `channel` | `bool?` | `null` |\n| `rowProngs` | `bool?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"MicroSettingApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#create","collection":"scripting","hash":"833d0a57fc9063874d1dfe46e5f5d1ac","indexed_by":"docs-index"}},{"content":"MicroSettingApi — Find\n\n```csharp\nIMicroSetting MicroSettingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IMicroSetting`.\n\nSelected\n```csharp\nIReadOnlyList<IMicroSetting> MicroSettingApi.Selected()\n```\n\nMicroSettings currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"MicroSettingApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#find","collection":"scripting","hash":"ae6502cb945261a7632835c5ed97829a","indexed_by":"docs-index"}},{"content":"MicroSettingApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIMicroSetting\n*Handle* — extends `IParametricObject`.\n\nA micro setting: the cutters, V-cutters, channel and row prongs cut and built around a run of stones. Each block is a section mirroring the panel's own. READ-ONLY: the parametric engine has no RegenerateMicroSetting -- the only edit path is reopening the panel (2ShapesEdit.EditMicroSetting) -- so there are no in-place setters. Recreate with MicroSettingApi.Create (and Delete) to change one.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Channel` | `IMicroSettingChannel` | get | |\n| `ChannelEnabled` | `bool` | get | |\n| `Cutters` | `IMicroSettingCutters` | get | |\n| `CuttersEnabled` | `bool` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RowProngs` | `IMicroSettingRowProngs` | get | |\n| `RowProngsEnabled` | `bool` | get | |\n| `VCutters` | `IMicroSettingCutters` | get | |\n| `VCuttersEnabled` | `bool` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"MicroSettingApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#handles-and-sections","collection":"scripting","hash":"536a3d752d8620409ae453a9bf71bf75","indexed_by":"docs-index"}},{"content":"MicroSettingApi — IMicroSettingCutters\n\n*Section*.\n\nThe cutters carved under each stone. The same shape describes the plain CUTTERS and the V-CUTTERS; the members marked \"cutters only\" read as empty/0 on the V-cutters, which have no such parameter.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Enabled` | `bool` | get | |\n| `EndHeight` | `double` | get | mm |\n| `EndWidth` | `double` | get | mm |\n| `Keep` | `bool` | get | the cutter solids are kept instead of booleaned |\n| `Length` | `double` | get | mm |\n| `OverGirdle` | `double` | get | mm, signed |\n| `OverGirdleMiddle` | `double` | get | mm, signed |\n| `Shape` | `string` | get | cutters only: U_SHAPE, V_SHAPE, SQUARE, TRAPEZOIDAL, FRENCH_SETTING |\n| `ShapeFactor` | `double` | get | cutters only |\n| `StartHeight` | `double` | get | mm |\n| `StartWidth` | `double` | get | mm |\n| `WidthByPercentage` | `bool` | get | cutters only: width sized as a % of each stone |\n| `WidthPercentage` | `double` | get | cutters only |","metadata":{"title":"MicroSettingApi","section":"IMicroSettingCutters","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingcutters","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingcutters","collection":"scripting","hash":"86354f791fb01b7d6e210ec6c5a95ed4","indexed_by":"docs-index"}},{"content":"MicroSettingApi — IMicroSettingRowProngs\n\n*Section*.\n\nThe prongs shared between consecutive stones.\n\n| Property | Type | | |\n|---|---|---|---|\n| `AllowCollisions` | `bool` | get | |\n| `Close` | `bool` | get | |\n| `Diameter` | `double` | get | mm |\n| `DiameterByPercentage` | `bool` | get | diameter sized as a % of the gap between stones |\n| `Enabled` | `bool` | get | |\n| `HeightOverGirdle` | `double` | get | mm, signed |\n| `HeightUnderGirdle` | `double` | get | mm, signed |\n| `InsidePercentage` | `double` | get | |\n| `SmartAdapt` | `bool` | get | |","metadata":{"title":"MicroSettingApi","section":"IMicroSettingRowProngs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingrowprongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingrowprongs","collection":"scripting","hash":"c4da527f73584db96dc314e929e55248","indexed_by":"docs-index"}},{"content":"MicroSettingApi — IMicroSettingChannel\n\n*Section*.\n\nThe channel rail running under the stones.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Close` | `bool` | get | |\n| `Enabled` | `bool` | get | |\n| `EndBend` | `double` | get | signed |\n| `EndExtension` | `double` | get | signed |\n| `EndHeight` | `double` | get | |\n| `EndOverGirdle` | `double` | get | signed |\n| `EndWidth` | `double` | get | |\n| `FlatEnds` | `bool` | get | |\n| `Keep` | `bool` | get | |\n| `Precise` | `bool` | get | |\n| `Shape` | `string` | get | UShape, VShape, Square, Trapezoidal, FrenchSetting |\n| `ShapeFactor` | `double` | get | |\n| `StartBend` | `double` | get | signed |\n| `StartExtension` | `double` | get | signed |\n| `StartHeight` | `double` | get | |\n| `StartOverGirdle` | `double` | get | signed |\n| `StartWidth` | `double` | get | |","metadata":{"title":"MicroSettingApi","section":"IMicroSettingChannel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingchannel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/micro-setting/#imicrosettingchannel","collection":"scripting","hash":"fb452d461b06f17a4d630d358c5449a9","indexed_by":"docs-index"}},{"content":"MilgrainApi\n\nMilgrain beaded edge along a curve (the ArtisanMilgrain tool).\n\n```python\nfrom ArtisanPlugin.Scripting import MilgrainApi\n```\n\nSee also the guide, Accessories › Milgrain, and the Python package, `ra.milgrain`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: bead diameter 0.8, overlapping 0.1. |","metadata":{"title":"MilgrainApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/milgrain/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/milgrain/","collection":"scripting","hash":"5ce7c1e649d83f701f3ccbb0999c695d","indexed_by":"docs-index"}},{"content":"MilgrainApi — Create\n\n```csharp\nGuid MilgrainApi.Create(Guid curveId, double diameter = 0, double overlapping = 0)\n```\n\nDefaults: bead diameter 0.8, overlapping 0.1.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `diameter` | `double` | `0` |\n| `overlapping` | `double` | `0` |\n\nReturns `Guid`.","metadata":{"title":"MilgrainApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/milgrain/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/milgrain/#create","collection":"scripting","hash":"579ead1009dc563156f39f00b05a1b20","indexed_by":"docs-index"}},{"content":"NamedPendantApi\n\nName pendant (the ArtisanNamedPendant tool): a written name as a solid pendant, editable afterwards (smart component with parameter user data).\n\n```python\nfrom ArtisanPlugin.Scripting import NamedPendantApi\n```\n\nSee also the guide, Accessories › Named pendant, and the Python package, `ra.named_pendant`.","metadata":{"title":"NamedPendantApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/named-pendant/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/named-pendant/","collection":"scripting","hash":"9c4fda39c98457e007a2c947fb8cf383","indexed_by":"docs-index"}},{"content":"NamedPendantApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Defaults: font Arial bold, height 5, thickness 0.4, spacing 0.5. |\n\nCreate\n```csharp\nIReadOnlyList<Guid> NamedPendantApi.Create(\n    string text,\n    Plane? plane = null,\n    double height = 0,\n    double thickness = 0,\n    string font = null,\n    string element = null)\n```\n\nDefaults: font Arial bold, height 5, thickness 0.4, spacing 0.5. Returns the ids of the created breps (letters + plate/rail). `element` = name of a saved NamedPendant element (ElementsApi.List(\"NamedPendant\")) to start from; `text` and the explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `text` | `string` | required |\n| `plane` | `Plane?` | `null` |\n| `height` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `font` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"NamedPendantApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/named-pendant/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/named-pendant/#methods","collection":"scripting","hash":"f7c76cfc7e7251a606a15ace544c1c28","indexed_by":"docs-index"}},{"content":"NivodaApi\n\nScriptable Nivoda diamond search. Uses the SAME pipeline as the pricing Breakdown panel: credentials from the user's configured integration (Options > Integrations > Nivoda, or the 2Shapes account), the user's saved Nivoda filter (colors, clarity, cut, availability...), and the service's 30-minute in-memory cache. Requires Nivoda credentials to be configured -- throws a clear error otherwise. Network call; read-only for the Rhino document.\n\n```python\nfrom ArtisanPlugin.Scripting import NivodaApi\n```\n\nSee also the guide, API Reference › Integrations, and the Python package, `ra.nivoda`.","metadata":{"title":"NivodaApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/","collection":"scripting","hash":"575f931a1f0e06bcb533b0bbfc4a00b6","indexed_by":"docs-index"}},{"content":"NivodaApi — Methods\n\n| Method | |\n|---|---|\n| `ClearCache` | Drops the service's in-memory query cache so the next Search hits the live API (results are otherwise cached for ~30 minutes). |\n| `Search` | Searches certified diamonds matching `shape` (GemShape name, e.g. |\n\nClearCache\n```csharp\nvoid NivodaApi.ClearCache()\n```\n\nDrops the service's in-memory query cache so the next Search hits the live API (results are otherwise cached for ~30 minutes).","metadata":{"title":"NivodaApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/#methods","collection":"scripting","hash":"9f2b466863286611f07af2077522a20b","indexed_by":"docs-index"}},{"content":"NivodaApi — Search\n\n```csharp\nIReadOnlyList<NivodaDiamondItem> NivodaApi.Search(\n    string shape,\n    double carats,\n    bool labGrown = false)\n```\n\nSearches certified diamonds matching `shape` (GemShape name, e.g. \"ROUND\") and `carats` (the service queries the range [carats-0.01, carats+0.1]). Returns the best matches (the service caps how many items each query fetches). Each item has: Price (in CENTS -- divide by 100, same as DiamondCertified does), Discount, and NivodaDiamond.{ImageUrl, VideoUrl, Availability, SupplierStockId, Certificate with Lab/Shape/CertNumber/Cut/ Carats/Clarity/Color/Polish/Symmetry/measurements}.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `shape` | `string` | required |\n| `carats` | `double` | required |\n| `labGrown` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"NivodaApi","section":"Search","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/#search","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/nivoda/#search","collection":"scripting","hash":"b3085c1e6fc7c12f2be19c6bb24ca57a","indexed_by":"docs-index"}},{"content":"PanelsApi\n\nThe Artisan command panel (the side panel a tool such as ArtisanBail opens, with its live preview). Panels are interactive and cannot be driven headless -- use the *Api creators instead -- but a script that opened one through a command line can see it and close it.\n\n```python\nfrom ArtisanPlugin.Scripting import PanelsApi\n```\n\nSee also the Python package, `ra.panels`.","metadata":{"title":"PanelsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/","collection":"scripting","hash":"8c5d927000e85682ae00b35a1b73bdee","indexed_by":"docs-index"}},{"content":"PanelsApi — Methods\n\n| Method | |\n|---|---|\n| `Active` | The command panel currently open (\"Bail\", \"Cutter\", \"Basket\"...), or null when none is. |\n| `Close` | Closes the open command panel WITHOUT applying it, like its X button: the live preview is discarded and objects hidden while editing come back. |\n\nActive\n```csharp\nstring PanelsApi.Active()\n```\n\nThe command panel currently open (\"Bail\", \"Cutter\", \"Basket\"...), or null when none is.\n\nReturns `string`.","metadata":{"title":"PanelsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/#methods","collection":"scripting","hash":"f17d0f098a20aa4811a6629c585bcb16","indexed_by":"docs-index"}},{"content":"PanelsApi — Close\n\n```csharp\nstring PanelsApi.Close()\n```\n\nCloses the open command panel WITHOUT applying it, like its X button: the live preview is discarded and objects hidden while editing come back. Returns the closed panel's name, or null when none was open.\n\nReturns `string`.","metadata":{"title":"PanelsApi","section":"Close","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/#close","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/panels/#close","collection":"scripting","hash":"a3870ebdf1fee506c94ee8c7fc96e936","indexed_by":"docs-index"}},{"content":"PatternApi\n\nRectangular array of an object, optionally flowed onto a surface (the ArtisanPattern tool).\n\n```python\nfrom ArtisanPlugin.Scripting import PatternApi\n```\n\nSee also the guide, Accessories › Pattern, and the Python package, `ra.pattern`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Repeats the source object in a columns x rows grid (defaults 2x3), then, when `surfaceId` is given, flows the whole grid onto that surface (Sporph). |","metadata":{"title":"PatternApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pattern/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pattern/","collection":"scripting","hash":"469728adc47ba83f9497b4876dbc1b61","indexed_by":"docs-index"}},{"content":"PatternApi — Create\n\n```csharp\nIReadOnlyList<Guid> PatternApi.Create(\n    Guid objectId,\n    Guid? surfaceId = null,\n    int columns = 0,\n    int rows = 0,\n    double xPadding = 0,\n    double yPadding = 0,\n    double rotation = 0,\n    double zMove = 0,\n    double maxThickness = 0,\n    int reverseMode = -1)\n```\n\nRepeats the source object in a columns x rows grid (defaults 2x3), then, when `surfaceId` is given, flows the whole grid onto that surface (Sporph). `rotation` (deg) accumulates per cell around Z; `zMove` lifts the source before arraying; `maxThickness` > 0 also rescales the source in Z to that thickness. `reverseMode` mirrors the flow surface: 0 none, 1 reverse U, 2 reverse V, 3 both (-1 keeps the default). Paddings, rotation and zMove of 0 keep the saved/tool defaults (which are 0). Returns the created object ids; the source object is left untouched, exactly like the panel.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectId` | `Guid` | required |\n| `surfaceId` | `Guid?` | `null` |\n| `columns` | `int` | `0` |\n| `rows` | `int` | `0` |\n| `xPadding` | `double` | `0` |\n| `yPadding` | `double` | `0` |\n| `rotation` | `double` | `0` |\n| `zMove` | `double` | `0` |\n| `maxThickness` | `double` | `0` |\n| `reverseMode` | `int` | `-1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PatternApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pattern/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pattern/#create","collection":"scripting","hash":"83f675c456e082f2acedcca202addf36","indexed_by":"docs-index"}},{"content":"PaveAlongSurfaceApi\n\nPave rows following a surface direction.\n\n```python\nfrom ArtisanPlugin.Scripting import PaveAlongSurfaceApi\n```\n\nSee also the Python package, `ra.pave_along_surface`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Rows of round diamonds along the isocurves of a surface -- the ArtisanPaveAlongSurface (Pave UV) tool, headless. |","metadata":{"title":"PaveAlongSurfaceApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-along-surface/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-along-surface/","collection":"scripting","hash":"fee5c8cb1da6c069f8dac6c90be04a27","indexed_by":"docs-index"}},{"content":"PaveAlongSurfaceApi — Create\n\n```csharp\nIReadOnlyList<Guid> PaveAlongSurfaceApi.Create(\n    Guid surfaceId,\n    IEnumerable<Point3d> points,\n    double gemSize = 0,\n    double distance = 0,\n    double borderDistance = 0,\n    string direction = null,\n    bool? justify = null,\n    string verticalAlignment = null)\n```\n\nRows of round diamonds along the isocurves of a surface -- the ArtisanPaveAlongSurface (Pave UV) tool, headless. `surfaceId` is a surface or single-face polysurface; each entry of `points` replaces one click on it and yields one row along the isocurve through that point, in `direction` U (default) or V. Millimetres; 0 keeps the tool default (or the user's saved defaults): gemSize 1.5, distance 0.1 between gems, borderDistance 0.2. `justify` true squeezes the row to fill the isocurve; `verticalAlignment` CENTER (default) / TOP / BOTTOM shifts the row sideways by half a gem. Positions shared by two rows are baked once. Returns the ids of the created gems.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceId` | `Guid` | required |\n| `points` | `IEnumerable ` | required |\n| `gemSize` | `double` | `0` |\n| `distance` | `double` | `0` |\n| `borderDistance` | `double` | `0` |\n| `direction` | `string` | `null` |\n| `justify` | `bool?` | `null` |\n| `verticalAlignment` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PaveAlongSurfaceApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-along-surface/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-along-surface/#create","collection":"scripting","hash":"32ecb0a1256ca1f8dab791cb3632d3c5","indexed_by":"docs-index"}},{"content":"PaveShankBuilderApi\n\nHeadless builder for the pavé shank. PaveShankApi stays query-only (All/Find/Selected); the IPaveShank handle returned here is the same one it hands out, so `PaveShankApi.Find(id)` finds what Create made.\n\n```python\nfrom ArtisanPlugin.Scripting import PaveShankBuilderApi\n```\n\nSee also the Python package, `ra.pave_shank`.","metadata":{"title":"PaveShankBuilderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/","collection":"scripting","hash":"196895d907e10885d3191719c0e6df19","indexed_by":"docs-index"}},{"content":"PaveShankBuilderApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Builds a pavé shank (the ArtisanPaveShank tool, headless): a classic band carrying one or more longitudinal rows of round stones, each row running along the band at a lateral offset from its centre. |","metadata":{"title":"PaveShankBuilderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#methods","collection":"scripting","hash":"98f2a0a457166051abad69a322866ffb","indexed_by":"docs-index"}},{"content":"PaveShankBuilderApi — Create\n\n```csharp\nIPaveShank PaveShankBuilderApi.Create(\n    double width = 0,\n    double height = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    string openingType = null,\n    double gemSize = 0,\n    double spacing = 0,\n    double offset = 0,\n    double startAngle = double.NaN,\n    double endAngle = double.NaN,\n    bool mirror = false,\n    IEnumerable<double> rowOffsets = null,\n    bool withCutters = false,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a pavé shank (the ArtisanPaveShank tool, headless): a classic band carrying one or more longitudinal rows of round stones, each row running along the band at a lateral offset from its centre. Millimetres; 0 keeps the tool default (or the user's saved defaults): width 2.5, height 2.5, gemSize 1.2, spacing 0.15, offset 0 (middle of the band). Angles in degrees; NaN keeps the default (startAngle 0, endAngle 360 = full turn). `rowOffsets` given = one row per lateral offset (all sharing gemSize / spacing / angles), otherwise the row settings apply to the default single row; `mirror` also places every row at -offset. `openingType` \"NONE\" | \"CUT\" | \"STRANGLE\" (default STRANGLE). `withCutters` subtracts one cutter per stone from the band, like the panel does. `fingerDiameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name; `plane` omitted = world XY. `element` = name of a saved PaveShank element (ElementsApi.List(\"PaveShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the IPaveShank handle of the new shank (stones and prongs are its children).","metadata":{"title":"PaveShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#create","collection":"scripting","hash":"cb7e6aba79e9cf5cc6a95dcc83a03e4e","indexed_by":"docs-index"}},{"content":"PaveShankBuilderApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `openingType` | `string` | `null` |\n| `gemSize` | `double` | `0` |\n| `spacing` | `double` | `0` |\n| `offset` | `double` | `0` |\n| `startAngle` | `double` | `double.NaN` |\n| `endAngle` | `double` | `double.NaN` |\n| `mirror` | `bool` | `false` |\n| `rowOffsets` | `IEnumerable ` | `null` |\n| `withCutters` | `bool` | `false` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IPaveShank`.","metadata":{"title":"PaveShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#create","collection":"scripting","hash":"d02f7833ef1bf448df21c583b8170524","indexed_by":"docs-index"}},{"content":"PaveShankBuilderApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IPaveShank`, `IClassicProfile`, `IPaveShankRail`, `IPaveShankRow`, `IPaveShankProng`, `IClassicAdvanced`.","metadata":{"title":"PaveShankBuilderApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank-builder/#handles-and-sections","collection":"scripting","hash":"cf72d605da1531d82b313d793e328f72","indexed_by":"docs-index"}},{"content":"PaveShankApi\n\nPave shanks - a band carrying one or more longitudinal rows of stones. Query-only for now: run ArtisanPaveShank in the UI once, then script every variant from the handle.\n\n```python\nfrom ArtisanPlugin.Scripting import PaveShankApi\n```\n\nSee also the guide, Shanks › Pave shank, and the Python package, `ra.pave_shank`.","metadata":{"title":"PaveShankApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/","collection":"scripting","hash":"ade68888963e6fc62cfb4664b5376966","indexed_by":"docs-index"}},{"content":"PaveShankApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IPaveShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IPaveShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IPaveShank` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"PaveShankApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#methods","collection":"scripting","hash":"a84d15ffa4d1ef1235b39084cef9e525","indexed_by":"docs-index"}},{"content":"PaveShankApi — All\n\n```csharp\nIReadOnlyList<IPaveShank> PaveShankApi.All()\n```\n\n`IPaveShank` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IPaveShank> PaveShankApi.ByLayer(string layerName)\n```\n\n`IPaveShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PaveShankApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#all","collection":"scripting","hash":"dae7748d641012e394c7109e6a0bae57","indexed_by":"docs-index"}},{"content":"PaveShankApi — Count\n\n```csharp\nint PaveShankApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nIPaveShank PaveShankApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IPaveShank`.","metadata":{"title":"PaveShankApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#count","collection":"scripting","hash":"d03f8dbb3baa510163c0ca5b7c765af9","indexed_by":"docs-index"}},{"content":"PaveShankApi — Selected\n\n```csharp\nIReadOnlyList<IPaveShank> PaveShankApi.Selected()\n```\n\n`IPaveShank` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IClassicProfile`, `IClassicAdvanced`.","metadata":{"title":"PaveShankApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#selected","collection":"scripting","hash":"184b211cc834f1a31cd673c396a41975","indexed_by":"docs-index"}},{"content":"PaveShankApi — IPaveShank\n\n*Handle* — extends `IParametricObject`.\n\nPave shank: a band carrying one or more longitudinal rows of stones. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Advanced` | `IClassicAdvanced` | get | |\n| `CuttersEnabled` | `bool` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Rail` | `IPaveShankRail` | get | |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `TopProfile` | `IClassicProfile` | get | The band section and the opening — the same models the classic shank uses. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetCuttersEnabled(bool enabled)` | |\n| `void SetElement(string element)` | Applies a saved PaveShank element (ElementsApi.List(\"PaveShank\")) to this shank: its band, rows and cutters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |","metadata":{"title":"PaveShankApi","section":"IPaveShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshank","collection":"scripting","hash":"a541e1cb5b1fb0c7e54289c139b1cd14","indexed_by":"docs-index"}},{"content":"PaveShankApi — IPaveShankRail\n\n*Section*.\n\nThe rail: the gem rows the band carries and the prongs holding them.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ProngDiameter` | `double` | get | global default, mm |\n| `ProngHeight` | `double` | get | global default, mm |\n| `Prongs` | `IReadOnlyList ` | get | |\n| `Rows` | `IReadOnlyList ` | get | |\n| `ShowProngs` | `bool` | get | |\n\n| Method | |\n|---|---|\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetRow( int index, double gemSize, double offset, double spacing, double startAngle, double endAngle)` | Edits one row in place. |\n| `void SetRows(IEnumerable rows)` | Replaces the whole row list, in lateral order. |\n| `void SetShowProngs(bool show)` | |","metadata":{"title":"PaveShankApi","section":"IPaveShankRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankrail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankrail","collection":"scripting","hash":"b76ba6b65d44dc1aeadc40137125b7ff","indexed_by":"docs-index"}},{"content":"PaveShankApi — IPaveShankRow\n\n*Section*.\n\nOne longitudinal gem row: a line of equal stones running along the band at a lateral offset from the top profile's centre, from StartAngle to EndAngle.\n\n| Property | Type | | |\n|---|---|---|---|\n| `EndAngle` | `double` | get | degrees |\n| `GemSize` | `double` | get | mm |\n| `Mirror` | `bool` | get | the row is the mirror of its opposite |\n| `Offset` | `double` | get | lateral offset from the centre, mm |\n| `Spacing` | `double` | get | gap between adjacent stones, mm |\n| `StartAngle` | `double` | get | degrees along the band |","metadata":{"title":"PaveShankApi","section":"IPaveShankRow","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankrow","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankrow","collection":"scripting","hash":"fbd82285312b1d9e9ac50e0fa811d687","indexed_by":"docs-index"}},{"content":"PaveShankApi — IPaveShankProng\n\n*Section*.\n\nOne prong definition, tied to a row by index.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ApplyToAllGems` | `bool` | get | |\n| `Diameter` | `double` | get | mm |\n| `Height` | `double` | get | mm |\n| `Mirror` | `bool` | get | |\n| `RowIndex` | `int` | get | |\n| `Visible` | `bool` | get | |\n| `X` | `double` | get | mm |\n| `Y` | `double` | get | mm |","metadata":{"title":"PaveShankApi","section":"IPaveShankProng","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankprong","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave-shank/#ipaveshankprong","collection":"scripting","hash":"787175c6a842f51f924f7a174e8849c5","indexed_by":"docs-index"}},{"content":"PaveApi\n\nAutomatic pave over a surface -- the ArtisanPaveOnCurve tool, headless: fills the given surface/brep/mesh with diamonds (and optional prongs and cutters), sized and packed automatically.\n\n```python\nfrom ArtisanPlugin.Scripting import PaveApi\n```\n\nSee also the guide, Gemsets › Pave on surface, and the Python package, `ra.pave`.","metadata":{"title":"PaveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/","collection":"scripting","hash":"0e5c9ef76d8d1ec6ed04640eb5a89ac5","indexed_by":"docs-index"}},{"content":"PaveApi — Methods\n\n| Method | |\n|---|---|\n| `OnSurface` | Paves the given objects. |\n| `OnSurfaceDetailed` | Same as OnSurface, but returns every id it created -- the gems, the prongs and the cutters -- instead of only the gems. |","metadata":{"title":"PaveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#methods","collection":"scripting","hash":"3c4b415d9f22fc643ecb6dd8e6468134","indexed_by":"docs-index"}},{"content":"PaveApi — OnSurface\n\n```csharp\nIReadOnlyList<Guid> PaveApi.OnSurface(\n    IEnumerable<Guid> surfaceIds,\n    double gemDiameter = 0,\n    double prongDiameter = 0,\n    double distanceToBorder = 0,\n    bool prongs = true,\n    bool cutters = false,\n    bool? variableSize = null,\n    string fillMode = null,\n    Point3d? startPoint = null,\n    double prongOverGirdle = double.NaN,\n    double prongUnderGirdle = double.NaN,\n    string gapMode = null,\n    double manualGap = double.NaN,\n    double extraGap = double.NaN,\n    double gemInside = double.NaN,\n    int minProngsPerGem = 0,\n    double prongBorderDistance = double.NaN,\n    bool? borderFromProng = null,\n    double gemDiameterMin = 0,\n    double prongDiameterMin = 0,\n    double cutterSizeTop = 0,\n    double cutterHeightTop = 0,\n    double cutterSizeBottom = 0,\n    double cutterGemInside = double.NaN)\n```\n\nPaves the given objects. Millimetres; 0 keeps the tool default: gemDiameter 1.3 (shrinking to gemDiameterMin 0.9 when variableSize), prongDiameter 0.8, distanceToBorder 0.1. `prongs`/`cutters` toggle those outputs (tool defaults: prongs on, cutters off). `fillMode` is FROM_BORDER (default) or FROM_CENTER; FROM_CENTER needs `startPoint` on (or near) the surface. Returns the ids of the created gems.","metadata":{"title":"PaveApi","section":"OnSurface","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurface","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurface","collection":"scripting","hash":"96a754c16772a9ddd6b2abafcefe5fd6","indexed_by":"docs-index"}},{"content":"PaveApi — OnSurface\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceIds` | `IEnumerable ` | required |\n| `gemDiameter` | `double` | `0` |\n| `prongDiameter` | `double` | `0` |\n| `distanceToBorder` | `double` | `0` |\n| `prongs` | `bool` | `true` |\n| `cutters` | `bool` | `false` |\n| `variableSize` | `bool?` | `null` |\n| `fillMode` | `string` | `null` |\n| `startPoint` | `Point3d?` | `null` |\n| `prongOverGirdle` | `double` | `double.NaN` |\n| `prongUnderGirdle` | `double` | `double.NaN` |\n| `gapMode` | `string` | `null` |\n| `manualGap` | `double` | `double.NaN` |\n| `extraGap` | `double` | `double.NaN` |\n| `gemInside` | `double` | `double.NaN` |\n| `minProngsPerGem` | `int` | `0` |\n| `prongBorderDistance` | `double` | `double.NaN` |\n| `borderFromProng` | `bool?` | `null` |\n| `gemDiameterMin` | `double` | `0` |\n| `prongDiameterMin` | `double` | `0` |\n| `cutterSizeTop` | `double` | `0` |\n| `cutterHeightTop` | `double` | `0` |\n| `cutterSizeBottom` | `double` | `0` |\n| `cutterGemInside` | `double` | `double.NaN` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PaveApi","section":"OnSurface","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurface","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurface","collection":"scripting","hash":"0e6b61af4fcf4190327156696c447030","indexed_by":"docs-index"}},{"content":"PaveApi — OnSurfaceDetailed\n\n```csharp\nPaveResult PaveApi.OnSurfaceDetailed(\n    IEnumerable<Guid> surfaceIds,\n    double gemDiameter = 0,\n    double prongDiameter = 0,\n    double distanceToBorder = 0,\n    bool prongs = true,\n    bool cutters = false,\n    bool? variableSize = null,\n    string fillMode = null,\n    Point3d? startPoint = null,\n    double prongOverGirdle = double.NaN,\n    double prongUnderGirdle = double.NaN,\n    string gapMode = null,\n    double manualGap = double.NaN,\n    double extraGap = double.NaN,\n    double gemInside = double.NaN,\n    int minProngsPerGem = 0,\n    double prongBorderDistance = double.NaN,\n    bool? borderFromProng = null,\n    double gemDiameterMin = 0,\n    double prongDiameterMin = 0,\n    double cutterSizeTop = 0,\n    double cutterHeightTop = 0,\n    double cutterSizeBottom = 0,\n    double cutterGemInside = double.NaN)\n```\n\nSame as OnSurface, but returns every id it created -- the gems, the prongs and the cutters -- instead of only the gems. OnSurface threw the prong and cutter ids away, so a script could not select, re-layer or boolean what it had just built.","metadata":{"title":"PaveApi","section":"OnSurfaceDetailed","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurfacedetailed","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurfacedetailed","collection":"scripting","hash":"7af5c48b3414100326e229288767c7fe","indexed_by":"docs-index"}},{"content":"PaveApi — OnSurfaceDetailed\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceIds` | `IEnumerable ` | required |\n| `gemDiameter` | `double` | `0` |\n| `prongDiameter` | `double` | `0` |\n| `distanceToBorder` | `double` | `0` |\n| `prongs` | `bool` | `true` |\n| `cutters` | `bool` | `false` |\n| `variableSize` | `bool?` | `null` |\n| `fillMode` | `string` | `null` |\n| `startPoint` | `Point3d?` | `null` |\n| `prongOverGirdle` | `double` | `double.NaN` |\n| `prongUnderGirdle` | `double` | `double.NaN` |\n| `gapMode` | `string` | `null` |\n| `manualGap` | `double` | `double.NaN` |\n| `extraGap` | `double` | `double.NaN` |\n| `gemInside` | `double` | `double.NaN` |\n| `minProngsPerGem` | `int` | `0` |\n| `prongBorderDistance` | `double` | `double.NaN` |\n| `borderFromProng` | `bool?` | `null` |\n| `gemDiameterMin` | `double` | `0` |\n| `prongDiameterMin` | `double` | `0` |\n| `cutterSizeTop` | `double` | `0` |\n| `cutterHeightTop` | `double` | `0` |\n| `cutterSizeBottom` | `double` | `0` |\n| `cutterGemInside` | `double` | `double.NaN` |\n\nReturns `PaveResult`.","metadata":{"title":"PaveApi","section":"OnSurfaceDetailed","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurfacedetailed","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pave/#onsurfacedetailed","collection":"scripting","hash":"1ec54fd08087f7d6aa1fb136547457ea","indexed_by":"docs-index"}},{"content":"PearlApi\n\nPearls and their cups.\n\n```python\nfrom ArtisanPlugin.Scripting import PearlApi\n```\n\nSee also the guide, Gemsets › Pearl, and the Python package, `ra.pearl`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IPearl` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IPearl` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Creates a pearl (the ArtisanPearl tool, headless) and adds it to the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Pearls currently selected in the active doc. |","metadata":{"title":"PearlApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/","collection":"scripting","hash":"d6cf71edb975e4a8140fed72cf3e445c","indexed_by":"docs-index"}},{"content":"PearlApi — All\n\n```csharp\nIReadOnlyList<IPearl> PearlApi.All()\n```\n\n`IPearl` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IPearl> PearlApi.ByLayer(string layerName)\n```\n\n`IPearl` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PearlApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#all","collection":"scripting","hash":"43fec9b4ac3e0ed90331fec1848133b2","indexed_by":"docs-index"}},{"content":"PearlApi — Count\n\n```csharp\nint PearlApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIPearl PearlApi.Create(\n    double diameter = 0,\n    bool? calotte = null,\n    double calotteAngle = 0,\n    double calotteThickness = 0,\n    bool? wire = null,\n    double wireDiameter = 0,\n    double wireLength = 0,\n    Plane? plane = null)\n```\n\nCreates a pearl (the ArtisanPearl tool, headless) and adds it to the active document. A pearl is its own stone -- a sphere placed on `plane` (omitted = world XY) -- optionally baked together with two metal children, exactly like the panel's Accept: a calotte (cup holding the pearl) and a wire (post drilled into it). The children become PearlCalotteCustomObject / PearlWireCustomObject instances linked to the pearl, on the metal layer with the metal material. All dimensional arguments are millimetres. Pass 0 (or omit) to keep the tool's default -- or the user's saved defaults -- for that parameter (diameter 6, calotteAngle 35 degrees, calotteThickness 1, wireDiameter 1, wireLength 8). `calotte` / `wire` omitted (null) keep the default (both enabled); pass false to skip that child. Throws InvalidOperationException when the geometry fails to compute (e.g. calotte thickness must be > 0.2 mm).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `diameter` | `double` | `0` |\n| `calotte` | `bool?` | `null` |\n| `calotteAngle` | `double` | `0` |\n| `calotteThickness` | `double` | `0` |\n| `wire` | `bool?` | `null` |\n| `wireDiameter` | `double` | `0` |\n| `wireLength` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IPearl`.","metadata":{"title":"PearlApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#count","collection":"scripting","hash":"69b012b396448659563ae2b95f42d191","indexed_by":"docs-index"}},{"content":"PearlApi — Find\n\n```csharp\nIPearl PearlApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IPearl`.\n\nSelected\n```csharp\nIReadOnlyList<IPearl> PearlApi.Selected()\n```\n\nPearls currently selected in the active doc. Empty list if nothing is selected or the selection contains no pearls.\n\nReturns `IReadOnlyList `.","metadata":{"title":"PearlApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#find","collection":"scripting","hash":"ed5525fabf289c9c43b82bb41927fa82","indexed_by":"docs-index"}},{"content":"PearlApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nIPearl\n*Handle* — extends `IParametricObject`.\n\nA pearl is its own stone (a sphere on a plane) with two optional metal children baked alongside it: a calotte (cup) and a wire (post). It is not built around a mother gem, so it extends IParametricObject directly and MotherGemId is always Guid.Empty. Read-only: the parametric engine has no Regenerate for pearls, so there are no in-place setters (recreate + Delete to change one).\n\n| Property | Type | | |\n|---|---|---|---|\n| `CalotteAngle` | `double` | get | degrees |\n| `CalotteId` | `Guid` | get | Guid.Empty when there is no calotte child |\n| `CalotteThickness` | `double` | get | millimetres |\n| `Diameter` | `double` | get | pearl sphere diameter, millimetres |\n| `HasCalotte` | `bool` | get | a calotte child was baked with this pearl |\n| `HasWire` | `bool` | get | a wire child was baked with this pearl |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `WireDiameter` | `double` | get | millimetres |\n| `WireId` | `Guid` | get | Guid.Empty when there is no wire child |\n| `WireLength` | `double` | get | millimetres |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"PearlApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pearl/#handles-and-sections","collection":"scripting","hash":"a65ceb87baccffbb674a0888d281eb89","indexed_by":"docs-index"}},{"content":"PegheadApi\n\nPeghead seats under a stone: prongs, height, thickness.\n\n```python\nfrom ArtisanPlugin.Scripting import PegheadApi\n```\n\nSee also the guide, Gemsets › Peghead, and the Python package, `ra.peghead`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IPeghead` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IPeghead` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a peghead (prong head) around an existing gem -- the ArtisanPeghead tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `IPeghead` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Pegheads currently selected in the active doc. |","metadata":{"title":"PegheadApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/","collection":"scripting","hash":"33a043d0accd638da50b854cf153ba23","indexed_by":"docs-index"}},{"content":"PegheadApi — All\n\n```csharp\nIReadOnlyList<IPeghead> PegheadApi.All()\n```\n\n`IPeghead` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IPeghead> PegheadApi.ByLayer(string layerName)\n```\n\n`IPeghead` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PegheadApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#all","collection":"scripting","hash":"b37113173221a30e828137dd5eefd405","indexed_by":"docs-index"}},{"content":"PegheadApi — Count\n\n```csharp\nint PegheadApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nIPeghead PegheadApi.Create(\n    Guid gemId,\n    int prongs = 0,\n    double height = 0,\n    double thickness = 0,\n    double girdleWidth = 0,\n    double overGirdleHeight = 0,\n    double gemInside = double.NaN,\n    string profile = null,\n    string element = null)\n```\n\nBuilds a peghead (prong head) around an existing gem -- the ArtisanPeghead tool, headless. `gemId` must be a gem in the active document; the peghead is a parametric child of that gem. Millimetres; 0 keeps the tool default (or the user's saved defaults): height 5, thickness 1, girdleWidth 0.8, overGirdleHeight 1. `prongs` 0 keeps the default (4); use 3, 4, 6... or a negative count for the rotated variant (-4 = 4 prongs at 45 degrees). `gemInside` defaults to 0 and accepts negatives. `profile` picks a PEGHEAD_PROFILE asset by name (see AssetsApi.List(\"PEGHEAD_PROFILE\")); omitted = the default profile. `element` = name of a saved Peghead element (ElementsApi.List(\"Peghead\")) to start from instead of the defaults; explicit arguments (profile included) override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `prongs` | `int` | `0` |\n| `height` | `double` | `0` |\n| `thickness` | `double` | `0` |\n| `girdleWidth` | `double` | `0` |\n| `overGirdleHeight` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IPeghead`.","metadata":{"title":"PegheadApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#count","collection":"scripting","hash":"5070e361231607c6a13a6a023f77f725","indexed_by":"docs-index"}},{"content":"PegheadApi — Find\n\n```csharp\nIPeghead PegheadApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IPeghead`.\n\nForGem\n```csharp\nIReadOnlyList<IPeghead> PegheadApi.ForGem(Guid gemId)\n```\n\n`IPeghead` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PegheadApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#find","collection":"scripting","hash":"1506d4edf61f87f6bc3b3a25566cfa01","indexed_by":"docs-index"}},{"content":"PegheadApi — Selected\n\n```csharp\nIReadOnlyList<IPeghead> PegheadApi.Selected()\n```\n\nPegheads currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"PegheadApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#selected","collection":"scripting","hash":"d079ff85bb4cabbf3a62cd7900d97e84","indexed_by":"docs-index"}},{"content":"PegheadApi — IPeghead\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `GirdleWidth` | `double` | get | |\n| `Height` | `double` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `OverGirdleHeight` | `double` | get | |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProfileName` | `string` | get | PEGHEAD_PROFILE asset name, \"\" when unset |\n| `Prongs` | `int` | get | Current values (millimetres, except Prongs). negative = the rotated variant |\n| `Thickness` | `double` | get | |","metadata":{"title":"PegheadApi","section":"IPeghead","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#ipeghead","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#ipeghead","collection":"scripting","hash":"25a17a45eb988fb7f228114106d8c0c8","indexed_by":"docs-index"}},{"content":"PegheadApi — IPeghead\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved Peghead element (ElementsApi.List(\"Peghead\")) to this peghead: its parameters replace the current ones, the mother gem stays, and the peghead regenerates in place (same Guid). |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGirdleWidth(double girdleWidth)` | |\n| `void SetHeight(double height)` | |\n| `void SetOverGirdleHeight(double overGirdleHeight)` | |\n| `void SetProfile(string assetName)` | PEGHEAD_PROFILE asset name |\n| `void SetProngs(int prongs)` | Parametric edits -- each regenerates the peghead in place (same Guid) and calls LicenseGate.RequireValid() first. Millimetres; `prongs` accepts negative counts for the rotated variant (-4 = 4 prongs at 45 degrees). |\n| `void SetThickness(double thickness)` | |","metadata":{"title":"PegheadApi","section":"IPeghead","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#ipeghead","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/peghead/#ipeghead","collection":"scripting","hash":"b60bc6e7e99f1a123c5dedf9e7eac965","indexed_by":"docs-index"}},{"content":"PricingExtraApi\n\nThe company's pricing PROFILES that live next to the manufacturer file but are not part of it (so PricingApi.GetSettingsJson/SetSetting cannot reach them): the markup profile (ArtisanMarkup, Markup.json) and the tax profile (ArtisanTaxes, Taxes.json), both in the pricing folder.\n\n```python\nfrom ArtisanPlugin.Scripting import PricingExtraApi\n```\n\nSee also the Python package, `ra.pricing`.","metadata":{"title":"PricingExtraApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/","collection":"scripting","hash":"21cd865299cf0e871af3e38f190debde","indexed_by":"docs-index"}},{"content":"PricingExtraApi — Methods\n\n| Method | |\n|---|---|\n| `GetMarkupJson` | The markup profile as indented JSON (the ArtisanMarkup dialog): Name, Notes, the main-stone cost bands P100_90 ... |\n| `GetTaxesJson` | The tax profile as indented JSON (the ArtisanTaxes dialog): Mode (None, European, American, Canadian, OtherCountry), the region and tax id of that mode (EuropeanCountry/EuropeanVatId, AmericanState/ AmericanSaleTaxId, CanadianProvince/CanadianSaleTaxId, OtherCountry/ UniqueTaxPercentage) and IncludeTaxesToPricing. |\n| `SetMarkup` | Updates one or more markup values and saves Markup.json (the dialog's Accept). |\n| `SetTaxes` | Updates the tax profile and saves Taxes.json (the dialog's Accept). |\n| `TaxRegions` | The valid regions for a tax mode, to pick `region` in SetTaxes: EU member countries (European), US states (American), Canadian provinces (Canadian) or every country (OtherCountry). |","metadata":{"title":"PricingExtraApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#methods","collection":"scripting","hash":"e6cfd444b6bed348dfa779edba3860a5","indexed_by":"docs-index"}},{"content":"PricingExtraApi — GetMarkupJson\n\n```csharp\nstring PricingExtraApi.GetMarkupJson()\n```\n\nThe markup profile as indented JSON (the ArtisanMarkup dialog): Name, Notes, the main-stone cost bands P100_90 ... P10_0 (markup % by how much of the total cost the main stone represents), OnlySettingMarkup (% when only the setting is sold) and the loose diamonds/gemstones bands D0_030, D030_049, D050_069, D070_099, D10 (by carat). All values are percentages. Read-only.\n\nReturns `string`.","metadata":{"title":"PricingExtraApi","section":"GetMarkupJson","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#getmarkupjson","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#getmarkupjson","collection":"scripting","hash":"87fcce07e14f388ec52d422eb62f768d","indexed_by":"docs-index"}},{"content":"PricingExtraApi — GetTaxesJson\n\n```csharp\nstring PricingExtraApi.GetTaxesJson()\n```\n\nThe tax profile as indented JSON (the ArtisanTaxes dialog): Mode (None, European, American, Canadian, OtherCountry), the region and tax id of that mode (EuropeanCountry/EuropeanVatId, AmericanState/ AmericanSaleTaxId, CanadianProvince/CanadianSaleTaxId, OtherCountry/ UniqueTaxPercentage) and IncludeTaxesToPricing. Read-only.\n\nReturns `string`.","metadata":{"title":"PricingExtraApi","section":"GetTaxesJson","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#gettaxesjson","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#gettaxesjson","collection":"scripting","hash":"0821a4df4a8fa966916c422c0c18cfff","indexed_by":"docs-index"}},{"content":"PricingExtraApi — SetMarkup\n\n```csharp\nstring PricingExtraApi.SetMarkup(IDictionary<string, string> values)\n```\n\nUpdates one or more markup values and saves Markup.json (the dialog's Accept). `values` maps field name -> value, e.g. {\"P100_90\": \"35\", \"only_setting_markup\": \"120\", \"Name\": \"Retail\"}; names are matched ignoring case and underscores. Fields not given keep their value. Returns the profile JSON after the change.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `values` | `IDictionary ` | required |\n\nReturns `string`.","metadata":{"title":"PricingExtraApi","section":"SetMarkup","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#setmarkup","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#setmarkup","collection":"scripting","hash":"47f6a7cb62f4d9d60a64972d8d569630","indexed_by":"docs-index"}},{"content":"PricingExtraApi — SetTaxes\n\n```csharp\nstring PricingExtraApi.SetTaxes(\n    string mode = null,\n    string region = null,\n    string taxId = null,\n    double uniqueTaxPercentage = double.NaN,\n    bool? includeTaxesToPricing = null,\n    string name = null,\n    string notes = null)\n```\n\nUpdates the tax profile and saves Taxes.json (the dialog's Accept). Every argument is optional; null/NaN keeps the stored value. mode None, European, American, Canadian or OtherCountry region country / state / province of the (new or stored) mode, by code or name — see TaxRegions() taxId the VAT id (European) or sale tax id (American, Canadian); ignored by the other modes uniqueTaxPercentage flat tax % (OtherCountry only) includeTaxesToPricing bake the tax into prices (European and OtherCountry only, as in the dialog) name, notes the profile's info fields Returns the profile JSON after the change.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `mode` | `string` | `null` |\n| `region` | `string` | `null` |\n| `taxId` | `string` | `null` |\n| `uniqueTaxPercentage` | `double` | `double.NaN` |\n| `includeTaxesToPricing` | `bool?` | `null` |\n| `name` | `string` | `null` |\n| `notes` | `string` | `null` |\n\nReturns `string`.","metadata":{"title":"PricingExtraApi","section":"SetTaxes","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#settaxes","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#settaxes","collection":"scripting","hash":"76c42e80897b771b0b1804d5f393fe37","indexed_by":"docs-index"}},{"content":"PricingExtraApi — TaxRegions\n\n```csharp\nIReadOnlyList<TaxRegion> PricingExtraApi.TaxRegions(string mode)\n```\n\nThe valid regions for a tax mode, to pick `region` in SetTaxes: EU member countries (European), US states (American), Canadian provinces (Canadian) or every country (OtherCountry). Read-only.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `mode` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"PricingExtraApi","section":"TaxRegions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#taxregions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing-extra/#taxregions","collection":"scripting","hash":"842c76e7ec3fe247e08be6f74b253600","indexed_by":"docs-index"}},{"content":"PricingApi\n\nHeadless pricing facade for scripts and Flow Studio. It wraps the SAME engine the Breakdown panel uses (BreakdownService -> BreakdownObject.Compute), so the number the chat reports and the number the panel shows can never diverge.\n\n```python\nfrom ArtisanPlugin.Scripting import PricingApi\n```\n\nSee also the guide, Pricing, and the Python package, `ra.pricing`.","metadata":{"title":"PricingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/","collection":"scripting","hash":"0e5defb6a5b3194007f37e9d40860c99","indexed_by":"docs-index"}},{"content":"PricingApi — Methods\n\n| Method | |\n|---|---|\n| `Calculate` | Recomputes the price for the current document using the active manufacturer / market and returns the totals plus the per-category breakdown. |\n| `CalculateDetailed` | Like Calculate(), but returning the SAME line-level detail the Breakdown panel shows: one line per metal (weight, waste, price), per certified diamond, per gem group (count, carats, sieve, price per carat, setting type), per process (metal processes, setting labor, additionals) and per extra component. |\n| `GetSettingsJson` | The settings as indented JSON — the whole manufacturer, or just the node at `path` (dot-separated, case-insensitive, [n] for list items: \"Markets\", \"Diamonds.CertificateFromCt\", \"Cfp.Items[2]\"). |\n| `SetSetting` | Updates ONE cost value by path and persists the manufacturer file — e.g. |\n| `ShowPanel` | Opens the Breakdown (price details) panel. |","metadata":{"title":"PricingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#methods","collection":"scripting","hash":"11ca460f39554d86b5095b7d69a4facf","indexed_by":"docs-index"}},{"content":"PricingApi — Calculate\n\n```csharp\nPriceResult PricingApi.Calculate(bool quoteCertified = true, bool? export = null)\n```\n\nRecomputes the price for the current document using the active manufacturer / market and returns the totals plus the per-category breakdown. Use it to answer \"what's the price?\" without opening the panel. `quoteCertified` false = skip the live Nivoda quotes for the certified diamonds (every diamond above the manufacturer's CertificateFromCt threshold): fast and offline, but those stones price as 0. Default true = quote them live with your saved Nivoda filter, like the panel. `export` true = export sale: metal is costed without the import duty / levy set in Breakdown Settings; false = domestic (duty included); null keeps the document's current choice.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `quoteCertified` | `bool` | `true` |\n| `export` | `bool?` | `null` |\n\nReturns `PriceResult`.","metadata":{"title":"PricingApi","section":"Calculate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#calculate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#calculate","collection":"scripting","hash":"b507465a8352a3701f942b58db0a9ff4","indexed_by":"docs-index"}},{"content":"PricingApi — CalculateDetailed\n\n```csharp\nPriceBreakdownDetails PricingApi.CalculateDetailed(\n    bool quoteCertified = true,\n    bool? export = null)\n```\n\nLike Calculate(), but returning the SAME line-level detail the Breakdown panel shows: one line per metal (weight, waste, price), per certified diamond, per gem group (count, carats, sieve, price per carat, setting type), per process (metal processes, setting labor, additionals) and per extra component. Read-only.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `quoteCertified` | `bool` | `true` |\n| `export` | `bool?` | `null` |\n\nReturns `PriceBreakdownDetails`.","metadata":{"title":"PricingApi","section":"CalculateDetailed","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#calculatedetailed","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#calculatedetailed","collection":"scripting","hash":"e3a3df17807706fd7602600a0d462997","indexed_by":"docs-index"}},{"content":"PricingApi — GetSettingsJson\n\n```csharp\nstring PricingApi.GetSettingsJson(string path = null)\n```\n\nThe settings as indented JSON — the whole manufacturer, or just the node at `path` (dot-separated, case-insensitive, [n] for list items: \"Markets\", \"Diamonds.CertificateFromCt\", \"Cfp.Items[2]\"). Read-only.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | `null` |\n\nReturns `string`.","metadata":{"title":"PricingApi","section":"GetSettingsJson","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#getsettingsjson","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#getsettingsjson","collection":"scripting","hash":"32497aeaa64e968311fb40db35214ac1","indexed_by":"docs-index"}},{"content":"PricingApi — SetSetting\n\n```csharp\nvoid PricingApi.SetSetting(string path, string value)\n```\n\nUpdates ONE cost value by path and persists the manufacturer file — e.g. SetSetting(\"Markets.Gold\", \"68.5\") or SetSetting(\"Diamonds.CertificateFromCt\", \"0.30\"). The value string is converted to the target type (number, bool, string or enum name). The next Calculate() prices with the new value.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `value` | `string` | required |","metadata":{"title":"PricingApi","section":"SetSetting","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#setsetting","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#setsetting","collection":"scripting","hash":"b4cc8e0c69394b51a4da4a46a00f864c","indexed_by":"docs-index"}},{"content":"PricingApi — ShowPanel\n\n```csharp\nvoid PricingApi.ShowPanel()\n```\n\nOpens the Breakdown (price details) panel. Call after Calculate() so the panel shows the freshly computed totals. Must run on the UI thread (Flow Studio's Apply does).","metadata":{"title":"PricingApi","section":"ShowPanel","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#showpanel","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/pricing/#showpanel","collection":"scripting","hash":"343d8679943ecffa96460420714e38e5","indexed_by":"docs-index"}},{"content":"ProfileSweepApi\n\nParametric sweep through two or more closed profile curves (the ArtisanProfileSweep tool).\n\n```python\nfrom ArtisanPlugin.Scripting import ProfileSweepApi\n```\n\nSee also the guide, Accessories › Profile sweep, and the Python package, `ra.profile_sweep`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `curveIds` are the closed profiles, in sweep order (at least 2). |","metadata":{"title":"ProfileSweepApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/profile-sweep/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/profile-sweep/","collection":"scripting","hash":"6fe9e3e3ec63892d2dafda464f507471","indexed_by":"docs-index"}},{"content":"ProfileSweepApi — Create\n\n```csharp\nIReadOnlyList<Guid> ProfileSweepApi.Create(\n    IEnumerable<Guid> curveIds,\n    string startCap = null,\n    string endCap = null,\n    double startCapHeight = 0,\n    double endCapHeight = 0,\n    int startContinuity = -1,\n    int endContinuity = -1,\n    bool startFlip = false,\n    bool endFlip = false,\n    string symmetry = null,\n    bool subD = false,\n    int subDSegments = 0,\n    int subDRailSegments = 0)\n```\n\n`curveIds` are the closed profiles, in sweep order (at least 2). Caps are \"NONE\", \"FLAT\" or \"ROUND\" per side (default ROUND, height 0.2). Continuities are 0..4 (G0 position .. G4; default 1 tangency, -1 keeps it). `symmetry` is \"NONE\", \"VERTICAL\" (mirror world YZ), \"HORIZONTAL\" (mirror world ZX) or \"QUAD\" (both). `subD` true outputs a SubD instead of a Brep (caps do not apply); segments default 32 cross-section / 10 rail. Returns the ids of the created objects (Breps are parametric ProfileSweep custom objects; the source curves stay untouched).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `startCap` | `string` | `null` |\n| `endCap` | `string` | `null` |\n| `startCapHeight` | `double` | `0` |\n| `endCapHeight` | `double` | `0` |\n| `startContinuity` | `int` | `-1` |\n| `endContinuity` | `int` | `-1` |\n| `startFlip` | `bool` | `false` |\n| `endFlip` | `bool` | `false` |\n| `symmetry` | `string` | `null` |\n| `subD` | `bool` | `false` |\n| `subDSegments` | `int` | `0` |\n| `subDRailSegments` | `int` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ProfileSweepApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/profile-sweep/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/profile-sweep/#create","collection":"scripting","hash":"c350afedbac14a25d95239aa9afec7d1","indexed_by":"docs-index"}},{"content":"ProngApi\n\nHeadless versions of the prong commands that live outside the parametric settings: ArtisanDynamicProngs (loose prongs on a base geometry, manual or automatic between round gems), ArtisanCustomProngs (copy a custom prong shape onto every existing prong) and ArtisanProngAxis (prong axis lines around a gem).\n\n```python\nfrom ArtisanPlugin.Scripting import ProngApi\n```\n\nSee also the Python package, `ra.prong`.","metadata":{"title":"ProngApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/","collection":"scripting","hash":"566c520b6a6f36aa22a5565d80fa43cc","indexed_by":"docs-index"}},{"content":"ProngApi — Methods\n\n| Method | |\n|---|---|\n| `All` | Ids of every Artisan prong (ProngCustomObject) in the active document. |\n| `AutomaticProngs` | The \"Automatic\" button of ArtisanDynamicProngs, headless: searches every triplet of neighbouring ROUND gems in `gemIds` (null = every visible round gem in the document, like the panel) and drops one prong in the gap between them, oriented by the gems' planes -- no base geometry needed. |\n| `CustomProngs` | The ArtisanCustomProngs command, headless: copies `objectIds` (a custom prong modeled as a surface, polysurface, mesh or SubD; null = the current selection) onto every Artisan prong in `prongIds` (null = every prong in the document), mapping from the source's base plane (bottom-centre of its bounding box on the active CPlane, or `basePlane` when given) to each prong's base plane. |\n| `DynamicProngs` | The ArtisanDynamicProngs panel, headless: drops one loose prong at each of `points`, seated on the closest point of `baseIds` (surfaces, polysurfaces or meshes; null = the current selection) and oriented by the face normal there. |\n| `ProngAxis` | The ArtisanProngAxis panel, headless: for each gem in `gemIds` (null = the selected gems) draws the central axis line of every prong (curves only, no thickness) as one editable \"ProngAxis\" group per gem, ready for ArtisanEdit. |","metadata":{"title":"ProngApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#methods","collection":"scripting","hash":"34d10aa734d34029d138c54023a4690b","indexed_by":"docs-index"}},{"content":"ProngApi — All\n\n```csharp\nIReadOnlyList<Guid> ProngApi.All()\n```\n\nIds of every Artisan prong (ProngCustomObject) in the active document.\n\nReturns `IReadOnlyList `.\n\nAutomaticProngs\n```csharp\nIReadOnlyList<Guid> ProngApi.AutomaticProngs(\n    IEnumerable<Guid> gemIds = null,\n    string mode = null,\n    double diameter = 0,\n    double diameterTop = 0,\n    double diameterMid = 0,\n    double diameterBottom = 0,\n    double heightOverGirdle = 0,\n    double heightUnderGirdle = 0,\n    double extensionForManufacturing = 0,\n    double minDiameter = 0,\n    double gemInside = double.NaN)\n```\n\nThe \"Automatic\" button of ArtisanDynamicProngs, headless: searches every triplet of neighbouring ROUND gems in `gemIds` (null = every visible round gem in the document, like the panel) and drops one prong in the gap between them, oriented by the gems' planes -- no base geometry needed. Candidates within 0.5 mm of an existing visible prong are skipped. Prong parameters as in DynamicProngs; in AUTOMATIC mode each prong takes the diameter that fits its gap (+ gemInside, never below minDiameter). Returns the ids of the new prongs.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `mode` | `string` | `null` |\n| `diameter` | `double` | `0` |\n| `diameterTop` | `double` | `0` |\n| `diameterMid` | `double` | `0` |\n| `diameterBottom` | `double` | `0` |\n| `heightOverGirdle` | `double` | `0` |\n| `heightUnderGirdle` | `double` | `0` |\n| `extensionForManufacturing` | `double` | `0` |\n| `minDiameter` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ProngApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#all","collection":"scripting","hash":"c1ebbd0d82d2071f68bb199b78d5b67f","indexed_by":"docs-index"}},{"content":"ProngApi — CustomProngs\n\n```csharp\nIReadOnlyList<Guid> ProngApi.CustomProngs(\n    IEnumerable<Guid> objectIds = null,\n    IEnumerable<Guid> prongIds = null,\n    string scale = null,\n    double moveInZ = 0,\n    bool deleteOriginals = false,\n    Plane? basePlane = null)\n```\n\nThe ArtisanCustomProngs command, headless: copies `objectIds` (a custom prong modeled as a surface, polysurface, mesh or SubD; null = the current selection) onto every Artisan prong in `prongIds` (null = every prong in the document), mapping from the source's base plane (bottom-centre of its bounding box on the active CPlane, or `basePlane` when given) to each prong's base plane. `scale` is the command's option: NO (default, copy as-is), 1D (height only), 2D (width only, from the prong diameter) or 3D (uniform, from the prong diameter). `moveInZ` lifts each copy along its prong axis in mm; `deleteOriginals` removes the replaced Artisan prongs. Returns the ids of the copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `prongIds` | `IEnumerable ` | `null` |\n| `scale` | `string` | `null` |\n| `moveInZ` | `double` | `0` |\n| `deleteOriginals` | `bool` | `false` |\n| `basePlane` | `Plane?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ProngApi","section":"CustomProngs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#customprongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#customprongs","collection":"scripting","hash":"7d651a2a757aa69d4e73052fd7f274cd","indexed_by":"docs-index"}},{"content":"ProngApi — DynamicProngs\n\n```csharp\nIReadOnlyList<Guid> ProngApi.DynamicProngs(\n    IEnumerable<Guid> baseIds,\n    IEnumerable<Point3d> points,\n    string mode = null,\n    double diameter = 0,\n    double diameterTop = 0,\n    double diameterMid = 0,\n    double diameterBottom = 0,\n    double heightOverGirdle = 0,\n    double heightUnderGirdle = 0,\n    double extensionForManufacturing = 0,\n    double minDiameter = 0,\n    double gemInside = double.NaN,\n    bool flip = false,\n    string symmetry = null)\n```\n\nThe ArtisanDynamicProngs panel, headless: drops one loose prong at each of `points`, seated on the closest point of `baseIds` (surfaces, polysurfaces or meshes; null = the current selection) and oriented by the face normal there. Millimetres; 0 keeps the tool default (or the user's saved prong defaults): BASIC mode with diameter 0.8, heightOverGirdle 0.6, heightUnderGirdle 1, extensionForManufacturing 0.8. `mode` BASIC (one diameter), ADVANCED (diameterTop/Mid/Bottom) or AUTOMATIC (minDiameter + gemInside); omitted = saved mode, or ADVANCED when a top/mid/bottom diameter is given. `flip` turns the prongs upside down; `symmetry` NONE (default), X, Y or XY mirrors each prong across the world YZ / ZX planes like the panel combo. Returns the ids of the new prongs (one group, metal layer).","metadata":{"title":"ProngApi","section":"DynamicProngs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#dynamicprongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#dynamicprongs","collection":"scripting","hash":"bf189f242fe6a54ef5cd96734c628ccc","indexed_by":"docs-index"}},{"content":"ProngApi — DynamicProngs\n\n| Parameter | Type | Default |\n|---|---|---|\n| `baseIds` | `IEnumerable ` | required |\n| `points` | `IEnumerable ` | required |\n| `mode` | `string` | `null` |\n| `diameter` | `double` | `0` |\n| `diameterTop` | `double` | `0` |\n| `diameterMid` | `double` | `0` |\n| `diameterBottom` | `double` | `0` |\n| `heightOverGirdle` | `double` | `0` |\n| `heightUnderGirdle` | `double` | `0` |\n| `extensionForManufacturing` | `double` | `0` |\n| `minDiameter` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n| `flip` | `bool` | `false` |\n| `symmetry` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ProngApi","section":"DynamicProngs","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#dynamicprongs","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#dynamicprongs","collection":"scripting","hash":"5c11c3d03ffb9d1eb919c5f8c7ceb6ec","indexed_by":"docs-index"}},{"content":"ProngApi — ProngAxis\n\n```csharp\nIReadOnlyList<Guid> ProngApi.ProngAxis(\n    IEnumerable<Guid> gemIds = null,\n    int prongs = 0,\n    bool? straight = null,\n    double height = 0,\n    double gemInside = double.NaN,\n    double overGirdle = double.NaN,\n    double bottomRailInside = double.NaN)\n```\n\nThe ArtisanProngAxis panel, headless: for each gem in `gemIds` (null = the selected gems) draws the central axis line of every prong (curves only, no thickness) as one editable \"ProngAxis\" group per gem, ready for ArtisanEdit. 0 keeps the tool default (or the user's saved defaults): `prongs` 4, `height` 4 mm, `overGirdle` 0.3, `gemInside` 0, `bottomRailInside` 0; `straight` true (false = the axis rises vertically then leans in). Returns the ids of the created curves.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemIds` | `IEnumerable ` | `null` |\n| `prongs` | `int` | `0` |\n| `straight` | `bool?` | `null` |\n| `height` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n| `overGirdle` | `double` | `double.NaN` |\n| `bottomRailInside` | `double` | `double.NaN` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ProngApi","section":"ProngAxis","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#prongaxis","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/prong/#prongaxis","collection":"scripting","hash":"ae85f2c4818be90c99fe29c7ddecacd2","indexed_by":"docs-index"}},{"content":"RasterToVectorApi\n\nScriptable version of the ArtisanRaster2Vector tool: traces a bitmap image into Rhino curves with the embedded Potrace engine, without the panel / preview. Same parameters, same defaults, same output placement as the tool's Insert button (curves on the primary user layer, laid on the world XY plane starting at the origin).\n\n```python\nfrom ArtisanPlugin.Scripting import RasterToVectorApi\n```\n\nSee also the Python package, `ra.raster_to_vector`.","metadata":{"title":"RasterToVectorApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/raster-to-vector/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/raster-to-vector/","collection":"scripting","hash":"25f848551a52b443e882cc58a0b79fc3","indexed_by":"docs-index"}},{"content":"RasterToVectorApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Vectorizes the image at `path` and adds the traced curves to the document. |\n\nCreate\n```csharp\nIReadOnlyList<Guid> RasterToVectorApi.Create(\n    string path,\n    double threshold = 0.51,\n    int ignoreArea = 2,\n    double cornerThreshold = 1,\n    double tolerance = 0.2,\n    double targetWidth = 0)\n```\n\nVectorizes the image at `path` and adds the traced curves to the document. Returns the ids of the added curves. threshold 0..1 black/white cut (default 0.51). Lower keeps more dark detail, higher more of the image. ignoreArea speckles up to this many pixels are dropped (default 2) cornerThreshold Potrace alphamax: 0 = sharp polygons, higher = rounder (default 1.0) tolerance curve optimization tolerance (default 0.2) targetWidth if > 0, the result is uniformly scaled so its total width is exactly this many model units (e.g. fit a motif to 12 mm). 0 = the tool's native sizing (1 unit per 50 image pixels).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `threshold` | `double` | `0.51` |\n| `ignoreArea` | `int` | `2` |\n| `cornerThreshold` | `double` | `1` |\n| `tolerance` | `double` | `0.2` |\n| `targetWidth` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"RasterToVectorApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/raster-to-vector/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/raster-to-vector/#methods","collection":"scripting","hash":"726562ee36658a6aa8093588f17e0094","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi\n\nRealtime Render (the web-based viewer): open the window, push model updates, and drive the VIEWER's camera and materials by injecting JS against the web component's public methods through the window's WebView2. Everything here changes only the viewer, never the Rhino document -- for document-side render staging (pairs, materials, batch renders) see RenderApi; for Rhino/Cycles see RenderStudioApi.\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi\n```\n\nSee also the guide, Realtime Render, and the Python package, `ra.realtime_render`.","metadata":{"title":"RealtimeRenderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/","collection":"scripting","hash":"74bfaea75743e42e27b9327832933cf6","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — Methods\n\n| Method | |\n|---|---|\n| `CaptureViews` | Captures the 8 standard orbital views (front, back, left, right, three-quarter x2, top, bottom) as PNGs into `folder` -- one call, camera restored afterwards. |\n| `EditViewerMaterial` | Live-edits a catalog material everywhere it is currently applied: color (CSS color), roughness 0-1, ior (gems, ~1.4-2.4), opacity 0-1. |\n| `GetViewerItems` | JSON array with the viewer's parts and their current materials ([{uuid, material, ...}]). |\n| `RecordTurntable` | One-call 360: turns auto-rotation on, records `seconds` of video to `path`, and schedules the rotation back off inside the page when the recording ends -- the script needs no sleeps or timers. |\n| `SetMaterialByLayer` | Applies a viewer catalog material to every part on a layer. |\n| `SetViewerBackground` | Sets the viewer's background gradient. |\n| `SetViewerCamera` | Places the VIEWER camera at `position` looking at `target` (viewer/GLB coordinates, which match the Rhino model in mm). |\n| `SetViewerCameraPreset` | Moves the VIEWER camera to a named preset. |\n| `SetViewerEnvironment` | Sets the lighting environment: a preset name (studio, sunset, dawn, night, warehouse, forest, apartment, city, park, lobby) or an HDR/EXR URL. |\n| `SetViewerMaterial` | Changes one part's material in the viewer. |\n| `SetViewerOption` | Sets ANY single viewer option by its dot-path key -- backgrounds, bevel, jewelry shadows, AO, depth of field, bloom, vignette, caustics, studio lights, autoRotate... |\n| `SetViewerOptions` | Applies a batch of viewer options in one call. |\n| `ShowRealtimeRender` | Opens the Realtime Render window (or activates it when already open), same as the ArtisanRealtimeRender command -- which is hidden from the command list, so this is the only scriptable way in. |","metadata":{"title":"RealtimeRenderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#methods","collection":"scripting","hash":"8fc900b18d401f5b7c41840e797604ed","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — Methods\n\n| Method | |\n|---|---|\n| `StartVideoRecording` | Starts recording the viewer to a video file. |\n| `StopVideoRecording` | Stops a manual recording started with seconds = 0; the file is then written to the path given to StartVideoRecording. |\n| `UpdateRender` | Re-exports the current document to the viewer (the ArtisanRenderUpdate command). |\n| `ViewerScreenshot` | Saves a PNG of the current viewer frame to `path` and returns the full path written (\".png\" appended when missing). |\n| `ViewerZoomExtents` | Frames the whole model in the viewer. |","metadata":{"title":"RealtimeRenderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#methods","collection":"scripting","hash":"26f545746d3d914123fc72062cf73e04","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — CaptureViews\n\n```csharp\nstring RealtimeRenderApi.CaptureViews(string folder, int width = 0, int height = 0)\n```\n\nCaptures the 8 standard orbital views (front, back, left, right, three-quarter x2, top, bottom) as PNGs into `folder` -- one call, camera restored afterwards. Returns the paths written, one per line. Slow: expect a few seconds; the call waits up to 2 minutes.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `folder` | `string` | required |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n\nReturns `string`.","metadata":{"title":"RealtimeRenderApi","section":"CaptureViews","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#captureviews","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#captureviews","collection":"scripting","hash":"5c9b648a5f9f09931a45959ee435468a","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — EditViewerMaterial\n\n```csharp\nvoid RealtimeRenderApi.EditViewerMaterial(\n    string materialName,\n    string color = null,\n    double roughness = -1,\n    double ior = -1,\n    double opacity = -1)\n```\n\nLive-edits a catalog material everywhere it is currently applied: color (CSS color), roughness 0-1, ior (gems, ~1.4-2.4), opacity 0-1. Pass null/negative to leave a property untouched. The edit is ephemeral -- re-applying the material from the catalog resets it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `materialName` | `string` | required |\n| `color` | `string` | `null` |\n| `roughness` | `double` | `-1` |\n| `ior` | `double` | `-1` |\n| `opacity` | `double` | `-1` |","metadata":{"title":"RealtimeRenderApi","section":"EditViewerMaterial","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#editviewermaterial","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#editviewermaterial","collection":"scripting","hash":"3a2f8415edb489d6aa25c9f5042a52fd","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — GetViewerItems\n\n```csharp\nstring RealtimeRenderApi.GetViewerItems()\n```\n\nJSON array with the viewer's parts and their current materials ([{uuid, material, ...}]). Call this FIRST to learn the part names (uuids) to pass to SetViewerMaterial.\n\nReturns `string`.\n\nRecordTurntable\n```csharp\nstring RealtimeRenderApi.RecordTurntable(\n    string path,\n    double seconds = 8,\n    int width = 0,\n    int height = 0,\n    int frameRate = 0)\n```\n\nOne-call 360: turns auto-rotation on, records `seconds` of video to `path`, and schedules the rotation back off inside the page when the recording ends -- the script needs no sleeps or timers. Returns the path armed; the file appears when the recording finishes.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `seconds` | `double` | `8` |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n| `frameRate` | `int` | `0` |\n\nReturns `string`.","metadata":{"title":"RealtimeRenderApi","section":"GetViewerItems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#getvieweritems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#getvieweritems","collection":"scripting","hash":"24ecc0d3fcaa6921ae0601547168249d","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetMaterialByLayer\n\n```csharp\nint RealtimeRenderApi.SetMaterialByLayer(string layerName, string materialName)\n```\n\nApplies a viewer catalog material to every part on a layer. `layerName` matches the viewer item's layer or name, case-insensitive and treating spaces and underscores as equal -- so \"METAL_01\", \"metal 01\" and \"Metal 01\" all hit the Rhino layer \"Metal 01\". Returns how many parts changed; throws listing the available layers when nothing matches. Viewer-only: the Rhino document is untouched.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n| `materialName` | `string` | required |\n\nReturns `int`.","metadata":{"title":"RealtimeRenderApi","section":"SetMaterialByLayer","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setmaterialbylayer","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setmaterialbylayer","collection":"scripting","hash":"36cb943e27f0b663fb02f915ca78a040","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerBackground\n\n```csharp\nvoid RealtimeRenderApi.SetViewerBackground(string topColor, string bottomColor = null)\n```\n\nSets the viewer's background gradient. Colors are CSS colors (\"#1a1a2e\", \"white\"...). Pass null/empty to leave one end unchanged.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `topColor` | `string` | required |\n| `bottomColor` | `string` | `null` |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerBackground","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewerbackground","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewerbackground","collection":"scripting","hash":"122caeb1ea611dfcfa330d0b71473d60","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerCamera\n\n```csharp\nvoid RealtimeRenderApi.SetViewerCamera(Point3d position, Point3d target)\n```\n\nPlaces the VIEWER camera at `position` looking at `target` (viewer/GLB coordinates, which match the Rhino model in mm).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `position` | `Point3d` | required |\n| `target` | `Point3d` | required |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerCamera","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewercamera","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewercamera","collection":"scripting","hash":"6bb7feb97e5529c7358e037248293526","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerCameraPreset\n\n```csharp\nvoid RealtimeRenderApi.SetViewerCameraPreset(string preset)\n```\n\nMoves the VIEWER camera to a named preset. Valid presets: front, back, left, right, top, bottom, three-quarter, three-quarter-left, detail, dramatic-low. The preset frames the model automatically.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `preset` | `string` | required |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerCameraPreset","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewercamerapreset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewercamerapreset","collection":"scripting","hash":"ba4d6494ebc5f7d1d09674c905c22084","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerEnvironment\n\n```csharp\nvoid RealtimeRenderApi.SetViewerEnvironment(string presetOrUrl, double intensity = 0)\n```\n\nSets the lighting environment: a preset name (studio, sunset, dawn, night, warehouse, forest, apartment, city, park, lobby) or an HDR/EXR URL. `intensity` > 0 also sets the environment intensity (1 = neutral).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `presetOrUrl` | `string` | required |\n| `intensity` | `double` | `0` |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerEnvironment","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewerenvironment","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewerenvironment","collection":"scripting","hash":"61e68b3f3080f1bcde1651b22be5324d","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerMaterial\n\n```csharp\nvoid RealtimeRenderApi.SetViewerMaterial(string partUuid, string materialName)\n```\n\nChanges one part's material in the viewer. `partUuid` comes from GetViewerItems(); `materialName` is a viewer catalog name (e.g. \"YELLOW_GOLD\", \"WHITE_GOLD\", \"PLATINUM\", \"DIAMOND\", \"RUBY\"). Viewer-only: the Rhino document is not modified.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `partUuid` | `string` | required |\n| `materialName` | `string` | required |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerMaterial","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewermaterial","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setviewermaterial","collection":"scripting","hash":"dec701a49e5370155e3852b739268661","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerOption\n\n```csharp\nvoid RealtimeRenderApi.SetViewerOption(string path, string value)\n```\n\nSets ANY single viewer option by its dot-path key -- backgrounds, bevel, jewelry shadows, AO, depth of field, bloom, vignette, caustics, studio lights, autoRotate... `value` is parsed as bool, number or string (\"true\", \"0.4\", \"#ffffff\").\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `value` | `string` | required |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerOption","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setvieweroption","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setvieweroption","collection":"scripting","hash":"a30feeda51029f5f70e468afe560607a","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — SetViewerOptions\n\n```csharp\nvoid RealtimeRenderApi.SetViewerOptions(string optionsJson)\n```\n\nApplies a batch of viewer options in one call. `optionsJson` is a JSON object of option keys to values, e.g. {\"effectComposerBloomEnabled\":true,\"effectComposerBloomIntensity\":0.6}.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `optionsJson` | `string` | required |","metadata":{"title":"RealtimeRenderApi","section":"SetViewerOptions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setvieweroptions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#setvieweroptions","collection":"scripting","hash":"b028ef91a3e9db3495cea19181656532","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — ShowRealtimeRender\n\n```csharp\nbool RealtimeRenderApi.ShowRealtimeRender()\n```\n\nOpens the Realtime Render window (or activates it when already open), same as the ArtisanRealtimeRender command -- which is hidden from the command list, so this is the only scriptable way in.\n\nReturns `bool`.\n\nStartVideoRecording\n```csharp\nstring RealtimeRenderApi.StartVideoRecording(\n    string path,\n    double seconds = 0,\n    int width = 0,\n    int height = 0,\n    int frameRate = 0)\n```\n\nStarts recording the viewer to a video file. `seconds` > 0 stops and saves automatically after that long; 0 records until StopVideoRecording(). The finished file lands at `path` (the window reroutes the viewer's download there). The viewer picks the codec: mp4 (h264) when the OS supports it, webm otherwise -- keep \".mp4\".\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `seconds` | `double` | `0` |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n| `frameRate` | `int` | `0` |\n\nReturns `string`.","metadata":{"title":"RealtimeRenderApi","section":"ShowRealtimeRender","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#showrealtimerender","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#showrealtimerender","collection":"scripting","hash":"16d58c090c961f40d348ab53a2000ee2","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — StopVideoRecording\n\n```csharp\nvoid RealtimeRenderApi.StopVideoRecording()\n```\n\nStops a manual recording started with seconds = 0; the file is then written to the path given to StartVideoRecording. Saving is asynchronous -- give it a moment before reading the file.\n\nUpdateRender\n```csharp\nvoid RealtimeRenderApi.UpdateRender()\n```\n\nRe-exports the current document to the viewer (the ArtisanRenderUpdate command). The export runs in the background; this returns as soon as it is queued. Requires the Realtime Render window to be open -- throws a clear error otherwise (the command only logged it, which a script would never see).","metadata":{"title":"RealtimeRenderApi","section":"StopVideoRecording","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#stopvideorecording","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#stopvideorecording","collection":"scripting","hash":"4541fa5bd09fcefb6fd4d17f48ed7974","indexed_by":"docs-index"}},{"content":"RealtimeRenderApi — ViewerScreenshot\n\n```csharp\nstring RealtimeRenderApi.ViewerScreenshot(string path)\n```\n\nSaves a PNG of the current viewer frame to `path` and returns the full path written (\".png\" appended when missing).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n\nReturns `string`.\n\nViewerZoomExtents\n```csharp\nvoid RealtimeRenderApi.ViewerZoomExtents()\n```\n\nFrames the whole model in the viewer.","metadata":{"title":"RealtimeRenderApi","section":"ViewerScreenshot","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#viewerscreenshot","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/realtime-render/#viewerscreenshot","collection":"scripting","hash":"c11a899a615607539f2652a41d621cc7","indexed_by":"docs-index"}},{"content":"RelationsApi\n\nThe parametric RELATIONS between Artisan objects: the mother/child adoption the engine keeps (a bezel follows its gem, a rope its curve) and the \"apply this element to other mothers\" command. Every method here calls LicenseGate.RequireValid() first and ends with a viewport redraw.\n\n```python\nfrom ArtisanPlugin.Scripting import RelationsApi\n```\n\nSee also the Python package, `ra.relations`.","metadata":{"title":"RelationsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/","collection":"scripting","hash":"fa0ec30c5f182756407b8b6f7e0b1c93","indexed_by":"docs-index"}},{"content":"RelationsApi — Methods\n\n| Method | |\n|---|---|\n| `ApplyElement` | The ArtisanApplyElement command, headless: takes the parameters of one existing Artisan element in the document (`sourceId`: a member of a parametric group -- Halo, Cluster, Basket, AdvancedBasket, Tulip, Martini, TrellisGemset, Gems on Curve, Advanced Gems on Curve, MicroSetting -- or a parametric custom object: Bezel, Cutter, Peghead, Rope, Milgrain, SmartProfile) and builds the same element on each target mother, with the very bake of the command (group + RaObjectUserData, metal materials, gems layer...). |\n| `MeetMothersAndChildren` | Re-matches every parametric child with its mother, exactly like the ArtisanRefreshRelations command (and the Yes branch of ArtisanMeetMothersAndChildrenCommand): each bezel, cutter, halo, rope... |","metadata":{"title":"RelationsApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#methods","collection":"scripting","hash":"658b7e0e4303251f8390eaa50ee751f3","indexed_by":"docs-index"}},{"content":"RelationsApi — ApplyElement\n\n```csharp\nIReadOnlyList<Guid> RelationsApi.ApplyElement(Guid sourceId, IEnumerable<Guid> targetIds)\n```\n\nThe ArtisanApplyElement command, headless: takes the parameters of one existing Artisan element in the document (`sourceId`: a member of a parametric group -- Halo, Cluster, Basket, AdvancedBasket, Tulip, Martini, TrellisGemset, Gems on Curve, Advanced Gems on Curve, MicroSetting -- or a parametric custom object: Bezel, Cutter, Peghead, Rope, Milgrain, SmartProfile) and builds the same element on each target mother, with the very bake of the command (group + RaObjectUserData, metal materials, gems layer...). Targets are gems for the gem-based elements and curves for the curve-based ones (Rope, Milgrain, SmartProfile, Gems on Curve); a MicroSetting takes the whole target list as ONE gem row. This is \"copy the setting of that gem onto these gems\" -- it reads the element in the document, not the saved library (see ElementsApi for presets). Returns the ids of every object created (the members of each new element).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `sourceId` | `Guid` | required |\n| `targetIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"RelationsApi","section":"ApplyElement","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#applyelement","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#applyelement","collection":"scripting","hash":"1da3de81cf13350ba35e2515d185eb18","indexed_by":"docs-index"}},{"content":"RelationsApi — MeetMothersAndChildren\n\n```csharp\nvoid RelationsApi.MeetMothersAndChildren()\n```\n\nRe-matches every parametric child with its mother, exactly like the ArtisanRefreshRelations command (and the Yes branch of ArtisanMeetMothersAndChildrenCommand): each bezel, cutter, halo, rope... re-adopts the nearest gem / curve as mother, so children moved or copied with native Rhino commands follow the right mother again. This is NOT DocumentApi.RefreshAll (that regenerates the geometry of pending children); run this first, then RefreshAll if the geometry must be rebuilt. The transform facades already run it.","metadata":{"title":"RelationsApi","section":"MeetMothersAndChildren","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#meetmothersandchildren","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relations/#meetmothersandchildren","collection":"scripting","hash":"20997fa886a9aaaa45d2688ca0325a92","indexed_by":"docs-index"}},{"content":"ReliefApi\n\nThe ArtisanRelief system, headless: 2.5D height-field reliefs built from an ordered stack of operations (curve profiles, flat extrusions, image height maps, 3D textures, projected geometry) merged with per-pixel combine modes and meshed as an open relief or a closed solid. Two ways to use it: * One-shot creators (CreateFromImage / CreateFromCurves / CreateFromGeometry): build a single-operation relief and bake the mesh in one call. They work on a transient project and leave the document's saved ArtisanRelief project untouched. * The project stack (SetupProject, Add*, Operations, Bake...): edits the SAME per-document project the ArtisanRelief panel uses (persisted in the .3dm), so a script can build a multi-layer relief that the user can then keep refining in the panel — and vice versa. NOTE: while the ArtisanRelief panel is open it holds its own copy of the project and saves it on close, overwriting scripted changes; close the panel before scripting the project stack. Whatever route is taken, baking produces a ReliefCustomObject: the mesh carries a copy of the project that built it, so it shows up in the outliner and can be re-edited on its own. The per-document project above is the shared scratch pad for work in progress, not the record of a baked relief. All lengths are in model units (mm in a standard Artisan document). Interactive-only features stay out of this facade: the live GPU/mesh preview conduits and the graphical profile editor. The Sculpt and Smooth brushes ARE scriptable (AddSculpt/AddSmooth dab programmatically), and brush operations painted in the panel are honored by Bake and can be toggled/removed here.\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi\n```\n\nSee also the guide, Relief, and the Python package, `ra.relief`.","metadata":{"title":"ReliefApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/","collection":"scripting","hash":"57082f1e083d0f87dd06a3e700e81742","indexed_by":"docs-index"}},{"content":"ReliefApi — Methods\n\n| Method | |\n|---|---|\n| `AddCarbon` | Adds a carbon copy (rubbing) operation: an image laid over the workbench (centred, aspect kept, like AddImage) that shows only where the brush has rubbed. |\n| `AddExtrude` | Adds a flat extrusion operation: closed curves raised to a constant height (0 = default 1.0; negative engraves), with an optional feathered edge in model units. |\n| `AddGeometry` | Adds a projected-geometry operation (parameters as in CreateFromGeometry). |\n| `AddImage` | Adds an image height-map operation (parameters as in CreateFromImage; clipCurveIds are optional closed curves the image fits and is clipped to). |\n| `AddProfile` | Adds a profile (puffed) operation to the document's relief project. |\n| `AddSculpt` | Adds a sculpt (brush) operation dabbed programmatically: one smooth dab per point, each raising (or carving, negative height) the field by up to `height` mm at its center. |\n| `AddSmooth` | Adds a smooth (brush) operation dabbed programmatically: everything below it in the stack is blurred where the painted mask says so -- the panel's Smooth brush, headless. |\n| `AddTexture` | Adds a tiled 3D-texture operation from the Textures3D library. |\n| `Bake` | Recomputes the saved project at full resolution and bakes the output mesh into the document (the panel's Accept, headless). |\n| `ClearProject` | Deletes the document's saved relief project entirely (settings and all operations). |\n| `CreateFromCurves` | Bakes a relief mesh from closed curves filled with a height profile (the classic puffed relief) in one call, without touching the document's saved relief project. |","metadata":{"title":"ReliefApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#methods","collection":"scripting","hash":"74f6a77d6d8faaa40e910a3ff595af63","indexed_by":"docs-index"}},{"content":"ReliefApi — Methods\n\n| Method | |\n|---|---|\n| `CreateFromGeometry` | Bakes a relief mesh from document geometry (meshes, breps, extrusions, SubDs) projected top-down onto the workbench — the height of each object above the plane becomes the relief. |\n| `CreateFromImage` | Bakes a relief mesh from a grayscale image height map (white = highest) in one call, without touching the document's saved relief project. |\n| `ExportHeightmap` | Recomputes the saved project at full resolution and writes it as a 16-bit grayscale TIFF height map (black = lowest point), for CNC/CAM pipelines. |\n| `GetProject` | The document's saved relief project settings; Exists=false (all zeros) when the document has none. |\n| `MoveOperation` | Moves one operation to a new position in the stack (0 = first applied). |\n| `Operations` | The saved project's operation stack in apply order; empty list when the document has no project. |\n| `ProfileNames` | Names accepted by the \"profile\" parameter of profile operations: the four built-in presets (Round, Smooth, Chamfer, Plateau) followed by the user's saved custom profiles. |\n| `RemoveOperation` | Removes one operation from the saved project. |\n| `SetOperationCombine` | Changes how one operation merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply). |\n| `SetOperationEnabled` | Enables or disables one operation of the saved project (the panel's eye toggle); disabled operations are skipped by Bake. |\n| `SetupProject` | Creates the document's relief project — or reconfigures its settings, keeping the existing operation stack. |","metadata":{"title":"ReliefApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#methods","collection":"scripting","hash":"127330360cdce01d8399a6132a8133da","indexed_by":"docs-index"}},{"content":"ReliefApi — AddCarbon\n\n```csharp\nGuid ReliefApi.AddCarbon(\n    string imagePath,\n    IEnumerable<Point3d> points,\n    double radius = 0,\n    double strength = 0,\n    double height = 0,\n    bool invert = false,\n    double baseRadius = 0,\n    double scale = 0,\n    double offsetX = 0,\n    double offsetY = 0,\n    string combine = null,\n    string name = null)\n```\n\nAdds a carbon copy (rubbing) operation: an image laid over the workbench (centred, aspect kept, like AddImage) that shows only where the brush has rubbed. The strokes are dabbed programmatically, one dab per point, each adding up to `strength` coverage at its centre; the panel's Carbon brush can keep rubbing (or Ctrl-erasing) afterwards. imagePath image file; brightness -> height like AddImage. points world points to rub; at least one. radius dab radius in model units (0 = 2.0). strength 0-1 coverage per dab (0 = 1.0, full). height height at pure white in mm (0 = 0.5). invert flip brightness. baseRadius mm of broad tones (lighting, vignette) removed from the image before rubbing (0 = 2.0; pass a negative value for none). scale multiplier over the fitted size (0 = 1.0). offsetX/Y shift of the image centre from the workbench centre, mm. Returns the operation's Guid. Nothing is baked until Bake().\n\n| Parameter | Type | Default |\n|---|---|---|\n| `imagePath` | `string` | required |\n| `points` | `IEnumerable ` | required |\n| `radius` | `double` | `0` |\n| `strength` | `double` | `0` |\n| `height` | `double` | `0` |\n| `invert` | `bool` | `false` |\n| `baseRadius` | `double` | `0` |\n| `scale` | `double` | `0` |\n| `offsetX` | `double` | `0` |\n| `offsetY` | `double` | `0` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddCarbon","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addcarbon","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addcarbon","collection":"scripting","hash":"a4eb59da55fbfabe3c54e4fcbfc870b9","indexed_by":"docs-index"}},{"content":"ReliefApi — AddExtrude\n\n```csharp\nGuid ReliefApi.AddExtrude(\n    IEnumerable<Guid> curveIds,\n    double height = 0,\n    double feather = 0,\n    string combine = null,\n    string name = null)\n```\n\nAdds a flat extrusion operation: closed curves raised to a constant height (0 = default 1.0; negative engraves), with an optional feathered edge in model units. Returns the operation's Guid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `feather` | `double` | `0` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddExtrude","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addextrude","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addextrude","collection":"scripting","hash":"250a2d378d0cd96252fc455ea3692794","indexed_by":"docs-index"}},{"content":"ReliefApi — AddGeometry\n\n```csharp\nGuid ReliefApi.AddGeometry(\n    IEnumerable<Guid> objectIds,\n    double feather = 0,\n    string combine = null,\n    string name = null)\n```\n\nAdds a projected-geometry operation (parameters as in CreateFromGeometry). Returns the operation's Guid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `feather` | `double` | `0` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddGeometry","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addgeometry","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addgeometry","collection":"scripting","hash":"9327eed0f79dd22e6629aa4f3cb0fa80","indexed_by":"docs-index"}},{"content":"ReliefApi — AddImage\n\n```csharp\nGuid ReliefApi.AddImage(\n    string imagePath,\n    double height = 0,\n    bool invert = false,\n    double scale = 0,\n    IEnumerable<Guid> clipCurveIds = null,\n    string combine = null,\n    string name = null)\n```\n\nAdds an image height-map operation (parameters as in CreateFromImage; clipCurveIds are optional closed curves the image fits and is clipped to). Returns the operation's Guid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `imagePath` | `string` | required |\n| `height` | `double` | `0` |\n| `invert` | `bool` | `false` |\n| `scale` | `double` | `0` |\n| `clipCurveIds` | `IEnumerable ` | `null` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddImage","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addimage","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addimage","collection":"scripting","hash":"86e3aa089998ac09d744da697d6d57f8","indexed_by":"docs-index"}},{"content":"ReliefApi — AddProfile\n\n```csharp\nGuid ReliefApi.AddProfile(\n    IEnumerable<Guid> curveIds,\n    double height = 0,\n    string profile = null,\n    double startingHeight = 0,\n    double fixedProfileWidth = 0,\n    double feather = 0,\n    string combine = null,\n    string name = null)\n```\n\nAdds a profile (puffed) operation to the document's relief project. Parameters as in CreateFromCurves; combine sets how the layer merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply); name labels the card in the panel (null = auto \"Profile N\"). If the document has no project yet, one is created auto-fitted to the curves — call SetupProject first to control the workbench. Nothing is baked until Bake(). Returns the operation's Guid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `startingHeight` | `double` | `0` |\n| `fixedProfileWidth` | `double` | `0` |\n| `feather` | `double` | `0` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addprofile","collection":"scripting","hash":"5466708698fa928de61cdbf3da8595ab","indexed_by":"docs-index"}},{"content":"ReliefApi — AddSculpt\n\n```csharp\nGuid ReliefApi.AddSculpt(\n    IEnumerable<Point3d> points,\n    double radius = 0,\n    double height = 0,\n    string combine = null,\n    string name = null)\n```\n\nAdds a sculpt (brush) operation dabbed programmatically: one smooth dab per point, each raising (or carving, negative height) the field by up to `height` mm at its center. The same operation the panel's Sculpt brush paints -- editable, reorderable and re-dabbable in the panel afterwards. Points are projected onto the workbench plane, so sample a curve and pass the points to \"stroke\" along it. points world points to dab; at least one. radius dab radius in model units (0 = 2.0). height signed height per dab in model units (0 = 0.5); dabs on the same spot accumulate, like brush passes. combine how the layer merges into the stack (default Add). Returns the operation's Guid. Nothing is baked until Bake().\n\n| Parameter | Type | Default |\n|---|---|---|\n| `points` | `IEnumerable ` | required |\n| `radius` | `double` | `0` |\n| `height` | `double` | `0` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddSculpt","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addsculpt","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addsculpt","collection":"scripting","hash":"4b13b5495208f4ffb4c048cc517e416f","indexed_by":"docs-index"}},{"content":"ReliefApi — AddSmooth\n\n```csharp\nGuid ReliefApi.AddSmooth(\n    IEnumerable<Point3d> points,\n    double radius = 0,\n    double strength = 0,\n    double blurRadius = 0,\n    string name = null)\n```\n\nAdds a smooth (brush) operation dabbed programmatically: everything below it in the stack is blurred where the painted mask says so -- the panel's Smooth brush, headless. In-place by nature: it filters the accumulated field instead of contributing a layer, so it has no combine mode. points world points to dab; at least one. radius dab radius in model units (0 = 2.0). strength 0-1 mask strength per dab (0 = 1.0, full smoothing). blurRadius blur kernel radius in model units (0 = 1.0). Returns the operation's Guid. Nothing is baked until Bake().\n\n| Parameter | Type | Default |\n|---|---|---|\n| `points` | `IEnumerable ` | required |\n| `radius` | `double` | `0` |\n| `strength` | `double` | `0` |\n| `blurRadius` | `double` | `0` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddSmooth","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addsmooth","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addsmooth","collection":"scripting","hash":"52d1a1a3aa517b68f2a0bde463dd4a09","indexed_by":"docs-index"}},{"content":"ReliefApi — AddTexture\n\n```csharp\nGuid ReliefApi.AddTexture(\n    string textureName,\n    double height = 0,\n    double tilesU = 0,\n    double tilesV = 0,\n    bool invert = false,\n    IEnumerable<Guid> clipCurveIds = null,\n    string combine = null,\n    string name = null)\n```\n\nAdds a tiled 3D-texture operation from the Textures3D library. textureName filename inside the library (e.g. \"KNURL01.jpg\"); see the Texture3D smart component for the available set. height height at pure white in model units (0 = default 0.5). tilesU/V repetitions across the workbench or the clip-curve bounds (0 = default 4). clipCurveIds optional closed curves to clip the texture to. Returns the operation's Guid.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `textureName` | `string` | required |\n| `height` | `double` | `0` |\n| `tilesU` | `double` | `0` |\n| `tilesV` | `double` | `0` |\n| `invert` | `bool` | `false` |\n| `clipCurveIds` | `IEnumerable ` | `null` |\n| `combine` | `string` | `null` |\n| `name` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"AddTexture","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addtexture","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#addtexture","collection":"scripting","hash":"5f269501b1c47cdf7c7fc90a282b3f5c","indexed_by":"docs-index"}},{"content":"ReliefApi — Bake\n\n```csharp\nGuid ReliefApi.Bake()\n```\n\nRecomputes the saved project at full resolution and bakes the output mesh into the document (the panel's Accept, headless). The project stays in the document so it can be re-edited and re-baked. Returns the Guid of the baked mesh.\n\nReturns `Guid`.\n\nClearProject\n```csharp\nvoid ReliefApi.ClearProject()\n```\n\nDeletes the document's saved relief project entirely (settings and all operations). Baked meshes are ordinary meshes and are not touched.","metadata":{"title":"ReliefApi","section":"Bake","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#bake","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#bake","collection":"scripting","hash":"df3ecfdab2a983afd4877b96410fe469","indexed_by":"docs-index"}},{"content":"ReliefApi — CreateFromCurves\n\n```csharp\nGuid ReliefApi.CreateFromCurves(\n    IEnumerable<Guid> curveIds,\n    double height = 0,\n    string profile = null,\n    double startingHeight = 0,\n    double fixedProfileWidth = 0,\n    double feather = 0,\n    double worldWidth = 0,\n    double worldHeight = 0,\n    int resolution = 0,\n    Plane? workbench = null,\n    bool solid = true,\n    double capDistance = 0,\n    bool deleteBase = false)\n```\n\nBakes a relief mesh from closed curves filled with a height profile (the classic puffed relief) in one call, without touching the document's saved relief project. curveIds closed curves to fill; at least one. height peak height in model units (0 = default 1.0); negative engraves. profile cross-section name from ProfileNames() (null/\"\" = \"Round\"). startingHeight Z offset where the profile takes off (default 0). fixedProfileWidth 0 = inflate: the profile peaks at the deepest point of the curve set; > 0 = the profile spans exactly this width from the curve edge, in model units. feather edge blend distance in model units (0 = hard edge). worldWidth/Height, resolution, workbench, solid, capDistance, deleteBase as in CreateFromImage. Returns the Guid of the baked mesh.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `height` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `startingHeight` | `double` | `0` |\n| `fixedProfileWidth` | `double` | `0` |\n| `feather` | `double` | `0` |\n| `worldWidth` | `double` | `0` |\n| `worldHeight` | `double` | `0` |\n| `resolution` | `int` | `0` |\n| `workbench` | `Plane?` | `null` |\n| `solid` | `bool` | `true` |\n| `capDistance` | `double` | `0` |\n| `deleteBase` | `bool` | `false` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"CreateFromCurves","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromcurves","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromcurves","collection":"scripting","hash":"9d3e253d136e71f2a1763471ebc28456","indexed_by":"docs-index"}},{"content":"ReliefApi — CreateFromGeometry\n\n```csharp\nGuid ReliefApi.CreateFromGeometry(\n    IEnumerable<Guid> objectIds,\n    double feather = 0,\n    double worldWidth = 0,\n    double worldHeight = 0,\n    int resolution = 0,\n    Plane? workbench = null,\n    bool solid = true,\n    double capDistance = 0,\n    bool deleteBase = false)\n```\n\nBakes a relief mesh from document geometry (meshes, breps, extrusions, SubDs) projected top-down onto the workbench — the height of each object above the plane becomes the relief. One call, without touching the document's saved relief project. objectIds objects to project; at least one. feather edge blend distance in model units (0 = hard edge). worldWidth/Height, resolution, workbench, solid, capDistance, deleteBase as in CreateFromImage (auto-fit covers the objects). Returns the Guid of the baked mesh.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `feather` | `double` | `0` |\n| `worldWidth` | `double` | `0` |\n| `worldHeight` | `double` | `0` |\n| `resolution` | `int` | `0` |\n| `workbench` | `Plane?` | `null` |\n| `solid` | `bool` | `true` |\n| `capDistance` | `double` | `0` |\n| `deleteBase` | `bool` | `false` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"CreateFromGeometry","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromgeometry","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromgeometry","collection":"scripting","hash":"8e375c6a299eac6190633ab560fd8179","indexed_by":"docs-index"}},{"content":"ReliefApi — CreateFromImage\n\n```csharp\nGuid ReliefApi.CreateFromImage(\n    string imagePath,\n    double height = 0,\n    bool invert = false,\n    double scale = 0,\n    IEnumerable<Guid> regionCurveIds = null,\n    double worldWidth = 0,\n    double worldHeight = 0,\n    int resolution = 0,\n    Plane? workbench = null,\n    bool solid = true,\n    double capDistance = 0,\n    bool deleteBase = false)\n```\n\nBakes a relief mesh from a grayscale image height map (white = highest) in one call, without touching the document's saved relief project. imagePath PNG/JPG/BMP/TIFF file; pixel brightness maps to height. height height at pure white in model units (0 = default 1.0); negative engraves. invert true maps black to the highest point. scale multiplier over the fitted image size (0 = default 1.0). regionCurveIds closed planar curves; the image fits their bounds and is clipped to their interior. null/empty = image centered on the workbench keeping its aspect ratio. worldWidth/Height workbench size in model units (0 = fit the region curves with a 10% margin, or 50 when there are none). resolution grid nodes along the larger side, 64-4096 (0 = 512). workbench plane the relief sits on, grid centered at its origin (null = world XY, auto-centered on the region curves). solid true (default) bakes a closed solid; false an open mesh. capDistance solid thickness below the base plane (0 = default 1.0). deleteBase true trims away grid cells no operation touched. Returns the Guid of the baked mesh.","metadata":{"title":"ReliefApi","section":"CreateFromImage","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromimage","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromimage","collection":"scripting","hash":"15d9f3e6d8e8bef68f9783b235919606","indexed_by":"docs-index"}},{"content":"ReliefApi — CreateFromImage\n\n| Parameter | Type | Default |\n|---|---|---|\n| `imagePath` | `string` | required |\n| `height` | `double` | `0` |\n| `invert` | `bool` | `false` |\n| `scale` | `double` | `0` |\n| `regionCurveIds` | `IEnumerable ` | `null` |\n| `worldWidth` | `double` | `0` |\n| `worldHeight` | `double` | `0` |\n| `resolution` | `int` | `0` |\n| `workbench` | `Plane?` | `null` |\n| `solid` | `bool` | `true` |\n| `capDistance` | `double` | `0` |\n| `deleteBase` | `bool` | `false` |\n\nReturns `Guid`.","metadata":{"title":"ReliefApi","section":"CreateFromImage","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromimage","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#createfromimage","collection":"scripting","hash":"6a108a718afb7a6c323817282179f9fb","indexed_by":"docs-index"}},{"content":"ReliefApi — ExportHeightmap\n\n```csharp\nvoid ReliefApi.ExportHeightmap(string filePath)\n```\n\nRecomputes the saved project at full resolution and writes it as a 16-bit grayscale TIFF height map (black = lowest point), for CNC/CAM pipelines. filePath should end in .tif/.tiff.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `filePath` | `string` | required |","metadata":{"title":"ReliefApi","section":"ExportHeightmap","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#exportheightmap","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#exportheightmap","collection":"scripting","hash":"06e780d71b6f176b122bcb72f0b188e7","indexed_by":"docs-index"}},{"content":"ReliefApi — GetProject\n\n```csharp\nReliefProjectInfo ReliefApi.GetProject()\n```\n\nThe document's saved relief project settings; Exists=false (all zeros) when the document has none. Read-only.\n\nReturns `ReliefProjectInfo`.\n\nMoveOperation\n```csharp\nvoid ReliefApi.MoveOperation(Guid operationId, int newIndex)\n```\n\nMoves one operation to a new position in the stack (0 = first applied).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `operationId` | `Guid` | required |\n| `newIndex` | `int` | required |","metadata":{"title":"ReliefApi","section":"GetProject","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#getproject","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#getproject","collection":"scripting","hash":"bea4295706805c97caab2fc4b34296cc","indexed_by":"docs-index"}},{"content":"ReliefApi — Operations\n\n```csharp\nIReadOnlyList<ReliefOperationInfo> ReliefApi.Operations()\n```\n\nThe saved project's operation stack in apply order; empty list when the document has no project. Read-only.\n\nReturns `IReadOnlyList `.\n\nProfileNames\n```csharp\nIReadOnlyList<string> ReliefApi.ProfileNames()\n```\n\nNames accepted by the \"profile\" parameter of profile operations: the four built-in presets (Round, Smooth, Chamfer, Plateau) followed by the user's saved custom profiles. Read-only.\n\nReturns `IReadOnlyList `.","metadata":{"title":"ReliefApi","section":"Operations","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#operations","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#operations","collection":"scripting","hash":"f6f7ff2889cecb17f49abee107796acf","indexed_by":"docs-index"}},{"content":"ReliefApi — RemoveOperation\n\n```csharp\nvoid ReliefApi.RemoveOperation(Guid operationId)\n```\n\nRemoves one operation from the saved project.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `operationId` | `Guid` | required |\n\nSetOperationCombine\n```csharp\nvoid ReliefApi.SetOperationCombine(Guid operationId, string combine)\n```\n\nChanges how one operation merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply). Order matters: combine modes apply over whatever the operations below already built.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `operationId` | `Guid` | required |\n| `combine` | `string` | required |","metadata":{"title":"ReliefApi","section":"RemoveOperation","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#removeoperation","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#removeoperation","collection":"scripting","hash":"0cac00fa98293f23805b536b34ca7cff","indexed_by":"docs-index"}},{"content":"ReliefApi — SetOperationEnabled\n\n```csharp\nvoid ReliefApi.SetOperationEnabled(Guid operationId, bool enabled)\n```\n\nEnables or disables one operation of the saved project (the panel's eye toggle); disabled operations are skipped by Bake.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `operationId` | `Guid` | required |\n| `enabled` | `bool` | required |","metadata":{"title":"ReliefApi","section":"SetOperationEnabled","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#setoperationenabled","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#setoperationenabled","collection":"scripting","hash":"a96143aeb65be5acddf8d51bda44888a","indexed_by":"docs-index"}},{"content":"ReliefApi — SetupProject\n\n```csharp\nvoid ReliefApi.SetupProject(\n    double worldWidth = 0,\n    double worldHeight = 0,\n    int resolution = 0,\n    Plane? workbench = null,\n    bool solid = true,\n    double capDistance = 0,\n    bool deleteBase = false)\n```\n\nCreates the document's relief project — or reconfigures its settings, keeping the existing operation stack. Same defaults as the panel: worldWidth/Height workbench size in model units (0 = 50). resolution grid nodes along the larger side, 64-4096 (0 = 512). workbench plane the relief sits on (null = world XY). solid true (default) = closed solid; false = open mesh. capDistance solid thickness below the plane (0 = default 1.0). deleteBase true trims cells no operation touched.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `worldWidth` | `double` | `0` |\n| `worldHeight` | `double` | `0` |\n| `resolution` | `int` | `0` |\n| `workbench` | `Plane?` | `null` |\n| `solid` | `bool` | `true` |\n| `capDistance` | `double` | `0` |\n| `deleteBase` | `bool` | `false` |","metadata":{"title":"ReliefApi","section":"SetupProject","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#setupproject","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/relief/#setupproject","collection":"scripting","hash":"fa0dc06581b00eb41f3528f347a7d03a","indexed_by":"docs-index"}},{"content":"RenderStudioApi\n\nRender Studio (the ArtisanRenderAndAnimation panel): scene environments, the studio material library, and the studio's render pipeline. Stills go through Rhino's current renderer (Cycles by default) via _Render + _-SaveRenderWindowAs -- the exact route the panel's Render button takes. Turntables render one frame per camera step and assemble an MP4 with the bundled ffmpeg, same as the panel's Turntable mode. Environments live as .renv files in \\Render\\Environments; materials as .rmtl files in \\Render\\Materials\\ (Metals, Gems, Grounds, Misc). Names are the file names without extension.\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi\n```\n\nSee also the guide, Render › Render Studio catalogs, and the Python package, `ra.render_studio`.","metadata":{"title":"RenderStudioApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/","collection":"scripting","hash":"324f07a235ac03345b003c4f0c3678bf","indexed_by":"docs-index"}},{"content":"RenderStudioApi — Methods\n\n| Method | |\n|---|---|\n| `ApplyEnvironment` | Applies a scene environment by name (see ListEnvironments()) as both the lighting and the reflection/refraction environment -- what clicking an Environment tile does. |\n| `ApplyMaterial` | Applies a studio material (see ListMaterials()) the way the panel does: non-Grounds families skin the given objects (and every member of their groups); the Grounds family targets the ground plane instead and ignores `objectIds`. |\n| `ListEnvironments` | Scene environment names available to ApplyEnvironment (the tiles in the panel's Environment tab), sorted alphabetically. |\n| `ListMaterialFamilies` | Material family names (the panel's Metals / Gems / Grounds / Misc tabs; one folder per family, so custom families show up too). |\n| `ListMaterials` | Material names inside one family, sorted -- the tiles the panel shows for that tab. |\n| `RenderStill` | Renders a still through the studio pipeline (_Render on the current renderer -- Cycles unless the user changed it -- then _-SaveRenderWindowAs) and returns the full path written (\".png\" appended when the path has no extension). |\n| `RenderTurntable` | Renders a turntable MP4 the way the panel's Turntable mode does: the camera orbits the current target on a horizontal circle through the current camera position (starting there), one frame is rendered per step, and the bundled ffmpeg assembles the video. |","metadata":{"title":"RenderStudioApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#methods","collection":"scripting","hash":"ade1c2fed2211528049a5077596cb3ba","indexed_by":"docs-index"}},{"content":"RenderStudioApi — ApplyEnvironment\n\n```csharp\nvoid RenderStudioApi.ApplyEnvironment(string name = null)\n```\n\nApplies a scene environment by name (see ListEnvironments()) as both the lighting and the reflection/refraction environment -- what clicking an Environment tile does. `name` null/empty = the studio's default setup (2Shapes environment + diamond refraction environment + white ground plane), same as the panel applies before any render.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `name` | `string` | `null` |","metadata":{"title":"RenderStudioApi","section":"ApplyEnvironment","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#applyenvironment","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#applyenvironment","collection":"scripting","hash":"d1f7617d97c11fd1380ce490d99ecd2e","indexed_by":"docs-index"}},{"content":"RenderStudioApi — ApplyMaterial\n\n```csharp\nvoid RenderStudioApi.ApplyMaterial(\n    string family,\n    string name,\n    IEnumerable<Guid> objectIds = null)\n```\n\nApplies a studio material (see ListMaterials()) the way the panel does: non-Grounds families skin the given objects (and every member of their groups); the Grounds family targets the ground plane instead and ignores `objectIds`. `objectIds` null/empty = current selection. The material is loaded once per document and reused on later calls (matched by its FAMILY-NAME tag). Ensures the default studio lighting is in place first, exactly like a panel click.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `family` | `string` | required |\n| `name` | `string` | required |\n| `objectIds` | `IEnumerable ` | `null` |","metadata":{"title":"RenderStudioApi","section":"ApplyMaterial","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#applymaterial","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#applymaterial","collection":"scripting","hash":"8701c5e0eab67787e7b8b9683041c9c1","indexed_by":"docs-index"}},{"content":"RenderStudioApi — ListEnvironments\n\n```csharp\nIReadOnlyList<string> RenderStudioApi.ListEnvironments()\n```\n\nScene environment names available to ApplyEnvironment (the tiles in the panel's Environment tab), sorted alphabetically.\n\nReturns `IReadOnlyList `.\n\nListMaterialFamilies\n```csharp\nIReadOnlyList<string> RenderStudioApi.ListMaterialFamilies()\n```\n\nMaterial family names (the panel's Metals / Gems / Grounds / Misc tabs; one folder per family, so custom families show up too).\n\nReturns `IReadOnlyList `.","metadata":{"title":"RenderStudioApi","section":"ListEnvironments","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#listenvironments","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#listenvironments","collection":"scripting","hash":"28f79c582fbafe97fcfec631975c1a28","indexed_by":"docs-index"}},{"content":"RenderStudioApi — ListMaterials\n\n```csharp\nIReadOnlyList<string> RenderStudioApi.ListMaterials(string family)\n```\n\nMaterial names inside one family, sorted -- the tiles the panel shows for that tab. Throws listing the valid families when the family doesn't exist.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `family` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"RenderStudioApi","section":"ListMaterials","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#listmaterials","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#listmaterials","collection":"scripting","hash":"f31e7fc5acbe82682abf11f0f7bc96d2","indexed_by":"docs-index"}},{"content":"RenderStudioApi — RenderStill\n\n```csharp\nstring RenderStudioApi.RenderStill(\n    string path,\n    int width = 0,\n    int height = 0,\n    int samples = 0)\n```\n\nRenders a still through the studio pipeline (_Render on the current renderer -- Cycles unless the user changed it -- then _-SaveRenderWindowAs) and returns the full path written (\".png\" appended when the path has no extension). `width`/`height` 0 = 800x600 (the panel default), pixels. `samples` 0 = 500 Cycles passes (the studio's document default). The render window stays open afterwards, as it does for the panel's Render button. Blocks until the render finishes; throws when it is cancelled.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n| `samples` | `int` | `0` |\n\nReturns `string`.","metadata":{"title":"RenderStudioApi","section":"RenderStill","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#renderstill","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#renderstill","collection":"scripting","hash":"e6644678516360667b905cde6fc194b1","indexed_by":"docs-index"}},{"content":"RenderStudioApi — RenderTurntable\n\n```csharp\nstring RenderStudioApi.RenderTurntable(\n    string path,\n    int seconds = 0,\n    int framesPerSecond = 0,\n    int width = 0,\n    int height = 0,\n    int samples = 0,\n    bool raytraced = true)\n```\n\nRenders a turntable MP4 the way the panel's Turntable mode does: the camera orbits the current target on a horizontal circle through the current camera position (starting there), one frame is rendered per step, and the bundled ffmpeg assembles the video. Returns the full path written (\".mp4\" appended when missing). Frames are left in a FRAMES_ folder next to the video, as the panel leaves them. `seconds` 0 = 5; `framesPerSecond` 0 = 12 (panel defaults; total frames = seconds * fps + 1). `width`/`height` 0 = 800x600, pixels. `samples` 0 = 500 passes. `raytraced` true (the panel's Cycles mode) renders every frame with _Render; false captures the viewport in its current display mode instead -- much faster, lower quality. Blocks until the video is written; expect minutes in raytraced mode.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `seconds` | `int` | `0` |\n| `framesPerSecond` | `int` | `0` |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n| `samples` | `int` | `0` |\n| `raytraced` | `bool` | `true` |\n\nReturns `string`.","metadata":{"title":"RenderStudioApi","section":"RenderTurntable","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#renderturntable","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render-studio/#renderturntable","collection":"scripting","hash":"16185888b154c77d585884bc67923dcf","indexed_by":"docs-index"}},{"content":"RenderApi\n\nDocument-side render staging: pairs, lying-on-ground, design/render materials and batch renders. Everything here touches the RHINO document. The web-based Realtime Render viewer has its own facade, RealtimeRenderApi; Rhino/Cycles rendering lives in RenderStudioApi.\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi\n```\n\nSee also the guide, Render, and the Python package, `ra.render`.","metadata":{"title":"RenderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/","collection":"scripting","hash":"2927cfcd5d0985db770dd4d6cc114140","indexed_by":"docs-index"}},{"content":"RenderApi — Methods\n\n| Method | |\n|---|---|\n| `ApplyDesignMaterials` | Applies the DESIGN (viewport) materials to every visible object in the active document -- the ArtisanApplyDesignMaterials command, headless. |\n| `ApplyRenderMaterials` | Applies the photorealistic RENDER materials to every visible object in the active document -- the ArtisanApplyRenderMaterials command, headless. |\n| `BatchRender` | Renders every .3dm file in `folder` (optionally recursing into sub-folders) with the current render engine -- the ArtisanBatchRendering command, headless: no options dialog, no folder picker, no progress window (per-file failures come back in the result instead). |\n| `CreatePair` | Duplicates the objects as the second piece of a pair -- the ArtisanPair command, headless. |\n| `LieOnGround` | Rotates the objects around the X (or Y) axis so they lie as FLAT on the ground plane as possible -- the ArtisanLyingOnTheGround command, used to stage pieces for renders. |","metadata":{"title":"RenderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#methods","collection":"scripting","hash":"c45d649fcb09658f055ea1f0528fb74f","indexed_by":"docs-index"}},{"content":"RenderApi — ApplyDesignMaterials\n\n```csharp\nint RenderApi.ApplyDesignMaterials()\n```\n\nApplies the DESIGN (viewport) materials to every visible object in the active document -- the ArtisanApplyDesignMaterials command, headless. Global, like the command: no selection is taken. Gems, diamonds, pearls and cabochons get their gem material from the document material table; breps, extrusions, meshes and SubDs get the document's Metal 1 material (the command deliberately ignores the Metal 02/03 layers on this side of the switch). Returns the number of objects visited.\n\nReturns `int`.","metadata":{"title":"RenderApi","section":"ApplyDesignMaterials","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#applydesignmaterials","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#applydesignmaterials","collection":"scripting","hash":"260bcd4f8a3402a91a2cd83673ec1ba6","indexed_by":"docs-index"}},{"content":"RenderApi — ApplyRenderMaterials\n\n```csharp\nint RenderApi.ApplyRenderMaterials()\n```\n\nApplies the photorealistic RENDER materials to every visible object in the active document -- the ArtisanApplyRenderMaterials command, headless. Global, like the command: no selection is taken. Gems and diamonds get their gem RenderMaterial from the render catalog; pearls and cabochons the pearl material; breps, extrusions, meshes and SubDs the render metal of their LAYER (\"Metal 01\"/\"Metal 02\"/ \"Metal 03\" map to the document's metal positions, anything else falls back to Metal 1). Same side effects as the command: raises the document render sampling to 25 samples and, on Rhino 8+, installs the default 2Shapes environment when none (or the stock \"Studio\" one) is active. Returns the number of objects visited.\n\nReturns `int`.","metadata":{"title":"RenderApi","section":"ApplyRenderMaterials","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#applyrendermaterials","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#applyrendermaterials","collection":"scripting","hash":"a6fecba891828c9bf5dbabdf074cd587","indexed_by":"docs-index"}},{"content":"RenderApi — BatchRender\n\n```csharp\nBatchRenderResult RenderApi.BatchRender(\n    string folder,\n    bool includeSubfolders = false,\n    string extension = \".jpg\",\n    bool customResolution = false,\n    int width = 1920,\n    int height = 1080)\n```\n\nRenders every .3dm file in `folder` (optionally recursing into sub-folders) with the current render engine -- the ArtisanBatchRendering command, headless: no options dialog, no folder picker, no progress window (per-file failures come back in the result instead). Each image is saved NEXT TO its .3dm with the same base name and the given extension (\".jpg\" or \".png\", the dialog's two formats; jpg is the dialog default). When `customResolution` is true every file renders at `width` x `height` pixels (dialog defaults 1920 x 1080, valid 16..20000); when false each file renders at its own saved render settings. WARNING -- the ACTIVE DOCUMENT CHANGES during the run: each file is opened with _-Open, replacing whatever is open, and (same as the command) the ORIGINAL DOCUMENT IS NOT RESTORED -- the last rendered file stays active when this returns. Before each open the current document's modified flag is cleared so Rhino never prompts to save, which means unsaved changes in the open document are silently discarded. Save your work before calling this.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `folder` | `string` | required |\n| `includeSubfolders` | `bool` | `false` |\n| `extension` | `string` | `\".jpg\"` |\n| `customResolution` | `bool` | `false` |\n| `width` | `int` | `1920` |\n| `height` | `int` | `1080` |\n\nReturns `BatchRenderResult`.","metadata":{"title":"RenderApi","section":"BatchRender","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#batchrender","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#batchrender","collection":"scripting","hash":"449ce14e9ba3a1ac9252defbfade1265","indexed_by":"docs-index"}},{"content":"RenderApi — CreatePair\n\n```csharp\nIReadOnlyList<Guid> RenderApi.CreatePair(\n    IEnumerable<Guid> objectIds = null,\n    double distance = 20,\n    double angle = -20,\n    bool mirror = false)\n```\n\nDuplicates the objects as the second piece of a pair -- the ArtisanPair command, headless. The copy is rotated `angle` degrees around the Z axis at the selection's bounding-box center, moved `distance` mm along X, and optionally mirrored (for asymmetric designs like earrings). Defaults match the command (20 mm, -20 degrees, no mirror). `objectIds` null/empty = current selection. Returns the ids of the copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `distance` | `double` | `20` |\n| `angle` | `double` | `-20` |\n| `mirror` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"RenderApi","section":"CreatePair","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#createpair","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#createpair","collection":"scripting","hash":"2f9ff3c4dfbefaf0b4ea60e1f9eb5252","indexed_by":"docs-index"}},{"content":"RenderApi — LieOnGround\n\n```csharp\nvoid RenderApi.LieOnGround(\n    IEnumerable<Guid> objectIds = null,\n    bool aroundX = true,\n    bool keepOriginal = false)\n```\n\nRotates the objects around the X (or Y) axis so they lie as FLAT on the ground plane as possible -- the ArtisanLyingOnTheGround command, used to stage pieces for renders. Scans rotations in 0.5-degree steps minimizing the total Z height, then picks the face-down orientation of the two candidates. `keepOriginal` true leaves the original in place and flattens a copy (the command's DeleteOriginal toggle, inverted). `objectIds` null/empty = current selection.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `aroundX` | `bool` | `true` |\n| `keepOriginal` | `bool` | `false` |","metadata":{"title":"RenderApi","section":"LieOnGround","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#lieonground","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/render/#lieonground","collection":"scripting","hash":"2e9113c998b8375d69b24c22eb4d6c67","indexed_by":"docs-index"}},{"content":"Results\n\nPlain records with read-only meaning: the methods that return them fill them in.\n\nAdvancedGemsOnCurveResult\nWhat AdvancedGemsOnCurveApi.Create hands back: the parametric group id (the Unique of its RaObjectUserData, what ArtisanEdit uses) and the gems.\n\n| Property | Type | |\n|---|---|---|\n| `Carats` | `double` | |\n| `Count` | `int` | |\n| `GemIds` | `IReadOnlyList ` | |\n| `Unique` | `Guid` | |","metadata":{"title":"Results","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/","collection":"scripting","hash":"db61a128c4670652e5e821df123c60d8","indexed_by":"docs-index"}},{"content":"Results — AiImageResult\n\nAn image generated with fal.ai.\n\n| Property | Type | |\n|---|---|---|\n| `Mode` | `string` | Generative AI Studio mode the prompt was tuned for |\n| `Model` | `string` | fal.ai model used (Options > Assistant: Image / Text-to-image model) |\n| `Path` | `string` | The image file written |\n| `Source` | `string` | What the image was made from: \"viewport\", \"prompt\" or the source file |","metadata":{"title":"Results","section":"AiImageResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#aiimageresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#aiimageresult","collection":"scripting","hash":"83990f6d35785288b4faed4b5d0f91c0","indexed_by":"docs-index"}},{"content":"Results — AllInOneExport\n\n| Property | Type | |\n|---|---|---|\n| `AllPrintable` | `bool` | false = some objects had errors |\n| `Faces` | `int` | triangles in the STL |\n| `NonPrintableIds` | `IReadOnlyList ` | |\n| `ObjectCount` | `int` | objects merged |\n| `Path` | `string` | STL written |\n\nAssetInfo\n| Property | Type | |\n|---|---|---|\n| `Id` | `int` | |\n| `IsDefault` | `bool` | True for the asset the Create methods use when no profile is given. |\n| `Name` | `string` | |\n| `PointCount` | `int` | Control points of the half profile (a rough complexity hint). |\n| `Semantic` | `string` | |\n| `Type` | `string` | TypeOfAssetBackend name |","metadata":{"title":"Results","section":"AllInOneExport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#allinoneexport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#allinoneexport","collection":"scripting","hash":"233705cd9e7fd19b9fb439a1bd14c44c","indexed_by":"docs-index"}},{"content":"Results — AzureResult\n\nWhat AzureApi.Create baked: the carved solid (boolean on) or the loose cutters (boolean off), plus the thinnest metal wall left between two neighbouring holes (-1 when there is a single hole).\n\n| Property | Type | |\n|---|---|---|\n| `CutterIds` | `IReadOnlyList ` | cutter ids (empty when boolean is on) |\n| `Holes` | `int` | azure holes generated (one per gem that projected onto the solid) |\n| `MinWallDistance` | `double` | mm between the two closest holes; -1 with fewer than two holes |\n| `ResultId` | `Guid` | carved solid id (Guid.Empty when boolean is off) |","metadata":{"title":"Results","section":"AzureResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#azureresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#azureresult","collection":"scripting","hash":"ac81dac08eb563c581d693de1652f6b2","indexed_by":"docs-index"}},{"content":"Results — BalanceReport\n\n| Property | Type | |\n|---|---|---|\n| `Applied` | `bool` | true = the corrected copies were added |\n| `BasePoint` | `Point3d` | center of the base object's bounding box (the hook) |\n| `Centroid` | `Point3d` | volume centroid of the hanging geometry |\n| `IsBalanced` | `bool` | TiltDegrees below `tolerance` |\n| `NewIds` | `IReadOnlyList ` | the rotated copies when applied |\n| `TiltDegrees` | `double` | angle between the hang line and straight down; 0 = balanced |","metadata":{"title":"Results","section":"BalanceReport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#balancereport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#balancereport","collection":"scripting","hash":"44bda78253ad1c7c58790b6d71b06e90","indexed_by":"docs-index"}},{"content":"Results — BatchRenderResult\n\n| Property | Type | |\n|---|---|---|\n| `Failed` | `IReadOnlyList ` | file NAMES whose image was not produced |\n| `OutputFiles` | `IReadOnlyList ` | full paths of the images written |\n| `Processed` | `int` | .3dm files opened and attempted |\n\nBoutiqueCatalogDesign\nA design of an installed Boutique collection.\n\n| Property | Type | |\n|---|---|---|\n| `Available` | `bool` | Whether the design's file is on this computer (Insert needs it) |\n| `Collection` | `string` | Collection name, e.g. \"Solitaires\" |\n| `CollectionFolder` | `string` | Collection folder name (stable; use it to disambiguate) |\n| `Currency` | `string` | Currency of the prices |\n| `Description` | `string` | Design description |\n| `Id` | `string` | Design id within its collection |\n| `Name` | `string` | Design name |\n| `Preview` | `string` | Preview image file (empty when there is none) |\n| `RegularPrice` | `string` | Retail price as the collection lists it (text, may be empty) |\n| `SalePrice` | `string` | Sale price as the collection lists it (text, may be empty) |\n| `Sku` | `string` | Design SKU |","metadata":{"title":"Results","section":"BatchRenderResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#batchrenderresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#batchrenderresult","collection":"scripting","hash":"6633661d4234ff072cbee3b18ff2521b","indexed_by":"docs-index"}},{"content":"Results — BoutiqueKit\n\nA kit of the online Boutique catalog.\n\n| Property | Type | |\n|---|---|---|\n| `Date` | `string` | Publication date |\n| `Folder` | `string` | Folder it installs into |\n| `Installed` | `bool` | Whether its folder is on this computer |\n| `Name` | `string` | Kit name |\n| `Type` | `string` | \"collections\" or \"components\" |\n| `UpToDate` | `bool` | Installed and not updated in the catalog since |","metadata":{"title":"Results","section":"BoutiqueKit","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#boutiquekit","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#boutiquekit","collection":"scripting","hash":"541d60d954b82c467687a08421bf3eee","indexed_by":"docs-index"}},{"content":"Results — CutByRingSizeResult\n\n| Property | Type | |\n|---|---|---|\n| `CutCount` | `int` | objects cut |\n| `Diameter` | `double` | cylinder diameter used, mm |\n| `FailedCount` | `int` | objects the boolean could not cut |\n| `FailedIds` | `IReadOnlyList ` | untouched originals |\n| `ObjectIds` | `IReadOnlyList ` | the new (cut) objects |","metadata":{"title":"Results","section":"CutByRingSizeResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#cutbyringsizeresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#cutbyringsizeresult","collection":"scripting","hash":"551af6a3d85566970662089d8d28b69a","indexed_by":"docs-index"}},{"content":"Results — DecimateResult\n\n| Property | Type | |\n|---|---|---|\n| `FacesAfter` | `int` | |\n| `FacesBefore` | `int` | |\n| `MeshesDecimated` | `int` | |\n\nDecimateToleranceResult\n| Property | Type | |\n|---|---|---|\n| `MaxDeviationMm` | `double` | Largest deviation across every decimated mesh, in mm. |\n| `MeshesDecimated` | `int` | |\n| `MeshesUnchanged` | `int` | |\n| `TrianglesAfter` | `int` | |\n| `TrianglesBefore` | `int` | In TRIANGLES: the reducer triangulates quads, so a quad mesh's Faces.Count is not comparable with the result's. |","metadata":{"title":"Results","section":"DecimateResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#decimateresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#decimateresult","collection":"scripting","hash":"326fc076d7ce02263e2924e5f39fd792","indexed_by":"docs-index"}},{"content":"Results — DimensionValueReport\n\nResult of DraftingExtraApi.ReduceDimensions().\n\n| Property | Type | |\n|---|---|---|\n| `Changed` | `int` | |\n| `Percentage` | `double` | |\n| `Skipped` | `int` | |\n\nDismantledBoolean\nOne dismantled boolean, as listed by ListDismantled.\n\n| Property | Type | |\n|---|---|---|\n| `CutterIds` | `IReadOnlyList ` | |\n| `Id` | `Guid` | |\n| `MissingIds` | `IReadOnlyList ` | |\n| `Operation` | `string` | |\n| `TargetIds` | `IReadOnlyList ` | |","metadata":{"title":"Results","section":"DimensionValueReport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#dimensionvaluereport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#dimensionvaluereport","collection":"scripting","hash":"36c5453a6a99a8136c23b8e6ee814586","indexed_by":"docs-index"}},{"content":"Results — ElementInfo\n\nOne saved element in the user's library.\n\n| Property | Type | |\n|---|---|---|\n| `Favorite` | `bool` | |\n| `Id` | `Guid` | |\n| `Name` | `string` | |\n| `Type` | `string` | |\n\nElementsExport\n| Property | Type | |\n|---|---|---|\n| `Count` | `int` | elements in the file |\n| `Path` | `string` | JSON written |\n| `Type` | `string` | library type exported (store name, e.g. \"BEZEL\") |","metadata":{"title":"Results","section":"ElementInfo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#elementinfo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#elementinfo","collection":"scripting","hash":"4648a248ea052517a0597e56cc35cd6f","indexed_by":"docs-index"}},{"content":"Results — ElementsImport\n\n| Property | Type | |\n|---|---|---|\n| `Duplicates` | `int` | elements that already existed (skipped) |\n| `Imported` | `int` | new elements added to the library |\n| `Names` | `IReadOnlyList ` | names of the imported elements |\n| `Path` | `string` | |\n\nGemsOn2CurvesResult\nWhat GemsOn2CurvesApi.Create hands back: the parametric group id (the Unique of its RaObjectUserData, what ArtisanEdit uses), the gem ids and the prong ids (empty unless `prongs` was requested).\n\n| Property | Type | |\n|---|---|---|\n| `Carats` | `double` | |\n| `Count` | `int` | |\n| `GemIds` | `IReadOnlyList ` | |\n| `ProngIds` | `IReadOnlyList ` | |\n| `Unique` | `Guid` | |","metadata":{"title":"Results","section":"ElementsImport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#elementsimport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#elementsimport","collection":"scripting","hash":"49a9cbaeb21003357bd114531345e71e","indexed_by":"docs-index"}},{"content":"Results — GlbBatchItem\n\nOne file of a GLB batch.\n\n| Property | Type | |\n|---|---|---|\n| `Error` | `string` | Why it failed (empty otherwise) |\n| `Glb` | `string` | The .glb next to it |\n| `Source` | `string` | The .3dm read |\n| `Status` | `string` | \"exported\", \"skipped\" (the GLB was already there) or \"failed\" |\n\nGlobalThicknessResult\n| Property | Type | |\n|---|---|---|\n| `AverageMm` | `double` | mean over measurable samples |\n| `MaxMm` | `double` | thickest measured wall |\n| `MeshId` | `Guid` | colorized mesh when colorize=true, else Guid.Empty |\n| `MinMm` | `double` | thinnest measured wall |\n| `SampleCount` | `int` | vertices with a valid measurement |\n| `ThinPercentage` | `double` | % of measurable samples below the threshold -- the figure the command prints on the command line |\n| `ThinSpots` | `IReadOnlyList ` | |\n| `UnmeasurableCount` | `int` | vertices where no wall was found |","metadata":{"title":"Results","section":"GlbBatchItem","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#glbbatchitem","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#glbbatchitem","collection":"scripting","hash":"312b2c8c515def25ff98a970881f4dbb","indexed_by":"docs-index"}},{"content":"Results — LayerExport\n\n| Property | Type | |\n|---|---|---|\n| `Faces` | `int` | triangles written |\n| `Layer` | `string` | layer name (= file name) |\n| `Path` | `string` | STL written, or the existing file when skipped |\n| `Skipped` | `bool` | true = file existed and overwrite was false |\n\nLayerImport\n| Property | Type | |\n|---|---|---|\n| `FilePath` | `string` | STL imported |\n| `Ids` | `IReadOnlyList ` | |\n| `Layer` | `string` | layer it went to (file name without extension) |\n| `ObjectCount` | `int` | objects the file brought in |","metadata":{"title":"Results","section":"LayerExport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#layerexport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#layerexport","collection":"scripting","hash":"661bf0b15ea7100cb2a50bc99bf9f84d","indexed_by":"docs-index"}},{"content":"Results — MeshCheckResult\n\n| Property | Type | |\n|---|---|---|\n| `Id` | `Guid` | |\n| `IsClosed` | `bool` | |\n| `IsManifold` | `bool` | |\n| `IsValid` | `bool` | |\n| `Printable` | `bool` | valid, closed AND manifold/oriented -- the same green/red verdict the tool paints (QuickCheckCommand.IsPrintable) |\n\nMetalWeightResult\nOne metal position of the document (or an ad-hoc object set).\n\n| Property | Type | |\n|---|---|---|\n| `Grams` | `double` | cast weight |\n| `Layer` | `string` | e.g. \"Metal 01\" (or \"Metal 01+02+03\" when the doc uses one metal) |\n| `Metal` | `string` | Metal enum name, e.g. \"GOLD_YELLOW_18\" |\n| `ProcessedGrams` | `double` | after the configured finishing loss % |\n| `Volume` | `double` | model units^3 (mm3 in a mm document) |\n| `WaxGrams` | `double` | wax model weight at the configured wax density |","metadata":{"title":"Results","section":"MeshCheckResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#meshcheckresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#meshcheckresult","collection":"scripting","hash":"1d2ad0874b95c9fda77fa0de3746edb2","indexed_by":"docs-index"}},{"content":"Results — NonPrintableReport\n\n| Property | Type | |\n|---|---|---|\n| `BadObjects` | `IReadOnlyList ` | Rhino's SelBadObjects |\n| `Count` | `int` | objects flagged (now selected) |\n| `Duplicates` | `IReadOnlyList ` | SelDup |\n| `OpenPolysurfaces` | `IReadOnlyList ` | SelOpenPolysrf |\n| `OpenSurfaces` | `IReadOnlyList ` | SelOpenSrf |","metadata":{"title":"Results","section":"NonPrintableReport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#nonprintablereport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#nonprintablereport","collection":"scripting","hash":"dadef0846755dfb6b96045063f1dee39","indexed_by":"docs-index"}},{"content":"Results — PaveResult\n\nEverything one pavé run created, split by kind.\n\n| Property | Type | |\n|---|---|---|\n| `All` | `IReadOnlyList ` | Gems + prongs + cutters, for \"select everything I just built\". |\n| `Cutters` | `IReadOnlyList ` | |\n| `Gems` | `IReadOnlyList ` | |\n| `Prongs` | `IReadOnlyList ` | |\n\nPriceBreakdownDetails\nResult of PricingApi.CalculateDetailed(): the panel's line-level detail. All costs in the manufacturer's currency; weights in grams; sizes in mm.\n\n| Property | Type | |\n|---|---|---|\n| `AdditionalProcesses` | `List ` | |\n| `Currency` | `string` | |\n| `Diamonds` | `List ` | |\n| `DiamondsCarats` | `double` | |\n| `DiamondsCount` | `int` | |\n| `DiamondsTotal` | `double` | |\n| `Extras` | `List ` | |\n| `ExtrasTotal` | `double` | |\n| `Gems` | `List ` | |\n| `GemsCarats` | `double` | |\n| `GemsCount` | `int` | |\n| `GemsTotal` | `double` | |\n| `MetalProcesses` | `List ` | |\n| `MetalTotal` | `double` | |\n| `Metals` | `List ` | |\n| `ProcessesAdditionalCost` | `double` | |\n| `ProcessesMetalCost` | `double` | |\n| `ProcessesSettingCost` | `double` | |\n| `ProcessesTotal` | `double` | |\n| `SettingProcesses` | `List ` | |\n| `Total` | `double` | |\n| `TotalFormatted` | `string` | |","metadata":{"title":"Results","section":"PaveResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#paveresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#paveresult","collection":"scripting","hash":"5a64ee7795c7a4563265e073a1b15508","indexed_by":"docs-index"}},{"content":"Results — PriceDiamondLine\n\n| Property | Type | |\n|---|---|---|\n| `Carats` | `double` | |\n| `CertificateId` | `string` | |\n| `Dealer` | `string` | |\n| `LabGrown` | `bool` | |\n| `Price` | `double` | |\n| `Quoted` | `bool` | false = no live Nivoda quote (offline, quoteCertified = false, or no match): the stone counts in the carat totals but prices as 0. |\n| `Shape` | `string` | |","metadata":{"title":"Results","section":"PriceDiamondLine","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricediamondline","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricediamondline","collection":"scripting","hash":"8ba12bd6b85437dbb0ef7cb13cd1b529","indexed_by":"docs-index"}},{"content":"Results — PriceGemLine\n\n| Property | Type | |\n|---|---|---|\n| `Carats` | `double` | |\n| `Cost` | `double` | |\n| `Count` | `int` | |\n| `PricePerCarat` | `double` | |\n| `SettingType` | `string` | |\n| `Shape` | `string` | |\n| `Sieve` | `string` | |\n| `SizeMm` | `double` | |\n\nPriceMetalLine\n| Property | Type | |\n|---|---|---|\n| `Cost` | `double` | |\n| `Metal` | `string` | |\n| `PricePerGram` | `double` | |\n| `TotalWeightGrams` | `double` | |\n| `Waste` | `double` | |\n| `WeightGrams` | `double` | |","metadata":{"title":"Results","section":"PriceGemLine","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricegemline","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricegemline","collection":"scripting","hash":"008a28fb42cc2e2380c7babda959aba5","indexed_by":"docs-index"}},{"content":"Results — PriceMetalProcessLine\n\n| Property | Type | |\n|---|---|---|\n| `CastFinishPolishCost` | `double` | |\n| `FinishingCost` | `double` | |\n| `Metal` | `string` | |\n| `PrintingCost` | `double` | |\n| `PrintingSize` | `string` | |\n| `RhodiumCost` | `double` | |\n\nPriceNamedCost\n| Property | Type | |\n|---|---|---|\n| `Cost` | `double` | |\n| `Name` | `string` | |","metadata":{"title":"Results","section":"PriceMetalProcessLine","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricemetalprocessline","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricemetalprocessline","collection":"scripting","hash":"d3eacbdf964aceb1e9f5d0906d054026","indexed_by":"docs-index"}},{"content":"Results — PriceResult\n\nResult of PricingApi.Calculate(): the grand total plus the per-category breakdown, in the active manufacturer's currency. TotalFormatted is the total already rendered with the currency symbol (e.g. \"1,234.00 €\").\n\n| Property | Type | |\n|---|---|---|\n| `Currency` | `string` | |\n| `Diamonds` | `double` | |\n| `Extras` | `double` | |\n| `Gems` | `double` | |\n| `Metal` | `double` | |\n| `Processes` | `double` | |\n| `Total` | `double` | |\n| `TotalFormatted` | `string` | |","metadata":{"title":"Results","section":"PriceResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#priceresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#priceresult","collection":"scripting","hash":"aaf455c1e3f6277e03d023bb723bea20","indexed_by":"docs-index"}},{"content":"Results — PriceSettingProcessLine\n\n| Property | Type | |\n|---|---|---|\n| `Cost` | `double` | |\n| `Count` | `int` | |\n| `SettingType` | `string` | |\n\nReduceThicknessResult\n| Property | Type | |\n|---|---|---|\n| `FinalGrams` | `double` | weight after |\n| `GramsSaved` | `double` | |\n| `MaskedNearGems` | `int` | vertices protected around gems |\n| `MeshId` | `Guid` | the hollowed mesh (replaces the original) |\n| `OriginalGrams` | `double` | weight before, first document metal (0 = open mesh) |\n| `ThinVertices` | `int` | vertices that ended below the target thickness |","metadata":{"title":"Results","section":"PriceSettingProcessLine","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricesettingprocessline","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#pricesettingprocessline","collection":"scripting","hash":"2f4415b414b93e9f02394fbef6da44ba","indexed_by":"docs-index"}},{"content":"Results — ReliefOperationInfo\n\n| Property | Type | |\n|---|---|---|\n| `CombineMode` | `string` | |\n| `Enabled` | `bool` | |\n| `Id` | `Guid` | |\n| `Index` | `int` | Position in the stack, 0 = first applied. |\n| `MissingReferences` | `bool` | True when a referenced curve/object no longer resolves or a referenced image/texture file is missing; the operation is skipped. |\n| `Name` | `string` | |\n| `Type` | `string` | \"profile\", \"extrude\", \"image\", \"texture\", \"geometry\", \"carbon\", \"sculpt\" or \"smooth\". |","metadata":{"title":"Results","section":"ReliefOperationInfo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#reliefoperationinfo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#reliefoperationinfo","collection":"scripting","hash":"df8a212ae7c9dbbc47b7e237647bbc66","indexed_by":"docs-index"}},{"content":"Results — ReliefProjectInfo\n\n| Property | Type | |\n|---|---|---|\n| `CapDistance` | `double` | |\n| `DeleteBase` | `bool` | |\n| `Exists` | `bool` | False when the document has no saved relief project. |\n| `OperationCount` | `int` | |\n| `OutputType` | `string` | \"Mesh\" (open relief) or \"Thickness\" (closed solid). |\n| `Resolution` | `int` | |\n| `WorldHeight` | `double` | |\n| `WorldWidth` | `double` | |","metadata":{"title":"Results","section":"ReliefProjectInfo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#reliefprojectinfo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#reliefprojectinfo","collection":"scripting","hash":"017940849860e3858476516a8cbd52bd","indexed_by":"docs-index"}},{"content":"Results — RepairResult\n\n| Property | Type | |\n|---|---|---|\n| `IsClosed` | `bool` | true = watertight, printable |\n| `MeshId` | `Guid` | the repaired watertight mesh added to the doc |\n| `NakedEdges` | `int` | remaining open edges (0 is what you want) |\n| `Shells` | `int` | number of separate shells in the result |\n\nResizedRing\n| Property | Type | |\n|---|---|---|\n| `Diameter` | `double` | target inner diameter (mm) |\n| `Name` | `string` | size label, also the child layer suffix |\n| `RingId` | `Guid` | the resized ring mesh |","metadata":{"title":"Results","section":"RepairResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#repairresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#repairresult","collection":"scripting","hash":"9679f8e727e4006152ecaeb2cad96f73","indexed_by":"docs-index"}},{"content":"Results — RingSizeEstimate\n\n| Property | Type | |\n|---|---|---|\n| `InnerDiameter` | `double` | measured gap along X at Z=0, mm |\n| `InnerHeight` | `double` | measured gap along Z at X=0, mm (0 = open/unknown) |\n| `IsRing` | `bool` | enough ring-like features found |\n| `Probability` | `double` | 0..100 score |\n| `Region` | `string` | sizing region used for the lookup |\n| `RingCurveId` | `Guid` | inserted ring curve (addRingCurve), else Empty |\n| `Size` | `string` | closest catalog size label |\n| `SizeDiameter` | `double` | catalog diameter of that size, mm |","metadata":{"title":"Results","section":"RingSizeEstimate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#ringsizeestimate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#ringsizeestimate","collection":"scripting","hash":"9a88876349676ac3f066936d8f058f01","indexed_by":"docs-index"}},{"content":"Results — RingSizeInfo\n\n| Property | Type | |\n|---|---|---|\n| `Diameter` | `double` | inner diameter, mm |\n| `Region` | `string` | e.g. \"EU\", \"US\" |\n| `Size` | `string` | e.g. \"54\", \"7\" |\n\nStandardizeResult\n| Property | Type | |\n|---|---|---|\n| `BlocksExploded` | `int` | block definitions the document had |\n| `MaterialsLeft` | `int` | materials Rhino refused to remove (0 normally) |\n| `MaterialsRemoved` | `int` | render materials purged |","metadata":{"title":"Results","section":"RingSizeInfo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#ringsizeinfo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#ringsizeinfo","collection":"scripting","hash":"615bed0c03d078f44c145b6a13660798","indexed_by":"docs-index"}},{"content":"Results — SweepResult\n\nWhat the rail sweeps bake: the oriented profile curves (plus the inner curves of the CLOSE / COMFORT / THICKNESS modes) and, when `sweep` is true, the swept breps.\n\n| Property | Type | |\n|---|---|---|\n| `BrepIds` | `IReadOnlyList ` | |\n| `CurveIds` | `IReadOnlyList ` | |\n\nTaxRegion\nOne entry of PricingExtraApi.TaxRegions(): the code to pass as `region` and its display name.\n\n| Property | Type | |\n|---|---|---|\n| `Code` | `string` | |\n| `Name` | `string` | |","metadata":{"title":"Results","section":"SweepResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#sweepresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#sweepresult","collection":"scripting","hash":"b406906168c4d8198c9a425389261150","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartGem\n\n| Property | Type | |\n|---|---|---|\n| `Carats` | `double` | |\n| `Count` | `int` | |\n| `SettingType` | `string` | |\n| `Shape` | `string` | |\n| `Sieve` | `string` | |\n| `SizeMm` | `double` | |\n\nTechnicalChartMetal\n| Property | Type | |\n|---|---|---|\n| `AreaMm2` | `double` | |\n| `Metal` | `string` | |\n| `TotalWeightGrams` | `double` | |\n| `VolumeMm3` | `double` | |\n| `WasteGrams` | `double` | |\n| `WaxWeightGrams` | `double` | |\n| `WeightGrams` | `double` | |","metadata":{"title":"Results","section":"TechnicalChartGem","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartgem","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartgem","collection":"scripting","hash":"ce6b97cf903ebeba809408c8d6211ad4","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartMetalProcess\n\n| Property | Type | |\n|---|---|---|\n| `InvalidSize` | `bool` | |\n| `Metal` | `string` | |\n| `PrintSizeName` | `string` | |\n| `PrintingSize` | `string` | |\n\nTechnicalChartResult\nResult of DraftingExtraApi.CreateTechnicalChart(): the breakdown without prices. Weights in grams, sizes in mm, volume in mm3, area in mm2.\n\n| Property | Type | |\n|---|---|---|\n| `AdditionalProcesses` | `List ` | |\n| `CreatedAt` | `string` | |\n| `Extras` | `List ` | |\n| `Gems` | `List ` | |\n| `MetalProcesses` | `List ` | |\n| `Metals` | `List ` | |\n| `Path` | `string` | |\n| `SettingProcesses` | `List ` | |","metadata":{"title":"Results","section":"TechnicalChartMetalProcess","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartmetalprocess","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartmetalprocess","collection":"scripting","hash":"e7307f363f8216573d2760f90cee32a1","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartSettingProcess\n\n| Property | Type | |\n|---|---|---|\n| `Count` | `int` | |\n| `SettingType` | `string` | |\n\nThinSpot\n| Property | Type | |\n|---|---|---|\n| `Point` | `Point3d` | vertex position on the analysis mesh |\n| `ThicknessMm` | `double` | wall thickness measured there |\n\nTimeTrackingDay\nTime on every file on one day.\n\n| Property | Type | |\n|---|---|---|\n| `Date` | `string` | \"yyyy-MM-dd\" (local day) |\n| `Hours` | `double` | Same, in hours |\n| `Seconds` | `int` | Seconds worked that day |","metadata":{"title":"Results","section":"TechnicalChartSettingProcess","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartsettingprocess","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#technicalchartsettingprocess","collection":"scripting","hash":"366ac4506a336789d1b96d03f463a8ac","indexed_by":"docs-index"}},{"content":"Results — TimeTrackingFile\n\nTime on one file within the report's period.\n\n| Property | Type | |\n|---|---|---|\n| `Days` | `int` | Days with time on it |\n| `Hours` | `double` | Same, in hours |\n| `LastDate` | `string` | Last day with time on it, \"yyyy-MM-dd\" |\n| `Name` | `string` | File name, e.g. \"Solitaire.3dm\" (the panel groups by it) |\n| `Path` | `string` | Full path where it was last worked on |\n| `Seconds` | `int` | Seconds worked in the period |","metadata":{"title":"Results","section":"TimeTrackingFile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#timetrackingfile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#timetrackingfile","collection":"scripting","hash":"f330e574bec3ee24eb25ba2e2b06bad8","indexed_by":"docs-index"}},{"content":"Results — TimeTrackingReport\n\nA time report over a period of days.\n\n| Property | Type | |\n|---|---|---|\n| `Daily` | `IReadOnlyList ` | Per day, oldest first |\n| `Enabled` | `bool` | Whether the tracker is counting time now (Options) |\n| `Files` | `IReadOnlyList ` | Per file, most worked first |\n| `From` | `string` | First day of the period, \"yyyy-MM-dd\" (empty for ALL) |\n| `IdleThresholdMinutes` | `int` | Minutes without keyboard or mouse after which time stops counting |\n| `Period` | `string` | ALL, TODAY, WEEK (since Monday) or MONTH |\n| `To` | `string` | Today, \"yyyy-MM-dd\" |\n| `TotalHours` | `double` | Same, in hours |\n| `TotalSeconds` | `int` | Seconds on every file in the period |","metadata":{"title":"Results","section":"TimeTrackingReport","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#timetrackingreport","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#timetrackingreport","collection":"scripting","hash":"dabeca134143d73669fedf964b66009e","indexed_by":"docs-index"}},{"content":"Results — TrilogyResult\n\nWhat a Trilogy setting call baked: the three stones it was built on (existing ids, never rebaked), the ring curve it was measured against (the Three Stones finger circle when the set came from ArtisanThreeStones) and the new metal / stone objects, all grouped under `GroupName` with `Unique` as the editable object's identity.\n\n| Property | Type | |\n|---|---|---|\n| `CenterGemId` | `Guid` | |\n| `GroupName` | `string` | |\n| `MetalIds` | `IReadOnlyList ` | |\n| `RingCurveId` | `Guid` | |\n| `SideAGemId` | `Guid` | |\n| `SideBGemId` | `Guid` | |\n| `StoneIds` | `IReadOnlyList ` | |\n| `Style` | `string` | |\n| `Unique` | `Guid` | |","metadata":{"title":"Results","section":"TrilogyResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#trilogyresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#trilogyresult","collection":"scripting","hash":"dd6ab125ec9fd1bec89d0d6a23d2e3e8","indexed_by":"docs-index"}},{"content":"Results — UpdateResult\n\nOutcome of UpdateAll / Update.\n\n| Property | Type | |\n|---|---|---|\n| `Found` | `int` | |\n| `Messages` | `IReadOnlyList ` | |\n| `Rebuilt` | `int` | |\n| `ResultIds` | `IReadOnlyList ` | |\n| `Skipped` | `int` | |","metadata":{"title":"Results","section":"UpdateResult","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#updateresult","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/results/#updateresult","collection":"scripting","hash":"d03ae776ccc74d4c87ec6da90f317fbf","indexed_by":"docs-index"}},{"content":"RingCurveApi\n\nScriptable version of the ArtisanRingCurve tool: creates the parametric ring rail curve (the curve shanks and gems-on-curve tools build on). Four variants, one per curve type in the tool: CreateClosed -> \"CLOSE\" full circle at the finger size CreateOpen -> \"OPEN\" circle with a gap (open/adjustable rings) CreateBypass -> \"BYPASS\" crossed-ends (bypass / \"toi et moi\") rail CreateShape -> \"SHAPE\" circle blended with a top shape (round or ellipse) All dimensions are millimetres; angles are degrees. `fingerDiameter` 0 means \"use the document's configured finger size\". Each method returns the Guid of the new curve object -- usable directly with rhinoscriptsyntax (rs.*) and as input to other Artisan tools. Without `element`, the user's saved Ring Curve defaults (the panel's save-as-default) are the starting point and behave like an element: an argument left at its signature default keeps the saved value.\n\n```python\nfrom ArtisanPlugin.Scripting import RingCurveApi\n```\n\nSee also the guide, API Reference › Curves & Text, and the Python package, `ra.ring_curve`.","metadata":{"title":"RingCurveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/","collection":"scripting","hash":"6b371a3e63c326828b22fbb43d3da0ad","indexed_by":"docs-index"}},{"content":"RingCurveApi — Methods\n\n| Method | |\n|---|---|\n| `CreateBypass` | A bypass ring curve (crossed ends). |\n| `CreateClosed` | A closed ring curve (full circle at the finger size). |\n| `CreateOpen` | An open ring curve (circle with a gap). |\n| `CreateShape` | `shapeType` is \"ROUND\" (uses `diameter`) or \"ELLIPSE\" (uses `width` x `height`). |","metadata":{"title":"RingCurveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#methods","collection":"scripting","hash":"c7952c2402542d7e268d00d9dcece0d2","indexed_by":"docs-index"}},{"content":"RingCurveApi — CreateBypass\n\n```csharp\nGuid RingCurveApi.CreateBypass(\n    double openingLength = 14,\n    double angle = 0,\n    double offsetX = 2,\n    double offsetY = 2,\n    double tangent = 1,\n    double fingerDiameter = 0,\n    Plane? plane = null,\n    string profile = null,\n    string element = null)\n```\n\nA bypass ring curve (crossed ends). `element` = name of a saved RingCurve element (ElementsApi.List(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always BYPASS).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `openingLength` | `double` | `14` |\n| `angle` | `double` | `0` |\n| `offsetX` | `double` | `2` |\n| `offsetY` | `double` | `2` |\n| `tangent` | `double` | `1` |\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"RingCurveApi","section":"CreateBypass","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createbypass","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createbypass","collection":"scripting","hash":"0bd5588499b0d63d65da9380ffa18909","indexed_by":"docs-index"}},{"content":"RingCurveApi — CreateClosed\n\n```csharp\nGuid RingCurveApi.CreateClosed(\n    double fingerDiameter = 0,\n    Plane? plane = null,\n    string profile = null,\n    string element = null)\n```\n\nA closed ring curve (full circle at the finger size). `element` = name of a saved RingCurve element (ElementsApi.List(\"RingCurve\")) to start from; explicit arguments override it (its finger size is always replaced, and the curve type is always CLOSE).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"RingCurveApi","section":"CreateClosed","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createclosed","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createclosed","collection":"scripting","hash":"fb87304906f8c8c416799676d97a1c78","indexed_by":"docs-index"}},{"content":"RingCurveApi — CreateOpen\n\n```csharp\nGuid RingCurveApi.CreateOpen(\n    double openingLength = 5,\n    double fingerDiameter = 0,\n    Plane? plane = null,\n    string profile = null,\n    string element = null)\n```\n\nAn open ring curve (circle with a gap). `element` = name of a saved RingCurve element (ElementsApi.List(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always OPEN).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `openingLength` | `double` | `5` |\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"RingCurveApi","section":"CreateOpen","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createopen","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createopen","collection":"scripting","hash":"65ac255e63d3c3a0027e5d07271591a3","indexed_by":"docs-index"}},{"content":"RingCurveApi — CreateShape\n\n```csharp\nGuid RingCurveApi.CreateShape(\n    string shapeType = \"ROUND\",\n    double diameter = 5,\n    double width = 6,\n    double height = 4,\n    double offset = 1,\n    double moveInZ = 2,\n    double openingLength = 14,\n    double fingerDiameter = 0,\n    Plane? plane = null,\n    string profile = null,\n    string element = null)\n```\n\n`shapeType` is \"ROUND\" (uses `diameter`) or \"ELLIPSE\" (uses `width` x `height`). `element` = name of a saved RingCurve element (ElementsApi.List(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always SHAPE).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `shapeType` | `string` | `\"ROUND\"` |\n| `diameter` | `double` | `5` |\n| `width` | `double` | `6` |\n| `height` | `double` | `4` |\n| `offset` | `double` | `1` |\n| `moveInZ` | `double` | `2` |\n| `openingLength` | `double` | `14` |\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `profile` | `string` | `null` |\n| `element` | `string` | `null` |\n\nReturns `Guid`.","metadata":{"title":"RingCurveApi","section":"CreateShape","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createshape","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-curve/#createshape","collection":"scripting","hash":"fcbe670e2305c3dfb51d189c7ffdb905","indexed_by":"docs-index"}},{"content":"RingExtrudeApi\n\nRings extruded from a frontal profile.\n\n```python\nfrom ArtisanPlugin.Scripting import RingExtrudeApi\n```\n\nSee also the Python package, `ra.ring_extrude`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | Ids of every RingExtrude body in the active document. |\n| `Create` | Builds a ring body by extruding silhouettes (the ArtisanRingExtrude tool, headless): a frontal silhouette (an EXTERNAL_RING_PROFILE asset) and a lateral silhouette (a RING_SIDE_CURVE asset) are grown around the finger circle by the lengths below and intersected — the quick way to get a wide, sculpted band. |","metadata":{"title":"RingExtrudeApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/","collection":"scripting","hash":"d67c63bea0265f886fbf653660f5bc1a","indexed_by":"docs-index"}},{"content":"RingExtrudeApi — All\n\n```csharp\nIReadOnlyList<Guid> RingExtrudeApi.All()\n```\n\nIds of every RingExtrude body in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"RingExtrudeApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#all","collection":"scripting","hash":"ac8e9e2fc12f69e370681eed8159e692","indexed_by":"docs-index"}},{"content":"RingExtrudeApi — Create\n\n```csharp\nGuid RingExtrudeApi.Create(\n    double topLength = 0,\n    double sideLength = 0,\n    double bottomLength = 0,\n    double topThickness = 0,\n    double bottomThickness = 0,\n    bool? hollow = null,\n    double linearThickness = 0,\n    double angle = double.NaN,\n    string symmetry = null,\n    double advancedTopThickness = 0,\n    double advancedLateralThickness = 0,\n    string frontalProfile = null,\n    string lateralProfile = null,\n    double fingerDiameter = 0,\n    Plane? plane = null)\n```\n\nBuilds a ring body by extruding silhouettes (the ArtisanRingExtrude tool, headless): a frontal silhouette (an EXTERNAL_RING_PROFILE asset) and a lateral silhouette (a RING_SIDE_CURVE asset) are grown around the finger circle by the lengths below and intersected — the quick way to get a wide, sculpted band. Millimetres; 0 keeps the tool default (or the user's saved defaults): topLength 2, sideLength 2, bottomLength 2 (metal over the finger at top / sides / bottom), topThickness 2, bottomThickness 2 (band width, frontal view). `hollow` true carves the inside with `linearThickness` (2), `angle` (degrees, NaN = 0), `symmetry` SYMMETRIC (default) | ASYMMETRIC with `advancedTopThickness` / `advancedLateralThickness` (2). `frontalProfile` / `lateralProfile` pick assets by name (see AssetsApi). `fingerDiameter` 0 = document ring size. `plane` omitted = world XY. Returns the Guid of the new ring body (a RingExtrude custom object).","metadata":{"title":"RingExtrudeApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#create","collection":"scripting","hash":"635da4b589d5fb9d6a87313746acdb12","indexed_by":"docs-index"}},{"content":"RingExtrudeApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `topLength` | `double` | `0` |\n| `sideLength` | `double` | `0` |\n| `bottomLength` | `double` | `0` |\n| `topThickness` | `double` | `0` |\n| `bottomThickness` | `double` | `0` |\n| `hollow` | `bool?` | `null` |\n| `linearThickness` | `double` | `0` |\n| `angle` | `double` | `double.NaN` |\n| `symmetry` | `string` | `null` |\n| `advancedTopThickness` | `double` | `0` |\n| `advancedLateralThickness` | `double` | `0` |\n| `frontalProfile` | `string` | `null` |\n| `lateralProfile` | `string` | `null` |\n| `fingerDiameter` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n\nReturns `Guid`.","metadata":{"title":"RingExtrudeApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-extrude/#create","collection":"scripting","hash":"2e1f67429b4c7066cf8c59f78eb72b41","indexed_by":"docs-index"}},{"content":"RingToolsApi\n\nUtilities that act on existing ring geometry: opening the finger hole at a ring size and estimating the size of a modelled ring.\n\n```python\nfrom ArtisanPlugin.Scripting import RingToolsApi\n```\n\nSee also the Python package, `ra.ring_tools`.\n\nMethods\n| Method | |\n|---|---|\n| `CutByRingSize` | Cuts the finger hole through objects (the ArtisanCutByRingSize tool, headless): subtracts a cylinder of `fingerDiameter` running along world Y — rings are modelled at the origin by convention — from every brep / extrusion / SubD / mesh in `ids`. |\n| `EstimateRingSize` | Estimates the finger size of a modelled ring (the ArtisanEstimateRingSize tool): sections the geometry with the XY and YZ planes through the origin, measures the inner gap along X (diameter) and along Z (inner height), scores how ring-like the result is (0..100) and looks up the closest catalog size in `region` (omitted = the document's region, USA without one). |","metadata":{"title":"RingToolsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/","collection":"scripting","hash":"5aeea43208b0b75dcfb3e7d370580664","indexed_by":"docs-index"}},{"content":"RingToolsApi — CutByRingSize\n\n```csharp\nCutByRingSizeResult RingToolsApi.CutByRingSize(\n    IEnumerable<Guid> ids,\n    double fingerDiameter = 0)\n```\n\nCuts the finger hole through objects (the ArtisanCutByRingSize tool, headless): subtracts a cylinder of `fingerDiameter` running along world Y — rings are modelled at the origin by convention — from every brep / extrusion / SubD / mesh in `ids`. 0 = the document's ring size. The pieces replace the originals with the same attributes; objects the boolean cannot cut are left as they are and reported in FailedIds. Returns the count of cut / failed objects and the new ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ids` | `IEnumerable ` | required |\n| `fingerDiameter` | `double` | `0` |\n\nReturns `CutByRingSizeResult`.","metadata":{"title":"RingToolsApi","section":"CutByRingSize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/#cutbyringsize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/#cutbyringsize","collection":"scripting","hash":"9fdc71ca05d395c9761b3d19c63a479b","indexed_by":"docs-index"}},{"content":"RingToolsApi — EstimateRingSize\n\n```csharp\nRingSizeEstimate RingToolsApi.EstimateRingSize(\n    IEnumerable<Guid> ids = null,\n    string region = null,\n    bool addRingCurve = false)\n```\n\nEstimates the finger size of a modelled ring (the ArtisanEstimateRingSize tool): sections the geometry with the XY and YZ planes through the origin, measures the inner gap along X (diameter) and along Z (inner height), scores how ring-like the result is (0..100) and looks up the closest catalog size in `region` (omitted = the document's region, USA without one). `ids` omitted = every visible, unlocked brep / surface / mesh. Read-only. `addRingCurve` true also inserts an Artisan ring curve at the estimated size (requires a licence, like the command). Returns a RingSizeEstimate; IsRing false when nothing ring-like was found (Probability, Size empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `ids` | `IEnumerable ` | `null` |\n| `region` | `string` | `null` |\n| `addRingCurve` | `bool` | `false` |\n\nReturns `RingSizeEstimate`.","metadata":{"title":"RingToolsApi","section":"EstimateRingSize","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/#estimateringsize","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/ring-tools/#estimateringsize","collection":"scripting","hash":"5fe9167864112b6d3fd7299dd97ccff9","indexed_by":"docs-index"}},{"content":"RopeApi\n\nTwisted rope along a curve (the ArtisanRope tool).\n\n```python\nfrom ArtisanPlugin.Scripting import RopeApi\n```\n\nSee also the guide, Accessories › Rope, and the Python package, `ra.rope`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: strand diameter 1.6, width 3, 3 threads, 5 turns. |\n\nCreate\n```csharp\nGuid RopeApi.Create(\n    Guid curveId,\n    double diameter = 0,\n    double width = 0,\n    int threads = 0,\n    int turns = 0)\n```\n\nDefaults: strand diameter 1.6, width 3, 3 threads, 5 turns.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `diameter` | `double` | `0` |\n| `width` | `double` | `0` |\n| `threads` | `int` | `0` |\n| `turns` | `int` | `0` |\n\nReturns `Guid`.","metadata":{"title":"RopeApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/rope/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/rope/","collection":"scripting","hash":"c923217ccc44315536e48617033cacd1","indexed_by":"docs-index"}},{"content":"ScoopRingApi\n\nScoop rings.\n\n```python\nfrom ArtisanPlugin.Scripting import ScoopRingApi\n```\n\nSee also the Python package, `ra.scoop_ring`.\n\nMethods\n| Method | |\n|---|---|\n| `Apply` | Scoops (hollows out) a ring shank from the inside — the ArtisanScoopRing tool, headless. |","metadata":{"title":"ScoopRingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/scoop-ring/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/scoop-ring/","collection":"scripting","hash":"99ad946756e92b4ce703b5e4f698d5c4","indexed_by":"docs-index"}},{"content":"ScoopRingApi — Apply\n\n```csharp\nIReadOnlyList<Guid> ScoopRingApi.Apply(\n    Guid objectId,\n    IEnumerable<int> faceIndices,\n    double thickness = 0,\n    double centralAngle = 0,\n    double transitionAngle = 0,\n    double transitionInset = 0,\n    int? smoothing = null,\n    bool? liner = null,\n    double linerThickness = 0,\n    bool? linerSwap = null)\n```\n\nScoops (hollows out) a ring shank from the inside — the ArtisanScoopRing tool, headless. `objectId` is the closed ring solid (brep or extrusion, modelled at the origin with the finger axis along world Y) and `faceIndices` the brep faces to scoop away (the faces the user would click: typically the inner/side faces). The scoop is symmetric: `centralAngle` degrees fully hollowed at the bottom of the ring plus `transitionAngle` degrees of fade-out on each side. Only the symmetric mode of the panel is exposed. Millimetres; 0 keeps the tool default (or the user's saved defaults): thickness 1 (wall left), centralAngle 108, transitionAngle 15, transitionInset 3.5. `smoothing` = loft rebuild points 30 (smooth) | 60 (medium) | 120 (fine) | 0 (precise, exact sections); null = default. `liner` true adds an inner liner of `linerThickness` (0.8); `linerSwap` flips which side the liner keeps. Replaces the original object (same attributes/layer) and returns the ids of the scooped shank followed by the liner pieces, if any.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectId` | `Guid` | required |\n| `faceIndices` | `IEnumerable ` | required |\n| `thickness` | `double` | `0` |\n| `centralAngle` | `double` | `0` |\n| `transitionAngle` | `double` | `0` |\n| `transitionInset` | `double` | `0` |\n| `smoothing` | `int?` | `null` |\n| `liner` | `bool?` | `null` |\n| `linerThickness` | `double` | `0` |\n| `linerSwap` | `bool?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ScoopRingApi","section":"Apply","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/scoop-ring/#apply","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/scoop-ring/#apply","collection":"scripting","hash":"5f3fefdf491d8a880cf668959b41dacb","indexed_by":"docs-index"}},{"content":"SemanticsApi\n\nNatural-language description of the current design, built by the same semantics engine the plugin uses elsewhere. Read-only, no license.\n\n```python\nfrom ArtisanPlugin.Scripting import SemanticsApi\n```\n\nSee also the Python package, `ra.semantics`.\n\nMethods\n| Method | |\n|---|---|\n| `DescribeDocument` | Returns a human-readable summary of the active document: design type and subtype, finger size, metals, gems and the parametric elements it contains. |","metadata":{"title":"SemanticsApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/semantics/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/semantics/","collection":"scripting","hash":"25381091d6268d43d24fcdc6dd402438","indexed_by":"docs-index"}},{"content":"SemanticsApi — DescribeDocument\n\n```csharp\nstring SemanticsApi.DescribeDocument()\n```\n\nReturns a human-readable summary of the active document: design type and subtype, finger size, metals, gems and the parametric elements it contains. Empty string when there is no document. Perfect answer material for \"what is this design?\" questions.\n\nReturns `string`.","metadata":{"title":"SemanticsApi","section":"DescribeDocument","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/semantics/#describedocument","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/semantics/#describedocument","collection":"scripting","hash":"a331d5e90e676e66d82d22fa4c7e2e2a","indexed_by":"docs-index"}},{"content":"SignetRingApi\n\nSignet rings — a flat face carried on a band. Create takes the face and band dimensions; the rest is adjusted through the returned handle.\n\n```python\nfrom ArtisanPlugin.Scripting import SignetRingApi\n```\n\nSee also the guide, Shanks › Signet, and the Python package, `ra.signet_ring`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ISignetRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ISignetRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a signet ring -- the ArtisanSignetRing tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `ISignetRing` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"SignetRingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/","collection":"scripting","hash":"60ae2786328b990d957ba0f555baf580","indexed_by":"docs-index"}},{"content":"SignetRingApi — All\n\n```csharp\nIReadOnlyList<ISignetRing> SignetRingApi.All()\n```\n\n`ISignetRing` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ISignetRing> SignetRingApi.ByLayer(string layerName)\n```\n\n`ISignetRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SignetRingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#all","collection":"scripting","hash":"9d32034fcbb32e3c0cf0d972fdf531f8","indexed_by":"docs-index"}},{"content":"SignetRingApi — Count\n\n```csharp\nint SignetRingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nISignetRing SignetRingApi.Create(\n    double fingerDiameter = 0,\n    double width = 0,\n    double height = 0,\n    double heightPosition = double.NaN,\n    double rotation = double.NaN,\n    double widthBottomProfile = 0,\n    double heightBottomProfile = 0,\n    double widthMiddleProfile = 0,\n    double heightMiddleProfile = 0,\n    bool? recess = null,\n    double thickness = 0,\n    double innerHeight = 0,\n    string profile = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a signet ring -- the ArtisanSignetRing tool, headless. Millimetres / degrees; 0 keeps the tool default (or the user's saved defaults). `fingerDiameter` 0 = the document's finger size. `recess` hollows the face; `thickness` and `innerHeight` shape that recess. Returns an ISignetRing handle to the new ring. `element` = name of a saved signet ring element (ElementsApi.List(\"SignetRing\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `heightPosition` | `double` | `double.NaN` |\n| `rotation` | `double` | `double.NaN` |\n| `widthBottomProfile` | `double` | `0` |\n| `heightBottomProfile` | `double` | `0` |\n| `widthMiddleProfile` | `double` | `0` |\n| `heightMiddleProfile` | `double` | `0` |\n| `recess` | `bool?` | `null` |\n| `thickness` | `double` | `0` |\n| `innerHeight` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `ISignetRing`.","metadata":{"title":"SignetRingApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#count","collection":"scripting","hash":"49648af8d8e6ce2bdce30750e7479b19","indexed_by":"docs-index"}},{"content":"SignetRingApi — Find\n\n```csharp\nISignetRing SignetRingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ISignetRing`.\n\nSelected\n```csharp\nIReadOnlyList<ISignetRing> SignetRingApi.Selected()\n```\n\n`ISignetRing` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"SignetRingApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#find","collection":"scripting","hash":"5330d9cbfc8fc494246d51469547cdb9","indexed_by":"docs-index"}},{"content":"SignetRingApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `ISignetFace`.\n\nISignetRing\n*Handle* — extends `IParametricObject`.\n\nSignet ring: a flat face carried on a band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Face` | `ISignetFace` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved SignetRing element (ElementsApi.List(\"SignetRing\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |","metadata":{"title":"SignetRingApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/signet-ring/#handles-and-sections","collection":"scripting","hash":"a92be5a5f3d0b7f332677cfcb2408932","indexed_by":"docs-index"}},{"content":"SmartComponentApi\n\nSmart components without a typed facade handle of their own (Bail, Named Pendant, Bangle, Bead, Charm): find them to edit them after creation. The creators stay in BailApi, NamedPendantApi, BangleApi...\n\n```python\nfrom ArtisanPlugin.Scripting import SmartComponentApi\n```\n\nSee also the guide, Accessories › Editing smart components, and the Python package, `ra.smart_component`.","metadata":{"title":"SmartComponentApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/","collection":"scripting","hash":"6be85471bee2688fa6ca01a3acc85823","indexed_by":"docs-index"}},{"content":"SmartComponentApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `ISmartComponent` handles for every such component in the active document. |\n| `ByLayer` | Handles on the layer with the given full path. |\n| `Count` | Number of such components in the active document. |\n| `Find` | The handle for `id` (the component, or any member of a bail / named pendant group), or null when it is not one of these components. |\n| `Selected` | Components with at least one selected member. |","metadata":{"title":"SmartComponentApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#methods","collection":"scripting","hash":"37a3f5adb9ce9f946c7edeeb38a28aeb","indexed_by":"docs-index"}},{"content":"SmartComponentApi — All\n\n```csharp\nIReadOnlyList<ISmartComponent> SmartComponentApi.All()\n```\n\n`ISmartComponent` handles for every such component in the active document.\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ISmartComponent> SmartComponentApi.ByLayer(string layerName)\n```\n\nHandles on the layer with the given full path.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SmartComponentApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#all","collection":"scripting","hash":"0139a32f3005a685fbb4c7f0b22b95eb","indexed_by":"docs-index"}},{"content":"SmartComponentApi — Count\n\n```csharp\nint SmartComponentApi.Count()\n```\n\nNumber of such components in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nISmartComponent SmartComponentApi.Find(Guid id)\n```\n\nThe handle for `id` (the component, or any member of a bail / named pendant group), or null when it is not one of these components.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ISmartComponent`.","metadata":{"title":"SmartComponentApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#count","collection":"scripting","hash":"4ae73cccc0fdb44f201902497b994900","indexed_by":"docs-index"}},{"content":"SmartComponentApi — Selected\n\n```csharp\nIReadOnlyList<ISmartComponent> SmartComponentApi.Selected()\n```\n\nComponents with at least one selected member.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"SmartComponentApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#selected","collection":"scripting","hash":"756607b3404178a2a5d7f712da921020","indexed_by":"docs-index"}},{"content":"SmartComponentApi — ISmartComponent\n\n*Handle* — extends `IParametricObject`.\n\nA smart component that has no typed handle of its own -- Bail, Named Pendant, Engrave Ring (parametric groups) and Bangle, Bead, Charm, Link, Milgrain, Rope, Texture3D (custom objects) -- edited through its kernel model as JSON. Paths are the model's property path (\"TopProfile.Width\", \"DiameterTop\"; snake_case works too: \"top_profile.width\"), shown by ParametersJson. Every change regenerates the component in place (same id), like the panel.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Component` | `string` | get | Bail \\| NamedPendant \\| EngraveRing \\| Bangle \\| Bead \\| Charm \\| Link \\| Milgrain \\| Rope \\| Texture3D |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | the kernel model, as stored in the object |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | dotted path; null when absent |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved element of the same component (ElementsApi.List(\"Bail\")...): its parameters replace the current ones (a named pendant keeps its text) and it regenerates in place. |\n| `void SetParameter(string path, string value)` | one value (kept as the model's number / bool / string); regenerates |\n| `void SetParameters(string json)` | Several values at once, as a JSON object merged into the model ({\"DiameterTop\": 3, \"TopProfile\": {\"Width\": 2}}); regenerates once. |","metadata":{"title":"SmartComponentApi","section":"ISmartComponent","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#ismartcomponent","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-component/#ismartcomponent","collection":"scripting","hash":"6fa12a9073de50664fd541c852de6b71","indexed_by":"docs-index"}},{"content":"SmartProfileApi\n\nSmart Profiles: profile sections swept along a curve, varying along the way.\n\n```python\nfrom ArtisanPlugin.Scripting import SmartProfileApi\n```\n\nSee also the guide, Accessories › Smart profile, and the Python package, `ra.smart_profile`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ISmartProfile` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ISmartProfile` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Sweeps profile sections along existing curves (the ArtisanProfiles \"Smart Profiles\" tool, headless): one smart profile per curve, linked to it (editing the curve regenerates it). |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | Smart profiles currently selected in the active doc. |","metadata":{"title":"SmartProfileApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/","collection":"scripting","hash":"f2872bb5071130958b82842770166c7f","indexed_by":"docs-index"}},{"content":"SmartProfileApi — All\n\n```csharp\nIReadOnlyList<ISmartProfile> SmartProfileApi.All()\n```\n\n`ISmartProfile` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ISmartProfile> SmartProfileApi.ByLayer(string layerName)\n```\n\n`ISmartProfile` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SmartProfileApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#all","collection":"scripting","hash":"b0a04721b3df0be63c0a848eacca7533","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Count\n\n```csharp\nint SmartProfileApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"SmartProfileApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#count","collection":"scripting","hash":"5266d656f473bf2eda6bf2a935bcf123","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Create\n\n```csharp\nIReadOnlyList<ISmartProfile> SmartProfileApi.Create(\n    IEnumerable<Guid> curveIds,\n    int count = 0,\n    IEnumerable<double> positions = null,\n    IEnumerable<double> widths = null,\n    IEnumerable<double> heights = null,\n    IEnumerable<double> rotations = null,\n    IEnumerable<double> displacements = null,\n    IEnumerable<string> profiles = null,\n    IEnumerable<string> sectionTypes = null,\n    double width = 0,\n    double height = 0,\n    string profile = null,\n    string sectionType = null,\n    double thickness = 0,\n    double comfort = 0,\n    double startCapDistance = double.NaN,\n    double endCapDistance = double.NaN,\n    int rebuildPoints = 0,\n    IEnumerable<Guid> orientationIds = null,\n    string element = null)\n```","metadata":{"title":"SmartProfileApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","collection":"scripting","hash":"fc4e14c5d577998e00c7337ce78b0b12","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Create\n\nSweeps profile sections along existing curves (the ArtisanProfiles \"Smart Profiles\" tool, headless): one smart profile per curve, linked to it (editing the curve regenerates it). Each section sits at a normalized position t in 0..1 along the curve and has its own RING_PROFILE asset, width, height, rotation and displacement. Sections, in priority order: `positions` (with optional parallel `widths`, `heights`, `rotations`, `displacements`, `profiles`, `sectionTypes`; 0 / empty = the uniform value) replace everything; else `count` (2+) identical sections spread evenly (closed curves skip t = 1); else the user's saved default sections; else 2 sections at the ends. At least two sections. `width` / `height` (0 = 1 mm), `profile` (default RING_PROFILE, or \"id: \"), `sectionType` COMFORT (default) | SOLID | THICKNESS with `thickness` (0.7) and `comfort` (0.3) apply to every section without its own value. `startCapDistance` / `endCapDistance` dome the ends of open curves (literal mm, NaN keeps 1). `rebuildPoints` 0 keeps the profiles as drawn, 4+ rebuilds them. `orientationIds` = solids/meshes whose surface orients the sections (e.g. the ring the profile runs on). Curves with kinks give mitred pieces: fillet them first. `element` = name of a saved SmartProfile element (ElementsApi.List(\"SmartProfile\")) to start from, in place of the saved defaults (its sections are used unless `positions` / `count` are given); explicit arguments override it. Returns one ISmartProfile handle per curve.","metadata":{"title":"SmartProfileApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","collection":"scripting","hash":"24ca800a1ad7787ccbf97d0b179b5d6d","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveIds` | `IEnumerable ` | required |\n| `count` | `int` | `0` |\n| `positions` | `IEnumerable ` | `null` |\n| `widths` | `IEnumerable ` | `null` |\n| `heights` | `IEnumerable ` | `null` |\n| `rotations` | `IEnumerable ` | `null` |\n| `displacements` | `IEnumerable ` | `null` |\n| `profiles` | `IEnumerable ` | `null` |\n| `sectionTypes` | `IEnumerable ` | `null` |\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `sectionType` | `string` | `null` |\n| `thickness` | `double` | `0` |\n| `comfort` | `double` | `0` |\n| `startCapDistance` | `double` | `double.NaN` |\n| `endCapDistance` | `double` | `double.NaN` |\n| `rebuildPoints` | `int` | `0` |\n| `orientationIds` | `IEnumerable ` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SmartProfileApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#create","collection":"scripting","hash":"8d6b1df1f0fa3a7878dad90ef27764c0","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Find\n\n```csharp\nISmartProfile SmartProfileApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ISmartProfile`.\n\nSelected\n```csharp\nIReadOnlyList<ISmartProfile> SmartProfileApi.Selected()\n```\n\nSmart profiles currently selected in the active doc.\n\nReturns `IReadOnlyList `.","metadata":{"title":"SmartProfileApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#find","collection":"scripting","hash":"77d86ecaf6e8f58698f664fcbfa5f423","indexed_by":"docs-index"}},{"content":"SmartProfileApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"SmartProfileApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#handles-and-sections","collection":"scripting","hash":"b20d1562b387ace4607680fb235416c3","indexed_by":"docs-index"}},{"content":"SmartProfileApi — ISmartProfile\n\n*Handle* — extends `IParametricObject`.\n\nSmart profile (the ArtisanProfiles tool): a document curve swept through N RING_PROFILE sections, each placed at a normalized position `t` along the curve (0 = start, 1 = end). Stays linked to the curve: editing the curve regenerates it. Sections are always sorted by t, so an index refers to the n-th section along the curve.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CurveId` | `Guid` | get | The document curve the profile follows. |\n| `EndCapDistance` | `double` | get | Dome height of the end cap (open curves), mm. |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RebuildPoints` | `int` | get | 0 = profiles used as drawn; else rebuilt to this many points. |\n| `SectionCount` | `int` | get | |\n| `SectionHeights` | `IReadOnlyList ` | get | mm, same order |\n| `SectionMirrorOf` | `IReadOnlyList ` | get | -1 for a normal section, else the index of the section it mirrors |\n| `SectionPositions` | `IReadOnlyList ` | get | t of each section, sorted |\n| `SectionProfiles` | `IReadOnlyList ` | get | RING_PROFILE asset name of each section, same order |\n| `SectionRotations` | `IReadOnlyList ` | get | degrees, same order |\n| `SectionTypes` | `IReadOnlyList ` | get | COMFORT \\| SOLID \\| THICKNESS, same order |\n| `SectionWidths` | `IReadOnlyList ` | get | mm, same order |\n| `StartCapDistance` | `double` | get | Dome height of the start cap (open curves), mm. |","metadata":{"title":"SmartProfileApi","section":"ISmartProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","collection":"scripting","hash":"eba1c32c2698569fe015cb3e94e0004d","indexed_by":"docs-index"}},{"content":"SmartProfileApi — ISmartProfile\n\n| Method | |\n|---|---|\n| `void AddSection(double t, double width = 0, double height = 0, string profile = null)` | Adds a section at t (0..1, at least 0.002 from the others). Width/height 0 = 1 mm; profile omitted = default RING_PROFILE. |\n| `void Delete()` | *(from IParametricObject)* |\n| `void MirrorSection(int index)` | Adds a section that mirrors `index` across the curve (t = 1 - t, rotation negated) and follows it from then on. |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void RemoveSection(int index)` | |\n| `void SetAllSections(double width, double height)` | |\n| `void SetElement(string element)` | Applies a saved SmartProfile element (ElementsApi.List(\"SmartProfile\")): its sections and settings replace the current ones; the curve and the orientation objects stay. Regenerates in place (same id). |\n| `void SetEndCapDistance(double distance)` | literal mm (0 = flat) |\n| `void SetHeight(double height)` | every section |\n| `void SetProfile(string profile)` | every section: RING_PROFILE asset name or \"id: \" |\n| `void SetRebuildPoints(int points)` | 0 = off; else 4+ points |\n| `void SetSection(int index, double width = 0, double height = 0)` | Mutations regenerate the profile in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres; 0 keeps the value. A mirrored section follows its source: edit the source instead. |\n| `void SetSectionDisplacement(int index, double displacement)` | sideways offset of the section, mm (literal: 0 = centered) |\n| `void SetSectionPosition(int index, double t)` | |\n| `void SetSectionProfile(int index, string profile)` | RING_PROFILE asset name or \"id: \" |\n| `void SetSectionReversed(int index, bool reversed)` | true = profile drawn reversed |","metadata":{"title":"SmartProfileApi","section":"ISmartProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","collection":"scripting","hash":"247fbca5554c6268f8780d10963e61ed","indexed_by":"docs-index"}},{"content":"SmartProfileApi — ISmartProfile\n\n| Method | |\n|---|---|\n| `void SetSectionRotation(int index, double degrees)` | |\n| `void SetSectionType(int index, string sectionType, double thickness = 0, double comfort = 0)` | COMFORT \\| SOLID \\| THICKNESS; thickness/comfort mm, 0 keeps |\n| `void SetSections(string sectionsJson)` | Replaces every section from a JSON array, the same shape create_smart_profile takes: [{\"t\": 0, \"width\": 2, \"height\": 1, \"rotation\": 0, \"displacement\": 0, \"profile\": \"...\", \"type\": \"COMFORT\"}, ...] (only t is required; 2+ entries). Thickness and comfort carry over from the current first section; mirrors are dropped. |\n| `void SetStartCapDistance(double distance)` | literal mm (0 = flat) |\n| `void SetWidth(double width)` | every section |","metadata":{"title":"SmartProfileApi","section":"ISmartProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/smart-profile/#ismartprofile","collection":"scripting","hash":"9fa68889a5cf9ca63cda08f761699cdc","indexed_by":"docs-index"}},{"content":"SolidApi\n\nHeadless versions of the Solid family tools: ArtisanCut, ArtisanRecess, ArtisanCapRound, ArtisanCurveShell, ArtisanCurves1Rail and ArtisanCurves2Rails. Every method replicates the command's Accept (same kernel objects, same destination layers / materials / custom objects) with the interactive picks turned into explicit ids. Millimetres; 0 = tool default (honouring the user's saved defaults where the panel does).\n\n```python\nfrom ArtisanPlugin.Scripting import SolidApi\n```\n\nSee also the Python package, `ra.solid`.","metadata":{"title":"SolidApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/","collection":"scripting","hash":"9e892669e32918d02ccf736c3302eb3c","indexed_by":"docs-index"}},{"content":"SolidApi — Methods\n\n| Method | |\n|---|---|\n| `CapRound` | Rounded (domed) cap over a closed planar curve (the ArtisanCapRound command): a RoundCapCustomObject linked to the curve, on the metal layer with the metal material. |\n| `CurveShell` | Hollow shell (a wall + a floor) built from one or more closed planar curves (the ArtisanCurveShell command): one CurveShellCustomObject per curve on the metal layer with the metal material. |\n| `Cut` | Cuts solids with planar closed curves (the ArtisanCut command): each curve is extruded through the solids (twice the bounding-box diagonal, centred on the curve plane) and subtracted. |\n| `Recess` | Recess (default) or protrusion of the region a closed curve marks on a solid's face (the ArtisanRecess command): the curve is pulled onto the face, the face is split and the inner piece is offset `height` mm (default 0.5) and subtracted (recess) or united (protrusion). |\n| `SweepOneRail` | Orients profile curves along one rail and sweeps them (the ArtisanCurves1Rail command). |\n| `SweepTwoRails` | Orients profile curves between two rails and sweeps them (the ArtisanCurves2Rails command). |","metadata":{"title":"SolidApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#methods","collection":"scripting","hash":"fda60076824e1553352dbec1d70336fe","indexed_by":"docs-index"}},{"content":"SolidApi — CapRound\n\n```csharp\nGuid SolidApi.CapRound(Guid curveId, double height = 0, bool? flip = null)\n```\n\nRounded (domed) cap over a closed planar curve (the ArtisanCapRound command): a RoundCapCustomObject linked to the curve, on the metal layer with the metal material. height 0 = the user's saved default or 5 mm; flip null = saved default (false = along the curve normal). Returns the id of the cap object.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `height` | `double` | `0` |\n| `flip` | `bool?` | `null` |\n\nReturns `Guid`.","metadata":{"title":"SolidApi","section":"CapRound","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#capround","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#capround","collection":"scripting","hash":"27d6065b3fdde564a88b10e2d2c6d7e1","indexed_by":"docs-index"}},{"content":"SolidApi — CurveShell\n\n```csharp\nIReadOnlyList<Guid> SolidApi.CurveShell(\n    IEnumerable<Guid> curveIds,\n    double height = 0,\n    double widthThickness = 0,\n    double heightThickness = 0,\n    string profile = null,\n    bool? flip = null)\n```\n\nHollow shell (a wall + a floor) built from one or more closed planar curves (the ArtisanCurveShell command): one CurveShellCustomObject per curve on the metal layer with the metal material. 0 = the user's saved default or the tool default: height 3, widthThickness 1 (wall), heightThickness 2 (floor; must be ` | required |\n| `height` | `double` | `0` |\n| `widthThickness` | `double` | `0` |\n| `heightThickness` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `flip` | `bool?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SolidApi","section":"CurveShell","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#curveshell","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#curveshell","collection":"scripting","hash":"e016da76e063f098e3205403fed08c37","indexed_by":"docs-index"}},{"content":"SolidApi — Cut\n\n```csharp\nIReadOnlyList<Guid> SolidApi.Cut(IEnumerable<Guid> solidIds, IEnumerable<Guid> curveIds)\n```\n\nCuts solids with planar closed curves (the ArtisanCut command): each curve is extruded through the solids (twice the bounding-box diagonal, centred on the curve plane) and subtracted. The originals are replaced by the results, which keep their layer / material. Returns the ids of the resulting breps.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `solidIds` | `IEnumerable ` | required |\n| `curveIds` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SolidApi","section":"Cut","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#cut","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#cut","collection":"scripting","hash":"e6d252c93893687869a816a39173d5c4","indexed_by":"docs-index"}},{"content":"SolidApi — Recess\n\n```csharp\nIReadOnlyList<Guid> SolidApi.Recess(\n    Guid curveId,\n    Guid solidId,\n    double height = 0,\n    bool protrusion = false,\n    int faceIndex = -1)\n```\n\nRecess (default) or protrusion of the region a closed curve marks on a solid's face (the ArtisanRecess command): the curve is pulled onto the face, the face is split and the inner piece is offset `height` mm (default 0.5) and subtracted (recess) or united (protrusion). faceIndex -1 = the face closest to the curve. The original is replaced by the result (same layer / material). Returns the new ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `solidId` | `Guid` | required |\n| `height` | `double` | `0` |\n| `protrusion` | `bool` | `false` |\n| `faceIndex` | `int` | `-1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SolidApi","section":"Recess","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#recess","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#recess","collection":"scripting","hash":"c59f5d4a62c9ae2391d8e9a54de07060","indexed_by":"docs-index"}},{"content":"SolidApi — SweepOneRail\n\n```csharp\nSweepResult SolidApi.SweepOneRail(\n    Guid railId,\n    IEnumerable<Guid> profileIds,\n    string mode = \"OPEN\",\n    double thickness = double.NaN,\n    bool flip = false,\n    bool sweep = true,\n    IEnumerable<double> positions = null)\n```\n\nOrients profile curves along one rail and sweeps them (the ArtisanCurves1Rail command). Profiles are drawn flat on World XY (base = bottom of their bounding box) and distributed evenly from the rail start, or at `positions` (normalized 0..1, one per profile). mode OPEN | CLOSE (chord) | COMFORT (curved inner) | THICKNESS (inner offset by `thickness`, NaN = 0.6 mm; negative allowed). flip mirrors the profiles across the rail; sweep false = only the oriented curves. Returns the ids of the swept breps and of the baked curves.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `railId` | `Guid` | required |\n| `profileIds` | `IEnumerable ` | required |\n| `mode` | `string` | `\"OPEN\"` |\n| `thickness` | `double` | `double.NaN` |\n| `flip` | `bool` | `false` |\n| `sweep` | `bool` | `true` |\n| `positions` | `IEnumerable ` | `null` |\n\nReturns `SweepResult`.","metadata":{"title":"SolidApi","section":"SweepOneRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#sweeponerail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#sweeponerail","collection":"scripting","hash":"0f7913b780972ffff2edc7e3ccc1686d","indexed_by":"docs-index"}},{"content":"SolidApi — SweepTwoRails\n\n```csharp\nSweepResult SolidApi.SweepTwoRails(\n    Guid rail1Id,\n    Guid rail2Id,\n    IEnumerable<Guid> profileIds,\n    string mode = \"OPEN\",\n    double thickness = double.NaN,\n    bool keepProportion = false,\n    bool sweep = true,\n    IEnumerable<double> positions = null)\n```\n\nOrients profile curves between two rails and sweeps them (the ArtisanCurves2Rails command). Each profile's endpoints land on rail 1 and rail 2 (start->end), scaled to the distance between the rails: keepProportion false = uniform scale, true = the height is kept. Profiles spread evenly along rail 1 (rail 2 by closest point) or at `positions` (normalized 0..1 on rail 1). mode / thickness / sweep as in SweepOneRail. Returns the swept brep ids and the baked curve ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `rail1Id` | `Guid` | required |\n| `rail2Id` | `Guid` | required |\n| `profileIds` | `IEnumerable ` | required |\n| `mode` | `string` | `\"OPEN\"` |\n| `thickness` | `double` | `double.NaN` |\n| `keepProportion` | `bool` | `false` |\n| `sweep` | `bool` | `true` |\n| `positions` | `IEnumerable ` | `null` |\n\nReturns `SweepResult`.","metadata":{"title":"SolidApi","section":"SweepTwoRails","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#sweeptworails","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/solid/#sweeptworails","collection":"scripting","hash":"c74eea4411a10a5dd6e931fd3bc2d683","indexed_by":"docs-index"}},{"content":"SplitShankApi\n\nSplit shanks - the band that opens into two arms toward the setting. Create takes the parameters that define the split; the rest of the model is adjusted afterwards through the returned handle's setters.\n\n```python\nfrom ArtisanPlugin.Scripting import SplitShankApi\n```\n\nSee also the guide, Shanks › Split shank, and the Python package, `ra.split_shank`.","metadata":{"title":"SplitShankApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/","collection":"scripting","hash":"86e33e0657e7427003d4c7a34305ef7a","indexed_by":"docs-index"}},{"content":"SplitShankApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `ISplitShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ISplitShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a split shank -- the ArtisanSplitShank tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `ISplitShank` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"SplitShankApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#methods","collection":"scripting","hash":"aa72fd3805b2616996dadb699deba083","indexed_by":"docs-index"}},{"content":"SplitShankApi — All\n\n```csharp\nIReadOnlyList<ISplitShank> SplitShankApi.All()\n```\n\n`ISplitShank` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ISplitShank> SplitShankApi.ByLayer(string layerName)\n```\n\n`ISplitShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"SplitShankApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#all","collection":"scripting","hash":"9ebe27bb2d61fe1c4ac27826b7d7736b","indexed_by":"docs-index"}},{"content":"SplitShankApi — Count\n\n```csharp\nint SplitShankApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreate\n```csharp\nISplitShank SplitShankApi.Create(\n    double fingerDiameter = 0,\n    double openingLength = 0,\n    double armHeight = 0,\n    double splitWidth = 0,\n    double splitStart = double.NaN,\n    double topSize = 0,\n    double bottomSize = 0,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a split shank -- the ArtisanSplitShank tool, headless. Millimetres / degrees; 0 keeps the tool default (or the user's saved defaults). `fingerDiameter` 0 = the document's finger size. Returns an ISplitShank handle to the new shank. `element` = name of a saved split shank element (ElementsApi.List(\"SplitShank\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `fingerDiameter` | `double` | `0` |\n| `openingLength` | `double` | `0` |\n| `armHeight` | `double` | `0` |\n| `splitWidth` | `double` | `0` |\n| `splitStart` | `double` | `double.NaN` |\n| `topSize` | `double` | `0` |\n| `bottomSize` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `ISplitShank`.","metadata":{"title":"SplitShankApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#count","collection":"scripting","hash":"0dec4fab8498cc0066b7bbf97078fb15","indexed_by":"docs-index"}},{"content":"SplitShankApi — Find\n\n```csharp\nISplitShank SplitShankApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ISplitShank`.\n\nSelected\n```csharp\nIReadOnlyList<ISplitShank> SplitShankApi.Selected()\n```\n\n`ISplitShank` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.","metadata":{"title":"SplitShankApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#find","collection":"scripting","hash":"bce6c86f8bfb98c118955b8df964a1ae","indexed_by":"docs-index"}},{"content":"SplitShankApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nISplitShank\n*Handle* — extends `IParametricObject`.\n\nSplit shank: a band that opens into two arms toward the setting. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Curve` | `ISplitShankCurve` | get | |\n| `Gems` | `ISplitShankGems` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `Sections` | `IReadOnlyList ` | get | The three swept profiles, ordered bottom -> side -> top. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved SplitShank element (ElementsApi.List(\"SplitShank\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `void SetSection( int index, double position, double width, double height, string type = null, string profileName = null)` | Edits one of the three sections in place. `profileName` omitted keeps the section's current asset. |\n| `void SetSectionEnabled(int index, bool enabled)` | |","metadata":{"title":"SplitShankApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#handles-and-sections","collection":"scripting","hash":"112b397afb1daa43509d003520ccf24b","indexed_by":"docs-index"}},{"content":"SplitShankApi — ISplitShankSection\n\n*Section*.\n\nOne of the profiles swept along the rail. A split shank keeps exactly three — bottom (T = 0), side (movable) and top (T = 1).\n\n| Property | Type | | |\n|---|---|---|---|\n| `Comfort` | `double` | get | mm |\n| `Displacement` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `Height` | `double` | get | mm |\n| `Orientation` | `int` | get | 0 = Natural, 1 = Reverse |\n| `Position` | `double` | get | T along the rail: 0 = ring bottom, 1 = arm tip |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Rotation` | `double` | get | degrees |\n| `Thickness` | `double` | get | mm |\n| `Type` | `string` | get | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `Width` | `double` | get | mm |","metadata":{"title":"SplitShankApi","section":"ISplitShankSection","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshanksection","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshanksection","collection":"scripting","hash":"44948118e585293e65108adc7a8bdbbf","indexed_by":"docs-index"}},{"content":"SplitShankApi — ISplitShankGems\n\n*Section*.\n\nThe pave run along a split shank's arms, with a top-to-bottom size gradient.\n\n| Property | Type | | |\n|---|---|---|---|\n| `AutomaticProngDiameter` | `bool` | get | |\n| `BottomSize` | `double` | get | stone size at the ring bottom, mm |\n| `BrightCut` | `double` | get | mm |\n| `ChannelClearance` | `double` | get | mm |\n| `ChannelShape` | `string` | get | |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `Enabled` | `bool` | get | |\n| `FlipEnd` | `bool` | get | |\n| `FlipStart` | `bool` | get | |\n| `GemInside` | `double` | get | mm |\n| `InnerHeight` | `double` | get | mm |\n| `InnerWidth` | `double` | get | mm |\n| `MarginBottom` | `double` | get | run start, in mm of arc length from the rail start (Start gumball) |\n| `MarginTop` | `double` | get | how far below the arm tip the gem run stops, mm (End gumball) |\n| `MinDistance` | `double` | get | mm |\n| `MoveInZ` | `double` | get | mm |\n| `ProngDiameter` | `double` | get | mm |\n| `ProngHeight` | `double` | get | mm |\n| `ProngType` | `string` | get | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `ShankSize` | `double` | get | mm |\n| `Shape` | `string` | get | \"ROUND\", \"PRINCESS\", ... |\n| `Spacing` | `double` | get | gap between gems (arms and trunk alike), mm |\n| `TopSize` | `double` | get | stone size at the arm tip, mm |\n| `TransitionSize` | `double` | get | mm |\n| `VCutters` | `bool` | get | |\n| `Vertical` | `double` | get | mm |","metadata":{"title":"SplitShankApi","section":"ISplitShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankgems","collection":"scripting","hash":"58e4c03d7c902d339926c93eafdc06e1","indexed_by":"docs-index"}},{"content":"SplitShankApi — ISplitShankGems\n\n| Method | |\n|---|---|\n| `void ClearGemSizes()` | drop every per-stone override (back to the size gradient) |\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetBrightCut(double brightCut)` | |\n| `void SetChannelClearance(double clearance)` | |\n| `void SetChannelShape(string shape)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetEnabled(bool enabled)` | |\n| `void SetFlipEnd(bool flip)` | |\n| `void SetFlipStart(bool flip)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemSize(double position, double diameter)` | per-stone override; position = normalised rail t (0..1), snaps to the nearest stone |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMargins(double top, double bottom)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetMoveInZ(double move)` | |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngType(string prongType)` | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `void SetShankSize(double size)` | |\n| `void SetShape(string shape)` | |\n| `void SetSizes(double topSize, double bottomSize)` | |\n| `void SetSpacing(double spacing)` | |\n| `void SetTransitionSize(double size)` | |\n| `void SetVCutters(bool enabled)` | |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"SplitShankApi","section":"ISplitShankGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankgems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankgems","collection":"scripting","hash":"56325710aa5b8be6d886be1c19a3a8fd","indexed_by":"docs-index"}},{"content":"SplitShankApi — ISplitShankCurve\n\n*Section*.\n\nThe rail a split shank is swept along: how the arms rise, open and split.\n\n| Property | Type | | |\n|---|---|---|---|\n| `ArmHeight` | `double` | get | rise of the arm tips above the ring top, mm |\n| `ArmOffset` | `double` | get | extra outward bulge beyond the reference shape, mm |\n| `LateralDisplacement` | `double` | get | Y displacement of the arm tips, mm |\n| `LateralInclination` | `double` | get | inclination of the arms along the finger axis, degrees |\n| `OpeningLength` | `double` | get | frontal X distance between the arm tips, mm (0 = touching) |\n| `SplitStart` | `double` | get | where along the rail the split begins, 0..1 |\n| `SplitWidth` | `double` | get | separation between the front and back arm pairs, mm |\n\n| Method | |\n|---|---|\n| `void SetArmHeight(double height)` | |\n| `void SetArmOffset(double offset)` | |\n| `void SetLateralDisplacement(double displacement)` | |\n| `void SetLateralInclination(double degrees)` | |\n| `void SetOpeningLength(double length)` | |\n| `void SetSplitStart(double start)` | 0..1 |\n| `void SetSplitWidth(double width)` | |","metadata":{"title":"SplitShankApi","section":"ISplitShankCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankcurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/split-shank/#isplitshankcurve","collection":"scripting","hash":"38a17fa63fa2599eb97d8b85a6eb0fc0","indexed_by":"docs-index"}},{"content":"TaperedBaguettesApi\n\nTapered baguettes between two curves.\n\n```python\nfrom ArtisanPlugin.Scripting import TaperedBaguettesApi\n```\n\nSee also the Python package, `ra.tapered_baguettes`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Places tapered baguettes spanning between two rail curves -- the ArtisanTaperedBaguettesOnCurves tool, headless. |","metadata":{"title":"TaperedBaguettesApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tapered-baguettes/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tapered-baguettes/","collection":"scripting","hash":"a5b9862bbd027a734ca986e9c0823db0","indexed_by":"docs-index"}},{"content":"TaperedBaguettesApi — Create\n\n```csharp\nIReadOnlyList<Guid> TaperedBaguettesApi.Create(\n    Guid curveAId,\n    Guid curveBId,\n    IEnumerable<Point3d> points = null,\n    int count = 0,\n    double topWidth = 0,\n    double bottomWidth = 0,\n    int depthPercentage = 0,\n    string gemMaterial = null)\n```\n\nPlaces tapered baguettes spanning between two rail curves -- the ArtisanTaperedBaguettesOnCurves tool, headless. Each entry of `points` replaces one click: the rail closest to the point carries the wide (top) edge, the gem runs straight to the closest point on the other rail and its length follows that span. Without `points`, `count` > 0 spreads that many baguettes evenly along the first curve (top edge on it). Millimetres; 0 keeps the tool default: topWidth 1.75, bottomWidth 1.25, depthPercentage 64. `gemMaterial` accepts the GemApi vocabulary (default Diamond). The gems are baked loose (no group) on the primary gems layer, like the command. Returns their ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveAId` | `Guid` | required |\n| `curveBId` | `Guid` | required |\n| `points` | `IEnumerable ` | `null` |\n| `count` | `int` | `0` |\n| `topWidth` | `double` | `0` |\n| `bottomWidth` | `double` | `0` |\n| `depthPercentage` | `int` | `0` |\n| `gemMaterial` | `string` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TaperedBaguettesApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tapered-baguettes/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tapered-baguettes/#create","collection":"scripting","hash":"a9fd859c3fcac6396c3c2126487555f5","indexed_by":"docs-index"}},{"content":"TextOnCurveApi\n\nScriptable version of the ArtisanTextOnCurve tool: flows a text along an existing curve. With thickness > 0 the letters are solid breps (added to the primary metal layer, ready to boolean/print); with thickness 0 the result is outline curves (added to the primary user layer). The output is plain geometry, exactly like the tool's Insert button -- it does not stay linked to the curve.\n\n```python\nfrom ArtisanPlugin.Scripting import TextOnCurveApi\n```\n\nSee also the Python package, `ra.text_on_curve`.","metadata":{"title":"TextOnCurveApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/text-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/text-on-curve/","collection":"scripting","hash":"599d388aeb22bc69a7fff5216f3df199","indexed_by":"docs-index"}},{"content":"TextOnCurveApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Creates the text along `curveId` and returns the Guids of the added objects (breps and/or curves). |\n\nCreate\n```csharp\nIReadOnlyList<Guid> TextOnCurveApi.Create(\n    Guid curveId,\n    string text,\n    double height = 1.5,\n    double thickness = 0,\n    double spacing = 0.5,\n    string font = \"Bienchen\",\n    double rotation = 0,\n    double moveZ = 0,\n    string horizontalAlign = \"LEFT\",\n    string verticalAlign = \"CENTER\",\n    bool flipHorizontal = false,\n    bool flipVertical = false)\n```\n\nCreates the text along `curveId` and returns the Guids of the added objects (breps and/or curves). text what to write (required) height letter height in mm (default 1.5) thickness extrusion depth in mm; 0 = curves only (default 0) spacing letter spacing (default 0.5) font installed font name (default \"Bienchen\", the tool's default) rotation letter rotation in degrees moveZ lift above the curve in mm horizontalAlign LEFT | CENTER | RIGHT | JUSTIFY (default LEFT) verticalAlign TOP | CENTER | BOTTOM (default CENTER) flipHorizontal / flipVertical mirror the text\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `text` | `string` | required |\n| `height` | `double` | `1.5` |\n| `thickness` | `double` | `0` |\n| `spacing` | `double` | `0.5` |\n| `font` | `string` | `\"Bienchen\"` |\n| `rotation` | `double` | `0` |\n| `moveZ` | `double` | `0` |\n| `horizontalAlign` | `string` | `\"LEFT\"` |\n| `verticalAlign` | `string` | `\"CENTER\"` |\n| `flipHorizontal` | `bool` | `false` |\n| `flipVertical` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TextOnCurveApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/text-on-curve/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/text-on-curve/#methods","collection":"scripting","hash":"3148a39ecff9293de3d642bf408e2a80","indexed_by":"docs-index"}},{"content":"Texture3DApi\n\nImage-driven 3D texture on a surface (the ArtisanTexture3D tool).\n\n```python\nfrom ArtisanPlugin.Scripting import Texture3DApi\n```\n\nSee also the guide, Accessories › Texture 3D, and the Python package, `ra.texture_3d`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | `texturePath` optional image file (grayscale heightmap); omitted = the default texture. |","metadata":{"title":"Texture3DApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/texture3-d/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/texture3-d/","collection":"scripting","hash":"7ddbe7c1ce08d681b3d45c9bc5b328fd","indexed_by":"docs-index"}},{"content":"Texture3DApi — Create\n\n```csharp\nGuid Texture3DApi.Create(\n    Guid surfaceId,\n    string texturePath = null,\n    int u = 0,\n    int v = 0,\n    double height = 0,\n    double rotation = 0)\n```\n\n`texturePath` optional image file (grayscale heightmap); omitted = the default texture. Defaults: 1x1 repeats, relief height 0.6, resolution 0.5. Returns the id of the textured object.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `surfaceId` | `Guid` | required |\n| `texturePath` | `string` | `null` |\n| `u` | `int` | `0` |\n| `v` | `int` | `0` |\n| `height` | `double` | `0` |\n| `rotation` | `double` | `0` |\n\nReturns `Guid`.","metadata":{"title":"Texture3DApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/texture3-d/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/texture3-d/#create","collection":"scripting","hash":"e2f9ad4eccb57dfadd78fd7607ef9715","indexed_by":"docs-index"}},{"content":"ThreeStonesApi\n\nThree Stones ring top (the ArtisanThreeStones tool, headless): one center stone plus two symmetric side stones placed around a finger size -- the classic trilogy engagement layout.\n\n```python\nfrom ArtisanPlugin.Scripting import ThreeStonesApi\n```\n\nSee also the Python package, `ra.three_stones`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Creates the editable Three Stones group. |","metadata":{"title":"ThreeStonesApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/three-stones/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/three-stones/","collection":"scripting","hash":"b6077f1564053335a667602a2947b1f3","indexed_by":"docs-index"}},{"content":"ThreeStonesApi — Create\n\n```csharp\nIReadOnlyList<Guid> ThreeStonesApi.Create(\n    string centerShape,\n    double centerCarats,\n    string sideShape,\n    double sideCarats,\n    string centerMaterial = \"Diamond\",\n    string sideMaterial = \"Diamond\",\n    double centerDistance = 4,\n    double centerRotation = 0,\n    double sideDistance = 3.2,\n    double sideAngle = 28,\n    double sideRotation = 0,\n    double sideRotationY = 25,\n    double fingerDiameter = 0)\n```\n\nCreates the editable Three Stones group. The center stone sits at the top of the finger size; the side stones mirror each other at `sideAngle` degrees to each side, optionally leaning toward the center (`sideRotationY`). The stones always come from the arguments; the placement starts from the user's saved Three Stones defaults when there are any (an argument left at its signature default keeps the saved value), otherwise from the tool's own. `fingerDiameter` 0 = the document's finger size. Returns the gem ids as [center, side A, side B] (the group also carries the finger reference circle).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `centerShape` | `string` | required |\n| `centerCarats` | `double` | required |\n| `sideShape` | `string` | required |\n| `sideCarats` | `double` | required |\n| `centerMaterial` | `string` | `\"Diamond\"` |\n| `sideMaterial` | `string` | `\"Diamond\"` |\n| `centerDistance` | `double` | `4` |\n| `centerRotation` | `double` | `0` |\n| `sideDistance` | `double` | `3.2` |\n| `sideAngle` | `double` | `28` |\n| `sideRotation` | `double` | `0` |\n| `sideRotationY` | `double` | `25` |\n| `fingerDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ThreeStonesApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/three-stones/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/three-stones/#create","collection":"scripting","hash":"057d89f5f7c8ea29716fb6ff7063fbbd","indexed_by":"docs-index"}},{"content":"TimeTrackingApi\n\nThe time tracker's records (the ArtisanTimeTracker panel), read-only: how long each saved file has been worked on, per day. Time counts while Rhino is in front with that file open and the user has used the keyboard or mouse within the idle threshold (Options > Artisan > Time tracking); unsaved documents are not tracked.\n\n```python\nfrom ArtisanPlugin.Scripting import TimeTrackingApi\n```\n\nSee also the Python package, `ra.time_tracking`.","metadata":{"title":"TimeTrackingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/time-tracking/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/time-tracking/","collection":"scripting","hash":"f470bad07abc891a49b7f0505fc28b19","indexed_by":"docs-index"}},{"content":"TimeTrackingApi — Methods\n\n| Method | |\n|---|---|\n| `Report` | Time worked per file and per day, as the Time Tracker panel shows it. |\n\nReport\n```csharp\nTimeTrackingReport TimeTrackingApi.Report(string period = null, string file = null)\n```\n\nTime worked per file and per day, as the Time Tracker panel shows it. `period`: ALL (default), TODAY, WEEK (since Monday) or MONTH. `file` keeps only the files whose name or path contains it (case-insensitive). Reads the tracker's live records (the log file on disk can lag a few minutes). Read-only.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `period` | `string` | `null` |\n| `file` | `string` | `null` |\n\nReturns `TimeTrackingReport`.","metadata":{"title":"TimeTrackingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/time-tracking/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/time-tracking/#methods","collection":"scripting","hash":"86613f43f3fa97fa6cbaaf8ac0d918b0","indexed_by":"docs-index"}},{"content":"ToiEtMoiApi\n\nToi et Moi ring top (the ArtisanToiEtMoi tool, headless): two INDEPENDENT stones straddling the top of a finger size, one leaning to each side. The classic combinations mix shapes (pear + round).\n\n```python\nfrom ArtisanPlugin.Scripting import ToiEtMoiApi\n```\n\nSee also the guide, Gems › Toi et Moi, and the Python package, `ra.toi_et_moi`.","metadata":{"title":"ToiEtMoiApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/toi-et-moi/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/toi-et-moi/","collection":"scripting","hash":"756102567dd2bfa98db3172f7f4db2e0","indexed_by":"docs-index"}},{"content":"ToiEtMoiApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Creates the editable Toi et Moi group. |\n\nCreate\n```csharp\nIReadOnlyList<Guid> ToiEtMoiApi.Create(\n    string shapeA,\n    double caratsA,\n    string shapeB,\n    double caratsB,\n    string materialA = \"Diamond\",\n    string materialB = \"Diamond\",\n    double angleA = 14,\n    double angleB = -14,\n    double rotationYA = 20,\n    double rotationYB = -20,\n    double distance = 0,\n    double fingerDiameter = 0)\n```\n\nCreates the editable Toi et Moi group. Per stone: shape (GemShape name), carats and material; placement starts from the user's saved Toi et Moi defaults when there are any (an argument left at its signature default keeps the saved value), otherwise from the tool's (stone A at +14 degrees leaning +20, stone B mirrored), unless the angle/rotationY arguments say otherwise. `fingerDiameter` 0 = the document's finger size. Returns the ids of the two gems (the group also carries the finger reference circle).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `shapeA` | `string` | required |\n| `caratsA` | `double` | required |\n| `shapeB` | `string` | required |\n| `caratsB` | `double` | required |\n| `materialA` | `string` | `\"Diamond\"` |\n| `materialB` | `string` | `\"Diamond\"` |\n| `angleA` | `double` | `14` |\n| `angleB` | `double` | `-14` |\n| `rotationYA` | `double` | `20` |\n| `rotationYB` | `double` | `-20` |\n| `distance` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ToiEtMoiApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/toi-et-moi/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/toi-et-moi/#methods","collection":"scripting","hash":"0042ce3bf786c32f542ef6589c04ff10","indexed_by":"docs-index"}},{"content":"TransformApi\n\nThe array tools (ArtisanArrayPolar, ArtisanArrayOnCurve panels plus a plain linear array), headless. Same conventions as the rest of the family (mm, null/empty objectIds = the current selection, LicenseGate first, redraw at the end), and like TransformApi.Basics every method ends with the parametric engine's MeetMotherAndChildren() so the copies' children re-adopt their nearest mother — exactly what the panels do on Accept.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi\n```\n\nSee also the guide, Transform, and the Python package, `ra.transform`.","metadata":{"title":"TransformApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/","collection":"scripting","hash":"6ea91b01251a846bfb018bd60362719a","indexed_by":"docs-index"}},{"content":"TransformApi — Methods\n\n| Method | |\n|---|---|\n| `ArrayLinear` | Copies the objects `count` times in total (original included) along `step`: copy i sits at i * step. |\n| `ArrayOnCurve` | The ArtisanArrayOnCurve panel, headless: distributes copies of the objects along `curveId`, each copy reoriented to the curve's perpendicular frame (the objects are expected modeled around the world origin on the XY plane, like the panel). |\n| `ArrayPolar` | The ArtisanArrayPolar panel, headless: revolves the objects around the axis of `plane` (\"TOP\" = around world Z, \"FRONT\" = around Y, \"SIDE\" = around X, \"CPLANE\" = the active viewport's construction plane), `copies` per row over `angle` degrees (alignment JUSTIFY spreads over the full 360 regardless of angle; LEFT/CENTER/RIGHT start the sweep before/around/after the original). |\n| `Bend` | Bends the objects around their bounding-box center (the ArtisanBend tool, headless). |\n| `Center` | The ArtisanCenter command, headless: translates the objects, as one set, so the center of their common world-axis bounding box lands on the world origin (0,0,0). |\n| `Copies` | The ArtisanCopies command, headless: duplicates the objects `count` times (1..100; 0 = 1) along -Y for a production tray, each copy one selection-height further (the union bounding box's Y extent), so multi-object models keep their parts together and the copies touch edge to edge. |\n| `CopyOnObjects` | The ArtisanCopyOnObjects command, headless: copies the objects onto the target objects, once per point in `points` (each point replicates one click of the command; the command loops until Enter). |","metadata":{"title":"TransformApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","collection":"scripting","hash":"ddaa678baff975d66c2d445762e7482c","indexed_by":"docs-index"}},{"content":"TransformApi — Methods\n\n| Method | |\n|---|---|\n| `Distribute` | The ArtisanDistribute command, headless: lays the objects out in a row along +X for a print/casting tray -- each piece resting on Z = 0 with its back edge on Y = 0, left edges chained with a 10 % gap of each piece's width. |\n| `Duplicate` | Duplicates the objects in place (a copy on top of each original) — the starting point of \"duplicate and vary\" Flow recipes. |\n| `FlowByCurve` | The ArtisanSmartFlowbyCurve panel, headless: flows the objects from `baseCurveId` onto `targetCurveId` (Rhino's Flow space morph). |\n| `FlowBySurface` | The ArtisanSmartFlowbySurface panel, headless: flows the objects from `baseSurfaceId` onto `targetSurfaceId` (Rhino's Sporph space morph; the first face of a polysurface/extrusion is used, like the panel). |\n| `Mirror` | Mirrors the objects across a world plane through `origin` (null = the world origin): \"XY\", \"YZ\" or \"XZ\". |\n| `MirrorOpposite` | The ArtisanMirrorOpposite command, headless: places one copy of each object on the opposite side of `plane`'s origin (null = the active viewport's construction plane, like the command; world XY when there is no view). |\n| `MirrorQuad` | The ArtisanMirrorQuad command, headless: mirrors the objects into the other three quadrants of `plane` (null = the active viewport's construction plane, like the command; world XY when there is no view). |\n| `Move` | Translates the objects by `translation` mm. |\n| `MoveByNormal` | The ArtisanMoveByNormal command, headless: moves each object along the normal of `surfaceId` -- evaluated at the surface point closest to the object's bounding-box center, so each object follows its own local normal -- by `distance` mm (the command's initial default is 1.0; negative moves against the normal). |","metadata":{"title":"TransformApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","collection":"scripting","hash":"e224c5dbd86b8f1e826c72d6c9a92253","indexed_by":"docs-index"}},{"content":"TransformApi — Methods\n\n| Method | |\n|---|---|\n| `MoveOnObjects` | The ArtisanMoveOnObjects command, headless: same placement math as CopyOnObjects (same base mesh, same per-object frame from the mesh point and normal closest to the bounding-box center) but the objects are MOVED in place onto the single `point` (pulled onto the base mesh first, like the command's cursor constraint). |\n| `MoveRandom` | The ArtisanMoveRandom command, headless: moves EACH object by `distance` mm along its own random unit direction (a different direction per object), to break the perfect regularity of pave stones or beads. |\n| `OrientOnSurface` | The ArtisanOrientOnSurface command, headless: copies the objects onto `surfaceId` (a surface/polysurface/extrusion), once per point in `points` (each point = one click of the command). |\n| `Rotate` | Rotates the objects `angleDegrees` around `axis` (\"X\", \"Y\" or \"Z\", world-oriented) through `center` (null = the center of the common bounding box, so the selection spins in place). |\n| `Scale` | Scales the objects by `factor` about `center` (null = the center of the common bounding box). |\n| `ScaleByCenter` | The ArtisanScaleByCenter command, headless: scales the objects uniformly by `factor` (> 0; 1 = no change) about the center of their common bounding box, so the set grows/shrinks in place. |\n| `ScaleByWeight` | Uniformly scales the objects so they weigh exactly `targetGrams` when cast in `metal` (the ArtisanScaleByWeight tool, headless). |\n| `ScaleToDimensions` | The ArtisanScaleByDimensions panel, headless: scales the objects (as one set, about the center of their common world-axis bounding box) so that box measures exactly the given sizes, in mm. |","metadata":{"title":"TransformApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","collection":"scripting","hash":"d9b6fec1aa03302b45a386e864443179","indexed_by":"docs-index"}},{"content":"TransformApi — Methods\n\n| Method | |\n|---|---|\n| `Taper` | Tapers the objects along a bounding-box axis (the ArtisanTaper tool, headless): the section grows/shrinks linearly toward the \"Top\" end of the axis - tapered shanks, cone-ing a motif. |\n| `Twist` | Twists the objects `angleDegrees` around a bounding-box axis (the ArtisanTwist tool, headless) - rope-like shanks, twisted wires, spiral motifs. |","metadata":{"title":"TransformApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#methods","collection":"scripting","hash":"d42bc13fc8b5e880ea204b7cd845f979","indexed_by":"docs-index"}},{"content":"TransformApi — ArrayLinear\n\n```csharp\nIReadOnlyList<Guid> TransformApi.ArrayLinear(\n    IEnumerable<Guid> objectIds = null,\n    int count = 2,\n    Vector3d? step = null)\n```\n\nCopies the objects `count` times in total (original included) along `step`: copy i sits at i * step. Returns the ids of the created copies ((count - 1) x objects).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `count` | `int` | `2` |\n| `step` | `Vector3d?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"ArrayLinear","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arraylinear","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arraylinear","collection":"scripting","hash":"138fe6910e09c81b1bb0cf6753ab6efe","indexed_by":"docs-index"}},{"content":"TransformApi — ArrayOnCurve\n\n```csharp\nIReadOnlyList<Guid> TransformApi.ArrayOnCurve(\n    IEnumerable<Guid> objectIds = null,\n    Guid? curveId = null,\n    int copies = 6,\n    double distance = 1,\n    string alignment = \"JUSTIFY\",\n    string mode = \"CENTER\",\n    double rotation = 0,\n    double moveInZ = 0,\n    IEnumerable<Guid> surfaceIds = null,\n    bool keepOriginal = false)\n```\n\nThe ArtisanArrayOnCurve panel, headless: distributes copies of the objects along `curveId`, each copy reoriented to the curve's perpendicular frame (the objects are expected modeled around the world origin on the XY plane, like the panel). With `surfaceIds` the frames also lean on those objects' render mesh normal — the panel's optional base surface, for arrays that hug a shank. `alignment` START/CENTER/END packs the run with `distance` mm between copies; JUSTIFY spreads `copies` evenly over the whole curve and ignores `distance`. `mode` END keeps the copies' ends inside the curve, CENTER lets the first/last centers sit on the curve ends. `rotation` (degrees, around the running axis) and `moveInZ` (mm) offset every copy. `keepOriginal` false deletes the source objects (the panel's default). Returns the ids of the created copies (copies x objects).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `curveId` | `Guid?` | `null` |\n| `copies` | `int` | `6` |\n| `distance` | `double` | `1` |\n| `alignment` | `string` | `\"JUSTIFY\"` |\n| `mode` | `string` | `\"CENTER\"` |\n| `rotation` | `double` | `0` |\n| `moveInZ` | `double` | `0` |\n| `surfaceIds` | `IEnumerable ` | `null` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"ArrayOnCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arrayoncurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arrayoncurve","collection":"scripting","hash":"46e8894c66a6c40b655dabba307a910d","indexed_by":"docs-index"}},{"content":"TransformApi — ArrayPolar\n\n```csharp\nIReadOnlyList<Guid> TransformApi.ArrayPolar(\n    IEnumerable<Guid> objectIds = null,\n    int copies = 6,\n    double angle = 360,\n    string plane = \"TOP\",\n    string alignment = \"JUSTIFY\",\n    string mode = \"ONE\",\n    int rows = 1,\n    double rowsDistance = 2,\n    bool bothSides = false,\n    bool keepOriginal = false)\n```\n\nThe ArtisanArrayPolar panel, headless: revolves the objects around the axis of `plane` (\"TOP\" = around world Z, \"FRONT\" = around Y, \"SIDE\" = around X, \"CPLANE\" = the active viewport's construction plane), `copies` per row over `angle` degrees (alignment JUSTIFY spreads over the full 360 regardless of angle; LEFT/CENTER/RIGHT start the sweep before/around/after the original). `mode` adds rows (\"ONE\" single row; \"MULTI\"/\"MULTI_INTER\" stack rows every rowsDistance mm along the axis, INTER staggering odd rows half a step; the SPHERICAL variants wrap the rows around the axis origin instead — for domed pave). bothSides mirrors the extra rows below the first. `keepOriginal` false deletes the source objects (the panel's default: the first JUSTIFY copy lands on the original). Returns the ids of the created copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `copies` | `int` | `6` |\n| `angle` | `double` | `360` |\n| `plane` | `string` | `\"TOP\"` |\n| `alignment` | `string` | `\"JUSTIFY\"` |\n| `mode` | `string` | `\"ONE\"` |\n| `rows` | `int` | `1` |\n| `rowsDistance` | `double` | `2` |\n| `bothSides` | `bool` | `false` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"ArrayPolar","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arraypolar","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#arraypolar","collection":"scripting","hash":"65e017996aba86da594d43ebe15de362","indexed_by":"docs-index"}},{"content":"TransformApi — Bend\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Bend(\n    IEnumerable<Guid> objectIds,\n    double xPos = 0,\n    double xNeg = 0,\n    double yPos = 0,\n    double yNeg = 0,\n    string plane = null,\n    IEnumerable<Guid> rigidIds = null,\n    bool keepOriginal = false)\n```\n\nBends the objects around their bounding-box center (the ArtisanBend tool, headless). The jewelry move: curve a flat motif so it wraps the finger - e.g. bend a flat band or pattern around the ring curvature before a flow/boolean. For that, bend on the default \"XY\" plane with equal xPos/xNeg and the amount that matches the finger diameter (see DocumentApi.GetRingSize().Diameter). `xPos`, `xNeg`, `yPos`, `yNeg` are how far (mm) each side of the bounding box is pushed along the bend plane's normal - exactly the four gumball handles of the panel. Positive lifts toward the plane normal, negative bends the other way, 0 leaves that side straight. At least one must be non-zero. Pass the same value to a pair for a symmetric bend (the panel's Symmetrical / Quad modes just mirror one handle onto the others). `plane` is the bend plane: \"XY\" (default, bends up in Z), \"ZX\" or \"YZ\". Returns the new object ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `xPos` | `double` | `0` |\n| `xNeg` | `double` | `0` |\n| `yPos` | `double` | `0` |\n| `yNeg` | `double` | `0` |\n| `plane` | `string` | `null` |\n| `rigidIds` | `IEnumerable ` | `null` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Bend","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#bend","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#bend","collection":"scripting","hash":"a210664a1d888c3b58dbfe93d967e836","indexed_by":"docs-index"}},{"content":"TransformApi — Center\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Center(IEnumerable<Guid> objectIds = null)\n```\n\nThe ArtisanCenter command, headless: translates the objects, as one set, so the center of their common world-axis bounding box lands on the world origin (0,0,0). In-place move; the arrangement between the objects is kept. Returns the ids of the moved objects.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Center","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#center","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#center","collection":"scripting","hash":"b9c5f73086f183e07f77494a92b96881","indexed_by":"docs-index"}},{"content":"TransformApi — Copies\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Copies(IEnumerable<Guid> objectIds = null, int count = 1)\n```\n\nThe ArtisanCopies command, headless: duplicates the objects `count` times (1..100; 0 = 1) along -Y for a production tray, each copy one selection-height further (the union bounding box's Y extent), so multi-object models keep their parts together and the copies touch edge to edge. Returns the ids of the copies (count x objects), in copy-major order.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `count` | `int` | `1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Copies","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#copies","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#copies","collection":"scripting","hash":"2274d108238ea1f9c9557752c39f3bb9","indexed_by":"docs-index"}},{"content":"TransformApi — CopyOnObjects\n\n```csharp\nIReadOnlyList<Guid> TransformApi.CopyOnObjects(\n    IEnumerable<Guid> objectIds,\n    IEnumerable<Guid> targetIds,\n    IEnumerable<Point3d> points)\n```\n\nThe ArtisanCopyOnObjects command, headless: copies the objects onto the target objects, once per point in `points` (each point replicates one click of the command; the command loops until Enter). The frame is derived exactly like the command does: the targets are meshed (render-quality) into one base mesh; for each object, the mesh point and face normal closest to the object's bounding-box center define the origin plane, and the same offset applied at the picked point defines the destination plane -- so a group of objects keeps its arrangement and each copy reorients to the surface normal. Points are pulled onto the base mesh first, like the command's cursor constraint. Plain copies, no history/parametric link (the command records none). Returns the ids of the created copies (points x objects), in point-major order.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `targetIds` | `IEnumerable ` | required |\n| `points` | `IEnumerable ` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"CopyOnObjects","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#copyonobjects","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#copyonobjects","collection":"scripting","hash":"b35ed00615954a86eeea380686cd1994","indexed_by":"docs-index"}},{"content":"TransformApi — Distribute\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Distribute(IEnumerable<Guid> objectIds = null)\n```\n\nThe ArtisanDistribute command, headless: lays the objects out in a row along +X for a print/casting tray -- each piece resting on Z = 0 with its back edge on Y = 0, left edges chained with a 10 % gap of each piece's width. Objects sharing a Rhino group travel together as ONE piece (a ring + its gems is not dismembered); ungrouped objects are a piece each. Order = the order of the ids. In-place move; returns the ids moved.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Distribute","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#distribute","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#distribute","collection":"scripting","hash":"60c76e8ad733423c9695dba3695c70c6","indexed_by":"docs-index"}},{"content":"TransformApi — Duplicate\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Duplicate(IEnumerable<Guid> objectIds = null)\n```\n\nDuplicates the objects in place (a copy on top of each original) — the starting point of \"duplicate and vary\" Flow recipes. Returns the ids of the copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Duplicate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#duplicate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#duplicate","collection":"scripting","hash":"519058344ef829d6a7d5ebe70e8e7c7d","indexed_by":"docs-index"}},{"content":"TransformApi — FlowByCurve\n\n```csharp\nIReadOnlyList<Guid> TransformApi.FlowByCurve(\n    IEnumerable<Guid> deformableIds,\n    Guid baseCurveId,\n    Guid targetCurveId,\n    IEnumerable<Guid> rigidIds = null,\n    bool flipBase = false)\n```\n\nThe ArtisanSmartFlowbyCurve panel, headless: flows the objects from `baseCurveId` onto `targetCurveId` (Rhino's Flow space morph). `deformableIds` are morphed (a shank, a pattern...); `rigidIds` keep their shape and are only re-placed along the curve (gems, settings). At least one of the two lists is required. `flipBase` reverses the base curve direction (the panel's flip button) when the result lands mirrored. Same bake as the panel's Accept: the originals stay, the deformed copies keep the source layer/material and carry Rhino history (editing either curve or the source re-flows them); rigid copies are TransformWithHistory copies. Returns the ids of the created copies (deformed first, then rigid).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `deformableIds` | `IEnumerable ` | required |\n| `baseCurveId` | `Guid` | required |\n| `targetCurveId` | `Guid` | required |\n| `rigidIds` | `IEnumerable ` | `null` |\n| `flipBase` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"FlowByCurve","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#flowbycurve","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#flowbycurve","collection":"scripting","hash":"304c0c3d26457cb49a15f9333cd504b1","indexed_by":"docs-index"}},{"content":"TransformApi — FlowBySurface\n\n```csharp\nIReadOnlyList<Guid> TransformApi.FlowBySurface(\n    IEnumerable<Guid> deformableIds,\n    Guid baseSurfaceId,\n    Guid targetSurfaceId,\n    IEnumerable<Guid> rigidIds = null,\n    string baseOrientation = \"None\",\n    string targetOrientation = \"None\")\n```\n\nThe ArtisanSmartFlowbySurface panel, headless: flows the objects from `baseSurfaceId` onto `targetSurfaceId` (Rhino's Sporph space morph; the first face of a polysurface/extrusion is used, like the panel). `deformableIds` are morphed, `rigidIds` keep their shape and are re-placed frame-to-frame (gems, settings); at least one of the two lists is required. `baseOrientation` / `targetOrientation` are the panel's UV combos: \"None\" (default), \"ReverseU\", \"ReverseV\" or \"SwapUV\" -- use them when the result lands mirrored or rotated. Same bake as the Accept: originals stay, copies keep the source layer/material and carry Rhino history. Returns the ids of the created copies (deformed first, then rigid).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `deformableIds` | `IEnumerable ` | required |\n| `baseSurfaceId` | `Guid` | required |\n| `targetSurfaceId` | `Guid` | required |\n| `rigidIds` | `IEnumerable ` | `null` |\n| `baseOrientation` | `string` | `\"None\"` |\n| `targetOrientation` | `string` | `\"None\"` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"FlowBySurface","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#flowbysurface","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#flowbysurface","collection":"scripting","hash":"2e7bd817c27d810110109940e49e234a","indexed_by":"docs-index"}},{"content":"TransformApi — Mirror\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Mirror(\n    IEnumerable<Guid> objectIds = null,\n    string plane = \"YZ\",\n    Point3d? origin = null,\n    bool copy = true)\n```\n\nMirrors the objects across a world plane through `origin` (null = the world origin): \"XY\", \"YZ\" or \"XZ\". Unlike the two jewelry mirrors (MirrorQuad/MirrorOpposite) this is the plain mirror, plain copies without history. `copy` false mirrors in place.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `plane` | `string` | `\"YZ\"` |\n| `origin` | `Point3d?` | `null` |\n| `copy` | `bool` | `true` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Mirror","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirror","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirror","collection":"scripting","hash":"b80439991a5a7f423872ee0660372e26","indexed_by":"docs-index"}},{"content":"TransformApi — MirrorOpposite\n\n```csharp\nIReadOnlyList<Guid> TransformApi.MirrorOpposite(\n    IEnumerable<Guid> objectIds = null,\n    Plane? plane = null)\n```\n\nThe ArtisanMirrorOpposite command, headless: places one copy of each object on the opposite side of `plane`'s origin (null = the active viewport's construction plane, like the command; world XY when there is no view). The two mirrors compose into a 180-degree rotation around the plane's vertical axis, so the copy keeps its handedness. History-linked copies, like the command. Returns the ids of the created copies (1 per object).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"MirrorOpposite","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirroropposite","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirroropposite","collection":"scripting","hash":"a9349ca99389aca1d8bb10708b481070","indexed_by":"docs-index"}},{"content":"TransformApi — MirrorQuad\n\n```csharp\nIReadOnlyList<Guid> TransformApi.MirrorQuad(\n    IEnumerable<Guid> objectIds = null,\n    Plane? plane = null)\n```\n\nThe ArtisanMirrorQuad command, headless: mirrors the objects into the other three quadrants of `plane` (null = the active viewport's construction plane, like the command; world XY when there is no view). Each object gets three history-linked copies -- across the plane's ZX plane, across its YZ plane, and across both -- so the four quadrants stay symmetric and the copies follow when the original is edited. Returns the ids of the created copies (3 per object).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"MirrorQuad","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirrorquad","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#mirrorquad","collection":"scripting","hash":"7a1f3e6af6ca87851e2acf23e3be4f86","indexed_by":"docs-index"}},{"content":"TransformApi — Move\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Move(\n    IEnumerable<Guid> objectIds = null,\n    Vector3d? translation = null,\n    bool copy = false)\n```\n\nTranslates the objects by `translation` mm. `copy` true leaves the originals and returns the ids of the copies; false moves in place and returns the same ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `translation` | `Vector3d?` | `null` |\n| `copy` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Move","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#move","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#move","collection":"scripting","hash":"9a4920602eeccd65bf8e15e91d1f79e8","indexed_by":"docs-index"}},{"content":"TransformApi — MoveByNormal\n\n```csharp\nint TransformApi.MoveByNormal(\n    IEnumerable<Guid> objectIds,\n    Guid surfaceId,\n    double distance = 1)\n```\n\nThe ArtisanMoveByNormal command, headless: moves each object along the normal of `surfaceId` -- evaluated at the surface point closest to the object's bounding-box center, so each object follows its own local normal -- by `distance` mm (the command's initial default is 1.0; negative moves against the normal). `surfaceId` must be a surface or a single-face polysurface/extrusion, like the command's surface pick. In-place moves: returns the number of objects moved.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `surfaceId` | `Guid` | required |\n| `distance` | `double` | `1` |\n\nReturns `int`.","metadata":{"title":"TransformApi","section":"MoveByNormal","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#movebynormal","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#movebynormal","collection":"scripting","hash":"13fe782a1fee7c21ea4682dcbb3a7b22","indexed_by":"docs-index"}},{"content":"TransformApi — MoveOnObjects\n\n```csharp\nint TransformApi.MoveOnObjects(\n    IEnumerable<Guid> objectIds,\n    IEnumerable<Guid> targetIds,\n    Point3d point)\n```\n\nThe ArtisanMoveOnObjects command, headless: same placement math as CopyOnObjects (same base mesh, same per-object frame from the mesh point and normal closest to the bounding-box center) but the objects are MOVED in place onto the single `point` (pulled onto the base mesh first, like the command's cursor constraint). Returns the number of objects moved.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `targetIds` | `IEnumerable ` | required |\n| `point` | `Point3d` | required |\n\nReturns `int`.","metadata":{"title":"TransformApi","section":"MoveOnObjects","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#moveonobjects","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#moveonobjects","collection":"scripting","hash":"f1a3d7388e5c43df9ff6595e87e7f5fa","indexed_by":"docs-index"}},{"content":"TransformApi — MoveRandom\n\n```csharp\nIReadOnlyList<Guid> TransformApi.MoveRandom(\n    IEnumerable<Guid> objectIds = null,\n    double distance = 0.05)\n```\n\nThe ArtisanMoveRandom command, headless: moves EACH object by `distance` mm along its own random unit direction (a different direction per object), to break the perfect regularity of pave stones or beads. 0 = the command's default distance, 0.05 mm; the command accepts -1000..1000. In-place move; returns the ids moved.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `distance` | `double` | `0.05` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"MoveRandom","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#moverandom","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#moverandom","collection":"scripting","hash":"7e51f67dfa77a0292b7800e6af88d536","indexed_by":"docs-index"}},{"content":"TransformApi — OrientOnSurface\n\n```csharp\nIReadOnlyList<Guid> TransformApi.OrientOnSurface(\n    IEnumerable<Guid> objectIds,\n    Guid surfaceId,\n    IEnumerable<Point3d> points,\n    double scale = 1,\n    double angleDegrees = 0,\n    double normalOffset = 0,\n    string alignment = \"Center\",\n    bool flip = false)\n```\n\nThe ArtisanOrientOnSurface command, headless: copies the objects onto `surfaceId` (a surface/polysurface/extrusion), once per point in `points` (each point = one click of the command). The set is anchored by the active construction plane (world XY headless) whose origin sits at the bounding-box `alignment` point (\"Center\" default, \"Top\" or \"Bottom\" = the box's top/bottom face center) and mapped to the surface frame at the point closest to each pick. Options as the command: `scale` (uniform, 0 = 1), `angleDegrees` (spin around the surface normal), `normalOffset` (mm along the normal, negative = into the surface) and `flip` (the command's Flip toggle: false = the command's default orientation, true = the other side). Returns the ids of the created copies (points x objects), in point-major order.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `surfaceId` | `Guid` | required |\n| `points` | `IEnumerable ` | required |\n| `scale` | `double` | `1` |\n| `angleDegrees` | `double` | `0` |\n| `normalOffset` | `double` | `0` |\n| `alignment` | `string` | `\"Center\"` |\n| `flip` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"OrientOnSurface","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#orientonsurface","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#orientonsurface","collection":"scripting","hash":"6907ecd9d1b8323701a1c71ae3a7f76e","indexed_by":"docs-index"}},{"content":"TransformApi — Rotate\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Rotate(\n    IEnumerable<Guid> objectIds = null,\n    double angleDegrees = 0,\n    string axis = \"Z\",\n    Point3d? center = null,\n    bool copy = false)\n```\n\nRotates the objects `angleDegrees` around `axis` (\"X\", \"Y\" or \"Z\", world-oriented) through `center` (null = the center of the common bounding box, so the selection spins in place). Positive angles are counter-clockwise looking down the axis. `copy` true rotates copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `angleDegrees` | `double` | `0` |\n| `axis` | `string` | `\"Z\"` |\n| `center` | `Point3d?` | `null` |\n| `copy` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Rotate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#rotate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#rotate","collection":"scripting","hash":"9f809efc46a9ec1d9365f8af7396fe2c","indexed_by":"docs-index"}},{"content":"TransformApi — Scale\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Scale(\n    IEnumerable<Guid> objectIds = null,\n    double factor = 1,\n    double factorY = 0,\n    double factorZ = 0,\n    Point3d? center = null,\n    bool copy = false)\n```\n\nScales the objects by `factor` about `center` (null = the center of the common bounding box). `factorY`/`factorZ` 0 = same as `factor` (uniform); given, each axis scales by its own factor (world axes). `copy` true scales copies.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `factor` | `double` | `1` |\n| `factorY` | `double` | `0` |\n| `factorZ` | `double` | `0` |\n| `center` | `Point3d?` | `null` |\n| `copy` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Scale","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scale","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scale","collection":"scripting","hash":"58db319cc5f72d24067630c588b09aa5","indexed_by":"docs-index"}},{"content":"TransformApi — ScaleByCenter\n\n```csharp\nIReadOnlyList<Guid> TransformApi.ScaleByCenter(\n    IEnumerable<Guid> objectIds = null,\n    double factor = 1)\n```\n\nThe ArtisanScaleByCenter command, headless: scales the objects uniformly by `factor` (> 0; 1 = no change) about the center of their common bounding box, so the set grows/shrinks in place. The scale plane is the active construction plane (world XY headless) moved to that center, like the command. In place; returns the ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | `null` |\n| `factor` | `double` | `1` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"ScaleByCenter","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scalebycenter","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scalebycenter","collection":"scripting","hash":"a44bd4b337b61f684495869e30b9bd78","indexed_by":"docs-index"}},{"content":"TransformApi — ScaleByWeight\n\n```csharp\ndouble TransformApi.ScaleByWeight(\n    IEnumerable<Guid> objectIds,\n    double targetGrams,\n    string metal = null,\n    bool keepOriginal = false)\n```\n\nUniformly scales the objects so they weigh exactly `targetGrams` when cast in `metal` (the ArtisanScaleByWeight tool, headless). `metal` empty/null = the document's primary metal; `keepOriginal` true scales a copy and leaves the original (the tool's DeleteOriginal toggle, inverted). Objects must be closed solids/ meshes for their volume to count. Returns the scale factor that was applied (1.0 = it already weighed the target).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `targetGrams` | `double` | required |\n| `metal` | `string` | `null` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `double`.","metadata":{"title":"TransformApi","section":"ScaleByWeight","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scalebyweight","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scalebyweight","collection":"scripting","hash":"46ecf0cbbbbc8ccf6542663f5e652543","indexed_by":"docs-index"}},{"content":"TransformApi — ScaleToDimensions\n\n```csharp\nIReadOnlyList<Guid> TransformApi.ScaleToDimensions(\n    IEnumerable<Guid> objectIds,\n    double sizeX = 0,\n    double sizeY = 0,\n    double sizeZ = 0,\n    bool keepAspect = true,\n    bool keepOriginal = false)\n```\n\nThe ArtisanScaleByDimensions panel, headless: scales the objects (as one set, about the center of their common world-axis bounding box) so that box measures exactly the given sizes, in mm. 0 on an axis = leave that axis alone (factor from the other axes, or 1). With `keepAspect` true (the panel's Keep Aspect toggle, on by default) exactly ONE of sizeX/sizeY/sizeZ must be given and the scale is uniform on the three axes -- \"make it 20 mm wide\". With `keepAspect` false each given axis scales independently. An axis on which the selection is flat (zero extent) cannot be driven, same as the panel disabling that field. `keepOriginal` true scales a copy and leaves the original (the panel's Delete Original toggle, inverted; the panel default is to delete). Returns the ids of the resulting objects: new copies when `keepOriginal` is true, the same ids (scaled in place) otherwise.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `sizeX` | `double` | `0` |\n| `sizeY` | `double` | `0` |\n| `sizeZ` | `double` | `0` |\n| `keepAspect` | `bool` | `true` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"ScaleToDimensions","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scaletodimensions","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#scaletodimensions","collection":"scripting","hash":"18c8f05baf4c6325bc987edf1c3a35df","indexed_by":"docs-index"}},{"content":"TransformApi — Taper\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Taper(\n    IEnumerable<Guid> objectIds,\n    double deltaMm,\n    string direction = null,\n    string mode = null,\n    double breakOne = 0,\n    double breakTwo = 0,\n    bool flat = false,\n    bool infinite = false,\n    IEnumerable<Guid> rigidIds = null,\n    bool keepOriginal = false)\n```\n\nTapers the objects along a bounding-box axis (the ArtisanTaper tool, headless): the section grows/shrinks linearly toward the \"Top\" end of the axis - tapered shanks, cone-ing a motif. `deltaMm` is how much the half-width changes at the far end, in mm: positive widens, negative narrows; must be non-zero. `direction` and the `mode`/`breakOne`/`breakTwo` trio work exactly like Twist's (defaults \"ZTop\", \"Uniform\", 0.5, 0.75). `flat` tapers only in the gumball plane's X (one-directional squeeze); `infinite` extends the taper beyond the axis ends instead of clamping. Returns the new object ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `deltaMm` | `double` | required |\n| `direction` | `string` | `null` |\n| `mode` | `string` | `null` |\n| `breakOne` | `double` | `0` |\n| `breakTwo` | `double` | `0` |\n| `flat` | `bool` | `false` |\n| `infinite` | `bool` | `false` |\n| `rigidIds` | `IEnumerable ` | `null` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Taper","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#taper","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#taper","collection":"scripting","hash":"cab71e7c6732fcfeae5669b9d82109a0","indexed_by":"docs-index"}},{"content":"TransformApi — Twist\n\n```csharp\nIReadOnlyList<Guid> TransformApi.Twist(\n    IEnumerable<Guid> objectIds,\n    double angleDegrees,\n    string direction = null,\n    string mode = null,\n    double breakOne = 0,\n    double breakTwo = 0,\n    IEnumerable<Guid> rigidIds = null,\n    bool keepOriginal = false)\n```\n\nTwists the objects `angleDegrees` around a bounding-box axis (the ArtisanTwist tool, headless) - rope-like shanks, twisted wires, spiral motifs. `direction` is the twist axis through the bounding box: \"ZTop\" (default), \"ZBottom\", \"YTop\", \"YBottom\", \"XTop\", \"XBottom\" - the \"Top\" end is the one that rotates. `mode` limits where the twist happens along that axis: \"Uniform\" (default, whole length), \"OneBreak\" (only past `breakOne`) or \"TwoBreaks\" (only between `breakOne` and `breakTwo`). The breaks are normalized 0-1 positions on the axis; 0 = the tool defaults (0.5 and 0.75). Circles are rebuilt to 10-point degree-3 curves before twisting (same as the command), so they can actually deform. Returns the new object ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `angleDegrees` | `double` | required |\n| `direction` | `string` | `null` |\n| `mode` | `string` | `null` |\n| `breakOne` | `double` | `0` |\n| `breakTwo` | `double` | `0` |\n| `rigidIds` | `IEnumerable ` | `null` |\n| `keepOriginal` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TransformApi","section":"Twist","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#twist","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/transform/#twist","collection":"scripting","hash":"c9ad0c632330ad997f69026ca43afde7","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi\n\nTrellis settings.\n\n```python\nfrom ArtisanPlugin.Scripting import TrellisGemsetApi\n```\n\nSee also the guide, Gemsets › Trellis, and the Python package, `ra.trellis_gemset`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ITrellisGemset` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ITrellisGemset` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a trellis gemset (four crossing prongs descending from the gem girdle to a ring curve, plus an optional upper rail) around an existing gem -- the ArtisanTrellisGemset tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `ITrellisGemset` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Trellis gemsets currently selected in the active doc. |","metadata":{"title":"TrellisGemsetApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/","collection":"scripting","hash":"f4c424b4ad06cc4d1e817b646402f789","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — All\n\n```csharp\nIReadOnlyList<ITrellisGemset> TrellisGemsetApi.All()\n```\n\n`ITrellisGemset` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ITrellisGemset> TrellisGemsetApi.ByLayer(string layerName)\n```\n\n`ITrellisGemset` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TrellisGemsetApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#all","collection":"scripting","hash":"506e77581f05d42eb9ea1f25679d0d78","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — Count\n\n```csharp\nint TrellisGemsetApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"TrellisGemsetApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#count","collection":"scripting","hash":"32592d1acd48ebe6080014345c2261db","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — Create\n\n```csharp\nITrellisGemset TrellisGemsetApi.Create(\n    Guid gemId,\n    double prongsDiameter = 0,\n    double openingAngle = 0,\n    double curveVerticalSeparation = 0,\n    double railWidth = 0,\n    double railHeight = 0,\n    bool? rotate90 = null,\n    Guid? ringCurveId = null,\n    string prongMode = null)\n```\n\nBuilds a trellis gemset (four crossing prongs descending from the gem girdle to a ring curve, plus an optional upper rail) around an existing gem -- the ArtisanTrellisGemset tool, headless. `gemId` must be a gem in the active document; pointed / irregular outlines (PEAR, HEART, TRILLION, TRIANGLE, CALF, COFFIN, BAGUETTE) are not supported. Millimetres / degrees; 0 keeps the tool default (or the user's saved defaults): prongsDiameter 1.05, openingAngle 52, curveVerticalSeparation 5.6, railWidth 1.5, railHeight 1.2. `rotate90` true rotates the whole gemset 90 degrees around the gem's table normal (false keeps the model's value). `ringCurveId` picks an existing document curve the prongs land on -- it must lie entirely below the gem girdle; Guid.Empty (the default) generates the same finger-size circle under the gem the panel builds. `prongMode` is ROUND (default) or CLAW, the top of every prong (DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and tuned through the handle (SetClawCapDistance...). Returns an ITrellisGemset handle to the new trellis group.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `prongsDiameter` | `double` | `0` |\n| `openingAngle` | `double` | `0` |\n| `curveVerticalSeparation` | `double` | `0` |\n| `railWidth` | `double` | `0` |\n| `railHeight` | `double` | `0` |\n| `rotate90` | `bool?` | `null` |\n| `ringCurveId` | `Guid?` | `null` |\n| `prongMode` | `string` | `null` |","metadata":{"title":"TrellisGemsetApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#create","collection":"scripting","hash":"5f60858204c70aa06e8d689f97e231ee","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — Create\n\nReturns `ITrellisGemset`.","metadata":{"title":"TrellisGemsetApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#create","collection":"scripting","hash":"4c30f24ab129ee0fa11598b8fa943585","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — Find\n\n```csharp\nITrellisGemset TrellisGemsetApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ITrellisGemset`.\n\nForGem\n```csharp\nIReadOnlyList<ITrellisGemset> TrellisGemsetApi.ForGem(Guid gemId)\n```\n\n`ITrellisGemset` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TrellisGemsetApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#find","collection":"scripting","hash":"1b17d704242995e0c93611d4bd0d4544","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — Selected\n\n```csharp\nIReadOnlyList<ITrellisGemset> TrellisGemsetApi.Selected()\n```\n\nTrellis gemsets currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"TrellisGemsetApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#selected","collection":"scripting","hash":"955eff918813d28e7659768c7b70955d","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — ITrellisGemset\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BottomProfile` | `string` | get | \"CIRCLE\" \\| \"SQUARE\" \\| \"CUSTOM\" |\n| `ClawCapDistance` | `double` | get | The claw actually built, the same numbers as on a martini: mm the apex is pulled in toward the gem centre. (The panel shows these as adjustments from 0 = the default claw: 1.00 / -0.50 / 0.25 / 0.05.) |\n| `ClawCapHeight` | `double` | get | mm the apex moves up (+) or down (-) |\n| `ClawTipSmoothness` | `double` | get | body-to-tip blend, 0-1 |\n| `ClawTipWidth` | `double` | get | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `CrossHeight` | `double` | get | signed |\n| `CurveVerticalSeparation` | `double` | get | Vertical gap between the gem girdle plane and the top of the auto-generated default ring curve (only meaningful when no ring curve was selected). |\n| `FaceTangent` | `bool` | get | |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | signed |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `OpeningAngle` | `double` | get | |\n| `OverGirdle` | `double` | get | |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngMode` | `string` | get | Construction modes and the rest of the current values. The top of every prong: \"ROUND\" \\| \"CLAW\" (claw tips are built in Render mode only); BottomProfile is the section at the bottom. |","metadata":{"title":"TrellisGemsetApi","section":"ITrellisGemset","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","collection":"scripting","hash":"89755aa5f66e3cd2b68bda2a75b7fe6b","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — ITrellisGemset\n\n| Property | Type | | |\n|---|---|---|---|\n| `ProngsDiameter` | `double` | get | Crossing prongs (the trellis \"X\" descending from the gem girdle to the ring curve). Millimetres / degrees. |\n| `RingCurveId` | `Guid` | get | Rhino id of the ring curve the trellis was built on, or Guid.Empty when the auto-generated default curve under the gem was used. |\n| `RingSeparationY` | `double` | get | |\n| `Rotate90` | `bool` | get | |\n| `UpperRailEnabled` | `bool` | get | Upper rail wrapping the gem under the girdle. |\n| `UpperRailHeight` | `double` | get | |\n| `UpperRailMode` | `string` | get | \"CIRCLE\" \\| \"CUSTOM\" |\n| `UpperRailWidth` | `double` | get | |","metadata":{"title":"TrellisGemsetApi","section":"ITrellisGemset","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","collection":"scripting","hash":"202e1dfdd9e31875d7a10e61f04757ff","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — ITrellisGemset\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBottomHeight(double height)` | |\n| `void SetBottomProfile(string profile)` | CIRCLE \\| SQUARE \\| CUSTOM |\n| `void SetBottomWidth(double width)` | |\n| `void SetClawCapDistance(double distance)` | signed, the claw actually built (see ClawCapDistance) |\n| `void SetClawCapHeight(double height)` | signed |\n| `void SetClawTipSmoothness(double smoothness)` | 0-1 |\n| `void SetClawTipWidth(double width)` | 0-1 |\n| `void SetCrossHeight(double crossHeight)` | signed |\n| `void SetCurveVerticalSeparation(double separation)` | |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetFaceTangent(bool faceTangent)` | |\n| `void SetGemInside(double gemInside)` | signed |\n| `void SetOpeningAngle(double degrees)` | panel range 10-170 |\n| `void SetOverGirdle(double overGirdle)` | |\n| `void SetProfileStart(double start)` | 0-0.95 |\n| `void SetProngMode(string mode)` | Parametric edits -- each regenerates the trellis (the group keeps its id) and calls LicenseGate.RequireValid() first. LITERAL values: 0 and negatives are allowed where the parameter is signed. ROUND \\| CLAW (DEFAULT and CIRCLE also mean ROUND) |\n| `void SetProngsDiameter(double diameter)` | |\n| `void SetRingSeparationY(double separation)` | |\n| `void SetRotate90(bool rotate90)` | |\n| `void SetUpperRailChamfer(bool chamfer)` | |\n| `void SetUpperRailChamferOffset(double offset)` | signed |\n| `void SetUpperRailEnabled(bool enabled)` | |\n| `void SetUpperRailExternalX(double x)` | |\n| `void SetUpperRailExternalY(double y)` | |\n| `void SetUpperRailHeight(double height)` | |\n| `void SetUpperRailHeightUnderGirdle(double height)` | |","metadata":{"title":"TrellisGemsetApi","section":"ITrellisGemset","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","collection":"scripting","hash":"a84a548e55447158500dab8d5c16f607","indexed_by":"docs-index"}},{"content":"TrellisGemsetApi — ITrellisGemset\n\n| Method | |\n|---|---|\n| `void SetUpperRailMode(string mode)` | CIRCLE \\| CUSTOM |\n| `void SetUpperRailProfile(string assetName)` | CLOSED_PROFILE asset |\n| `void SetUpperRailRotation(double degrees)` | signed |\n| `void SetUpperRailWidth(double width)` | |","metadata":{"title":"TrellisGemsetApi","section":"ITrellisGemset","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trellis-gemset/#itrellisgemset","collection":"scripting","hash":"0a0b9f7716d01299262d52748d4e606d","indexed_by":"docs-index"}},{"content":"TrilogyApi\n\nThe Trilogy settings family, headless: ArtisanTrilogyBezelSet, ArtisanTrilogyEastWest, ArtisanTrilogyHalo, ArtisanTrilogyIndividual and ArtisanTrilogyTrellis. Every one of them dresses an EXISTING Three Stones set (ThreeStonesApi.Create / ArtisanThreeStones): pass `gemId` (any one of its three gems -- the set is resolved from its group) or `gemIds` with three loose gems (center + two sides, classified geometrically like the tool's manual pick). The three gems keep their ids: unlike the panel's Accept, nothing is rebaked here.\n\n```python\nfrom ArtisanPlugin.Scripting import TrilogyApi\n```\n\nSee also the Python package, `ra.trilogy`.","metadata":{"title":"TrilogyApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/","collection":"scripting","hash":"10eafe9ec8b13bbd5f448b504dc62e9c","indexed_by":"docs-index"}},{"content":"TrilogyApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `ITrilogy` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ITrilogy` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `CreateBezelSet` | Three bezels on a Three Stones (ArtisanTrilogyBezelSet, headless): one bezel per gem, the two sides sharing the center's parameters unless `sideEdition` (or any side* argument) splits them. |\n| `CreateEastWest` | Three advanced baskets on a Three Stones (ArtisanTrilogyEastWest, headless). |\n| `CreateHalo` | Three halos on a Three Stones (ArtisanTrilogyHalo, headless): the side halos share the center's parameters unless `sideEdition` (or a side* argument) splits them; `cutSidesWithCenter` (default on) fuses the sides into the center halo, `cutByRingSize` trims them flush with the ring. |\n| `CreateIndividual` | One setting per slot on a Three Stones (ArtisanTrilogyIndividual, headless): `centerSetting` / `sideSetting` are TULIP, MARTINI or ADVANCED_BASKET (defaults: tulip in the center, advanced basket -- a single rail -- on the sides). |\n| `CreateTrellis` | Trellis gemset on a Three Stones (ArtisanTrilogyTrellis, headless): 4 shank prongs from the side gems down to the ring curve, 4 cross prongs over the center stone and three under-girdle rails. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `ITrilogy` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | `ITrilogy` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"TrilogyApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#methods","collection":"scripting","hash":"885b8a428cfe4a819b40811db7d59ca3","indexed_by":"docs-index"}},{"content":"TrilogyApi — All\n\n```csharp\nIReadOnlyList<ITrilogy> TrilogyApi.All()\n```\n\n`ITrilogy` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ITrilogy> TrilogyApi.ByLayer(string layerName)\n```\n\n`ITrilogy` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TrilogyApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#all","collection":"scripting","hash":"3603a178cd6a0842f57331fd53487a31","indexed_by":"docs-index"}},{"content":"TrilogyApi — Count\n\n```csharp\nint TrilogyApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nCreateBezelSet\n```csharp\nTrilogyResult TrilogyApi.CreateBezelSet(\n    Guid? gemId = null,\n    IEnumerable<Guid> gemIds = null,\n    double height = 0,\n    double width = 0,\n    double girdleHeight = 0,\n    double girdleWidth = 0,\n    double gemInside = 0,\n    string profile = null,\n    int supportCount = 0,\n    bool? sideEdition = null,\n    double sideHeight = 0,\n    double sideWidth = 0,\n    double sideGirdleHeight = 0,\n    double sideGirdleWidth = 0,\n    bool? cutByRingSize = null,\n    bool? cutByRingSizeSides = null,\n    string element = null)\n```\n\nThree bezels on a Three Stones (ArtisanTrilogyBezelSet, headless): one bezel per gem, the two sides sharing the center's parameters unless `sideEdition` (or any side* argument) splits them. mm; 0 = the tool/saved default (height 3.8, width 1.5, girdle 0.3 x 1.5). `profile` names a BEZEL_PROFILE asset; `cutByRingSize` trims the bezels flush with the ring size. Returns the TrilogyResult (ids).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid?` | `null` |\n| `gemIds` | `IEnumerable ` | `null` |\n| `height` | `double` | `0` |\n| `width` | `double` | `0` |\n| `girdleHeight` | `double` | `0` |\n| `girdleWidth` | `double` | `0` |\n| `gemInside` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `supportCount` | `int` | `0` |\n| `sideEdition` | `bool?` | `null` |\n| `sideHeight` | `double` | `0` |\n| `sideWidth` | `double` | `0` |\n| `sideGirdleHeight` | `double` | `0` |\n| `sideGirdleWidth` | `double` | `0` |\n| `cutByRingSize` | `bool?` | `null` |\n| `cutByRingSizeSides` | `bool?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `TrilogyResult`.","metadata":{"title":"TrilogyApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#count","collection":"scripting","hash":"db278e15c0563b43c371d9c8920763c3","indexed_by":"docs-index"}},{"content":"TrilogyApi — CreateEastWest\n\n```csharp\nTrilogyResult TrilogyApi.CreateEastWest(\n    Guid? gemId = null,\n    IEnumerable<Guid> gemIds = null,\n    string preset = null,\n    string sidePreset = null,\n    string prongMode = null,\n    double prongDiameter = 0,\n    double prongHeight = 0,\n    double railWidth = 0,\n    double railHeight = 0,\n    string railProfile = null,\n    bool? sideEdition = null,\n    string element = null)\n```\n\nThree advanced baskets on a Three Stones (ArtisanTrilogyEastWest, headless). Each basket takes its gem shape's default prong layout (emerald -> 4 corners, trillion -> 3 vertices...) unless `preset` / `sidePreset` name another one (AdvancedBasketApi.Presets names, e.g. PRONG_ROUND_6, or a 1-based index). Sides share the center's basket when both shapes match; different shapes (or `sideEdition`) give them their own. mm; 0 = default. Returns the TrilogyResult.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid?` | `null` |\n| `gemIds` | `IEnumerable ` | `null` |\n| `preset` | `string` | `null` |\n| `sidePreset` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n| `prongDiameter` | `double` | `0` |\n| `prongHeight` | `double` | `0` |\n| `railWidth` | `double` | `0` |\n| `railHeight` | `double` | `0` |\n| `railProfile` | `string` | `null` |\n| `sideEdition` | `bool?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `TrilogyResult`.","metadata":{"title":"TrilogyApi","section":"CreateEastWest","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createeastwest","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createeastwest","collection":"scripting","hash":"5b03887bfb91baf1a86ae2758b695255","indexed_by":"docs-index"}},{"content":"TrilogyApi — CreateHalo\n\n```csharp\nTrilogyResult TrilogyApi.CreateHalo(\n    Guid? gemId = null,\n    IEnumerable<Guid> gemIds = null,\n    double stoneSize = 0,\n    double stoneDistance = 0,\n    double distanceToGem = 0,\n    double channelWidth = 0,\n    double channelHeight = 0,\n    string prongType = null,\n    string profile = null,\n    bool? cutByRingSize = null,\n    bool? cutSidesWithCenter = null,\n    bool? sideEdition = null,\n    double sideStoneSize = 0,\n    double sideStoneDistance = 0,\n    double sideChannelWidth = 0,\n    double sideChannelHeight = 0,\n    Guid? ringCurveId = null,\n    string element = null,\n    string prongMode = null)\n```\n\nThree halos on a Three Stones (ArtisanTrilogyHalo, headless): the side halos share the center's parameters unless `sideEdition` (or a side* argument) splits them; `cutSidesWithCenter` (default on) fuses the sides into the center halo, `cutByRingSize` trims them flush with the ring. Gems must be halo-friendly (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER, PEAR). mm; 0 = default (stone 1.2, distance 0.2, channel 1.8 x 1.5). `profile` = CHANNEL_PROFILE asset. `prongMode` = the three stones' prongs: ROUND, CUSTOM or CLAW (claw tips in Render mode only). Returns the TrilogyResult (halo stones in StoneIds).","metadata":{"title":"TrilogyApi","section":"CreateHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createhalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createhalo","collection":"scripting","hash":"03da5fc7f517be4fd420093b899f76f6","indexed_by":"docs-index"}},{"content":"TrilogyApi — CreateHalo\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid?` | `null` |\n| `gemIds` | `IEnumerable ` | `null` |\n| `stoneSize` | `double` | `0` |\n| `stoneDistance` | `double` | `0` |\n| `distanceToGem` | `double` | `0` |\n| `channelWidth` | `double` | `0` |\n| `channelHeight` | `double` | `0` |\n| `prongType` | `string` | `null` |\n| `profile` | `string` | `null` |\n| `cutByRingSize` | `bool?` | `null` |\n| `cutSidesWithCenter` | `bool?` | `null` |\n| `sideEdition` | `bool?` | `null` |\n| `sideStoneSize` | `double` | `0` |\n| `sideStoneDistance` | `double` | `0` |\n| `sideChannelWidth` | `double` | `0` |\n| `sideChannelHeight` | `double` | `0` |\n| `ringCurveId` | `Guid?` | `null` |\n| `element` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n\nReturns `TrilogyResult`.","metadata":{"title":"TrilogyApi","section":"CreateHalo","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createhalo","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createhalo","collection":"scripting","hash":"95c17a7171963086c5457ff3a2c45cf6","indexed_by":"docs-index"}},{"content":"TrilogyApi — CreateIndividual\n\n```csharp\nTrilogyResult TrilogyApi.CreateIndividual(\n    Guid? gemId = null,\n    IEnumerable<Guid> gemIds = null,\n    string centerSetting = null,\n    string sideSetting = null,\n    double centerRotation = double.NaN,\n    double sideRotation = double.NaN,\n    int tulipProngs = 0,\n    string railProfile = null,\n    bool? scaleSettingToGem = null,\n    Guid? ringCurveId = null,\n    string element = null,\n    string prongMode = null)\n```\n\nOne setting per slot on a Three Stones (ArtisanTrilogyIndividual, headless): `centerSetting` / `sideSetting` are TULIP, MARTINI or ADVANCED_BASKET (defaults: tulip in the center, advanced basket -- a single rail -- on the sides). `centerRotation` / `sideRotation` spin each setting about its gem (degrees; default 45 for a ROUND center, 0 otherwise); `tulipProngs` 4 or 6. `prongMode` ROUND or CLAW on whichever setting each slot uses (claw tips in Render mode only). Returns the TrilogyResult.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid?` | `null` |\n| `gemIds` | `IEnumerable ` | `null` |\n| `centerSetting` | `string` | `null` |\n| `sideSetting` | `string` | `null` |\n| `centerRotation` | `double` | `double.NaN` |\n| `sideRotation` | `double` | `double.NaN` |\n| `tulipProngs` | `int` | `0` |\n| `railProfile` | `string` | `null` |\n| `scaleSettingToGem` | `bool?` | `null` |\n| `ringCurveId` | `Guid?` | `null` |\n| `element` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n\nReturns `TrilogyResult`.","metadata":{"title":"TrilogyApi","section":"CreateIndividual","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createindividual","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createindividual","collection":"scripting","hash":"8bd25e4fe7c8381d2ba03f2e50329f71","indexed_by":"docs-index"}},{"content":"TrilogyApi — CreateTrellis\n\n```csharp\nTrilogyResult TrilogyApi.CreateTrellis(\n    Guid? gemId = null,\n    IEnumerable<Guid> gemIds = null,\n    double shankProngDiameter = 0,\n    double crossProngDiameter = 0,\n    double railWidth = 0,\n    double railHeight = 0,\n    double railUnderGirdle = 0,\n    bool? centerRail = null,\n    bool? sideRails = null,\n    double curveVerticalSeparation = 0,\n    bool? sideRailEdition = null,\n    double sideRailWidth = 0,\n    double sideRailHeight = 0,\n    Guid? ringCurveId = null,\n    string element = null,\n    string prongMode = null)\n```\n\nTrellis gemset on a Three Stones (ArtisanTrilogyTrellis, headless): 4 shank prongs from the side gems down to the ring curve, 4 cross prongs over the center stone and three under-girdle rails. The ring curve is the set's finger circle, `ringCurveId` (must sit below the gems) or a circle at the document size. mm; 0 = default (prongs 1.05, rail 1.0 x 0.9, under girdle 1.45). `prongMode` ROUND or CLAW, the top of every prong (claw tips in Render mode only). Returns the TrilogyResult.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid?` | `null` |\n| `gemIds` | `IEnumerable ` | `null` |\n| `shankProngDiameter` | `double` | `0` |\n| `crossProngDiameter` | `double` | `0` |\n| `railWidth` | `double` | `0` |\n| `railHeight` | `double` | `0` |\n| `railUnderGirdle` | `double` | `0` |\n| `centerRail` | `bool?` | `null` |\n| `sideRails` | `bool?` | `null` |\n| `curveVerticalSeparation` | `double` | `0` |\n| `sideRailEdition` | `bool?` | `null` |\n| `sideRailWidth` | `double` | `0` |\n| `sideRailHeight` | `double` | `0` |\n| `ringCurveId` | `Guid?` | `null` |\n| `element` | `string` | `null` |\n| `prongMode` | `string` | `null` |\n\nReturns `TrilogyResult`.","metadata":{"title":"TrilogyApi","section":"CreateTrellis","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createtrellis","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#createtrellis","collection":"scripting","hash":"f81947d39bd1647aa684a115b975e5aa","indexed_by":"docs-index"}},{"content":"TrilogyApi — Find\n\n```csharp\nITrilogy TrilogyApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ITrilogy`.\n\nForGem\n```csharp\nIReadOnlyList<ITrilogy> TrilogyApi.ForGem(Guid gemId)\n```\n\n`ITrilogy` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TrilogyApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#find","collection":"scripting","hash":"61555b46e950c44c8aca899367994cd2","indexed_by":"docs-index"}},{"content":"TrilogyApi — Selected\n\n```csharp\nIReadOnlyList<ITrilogy> TrilogyApi.Selected()\n```\n\n`ITrilogy` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"TrilogyApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#selected","collection":"scripting","hash":"cbf5b825674dbca47966606136ad098a","indexed_by":"docs-index"}},{"content":"TrilogyApi — ITrilogy\n\n*Handle* — extends `IParametricGroup`, `IParametricObject`.\n\nThe five Trilogy settings (bezel set, east-west, halo, individual, trellis) dressed over a Three Stones.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CenterGemId` | `Guid` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MemberCount` | `int` | get | Rhino objects in the group *(from IParametricGroup)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `ParametersJson` | `string` | get | the kernel model, as stored in the group *(from IParametricGroup)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `RingCurveId` | `Guid` | get | |\n| `SideAGemId` | `Guid` | get | |\n| `SideBGemId` | `Guid` | get | |\n| `Style` | `string` | get | BEZEL_SET \\| EAST_WEST \\| HALO \\| INDIVIDUAL \\| TRELLIS |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `string GetParameter(string path)` | dotted JSON path; null when absent *(from IParametricGroup)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void Regenerate()` | |\n| `void SetElement(string element)` | Applies a saved element of this trilogy's own style (ElementsApi.List (\"TrilogyHalo\") for a HALO...) in place: the gems stay, a preset of another style is rejected, and the trilogy regenerates (same id). |\n| `void SetParameter(string path, string value)` | regenerates in place (same id) |","metadata":{"title":"TrilogyApi","section":"ITrilogy","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#itrilogy","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/trilogy/#itrilogy","collection":"scripting","hash":"f5de66c75aa01e2380b2e4d09c12471c","indexed_by":"docs-index"}},{"content":"TulipApi\n\nTulip settings.\n\n```python\nfrom ArtisanPlugin.Scripting import TulipApi\n```\n\nSee also the guide, Gemsets › Tulip, and the Python package, `ra.tulip`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `ITulip` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ITulip` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Create` | Builds a tulip setting -- petal-shaped SubD prongs holding an existing gem -- the ArtisanTulip tool, headless. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `ForGem` | `ITulip` handles whose mother gem is `gemId` (empty for Guid.Empty). |\n| `Selected` | Tulips currently selected in the active doc. |","metadata":{"title":"TulipApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/","collection":"scripting","hash":"dac0f27eeeba42136d85706e2897c95f","indexed_by":"docs-index"}},{"content":"TulipApi — All\n\n```csharp\nIReadOnlyList<ITulip> TulipApi.All()\n```\n\n`ITulip` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ITulip> TulipApi.ByLayer(string layerName)\n```\n\n`ITulip` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TulipApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#all","collection":"scripting","hash":"cc40e78f4a5b9f816e00dbbcd03f6859","indexed_by":"docs-index"}},{"content":"TulipApi — Count\n\n```csharp\nint TulipApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.","metadata":{"title":"TulipApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#count","collection":"scripting","hash":"0fa105a183ed6194f37a92cae54c391d","indexed_by":"docs-index"}},{"content":"TulipApi — Create\n\n```csharp\nITulip TulipApi.Create(\n    Guid gemId,\n    int prongCount = 0,\n    double pipeDiameter = 0,\n    double height = 0,\n    double bulgeWidth = 0,\n    string mode = null,\n    string ornament = null,\n    string ornamentPlacement = null,\n    double ornamentDiameter = 0,\n    double gemInside = double.NaN,\n    double moveInZ = double.NaN,\n    double bulgeInside = double.NaN,\n    double bulgeSpread = 0,\n    double capDistanceToCenter = double.NaN,\n    double capHeight = double.NaN,\n    double tipWidth = 0,\n    string prongMode = null)\n```\n\nBuilds a tulip setting -- petal-shaped SubD prongs holding an existing gem -- the ArtisanTulip tool, headless. `gemId` must be a gem in the active document; any shape works. On asymmetric stones (oval, marquise, ...) the ornament placement defaults to the X axis with per-axis leaf editing, exactly like the panel. 0 keeps the tool default (or the user's saved defaults): prongCount 4 (valid values 4 or 6), pipeDiameter 1.15 mm, height 1.7 (a vertical SCALE FACTOR of the whole setting, not mm), bulgeWidth 1.5 (multiplier on the reference tangential bow). `prongMode` is ROUND (default) or CLAW (`mode` is its older name; DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and shaped by `capDistanceToCenter`, `capHeight` and `tipWidth` here or the handle's Claw* setters. `ornament` is NONE (default), UNION or LEAF. Returns an ITulip handle to the new tulip group.","metadata":{"title":"TulipApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#create","collection":"scripting","hash":"e3d8e537eab6cd612d3021c740f8c806","indexed_by":"docs-index"}},{"content":"TulipApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n| `prongCount` | `int` | `0` |\n| `pipeDiameter` | `double` | `0` |\n| `height` | `double` | `0` |\n| `bulgeWidth` | `double` | `0` |\n| `mode` | `string` | `null` |\n| `ornament` | `string` | `null` |\n| `ornamentPlacement` | `string` | `null` |\n| `ornamentDiameter` | `double` | `0` |\n| `gemInside` | `double` | `double.NaN` |\n| `moveInZ` | `double` | `double.NaN` |\n| `bulgeInside` | `double` | `double.NaN` |\n| `bulgeSpread` | `double` | `0` |\n| `capDistanceToCenter` | `double` | `double.NaN` |\n| `capHeight` | `double` | `double.NaN` |\n| `tipWidth` | `double` | `0` |\n| `prongMode` | `string` | `null` |\n\nReturns `ITulip`.","metadata":{"title":"TulipApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#create","collection":"scripting","hash":"5b1b7a78cc415935c5a099cf954fe79f","indexed_by":"docs-index"}},{"content":"TulipApi — Find\n\n```csharp\nITulip TulipApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ITulip`.\n\nForGem\n```csharp\nIReadOnlyList<ITulip> TulipApi.ForGem(Guid gemId)\n```\n\n`ITulip` handles whose mother gem is `gemId` (empty for Guid.Empty).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `gemId` | `Guid` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TulipApi","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#find","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#find","collection":"scripting","hash":"e402bca83c41d1042e203a951fedbda0","indexed_by":"docs-index"}},{"content":"TulipApi — Selected\n\n```csharp\nIReadOnlyList<ITulip> TulipApi.Selected()\n```\n\nTulips currently selected in the active doc.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"TulipApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#selected","collection":"scripting","hash":"41c87ffc79c6f6001771f30108241559","indexed_by":"docs-index"}},{"content":"TulipApi — ITulip\n\n*Handle* — extends `IGemSetting`, `IParametricObject`.\n\n| Property | Type | | |\n|---|---|---|---|\n| `BulgeWidth` | `double` | get | the model's DepthBulge |\n| `ClawCapDistance` | `double` | get | The claw tips, CLAW mode only (built in Render mode only), under the names the other settings use. The cap distance (in toward the gem centre) and height (up/down) scale with the stone: mm at the tulip's reference size. |\n| `ClawCapHeight` | `double` | get | |\n| `ClawTipLength` | `double` | get | length of the claw tip, times the tube diameter (default 1) |\n| `ClawTipSmoothness` | `double` | get | body-to-tip blend, 0-1 (the panel leaves it at 0) |\n| `ClawTipWidth` | `double` | get | apex thickness as a fraction of the petal tube: 0 sharp point - 1 full |\n| `GemCaratWeight` | `double` | get | *(from IGemSetting)* |\n| `GemInside` | `double` | get | signed |\n| `GemMaterial` | `string` | get | *(from IGemSetting)* |\n| `GemShape` | `string` | get | *(from IGemSetting)* |\n| `Height` | `double` | get | vertical scale factor (not mm) |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `Mode` | `string` | get | \"Round\" or \"Claw\" (older name of ProngMode) |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `MoveInZ` | `double` | get | signed |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Ornament` | `string` | get | \"None\", \"Union\" or \"Leaf\" |\n| `OrnamentPlacement` | `string` | get | \"AXIS_X\", \"AXIS_Y\" or \"BOTH\" |\n| `PipeDiameter` | `double` | get | mm |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `ProngCount` | `int` | get | Petal prongs holding the center gem 4 or 6 |\n| `ProngMode` | `string` | get | \"ROUND\" or \"CLAW\", as on every setting with prongs |","metadata":{"title":"TulipApi","section":"ITulip","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#itulip","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#itulip","collection":"scripting","hash":"bda298d430da358aada514369986356e","indexed_by":"docs-index"}},{"content":"TulipApi — ITulip\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetBulgeCloseBottom(double close)` | |\n| `void SetBulgeCloseTop(double close)` | |\n| `void SetBulgeInside(double bulgeInside)` | signed |\n| `void SetBulgeSpread(double spread)` | |\n| `void SetBulgeWidth(double bulgeWidth)` | the model's DepthBulge |\n| `void SetCapDistanceToCenter(double distance)` | Older names of SetClawCapDistance, SetClawCapHeight and SetClawTipWidth. |\n| `void SetCapHeight(double height)` | |\n| `void SetClawCapDistance(double distance)` | signed |\n| `void SetClawCapHeight(double height)` | signed |\n| `void SetClawTipLength(double length)` | > 0 |\n| `void SetClawTipSmoothness(double smoothness)` | 0-1 |\n| `void SetClawTipWidth(double width)` | 0-1 |\n| `void SetExtensionForManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | signed |\n| `void SetHeight(double height)` | scale factor, > 0 |\n| `void SetMode(string mode)` | older name of SetProngMode |\n| `void SetMoveInZ(double moveInZ)` | signed |\n| `void SetOrnament(string ornament)` | NONE \\| UNION \\| LEAF |\n| `void SetOrnamentDiameter(double diameter)` | |\n| `void SetOrnamentPlacement(string placement)` | AXIS_X \\| AXIS_Y \\| BOTH |\n| `void SetPipeDiameter(double pipeDiameter)` | Parametric edits -- each regenerates the tulip (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. LITERAL values: 0 and negatives are allowed where the parameter is signed. mm |\n| `void SetProngCount(int count)` | 4 or 6 |\n| `void SetProngMode(string mode)` | ROUND \\| CLAW (DEFAULT and CIRCLE also mean ROUND) |\n| `void SetTipWidth(double width)` | |","metadata":{"title":"TulipApi","section":"ITulip","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#itulip","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/tulip/#itulip","collection":"scripting","hash":"ecd17410b79ab00b23c9945a1c5e202b","indexed_by":"docs-index"}},{"content":"TwoRowsShankBuilderApi\n\nHeadless builder for the two-rows shank. TwoRowsShankApi stays query-only (All/Find/Selected); the ITwoRowsShank handle returned here is the same one it hands out, so `TwoRowsShankApi.Find(id)` finds what Create made.\n\n```python\nfrom ArtisanPlugin.Scripting import TwoRowsShankBuilderApi\n```\n\nSee also the Python package, `ra.two_rows_shank`.","metadata":{"title":"TwoRowsShankBuilderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/","collection":"scripting","hash":"87e389dcd995f31f56b2fe192a6eeeb4","indexed_by":"docs-index"}},{"content":"TwoRowsShankBuilderApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Builds a two-rows shank (the ArtisanTwoRowsShank tool, headless): a classic band with a channel carved on each face, each carrying a row of round stones held by prongs. |","metadata":{"title":"TwoRowsShankBuilderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#methods","collection":"scripting","hash":"5e7701777807490fc589b7c5b3144bb8","indexed_by":"docs-index"}},{"content":"TwoRowsShankBuilderApi — Create\n\n```csharp\nITwoRowsShank TwoRowsShankBuilderApi.Create(\n    double width = 0,\n    double height = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    string layoutMode = null,\n    double topAngle = 0,\n    double startAngle = 0,\n    double endAngle = 0,\n    double gemSize = 0,\n    double channelWidth = 0,\n    double channelOffset = 0,\n    string railMode = null,\n    bool withGems = true,\n    bool withCutters = false,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a two-rows shank (the ArtisanTwoRowsShank tool, headless): a classic band with a channel carved on each face, each carrying a row of round stones held by prongs. Millimetres; 0 keeps the tool default (or the user's saved defaults): width 3, height 2 (band section), gemSize 1.0, channelWidth 1.3 (span along the face), channelOffset 0.3 (depth carved into the band). `layoutMode` \"FULL\" | \"SIDE_ANGLE\" (uses startAngle / endAngle, defaults 30-150) | \"TOP_ANGLE\" (uses topAngle, default 60; the tool default). `railMode` \"DOUBLE\" (one channel per face, the default) | \"SINGLE\" (one wide channel). `withGems` false bakes the carved band alone; `withCutters` adds a parametric drill cutter under every stone, like the panel does. `fingerDiameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name (omitted = the triangular profile the command starts from, or the default one); `plane` omitted = world XY. `element` = name of a saved TwoRowsShank element (ElementsApi.List(\"TwoRowsShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the ITwoRowsShank handle of the new shank (stones, cutters and prongs are its children).","metadata":{"title":"TwoRowsShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#create","collection":"scripting","hash":"e2e2f9d9334eb007519a52327a534170","indexed_by":"docs-index"}},{"content":"TwoRowsShankBuilderApi — Create\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `layoutMode` | `string` | `null` |\n| `topAngle` | `double` | `0` |\n| `startAngle` | `double` | `0` |\n| `endAngle` | `double` | `0` |\n| `gemSize` | `double` | `0` |\n| `channelWidth` | `double` | `0` |\n| `channelOffset` | `double` | `0` |\n| `railMode` | `string` | `null` |\n| `withGems` | `bool` | `true` |\n| `withCutters` | `bool` | `false` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `ITwoRowsShank`.","metadata":{"title":"TwoRowsShankBuilderApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#create","collection":"scripting","hash":"f6421bf2f69718bc41c1704989eec9ee","indexed_by":"docs-index"}},{"content":"TwoRowsShankBuilderApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `ITwoRowsShank`, `IClassicProfile`, `ITwoRowsRail`, `ITwoRowsProng`, `IClassicGems`, `IClassicExternalProfile`, `IClassicAdvanced`.","metadata":{"title":"TwoRowsShankBuilderApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank-builder/#handles-and-sections","collection":"scripting","hash":"d3fdb78f9dced42014dac88c14b54be2","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi\n\nTwo-rows shanks - a band carrying two parallel rows of stones. Query-only for now: run ArtisanTwoRowsShank in the UI once, then script every variant from the handle.\n\n```python\nfrom ArtisanPlugin.Scripting import TwoRowsShankApi\n```\n\nSee also the guide, Shanks › Two rows, and the Python package, `ra.two_rows_shank`.","metadata":{"title":"TwoRowsShankApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/","collection":"scripting","hash":"fbfa51b23c0a8035548588dc11b13128","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `ITwoRowsShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `ITwoRowsShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `ITwoRowsShank` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"TwoRowsShankApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#methods","collection":"scripting","hash":"2e4b60b3b4e2a3f0ca38c5ab5fa3492a","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — All\n\n```csharp\nIReadOnlyList<ITwoRowsShank> TwoRowsShankApi.All()\n```\n\n`ITwoRowsShank` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<ITwoRowsShank> TwoRowsShankApi.ByLayer(string layerName)\n```\n\n`ITwoRowsShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"TwoRowsShankApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#all","collection":"scripting","hash":"ce8f5e6585a28e5a4da59d4d989d2a7b","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — Count\n\n```csharp\nint TwoRowsShankApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nITwoRowsShank TwoRowsShankApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `ITwoRowsShank`.","metadata":{"title":"TwoRowsShankApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#count","collection":"scripting","hash":"43a6392fb58f3dc2e3d53e244b53c501","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — Selected\n\n```csharp\nIReadOnlyList<ITwoRowsShank> TwoRowsShankApi.Selected()\n```\n\n`ITwoRowsShank` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IClassicProfile`, `IClassicGems`, `IClassicExternalProfile`, `IClassicAdvanced`.","metadata":{"title":"TwoRowsShankApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#selected","collection":"scripting","hash":"7bfa246090866a3fe21540347d8a3075","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — ITwoRowsShank\n\n*Handle* — extends `IParametricObject`.\n\nTwo-rows shank: a classic band carrying two parallel rows of stones, one on each face. Multiple gems, so no single MotherGem.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Advanced` | `IClassicAdvanced` | get | |\n| `BottomProfile` | `IClassicProfile` | get | |\n| `CuttersEnabled` | `bool` | get | |\n| `ExternalProfile` | `IClassicExternalProfile` | get | |\n| `Gems` | `IClassicGems` | get | The stones on the rails — the same options as a classic gems row. |\n| `GemsEnabled` | `bool` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MidProfile` | `IClassicProfile` | get | |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Prong` | `ITwoRowsProng` | get | |\n| `Rail` | `ITwoRowsRail` | get | Two-rows specifics. |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n| `TopProfile` | `IClassicProfile` | get | The band is a full classic shank, so it exposes the same sections. |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetCuttersEnabled(bool enabled)` | |\n| `void SetElement(string element)` | Applies a saved TwoRowsShank element (ElementsApi.List(\"TwoRowsShank\")) to this shank: its band, rails and gems replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `void SetGemsEnabled(bool enabled)` | |","metadata":{"title":"TwoRowsShankApi","section":"ITwoRowsShank","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsshank","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsshank","collection":"scripting","hash":"a85681b61f881975ea21aac6e33f590b","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — ITwoRowsRail\n\n*Section*.\n\nThe channel carved on each face of a two-rows band, and how the two gem rows sit in it.\n\n| Property | Type | | |\n|---|---|---|---|\n| `CentralWall` | `double` | get | metal left between the two rows in DOUBLE, mm |\n| `CutOrientation` | `string` | get | \"ANGLED\" (follows the face) or \"HORIZONTAL\"; SINGLE is always horizontal |\n| `EndAngle` | `double` | get | degrees — used when LayoutMode is \"SIDE_ANGLE\" |\n| `EndMargin` | `double` | get | gap between the channel end and the first/last gem, mm |\n| `FitTolerance` | `double` | get | mm |\n| `LayoutMode` | `string` | get | \"FULL\", \"SIDE_ANGLE\" or \"TOP_ANGLE\" |\n| `Offset` | `double` | get | depth carved into the band, mm |\n| `OuterBorder` | `double` | get | SINGLE only: metal rim on each side of the band, mm |\n| `RailMode` | `string` | get | \"DOUBLE\" (one cutter per row) or \"SINGLE\" (one wider cutter) |\n| `Rotation` | `double` | get | degrees |\n| `RowSpacing` | `double` | get | gap between the two gem rows, mm |\n| `StartAngle` | `double` | get | degrees — used when LayoutMode is \"SIDE_ANGLE\" |\n| `TopAngle` | `double` | get | total arc in degrees — used when LayoutMode is \"TOP_ANGLE\" |\n| `Width` | `double` | get | span of the channel along the face, mm |","metadata":{"title":"TwoRowsShankApi","section":"ITwoRowsRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsrail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsrail","collection":"scripting","hash":"242dbdfd17490c5ae812b193baa64d29","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — ITwoRowsRail\n\n| Method | |\n|---|---|\n| `void SetCentralWall(double width)` | |\n| `void SetCutOrientation(string orientation)` | \"ANGLED\" or \"HORIZONTAL\" |\n| `void SetEndMargin(double margin)` | |\n| `void SetFitTolerance(double tolerance)` | |\n| `void SetLayoutMode(string layoutMode)` | \"FULL\", \"SIDE_ANGLE\" or \"TOP_ANGLE\" |\n| `void SetOffset(double offset)` | |\n| `void SetOuterBorder(double border)` | |\n| `void SetRailMode(string railMode)` | \"DOUBLE\" or \"SINGLE\" |\n| `void SetRotation(double degrees)` | |\n| `void SetRowSpacing(double spacing)` | |\n| `void SetSideAngles(double startAngle, double endAngle)` | |\n| `void SetTopAngle(double degrees)` | |\n| `void SetWidth(double width)` | |","metadata":{"title":"TwoRowsShankApi","section":"ITwoRowsRail","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsrail","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsrail","collection":"scripting","hash":"da4766bbcb844619f62cfe990c96b7d4","indexed_by":"docs-index"}},{"content":"TwoRowsShankApi — ITwoRowsProng\n\n*Section*.\n\nThe prong cross-section of a two-rows band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Distance` | `double` | get | mm |\n| `EndProngCount` | `int` | get | |\n| `ExternalDiameter` | `double` | get | mm |\n| `InternalDiameter` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetDistance(double distance)` | |\n| `void SetEndProngCount(int count)` | |\n| `void SetExternalDiameter(double diameter)` | |\n| `void SetInternalDiameter(double diameter)` | |","metadata":{"title":"TwoRowsShankApi","section":"ITwoRowsProng","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsprong","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/two-rows-shank/#itworowsprong","collection":"scripting","hash":"0821418a9762c17a972ca8aa7b4edbd6","indexed_by":"docs-index"}},{"content":"UserElementApi\n\nUser elements (the ArtisanUserElement tool): named groups of document objects tagged with UserElement data so the Outliner lists them. The elements live IN the document -- there is no on-disk library and no insert-by-name flow, so this Api mirrors what the tool actually does: tag an existing selection as a named element, and list the ones the active document already has.\n\n```python\nfrom ArtisanPlugin.Scripting import UserElementApi\n```\n\nSee also the guide, Accessories › User element, and the Python package, `ra.user_element`.","metadata":{"title":"UserElementApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/","collection":"scripting","hash":"ab974f4899abeb2c9cbc49d04917b67a","indexed_by":"docs-index"}},{"content":"UserElementApi — Methods\n\n| Method | |\n|---|---|\n| `Create` | Tags the given objects as a user element named `name` (the tool's whole flow: group them, attach the UserElement user data, and give non-gem solid geometry the metal material). |\n| `List` | Names of the user elements in the active document (read-only). |\n\nCreate\n```csharp\nGuid UserElementApi.Create(IEnumerable<Guid> objectIds, string name)\n```\n\nTags the given objects as a user element named `name` (the tool's whole flow: group them, attach the UserElement user data, and give non-gem solid geometry the metal material). Returns the element's unique id.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `name` | `string` | required |\n\nReturns `Guid`.","metadata":{"title":"UserElementApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/#methods","collection":"scripting","hash":"548a7d31235f0c185654bd440112f260","indexed_by":"docs-index"}},{"content":"UserElementApi — List\n\n```csharp\nIReadOnlyList<string> UserElementApi.List()\n```\n\nNames of the user elements in the active document (read-only).\n\nReturns `IReadOnlyList `.","metadata":{"title":"UserElementApi","section":"List","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/#list","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/user-element/#list","collection":"scripting","hash":"a228e0b68234aff74e7e1b2ab103f2dd","indexed_by":"docs-index"}},{"content":"ViewApi\n\nRhino VIEWPORT control for batch rendering: point the camera, restore named views, switch display modes and capture the frame to a file. (The Realtime Render viewer has its own camera — see RealtimeRenderApi. This facade drives the Rhino viewports themselves.) None of this modifies the document's geometry; camera moves are license-free, capturing a file is gated like the other exports.\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi\n```\n\nSee also the guide, Views › Capture, and the Python package, `ra.view`.","metadata":{"title":"ViewApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/","collection":"scripting","hash":"b64cc2c79edbe85fdfcc9311430d5138","indexed_by":"docs-index"}},{"content":"ViewApi — Methods\n\n| Method | |\n|---|---|\n| `Capture` | Captures `viewport` (null = the active one) to a PNG at the given pixel size (0 = the viewport's current size). |\n| `Describe` | The open viewports, the saved named views and the available display modes — the vocabularies the other methods accept. |\n| `ImportNamedViews` | Imports the named views saved in another 3dm file into the active document — the way to give every document of a batch run the same standard camera angles: keep them once in a template 3dm, import, then RestoreNamedView + Capture per angle. |\n| `RestoreNamedView` | Restores a saved named view onto `viewport` (null = the active one). |\n| `SaveNamedView` | Saves (or overwrites) the current camera of `viewport` as a named view — the building block for reusable batch-render angles. |\n| `SetCamera` | Places the camera of `viewport` (null = the active one) at `location` looking at `target`, in perspective projection. |\n| `SetDisplayMode` | Switches the display mode of `viewport` (null = the active one). |\n| `ZoomExtents` | Zooms `viewport` (null = the active one) to the extents of the visible geometry. |","metadata":{"title":"ViewApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#methods","collection":"scripting","hash":"77e5a1a2c06a67ea6545d79ad4a1dae2","indexed_by":"docs-index"}},{"content":"ViewApi — Capture\n\n```csharp\nstring ViewApi.Capture(string path, int width = 0, int height = 0, string viewport = null)\n```\n\nCaptures `viewport` (null = the active one) to a PNG at the given pixel size (0 = the viewport's current size). Returns the full path written (\".png\" appended when missing; folders are created).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n| `width` | `int` | `0` |\n| `height` | `int` | `0` |\n| `viewport` | `string` | `null` |\n\nReturns `string`.","metadata":{"title":"ViewApi","section":"Capture","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#capture","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#capture","collection":"scripting","hash":"aa0aeedf4e995e417eab58789fe4742d","indexed_by":"docs-index"}},{"content":"ViewApi — Describe\n\n```csharp\nstring ViewApi.Describe()\n```\n\nThe open viewports, the saved named views and the available display modes — the vocabularies the other methods accept.\n\nReturns `string`.\n\nImportNamedViews\n```csharp\nIReadOnlyList<string> ViewApi.ImportNamedViews(string path)\n```\n\nImports the named views saved in another 3dm file into the active document — the way to give every document of a batch run the same standard camera angles: keep them once in a template 3dm, import, then RestoreNamedView + Capture per angle. A view whose name already exists in the document is skipped (the document's own view wins). Returns the names imported.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `path` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"ViewApi","section":"Describe","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#describe","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#describe","collection":"scripting","hash":"598c96b9de358c59dc3309f9f5902594","indexed_by":"docs-index"}},{"content":"ViewApi — RestoreNamedView\n\n```csharp\nvoid ViewApi.RestoreNamedView(string name, string viewport = null)\n```\n\nRestores a saved named view onto `viewport` (null = the active one). The names come from Describe().\n\n| Parameter | Type | Default |\n|---|---|---|\n| `name` | `string` | required |\n| `viewport` | `string` | `null` |\n\nSaveNamedView\n```csharp\nvoid ViewApi.SaveNamedView(string name, string viewport = null)\n```\n\nSaves (or overwrites) the current camera of `viewport` as a named view — the building block for reusable batch-render angles.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `name` | `string` | required |\n| `viewport` | `string` | `null` |","metadata":{"title":"ViewApi","section":"RestoreNamedView","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#restorenamedview","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#restorenamedview","collection":"scripting","hash":"d430cfed2d7ff05c52625a9574845b09","indexed_by":"docs-index"}},{"content":"ViewApi — SetCamera\n\n```csharp\nvoid ViewApi.SetCamera(\n    Point3d location,\n    Point3d target,\n    double lensMm = 0,\n    string viewport = null)\n```\n\nPlaces the camera of `viewport` (null = the active one) at `location` looking at `target`, in perspective projection. `lensMm` > 0 also sets the 35mm-equivalent lens length (50 is a natural product shot, 85-100 flattens like a macro lens).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `location` | `Point3d` | required |\n| `target` | `Point3d` | required |\n| `lensMm` | `double` | `0` |\n| `viewport` | `string` | `null` |","metadata":{"title":"ViewApi","section":"SetCamera","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#setcamera","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#setcamera","collection":"scripting","hash":"b7edd32b7fbbbd40024a1b1e709823e3","indexed_by":"docs-index"}},{"content":"ViewApi — SetDisplayMode\n\n```csharp\nvoid ViewApi.SetDisplayMode(string mode, string viewport = null)\n```\n\nSwitches the display mode of `viewport` (null = the active one). Mode names come from Describe() — e.g. Wireframe, Shaded, Rendered, Raytraced, Arctic, Pen.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `mode` | `string` | required |\n| `viewport` | `string` | `null` |","metadata":{"title":"ViewApi","section":"SetDisplayMode","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#setdisplaymode","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#setdisplaymode","collection":"scripting","hash":"1839e24223001cad17cd62224123a549","indexed_by":"docs-index"}},{"content":"ViewApi — ZoomExtents\n\n```csharp\nvoid ViewApi.ZoomExtents(string viewport = null)\n```\n\nZooms `viewport` (null = the active one) to the extents of the visible geometry.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `viewport` | `string` | `null` |","metadata":{"title":"ViewApi","section":"ZoomExtents","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#zoomextents","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/view/#zoomextents","collection":"scripting","hash":"fb6bcec7e1dee34b43342c1fe6f02378","indexed_by":"docs-index"}},{"content":"VoronoiApi\n\nVoronoi pattern inside a closed curve (the ArtisanVoronoi tool).\n\n```python\nfrom ArtisanPlugin.Scripting import VoronoiApi\n```\n\nSee also the guide, Accessories › Voronoi, and the Python package, `ra.voronoi`.\n\nMethods\n| Method | |\n|---|---|\n| `Create` | Defaults: 100 points, flat (thickness/height 0 keep the saved or tool defaults). |","metadata":{"title":"VoronoiApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/voronoi/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/voronoi/","collection":"scripting","hash":"4c5df13970664f1c9a182c8271f40910","indexed_by":"docs-index"}},{"content":"VoronoiApi — Create\n\n```csharp\nIReadOnlyList<Guid> VoronoiApi.Create(\n    Guid curveId,\n    int points = 0,\n    double thickness = 0,\n    double height = 0,\n    bool bothSides = false)\n```\n\nDefaults: 100 points, flat (thickness/height 0 keep the saved or tool defaults). Returns the created object ids.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `curveId` | `Guid` | required |\n| `points` | `int` | `0` |\n| `thickness` | `double` | `0` |\n| `height` | `double` | `0` |\n| `bothSides` | `bool` | `false` |\n\nReturns `IReadOnlyList `.","metadata":{"title":"VoronoiApi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/voronoi/#create","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/voronoi/#create","collection":"scripting","hash":"66682cd0973bfd220a5becfb5c3de87f","indexed_by":"docs-index"}},{"content":"WeddingBandApi\n\nSingle wedding bands.\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingBandApi\n```\n\nSee also the Python package, `ra.wedding_band`.\n\nMethods\n| Method | |\n|---|---|\n| `All` | `IWeddingBand` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IWeddingBand` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IWeddingBand` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"WeddingBandApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/","collection":"scripting","hash":"303c0109a83c66f034f7b21ae1e85a5a","indexed_by":"docs-index"}},{"content":"WeddingBandApi — All\n\n```csharp\nIReadOnlyList<IWeddingBand> WeddingBandApi.All()\n```\n\n`IWeddingBand` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IWeddingBand> WeddingBandApi.ByLayer(string layerName)\n```\n\n`IWeddingBand` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"WeddingBandApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#all","collection":"scripting","hash":"eeebf8ba1054ec49f9c2e62033a83b75","indexed_by":"docs-index"}},{"content":"WeddingBandApi — Count\n\n```csharp\nint WeddingBandApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nIWeddingBand WeddingBandApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IWeddingBand`.","metadata":{"title":"WeddingBandApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#count","collection":"scripting","hash":"9cc9e99ba6e465ca7390e8b570c57dd1","indexed_by":"docs-index"}},{"content":"WeddingBandApi — Selected\n\n```csharp\nIReadOnlyList<IWeddingBand> WeddingBandApi.Selected()\n```\n\n`IWeddingBand` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IWeddingRing`, `IWeddingProfile`, `IWeddingGems`.","metadata":{"title":"WeddingBandApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#selected","collection":"scripting","hash":"d9c607faceab4621f887e85a19a36fc9","indexed_by":"docs-index"}},{"content":"WeddingBandApi — IWeddingBand\n\n*Handle* — extends `IParametricObject`.\n\nA single wedding band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Region` | `string` | get | sizing region, \"\" when unset |\n| `Ring` | `IWeddingRing` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |\n| `void SetElement(string element)` | Applies a saved WeddingBand element (ElementsApi.List(\"WeddingBand\")) to this band: its profile, gems and metal replace the current ones, the ring size stays, and the band regenerates in place (same id). |","metadata":{"title":"WeddingBandApi","section":"IWeddingBand","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#iweddingband","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-band/#iweddingband","collection":"scripting","hash":"a2063fccb618eba9e2809a6d96de32da","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi\n\nHeadless builders for the wedding tools. WeddingApi / WeddingBandApi stay query-only (All/Find/Selected); the handles they return are the same ones these Create methods hand back, so `WeddingBandApi.Find(id)` finds what `CreateBand` made.\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingBuilderApi\n```\n\nSee also the Python package, `ra.wedding`.","metadata":{"title":"WeddingBuilderApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/","collection":"scripting","hash":"82f71bcc090c204c0e2f716488251962","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi — Methods\n\n| Method | |\n|---|---|\n| `CreateBand` | Builds a single wedding band (the ArtisanWeddingBand tool, headless): a plain band lofted from a RING_PROFILE asset at the document's finger size, optionally with a row of stones around it. |\n| `CreateSet` | Builds a wedding set (the ArtisanWeddingRing tool, headless): two bands baked together as one group -- his and hers -- each with its own section, metal, finger size and optional stones. |","metadata":{"title":"WeddingBuilderApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#methods","collection":"scripting","hash":"6162ef73f0233cdf11a16317e376a5f9","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi — CreateBand\n\n```csharp\nIWeddingBand WeddingBuilderApi.CreateBand(\n    double width = 0,\n    double height = 0,\n    double fingerDiameter = 0,\n    string profile = null,\n    string metal = null,\n    bool withGems = false,\n    double gemSize = 0,\n    string gemShape = null,\n    string distribution = null,\n    int numberOfGems = 0,\n    string prongType = null,\n    Plane? plane = null,\n    string element = null)\n```\n\nBuilds a single wedding band (the ArtisanWeddingBand tool, headless): a plain band lofted from a RING_PROFILE asset at the document's finger size, optionally with a row of stones around it. Millimetres; 0 keeps the tool default: width 3, height 2. `fingerDiameter` 0 = the document's finger size. `profile` picks a RING_PROFILE asset by name (omitted = the default profile); `metal` a Metal name like \"GOLD_YELLOW_18\" (omitted = the document's Metal 01). `withGems` true enables the stones: `gemSize` (default 1.2), `gemShape` \"Round\" | \"Princess\", `distribution` \"Full\" | \"Half\" | \"Onequarter\" | \"Custom\" (+ `numberOfGems`), `prongType` \"None\" | \"Shared\" | \"Channel\". `plane` omitted = world XY. `element` = name of a saved WeddingBand element (ElementsApi.List(\"WeddingBand\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the IWeddingBand handle of the new band group.","metadata":{"title":"WeddingBuilderApi","section":"CreateBand","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createband","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createband","collection":"scripting","hash":"18aec6f9201883820d01c84fceeb9650","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi — CreateBand\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `metal` | `string` | `null` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `gemShape` | `string` | `null` |\n| `distribution` | `string` | `null` |\n| `numberOfGems` | `int` | `0` |\n| `prongType` | `string` | `null` |\n| `plane` | `Plane?` | `null` |\n| `element` | `string` | `null` |\n\nReturns `IWeddingBand`.","metadata":{"title":"WeddingBuilderApi","section":"CreateBand","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createband","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createband","collection":"scripting","hash":"9bb29d1f509280840ea01d444c0123e9","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi — CreateSet\n\n```csharp\nIWedding WeddingBuilderApi.CreateSet(\n    double width = 0,\n    double height = 0,\n    double secondWidth = 0,\n    double secondHeight = 0,\n    double fingerDiameter = 0,\n    double secondFingerDiameter = 0,\n    string profile = null,\n    string secondProfile = null,\n    string metal = null,\n    string secondMetal = null,\n    bool withGems = false,\n    double gemSize = 0,\n    bool secondWithGems = false,\n    double secondGemSize = 0,\n    Plane? plane = null)\n```\n\nBuilds a wedding set (the ArtisanWeddingRing tool, headless): two bands baked together as one group -- his and hers -- each with its own section, metal, finger size and optional stones. Millimetres; 0 keeps the tool default (width 3, height 2 for both). `fingerDiameter` / `secondFingerDiameter` 0 = the document's finger size. `profile` / `secondProfile` pick RING_PROFILE assets by name (omitted = the default profile); `metal` / `secondMetal` are Metal names (omitted = the document's Metal 01). `withGems` + `gemSize` (and the `second*` pair) add a full row of round stones to that ring. `plane` omitted = world XY. Returns the IWedding handle of the new set (FirstRing / SecondRing).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `width` | `double` | `0` |\n| `height` | `double` | `0` |\n| `secondWidth` | `double` | `0` |\n| `secondHeight` | `double` | `0` |\n| `fingerDiameter` | `double` | `0` |\n| `secondFingerDiameter` | `double` | `0` |\n| `profile` | `string` | `null` |\n| `secondProfile` | `string` | `null` |\n| `metal` | `string` | `null` |\n| `secondMetal` | `string` | `null` |\n| `withGems` | `bool` | `false` |\n| `gemSize` | `double` | `0` |\n| `secondWithGems` | `bool` | `false` |\n| `secondGemSize` | `double` | `0` |\n| `plane` | `Plane?` | `null` |\n\nReturns `IWedding`.","metadata":{"title":"WeddingBuilderApi","section":"CreateSet","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createset","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#createset","collection":"scripting","hash":"cf5d4890926586ec414dbcd247cb1621","indexed_by":"docs-index"}},{"content":"WeddingBuilderApi — Handles and sections\n\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.\n\nAlso used here: `IWedding`, `IWeddingRing`, `IWeddingProfile`, `IWeddingGems`, `IWeddingBand`.","metadata":{"title":"WeddingBuilderApi","section":"Handles and sections","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#handles-and-sections","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding-builder/#handles-and-sections","collection":"scripting","hash":"137c75763c84bf093ab9494f3117804f","indexed_by":"docs-index"}},{"content":"WeddingApi\n\nWedding sets — his-and-hers pairs baked as one group. Query-only for now: run ArtisanWeddingRing in the UI once, then script every variant from the handle it leaves behind.\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingApi\n```\n\nSee also the guide, Shanks › Wedding, and the Python package, `ra.wedding`.","metadata":{"title":"WeddingApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/","collection":"scripting","hash":"4e53ea4df71b9f86acf44e33f17a0644","indexed_by":"docs-index"}},{"content":"WeddingApi — Methods\n\n| Method | |\n|---|---|\n| `All` | `IWedding` handles for every object of this kind in the active document (empty when there is no document). |\n| `ByLayer` | `IWedding` handles on the layer with the given full path (empty when the layer does not exist). |\n| `Count` | Number of objects of this kind in the active document. |\n| `Find` | The handle for `id`, or null when the id does not belong to an object of this kind. |\n| `Selected` | `IWedding` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"WeddingApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#methods","collection":"scripting","hash":"5b15b22f69f7b419b60b947d989f46b2","indexed_by":"docs-index"}},{"content":"WeddingApi — All\n\n```csharp\nIReadOnlyList<IWedding> WeddingApi.All()\n```\n\n`IWedding` handles for every object of this kind in the active document (empty when there is no document).\n\nReturns `IReadOnlyList `.\n\nByLayer\n```csharp\nIReadOnlyList<IWedding> WeddingApi.ByLayer(string layerName)\n```\n\n`IWedding` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | Default |\n|---|---|---|\n| `layerName` | `string` | required |\n\nReturns `IReadOnlyList `.","metadata":{"title":"WeddingApi","section":"All","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#all","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#all","collection":"scripting","hash":"e27bf212ca5757aef4f4378f87567f1a","indexed_by":"docs-index"}},{"content":"WeddingApi — Count\n\n```csharp\nint WeddingApi.Count()\n```\n\nNumber of objects of this kind in the active document.\n\nReturns `int`.\n\nFind\n```csharp\nIWedding WeddingApi.Find(Guid id)\n```\n\nThe handle for `id`, or null when the id does not belong to an object of this kind.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `id` | `Guid` | required |\n\nReturns `IWedding`.","metadata":{"title":"WeddingApi","section":"Count","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#count","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#count","collection":"scripting","hash":"a03dd153a326537d813a0d3ba89d35a6","indexed_by":"docs-index"}},{"content":"WeddingApi — Selected\n\n```csharp\nIReadOnlyList<IWedding> WeddingApi.Selected()\n```\n\n`IWedding` handles for the objects of this kind currently selected in the active document.\n\nReturns `IReadOnlyList `.\n\nHandles and sections\nWhat the methods above hand back. A handle's setters regenerate the object; wrap changes in a `Transaction` so they land as one undo step.","metadata":{"title":"WeddingApi","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#selected","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#selected","collection":"scripting","hash":"01d8f6ca0c09554ba53adc25692ab305","indexed_by":"docs-index"}},{"content":"WeddingApi — IWedding\n\n*Handle* — extends `IParametricObject`.\n\nA wedding set: the two rings baked together as one group.\n\n| Property | Type | | |\n|---|---|---|---|\n| `FirstRing` | `IWeddingRing` | get | |\n| `Id` | `Guid` | get | *(from IParametricObject)* |\n| `LayerName` | `string` | get | *(from IParametricObject)* |\n| `MotherGemId` | `Guid` | get | *(from IParametricObject)* |\n| `ObjectType` | `string` | get | *(from IParametricObject)* |\n| `Position` | `Point3d` | get | *(from IParametricObject)* |\n| `Region` | `string` | get | sizing region of the set, \"\" when unset |\n| `SecondRing` | `IWeddingRing` | get | |\n\n| Method | |\n|---|---|\n| `void Delete()` | *(from IParametricObject)* |\n| `void Move(Vector3d translation)` | *(from IParametricObject)* |","metadata":{"title":"WeddingApi","section":"IWedding","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iwedding","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iwedding","collection":"scripting","hash":"030fd9983eba555b295892ea1c4f9f5f","indexed_by":"docs-index"}},{"content":"WeddingApi — IWeddingRing\n\n*Section*.\n\nOne ring of a wedding set, or the single band of a wedding band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Gems` | `IWeddingGems` | get | |\n| `Metal` | `string` | get | e.g. \"GOLD_YELLOW_18\" |\n| `Profile` | `IWeddingProfile` | get | |\n| `RingDiameterMm` | `double` | get | |\n| `RingSizeLabel` | `string` | get | |\n| `RingSizeRegion` | `string` | get | |\n\n| Method | |\n|---|---|\n| `void SetMetal(string metal)` | |","metadata":{"title":"WeddingApi","section":"IWeddingRing","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddingring","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddingring","collection":"scripting","hash":"9da84fcade5ea0a90629922bc451d372","indexed_by":"docs-index"}},{"content":"WeddingApi — IWeddingProfile\n\n*Section*.\n\nThe band section of a wedding ring: its section and profile asset.\n\n| Property | Type | | |\n|---|---|---|---|\n| `Height` | `double` | get | mm |\n| `ProfileName` | `string` | get | RING_PROFILE asset name, \"\" when unset |\n| `Width` | `double` | get | mm |\n\n| Method | |\n|---|---|\n| `void SetHeight(double height)` | |\n| `void SetProfile(string assetName)` | list them with AssetsApi.List(\"RING_PROFILE\") |\n| `void SetWidth(double width)` | |","metadata":{"title":"WeddingApi","section":"IWeddingProfile","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddingprofile","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddingprofile","collection":"scripting","hash":"392acd84868208a07e0762cc10418d4e","indexed_by":"docs-index"}},{"content":"WeddingApi — IWeddingGems\n\n*Section*.\n\nThe stones a wedding ring can carry around its band.\n\n| Property | Type | | |\n|---|---|---|---|\n| `AutomaticProngDiameter` | `bool` | get | |\n| `CustomDistance` | `string` | get | \"Continuous\" or \"Equidistant\" |\n| `Distribution` | `string` | get | \"Full\", \"Half\", \"Onequarter\" or \"Custom\" |\n| `DrillHeight` | `double` | get | mm |\n| `DrillType` | `string` | get | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `DrillWidth` | `double` | get | mm |\n| `Enabled` | `bool` | get | |\n| `ExtensionManufacturing` | `double` | get | mm |\n| `GemInside` | `double` | get | mm |\n| `GemSize` | `double` | get | mm |\n| `InnerHeight` | `double` | get | inner channel height, mm |\n| `InnerWidth` | `double` | get | inner channel width, mm |\n| `MinDistance` | `double` | get | mm |\n| `NumberOfGems` | `int` | get | used when Distribution is \"Custom\" |\n| `ProngDiameter` | `double` | get | mm |\n| `ProngHeight` | `double` | get | mm |\n| `ProngMoveInZ` | `double` | get | mm |\n| `ProngType` | `string` | get | \"None\", \"Shared\" or \"Channel\" |\n| `Shape` | `string` | get | \"Round\" or \"Princess\" |\n| `Vertical` | `double` | get | mm |","metadata":{"title":"WeddingApi","section":"IWeddingGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddinggems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddinggems","collection":"scripting","hash":"d61b363cf0ef472a5f8809e8f2cfd9ed","indexed_by":"docs-index"}},{"content":"WeddingApi — IWeddingGems\n\n| Method | |\n|---|---|\n| `void SetAutomaticProngDiameter(bool automatic)` | |\n| `void SetCustomDistance(string customDistance)` | \"Continuous\" or \"Equidistant\" |\n| `void SetDistribution(string distribution)` | \"Full\", \"Half\", \"Onequarter\" or \"Custom\" |\n| `void SetDrillHeight(double height)` | |\n| `void SetDrillType(string drillType)` | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `void SetDrillWidth(double width)` | |\n| `void SetEnabled(bool enabled)` | |\n| `void SetExtensionManufacturing(double extension)` | |\n| `void SetGemInside(double gemInside)` | |\n| `void SetGemSize(double size)` | |\n| `void SetInnerHeight(double height)` | |\n| `void SetInnerWidth(double width)` | |\n| `void SetMinDistance(double distance)` | |\n| `void SetNumberOfGems(int count)` | |\n| `void SetProngDiameter(double diameter)` | |\n| `void SetProngHeight(double height)` | |\n| `void SetProngMoveInZ(double move)` | |\n| `void SetProngType(string prongType)` | \"None\", \"Shared\" or \"Channel\" |\n| `void SetShape(string shape)` | \"Round\" or \"Princess\" |\n| `void SetVertical(double vertical)` | |","metadata":{"title":"WeddingApi","section":"IWeddingGems","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddinggems","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/wedding/#iweddinggems","collection":"scripting","hash":"a41739eeac9220ca0c0f728613901c50","indexed_by":"docs-index"}},{"content":"WeightApi\n\nHeadless metal-weight facade for scripts and Flow Studio. Wraps the SAME WeightTools math the ArtisanWeight command uses (volume from the closed geometry on the \"Metal 01/02/03\" layers x metal density), so the grams a script reports always match the command's dialog. Everything here is read-only: no license gate, no Transaction needed.\n\n```python\nfrom ArtisanPlugin.Scripting import WeightApi\n```\n\nSee also the guide, Analysis › Weight by area, and the Python package, `ra.weight`.","metadata":{"title":"WeightApi","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/","collection":"scripting","hash":"d90ef303b76699d70c4970b4777c1270","indexed_by":"docs-index"}},{"content":"WeightApi — Methods\n\n| Method | |\n|---|---|\n| `Calculate` | Per-metal breakdown of the whole document, mirroring ArtisanWeight: volumes come from the \"Metal 01/02/03\" layers and are grouped by the document's configured number of metals (1, 2 or 3). |\n| `CalculateByArea` | Sheet-metal style estimate (the ArtisanWeightByArea tool): total surface AREA of the given objects x `thickness` = volume, cast in `metal`. |\n| `CalculateForObjects` | Weight of an arbitrary set of objects if cast in `metal` (the ArtisanWeightBySelection idea, scriptable). |\n| `CalculateForSelection` | Weight of the current viewport selection if cast in `metal`. |\n| `CalculateSelectionByArea` | By-area estimate of the current viewport selection. |\n| `Metals` | Valid names for the `metal` argument of the ForObjects/ForSelection variants (\"GOLD_YELLOW_18\", \"PLATINUM\", \"SILVER\", ...). |","metadata":{"title":"WeightApi","section":"Methods","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#methods","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#methods","collection":"scripting","hash":"e061347533c1d77c95925cd6f2e604c1","indexed_by":"docs-index"}},{"content":"WeightApi — Calculate\n\n```csharp\nIReadOnlyList<MetalWeightResult> WeightApi.Calculate()\n```\n\nPer-metal breakdown of the whole document, mirroring ArtisanWeight: volumes come from the \"Metal 01/02/03\" layers and are grouped by the document's configured number of metals (1, 2 or 3). Entries whose layer has no geometry report zero weights rather than being omitted.\n\nReturns `IReadOnlyList `.","metadata":{"title":"WeightApi","section":"Calculate","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculate","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculate","collection":"scripting","hash":"19f65dd77257257ff9eb6413d88a701e","indexed_by":"docs-index"}},{"content":"WeightApi — CalculateByArea\n\n```csharp\nMetalWeightResult WeightApi.CalculateByArea(\n    IEnumerable<Guid> objectIds,\n    double thickness,\n    string metal = null)\n```\n\nSheet-metal style estimate (the ArtisanWeightByArea tool): total surface AREA of the given objects x `thickness` = volume, cast in `metal`. Useful for shells and pieces modeled as open surfaces. `metal` empty/null = the document's primary metal.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `thickness` | `double` | required |\n| `metal` | `string` | `null` |\n\nReturns `MetalWeightResult`.","metadata":{"title":"WeightApi","section":"CalculateByArea","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculatebyarea","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculatebyarea","collection":"scripting","hash":"9dc4bf355bbd6032618b8ef43888b1d7","indexed_by":"docs-index"}},{"content":"WeightApi — CalculateForObjects\n\n```csharp\nMetalWeightResult WeightApi.CalculateForObjects(IEnumerable<Guid> objectIds, string metal)\n```\n\nWeight of an arbitrary set of objects if cast in `metal` (the ArtisanWeightBySelection idea, scriptable). Objects must be closed solids/meshes for their volume to count.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `objectIds` | `IEnumerable ` | required |\n| `metal` | `string` | required |\n\nReturns `MetalWeightResult`.","metadata":{"title":"WeightApi","section":"CalculateForObjects","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculateforobjects","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculateforobjects","collection":"scripting","hash":"15697c5da30dc3f2d313e7f9f30fb49d","indexed_by":"docs-index"}},{"content":"WeightApi — CalculateForSelection\n\n```csharp\nMetalWeightResult WeightApi.CalculateForSelection(string metal)\n```\n\nWeight of the current viewport selection if cast in `metal`.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `metal` | `string` | required |\n\nReturns `MetalWeightResult`.\n\nCalculateSelectionByArea\n```csharp\nMetalWeightResult WeightApi.CalculateSelectionByArea(double thickness, string metal = null)\n```\n\nBy-area estimate of the current viewport selection.\n\n| Parameter | Type | Default |\n|---|---|---|\n| `thickness` | `double` | required |\n| `metal` | `string` | `null` |\n\nReturns `MetalWeightResult`.","metadata":{"title":"WeightApi","section":"CalculateForSelection","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculateforselection","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#calculateforselection","collection":"scripting","hash":"e16152038a86915e2a18816aea02fb2c","indexed_by":"docs-index"}},{"content":"WeightApi — Metals\n\n```csharp\nIReadOnlyList<string> WeightApi.Metals()\n```\n\nValid names for the `metal` argument of the ForObjects/ForSelection variants (\"GOLD_YELLOW_18\", \"PLATINUM\", \"SILVER\", ...).\n\nReturns `IReadOnlyList `.","metadata":{"title":"WeightApi","section":"Metals","url":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#metals","source":"https://www.rhinoartisan.com/docs/scripting/dotnet/weight/#metals","collection":"scripting","hash":"8c2af8aa7922e0d2a33429cf9f570021","indexed_by":"docs-index"}},{"content":"Getting Started\n\nYour first RhinoArtisan script is five lines away. All you need is Rhino, RhinoArtisan and the Python editor that ships with Rhino — no extra installs, no configuration. You can also run your scripts from Flow Studio inside RhinoArtisan, but this guide sticks to the plain Python editor.\n\nYour first script\nOpen Rhino's Python editor (`EditPythonScript`) with RhinoArtisan loaded, and run:\n\n```python\nfrom Rhino.Geometry import Plane\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\n\nwith Transaction.Begin(\"Add a one-carat round diamond\"):\n    g = gem.Create(\"ROUND\", \"Diamond\", 1.0, Plane.WorldXY)\n\nprint(\"Created %s %s of %.2f ct (%.2f mm)\" % (g.Shape, g.Material, g.CaratWeight, g.SizeX))\n```\n\nThat's the whole pattern:\n\n1. Import the facade you need from `ArtisanPlugin.Scripting` (short aliases like `gem`, `bezel`, `pricing` keep scripts readable).\n2. Wrap mutations in a `Transaction` so the user can undo the whole operation in one step. Read-only calls don't need one.\n3. Work with the returned handle — `Create` returns an `IGem` you can move, resize, copy or delete later.","metadata":{"title":"Getting Started","url":"https://www.rhinoartisan.com/docs/scripting/getting-started/","source":"https://www.rhinoartisan.com/docs/scripting/getting-started/","collection":"scripting","hash":"2a1da10dc1be6226e4b7c268ec7feb8d","indexed_by":"docs-index"}},{"content":"Getting Started — Reading before writing\n\nMost facades offer discovery methods that return the exact strings their creation methods accept. Use them instead of guessing:\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem\nprint(\"Shapes: \" + \", \".join(gem.Shapes()))\nprint(\"Materials: \" + \", \".join(gem.Materials()))\n```\n\nA more complete example\nStones distributed along a selected curve — the classic pavé starting point:\n\n```python\nimport rhinoscriptsyntax as rs\nfrom Rhino.Geometry import Plane\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\n\ncurves = rs.SelectedObjects()\nif not curves:\n    print(\"Select a curve first.\")\nelse:\n    points = rs.DivideCurve(curves[0], 20)\n    with Transaction.Begin(\"Pave 20 round diamonds along curve\"):\n        for p in points:\n            gem.Create(\"ROUND\", \"Diamond\", 0.02, Plane(p, Plane.WorldXY.ZAxis))\n```\n\nThe Scripting API composes naturally with `rhinoscriptsyntax` and `Rhino.Geometry`: use Rhino for raw geometry (curves, points, math) and Artisan facades for everything jewelry-aware.","metadata":{"title":"Getting Started","section":"Reading before writing","url":"https://www.rhinoartisan.com/docs/scripting/getting-started/#reading-before-writing","source":"https://www.rhinoartisan.com/docs/scripting/getting-started/#reading-before-writing","collection":"scripting","hash":"aac0b33272da1fa6447c3013d289fae4","indexed_by":"docs-index"}},{"content":"Getting Started — Things to know about the Python host\n\n- Scripts run on IronPython 2.7: there are no f-strings (use `%` formatting), and integer division truncates (use `float(...)` when interpolating).\n- Don't call `Views.Redraw()` — Artisan mutations already redraw the viewport.\n- Avoid interactive prompts (`rs.GetPoint`, `rs.GetObjects`) in automated scripts; work from the current selection instead.","metadata":{"title":"Getting Started","section":"Things to know about the Python host","url":"https://www.rhinoartisan.com/docs/scripting/getting-started/#things-to-know-about-the-python-host","source":"https://www.rhinoartisan.com/docs/scripting/getting-started/#things-to-know-about-the-python-host","collection":"scripting","hash":"42d264cfa8ae49ac95f9af88288c0927","indexed_by":"docs-index"}},{"content":"Getting Started — Next steps\n\n- Core Concepts — the rules shared by every facade.\n- API Reference — everything you can call.","metadata":{"title":"Getting Started","section":"Next steps","url":"https://www.rhinoartisan.com/docs/scripting/getting-started/#next-steps","source":"https://www.rhinoartisan.com/docs/scripting/getting-started/#next-steps","collection":"scripting","hash":"a906fa4014eff96455d60557437aefb3","indexed_by":"docs-index"}},{"content":"Handles\n\nEvery facade that creates or queries returns a handle — `IGem`, `IBezel`, `ICathedral`, ... A handle is a live view of one object in the current document: each property read goes back to the document, so it never gets stale. Its `Id` is stable across parametric edits, which means the handle stays valid after a setter regenerates the object in place. Setters and mutations call the license gate first and belong inside a `Transaction`; getters are always free.\n\nAll handles except `IGem` build on the two base interfaces below, so each handle page only lists what it *adds*.","metadata":{"title":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/handles/","source":"https://www.rhinoartisan.com/docs/scripting/handles/","collection":"scripting","hash":"95fef65fac2905297a642bf1b0838381","indexed_by":"docs-index"}},{"content":"Handles — Ring bodies\n\n| Handle | Returned by | Setters |\n|---|---|---|\n| `IClassic` | `ClassicApi` | full: profiles (top/mid/bottom), external, opening, gems row |\n| `ICathedral` | `CathedralApi` | full: band, arms, bridge, pavé row |\n| `IAdvancedCathedral` | `AdvancedCathedralApi` | full: stations, arm, bridge, pavé row, stone gradient |\n| `IEternity` | `EternityApi` | full: stones, prongs, bezel rails, both band halves |\n| `IBypass` | `BypassApi` | full: crossing arms, stations, bridge, graded gems row |\n| `ISplitShank` | `SplitShankApi` | full: rail, three swept sections, graded pave run |\n| `IGraduated` | `GraduatedApi` | full: two morphing profiles, stone run, tapering prongs |\n| `IPaveShank` | `PaveShankApi` | full: band, longitudinal rows, prongs |\n| `ITwoRowsShank` | `TwoRowsShankApi` | full: classic band, channel, prongs, gems |\n| `IMatchingShank` | `MatchingShankApi` | full: fit against the mother, band, section deltas, gems row |\n| `ISignetRing` | `SignetRingApi` | full: face, band sections, recess |\n| `IAdvancedSignetRing` | `AdvancedSignetRingApi` | full: face, lateral profile, bottom cut |\n| `IWedding` | `WeddingApi` | full: both rings — metal, profile, stones |\n| `IWeddingBand` | `WeddingBandApi` | full: metal, profile, stones |","metadata":{"title":"Handles","section":"Ring bodies","url":"https://www.rhinoartisan.com/docs/scripting/handles/#ring-bodies","source":"https://www.rhinoartisan.com/docs/scripting/handles/#ring-bodies","collection":"scripting","hash":"34d458dfe45fb3afc2ab7520cb6f9dae","indexed_by":"docs-index"}},{"content":"Handles — Gems and settings\n\n| Handle | Returned by | Setters |\n|---|---|---|\n| `IGem` | `GemApi` | material, carat, size, scale, plane, rotation, flip |\n| `IBezel` | `BezelApi` | height, width, girdle, gem inside |\n| `IAdvancedBezel` | `AdvancedBezelApi` | — |\n| `IPeghead` | `PegheadApi` | prongs, height, thickness, girdle, gem inside |\n| `IBasket` | `BasketApi` | prong count, diameter, height |\n| `IAdvancedBasket` | `AdvancedBasketApi` | prong/rail count, prong diameter, height |\n| `IHalo` | `HaloApi` | stone size, stone distance |\n| `IHiddenHalo` | `HiddenHaloApi` | stone size, stone distance |\n| `ICluster` | `ClusterApi` | — |\n| `ITulip` | `TulipApi` | pipe diameter, height |\n| `IMartini` | `MartiniApi` | prong height, side gem size |\n| `ITrellisGemset` | `TrellisGemsetApi` | — |\n| `ICutter` | `CutterApi` | — |\n| `IMicroSetting` | `MicroSettingApi` | — |\n| `IGemsOnCurve` | `GemsOnCurveApi` | — |\n| `ICabochon` | `CabochonApi` | — |\n| `IPearl` | `PearlApi` | — |\n\nA dash in the Setters column means the handle is read-only after creation: the parametric engine has no in-place regenerate for that type yet. To change one, create a replacement with the new values and `Delete()` the old handle.","metadata":{"title":"Handles","section":"Gems and settings","url":"https://www.rhinoartisan.com/docs/scripting/handles/#gems-and-settings","source":"https://www.rhinoartisan.com/docs/scripting/handles/#gems-and-settings","collection":"scripting","hash":"10cd6a5a90efa9293d6f8767f5e7c01b","indexed_by":"docs-index"}},{"content":"Handles — The bases\n\n`IParametricObject` is the structural surface shared by every parametric jewelry object exposed to scripting, whether the kernel stores it as a group or as a typed custom object:\n\n| Member | Meaning |\n|---|---|\n| `Id` | The object's Guid — stable across parametric edits |\n| `MotherGemId` | The parent gem's Guid if there is one, `Guid.Empty` otherwise |\n| `ObjectType` | The type name — `\"Basket\"`, `\"Halo\"`, `\"Bezel\"`, `\"Cathedral\"`, ... |\n| `LayerName` | Full layer path |\n| `Position` | The object's placement point (`Point3d`) |\n| `Move(translation)` | Translate the whole object by a `Vector3d` |\n| `Delete()` | Remove the object (the whole group) from the document |\n\n`Move` and `Delete` are mutations — both are gated by the license check.\n\n`IGemSetting` extends `IParametricObject` for objects that wrap exactly one gem (basket, halo, bezel, peghead, ...). Ring-like objects — Classic, Cathedral, Eternity — hold multiple gems and do *not* implement it:\n\n| Member | Meaning |\n|---|---|\n| `GemShape` | The mother gem's shape, e.g. `\"ROUND\"` |\n| `GemMaterial` | The mother gem's material, e.g. `\"Diamond\"` |\n| `GemCaratWeight` | The mother gem's carat weight |","metadata":{"title":"Handles","section":"The bases","url":"https://www.rhinoartisan.com/docs/scripting/handles/#the-bases","source":"https://www.rhinoartisan.com/docs/scripting/handles/#the-bases","collection":"scripting","hash":"7b2825bc57e33a8d8af377df381ae993","indexed_by":"docs-index"}},{"content":"IAdvancedBasket\n\nReturned by `AdvancedBasketApi` — the advanced basket on one mother gem. Unlike the basic basket, it stores one entry per prong/rail, each with its own settings. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ProngCount` | Number of prongs |\n| `RailCount` | Number of rails |\n| `ProngHeight` | First prong's height, mm |\n| `ProngDiameter` | First prong's diameter, mm |\n| `SetProngCount(prongs)` | Rebuild the prong set evenly spaced, cloning the first existing prong's settings (tool defaults when empty) |\n| `SetRailCount(rails)` | Rebuild the rail set the same way |\n| `SetProngDiameter(diameter)` | Applies to *every* prong, mm |\n| `SetProngHeight(height)` | Applies to *every* prong, mm |\n\nThe scalar getters (`ProngHeight`, `ProngDiameter`) report the first prong's values — `0` when there are none. Prongs edited individually in the UI can differ from what the getter shows.","metadata":{"title":"IAdvancedBasket","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedbasket/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedbasket/","collection":"scripting","hash":"d7ee51a17bb7e77476cba4459cfdd118","indexed_by":"docs-index"}},{"content":"IAdvancedBezel\n\nReturned by `AdvancedBezelApi` — an advanced bezel wraps exactly one mother gem like `IBezel`, but its wall is a freely editable point profile instead of a swept asset. Read-only beyond the base mutations — the parametric engine has no regenerate for advanced bezels, so there are no in-place setters (recreate + `Delete()` to change one). Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `Height` | Wall height, mm |\n| `Width` | Wall width, mm |\n| `GirdleHeight` | Girdle height, mm |\n| `GirdleWidth` | Girdle width, mm |\n| `GemInside` | How deep the gem sits inside, mm |","metadata":{"title":"IAdvancedBezel","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedbezel/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedbezel/","collection":"scripting","hash":"9eca4db3f4de6a7b287c1afa5915aa1d","indexed_by":"docs-index"}},{"content":"IAdvancedCathedral\n\nReturned by `AdvancedCathedralApi` — like the classic cathedral, but the band's cross-section is defined by editable stations along the arm instead of one fixed profile. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` | Ring size as label + region |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Shank` | Stations, arm and bridge — `IAdvancedCathedralShank` |\n| `Gems` | The pavé row — `ICathedralGems`, the same section as the classic cathedral |\n| `GemGradient` | Stone-size and prong gradient — `IAdvancedCathedralGemGradient` |\n\nAll three sections are live views over the shank's stored parameters: their getters read the current values and every setter regenerates the shank in place (same Guid), gems, prongs and cutters included.","metadata":{"title":"IAdvancedCathedral","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/","collection":"scripting","hash":"8f087fd62b953815d2281343ef0c5b3c","indexed_by":"docs-index"}},{"content":"IAdvancedCathedral — Band and arms (IAdvancedCathedralShank)\n\n| Member | Meaning |\n|---|---|\n| `SharedProfile` | Every station uses the same profile asset |\n| `Stations` | The per-station sections — `IAdvancedCathedralStation` each |\n| `ArmHeight` / `ArmOpening` | mm |\n| `TipInclination` | Inclination of the arm tip |\n| `TangentPoint` | `1` = 90 degrees, `0` = 140, `-1` = 190 |\n| `TipRound` | mm |\n| `BridgeEnabled` | Whether the bridge is built |\n| `BridgeWidth` / `BridgeThickness` / `BridgeFillet` / `BridgeDiameter` | Bridge section, mm |\n| `BridgeAngle` / `BridgeOpenAngle` | degrees |\n| `SetStations(stations)` | Replace the whole list (at least 2, positions 0..1) |\n| `SetStation(index, position, width, height, profileName=None)` | Edit one station in place |\n| `SetSharedProfile` / `SetProfile(assetName)` | The second applies one RING_PROFILE asset to every station |\n| `SetArmHeight` / `SetArmOpening` / `SetTipInclination` / `SetTangentPoint` / `SetTipRound` | The arm |\n| `SetBridgeEnabled` / `SetBridgeWidth` / `SetBridgeThickness` / `SetBridgeFillet` / `SetBridgeAngle` / `SetBridgeDiameter` / `SetBridgeOpenAngle` | The bridge |\n\nEvery station needs a profile asset or the shank fails to regenerate. `SetStations` reuses the current profile for any station you leave without one; if none of the existing stations has a profile either, pass `profileName` on at least one.","metadata":{"title":"IAdvancedCathedral","section":"Band and arms (IAdvancedCathedralShank)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/#band-and-arms-iadvancedcathedralshank","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/#band-and-arms-iadvancedcathedralshank","collection":"scripting","hash":"9946f248939f23798cfe33aabcf8a8e2","indexed_by":"docs-index"}},{"content":"IAdvancedCathedral — A station (IAdvancedCathedralStation)\n\n| Member | Meaning |\n|---|---|\n| `Position` | `0` = arm tip, `1` = ring bottom |\n| `Width` / `Height` | Section at that position, mm |\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n\nStone gradient (IAdvancedCathedralGemGradient)\nHow stone size and prongs vary along the gem run.\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the gradient is applied |\n| `Points` | `2` = start/end, `3` = start/middle/end |\n| `MiddlePosition` | `0`..`1` |\n| `GemSizeStart` / `GemSizeMiddle` / `GemSizeEnd` | mm |\n| `ProngGrow` / `ProngMinDiameter` | mm |\n| `EndProngCount` / `ProngSpacing` / `ProngDistance` | Prong layout |\n| `SetEnabled` / `SetPoints` / `SetMiddlePosition` | |\n| `SetGemSizes(start, middle, end)` | The three sizes in one call, mm |\n| `SetProngGrow` / `SetProngMinDiameter` / `SetEndProngCount` / `SetProngSpacing` / `SetProngDistance` | |","metadata":{"title":"IAdvancedCathedral","section":"A station (IAdvancedCathedralStation)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/#a-station-iadvancedcathedralstation","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedcathedral/#a-station-iadvancedcathedralstation","collection":"scripting","hash":"d4503a8f0d4923c24d655ebe451fab37","indexed_by":"docs-index"}},{"content":"IAdvancedSignetRing\n\nReturned by `AdvancedSignetRingApi` — the same signet face as `ISignetRing`, plus a lateral profile that shapes the sides and an optional wedge cut at the bottom of the band. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` | Ring size as label + region |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Face` | The face and the band under it — `ISignetFace` |\n| `LateralProfileName` | RING_SIDE_CURVE asset shaping the sides, `\"\"` when unset |\n| `BottomCutAngle` | Total opening of the bottom wedge cut, degrees; `0` = no cut |\n| `SetLateralProfile(assetName)` | A RING_SIDE_CURVE asset by name — list them with `AssetsApi.List(\"RING_SIDE_CURVE\")` |\n| `SetBottomCutAngle(degrees)` | `0` disables the cut |\n\nEvery setter regenerates the ring in place (same Guid) and is license-gated.","metadata":{"title":"IAdvancedSignetRing","url":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedsignetring/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iadvancedsignetring/","collection":"scripting","hash":"ae91a8c14531d2708a4dcec7053327b7","indexed_by":"docs-index"}},{"content":"IBasket\n\nReturned by `BasketApi` — a prong basket under one mother gem. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ProngCount` | Number of prongs |\n| `ProngHeight` | Prong height, mm |\n| `ProngDiameterTop` | Prong diameter at the top, mm |\n| `ProngDiameterGirdle` | Prong diameter at the girdle, mm |\n| `ProngDiameterBottom` | Prong diameter at the bottom, mm |\n| `SetProngCount(prongs)` | Rebuild with this many prongs — negative counts follow the tool's rotated-variant convention |\n| `SetProngDiameter(diameter)` | Prong diameter, mm |\n| `SetProngHeight(height)` | Prong height, mm |\n| `UpperRail` / `BaseRail` | The rails (`IBasketRail`): `Enabled`, `Width`, `Height`, `Rotation`, `GemSizePercentage`, `ProfileName`, `Mode`, with their `Set…` setters. Rails explains the modes |\n| `SetElement(name)` | Applies a saved Basket element. The basket keeps its gem |\n\nEach setter regenerates the basket: the group keeps its id, so the handle stays valid; the member objects are rebuilt.","metadata":{"title":"IBasket","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibasket/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibasket/","collection":"scripting","hash":"289e4d84de7dd0ce3eedc11d28b74284","indexed_by":"docs-index"}},{"content":"IBezel\n\nReturned by `BezelApi` — a bezel wall around one mother gem. Adds only setters to `IGemSetting`; each regenerates the bezel in place (same Guid), millimetres:\n\n| Member | Meaning |\n|---|---|\n| `SetHeight(height)` | Wall height, mm |\n| `SetWidth(width)` | Wall width, mm |\n| `SetGirdleHeight(girdleHeight)` | Girdle height, mm |\n| `SetGirdleWidth(girdleWidth)` | Girdle width, mm |\n| `SetGemInside(gemInside)` | How deep the gem sits inside, mm |","metadata":{"title":"IBezel","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibezel/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibezel/","collection":"scripting","hash":"48f211318b00545c1d66c93b40e07154","indexed_by":"docs-index"}},{"content":"IBypass\n\nReturned by `BypassApi` — the bypass shank: two arms that cross past each other instead of meeting. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` | Ring size as label + region |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Shank` | The band, arms and bridge — `IBypassShank` |\n| `Gems` | The gems row — `IBypassGems` |\n\nBoth sections are live views over the shank's stored parameters: their getters read the current values and every setter regenerates the shank in place (same Guid), gems and prongs included.","metadata":{"title":"IBypass","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/","collection":"scripting","hash":"09ec4e7de6938c0e1b5cc76d451c1e5c","indexed_by":"docs-index"}},{"content":"IBypass — Band and arms (IBypassShank)\n\nThe band can be driven two ways: by the top/bottom gradient, or — with `UseStations` on — by a list of stations that each set their own section.\n\n| Member | Meaning |\n|---|---|\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `UseStations` | Build from `Stations` instead of the top/bottom gradient |\n| `SharedProfile` | Every station uses the same profile asset |\n| `Stations` | The per-station sections — `IBypassStation` each |\n| `TopWidth` / `TopHeight` / `BottomWidth` / `BottomHeight` | Band sections, mm |\n| `ArmAngle` | degrees |\n| `ArmWidth` / `ArmHeight` / `ArmTangent` / `CapDistance` | The arms, mm |\n| `TipRotation` | Roll of the tip about the rail tangent, degrees (signed) |\n| `Displacement` | How far the arms pass each other, mm |\n| `DisplacementStart` | Rail point where the displacement starts |\n| `BridgeEnabled` / `BridgeAngle` / `BridgeWidth` / `BridgeThickness` / `BridgeDiameter` | The bridge |\n| `SetProfile(assetName)` | RING_PROFILE asset by name |\n| `SetUseStations` / `SetSharedProfile` | |\n| `SetStations(stations)` | Replace the whole list (at least 2); turns `UseStations` on |\n| `SetStation(index, position, width, height, profileName=None)` | Edit one station in place |\n| `SetTopWidth` / `SetTopHeight` / `SetBottomWidth` / `SetBottomHeight` | mm |\n| `SetArmAngle` / `SetArmWidth` / `SetArmHeight` / `SetArmTangent` / `SetCapDistance` | |\n| `SetTipRotation` / `SetDisplacement` / `SetDisplacementStart` | |\n| `SetBridgeEnabled` / `SetBridgeAngle` / `SetBridgeWidth` / `SetBridgeThickness` / `SetBridgeDiameter` | |","metadata":{"title":"IBypass","section":"Band and arms (IBypassShank)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#band-and-arms-ibypassshank","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#band-and-arms-ibypassshank","collection":"scripting","hash":"3b6358ee54cb78506862f0b92cb31f50","indexed_by":"docs-index"}},{"content":"IBypass — A station (IBypassStation)\n\n| Member | Meaning |\n|---|---|\n| `Position` | `0` = arm tip, `1` = ring bottom |\n| `Width` / `Height` | Section at that position, mm |\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |","metadata":{"title":"IBypass","section":"A station (IBypassStation)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#a-station-ibypassstation","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#a-station-ibypassstation","collection":"scripting","hash":"294f741b2ff148b2de451d439fbc3d8a","indexed_by":"docs-index"}},{"content":"IBypass — Gems row (IBypassGems)\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the row is built |\n| `GemShape` / `GemSize` | The stone template |\n| `Angle` | Arc covered by the row from each tip, degrees |\n| `MinDistance` / `Margin` / `InnerMargin` / `Vertical` / `GemInside` | Placement, mm |\n| `InnerWidth` / `InnerHeight` / `BrightCut` | Inner channel, mm |\n| `Gradient` / `GradientPoints` / `GradientMiddlePosition` | Stone-size gradient along the row |\n| `GemSizeStart` / `GemSizeMiddle` / `GemSizeEnd` | Gradient sizes, mm |\n| `ProngType` / `ProngHeight` | `\"NONE\"`, `\"SHARED\"` or `\"SCALLOPED\"` |\n| `AutomaticProngDiameter` / `ProngDiameter` / `ProngGrow` / `ProngMinDiameter` | Prong sizing, mm |\n| `EndProngCount` / `ProngSpacing` / `ProngDistance` | Prong layout |\n| `DrillEnabled` / `DrillType` / `DrillWidth` / `DrillHeight` / `DrillVisible` / `DrillAllowIntersection` | Drills |\n| `ExtensionForManufacturing` | mm |\n| `DoubleProngSetting` / `ScallopRemoveChannel` | Scalloped-setting switches |\n| `ScallopGemWidth` … `ScallopProngHeight` | Scalloped proportions (percentages, not mm) |\n| `SetEnabled`, `SetGemShape`, `SetGemSize`, `SetAngle` | The row itself |\n| `SetMinDistance`, `SetMargin`, `SetInnerMargin`, `SetVertical`, `SetGemInside` | Placement |\n| `SetInnerWidth`, `SetInnerHeight`, `SetBrightCut` | Channel |\n| `SetGradient`, `SetGradientPoints`, `SetGradientMiddlePosition`, `SetGemSizeGradient(start, middle, end)` | The gradient |\n| `SetProngType`, `SetProngHeight`, `SetAutomaticProngDiameter`, `SetProngDiameter`, `SetProngGrow`, `SetProngMinDiameter`, `SetEndProngCount`, `SetProngSpacing`, `SetProngDistance` | Prongs |\n| `SetDrillEnabled`, `SetDrillType`, `SetDrillWidth`, `SetDrillHeight`, `SetDrillVisible`, `SetDrillAllowIntersection` | Drills |","metadata":{"title":"IBypass","section":"Gems row (IBypassGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#gems-row-ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#gems-row-ibypassgems","collection":"scripting","hash":"8aa360d242b4f146bd6f0edcf5bb5bdc","indexed_by":"docs-index"}},{"content":"IBypass — Gems row (IBypassGems)\n\n| Member | Meaning |\n|---|---|\n| `SetExtensionForManufacturing`, `SetDoubleProngSetting`, `SetScallopRemoveChannel` | |\n| `SetScallopGem(w, h)` / `SetScallopRail(w, h)` / `SetScallopProng(w, h)` | Scalloped proportions |\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"IBypass","section":"Gems row (IBypassGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#gems-row-ibypassgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/ibypass/#gems-row-ibypassgems","collection":"scripting","hash":"9ef0448376faef9058e34310577ea5b1","indexed_by":"docs-index"}},{"content":"ICabochon\n\nReturned by `CabochonApi` — a cabochon is its own stone (round / oval / rectangular / ... dome cut): it is not built around a mother gem, so it extends `IParametricObject` directly and `MotherGemId` is always `Guid.Empty`. Read-only — the parametric engine has no regenerate for cabochons, so there are no in-place setters (recreate + `Delete()` to change one):\n\n| Member | Meaning |\n|---|---|\n| `Shape` | Cabochon shape name — `\"Round\"`, `\"Oval\"`, ... |\n| `CutType` | Cabochon cut type name — `\"Cabochon\"`, `\"FlatTopSingleBevel\"`, ... |\n| `SizeX` / `SizeY` | Footprint dimensions, mm |\n| `SizeZ` | Dome height, mm |\n| `GirdleHeight` | Girdle height, mm |","metadata":{"title":"ICabochon","url":"https://www.rhinoartisan.com/docs/scripting/handles/icabochon/","source":"https://www.rhinoartisan.com/docs/scripting/handles/icabochon/","collection":"scripting","hash":"ca0ebc8fda59dcdfcff0920a807a8bcd","indexed_by":"docs-index"}},{"content":"ICathedral\n\nReturned by `CathedralApi` — the cathedral ring shank: arms rising toward the setting. Like Classic, a multi-gem ring body with no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` | Ring size as label + region |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Shank` | The band, arms and bridge — `ICathedralShank` |\n| `Gems` | The pavé row — `ICathedralGems` |\n| `SetTopWidth` / `SetTopHeight` / `SetBottomWidth` / `SetBottomHeight` | Shortcuts for the most common edits — same as the equivalent `Shank` setters |\n\nBoth sections are live views over the shank's stored parameters: their getters read the current values and every setter regenerates the shank in place (same Guid), gems and prongs included.","metadata":{"title":"ICathedral","url":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/","source":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/","collection":"scripting","hash":"70e5afb4a7843fe0e83b5091fbfcd86e","indexed_by":"docs-index"}},{"content":"ICathedral — Band and arms (ICathedralShank)\n\n| Member | Meaning |\n|---|---|\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `TopWidth` / `TopHeight` | Band section at the top, mm |\n| `BottomWidth` / `BottomHeight` | Band section at the bottom, mm |\n| `ArmAngle` | Arm angle, degrees |\n| `ArmWidth` | Opening between the rising arms, mm |\n| `ArmHeight` | How high the arms climb over the finger circle, mm |\n| `ArmTangent` | Tangency of the arm transition |\n| `CapDistance` | mm |\n| `BridgeEnabled` | Whether the bridge spanning the arms is built |\n| `BridgeWidth` / `BridgeThickness` / `BridgeDiameter` / `BridgeFillet` | Bridge section, mm |\n| `SetProfile(assetName)` | Swap the profile — a RING_PROFILE asset by name |\n| `SetTopWidth` / `SetTopHeight` / `SetBottomWidth` / `SetBottomHeight` | Band sections, mm |\n| `SetArmAngle` / `SetArmWidth` / `SetArmHeight` / `SetArmTangent` / `SetCapDistance` | The arms |\n| `SetBridgeEnabled` / `SetBridgeWidth` / `SetBridgeThickness` / `SetBridgeDiameter` / `SetBridgeFillet` | The bridge |","metadata":{"title":"ICathedral","section":"Band and arms (ICathedralShank)","url":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#band-and-arms-icathedralshank","source":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#band-and-arms-icathedralshank","collection":"scripting","hash":"4ac87d43bfdfd9bfcf24f3bfaf813e38","indexed_by":"docs-index"}},{"content":"ICathedral — Pavé row (ICathedralGems)\n\nThe row of small stones along the top — one run per arm. The advanced cathedral shares this exact section.","metadata":{"title":"ICathedral","section":"Pavé row (ICathedralGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","collection":"scripting","hash":"797d951e70f4fccede04778d22f71884","indexed_by":"docs-index"}},{"content":"ICathedral — Pavé row (ICathedralGems)\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the row is built |\n| `GemShape` | `\"ROUND\"`, `\"PRINCESS\"`, ... |\n| `GemSize` | Stone size, mm |\n| `Angle` | Degrees of the band covered by gems (`180` = top half) |\n| `MinDistance` / `Margin` / `InnerMargin` / `Vertical` / `GemInside` | Placement, mm |\n| `InnerWidth` / `InnerHeight` / `BrightCut` | Inner channel, mm |\n| `ProngType` | `\"NONE\"`, `\"SHARED\"` or `\"SCALLOPED\"` |\n| `ProngHeight` | mm |\n| `AutomaticProngDiameter` / `ProngDiameter` | Automatic diameter, or the explicit one in mm |\n| `DrillEnabled` / `DrillType` / `DrillWidth` / `DrillHeight` | Drills — type is `\"NONE\"`, `\"ROUND\"` or `\"QUAD\"` |\n| `DrillVisible` / `DrillAllowIntersection` | Bake the drill cutters, allow them to intersect |\n| `ExtensionForManufacturing` | mm |\n| `DoubleProngSetting` / `ScallopRemoveChannel` | Scalloped-setting switches |\n| `ScallopGemWidth` / `ScallopGemHeight` / `ScallopRailWidth` / `ScallopRailHeight` / `ScallopProngWidth` / `ScallopProngHeight` | Scalloped proportions (percentages, not mm) |\n| `SetEnabled`, `SetGemShape`, `SetGemSize`, `SetAngle` | The row itself |\n| `SetMinDistance`, `SetMargin`, `SetInnerMargin`, `SetVertical`, `SetGemInside` | Placement, mm |\n| `SetInnerWidth`, `SetInnerHeight`, `SetBrightCut` | Channel, mm |\n| `SetProngType`, `SetProngHeight`, `SetAutomaticProngDiameter`, `SetProngDiameter` | Prongs |\n| `SetDrillEnabled`, `SetDrillType`, `SetDrillWidth`, `SetDrillHeight`, `SetDrillVisible`, `SetDrillAllowIntersection` | Drills |\n| `SetExtensionForManufacturing`, `SetDoubleProngSetting`, `SetScallopRemoveChannel` | |\n| `SetScallopGem(w, h)` / `SetScallopRail(w, h)` / `SetScallopProng(w, h)` | Scalloped proportions, in one call each |","metadata":{"title":"ICathedral","section":"Pavé row (ICathedralGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","collection":"scripting","hash":"5cc150bfff5591266ce65fd777d4f63b","indexed_by":"docs-index"}},{"content":"ICathedral — Pavé row (ICathedralGems)\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"ICathedral","section":"Pavé row (ICathedralGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/icathedral/#pavé-row-icathedralgems","collection":"scripting","hash":"8045ee90ff1dfc95367cbfb64e43ce34","indexed_by":"docs-index"}},{"content":"IClassic\n\nReturned by `ClassicApi` — the classic comfort-fit ring shank. Multiple gems possible, so no single mother gem (`MotherGemId` is empty). Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` | Ring size label, e.g. `\"54\"` |\n| `RingSizeRegion` | Ring size region, e.g. `\"EUROPE\"` |\n| `RingDiameterMm` | Inner diameter, mm |\n| `TopProfile` / `MidProfile` / `BottomProfile` | The three section profiles — `IClassicProfile` each |\n| `ExternalProfile` | The outside-face profile — `IClassicExternalProfile` |\n| `Advanced` | The band opening — `IClassicAdvanced` |\n| `Gems` | The gems row — `IClassicGems` |\n| `SetWidth(width)` / `SetHeight(height)` | Shortcuts for the two most common edits — same as `TopProfile.SetWidth` / `TopProfile.SetHeight` |\n\nThe six section members are live views over the shank's stored parameters: their getters read the current values and every setter regenerates the shank in place (same Guid), gems and prongs included.\n\n```python\nfrom ArtisanPlugin.Scripting import ClassicApi as classic, Transaction\n\nring = classic.Selected()[0]\nwith Transaction.Begin(\"Slimmer band with a gem row\"):\n    ring.TopProfile.SetWidth(2.2)\n    ring.Gems.SetEnabled(True)\n    ring.Gems.SetGemSize(1.5)\n    ring.Gems.SetAngle(200)\n```","metadata":{"title":"IClassic","url":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/","collection":"scripting","hash":"684698b7208e761b9ffd37f134d5c472","indexed_by":"docs-index"}},{"content":"IClassic — Section profiles (IClassicProfile)\n\n`TopProfile`, `MidProfile` and `BottomProfile` share this surface. The top profile is always enabled (calling its `SetEnabled` raises); mid and bottom are optional extra sections:\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether this section is built (always `true` for the top profile) |\n| `ProfileName` | Name of the RING_PROFILE asset, `\"\"` when unset |\n| `Type` | How the open profile curve is closed: `\"SOLID\"`, `\"COMFORT\"` or `\"THICKNESS\"` |\n| `Height` / `Width` | Band section, mm |\n| `Thickness` | Wall thickness, mm — used when `Type` is `\"THICKNESS\"` |\n| `Comfort` | Comfort depth, mm — used when `Type` is `\"COMFORT\"` |\n| `Rotation` | Profile rotation, degrees |\n| `Displacement` | Profile displacement, mm |\n| `Orientation` | `0` = Natural, `1` = Reverse (flips the profile curve) |\n| `SetEnabled(enabled)` | Enable/disable the section (mid and bottom only) |\n| `SetProfile(assetName)` | Swap the profile — a RING_PROFILE asset by name |\n| `SetType(type)` | `\"SOLID\"`, `\"COMFORT\"` or `\"THICKNESS\"` |\n| `SetHeight(height)` / `SetWidth(width)` | Band section, mm |\n| `SetThickness(thickness)` / `SetComfort(comfort)` | mm |\n| `SetRotation(degrees)` / `SetDisplacement(displacement)` | Rotate / displace the profile |\n| `SetOrientation(orientation)` | `0` or `1` |","metadata":{"title":"IClassic","section":"Section profiles (IClassicProfile)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#section-profiles-iclassicprofile","source":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#section-profiles-iclassicprofile","collection":"scripting","hash":"b63e268c44f5024413cd128e071cdacf","indexed_by":"docs-index"}},{"content":"IClassic — External profile (IClassicExternalProfile)\n\nThe optional profile carved on the shank's outside face:\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the external profile is applied |\n| `ProfileName` | Name of the EXTERNAL_RING_PROFILE asset, `\"\"` when unset |\n| `Top` / `Mid` / `Bottom` | External height at each zone, mm |\n| `SetEnabled(enabled)` | Turn the external profile on/off |\n| `SetProfile(assetName)` | Swap the profile — an EXTERNAL_RING_PROFILE asset by name |\n| `SetTop(height)` / `SetMid(height)` / `SetBottom(height)` | mm |","metadata":{"title":"IClassic","section":"External profile (IClassicExternalProfile)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#external-profile-iclassicexternalprofile","source":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#external-profile-iclassicexternalprofile","collection":"scripting","hash":"48040b156266629a92be566485aa4fa3","indexed_by":"docs-index"}},{"content":"IClassic — Opening (IClassicAdvanced)\n\nThe opening at the bottom of the band:\n\n| Member | Meaning |\n|---|---|\n| `OpeningType` | `\"NONE\"`, `\"CUT\"` or `\"STRANGLE\"` |\n| `CutLength` / `CutBumping` | Cut opening parameters, mm — used when `\"CUT\"` |\n| `StrangleOpening` | Opening width, mm — used when `\"STRANGLE\"` |\n| `StrangleBaseX` / `StrangleBaseY` / `StrangleBaseZ` | Strangle base section, mm |\n| `SetOpeningType(openingType)` | `\"NONE\"`, `\"CUT\"` or `\"STRANGLE\"` |\n| `SetCutLength(length)` / `SetCutBumping(bumping)` | mm |\n| `SetStrangleOpening(opening)` | mm |\n| `SetStrangleBase(x, y, z)` | The three base dimensions in one call, mm |","metadata":{"title":"IClassic","section":"Opening (IClassicAdvanced)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#opening-iclassicadvanced","source":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#opening-iclassicadvanced","collection":"scripting","hash":"c22db40de77125ed9a3074593bf889f7","indexed_by":"docs-index"}},{"content":"IClassic — Gems row (IClassicGems)\n\nThe row of gems the shank can carry around its band. Enabling or editing it re-bakes the gems and prongs as child objects:\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the gems row is built |\n| `GemShape` | `\"ROUND\"`, `\"PRINCESS\"`, ... |\n| `GemSize` | Gem size, mm |\n| `Angle` | Degrees of the band covered by gems (`180` = top half) |\n| `MinDistance` | Minimum distance between gems, mm |\n| `Margin` | Side margin, mm |\n| `Vertical` | Vertical displacement of the row, mm |\n| `GemInside` | How deep the gems sit inside, mm |\n| `InnerWidth` / `InnerHeight` | Inner channel section, mm |\n| `BrightCut` | Bright-cut width, mm |\n| `ProngType` | `\"NONE\"`, `\"SHARED\"` or `\"SCALLOPED\"` |\n| `ProngHeight` / `ProngMoveInZ` | Prong height and Z displacement, mm |\n| `AutomaticProngDiameter` / `ProngDiameter` | Automatic diameter, or the explicit one in mm |\n| `DrillType` | `\"NONE\"`, `\"ROUND\"` or `\"QUAD\"` |\n| `DrillWidth` / `DrillHeight` | Drill section, mm |\n| `DrillAllowIntersection` | Whether drills may intersect |\n| `ExtensionForManufacturing` | Manufacturing extension, mm |\n| `SetEnabled(enabled)` | Turn the gems row on/off |\n| `SetGemShape(shape)` / `SetGemSize(size)` | The gem template |\n| `SetAngle(degrees)` | `> 0` and `\n\nProfile names come from your asset library. `SetProfile` takes the name of an asset, so list what is available before setting one — `AssetsApi.List(\"RING_PROFILE\")` for the section profiles and `AssetsApi.List(\"EXTERNAL_RING_PROFILE\")` for the external one; `AssetsApi.GetDefault(type)` returns the one used when no profile is given. See Assets.","metadata":{"title":"IClassic","section":"Gems row (IClassicGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#gems-row-iclassicgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/iclassic/#gems-row-iclassicgems","collection":"scripting","hash":"c2fb77411e8114258c852ea4a9f0dd7f","indexed_by":"docs-index"}},{"content":"ICluster\n\nReturned by `ClusterApi` — a cluster of stones around one center gem. Read-only — no setters. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ClusterStoneCount` | Number of stones forming the cluster |\n| `ClusterStoneSize` | Size of each cluster stone, mm |\n| `ClusterStoneWeight` | Carat weight of one cluster stone |\n| `ClusterTotalWeight` | Total carat weight of the cluster stones |","metadata":{"title":"ICluster","url":"https://www.rhinoartisan.com/docs/scripting/handles/icluster/","source":"https://www.rhinoartisan.com/docs/scripting/handles/icluster/","collection":"scripting","hash":"bd24b995e8a908e1965693c93800fe8e","indexed_by":"docs-index"}},{"content":"ICutter\n\nReturned by `CutterApi` — the cutter (the negative volume that seats one gem in the metal). Every setter regenerates the cutter in place (same id) and takes literal values: sizes and heights in % of the gem, `GemInside` in mm. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `SizeTop` | Size at the top |\n| `SizeBottom` | Size at the bottom |\n| `SizeDrill` | Size of the drill |\n| `HeightTop` | Height of the top section |\n| `HeightCrown` | Height of the crown section |\n| `HeightGirdle` | Height of the girdle band |\n| `HeightPavilion` | Height of the pavilion section |\n| `HeightDrill` | Height of the drill section |\n| `GemInside` | How deep the gem sits inside |\n| `DrillType` | Drill type selector (integer) |\n\n| Method | Does |\n|---|---|\n| `SetSizeTop(v)` / `SetSizeBottom(v)` / `SetSizeDrill(v)` | Set the widths, % |\n| `SetHeightTop(v)` / `SetHeightCrown(v)` / `SetHeightGirdle(v)` / `SetHeightPavilion(v)` | Set the section heights, % |\n| `SetHeightDrill(v)` | Drill body height, %. `0` = no drill body |\n| `SetGemInside(mm)` | Signed margin around the gem outline |\n| `SetDrillType(n)` | `0` gem shape, `1` round, `2` square, `3` hexagon |\n| `FitToGem(clearance = None)` | Sets `GemInside`, `HeightGirdle` and `HeightPavilion` so the cutter encloses the gem's real girdle and pavilion, with a default clearance of 0.05 mm. See Fit to gem |","metadata":{"title":"ICutter","url":"https://www.rhinoartisan.com/docs/scripting/handles/icutter/","source":"https://www.rhinoartisan.com/docs/scripting/handles/icutter/","collection":"scripting","hash":"20979ee79789ea9796ea0d863edf4b37","indexed_by":"docs-index"}},{"content":"IEternity\n\nReturned by `EternityApi` — an eternity ring: a band with gems all around. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` | Ring size label, e.g. `\"6\"`, `\"M\"` |\n| `RingSizeRegion` | Ring size region, e.g. `\"US\"`, `\"EU\"` |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Gems` | The stones around the band — `IEternityGems` |\n| `Prongs` | The prongs holding them — `IEternityProngs` |\n| `Bezels` | The bezel rails — `IEternityBezels` |\n| `Shank` | The two band halves — `IEternityShank` |\n\nAll four sections are live views over the ring's stored parameters: their getters read the current values and every setter regenerates the ring in place (same Guid), re-baking its stones.\n\n```python\nfrom ArtisanPlugin.Scripting import EternityApi as eternity, Transaction\n\nring = eternity.All()[0]\nwith Transaction.Begin(\"Half eternity in emerald cut\"):\n    ring.Gems.SetShape(\"EMERALD\")\n    ring.Gems.SetDistribution(\"HALF\")\n    ring.Prongs.SetMode(\"CURVED\")\n```","metadata":{"title":"IEternity","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/","collection":"scripting","hash":"d158c0f051a522741b611aef80d98251","indexed_by":"docs-index"}},{"content":"IEternity — Stones (IEternityGems)\n\n| Member | Meaning |\n|---|---|\n| `Shape` | `\"ROUND\"`, `\"PRINCESS\"`, ... |\n| `Material` | `\"Diamond\"`, `\"Ruby\"`, ... |\n| `CaratWeight` | Carat weight of one stone |\n| `SizeX` / `SizeY` / `SizeZ` | Stone dimensions, mm |\n| `Distribution` | `\"FULL\"`, `\"HALF\"`, `\"THREEQUARTERS\"`, `\"FIVESTONES\"`, `\"SEVENSTONES\"` or `\"NINESTONES\"` |\n| `Orientation` | `\"NATURAL\"` or `\"ROTATED\"` |\n| `MinDistance` | Minimum distance between stones, mm |\n| `MoveInZ` | Radial displacement of the stone row, mm |\n| `SetShape` / `SetMaterial` / `SetCaratWeight` | The stone template |\n| `SetSize(x, y, z)` | Explicit dimensions in one call, mm |\n| `SetDistribution` / `SetOrientation` | How the row runs around the band |\n| `SetMinDistance` / `SetMoveInZ` | Placement, mm |","metadata":{"title":"IEternity","section":"Stones (IEternityGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#stones-ieternitygems","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#stones-ieternitygems","collection":"scripting","hash":"d3f0d30e52e4d98f0872535077a7b2a1","indexed_by":"docs-index"}},{"content":"IEternity — Prongs (IEternityProngs)\n\n| Member | Meaning |\n|---|---|\n| `Distribution` | `\"SHARED\"` or `\"INDIVIDUAL_FOR_EACH_GEM\"` |\n| `Mode` | `\"STRAIGHT\"` or `\"CURVED\"` |\n| `TopDistance` / `BottomDistance` | mm |\n| `TopDiameter` / `BottomDiameter` | mm |\n| `HeightOverGirdle` | mm |\n| `IndividualTopDistance` / `IndividualBottomDistance` | mm — used with the individual distribution |\n| `ExpansionManufacturing` | mm |\n| `SetDistribution` / `SetMode` | |\n| `SetTopDistance` / `SetBottomDistance` / `SetTopDiameter` / `SetBottomDiameter` / `SetHeightOverGirdle` | mm |\n| `SetIndividualTopDistance` / `SetIndividualBottomDistance` / `SetExpansionManufacturing` | mm |","metadata":{"title":"IEternity","section":"Prongs (IEternityProngs)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#prongs-ieternityprongs","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#prongs-ieternityprongs","collection":"scripting","hash":"928bf3190d8394b05073e680fc69755d","indexed_by":"docs-index"}},{"content":"IEternity — Bezel rails (IEternityBezels)\n\n| Member | Meaning |\n|---|---|\n| `RailMode` | `\"SINGLE\"` or `\"DOUBLE\"` |\n| `RailShape` | `\"ROUND\"`, `\"RECTANGLE\"` or `\"OVAL\"` |\n| `ProfileShape` | `\"ROUND\"` or `\"SQUARE\"` |\n| `RemoveFinger` | Whether the finger volume is removed |\n| `TopRail` / `BottomRail` | The two rails — `IEternityRail` each |\n| `SetRailMode` / `SetRailShape` / `SetProfileShape` / `SetRemoveFinger` | |","metadata":{"title":"IEternity","section":"Bezel rails (IEternityBezels)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#bezel-rails-ieternitybezels","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#bezel-rails-ieternitybezels","collection":"scripting","hash":"76878d05068b074081e939c04665cab5","indexed_by":"docs-index"}},{"content":"IEternity — A rail (IEternityRail)\n\n| Member | Meaning |\n|---|---|\n| `Diameter` / `Width` / `Height` / `MoveInZ` | Rail section and placement, mm |\n| `ThreadDiameter` / `ThreadX` / `ThreadY` | Thread, mm |\n| `SetDiameter` / `SetWidth` / `SetHeight` / `SetMoveInZ` / `SetThreadDiameter` | mm |\n| `SetThread(x, y)` | Both thread axes in one call, mm |","metadata":{"title":"IEternity","section":"A rail (IEternityRail)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#a-rail-ieternityrail","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#a-rail-ieternityrail","collection":"scripting","hash":"172d5637dbdf8fe468de8be5dceabe53","indexed_by":"docs-index"}},{"content":"IEternity — Band (IEternityShank)\n\n| Member | Meaning |\n|---|---|\n| `StartingCap` / `EndingCap` | Caps where the two halves meet, mm |\n| `Upper` / `Lower` | The two band halves — `IEternityShankParams` each |\n| `SetStartingCap` / `SetEndingCap` | mm |\n\nA band half (IEternityShankParams)\n| Member | Meaning |\n|---|---|\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `Type` | `\"SOLID\"`, `\"COMFORT\"` or `\"THICKNESS\"` |\n| `Width` / `Height` | Band section, mm |\n| `ProfileThickness` / `HeightComfort` | mm |\n| `ProfileType` | Profile type selector |\n| `ProfileOrientation` | `0` = Natural, `1` = Reverse |\n| `SetProfile(assetName)` | RING_PROFILE asset by name |\n| `SetType` / `SetWidth` / `SetHeight` / `SetProfileThickness` / `SetHeightComfort` | |\n| `SetProfileType` / `SetProfileOrientation` | |\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"IEternity","section":"Band (IEternityShank)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#band-ieternityshank","source":"https://www.rhinoartisan.com/docs/scripting/handles/ieternity/#band-ieternityshank","collection":"scripting","hash":"e9093d9961871a198b2897df0b29e884","indexed_by":"docs-index"}},{"content":"IGem\n\nReturned by `GemApi` — a gem placed in the current document. `IGem` is the one handle that does not extend `IParametricObject`: it is an intentionally narrow, self-contained surface, so scripts can only do what it allows. This is its complete member list:\n\n| Member | Meaning |\n|---|---|\n| `Id` | The gem's Guid |\n| `Shape` | `\"ROUND\"`, `\"PRINCESS\"`, `\"MARQUISE\"`, ... |\n| `Material` | Compound material name, e.g. `\"Diamond\"` |\n| `CaratWeight` | Carat weight |\n| `SizeX` / `SizeY` / `SizeZ` | Dimensions, mm |\n| `Position` | Origin of the gem's plane |\n| `Plane` | The full placement plane (origin + orientation) |\n| `LayerName` | Full layer path |\n| `Select(on)` | Viewport selection state — not a document mutation (no undo record, no license gate); useful for scripts that end by highlighting their result |\n| `SetMaterial(materialName)` | Change the material |\n| `SetShape(shape)` | Change the cut in place (`\"OVAL\"`, `\"PEAR\"`…), keeping carat weight, material, plane and layer; the settings built on the gem rebuild around it |\n| `SetCaratWeight(caratWeight)` | Resize by carat, keeping shape, material, plane and layer |\n| `SetSize(sizeX, sizeY, sizeZ)` | Resize to explicit mm dimensions |\n| `Scale(factor)` | Uniform scale of the current size (`factor > 0`) |\n| `Move(translation)` | Translate by a `Vector3d` |\n| `SetPlane(plane)` | Re-place the gem: moves *and* orients to the given plane |\n| `Rotate(degrees)` | Spin around the gem's own Z axis (positive = counter-clockwise) |\n| `Flip()` | Turn the gem upside down (180° around its own X axis) |\n| `Copy()` / `Copy(translation)` | Duplicate in place, or displaced by `translation` — returns the new `IGem` |\n| `Delete()` | Remove the gem |","metadata":{"title":"IGem","url":"https://www.rhinoartisan.com/docs/scripting/handles/igem/","source":"https://www.rhinoartisan.com/docs/scripting/handles/igem/","collection":"scripting","hash":"1469c247432624a2603d568fa30cc513","indexed_by":"docs-index"}},{"content":"IGemsOnCurve\n\nReturned by `GemsOnCurveApi` — a row of identical gems distributed along a parent curve. The \"mother\" here is the *curve*, not a single gem: the inherited `GemShape` / `GemMaterial` / `GemCaratWeight` describe the gem template that gets repeated along the curve. Read-only — no setters. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `CurveId` | Guid of the parent curve |\n| `StoneCount` | Number of gems in the row |","metadata":{"title":"IGemsOnCurve","url":"https://www.rhinoartisan.com/docs/scripting/handles/igemsoncurve/","source":"https://www.rhinoartisan.com/docs/scripting/handles/igemsoncurve/","collection":"scripting","hash":"bfbfb623c664185768fca9fa90cf1ec3","indexed_by":"docs-index"}},{"content":"IGraduated\n\nReturned by `GraduatedApi` - a band whose section grows toward the centre stone, carrying a run of stones that shrink toward the finger. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | Ring size |\n| `Shank` | The band - `IGraduatedShank` |\n| `Gems` | The stone run - `IGraduatedGems` |\n\nEvery setter regenerates the shank in place, re-baking stones, prongs and the under-bezel rail.","metadata":{"title":"IGraduated","url":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/","source":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/","collection":"scripting","hash":"72a4b782d65923f105d180eeba0bbe9b","indexed_by":"docs-index"}},{"content":"IGraduated — The band (IGraduatedShank)\n\n| Member | Meaning |\n|---|---|\n| `TopProfile` / `BottomProfile` | The two profiles the section morphs between - `IGraduatedProfile` each |\n| `CutBumping` / `OpeningMargin` | mm |\n| `SetCutBumping` / `SetOpeningMargin` | |\n\nA profile (IGraduatedProfile)\n| Member | Meaning |\n|---|---|\n| `Enabled` / `ProfileName` / `Type` | Whether it is used, its RING_PROFILE asset, and how the curve is closed (`\"SOLID\"`, `\"COMFORT\"`, `\"THICKNESS\"`) |\n| `Width` / `Height` / `Thickness` / `Comfort` | mm |\n| `Rotation` / `Displacement` / `Orientation` | Profile placement |\n| `SetEnabled`, `SetProfile`, `SetType`, `SetWidth`, `SetHeight`, `SetThickness`, `SetComfort`, `SetRotation`, `SetDisplacement`, `SetOrientation` | |","metadata":{"title":"IGraduated","section":"The band (IGraduatedShank)","url":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/#the-band-igraduatedshank","source":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/#the-band-igraduatedshank","collection":"scripting","hash":"210665dd9fad210200704b9966d16f5e","indexed_by":"docs-index"}},{"content":"IGraduated — The stone run (IGraduatedGems)\n\nMost sizes come as start/end pairs: start is nearest the centre stone, end nearest the band.\n\n| Member | Meaning |\n|---|---|\n| `Enabled` / `GemShape` | |\n| `NumberOfStones` | Per side |\n| `SizeStart` / `SizeEnd` | Stone size at each end of the run, mm |\n| `Distance` | Gap between adjacent stones, mm |\n| `CenterStoneSize` | mm |\n| `Lift` / `Vertical` / `GemInside` | Placement, mm |\n| `GemMoveInZStart` / `GemMoveInZEnd` | mm |\n| `InnerWidth` / `InnerHeight` / `BrightCut` | Channel, mm |\n| `ProngsEnabled` / `ProngType` / `ProngCutByRingSize` | The prongs |\n| `ProngHeightStart` / `ProngHeightEnd` | mm |\n| `ProngOverGirdleStart` / `ProngOverGirdleEnd` | mm |\n| `AutomaticProngDiameter` / `ProngDiameterStart` / `ProngDiameterEnd` | mm |\n| `ProngSeparationStart` / `ProngSeparationEnd` | mm |\n| `ProngMoveInZ` / `ProngGrow` / `ProngMinDiameter` / `EndProngCount` / `ProngSpacing` / `ProngDistance` | Prong layout |\n| `UnderBezelEnabled` | The rail under the stones |\n| `UnderBezelWidth` / `UnderBezelHeight` / `UnderBezelOverGirdle` / `UnderBezelGirdleWidth` / `UnderBezelBottomWidth` / `UnderBezelGemInside` | The rail, mm - height `0` means auto (drop to the finger curve) |\n| `DrillType` / `DrillWidth` / `DrillHeight` / `DrillAllowIntersection` | Drills |\n| `ExtensionForManufacturing` | mm |\n| `SetSizes(start, end)`, `SetProngHeights(start, end)`, `SetProngDiameters(start, end)`, `SetProngSeparation(start, end)`, `SetProngOverGirdle(start, end)`, `SetGemMoveInZ(start, end)` | The paired setters |\n| Plus one setter per remaining member | |","metadata":{"title":"IGraduated","section":"The stone run (IGraduatedGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/#the-stone-run-igraduatedgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/igraduated/#the-stone-run-igraduatedgems","collection":"scripting","hash":"3c395d4c33d72abafb612e98bc03c96d","indexed_by":"docs-index"}},{"content":"IHalo\n\nReturned by `HaloApi` — a halo of small stones around one center gem. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `HaloStoneCount` | Number of stones forming the halo ring |\n| `HaloStoneSize` | Size of each halo stone, mm |\n| `HaloStoneWeight` | Carat weight of one halo stone |\n| `HaloTotalWeight` | Total carat weight of the halo stones |\n| `SetStoneSize(stoneSize)` | Halo stone size, mm |\n| `SetStoneDistance(stoneDistance)` | Distance between stones, mm |\n\nEach setter regenerates the halo: the group keeps its id, the member objects are rebuilt.","metadata":{"title":"IHalo","url":"https://www.rhinoartisan.com/docs/scripting/handles/ihalo/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ihalo/","collection":"scripting","hash":"76728c1d7bd3762fd341dac2d0dad4ce","indexed_by":"docs-index"}},{"content":"IHiddenHalo\n\nReturned by `HiddenHaloApi` — the hidden ring of small stones under the center gem. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `RailShape` | Shape of the hidden halo rail: `\"CIRCLE\"`, `\"SQUARE\"` or `\"OVAL\"` |\n| `StoneCount` | Number of small stones forming the hidden ring |\n| `StoneSize` | Size of each stone, mm |\n| `StoneWeight` | Carat weight of one stone |\n| `TotalStoneWeight` | Total carat weight of the stones |\n| `SetStoneSize(stoneSize)` | Stone size, mm |\n| `SetStoneDistance(stoneDistance)` | Distance between stones, mm |\n\nEach setter regenerates the hidden halo: the group keeps its id, the member objects are rebuilt.","metadata":{"title":"IHiddenHalo","url":"https://www.rhinoartisan.com/docs/scripting/handles/ihiddenhalo/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ihiddenhalo/","collection":"scripting","hash":"16d77429c99aab77f3be37154f18fd63","indexed_by":"docs-index"}},{"content":"IMartini\n\nReturned by `MartiniApi` — the martini setting: 4 prongs tapering to a point below the gem. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ProngHeight` | Prong height, mm |\n| `ProngDiameterTop` | Prong diameter at the top, mm |\n| `ProngDiameterBottom` | Prong diameter at the bottom, mm |\n| `UpperRailEnabled` | Whether the upper rail is present |\n| `SideGemsEnabled` | Whether the lateral side gems are present |\n| `SideGemSize` | Side gem size, mm |\n| `SetProngHeight(prongHeight)` | Prong height, mm |\n| `SetSideGemSize(sideGemSize)` | Side gem size, mm |\n\nEach setter regenerates the martini: the group keeps its id, the member objects are rebuilt.","metadata":{"title":"IMartini","url":"https://www.rhinoartisan.com/docs/scripting/handles/imartini/","source":"https://www.rhinoartisan.com/docs/scripting/handles/imartini/","collection":"scripting","hash":"701c32564e3c3ee49fc506e37f8c67cd","indexed_by":"docs-index"}},{"content":"IMatchingShank\n\nReturned by `MatchingShankApi` — a band shaped to sit against an existing ring (the \"mother\"), so the pair stacks without a gap. Multiple gems, so no single mother gem; the rings it was fitted to are in `MotherRingIds`. Adds to `IParametricObject`:","metadata":{"title":"IMatchingShank","url":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/","source":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/","collection":"scripting","hash":"c9110f254da0c4871b26c6b79424f414","indexed_by":"docs-index"}},{"content":"IMatchingShank\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | Ring size |\n| `MotherRingIds` | The ring(s) this shank was fitted against |\n| `RingCurveId` | The rail it follows, `Guid.Empty` when built from the ring size |\n| `CurveFromRingSize` | Rail generated from the ring size instead of a picked curve |\n| `Metal` | e.g. `\"GOLD_YELLOW_18\"` |\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `ProfileWidth` / `ProfileHeight` | Band section at the top, mm |\n| `BottomWidth` / `BottomHeight` | Band section at the bottom, mm — `0` = same as the top |\n| `NumberOfPoints` | Sections used to follow the mother — always even |\n| `Clearance` | Gap kept against the mother, mm |\n| `Distance` | Axial gap; negative presses the band into the mother, mm |\n| `TopDistance` | Extra axial gap at the ring top, fading to 0 at 90 degrees, mm |\n| `InteriorType` | `\"SOLID\"` or `\"COMFORT\"` |\n| `Comfort` | mm — used when `InteriorType` is `\"COMFORT\"` |\n| `FlipSide` / `BothSides` | Which side of the mother to build on |\n| `SectionDeltas` | Your per-section adjustment, mm |\n| `SectionContactOffsets` | What the last computation measured — read-only output |\n| `Gems` | The gems row — `IMatchingShankGems` |\n| `SetProfile(assetName)` | RING_PROFILE asset by name |\n| `SetProfileWidth` / `SetProfileHeight` / `SetBottomWidth` / `SetBottomHeight` | Band sections, mm |\n| `SetNumberOfPoints(points)` | Must be even and >= 2 |\n| `SetClearance` / `SetDistance` / `SetTopDistance` | The fit, mm |\n| `SetInteriorType` / `SetComfort` | |\n| `SetFlipSide` / `SetBothSides` | |\n| `SetSectionDeltas(deltas)` | One value per section, mm |\n\nEvery setter regenerates the shank in place (same Guid), re-baking its gems and prongs — and, with `BothSides` on, both bands.","metadata":{"title":"IMatchingShank","url":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/","source":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/","collection":"scripting","hash":"071b6eb11cc757b4c0930a3624584ec1","indexed_by":"docs-index"}},{"content":"IMatchingShank — Gems row (IMatchingShankGems)\n\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether the row is built |\n| `GemShape` / `GemSize` | The stone template |\n| `Distribution` | `\"FULL\"`, `\"SIDE\"` or `\"TOP\"` |\n| `StartAngle` / `EndAngle` | Degrees from the top — used with `\"SIDE\"` |\n| `TopAngle` | Total arc in degrees — used with `\"TOP\"` |\n| `Angle` / `RowOffset` | Row placement |\n| `MinDistance` / `Margin` / `InnerMargin` / `Vertical` / `GemInside` | Placement, mm |\n| `InnerWidth` / `InnerHeight` | Inner channel at the top, mm |\n| `BottomInnerWidth` / `BottomInnerHeight` | At the bottom, mm — `0` = same as the top |\n| `BrightCut` | mm |\n| `Gradient` / `GradientPoints` / `GradientMiddlePosition` | Stone-size gradient |\n| `GemSizeStart` / `GemSizeMiddle` / `GemSizeEnd` | Gradient sizes, mm |\n| `ProngType` / `ProngHeight` | `\"NONE\"`, `\"SHARED\"` or `\"SCALLOPED\"` |\n| `AutomaticProngDiameter` / `ProngDiameter` | Prong sizing |\n| `ProngTopDiameter` | mm — `0` = automatic |\n| `ProngBottomDiameter` | mm — `0` = same as the top |\n| `ProngGrow` / `ProngMinDiameter` / `EndProngCount` / `ProngSpacing` / `ProngDistance` | Prong layout |\n| `DrillEnabled` / `DrillType` / `DrillWidth` / `DrillHeight` / `DrillVisible` / `DrillAllowIntersection` | Drills |\n| `ExtensionForManufacturing` | mm |\n| `DoubleProngSetting` / `ScallopRemoveChannel` | Scalloped-setting switches |\n| `ScallopGemWidth` … `ScallopProngHeight` | Scalloped proportions (percentages, not mm) |\n| `SetEnabled`, `SetGemShape`, `SetGemSize`, `SetAngle`, `SetRowOffset` | The row itself |\n| `SetDistribution`, `SetSideAngles(start, end)`, `SetTopAngle` | Where the row runs |\n| `SetMinDistance`, `SetMargin`, `SetInnerMargin`, `SetVertical`, `SetGemInside` | Placement |","metadata":{"title":"IMatchingShank","section":"Gems row (IMatchingShankGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/#gems-row-imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/#gems-row-imatchingshankgems","collection":"scripting","hash":"63bf480c6e57494fca2d084d99ee1cfb","indexed_by":"docs-index"}},{"content":"IMatchingShank — Gems row (IMatchingShankGems)\n\n| Member | Meaning |\n|---|---|\n| `SetInnerWidth`, `SetInnerHeight`, `SetBottomInnerWidth`, `SetBottomInnerHeight`, `SetBrightCut` | Channel |\n| `SetGradient`, `SetGradientPoints`, `SetGradientMiddlePosition`, `SetGemSizeGradient(start, middle, end)` | The gradient |\n| `SetProngType`, `SetProngHeight`, `SetAutomaticProngDiameter`, `SetProngDiameter`, `SetProngTopDiameter`, `SetProngBottomDiameter`, `SetProngGrow`, `SetProngMinDiameter`, `SetEndProngCount`, `SetProngSpacing`, `SetProngDistance` | Prongs |\n| `SetDrillEnabled`, `SetDrillType`, `SetDrillWidth`, `SetDrillHeight`, `SetDrillVisible`, `SetDrillAllowIntersection` | Drills |\n| `SetExtensionForManufacturing`, `SetDoubleProngSetting`, `SetScallopRemoveChannel` | |\n| `SetScallopGem(w, h)` / `SetScallopRail(w, h)` / `SetScallopProng(w, h)` | Scalloped proportions |\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"IMatchingShank","section":"Gems row (IMatchingShankGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/#gems-row-imatchingshankgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/imatchingshank/#gems-row-imatchingshankgems","collection":"scripting","hash":"cfd66d57b82d4dd9a68ee3e632dd3969","indexed_by":"docs-index"}},{"content":"IMicroSetting\n\nReturned by `MicroSettingApi` — the micro-setting: small-stone pavé infrastructure (cutters + V-cutters + channel + row prongs). It doesn't wrap a single gem — it's structural for a group of small stones, so it extends `IParametricObject` directly. Read-only — no setters:\n\n| Member | Meaning |\n|---|---|\n| `ChannelEnabled` | Whether the channel was generated |\n| `RowProngsEnabled` | Whether the row prongs were generated |\n| `CuttersCount` | Number of cutters in the group |\n| `VCuttersCount` | Number of V-cutters in the group |","metadata":{"title":"IMicroSetting","url":"https://www.rhinoartisan.com/docs/scripting/handles/imicrosetting/","source":"https://www.rhinoartisan.com/docs/scripting/handles/imicrosetting/","collection":"scripting","hash":"9acdc4a366684f4c0f3111fe2f3b82b1","indexed_by":"docs-index"}},{"content":"IPaveShank\n\nReturned by `PaveShankApi` - a band carrying one or more longitudinal rows of stones. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | Ring size |\n| `TopProfile` | The band section - `IClassicProfile` |\n| `Advanced` | The band opening - `IClassicAdvanced` |\n| `Rail` | The rows and prongs - `IPaveShankRail` |\n| `CuttersEnabled` / `SetCuttersEnabled` | Whether the gem cutters are subtracted from the band |\n\nEvery setter regenerates the shank in place, re-baking stones and prongs.","metadata":{"title":"IPaveShank","url":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/","collection":"scripting","hash":"7f9bafe82af465dd97c1cb76a77f429a","indexed_by":"docs-index"}},{"content":"IPaveShank — The rail (IPaveShankRail)\n\n| Member | Meaning |\n|---|---|\n| `Rows` | The gem rows in lateral order - `IPaveShankRow` each |\n| `Prongs` | The prong definitions - `IPaveShankProng` each |\n| `ProngHeight` / `ProngDiameter` | Global defaults, mm |\n| `ShowProngs` | Whether prongs are built |\n| `SetRows(rows)` | Replaces the whole row list |\n| `SetRow(index, gemSize, offset, spacing, startAngle, endAngle)` | Edits one row in place |\n| `SetProngHeight` / `SetProngDiameter` / `SetShowProngs` | |","metadata":{"title":"IPaveShank","section":"The rail (IPaveShankRail)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/#the-rail-ipaveshankrail","source":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/#the-rail-ipaveshankrail","collection":"scripting","hash":"71f6320486f4e97687e57676fd9e4c01","indexed_by":"docs-index"}},{"content":"IPaveShank — A row (IPaveShankRow)\n\n| Member | Meaning |\n|---|---|\n| `GemSize` | Stone size, mm |\n| `Offset` | Lateral offset from the band centre, mm |\n| `Spacing` | Gap between adjacent stones, mm |\n| `StartAngle` / `EndAngle` | Where the row runs along the band, degrees |\n| `Mirror` | The row is the mirror of its opposite |\n\nA prong (IPaveShankProng)\nRead-only. Each prong is tied to a row by index.\n\n| Member | Meaning |\n|---|---|\n| `RowIndex` | The row it belongs to |\n| `X` / `Y` | Position, mm |\n| `Diameter` / `Height` | mm |\n| `ApplyToAllGems` / `Mirror` / `Visible` | Flags |\n\nThe pave shank's row model is still evolving in the tool. This surface follows the current `Rows` model; the legacy fixed-layout fields it replaced are not exposed.","metadata":{"title":"IPaveShank","section":"A row (IPaveShankRow)","url":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/#a-row-ipaveshankrow","source":"https://www.rhinoartisan.com/docs/scripting/handles/ipaveshank/#a-row-ipaveshankrow","collection":"scripting","hash":"e167ce70f435aecc9f4c99b30df3f391","indexed_by":"docs-index"}},{"content":"IPearl\n\nReturned by `PearlApi` — a pearl is its own stone (a sphere on a plane) with two optional metal children baked alongside it: a calotte (cup) and a wire (post). Not built around a mother gem, so it extends `IParametricObject` directly and `MotherGemId` is always `Guid.Empty`. Read-only — no in-place setters (recreate + `Delete()` to change one):\n\n| Member | Meaning |\n|---|---|\n| `Diameter` | Pearl sphere diameter, mm |\n| `HasCalotte` | A calotte child was baked with this pearl |\n| `HasWire` | A wire child was baked with this pearl |\n| `CalotteId` | Guid of the calotte child, `Guid.Empty` when there is none |\n| `WireId` | Guid of the wire child, `Guid.Empty` when there is none |","metadata":{"title":"IPearl","url":"https://www.rhinoartisan.com/docs/scripting/handles/ipearl/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ipearl/","collection":"scripting","hash":"f7e92a3123ab140cd96f8c3ef557ba69","indexed_by":"docs-index"}},{"content":"IPeghead\n\nReturned by `PegheadApi` — a peghead setting on one mother gem. Adds only setters to `IGemSetting`; each regenerates the peghead in place (same Guid), millimetres:\n\n| Member | Meaning |\n|---|---|\n| `SetProngs(prongs)` | Prong count — negative counts select the rotated variant (`-4` = 4 prongs at 45 degrees) |\n| `SetHeight(height)` | Height, mm |\n| `SetThickness(thickness)` | Prong thickness, mm |\n| `SetGirdleWidth(girdleWidth)` | Girdle width, mm |\n| `SetOverGirdleHeight(overGirdleHeight)` | Height over the girdle, mm |\n| `SetGemInside(gemInside)` | How deep the gem sits inside, mm |","metadata":{"title":"IPeghead","url":"https://www.rhinoartisan.com/docs/scripting/handles/ipeghead/","source":"https://www.rhinoartisan.com/docs/scripting/handles/ipeghead/","collection":"scripting","hash":"0a8a2b57e4cb241182b98e0cd44ab3e4","indexed_by":"docs-index"}},{"content":"ISignetRing\n\nReturned by `SignetRingApi` — a signet ring: a flat face carried on a band. No gems, so no mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` | Ring size as label + region |\n| `RingDiameterMm` | Inner diameter, mm |\n| `Face` | The face and the band under it — `ISignetFace` |\n\nThe section is a live view over the ring's stored parameters: its getters read the current values and every setter regenerates the ring in place (same Guid).","metadata":{"title":"ISignetRing","url":"https://www.rhinoartisan.com/docs/scripting/handles/isignetring/","source":"https://www.rhinoartisan.com/docs/scripting/handles/isignetring/","collection":"scripting","hash":"f79c60d91debb4c6ff0c364dcb7defc5","indexed_by":"docs-index"}},{"content":"ISignetRing — The face (ISignetFace)\n\nShared with `IAdvancedSignetRing` — both rings store the same face model.\n\n| Member | Meaning |\n|---|---|\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `Width` / `Height` | Face size, mm |\n| `HeightPosition` | How high the face sits over the finger, mm |\n| `Rotation` | degrees (signed) |\n| `Tangent` | Tangency of the transition into the band |\n| `ShapeMode` | `\"Circle\"` or `\"Custom\"` |\n| `WidthBottomProfile` / `HeightBottomProfile` | Band section at the bottom, mm |\n| `WidthMiddleProfile` / `HeightMiddleProfile` | Band section at the middle, mm |\n| `Recess` | Hollow the back of the face |\n| `Thickness` / `InnerHeight` | mm — used when `Recess` is on |\n| `SetProfile(assetName)` | RING_PROFILE asset by name |\n| `SetWidth` / `SetHeight` / `SetHeightPosition` / `SetRotation` / `SetTangent` | The face |\n| `SetShapeMode` | `\"Circle\"` or `\"Custom\"` |\n| `SetBottomProfile(width, height)` / `SetMiddleProfile(width, height)` | Band sections, in one call each |\n| `SetRecess` / `SetThickness` / `SetInnerHeight` | The recess |\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"ISignetRing","section":"The face (ISignetFace)","url":"https://www.rhinoartisan.com/docs/scripting/handles/isignetring/#the-face-isignetface","source":"https://www.rhinoartisan.com/docs/scripting/handles/isignetring/#the-face-isignetface","collection":"scripting","hash":"cd51a130aa8b3fcb6021ca407bc32b90","indexed_by":"docs-index"}},{"content":"ISplitShank\n\nReturned by `SplitShankApi` - a cathedral-style band that opens into two arms toward the setting. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | Ring size |\n| `Curve` | The rail the band is swept along - `ISplitShankCurve` |\n| `Sections` | The three swept profiles in rail order - `ISplitShankSection` each |\n| `Gems` | The pave run along the arms - `ISplitShankGems` |\n| `SetSection(index, position, width, height, type=None, profileName=None)` | Edits one section in place |\n| `SetSectionEnabled(index, enabled)` | Toggles one section |\n\nEvery setter regenerates the shank in place (same Guid).","metadata":{"title":"ISplitShank","url":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/","source":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/","collection":"scripting","hash":"d17ebd45e4347865855188aed5c7176f","indexed_by":"docs-index"}},{"content":"ISplitShank — The rail (ISplitShankCurve)\n\n| Member | Meaning |\n|---|---|\n| `ArmHeight` | Rise of the arm tips above the ring top, mm |\n| `ArmAngle` | degrees |\n| `ArmOffset` | Extra outward bulge beyond the reference shape, mm (signed) |\n| `Tangent` / `TopTangency` | Tangency controls |\n| `OpeningLength` | mm |\n| `SplitWidth` | Separation between the front and back arm pairs, mm |\n| `SplitStart` | Where along the rail the split begins, `0`..`1` |\n| `LateralDisplacement` | Y displacement of the arm tips, mm (signed) |\n| `LateralInclination` | Inclination of the arms along the finger axis, degrees (signed) |\n| `SetArmHeight`, `SetArmAngle`, `SetArmOffset`, `SetTangent`, `SetTopTangency` | The arms |\n| `SetOpeningLength`, `SetSplitWidth`, `SetSplitStart` | The split |\n| `SetLateralDisplacement`, `SetLateralInclination` | The lateral shape |","metadata":{"title":"ISplitShank","section":"The rail (ISplitShankCurve)","url":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#the-rail-isplitshankcurve","source":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#the-rail-isplitshankcurve","collection":"scripting","hash":"09bd429d71d6b3b7f70856aed609e784","indexed_by":"docs-index"}},{"content":"ISplitShank — A section (ISplitShankSection)\n\nRead-only values; edit them through `SetSection` on the handle. The list is ordered bottom (`Position` 0) to arm tip (`Position` 1), and a split shank always keeps exactly three.\n\n| Member | Meaning |\n|---|---|\n| `Position` | T along the rail: `0` = ring bottom, `1` = arm tip |\n| `Enabled` | Whether the section is swept |\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `Type` | `\"SOLID\"`, `\"COMFORT\"` or `\"THICKNESS\"` |\n| `Width` / `Height` / `Thickness` / `Comfort` | Section dimensions, mm |\n| `Rotation` / `Displacement` / `Orientation` | Profile placement |","metadata":{"title":"ISplitShank","section":"A section (ISplitShankSection)","url":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#a-section-isplitshanksection","source":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#a-section-isplitshanksection","collection":"scripting","hash":"ce1250548a09c4c0751c355854f20b77","indexed_by":"docs-index"}},{"content":"ISplitShank — The pave run (ISplitShankGems)\n\n| Member | Meaning |\n|---|---|\n| `Enabled` / `Shape` | Whether the run is built, and the stone shape |\n| `TopSize` / `BottomSize` | Stone size at the arm tip and at the ring bottom, mm |\n| `ShankSize` / `TransitionSize` | mm |\n| `ArmSpacing` / `ShankSpacing` / `MinDistance` | Spacing per zone, mm |\n| `Angle` / `Margin` / `InnerMargin` / `Vertical` / `MoveInZ` / `GemInside` | Placement |\n| `InnerWidth` / `InnerHeight` / `BrightCut` | Channel, mm |\n| `ProngType` / `ProngHeight` / `ProngDiameter` / `AutomaticProngDiameter` | Prongs |\n| `DrillType` | `\"NONE\"`, `\"ROUND\"` or `\"QUAD\"` |\n| `ChannelShape` / `ChannelClearance` | The channel the stones sit in |\n| `FlipStart` / `FlipEnd` / `VCutters` | Run ends and V-cutters |\n| `StartOffset` / `EndOffset` | mm |\n| `SetSizes(topSize, bottomSize)`, `SetSpacing(armSpacing, shankSpacing)`, `SetOffsets(start, end)` | Paired setters |\n| Plus one setter per remaining member | |","metadata":{"title":"ISplitShank","section":"The pave run (ISplitShankGems)","url":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#the-pave-run-isplitshankgems","source":"https://www.rhinoartisan.com/docs/scripting/handles/isplitshank/#the-pave-run-isplitshankgems","collection":"scripting","hash":"7a210edf2c2000e19aa2ada6d37f477d","indexed_by":"docs-index"}},{"content":"ITrellisGemset\n\nReturned by `TrellisGemsetApi` — the trellis setting: crossing prongs (the trellis \"X\") descending from the gem girdle to the ring curve. Read-only — no setters. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ProngsDiameter` | Diameter of the crossing prongs, mm |\n| `OpeningAngle` | Opening angle of the trellis \"X\", degrees |\n| `CurveVerticalSeparation` | Vertical gap between the gem girdle plane and the top of the auto-generated default ring curve — only meaningful when no ring curve was selected |\n| `UpperRailEnabled` | Whether the upper rail wrapping the gem under the girdle is present |\n| `RingCurveId` | Rhino id of the ring curve the trellis was built on, or `Guid.Empty` when the auto-generated default curve under the gem was used |","metadata":{"title":"ITrellisGemset","url":"https://www.rhinoartisan.com/docs/scripting/handles/itrellisgemset/","source":"https://www.rhinoartisan.com/docs/scripting/handles/itrellisgemset/","collection":"scripting","hash":"d8a1bffd4d1cda13f2545b654319182e","indexed_by":"docs-index"}},{"content":"ITulip\n\nReturned by `TulipApi` — the tulip setting: petal prongs holding one center gem. Adds to `IGemSetting`:\n\n| Member | Meaning |\n|---|---|\n| `ProngCount` | Petal prong count — 4 or 6 |\n| `PipeDiameter` | Prong pipe diameter, mm |\n| `Height` | Vertical scale factor (not mm) |\n| `Mode` | `\"Round\"` or `\"Claw\"` |\n| `Ornament` | `\"None\"`, `\"Union\"` or `\"Leaf\"` |\n| `SetPipeDiameter(pipeDiameter)` | Pipe diameter, mm |\n| `SetHeight(height)` | Vertical scale factor, `> 0` |\n\nEach setter regenerates the tulip: the group keeps its id, the member objects are rebuilt.\n\n`Height` is the one dimension on this page that is not millimetres — it is a vertical scale factor, both as a getter and in `SetHeight`.","metadata":{"title":"ITulip","url":"https://www.rhinoartisan.com/docs/scripting/handles/itulip/","source":"https://www.rhinoartisan.com/docs/scripting/handles/itulip/","collection":"scripting","hash":"8a0443e26d6f6993358168e4655ae2eb","indexed_by":"docs-index"}},{"content":"ITwoRowsShank\n\nReturned by `TwoRowsShankApi` - a classic band with a channel carved on each face, carrying two parallel rows of stones. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | Ring size |\n| `TopProfile` / `MidProfile` / `BottomProfile` | The band sections - `IClassicProfile` each |\n| `ExternalProfile` | The outside-face profile - `IClassicExternalProfile` |\n| `Advanced` | The band opening - `IClassicAdvanced` |\n| `Rail` | The channel - `ITwoRowsRail` |\n| `Prong` | The prong cross-section - `ITwoRowsProng` |\n| `Gems` | The stones on the rails - `IClassicGems` |\n| `GemsEnabled` / `SetGemsEnabled` | Master toggle for the stones |\n| `CuttersEnabled` / `SetCuttersEnabled` | Whether the gem drill cutters are built |\n\nThe band reuses the classic sections outright, so anything you know from `IClassic` applies here. Every setter regenerates the shank in place, re-baking stones, prongs and cutters.","metadata":{"title":"ITwoRowsShank","url":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/","source":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/","collection":"scripting","hash":"55c8fd1fe7f76a188c38e6a17c2e85e6","indexed_by":"docs-index"}},{"content":"ITwoRowsShank — The channel (ITwoRowsRail)\n\n| Member | Meaning |\n|---|---|\n| `LayoutMode` | `\"FULL\"`, `\"SIDE_ANGLE\"` or `\"TOP_ANGLE\"` |\n| `StartAngle` / `EndAngle` | Degrees - used with `\"SIDE_ANGLE\"` |\n| `TopAngle` | Total arc in degrees - used with `\"TOP_ANGLE\"` |\n| `Width` | Span of the channel along the face, mm |\n| `Offset` | Depth carved into the band, mm |\n| `FitTolerance` / `Rotation` | mm / degrees |\n| `RailMode` | `\"DOUBLE\"` (one cutter per row) or `\"SINGLE\"` (one wider cutter) |\n| `CutOrientation` | `\"ANGLED\"` (follows the face) or `\"HORIZONTAL\"`; single mode is always horizontal |\n| `CentralWall` | Metal left between the two rows in double mode, mm |\n| `OuterBorder` | Single mode: metal rim on each side of the band, mm |\n| `RowSpacing` | Gap between the two gem rows, mm |\n| `EndMargin` | Gap between the channel end and the first/last gem, mm |\n| `SetLayoutMode`, `SetSideAngles(start, end)`, `SetTopAngle` | Where the channel runs |\n| `SetWidth`, `SetOffset`, `SetFitTolerance`, `SetRotation` | The channel section |\n| `SetRailMode`, `SetCutOrientation` | How it is cut |\n| `SetCentralWall`, `SetOuterBorder`, `SetRowSpacing`, `SetEndMargin` | The metal around the rows |\n\n`Width` and `Offset` are the tool's labels. In the stored model they are `RailDepth` and `RailHeight` - the API uses the names you see in the panel.","metadata":{"title":"ITwoRowsShank","section":"The channel (ITwoRowsRail)","url":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/#the-channel-itworowsrail","source":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/#the-channel-itworowsrail","collection":"scripting","hash":"341b0e1d11ae2bb80fe2964cd499eebe","indexed_by":"docs-index"}},{"content":"ITwoRowsShank — Prongs (ITwoRowsProng)\n\n| Member | Meaning |\n|---|---|\n| `ExternalDiameter` / `InternalDiameter` | mm |\n| `Distance` | mm |\n| `EndProngCount` | Prongs added at each end of a row |\n| `SetExternalDiameter`, `SetInternalDiameter`, `SetDistance`, `SetEndProngCount` | |","metadata":{"title":"ITwoRowsShank","section":"Prongs (ITwoRowsProng)","url":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/#prongs-itworowsprong","source":"https://www.rhinoartisan.com/docs/scripting/handles/itworowsshank/#prongs-itworowsprong","collection":"scripting","hash":"69493b32b19895567f03f61463bfcc54","indexed_by":"docs-index"}},{"content":"IWedding\n\nReturned by `WeddingApi` — a wedding set: two rings baked together as one group. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `Region` | Sizing region of the set, `\"\"` when unset |\n| `FirstRing` | The first ring — `IWeddingRing` |\n| `SecondRing` | The second ring — `IWeddingRing` |\n\nBoth rings are live views over the set's stored parameters: their getters read the current values and every setter regenerates the whole set in place (same Guid), re-baking both bands, their stones and their prongs.\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingApi as wedding, Transaction\n\npair = wedding.All()[0]\nwith Transaction.Begin(\"Hers in rose gold with a half row\"):\n    pair.SecondRing.SetMetal(\"GOLD_ROSE_18\")\n    pair.SecondRing.Gems.SetEnabled(True)\n    pair.SecondRing.Gems.SetDistribution(\"Half\")\n```","metadata":{"title":"IWedding","url":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/","collection":"scripting","hash":"3eb3fe3cef7223c4bc090de7ad198305","indexed_by":"docs-index"}},{"content":"IWedding — One ring (IWeddingRing)\n\nThe same section backs `IWeddingBand`.\n\n| Member | Meaning |\n|---|---|\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | This ring's size |\n| `Metal` | e.g. `\"GOLD_YELLOW_18\"` |\n| `Profile` | The band section — `IWeddingProfile` |\n| `Gems` | The stones — `IWeddingGems` |\n| `SetMetal(metal)` | By name, e.g. `\"PLATINUM\"` |","metadata":{"title":"IWedding","section":"One ring (IWeddingRing)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/#one-ring-iweddingring","source":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/#one-ring-iweddingring","collection":"scripting","hash":"fc7e7f48c81a9b0efc8c1151fb7007ce","indexed_by":"docs-index"}},{"content":"IWedding — The band (IWeddingProfile)\n\n| Member | Meaning |\n|---|---|\n| `ProfileName` | RING_PROFILE asset name, `\"\"` when unset |\n| `Width` / `Height` | Band section, mm |\n| `SetProfile(assetName)` / `SetWidth` / `SetHeight` | |\n\nThe stones (IWeddingGems)\n| Member | Meaning |\n|---|---|\n| `Enabled` | Whether stones are built |\n| `Shape` | `\"Round\"` or `\"Princess\"` |\n| `Distribution` | `\"Full\"`, `\"Half\"`, `\"Onequarter\"` or `\"Custom\"` |\n| `CustomDistance` | `\"Continuous\"` or `\"Equidistant\"` |\n| `NumberOfGems` | Used with the `\"Custom\"` distribution |\n| `GemSize` / `MinDistance` / `Vertical` / `GemInside` | Placement, mm |\n| `InnerWidth` / `InnerHeight` | Inner channel, mm |\n| `ProngType` | `\"None\"`, `\"Shared\"` or `\"Channel\"` |\n| `ProngHeight` / `ProngMoveInZ` / `ProngDiameter` | mm |\n| `AutomaticProngDiameter` | |\n| `ExtensionManufacturing` | mm |\n| `DrillType` / `DrillWidth` / `DrillHeight` | Drills — type is `\"NONE\"`, `\"ROUND\"` or `\"QUAD\"` |\n| `SetEnabled`, `SetShape`, `SetDistribution`, `SetCustomDistance`, `SetNumberOfGems` | The row |\n| `SetGemSize`, `SetMinDistance`, `SetVertical`, `SetGemInside`, `SetInnerWidth`, `SetInnerHeight` | Placement |\n| `SetProngType`, `SetProngHeight`, `SetProngMoveInZ`, `SetProngDiameter`, `SetAutomaticProngDiameter` | Prongs |\n| `SetExtensionManufacturing`, `SetDrillType`, `SetDrillWidth`, `SetDrillHeight` | |\n\nString parameters are case-insensitive and tolerate dashes/spaces; an unknown value raises a clear error listing the valid ones.","metadata":{"title":"IWedding","section":"The band (IWeddingProfile)","url":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/#the-band-iweddingprofile","source":"https://www.rhinoartisan.com/docs/scripting/handles/iwedding/#the-band-iweddingprofile","collection":"scripting","hash":"0d6fa36b067cff58414e68b36bfc2d01","indexed_by":"docs-index"}},{"content":"IWeddingBand\n\nReturned by `WeddingBandApi` — a single wedding band, the one-ring counterpart of the wedding set. Multiple gems, so no single mother gem. Adds to `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `Region` | Sizing region, `\"\"` when unset |\n| `Ring` | The band itself — `IWeddingRing`, the same section a wedding set uses for each of its two rings |\n\nThe section is a live view over the band's stored parameters: its getters read the current values and every setter regenerates the band in place (same Guid), re-baking its stones and prongs.\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingBandApi as band, Transaction\n\nb = band.All()[0]\nwith Transaction.Begin(\"Wider band, no stones\"):\n    b.Ring.Profile.SetWidth(4.0)\n    b.Ring.Gems.SetEnabled(False)\n```","metadata":{"title":"IWeddingBand","url":"https://www.rhinoartisan.com/docs/scripting/handles/iweddingband/","source":"https://www.rhinoartisan.com/docs/scripting/handles/iweddingband/","collection":"scripting","hash":"4d370d77965c8cdc6054ea116b5fda9f","indexed_by":"docs-index"}},{"content":"Python package\n\n`import rhinoartisan as ra` — API 0.9.0, shipped with RhinoArtisan 7.0.0.10 for Rhino 8+ (Python 3). The plugin installs the package into Rhino's scripts folder, so the import needs no setup in the ScriptEditor, RhinoCode, Flow Studio or MCP.\n\n```python\n#! python 3\nimport rhinoartisan as ra\n\nwith ra.transaction(\"Solitaire 1 ct\"):\n    ring = ra.classic.create(width=2.5)\n    gem = ra.gems.create(\"round\", \"diamond\", 1.0, (0, 0, ring.ring_diameter_mm / 2 + 1))\n    ra.peghead.create(gem, prongs=6)\nprint(f\"{ra.weight.calculate()[0].grams:.2f} g\")\n```\n\nConventions: optional arguments default to `None` (the tool default); ids are strings and any handle, string or Rhino object id works where an id is expected; points and vectors are `(x, y, z)` tuples; a plane is a point (normal +Z), an `(origin, normal)` pair or a Rhino `Plane`; millimetres everywhere. Handles expose properties — assigning a settable one regenerates the object — plus `update(**kwargs)`, `parameters()`, `id` and `delete()`. See Errors and Results.","metadata":{"title":"Python package","url":"https://www.rhinoartisan.com/docs/scripting/python/","source":"https://www.rhinoartisan.com/docs/scripting/python/","collection":"scripting","hash":"4b357715aa4a996bc531e93b1af44488","indexed_by":"docs-index"}},{"content":"Python package — Gems\n\n| Module | |\n|---|---|\n| `ra.advanced_gems_on_curve` | Runs of stones along a curve with per-stone sizes, shapes and rotations. |\n| `ra.gems` | Create, query and edit stones: shapes, materials, carats, placement, copies, collisions. |\n| `ra.gem_orientation` | Fix the orientation plane of stones without moving them. |\n| `ra.gem_size` | Stones by millimetre size instead of carats. |\n| `ra.gem_tools` | Utilities over existing stones: centers, tags, alignment, curves from gems, copy by gems, colors by size. |\n| `ra.gems_by_network` | Stones over a network of intersecting curves, sized to meet at the nodes. |\n| `ra.gems_from_circle` | Turn circles into round stones of the matching size. |\n| `ra.gems_on_two_curves` | Stones fitted between two rails, sized to the gap. |\n| `ra.gems_on_curve` | A run of stones along one curve, with prongs and cutters, editable afterwards. |\n| `ra.tapered_baguettes` | Tapered baguettes between two curves. |\n| `ra.three_stones` | The classic three-stone layout. |\n| `ra.toi_et_moi` | Two stones facing each other. |\n| `ra.trilogy` | Three-stone families: trellis, halo, individual, bezel set, east-west. |","metadata":{"title":"Python package","section":"Gems","url":"https://www.rhinoartisan.com/docs/scripting/python/#gems","source":"https://www.rhinoartisan.com/docs/scripting/python/#gems","collection":"scripting","hash":"925ae419686c1842c5285a2cfe636874","indexed_by":"docs-index"}},{"content":"Python package — Settings\n\n| Module | |\n|---|---|\n| `ra.advanced_basket` | Baskets with independent prong and rail profiles. |\n| `ra.advanced_bezel` | Bezels with a custom profile. |\n| `ra.basket` | Basket settings: prongs, upper and base rails. |\n| `ra.bezel` | Bezel settings with support, cutter and air-gap sections. |\n| `ra.cabochon` | Cabochon stones and their settings. |\n| `ra.channel` | Channel settings along a curve. |\n| `ra.cluster` | Cluster settings around a centre stone. |\n| `ra.cutter` | The cutters that carve the seat of a stone into the metal. |\n| `ra.halo` | A halo of small stones around a centre stone. |\n| `ra.hidden_halo` | A hidden halo under the centre stone. |\n| `ra.martini` | Martini settings. |\n| `ra.micro_setting` | Micro settings (micro-pave heads). |\n| `ra.pearl` | Pearls and their cups. |\n| `ra.peghead` | Peghead seats under a stone: prongs, height, thickness. |\n| `ra.trellis_gemset` | Trellis settings. |\n| `ra.tulip` | Tulip settings. |","metadata":{"title":"Python package","section":"Settings","url":"https://www.rhinoartisan.com/docs/scripting/python/#settings","source":"https://www.rhinoartisan.com/docs/scripting/python/#settings","collection":"scripting","hash":"b7fbd98cb09835789dadb77f0d7c23c5","indexed_by":"docs-index"}},{"content":"Python package — Shanks and rings\n\n| Module | |\n|---|---|\n| `ra.advanced_cathedral` | Cathedral shanks with station-by-station control. |\n| `ra.advanced_ring` | Rings built from positioned sections along the finger curve. |\n| `ra.advanced_signet_ring` | Signet rings with independent top and side profiles. |\n| `ra.bypass` | Bypass shanks whose arms cross past each other. |\n| `ra.cathedral` | Cathedral shanks: arms rising toward the setting. |\n| `ra.class_ring` | Class rings. |\n| `ra.classic` | Classic ring shanks: comfort-fit bands at the document finger size, optionally with a stone row. |\n| `ra.eternity` | Eternity bands with stones all around. |\n| `ra.graduated` | Graduated shanks: a run of stones shrinking away from the centre. |\n| `ra.matching_shank` | Matching shanks fitted against an engagement ring. |\n| `ra.pave_shank` | Pave shanks: rows of stones along the band. |\n| `ra.ring_curve` | Ring rail curves at the document finger size (closed, open, bypass, shaped). |\n| `ra.ring_extrude` | Rings extruded from a frontal profile. |\n| `ra.ring_tools` | Utilities on ring geometry: cut by ring size, estimate size, rail helpers. |\n| `ra.scoop_ring` | Scoop rings. |\n| `ra.signet_ring` | Signet rings with a shaped top face. |\n| `ra.split_shank` | Split shanks. |\n| `ra.two_rows_shank` | Two-row shanks. |\n| `ra.wedding` | Wedding sets (band pairs) built as one editable object. |\n| `ra.wedding_band` | Single wedding bands. |","metadata":{"title":"Python package","section":"Shanks and rings","url":"https://www.rhinoartisan.com/docs/scripting/python/#shanks-and-rings","source":"https://www.rhinoartisan.com/docs/scripting/python/#shanks-and-rings","collection":"scripting","hash":"a0ff2398ed5577d6052f97d2799d8984","indexed_by":"docs-index"}},{"content":"Python package — Pave and prongs\n\n| Module | |\n|---|---|\n| `ra.automatic_pave` | Relaxed multi-size pave fill with symmetry. |\n| `ra.azure` | Azure cutters under a pave: the openwork underneath. |\n| `ra.pave_along_surface` | Pave rows following a surface direction. |\n| `ra.pave` | Automatic pave over surfaces: one size in a regular grid, with prongs and cutters. |\n| `ra.prong` | Prongs: dynamic (between stones), automatic, custom and axis-aligned. |","metadata":{"title":"Python package","section":"Pave and prongs","url":"https://www.rhinoartisan.com/docs/scripting/python/#pave-and-prongs","source":"https://www.rhinoartisan.com/docs/scripting/python/#pave-and-prongs","collection":"scripting","hash":"296ce3e0e35c992d4cfb9c2cd23c325f","indexed_by":"docs-index"}},{"content":"Python package — Components\n\n| Module | |\n|---|---|\n| `ra.bail` | Pendant bails. |\n| `ra.bangle` | Bangles. |\n| `ra.bead` | Beads. |\n| `ra.chain` | Chains along a curve. |\n| `ra.charm` | Charms. |\n| `ra.engraving` | Ring engravings. |\n| `ra.hinge` | Hinges. |\n| `ra.honeycomb` | Honeycomb patterns over surfaces. |\n| `ra.huggie` | Huggie earrings. |\n| `ra.link` | Chain links. |\n| `ra.milgrain` | Milgrain beading along curves. |\n| `ra.named_pendant` | Name pendants from text. |\n| `ra.pattern` | Repeated patterns over surfaces. |\n| `ra.profile_sweep` | Sweeps of a profile along rails. |\n| `ra.rope` | Rope twists. |\n| `ra.smart_component` | Edit bails, named pendants, bangles, beads, charms, links, milgrain, ropes, 3D textures and ring engravings after creation (their model as JSON). |\n| `ra.text_on_curve` | Text laid along a curve. |\n| `ra.texture_3d` | 3D textures applied to surfaces. |\n| `ra.user_element` | User-defined elements. |\n| `ra.voronoi` | Voronoi patterns over surfaces. |","metadata":{"title":"Python package","section":"Components","url":"https://www.rhinoartisan.com/docs/scripting/python/#components","source":"https://www.rhinoartisan.com/docs/scripting/python/#components","collection":"scripting","hash":"7af11ca41738e9404fff1acacc00c52c","indexed_by":"docs-index"}},{"content":"Python package — Solids, curves and transforms\n\n| Module | |\n|---|---|\n| `ra.boolean` | Artisan booleans that keep the pieces editable: union, difference, intersection, split, update. |\n| `ra.curve` | Curve helpers for jewelry layouts. |\n| `ra.mesh` | Mesh decimation. |\n| `ra.raster_to_vector` | Trace an image into curves. |\n| `ra.relations` | Parent/child relations between parametric objects. |\n| `ra.relief` | 2.5D reliefs: creators, the operation stack, sculpt/smooth by points, bake, heightmaps. |\n| `ra.smart_profile` | Smart Profiles: profile sections swept along a curve, varying along the way. |\n| `ra.solid` | Solid modelling helpers: caps, shells, sweeps, offsets. |\n| `ra.transform` | Move, rotate, scale, mirror, arrays, deformations (bend, twist, taper), flow, placement on objects. |","metadata":{"title":"Python package","section":"Solids, curves and transforms","url":"https://www.rhinoartisan.com/docs/scripting/python/#solids-curves-and-transforms","source":"https://www.rhinoartisan.com/docs/scripting/python/#solids-curves-and-transforms","collection":"scripting","hash":"ab0f73e441a725b31d79c5994b9deba6","indexed_by":"docs-index"}},{"content":"Python package — Analysis and pricing\n\n| Module | |\n|---|---|\n| `ra.analyze` | Wall thickness: at points and globally. |\n| `ra.pricing` | Prices and cost breakdowns, markup and taxes profiles. |\n| `ra.weight` | Metal weights: per layer, per selection, by area. |\n\nProduction\n| Module | |\n|---|---|\n| `ra.files` | File utilities: standardize, elements import/export, layer exports. |\n| `ra.manufacturing` | Production: repair, printability checks, identifiers, sprues, resizing, exports. |","metadata":{"title":"Python package","section":"Analysis and pricing","url":"https://www.rhinoartisan.com/docs/scripting/python/#analysis-and-pricing","source":"https://www.rhinoartisan.com/docs/scripting/python/#analysis-and-pricing","collection":"scripting","hash":"95f208ad7daf83863317100547fd8533","indexed_by":"docs-index"}},{"content":"Python package — Drafting\n\n| Module | |\n|---|---|\n| `ra.drafting` | Reports, gems maps, cost tables, dimensions. |\n\nRender and views\n| Module | |\n|---|---|\n| `ra.realtime_render` | The web Realtime Render viewer: open, update, camera, materials, screenshots. |\n| `ra.render` | Render materials, staging and batch rendering. |\n| `ra.render_studio` | Render Studio: environments, materials, stills and turntables. |\n| `ra.view` | Viewport cameras, display modes, named views and captures. |","metadata":{"title":"Python package","section":"Drafting","url":"https://www.rhinoartisan.com/docs/scripting/python/#drafting","source":"https://www.rhinoartisan.com/docs/scripting/python/#drafting","collection":"scripting","hash":"088dfae7f62fe562851da1ede934e9fc","indexed_by":"docs-index"}},{"content":"Python package — Document and library\n\n| Module | |\n|---|---|\n| `ra.assets` | The profile library the parametric tools build from. |\n| `ra.document` | The document: open/save/new, computation mode, metals, ring size, STL/PDF/GLB exports. |\n| `ra.elements` | Saved element presets: build from them, apply them, save objects as new ones, organize the library. |\n| `ra.panels` | The open Artisan command panel: which one it is, and closing it without applying. |\n| `ra.semantics` | Semantic descriptions of the design. |","metadata":{"title":"Python package","section":"Document and library","url":"https://www.rhinoartisan.com/docs/scripting/python/#document-and-library","source":"https://www.rhinoartisan.com/docs/scripting/python/#document-and-library","collection":"scripting","hash":"a8f6118e68386aa2c11c44b4b73e269c","indexed_by":"docs-index"}},{"content":"Python package — Integrations\n\n| Module | |\n|---|---|\n| `ra.file_search` | Instant search over indexed design files. |\n| `ra.nivoda` | Nivoda certified-diamond search. |\n\nOther\n| Module | |\n|---|---|\n| `ra.ai_image` | AI images with fal.ai, the engine of Generative AI Studio and of the Assistant's generate_image: a photoreal render of the viewport, an edit of an image file, or an image from a prompt alone. |\n| `ra.boutique` | The Boutique: ready-made designs (solitaires, trilogies, halos, bands, earrings...) grouped in collections that are downloaded from the RhinoArtisan catalog to this computer and imported into the document like the Boutique window does. |\n| `ra.time_tracking` | The time tracker's records (the ArtisanTimeTracker panel), read-only: how long each saved file has been worked on, per day. |","metadata":{"title":"Python package","section":"Integrations","url":"https://www.rhinoartisan.com/docs/scripting/python/#integrations","source":"https://www.rhinoartisan.com/docs/scripting/python/#integrations","collection":"scripting","hash":"48184018501e5fdd4808dc957f456e56","indexed_by":"docs-index"}},{"content":"Advanced Basket\n\nBaskets with independent prong and rail profiles.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedBasketApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedBasket` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedBasket` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds an advanced basket setting under an existing gem -- the ArtisanAdvancedBasket tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `AdvancedBasket` handles whose mother gem is `gem_id` (empty for None). |\n| `presets()` | The prong layouts the tool ships for a gem shape, by name -- the same list the panel draws as its preset row. |\n| `selected()` | Advanced baskets currently selected in the active doc. |","metadata":{"title":"Advanced Basket","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/","collection":"scripting","hash":"9330c8d3b370be5c3140f81573bd8297","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.all()\n\n```python\nra.advanced_basket.all() -> List[AdvancedBasket]\n```\n\n`AdvancedBasket` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedbasket.bylayer()\n```python\nra.advanced_basket.by_layer(layer_name: str) -> List[AdvancedBasket]\n```\n\n`AdvancedBasket` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketall","collection":"scripting","hash":"a45bc400a0a1e394ba5cc80714ba10d2","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.count()\n\n```python\nra.advanced_basket.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcount","collection":"scripting","hash":"3fa6d594f14741776fba8b3b02d5da37","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.create()\n\n```python\nra.advanced_basket.create(gem_ids=None, prongs=None, prong_mode=None, prong_diameter=None, prong_height=None, rails=None, rail_width=None, profile=None, preset=None, positions=None, element=None) -> List[AdvancedBasket]\n```","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","collection":"scripting","hash":"154b6f6f126e7e203d83a5dbb6200ec9","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.create()\n\nBuilds an advanced basket setting under an existing gem -- the ArtisanAdvancedBasket tool, headless. One basket (its own group) per gem; `gem_ids` None/empty = the currently selected gems. Unlike the basic Basket, the advanced basket is a free layout: a list of individually placed prongs plus a list of rails. This facade lays both out evenly, like the tool's presets. Millimetres; 0/None keeps the tool default (or the user's saved defaults): `prongs` 0 keeps the saved layout, or 4 prongs at the diagonals when there is none (the tool's \"4\" preset); a positive count places that many prongs evenly around the gem. `prong_mode` None = ROUND; also DOUBLE (the 2-2 presets), TRIPLE (3-3), CLAW, OFFSET or CUSTOM, applied to every prong (DEFAULT and CIRCLE also mean ROUND; claw tips are built in Render mode only and are tuned through the handle). `prong_diameter` 0 keeps 1.5 (sets top and bottom together), `prong_height` 0 keeps 4. `rails` None keeps the saved rails (a fresh basket has none); 0 = no rails, 1 = one rail 1 mm under the girdle, 2 adds a second at 3.66 (the tool's 1-rail / 2-rail presets; more keep the same spacing). `rail_width` 0 keeps 1.5, applied to every rail. `profile` names a CLOSED_PROFILE asset for the prongs (see ra.assets.list) and switches them to CUSTOM mode unless `prong_mode` says otherwise; None keeps each mode's built-in section. Returns one AdvancedBasket handle per gem, in input order. `element` = name of a saved AdvancedBasket element (ra.elements.list(\"AdvancedBasket\")) to start from instead of the defaults, re-seeded onto each gem; explicit arguments override it.","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","collection":"scripting","hash":"9082c2704ac09406031463d24abb394e","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `prongs` | `int` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `prong_height` | `float` | optional — None = the tool default |\n| `rails` | `Optional[int]` | optional — None = the tool default |\n| `rail_width` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `preset` | `str` | optional — None = the tool default |\n| `positions` | `Sequence[float]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketcreate","collection":"scripting","hash":"6f718cca631445f4daafd6a44cc47cf2","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.find()\n\n```python\nra.advanced_basket.find(id: IdLike) -> AdvancedBasket\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.advancedbasket.forgem()\n```python\nra.advanced_basket.for_gem(gem_id: IdLike) -> List[AdvancedBasket]\n```\n\n`AdvancedBasket` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketfind","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketfind","collection":"scripting","hash":"ef864af755ffb97a27691ed24b8102a8","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.presets()\n\n```python\nra.advanced_basket.presets(gem_id: IdLike) -> List[str]\n```\n\nThe prong layouts the tool ships for a gem shape, by name -- the same list the panel draws as its preset row. Pass one of these as Create's `preset`. Names look like \"4\", \"4-V\", \"2-2\", \"3-3\", \"6\", \"8\" or \"NONE\"; which ones exist depends on the shape (an emerald gets corner layouts, a marquise gets tip layouts...).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.presets()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketpresets","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketpresets","collection":"scripting","hash":"242ce7ba4c33f93c27b0f4ef790067cd","indexed_by":"docs-index"}},{"content":"Advanced Basket — ra.advancedbasket.selected()\n\n```python\nra.advanced_basket.selected() -> List[AdvancedBasket]\n```\n\nAdvanced baskets currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Advanced Basket","section":"ra.advancedbasket.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketselected","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#raadvancedbasketselected","collection":"scripting","hash":"53cba10cb0dce1ed08fb8a6926f88694","indexed_by":"docs-index"}},{"content":"Advanced Basket — AdvancedBasket (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `claw_cap_distance` | `float` | yes | The claw tips of CLAW prongs (built in Render mode only), first prong's values. mm the apex is pulled in toward the gem centre. |\n| `claw_cap_height` | `float` | yes | mm the apex moves up (+) or down (-) |\n| `claw_tip_smoothness` | `float` | yes | body-to-tip blend, 0-1 |\n| `claw_tip_width` | `float` | yes | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `parameters_json` | `str` | | Every value of every prong and rail, as the panel's per-prong and per-rail editors hold them: the model's JSON, whose paths GetParameter / SetParameter take. |\n| `position` | `Point3d` | | |\n| `prong_count` | `int` | yes | Unlike the basic Basket, the advanced basket stores one entry per prong/rail, each with its own settings. The scalar getters report the first prong's values (0 when there are none). |\n| `prong_diameter` | `float` | yes | |\n| `prong_height` | `float` | yes | |\n| `prong_mode` | `str` | yes | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\" \\| \"OFFSET\" \\| \"DOUBLE\" \\| \"TRIPLE\" when every prong shares it, \"MIXED\" when the prongs differ (the panel's per-prong editor), \"\" with no prongs. |\n| `rail_count` | `int` | yes | |","metadata":{"title":"Advanced Basket","section":"AdvancedBasket (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#advancedbasket-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#advancedbasket-handle","collection":"scripting","hash":"e2e5e690e912fec7e5be3d4f63ddae15","indexed_by":"docs-index"}},{"content":"Advanced Basket — AdvancedBasket (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `get_parameter(path: str) -> str` | One value by path: \"Prongs[0].Inclination\", \"rails[1].fillet_radius\" (case and underscores ignored); None for an unknown path. |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved AdvancedBasket element (ra.elements.list(\"AdvancedBasket\")) to this basket: its prongs and rails replace the current ones, re-seeded onto the mother gem (which stays) so the layout keeps its direction on this cut, and the basket regenerates in place (same id). |\n| `set_parameter(path: str, value: str)` | Sets one value by path, as text (\"0.4\", \"True\"); \"[*]\" sets it on every prong or rail (\"prongs[*].gem_inside\"). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Basket","section":"AdvancedBasket (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#advancedbasket-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-basket/#advancedbasket-handle","collection":"scripting","hash":"91ed7df28f388149a179b1f52d1f7928","indexed_by":"docs-index"}},{"content":"Advanced Bezel\n\nBezels with a custom profile.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedBezelApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedBezel` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedBezel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds an advanced bezel around an existing gem (`gem_id` must be a gem in the active document -- the bezel is a parametric child of that gem). |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `AdvancedBezel` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Advanced bezels currently selected in the active doc. |","metadata":{"title":"Advanced Bezel","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/","collection":"scripting","hash":"2ee4441cec40ed9a7c7fc310e5f58018","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.all()\n\n```python\nra.advanced_bezel.all() -> List[AdvancedBezel]\n```\n\n`AdvancedBezel` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedbezel.bylayer()\n```python\nra.advanced_bezel.by_layer(layer_name: str) -> List[AdvancedBezel]\n```\n\n`AdvancedBezel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelall","collection":"scripting","hash":"463162c34e105a1c87bf9d3f87e2eebd","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.count()\n\n```python\nra.advanced_bezel.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcount","collection":"scripting","hash":"103ab1b26e3f18cf91d63c35cfff7d1f","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.create()\n\n```python\nra.advanced_bezel.create(gem_id: IdLike, height=None, width=None, girdle_height=None, girdle_width=None, gem_inside=None, profile=None, element=None) -> AdvancedBezel\n```\n\nBuilds an advanced bezel around an existing gem (`gem_id` must be a gem in the active document -- the bezel is a parametric child of that gem). Same compute pipeline as the ArtisanAdvancedBezel tool, so the result is identical to accepting one from the panel. The wall cross-section comes from the model's point profile (the saved defaults' profile when the user stored one, the 6-point default otherwise); cutters and airgaps stay as the defaults configure them. All dimensional arguments are millimetres. Omit (None) to keep the tool's default -- or the user's saved defaults -- for that parameter (height 3.8, width 1.5, girdle height 0.3, girdle width 1.5, gem inside 0). `profile` picks a BEZEL_PROFILE asset from the library by name (see ra.assets.list(\"BEZEL_PROFILE\")); omitted = the default profile (an explicit profile also skips the saved defaults so it cannot be overwritten by them). `element` = name of a saved AdvancedBezel element (ra.elements.list(\"AdvancedBezel\")) to start from instead of the defaults; explicit arguments (profile included) override it. Throws ArgumentException if `gem_id` is not a gem and InvalidOperationException when the geometry fails to compute.","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcreate","collection":"scripting","hash":"72beba6fa61c46c7ec7d14c74607c88e","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `height` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `girdle_height` | `float` | optional — None = the tool default |\n| `girdle_width` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelcreate","collection":"scripting","hash":"b13ce888c6ed5a47e51a44265ff1308c","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.find()\n\n```python\nra.advanced_bezel.find(id: IdLike) -> AdvancedBezel\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.advancedbezel.forgem()\n```python\nra.advanced_bezel.for_gem(gem_id: IdLike) -> List[AdvancedBezel]\n```\n\n`AdvancedBezel` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelfind","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelfind","collection":"scripting","hash":"0399a645a88de68df7180dbcf67f74f7","indexed_by":"docs-index"}},{"content":"Advanced Bezel — ra.advancedbezel.selected()\n\n```python\nra.advanced_bezel.selected() -> List[AdvancedBezel]\n```\n\nAdvanced bezels currently selected in the active doc. Empty list if nothing is selected or the selection contains no advanced bezels.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Advanced Bezel","section":"ra.advancedbezel.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelselected","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#raadvancedbezelselected","collection":"scripting","hash":"295a53313ca8208bf7822ac071412978","indexed_by":"docs-index"}},{"content":"Advanced Bezel — AdvancedBezel (handle)\n\nAn advanced bezel wraps exactly one mother gem, like Bezel, but its wall is a freely editable point profile instead of a swept asset. The setters below recompute it against the current mother gem and replace it in place (same Guid); SetElement applies a saved preset.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `girdle_height` | `float` | yes | millimetres |\n| `girdle_width` | `float` | yes | millimetres |\n| `height` | `float` | yes | wall height, millimetres |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `width` | `float` | yes | wall width, millimetres |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved AdvancedBezel element (ra.elements.list(\"AdvancedBezel\")) to this bezel: its parameters replace the current ones, the mother gem stays, and the bezel is recomputed in place (same Guid). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Bezel","section":"AdvancedBezel (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#advancedbezel-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-bezel/#advancedbezel-handle","collection":"scripting","hash":"ae8545038a995363a303dda9b970747b","indexed_by":"docs-index"}},{"content":"Advanced Cathedral\n\nCathedral shanks with station-by-station control.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedCathedralApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedCathedral` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedCathedral` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds an advanced cathedral shank -- the ArtisanAdvancedCathedral tool, headless: the cathedral band with a fully parametric arm and bridge, plus an optional stone run. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `AdvancedCathedral` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Advanced Cathedral","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/","collection":"scripting","hash":"f300cf6aa8d6bd9bda9a7b7f1819017a","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — ra.advancedcathedral.all()\n\n```python\nra.advanced_cathedral.all() -> List[AdvancedCathedral]\n```\n\n`AdvancedCathedral` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedcathedral.bylayer()\n```python\nra.advanced_cathedral.by_layer(layer_name: str) -> List[AdvancedCathedral]\n```\n\n`AdvancedCathedral` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Cathedral","section":"ra.advancedcathedral.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralall","collection":"scripting","hash":"043ca03fbe53fdc23f0a3a6a9c2cfd28","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — ra.advancedcathedral.count()\n\n```python\nra.advanced_cathedral.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.advancedcathedral.create()\n```python\nra.advanced_cathedral.create(finger_diameter=None, arm_height=None, arm_opening=None, tip_inclination=None, bridge_width=None, bridge_thickness=None, with_gems=None, gem_size=None, profile=None, plane=None, element=None) -> AdvancedCathedral\n```\n\nBuilds an advanced cathedral shank -- the ArtisanAdvancedCathedral tool, headless: the cathedral band with a fully parametric arm and bridge, plus an optional stone run. Millimetres / degrees; omitting keeps the tool default (or the user's saved defaults). `finger_diameter` 0 = the document's finger size. `with_gems` turns the stone run on. `element` = name of a saved AdvancedCathedralShank element (ra.elements.list(\"AdvancedCathedralShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an AdvancedCathedral handle: its ~25 setters cover the rest of the model.\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `arm_height` | `float` | optional — None = the tool default |\n| `arm_opening` | `float` | optional — None = the tool default |\n| `tip_inclination` | `float` | optional — None = the tool default |\n| `bridge_width` | `float` | optional — None = the tool default |\n| `bridge_thickness` | `float` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Advanced Cathedral","section":"ra.advancedcathedral.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralcount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralcount","collection":"scripting","hash":"a704a627067eca7f93a1bcfb2d0dd989","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — ra.advancedcathedral.find()\n\n```python\nra.advanced_cathedral.find(id: IdLike) -> AdvancedCathedral\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.advancedcathedral.selected()\n```python\nra.advanced_cathedral.selected() -> List[AdvancedCathedral]\n```\n\n`AdvancedCathedral` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Advanced Cathedral","section":"ra.advancedcathedral.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralfind","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#raadvancedcathedralfind","collection":"scripting","hash":"c029d14345828fae496e4fd11875dac9","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nAdvancedCathedral (handle)\nAdvanced cathedral shank: like the classic cathedral, but the band's cross-section is defined by editable stations along the arm instead of a single fixed profile. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gem_gradient` | AdvancedCathedralGemGradient | | |\n| `gems` | CathedralGems | | The gems row uses the same model as the classic cathedral. |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `shank` | AdvancedCathedralShank | | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved AdvancedCathedralShank element (ra.elements.list(\"AdvancedCathedralShank\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Cathedral","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#handles","collection":"scripting","hash":"e00f961eed6b2244419b6f056eb72d3a","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — AdvancedCathedralGemGradient (section)\n\nHow stone size and prongs vary along the gem run.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `enabled` | `bool` | yes | |\n| `end_prong_count` | `int` | yes | |\n| `gem_size_end` | `float` | | mm |\n| `gem_size_middle` | `float` | | mm |\n| `gem_size_start` | `float` | | mm |\n| `middle_position` | `float` | yes | 0..1 |\n| `points` | `int` | yes | 2 = start/end, 3 = start/middle/end |\n| `prong_distance` | `float` | yes | mm |\n| `prong_grow` | `float` | yes | mm |\n| `prong_min_diameter` | `float` | yes | mm |\n| `prong_spacing` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_gem_sizes(start: float, middle: float, end: float)` | |","metadata":{"title":"Advanced Cathedral","section":"AdvancedCathedralGemGradient (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#advancedcathedralgemgradient-section","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#advancedcathedralgemgradient-section","collection":"scripting","hash":"690aa9ab0638f451fb66a120fd7f202b","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — CathedralGems (section)\n\nThe pavé row a cathedral carries along its top — one run per arm.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees of the band covered by gems (180 = top half) |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | bright-cut width, mm |\n| `double_prong_setting` | `bool` | yes | |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_enabled` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_visible` | `bool` | yes | bake the drill cutters as visible objects |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | how deep the gems sit inside, mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_margin` | `float` | yes | inner margin, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `margin` | `float` | yes | side margin, mm |\n| `min_distance` | `float` | yes | minimum distance between gems, mm |\n| `prong_diameter` | `float` | yes | mm — used when AutomaticProngDiameter is False |\n| `prong_height` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `scallop_gem_height` | `float` | | |\n| `scallop_gem_width` | `float` | | Scalloped-setting proportions (percentages, not mm). |\n| `scallop_prong_height` | `float` | | |\n| `scallop_prong_width` | `float` | | |\n| `scallop_rail_height` | `float` | | |\n| `scallop_rail_width` | `float` | | |\n| `scallop_remove_channel` | `bool` | yes | |\n| `vertical` | `float` | yes | vertical displacement of the row, mm |","metadata":{"title":"Advanced Cathedral","section":"CathedralGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#cathedralgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#cathedralgems-section","collection":"scripting","hash":"4b9ccda0d2ad0452eefb56f8f4a29aa0","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — CathedralGems (section)\n\n| Method | |\n|---|---|\n| `set_scallop_gem(width: float, height: float)` | |\n| `set_scallop_prong(width: float, height: float)` | |\n| `set_scallop_rail(width: float, height: float)` | |","metadata":{"title":"Advanced Cathedral","section":"CathedralGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#cathedralgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#cathedralgems-section","collection":"scripting","hash":"8b46b491d8e2abc16b491713f843dbde","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — AdvancedCathedralShank (section)\n\nThe band: the stations that shape it, the arm and the bridge.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `arm_height` | `float` | yes | mm |\n| `arm_opening` | `float` | yes | mm |\n| `bridge_angle` | `float` | yes | degrees |\n| `bridge_diameter` | `float` | yes | mm |\n| `bridge_enabled` | `bool` | yes | |\n| `bridge_fillet` | `float` | yes | mm |\n| `bridge_open_angle` | `float` | yes | degrees |\n| `bridge_thickness` | `float` | yes | mm |\n| `bridge_width` | `float` | yes | mm |\n| `shared_profile` | `bool` | yes | every station uses the same profile asset |\n| `stations` | `List[AdvancedCathedralStation]` | yes | |\n| `tangent_point` | `float` | yes | 1 = 90 degrees, 0 = 140, -1 = 190 |\n| `tip_inclination` | `float` | yes | |\n| `tip_round` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | applies to every station — list them with ra.assets.list(\"RING_PROFILE\") |\n| `set_station(index: int, position: float, width: float, height: float, profile_name=None)` | |","metadata":{"title":"Advanced Cathedral","section":"AdvancedCathedralShank (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#advancedcathedralshank-section","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-cathedral/#advancedcathedralshank-section","collection":"scripting","hash":"1ed8321bd419ae3304a9384c132dfb2e","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve\n\nRuns of stones along a curve with per-stone sizes, shapes and rotations.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedGemsOnCurveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Lays a PATTERN of gem groups along a curve -- the ArtisanAdvancedGemsOnCurve tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `AdvancedGemsOnCurve` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Advanced Gems On Curve","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/","collection":"scripting","hash":"23b5211b0f00f82576830b4ac0353894","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — ra.advancedgemsoncurve.all()\n\n```python\nra.advanced_gems_on_curve.all() -> List[AdvancedGemsOnCurve]\n```\n\n`AdvancedGemsOnCurve` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedgemsoncurve.bylayer()\n```python\nra.advanced_gems_on_curve.by_layer(layer_name: str) -> List[AdvancedGemsOnCurve]\n```\n\n`AdvancedGemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Gems On Curve","section":"ra.advancedgemsoncurve.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurveall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurveall","collection":"scripting","hash":"600dee797ca2cb00bedc351d7bb21093","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — ra.advancedgemsoncurve.count()\n\n```python\nra.advanced_gems_on_curve.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Advanced Gems On Curve","section":"ra.advancedgemsoncurve.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecount","collection":"scripting","hash":"40b17b79e19d3b2549e6021aa96f8596","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — ra.advancedgemsoncurve.create()\n\n```python\nra.advanced_gems_on_curve.create(curve_id: IdLike, sizes: Sequence[float], quantities=None, sizes2=None, shapes=None, rotations=None, distance=None, move_by_z=None, rotation_on_curve=None, alignment_on_curve=None, alignment_vertical=None, start_centered=None, upside_down=None, flip_curve=None, orientation_ids=None, t0=None, t1=None) -> AdvancedGemsOnCurveResult\n```\n\nLays a PATTERN of gem groups along a curve -- the ArtisanAdvancedGemsOnCurve tool, headless. Unlike GemsOnCurveApi (one size, one shape) each group i has `quantities[i]` gems graduating from `sizes[i]` to `sizes2[i]` mm (same size when omitted), of `shapes[i]` (default ROUND) rotated `rotations[i]` degrees; the groups run one after another from the curve start. Diamonds only (the tool has no material choice). Millimetres; omitting keeps the tool default (or the user's saved defaults): distance 0.2 between gems. `alignment_on_curve` START (default) / CENTER / END, `alignment_vertical` ON_GIRDLE (default) / TOP. `t0`/`t1` limit the run to a curve parameter range. Returns the group id plus the gem ids.","metadata":{"title":"Advanced Gems On Curve","section":"ra.advancedgemsoncurve.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecreate","collection":"scripting","hash":"4e8274573b82d109461b0193716bbb48","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — ra.advancedgemsoncurve.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `sizes` | `Sequence[float]` | required |\n| `quantities` | `Sequence[int]` | optional — None = the tool default |\n| `sizes2` | `Sequence[float]` | optional — None = the tool default |\n| `shapes` | `Sequence[str]` | optional — None = the tool default |\n| `rotations` | `Sequence[float]` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `move_by_z` | `float` | optional — None = the tool default |\n| `rotation_on_curve` | `float` | optional — None = the tool default |\n| `alignment_on_curve` | `str` | optional — None = the tool default |\n| `alignment_vertical` | `str` | optional — None = the tool default |\n| `start_centered` | `Optional[bool]` | optional — None = the tool default |\n| `upside_down` | `Optional[bool]` | optional — None = the tool default |\n| `flip_curve` | `bool` | optional — None = the tool default |\n| `orientation_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `t0` | `float` | optional — None = the tool default |\n| `t1` | `float` | optional — None = the tool default |","metadata":{"title":"Advanced Gems On Curve","section":"ra.advancedgemsoncurve.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvecreate","collection":"scripting","hash":"ddcd64c636b934e50d9427868352c6cb","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — ra.advancedgemsoncurve.find()\n\n```python\nra.advanced_gems_on_curve.find(id: IdLike) -> AdvancedGemsOnCurve\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.advancedgemsoncurve.selected()\n```python\nra.advanced_gems_on_curve.selected() -> List[AdvancedGemsOnCurve]\n```\n\n`AdvancedGemsOnCurve` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Advanced Gems On Curve","section":"ra.advancedgemsoncurve.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvefind","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#raadvancedgemsoncurvefind","collection":"scripting","hash":"7ef32869acfdf0841493b48324e78672","indexed_by":"docs-index"}},{"content":"Advanced Gems On Curve — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nAdvancedGemsOnCurve (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `curve_id` | `str` | | |\n| `layer_name` | `str` | | |\n| `member_count` | `int` | | Rhino objects in the group |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `parameters_json` | `str` | | the kernel model, as stored in the group |\n| `position` | `Point3d` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `get_parameter(path: str) -> str` | dotted JSON path; None when absent |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Gems On Curve","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-gems-on-curve/#handles","collection":"scripting","hash":"874c0b7717e104b733216f3f7950c207","indexed_by":"docs-index"}},{"content":"Advanced Ring\n\nRings built from positioned sections along the finger curve.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedRingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds an advanced ring body (the ArtisanAdvancedRing tool, headless): a ring curve swept through profile sections placed along it. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Advanced rings currently selected in the active doc. |","metadata":{"title":"Advanced Ring","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/","collection":"scripting","hash":"40df202229f97ddef3f9570d56b882ed","indexed_by":"docs-index"}},{"content":"Advanced Ring — ra.advancedring.all()\n\n```python\nra.advanced_ring.all() -> List[AdvancedRing]\n```\n\n`AdvancedRing` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedring.bylayer()\n```python\nra.advanced_ring.by_layer(layer_name: str) -> List[AdvancedRing]\n```\n\n`AdvancedRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Ring","section":"ra.advancedring.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringall","collection":"scripting","hash":"7201d46b98aaf6914353e442ec79a6ee","indexed_by":"docs-index"}},{"content":"Advanced Ring — ra.advancedring.count()\n\n```python\nra.advanced_ring.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Advanced Ring","section":"ra.advancedring.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcount","collection":"scripting","hash":"bf4d2f0d737680548310a6d2eade1ea7","indexed_by":"docs-index"}},{"content":"Advanced Ring — ra.advancedring.create()\n\n```python\nra.advanced_ring.create(positions=None, widths=None, heights=None, width=None, height=None, section_type=None, thickness=None, comfort=None, curve_type=None, opening_length=None, finger_diameter=None, profile=None, plane=None, element=None) -> AdvancedRing\n```\n\nBuilds an advanced ring body (the ArtisanAdvancedRing tool, headless): a ring curve swept through profile sections placed along it. Each section sits at a normalized position t in 0..1 along the curve (0 = bottom of the finger, 0.5 = top) and has its own width/height. `positions` omitted = the user's saved default sections, or two identical sections at t 0 and 0.5 (open curves: 0 and 1). `widths` / `heights` are per-section lists parallel to `positions`; `width` / `height` apply one value to every section (0 = section default 2.25 x 1.5 mm). `section_type` COMFORT (default) | SOLID | THICKNESS with `thickness` (0.7) and `comfort` (0.3). `curve_type` CLOSE (default) | OPEN | BYPASS | SHAPE, `opening_length` mm for the open types (5 / 14 / 14). `finger_diameter` 0 = document ring size. `profile` = RING_PROFILE asset name. `plane` omitted = world XY. `element` = name of a saved AdvancedRing element (ra.elements.list(\"AdvancedRing\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an AdvancedRing handle to the new ring body.","metadata":{"title":"Advanced Ring","section":"ra.advancedring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcreate","collection":"scripting","hash":"402f95d8ee4b325eaf98c2cd6f471750","indexed_by":"docs-index"}},{"content":"Advanced Ring — ra.advancedring.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `positions` | `Sequence[float]` | optional — None = the tool default |\n| `widths` | `Sequence[float]` | optional — None = the tool default |\n| `heights` | `Sequence[float]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `section_type` | `str` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `comfort` | `float` | optional — None = the tool default |\n| `curve_type` | `str` | optional — None = the tool default |\n| `opening_length` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Advanced Ring","section":"ra.advancedring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringcreate","collection":"scripting","hash":"a54a6a634c4244eb881298eab61b5e08","indexed_by":"docs-index"}},{"content":"Advanced Ring — ra.advancedring.find()\n\n```python\nra.advanced_ring.find(id: IdLike) -> AdvancedRing\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.advancedring.selected()\n```python\nra.advanced_ring.selected() -> List[AdvancedRing]\n```\n\nAdvanced rings currently selected in the active doc.","metadata":{"title":"Advanced Ring","section":"ra.advancedring.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringfind","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#raadvancedringfind","collection":"scripting","hash":"a6edf4ac8f992ee80d7c653a9607fd6f","indexed_by":"docs-index"}},{"content":"Advanced Ring — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Advanced Ring","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#handles","collection":"scripting","hash":"00835532906550bf2e38f1a82a7c4f43","indexed_by":"docs-index"}},{"content":"Advanced Ring — AdvancedRing (handle)\n\nAdvanced ring body (the ArtisanAdvancedRing tool): a ring curve (closed / open / bypass / shape) swept through N profile sections, each placed at a normalized position `t` along the curve (0 = bottom of the finger, 0.5 = top). No single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `curve_type` | `str` | yes | \"CLOSE\", \"OPEN\", \"BYPASS\" or \"SHAPE\". |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `section_count` | `int` | | |\n| `section_heights` | `List[float]` | | mm, same order |\n| `section_positions` | `List[float]` | | t of each section, sorted |\n| `section_widths` | `List[float]` | | mm, same order |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_all_sections(width: float, height: float)` | |\n| `set_element(element: str)` | Applies a saved AdvancedRing element (ra.elements.list(\"AdvancedRing\")) to this ring: its sections, curve and options replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n| `set_finger_diameter(finger_diameter: float)` | |\n| `set_height(height: float)` | every section |\n| `set_opening_length(opening_length: float)` | of the current open curve type |\n| `set_section(index: int, width=None, height=None)` | Mutations regenerate the ring in place (same Guid) and call LicenseGate.RequireValid() first. |\n| `set_section_position(index: int, t: float)` | |\n| `set_section_rotation(index: int, degrees: float)` | |\n| `set_width(width: float)` | every section |","metadata":{"title":"Advanced Ring","section":"AdvancedRing (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#advancedring-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#advancedring-handle","collection":"scripting","hash":"d9134e626b9c781c6304023b4561aee9","indexed_by":"docs-index"}},{"content":"Advanced Ring — AdvancedRing (handle)\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Ring","section":"AdvancedRing (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#advancedring-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-ring/#advancedring-handle","collection":"scripting","hash":"9afcf9e6d017d4bf70feebfd2d9bdc85","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring\n\nSignet rings with independent top and side profiles.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AdvancedSignetRingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `AdvancedSignetRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `AdvancedSignetRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `AdvancedSignetRing` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Advanced Signet Ring","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/","collection":"scripting","hash":"6449dd736aec30eb13f7284c51b57750","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — ra.advancedsignetring.all()\n\n```python\nra.advanced_signet_ring.all() -> List[AdvancedSignetRing]\n```\n\n`AdvancedSignetRing` handles for every object of this kind in the active document (empty when there is no document).\n\nra.advancedsignetring.bylayer()\n```python\nra.advanced_signet_ring.by_layer(layer_name: str) -> List[AdvancedSignetRing]\n```\n\n`AdvancedSignetRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Advanced Signet Ring","section":"ra.advancedsignetring.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringall","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringall","collection":"scripting","hash":"9a8fc61ce11935c26fb1563d139831de","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — ra.advancedsignetring.count()\n\n```python\nra.advanced_signet_ring.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.advancedsignetring.find()\n```python\nra.advanced_signet_ring.find(id: IdLike) -> AdvancedSignetRing\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Advanced Signet Ring","section":"ra.advancedsignetring.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringcount","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringcount","collection":"scripting","hash":"3c9a51b159f52609a5b02f1643563010","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — ra.advancedsignetring.selected()\n\n```python\nra.advanced_signet_ring.selected() -> List[AdvancedSignetRing]\n```\n\n`AdvancedSignetRing` handles for the objects of this kind currently selected in the active document.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Advanced Signet Ring","section":"ra.advancedsignetring.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringselected","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#raadvancedsignetringselected","collection":"scripting","hash":"c2089de2db9dea3b132b1a77942025fc","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — AdvancedSignetRing (handle)\n\nAdvanced signet ring: the same face, plus a lateral profile that shapes the sides and an optional wedge cut at the bottom of the band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_cut_angle` | `float` | yes | total opening of the bottom wedge cut, degrees; 0 = no cut |\n| `face` | SignetFace | | |\n| `lateral_profile_name` | `str` | | asset shaping the sides, \"\" when unset |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved AdvancedSignetRing element (ra.elements.list(\"AdvancedSignetRing\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n| `set_lateral_profile(asset_name: str)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Advanced Signet Ring","section":"AdvancedSignetRing (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#advancedsignetring-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#advancedsignetring-handle","collection":"scripting","hash":"d93f881a8828c29e69149d3cacf1ba95","indexed_by":"docs-index"}},{"content":"Advanced Signet Ring — SignetFace (section)\n\nThe signet face and the band under it — shared by the classic signet and the advanced one. A live view over the ring's stored parameters: getters read the current values, setters regenerate the ring in place (same Guid) and are license-gated.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `height` | `float` | yes | face height, mm |\n| `height_bottom_profile` | `float` | | mm |\n| `height_middle_profile` | `float` | | mm |\n| `height_position` | `float` | yes | how high the face sits over the finger, mm |\n| `inner_height` | `float` | yes | mm — used when Recess is on |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `recess` | `bool` | yes | hollow the back of the face |\n| `rotation` | `float` | yes | degrees |\n| `shape_mode` | `str` | yes | \"Circle\" or \"Custom\" |\n| `tangent` | `float` | yes | |\n| `thickness` | `float` | yes | mm — used when Recess is on |\n| `width` | `float` | yes | face width, mm |\n| `width_bottom_profile` | `float` | | band section at the bottom, mm |\n| `width_middle_profile` | `float` | | band section at the middle, mm |\n\n| Method | |\n|---|---|\n| `set_bottom_profile(width: float, height: float)` | |\n| `set_middle_profile(width: float, height: float)` | |\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Advanced Signet Ring","section":"SignetFace (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#signetface-section","source":"https://www.rhinoartisan.com/docs/scripting/python/advanced-signet-ring/#signetface-section","collection":"scripting","hash":"40f921766b2634e44b9a35ff5db1f29c","indexed_by":"docs-index"}},{"content":"Ai Image\n\nAI images with fal.ai, the engine of Generative AI Studio and of the Assistant's generate_image: a photoreal render of the viewport, an edit of an image file, or an image from a prompt alone.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AiImageApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `generate()` | Generates one image with fal.ai and saves it. |","metadata":{"title":"Ai Image","url":"https://www.rhinoartisan.com/docs/scripting/python/ai-image/","source":"https://www.rhinoartisan.com/docs/scripting/python/ai-image/","collection":"scripting","hash":"89e7def2a16b5860012b129f1e1af643","indexed_by":"docs-index"}},{"content":"Ai Image — ra.aiimage.generate()\n\n```python\nra.ai_image.generate(prompt: str, source=None, preset=None, path=None) -> AiImageResult\n```\n\nGenerates one image with fal.ai and saves it. `source`: \"viewport\" (default; captures the active viewport), \"none\" (the prompt alone) or the path of an image file to edit. `preset`: \"photoreal_render\" (a photographic jewelry render of the source, or of the description with no source), \"try_on\" (the piece worn) or omitted (the prompt says what to do). `path`: where to save it (default: a new file under the user folder's Falai\\Generated). Takes from a few seconds to a minute; each call is billed to the user's fal.ai account.\n\n| Parameter | Type | |\n|---|---|---|\n| `prompt` | `str` | required |\n| `source` | `str` | optional — None = the tool default |\n| `preset` | `str` | optional — None = the tool default |\n| `path` | `str` | optional — None = the tool default |","metadata":{"title":"Ai Image","section":"ra.aiimage.generate()","url":"https://www.rhinoartisan.com/docs/scripting/python/ai-image/#raaiimagegenerate","source":"https://www.rhinoartisan.com/docs/scripting/python/ai-image/#raaiimagegenerate","collection":"scripting","hash":"11f769624eb3aea4fab4ef156c3c766b","indexed_by":"docs-index"}},{"content":"Analyze\n\nWall thickness: at points and globally.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AnalyzeApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `global_thickness()` | Whole-piece wall-thickness map (the ArtisanGlobalThickness command, headless): meshes the given objects at high resolution and measures the wall thickness at EVERY vertex of that analysis mesh, returning the numbers the display-only command can only show as colors. |\n| `thickness_at()` | Wall thickness at a point (the ArtisanThickness probe, scriptable): meshes the given objects at high resolution and measures the material thickness at `point` (which should lie on/near the surface). |\n| `thickness_at_points()` | Same probe for a list of points, meshing the objects only once. |","metadata":{"title":"Analyze","url":"https://www.rhinoartisan.com/docs/scripting/python/analyze/","source":"https://www.rhinoartisan.com/docs/scripting/python/analyze/","collection":"scripting","hash":"fcf92f51229a6eb53415baa16730d2fe","indexed_by":"docs-index"}},{"content":"Analyze — ra.analyze.globalthickness()\n\n```python\nra.analyze.global_thickness(object_ids: Sequence[IdLike], thin_threshold_mm=None, colorize=None) -> GlobalThicknessResult\n```\n\nWhole-piece wall-thickness map (the ArtisanGlobalThickness command, headless): meshes the given objects at high resolution and measures the wall thickness at EVERY vertex of that analysis mesh, returning the numbers the display-only command can only show as colors. object_ids objects to analyze; meshed together on every call. thin_threshold_mm walls thinner than this count as thin spots; 0 = the command's default (0.6 mm). colorize True = also add the command's vertex-colored mesh to the document (red = thin, green = ok, black = not measurable), the same mesh its KeepMesh=Yes exit leaves behind. That is a document mutation -- wrap in a Transaction and expect a license check. False = pure read-only measurement. ThinSpots lists the measurable vertices below the threshold, thinnest first, capped at the worst 100. All values in millimetres. Long operation on dense geometry: one ray cast per mesh vertex.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `thin_threshold_mm` | `float` | optional — None = the tool default |\n| `colorize` | `bool` | optional — None = the tool default |","metadata":{"title":"Analyze","section":"ra.analyze.globalthickness()","url":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzeglobalthickness","source":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzeglobalthickness","collection":"scripting","hash":"2c160b4332550e9b2301bda9841c17f2","indexed_by":"docs-index"}},{"content":"Analyze — ra.analyze.thicknessat()\n\n```python\nra.analyze.thickness_at(object_ids: Sequence[IdLike], point: PointLike, annotate=None) -> float\n```\n\nWall thickness at a point (the ArtisanThickness probe, scriptable): meshes the given objects at high resolution and measures the material thickness at `point` (which should lie on/near the surface). Returns the thickness in model units, or 0 when no measurement is possible at that point. With annotate=True it also draws the same measure the command leaves behind (line + label dot + end points, grouped), which is a document mutation -- wrap in a Transaction and expect a license check. Plain measuring is read-only and free. Note: the objects are meshed on EVERY call. To probe many points on the same geometry, prefer ThicknessAtPoints -- it meshes once.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `point` | `PointLike` | required |\n| `annotate` | `bool` | optional — None = the tool default |","metadata":{"title":"Analyze","section":"ra.analyze.thicknessat()","url":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzethicknessat","source":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzethicknessat","collection":"scripting","hash":"111dea39716e876d1c172b674cba41e4","indexed_by":"docs-index"}},{"content":"Analyze — ra.analyze.thicknessatpoints()\n\n```python\nra.analyze.thickness_at_points(object_ids: Sequence[IdLike], points: Sequence[PointLike], annotate=None) -> List[float]\n```\n\nSame probe for a list of points, meshing the objects only once. Result list is parallel to `points` (0 = not measurable there).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `annotate` | `bool` | optional — None = the tool default |","metadata":{"title":"Analyze","section":"ra.analyze.thicknessatpoints()","url":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzethicknessatpoints","source":"https://www.rhinoartisan.com/docs/scripting/python/analyze/#raanalyzethicknessatpoints","collection":"scripting","hash":"9c2027e9b3f58fba3eb93e8acefef9d2","indexed_by":"docs-index"}},{"content":"Assets\n\nThe profile library the parametric tools build from.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AssetsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `delete()` | Permanently deletes a user asset from the library. |\n| `duplicate()` | Copies an asset (standard ones included) as a new user asset named `new_name` (empty = \" (Copy)\"), preview included. |\n| `export_as_curve()` | Adds the asset's profile to the document as a curve so it can be seen before choosing it: the shape the tools build from (mirrored and closed, or open for RING_SIDE_CURVE), sized width x height mm (0 = 5 x 3, like the Assets panel's insert; side curves keep their aspect and only follow height) and centered on `plane`'s origin (default: the active construction plane). |\n| `get_default()` | The default asset for a type -- the one every Create uses when no profile name is given. |\n| `list()` | Lists the assets in the library, optionally filtered by type (\"RING_PROFILE\", \"BEZEL_PROFILE\", \"CHARM_PROFILE\", ...). |\n| `rename()` | Renames a user asset. |\n| `set_default()` | Makes an asset the default of its type: every Create uses it when no profile is given. |\n| `types()` | Valid values for the `type` arguments. |","metadata":{"title":"Assets","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/","collection":"scripting","hash":"fe246e47b97e0e56093c73a1e4fdda5a","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.delete()\n\n```python\nra.assets.delete(type: str, name: str) -> bool\n```\n\nPermanently deletes a user asset from the library. Standard assets are protected. Objects already built from it keep their embedded copy. Returns True when deleted.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |","metadata":{"title":"Assets","section":"ra.assets.delete()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsdelete","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsdelete","collection":"scripting","hash":"5452f1dfd8379098b2559581f0f544dc","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.duplicate()\n\n```python\nra.assets.duplicate(type: str, name: str, new_name=None) -> AssetInfo\n```\n\nCopies an asset (standard ones included) as a new user asset named `new_name` (empty = \" (Copy)\"), preview included.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `new_name` | `str` | optional — None = the tool default |","metadata":{"title":"Assets","section":"ra.assets.duplicate()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsduplicate","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsduplicate","collection":"scripting","hash":"be5697dba0f608dbf55839e81c4e4be6","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.exportascurve()\n\n```python\nra.assets.export_as_curve(type: str, name: str, width=None, height=None, plane=None) -> str\n```\n\nAdds the asset's profile to the document as a curve so it can be seen before choosing it: the shape the tools build from (mirrored and closed, or open for RING_SIDE_CURVE), sized width x height mm (0 = 5 x 3, like the Assets panel's insert; side curves keep their aspect and only follow height) and centered on `plane`'s origin (default: the active construction plane). `name` accepts the asset name or \"id: \". Returns the curve id.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Assets","section":"ra.assets.exportascurve()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsexportascurve","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsexportascurve","collection":"scripting","hash":"775f95eb26165534d80c2cb32493cab2","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.getdefault()\n\n```python\nra.assets.get_default(type: str) -> AssetInfo\n```\n\nThe default asset for a type -- the one every Create uses when no profile name is given.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n\nra.assets.list()\n```python\nra.assets.list(type=None) -> List[AssetInfo]\n```\n\nLists the assets in the library, optionally filtered by type (\"RING_PROFILE\", \"BEZEL_PROFILE\", \"CHARM_PROFILE\", ...).\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | optional — None = the tool default |","metadata":{"title":"Assets","section":"ra.assets.getdefault()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsgetdefault","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsgetdefault","collection":"scripting","hash":"2198086f25dff8438baafb7eda574833","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.rename()\n\n```python\nra.assets.rename(type: str, name: str, new_name: str) -> AssetInfo\n```\n\nRenames a user asset. Standard (factory) assets cannot be renamed: tool defaults and scripts refer to them by name. The new name must be free within the type.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `new_name` | `str` | required |","metadata":{"title":"Assets","section":"ra.assets.rename()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsrename","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetsrename","collection":"scripting","hash":"633388f7d0a92121499139bd1b1e80ff","indexed_by":"docs-index"}},{"content":"Assets — ra.assets.setdefault()\n\n```python\nra.assets.set_default(type: str, name: str) -> AssetInfo\n```\n\nMakes an asset the default of its type: every Create uses it when no profile is given.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n\nra.assets.types()\n```python\nra.assets.types() -> List[str]\n```\n\nValid values for the `type` arguments.","metadata":{"title":"Assets","section":"ra.assets.setdefault()","url":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetssetdefault","source":"https://www.rhinoartisan.com/docs/scripting/python/assets/#raassetssetdefault","collection":"scripting","hash":"9e6b30e1ac6d160156119e6bcdb7d6f5","indexed_by":"docs-index"}},{"content":"Automatic Pave\n\nRelaxed multi-size pave fill with symmetry.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AutomaticPaveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `on_surface()` | Fills `surface_ids` with stones and bakes them as loose gems. |\n\nra.automaticpave.onsurface()\n```python\nra.automatic_pave.on_surface(surface_ids=None, gem_sizes=None, min_distance=None, border_distance=None, fill_mode=None, symmetry=None, start_point=None, relax_iterations=None) -> List[str]\n```\n\nFills `surface_ids` with stones and bakes them as loose gems. `gem_sizes` is the size palette in millimetres -- the tool's distinguishing feature: pass several and the relaxation picks per stone (e.g. [1.5, 1.2, 0.9]); None/empty uses the user's saved palette (the panel's save-as-default), otherwise 1.3. `min_distance` is the metal left between stones, `border_distance` the margin to the surface edge (both mm; 0 keeps the user's saved value, otherwise 0.1). `fill_mode` is FROM_BORDER (default, seeds the outline first) or FROM_CENTER, which grows from `start_point`. `symmetry` mirrors the layout: NONE (default), X, Y or BOTH. `relax_iterations` runs extra relaxation passes for a tidier result. Returns the ids of the baked gems.","metadata":{"title":"Automatic Pave","url":"https://www.rhinoartisan.com/docs/scripting/python/automatic-pave/","source":"https://www.rhinoartisan.com/docs/scripting/python/automatic-pave/","collection":"scripting","hash":"10fbce5d03d83fb4529da3d8cad5cf2a","indexed_by":"docs-index"}},{"content":"Automatic Pave\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `gem_sizes` | `Sequence[float]` | optional — None = the tool default |\n| `min_distance` | `float` | optional — None = the tool default |\n| `border_distance` | `float` | optional — None = the tool default |\n| `fill_mode` | `str` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |\n| `start_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `relax_iterations` | `int` | optional — None = the tool default |","metadata":{"title":"Automatic Pave","url":"https://www.rhinoartisan.com/docs/scripting/python/automatic-pave/","source":"https://www.rhinoartisan.com/docs/scripting/python/automatic-pave/","collection":"scripting","hash":"ff710d6854ff96c6520f5c42daa64148","indexed_by":"docs-index"}},{"content":"Azure\n\nAzure cutters under a pave: the openwork underneath.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.AzureApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | The Azure panel (AzureCommand / SmartAzure ribbon button), headless: open-work under stones. |","metadata":{"title":"Azure","url":"https://www.rhinoartisan.com/docs/scripting/python/azure/","source":"https://www.rhinoartisan.com/docs/scripting/python/azure/","collection":"scripting","hash":"35aacc2167a5fc7fe8e8b90e9901f460","indexed_by":"docs-index"}},{"content":"Azure — ra.azure.create()\n\n```python\nra.azure.create(solid_id: IdLike, gem_ids=None, thickness=None, height=None, depth=None, angle=None, rotation=None, boolean=None, delete_original=None) -> AzureResult\n```\n\nThe Azure panel (AzureCommand / SmartAzure ribbon button), headless: open-work under stones. One hexagonal hole per gem in `gem_ids` (None = the selected gems), centred under the gem girdle and projected onto `solid_id` (a closed polysurface or extrusion), then subtracted from it. Millimetres; omitting keeps the tool default (or the user's saved defaults): thickness 0.6 (wall between holes), height 0.5 (rise above the surface), depth 4 (cut depth). `angle` is the wall taper in degrees and `rotation` spins the hexagon (both default 0; NaN = default). `boolean` True (default) replaces the solid by the carved result (`delete_original` removes the original; default False keeps both, like the panel); False adds the cutters to the document and leaves the solid intact.\n\n| Parameter | Type | |\n|---|---|---|\n| `solid_id` | `IdLike` | required |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `depth` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `boolean` | `bool` | optional — None = the tool default |\n| `delete_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Azure","section":"ra.azure.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/azure/#raazurecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/azure/#raazurecreate","collection":"scripting","hash":"678da9f4a9c71f9fc4a1003ae29de2d3","indexed_by":"docs-index"}},{"content":"Bail\n\nPendant bails.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BailApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Creates a bail on `plane` (defaults to the active view's construction plane, like the tool). |","metadata":{"title":"Bail","url":"https://www.rhinoartisan.com/docs/scripting/python/bail/","source":"https://www.rhinoartisan.com/docs/scripting/python/bail/","collection":"scripting","hash":"1fd5ad3ad2a84445dc171b2859cbbba5","indexed_by":"docs-index"}},{"content":"Bail — ra.bail.create()\n\n```python\nra.bail.create(plane=None, diameter_top=None, diameter_bottom=None, distance=None, with_o_ring=None, name=None, profile=None, top_width=None, top_height=None, bottom_width=None, bottom_height=None, top_profile=None, bottom_profile=None, starting_on_top=None, starting_on_bottom=None, curve_tension=None, o_ring_thickness=None, o_ring_diameter=None, o_ring_overlap=None, o_ring_rotation=None, element=None) -> List[str]\n```\n\nCreates a bail on `plane` (defaults to the active view's construction plane, like the tool). Millimetres; omitting keeps the tool default (or the user's saved defaults): diameter_top 3, diameter_bottom 1, distance 5. `withORing` True also builds the torus o-ring; False (default) builds none. The wire cross-section drives the weight: top_width/top_height (default 4 x 1.4) and bottom_width/bottom_height (default 1 x 1); `profile` sets both profile assets, top_profile/bottom_profile each one. starting_on_top, starting_on_bottom (default 0.5) and curve_tension (default 1) shape the side curves; NaN keeps the default. o_ring_thickness (1), o_ring_diameter (2), o_ring_overlap (1) size the o-ring; o_ring_rotation in degrees (0; NaN keeps it). Returns the ids of the created breps. `element` = name of a saved Bail element (ra.elements.list(\"Bail\")) to start from; explicit arguments override it (profile names replace its profiles; withORing False keeps its o-ring setting).","metadata":{"title":"Bail","section":"ra.bail.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/bail/#rabailcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/bail/#rabailcreate","collection":"scripting","hash":"735010c31c7ff12088a176cc48fa03d3","indexed_by":"docs-index"}},{"content":"Bail — ra.bail.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `diameter_top` | `float` | optional — None = the tool default |\n| `diameter_bottom` | `float` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `with_o_ring` | `bool` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `top_width` | `float` | optional — None = the tool default |\n| `top_height` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `bottom_height` | `float` | optional — None = the tool default |\n| `top_profile` | `str` | optional — None = the tool default |\n| `bottom_profile` | `str` | optional — None = the tool default |\n| `starting_on_top` | `float` | optional — None = the tool default |\n| `starting_on_bottom` | `float` | optional — None = the tool default |\n| `curve_tension` | `float` | optional — None = the tool default |\n| `o_ring_thickness` | `float` | optional — None = the tool default |\n| `o_ring_diameter` | `float` | optional — None = the tool default |\n| `o_ring_overlap` | `float` | optional — None = the tool default |\n| `o_ring_rotation` | `float` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Bail","section":"ra.bail.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/bail/#rabailcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/bail/#rabailcreate","collection":"scripting","hash":"f28f11d184b3095b0d39d7a387a44170","indexed_by":"docs-index"}},{"content":"Bangle\n\nBangles.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BangleApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `closed` True makes a full bangle (type CLOSED); default is the open type with `aperture` mm of opening. |\n\nra.bangle.create()\n```python\nra.bangle.create(plane=None, width=None, height=None, aperture=None, closed=None, profile=None, element=None) -> str\n```\n\n`closed` True makes a full bangle (type CLOSED); default is the open type with `aperture` mm of opening. Defaults: width 50, height 30, aperture 10. `element` = name of a saved Bangle element (ra.elements.list(\"Bangle\")) to start from; explicit arguments override it (`profile` replaces its three profiles).\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `aperture` | `float` | optional — None = the tool default |\n| `closed` | `bool` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Bangle","url":"https://www.rhinoartisan.com/docs/scripting/python/bangle/","source":"https://www.rhinoartisan.com/docs/scripting/python/bangle/","collection":"scripting","hash":"4933f028a9636242a73571644b499afe","indexed_by":"docs-index"}},{"content":"Basket\n\nBasket settings: prongs, upper and base rails.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BasketApi`, `ArtisanPlugin.Scripting.BasketUpdateApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Basket` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_gem_material()` | |\n| `by_layer()` | `Basket` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a basket setting under an existing gem -- the ArtisanBasket tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Basket` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Baskets currently selected in the active doc. |\n| `update_legacy_baskets()` | The ArtisanBasketUpdate command, headless: finds every legacy basket (one object carrying \"ObjectType = Basket\" + parameters in its geometry dictionary, as saved by old Artisan versions, hidden or not), recomputes it against its mother gem with the current kernel and replaces it by the modern editable \"Basket\" group (metal material, RaObjectUserData with the parameters and the mother). |","metadata":{"title":"Basket","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/","collection":"scripting","hash":"b774dc25c1c471ff2892feff0e770610","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.all()\n\n```python\nra.basket.all() -> List[Basket]\n```\n\n`Basket` handles for every object of this kind in the active document (empty when there is no document).\n\nra.basket.bygemmaterial()\n```python\nra.basket.by_gem_material(material_name: str) -> List[Basket]\n```\n\n| Parameter | Type | |\n|---|---|---|\n| `material_name` | `str` | required |","metadata":{"title":"Basket","section":"ra.basket.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketall","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketall","collection":"scripting","hash":"9765714b609661d03d42b69f909d04de","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.bylayer()\n\n```python\nra.basket.by_layer(layer_name: str) -> List[Basket]\n```\n\n`Basket` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |\n\nra.basket.count()\n```python\nra.basket.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Basket","section":"ra.basket.bylayer()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketbylayer","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketbylayer","collection":"scripting","hash":"95a51b1ef43f4cb644931efe2a8064ea","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.create()\n\n```python\nra.basket.create(gem_ids=None, prongs=None, prong_diameter=None, prong_height=None, prong_height_over_girdle=None, gem_inside=None, upper_rail=None, base_rail=None, support=None, prong_mode=None, prong_profile=None, prong_diameter_bottom=None, prong_rotation=None, straight_prong=None, support_width=None, support_thickness=None, upper_rail_width=None, upper_rail_height=None, upper_rail_height_under_girdle=None, upper_rail_gem_size_percentage=None, upper_rail_profile=None, base_rail_width=None, base_rail_height=None, base_rail_move_in_z=None, base_rail_gem_size_percentage=None, base_rail_profile=None, element=None) -> List[Basket]\n```\n\nBuilds a basket setting under an existing gem -- the ArtisanBasket tool, headless. One basket (its own group) per gem; `gem_ids` None/empty = the currently selected gems. Millimetres; omitting keeps the tool default (or the user's saved defaults): prong_diameter 1.5 (sets top/girdle/bottom together), prong_height 4, prong_height_over_girdle 0.3. `prongs` 0 keeps the default (4 rotated); positive/negative counts follow the tool (negative = rotated variant). `gem_inside` defaults to 0.35. `upper_rail`/`base_rail` None keep the defaults (both enabled). `support` is NONE (default), SINGLE or DOUBLE. `prong_mode` is ROUND (default), CUSTOM (the `prong_profile` section; a profile alone implies it, and the section starts turned 90 degrees unless `prong_rotation` says otherwise) or CLAW; DEFAULT and CIRCLE also mean ROUND. Claw tips are built in Render mode only; tune them through the handle's Prong section (SetClawGemInside...). Returns one Basket handle per gem, in input order. `element` = name of a saved Basket element (ra.elements.list(\"Basket\")) to start from instead of the defaults; explicit arguments override it.","metadata":{"title":"Basket","section":"ra.basket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","collection":"scripting","hash":"7cbe42848ce6a8ee867822a6f2431e02","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `prongs` | `int` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `prong_height` | `float` | optional — None = the tool default |\n| `prong_height_over_girdle` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `upper_rail` | `Optional[bool]` | optional — None = the tool default |\n| `base_rail` | `Optional[bool]` | optional — None = the tool default |\n| `support` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |\n| `prong_profile` | `str` | optional — None = the tool default |\n| `prong_diameter_bottom` | `float` | optional — None = the tool default |\n| `prong_rotation` | `float` | optional — None = the tool default |\n| `straight_prong` | `Optional[bool]` | optional — None = the tool default |\n| `support_width` | `float` | optional — None = the tool default |\n| `support_thickness` | `float` | optional — None = the tool default |\n| `upper_rail_width` | `float` | optional — None = the tool default |\n| `upper_rail_height` | `float` | optional — None = the tool default |\n| `upper_rail_height_under_girdle` | `float` | optional — None = the tool default |\n| `upper_rail_gem_size_percentage` | `float` | optional — None = the tool default |\n| `upper_rail_profile` | `str` | optional — None = the tool default |\n| `base_rail_width` | `float` | optional — None = the tool default |\n| `base_rail_height` | `float` | optional — None = the tool default |\n| `base_rail_move_in_z` | `float` | optional — None = the tool default |","metadata":{"title":"Basket","section":"ra.basket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","collection":"scripting","hash":"d55eb4845df3c63b4c060bd4876ea9c5","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `base_rail_gem_size_percentage` | `float` | optional — None = the tool default |\n| `base_rail_profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Basket","section":"ra.basket.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketcreate","collection":"scripting","hash":"f2d0e7c756b54029c7f20487c06701d0","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.find()\n\n```python\nra.basket.find(id: IdLike) -> Basket\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.basket.forgem()\n```python\nra.basket.for_gem(gem_id: IdLike) -> List[Basket]\n```\n\n`Basket` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Basket","section":"ra.basket.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketfind","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketfind","collection":"scripting","hash":"54d586e4d0832984e15742e434b6995f","indexed_by":"docs-index"}},{"content":"Basket — ra.basket.selected()\n\n```python\nra.basket.selected() -> List[Basket]\n```\n\nBaskets currently selected in the active doc.\n\nra.basket.updatelegacybaskets()\n```python\nra.basket.update_legacy_baskets() -> List[str]\n```\n\nThe ArtisanBasketUpdate command, headless: finds every legacy basket (one object carrying \"ObjectType = Basket\" + parameters in its geometry dictionary, as saved by old Artisan versions, hidden or not), recomputes it against its mother gem with the current kernel and replaces it by the modern editable \"Basket\" group (metal material, RaObjectUserData with the parameters and the mother). Baskets whose mother gem is gone or that fail to compute are left untouched. Returns the ids of the new baskets (ra.basket.find / handles); empty when the document has no legacy baskets.","metadata":{"title":"Basket","section":"ra.basket.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketselected","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#rabasketselected","collection":"scripting","hash":"0b232c017ba8dbb5a77d07a006187941","indexed_by":"docs-index"}},{"content":"Basket — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nBasket (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `base_rail` | BasketRail | | |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong` | BasketProng | | The rest of the tool's parameters, grouped as the panel groups them. |\n| `prong_count` | `int` | yes | signed: negative = the rotated layout |\n| `prong_diameter_bottom` | `float` | | |\n| `prong_diameter_girdle` | `float` | | stored for older files only: the prong's girdle section is built from ProngDiameterTop |\n| `prong_diameter_top` | `float` | | |\n| `prong_height` | `float` | yes | |\n| `prong_mode` | `str` | yes | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\": the prong construction, as on every setting with prongs. The claw values live in the Prong section. |\n| `prongs_rotated` | `bool` | | |\n| `upper_rail` | BasketRail | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Basket element (ra.elements.list(\"Basket\")) to this basket: its parameters replace the current ones, the mother gem stays, and the basket regenerates in place (same id). |\n| `set_prong_diameter(diameter: float)` | writes all three diameters |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Basket","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#handles","collection":"scripting","hash":"5992cef6bd1696cc899da631d9312146","indexed_by":"docs-index"}},{"content":"Basket — BasketRail (section)\n\nOne of the basket's two rails. The upper rail additionally carries the chamfer; the base rail carries its vertical offset. Members that do not apply to a rail throw NotSupportedException rather than silently doing nothing.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `chamfer` | `bool` | yes | upper rail only |\n| `chamfer_offset` | `float` | yes | upper rail only |\n| `enabled` | `bool` | yes | |\n| `gem_size_percentage` | `float` | yes | rail diameter as % of the gem |\n| `height` | `float` | yes | mm |\n| `height_under_girdle` | `float` | yes | upper rail only |\n| `mode` | `str` | yes | DEFAULT (elliptical section) or CUSTOM (the CLOSED_PROFILE) |\n| `move_in_z` | `float` | yes | base rail only, signed |\n| `profile_name` | `str` | | CLOSED_PROFILE asset name (used in CUSTOM mode) |\n| `rotation` | `float` | yes | degrees, signed |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | also switches the rail to CUSTOM mode, where the profile is used |","metadata":{"title":"Basket","section":"BasketRail (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#basketrail-section","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#basketrail-section","collection":"scripting","hash":"d4aa3df4c1e0484e632daebae376fd63","indexed_by":"docs-index"}},{"content":"Basket — BasketProng (section)\n\nThe prongs and their support posts.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_rail_inside` | `float` | yes | |\n| `cap_bump` | `float` | yes | mm |\n| `claw_gem_inside` | `float` | yes | The basket's claw tip, CLAW mode only (built in Render mode only). mm the tip reaches in toward the gem. |\n| `claw_height` | `float` | yes | mm added to the height over the girdle, signed |\n| `claw_on_curve` | `int` | yes | the panel's \"Smoothness\" (1-30): on STRAIGHT prongs, where the claw starts to bend, as a % of the girdle-to-base distance; curved prongs (the default) ignore it |\n| `claw_tension` | `float` | yes | degrees, the panel's \"Tip direction\" (10-60) |\n| `count` | `int` | yes | negative = the rotated layout |\n| `diameter_bottom` | `float` | yes | mm |\n| `diameter_top` | `float` | yes | mm |\n| `extension_for_manufacturing` | `float` | yes | |\n| `gem_inside` | `float` | yes | mm, signed |\n| `height` | `float` | yes | mm |\n| `height_over_girdle` | `float` | yes | mm |\n| `mode` | `str` | yes | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\" (the same as Basket.ProngMode) |\n| `profile_name` | `str` | | CLOSED_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees, signed |\n| `straight` | `bool` | yes | straight vs curved prong body |\n| `support` | `str` | yes | \"NONE\" \\| \"SINGLE\" \\| \"DOUBLE\" |\n| `support_thickness` | `float` | yes | mm |\n| `support_width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | CLOSED_PROFILE asset; also switches the prongs to CUSTOM mode, where the profile is used (from another mode, Rotation starts at 90) |","metadata":{"title":"Basket","section":"BasketProng (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/basket/#basketprong-section","source":"https://www.rhinoartisan.com/docs/scripting/python/basket/#basketprong-section","collection":"scripting","hash":"3ea17052dabb612778d430e3788c1d9a","indexed_by":"docs-index"}},{"content":"Bead\n\nBeads.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BeadApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `profile` is \"SQUARE\" (default) or \"ROUND\". |\n\nra.bead.create()\n```python\nra.bead.create(plane=None, width=None, height=None, hole_diameter=None, profile=None, element=None) -> str\n```\n\n`profile` is \"SQUARE\" (default) or \"ROUND\". Defaults: width 10, height 10, hole_diameter 3. `element` = name of a saved Bead element (ra.elements.list(\"Bead\")) to start from; explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `hole_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Bead","url":"https://www.rhinoartisan.com/docs/scripting/python/bead/","source":"https://www.rhinoartisan.com/docs/scripting/python/bead/","collection":"scripting","hash":"e91e8f0460b1b919cbb513c44c1d58e3","indexed_by":"docs-index"}},{"content":"Bezel\n\nBezel settings with support, cutter and air-gap sections.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BezelApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Bezel` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Bezel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a bezel around an existing gem (`gem_id` must be a gem in the active document -- the bezel is a parametric child of that gem). |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Bezel` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Bezels currently selected in the active doc. |","metadata":{"title":"Bezel","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/","collection":"scripting","hash":"7f4d20b424ac4ccf082d9d1a2921ded6","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.all()\n\n```python\nra.bezel.all() -> List[Bezel]\n```\n\n`Bezel` handles for every object of this kind in the active document (empty when there is no document).\n\nra.bezel.bylayer()\n```python\nra.bezel.by_layer(layer_name: str) -> List[Bezel]\n```\n\n`Bezel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Bezel","section":"ra.bezel.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelall","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelall","collection":"scripting","hash":"0a262a94ff41c29a1c6ced9cb0802b11","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.count()\n\n```python\nra.bezel.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Bezel","section":"ra.bezel.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcount","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcount","collection":"scripting","hash":"6ab3ee8fb0eb2b92413110187eca0cca","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.create()\n\n```python\nra.bezel.create(gem_id: IdLike, height=None, width=None, girdle_height=None, girdle_width=None, gem_inside=None, profile=None, support_count=None, support_width=None, support_thickness=None, cutter_count=None, cutter_width=None, cutter_height=None, cutter_profile=None, airgap_count=None, airgap_width=None, airgap_height=None, airgap_profile=None, element=None) -> Bezel\n```\n\nBuilds a bezel around an existing gem (`gem_id` must be a gem in the active document -- the bezel is a parametric child of that gem). Uses the same default profile assets and compute pipeline as the ArtisanBezel tool, so the result is identical to inserting one from the panel. All dimensional arguments are millimetres. Omit (None) to keep the default for that parameter: the user's saved Bezel defaults when there are any (the panel's save-as-default), otherwise the tool's (height 3.8, width 1.5, girdle height 0.3, girdle width 1.5, gem inside 0). `profile` picks a BEZEL_PROFILE asset from the library by name (see ra.assets.list(\"BEZEL_PROFILE\")); omitted = the default profile. The support posts and the two piercing blocks (cutters and air gaps, both OFF by default) are opened here by their count: passing `cutter_count`/`airgap_count` > 0 enables that block. Their signed parameters -- displacement and the three rotations -- are not arguments here, because 0 is a meaningful value for them and this signature reads 0 as \"keep the default\"; set those through the returned handle (`bezel.cutters.vertical_rotation = ...`), which takes literal values. Throws if `gem_id` is not a gem, if the bezel geometry fails to compute, or if the license is invalid.","metadata":{"title":"Bezel","section":"ra.bezel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcreate","collection":"scripting","hash":"1d9f4351795ffd6610c2779ae21eed8e","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `height` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `girdle_height` | `float` | optional — None = the tool default |\n| `girdle_width` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `support_count` | `int` | optional — None = the tool default |\n| `support_width` | `float` | optional — None = the tool default |\n| `support_thickness` | `float` | optional — None = the tool default |\n| `cutter_count` | `int` | optional — None = the tool default |\n| `cutter_width` | `float` | optional — None = the tool default |\n| `cutter_height` | `float` | optional — None = the tool default |\n| `cutter_profile` | `str` | optional — None = the tool default |\n| `airgap_count` | `int` | optional — None = the tool default |\n| `airgap_width` | `float` | optional — None = the tool default |\n| `airgap_height` | `float` | optional — None = the tool default |\n| `airgap_profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Bezel","section":"ra.bezel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelcreate","collection":"scripting","hash":"1fc88481b345ece7189e43620dd76535","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.find()\n\n```python\nra.bezel.find(id: IdLike) -> Bezel\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.bezel.forgem()\n```python\nra.bezel.for_gem(gem_id: IdLike) -> List[Bezel]\n```\n\n`Bezel` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Bezel","section":"ra.bezel.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelfind","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelfind","collection":"scripting","hash":"bbceaf72bfd4a35bcae8036fb84f1e73","indexed_by":"docs-index"}},{"content":"Bezel — ra.bezel.selected()\n\n```python\nra.bezel.selected() -> List[Bezel]\n```\n\nBezels currently selected in the active doc. Empty list if nothing is selected or the selection contains no bezels.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Bezel","section":"ra.bezel.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelselected","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#rabezelselected","collection":"scripting","hash":"1cd292453be44198f7c24e1ba8f7770b","indexed_by":"docs-index"}},{"content":"Bezel — Bezel (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `air_gaps` | BezelPiercing | | |\n| `cutters` | BezelPiercing | | |\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `girdle_height` | `float` | yes | |\n| `girdle_width` | `float` | yes | |\n| `height` | `float` | yes | Current values of the bezel wall (millimetres). |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `profile_name` | `str` | | BEZEL_PROFILE asset name, \"\" when unset |\n| `support` | BezelSupport | | The rest of the tool's parameters, grouped as the panel groups them. |\n| `width` | `float` | yes | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Bezel element (ra.elements.list(\"Bezel\")) to this bezel: its parameters replace the current ones, the mother gem stays, and the bezel regenerates in place (same Guid). |\n| `set_profile(asset_name: str)` | BEZEL_PROFILE asset name |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Bezel","section":"Bezel (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezel-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezel-handle","collection":"scripting","hash":"bf42bc504b20ec198ab2049d6deb2484","indexed_by":"docs-index"}},{"content":"Bezel — BezelPiercing (section)\n\nThe repeated solids pierced around the bezel wall. The same shape drives two independent sections: the CUTTERS (subtracted, the classic scalloped windows) and the AIR GAPS (the openings under the girdle).\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `count` | `int` | yes | how many are distributed around the bezel |\n| `displacement` | `float` | yes | mm along the bezel axis, SIGNED |\n| `enabled` | `bool` | yes | |\n| `global_rotation` | `float` | yes | degrees, the whole ring of piercings, SIGNED |\n| `height` | `float` | yes | mm |\n| `profile_name` | `str` | | CLOSED_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees, each piercing around its own axis, SIGNED |\n| `vertical_rotation` | `float` | yes | degrees, tilt of each piercing, SIGNED |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | CLOSED_PROFILE asset name |","metadata":{"title":"Bezel","section":"BezelPiercing (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezelpiercing-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezelpiercing-section","collection":"scripting","hash":"a9c0eda6216e68e392dbf93a6c85551a","indexed_by":"docs-index"}},{"content":"Bezel — BezelSupport (section)\n\nThe posts that hold the bezel over the shank.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `count` | `int` | yes | number of support posts, 0 = none (max 6) |\n| `thickness` | `float` | yes | mm |\n| `width` | `float` | yes | mm |","metadata":{"title":"Bezel","section":"BezelSupport (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezelsupport-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bezel/#bezelsupport-section","collection":"scripting","hash":"abd5e186c69de05044ce0e0f1e9e0528","indexed_by":"docs-index"}},{"content":"Boolean\n\nArtisan booleans that keep the pieces editable: union, difference, intersection, split, update.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BooleanApi`, `ArtisanPlugin.Scripting.BooleanUpdateApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `difference()` | Subtracts `cutter_ids` from `target_ids`. |\n| `intersection()` | Intersection of the two sets. |\n| `split()` | Splits `target_ids` with `cutter_ids`. |\n| `union()` | Union of two or more solids. |\n| `list_dismantled()` | Read-only: the dismantled Artisan booleans in the document (boolean groups with no members), with their operation, stored operand ids and the operand ids that no longer exist (those need `replacements` in Update). |\n| `update()` | Rebuilds one dismantled boolean by its unique id (see ListDismantled). |\n| `update_all()` | Rebuilds every dismantled Artisan boolean (the ArtisanBooleanUpdate command, no prompts): recomputes each one from its stored operands, puts the result breps back in the boolean group and hides the operands. |","metadata":{"title":"Boolean","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/","collection":"scripting","hash":"f6dc13b3826355add371c267ef50540a","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.difference()\n\n```python\nra.boolean.difference(target_ids: Sequence[IdLike], cutter_ids: Sequence[IdLike]) -> List[str]\n```\n\nSubtracts `cutter_ids` from `target_ids`. Returns the result brep ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `target_ids` | `Sequence[IdLike]` | required |\n| `cutter_ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Boolean","section":"ra.boolean.difference()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleandifference","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleandifference","collection":"scripting","hash":"77e7c3363893200712690031037e50f7","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.intersection()\n\n```python\nra.boolean.intersection(target_ids: Sequence[IdLike], cutter_ids: Sequence[IdLike]) -> List[str]\n```\n\nIntersection of the two sets. Returns the result brep ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `target_ids` | `Sequence[IdLike]` | required |\n| `cutter_ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Boolean","section":"ra.boolean.intersection()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanintersection","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanintersection","collection":"scripting","hash":"044e2091ede9728f9466a8051ac272c4","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.split()\n\n```python\nra.boolean.split(target_ids: Sequence[IdLike], cutter_ids: Sequence[IdLike]) -> List[str]\n```\n\nSplits `target_ids` with `cutter_ids`. Returns the result brep ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `target_ids` | `Sequence[IdLike]` | required |\n| `cutter_ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Boolean","section":"ra.boolean.split()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleansplit","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleansplit","collection":"scripting","hash":"79d3db03330b4c4b576a8968bf6e5a47","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.union()\n\n```python\nra.boolean.union(object_ids: Sequence[IdLike]) -> List[str]\n```\n\nUnion of two or more solids. Returns the ids of the result breps.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n\nra.boolean.listdismantled()\n```python\nra.boolean.list_dismantled() -> List[DismantledBoolean]\n```\n\nRead-only: the dismantled Artisan booleans in the document (boolean groups with no members), with their operation, stored operand ids and the operand ids that no longer exist (those need `replacements` in Update). Id is the boolean's unique id (RaObjectUserData.Unique).","metadata":{"title":"Boolean","section":"ra.boolean.union()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanunion","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanunion","collection":"scripting","hash":"df9887c088efcd0889c6d980e166c9fd","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.update()\n\n```python\nra.boolean.update(boolean_id: IdLike, replacements=None) -> UpdateResult\n```\n\nRebuilds one dismantled boolean by its unique id (see ListDismantled). `replacements` maps a dead operand id to the object that replaces it (old id -> new id, as strings); the new ids are stored in the boolean so later updates work without them. Returns counts and result ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `boolean_id` | `IdLike` | required |\n| `replacements` | `Dict[str, str]` | optional — None = the tool default |","metadata":{"title":"Boolean","section":"ra.boolean.update()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanupdate","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanupdate","collection":"scripting","hash":"258c75e7997d639f48d63cf6d4355c76","indexed_by":"docs-index"}},{"content":"Boolean — ra.boolean.updateall()\n\n```python\nra.boolean.update_all() -> UpdateResult\n```\n\nRebuilds every dismantled Artisan boolean (the ArtisanBooleanUpdate command, no prompts): recomputes each one from its stored operands, puts the result breps back in the boolean group and hides the operands. Booleans with a dead operand id or a failed computation are skipped and reported in Messages. Returns counts and the result ids.","metadata":{"title":"Boolean","section":"ra.boolean.updateall()","url":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanupdateall","source":"https://www.rhinoartisan.com/docs/scripting/python/boolean/#rabooleanupdateall","collection":"scripting","hash":"38ac8d677d5031fb96af52ab5cb12895","indexed_by":"docs-index"}},{"content":"Boutique\n\nThe Boutique: ready-made designs (solitaires, trilogies, halos, bands, earrings...) grouped in collections that are downloaded from the RhinoArtisan catalog to this computer and imported into the document like the Boutique window does.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BoutiqueApi`.","metadata":{"title":"Boutique","url":"https://www.rhinoartisan.com/docs/scripting/python/boutique/","source":"https://www.rhinoartisan.com/docs/scripting/python/boutique/","collection":"scripting","hash":"38b0e04a4733b21d87c4cc73d007c4d3","indexed_by":"docs-index"}},{"content":"Boutique — Functions\n\n| Function | |\n|---|---|\n| `catalog()` | The kits of the online Boutique catalog (rhinoartisan.com), each with whether it is installed and up to date. |\n| `designs()` | The designs of the Boutique collections installed on this computer. |\n| `download()` | Downloads and installs Boutique kits from the online catalog: the ones named in `names` (kit name or folder), or, when omitted, every kit not installed yet or updated since. |\n| `insert()` | Imports a Boutique design into the document, like the Boutique window's Open: `design` is its id or SKU (`collection`, a name or folder, narrows the search when several collections use the same one). |","metadata":{"title":"Boutique","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#functions","collection":"scripting","hash":"4590660d6e321b3fa2dd8608b7ccddd7","indexed_by":"docs-index"}},{"content":"Boutique — ra.boutique.catalog()\n\n```python\nra.boutique.catalog() -> List[BoutiqueKit]\n```\n\nThe kits of the online Boutique catalog (rhinoartisan.com), each with whether it is installed and up to date. Needs the internet; read-only.\n\nra.boutique.designs()\n```python\nra.boutique.designs(query=None, collection=None) -> List[BoutiqueCatalogDesign]\n```\n\nThe designs of the Boutique collections installed on this computer. `query` keeps those whose collection, name, description, SKU or id contain every word of it (case-insensitive); `collection` keeps one collection (name or folder). Read-only. Install more collections with Download().\n\n| Parameter | Type | |\n|---|---|---|\n| `query` | `str` | optional — None = the tool default |\n| `collection` | `str` | optional — None = the tool default |","metadata":{"title":"Boutique","section":"ra.boutique.catalog()","url":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiquecatalog","source":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiquecatalog","collection":"scripting","hash":"a0d6422a4c86946e183de89968b6a856","indexed_by":"docs-index"}},{"content":"Boutique — ra.boutique.download()\n\n```python\nra.boutique.download(names=None) -> List[BoutiqueKit]\n```\n\nDownloads and installs Boutique kits from the online catalog: the ones named in `names` (kit name or folder), or, when omitted, every kit not installed yet or updated since. An update replaces the kit's folder. Returns the kits installed. Needs the internet.\n\n| Parameter | Type | |\n|---|---|---|\n| `names` | `Sequence[str]` | optional — None = the tool default |","metadata":{"title":"Boutique","section":"ra.boutique.download()","url":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiquedownload","source":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiquedownload","collection":"scripting","hash":"29857c191cc723c7ff75396b84f8fce2","indexed_by":"docs-index"}},{"content":"Boutique — ra.boutique.insert()\n\n```python\nra.boutique.insert(design: str, collection=None, metal=None) -> List[str]\n```\n\nImports a Boutique design into the document, like the Boutique window's Open: `design` is its id or SKU (`collection`, a name or folder, narrows the search when several collections use the same one). `metal` WHITE, YELLOW or ROSE also sets the document's metal to that 18K gold, as the window's metal selector does. Returns the ids of the imported objects.\n\n| Parameter | Type | |\n|---|---|---|\n| `design` | `str` | required |\n| `collection` | `str` | optional — None = the tool default |\n| `metal` | `str` | optional — None = the tool default |","metadata":{"title":"Boutique","section":"ra.boutique.insert()","url":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiqueinsert","source":"https://www.rhinoartisan.com/docs/scripting/python/boutique/#raboutiqueinsert","collection":"scripting","hash":"3bed1161f8fc3a2f583777cf4c5e7ac0","indexed_by":"docs-index"}},{"content":"Bypass\n\nBypass shanks whose arms cross past each other.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.BypassApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Bypass` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Bypass` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a bypass shank -- the ArtisanBypass tool, headless: a band whose two arms cross past each other instead of meeting. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `Bypass` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Bypass","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/","collection":"scripting","hash":"572f705962f8a8ea9304c7ca1bc13e02","indexed_by":"docs-index"}},{"content":"Bypass — ra.bypass.all()\n\n```python\nra.bypass.all() -> List[Bypass]\n```\n\n`Bypass` handles for every object of this kind in the active document (empty when there is no document).\n\nra.bypass.bylayer()\n```python\nra.bypass.by_layer(layer_name: str) -> List[Bypass]\n```\n\n`Bypass` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Bypass","section":"ra.bypass.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypassall","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypassall","collection":"scripting","hash":"a83e66f7d73bd090425b15ccc86fee43","indexed_by":"docs-index"}},{"content":"Bypass — ra.bypass.count()\n\n```python\nra.bypass.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.bypass.create()\n```python\nra.bypass.create(finger_diameter=None, top_width=None, top_height=None, bottom_width=None, bottom_height=None, arm_angle=None, arm_height=None, arm_width=None, with_gems=None, gem_size=None, profile=None, plane=None, element=None) -> Bypass\n```\n\nBuilds a bypass shank -- the ArtisanBypass tool, headless: a band whose two arms cross past each other instead of meeting. Millimetres / degrees; omitting keeps the tool default (or the user's saved defaults). `finger_diameter` 0 = the document's finger size. `with_gems` turns on the stone run along the arms. Returns an Bypass handle: use its setters for the rest of the model (the handle covers the full parameter set). `element` = name of a saved bypass element (ra.elements.list(\"ByPass\")) to start from instead of the tool defaults; explicit arguments override it.","metadata":{"title":"Bypass","section":"ra.bypass.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypasscount","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypasscount","collection":"scripting","hash":"a4aa86aab8f2c645cc6e070be8552b3b","indexed_by":"docs-index"}},{"content":"Bypass — ra.bypass.count()\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `top_width` | `float` | optional — None = the tool default |\n| `top_height` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `bottom_height` | `float` | optional — None = the tool default |\n| `arm_angle` | `float` | optional — None = the tool default |\n| `arm_height` | `float` | optional — None = the tool default |\n| `arm_width` | `float` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Bypass","section":"ra.bypass.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypasscount","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypasscount","collection":"scripting","hash":"50eba7e59a226a5bcb535c52d31a8082","indexed_by":"docs-index"}},{"content":"Bypass — ra.bypass.find()\n\n```python\nra.bypass.find(id: IdLike) -> Bypass\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.bypass.selected()\n```python\nra.bypass.selected() -> List[Bypass]\n```\n\n`Bypass` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Bypass","section":"ra.bypass.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypassfind","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#rabypassfind","collection":"scripting","hash":"09c6bb85066d98fbcd71b34a68f8efcd","indexed_by":"docs-index"}},{"content":"Bypass — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nBypass (handle)\nBypass ring shank: two arms that cross past each other instead of meeting. Multiple gems possible, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gems` | BypassGems | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `shank` | BypassShank | | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved ByPass element (ra.elements.list(\"ByPass\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Bypass","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#handles","collection":"scripting","hash":"c9566b12392637b5848a42da0cf4adcc","indexed_by":"docs-index"}},{"content":"Bypass — BypassGems (section)\n\nThe gems row a bypass shank carries along each arm. A live view over the shank's stored parameters: getters read the current values, setters regenerate the shank in place (same Guid) and are license-gated.","metadata":{"title":"Bypass","section":"BypassGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","collection":"scripting","hash":"4bd102b637f89a97056728596755f9b7","indexed_by":"docs-index"}},{"content":"Bypass — BypassGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | arc covered by the row from each tip, degrees |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | mm |\n| `double_prong_setting` | `bool` | yes | |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_enabled` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_visible` | `bool` | yes | |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `end_prong_count` | `int` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `gem_size_end` | `float` | | mm |\n| `gem_size_middle` | `float` | | mm |\n| `gem_size_start` | `float` | | mm |\n| `gradient` | `bool` | yes | Stone-size gradient along the row. |\n| `gradient_middle_position` | `float` | yes | 0..1 |\n| `gradient_points` | `int` | yes | |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_margin` | `float` | yes | mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `margin` | `float` | yes | mm |\n| `min_distance` | `float` | yes | mm |\n| `prong_diameter` | `float` | yes | mm |\n| `prong_distance` | `float` | yes | mm |\n| `prong_grow` | `float` | yes | mm |\n| `prong_height` | `float` | yes | mm |\n| `prong_min_diameter` | `float` | yes | mm |\n| `prong_spacing` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `scallop_gem_height` | `float` | | |\n| `scallop_gem_width` | `float` | | Scalloped-setting proportions (percentages, not mm). |\n| `scallop_prong_height` | `float` | | |","metadata":{"title":"Bypass","section":"BypassGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","collection":"scripting","hash":"47717977a5fed23d0015c37fcf719f89","indexed_by":"docs-index"}},{"content":"Bypass — BypassGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `scallop_prong_width` | `float` | | |\n| `scallop_rail_height` | `float` | | |\n| `scallop_rail_width` | `float` | | |\n| `scallop_remove_channel` | `bool` | yes | |\n| `vertical` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_gem_size_gradient(start: float, middle: float, end: float)` | |\n| `set_scallop_gem(width: float, height: float)` | |\n| `set_scallop_prong(width: float, height: float)` | |\n| `set_scallop_rail(width: float, height: float)` | |","metadata":{"title":"Bypass","section":"BypassGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassgems-section","collection":"scripting","hash":"c491508ec25824f012dd2597ff3026be","indexed_by":"docs-index"}},{"content":"Bypass — BypassShank (section)\n\nThe bypass band: the two band sections, the crossing arms and the optional bridge, plus the per-station cross-sections.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `arm_angle` | `float` | yes | degrees |\n| `arm_height` | `float` | yes | mm |\n| `arm_tangent` | `float` | yes | |\n| `arm_width` | `float` | yes | mm |\n| `bottom_height` | `float` | yes | mm |\n| `bottom_width` | `float` | yes | mm |\n| `bridge_angle` | `float` | yes | degrees |\n| `bridge_diameter` | `float` | yes | mm |\n| `bridge_enabled` | `bool` | yes | |\n| `bridge_thickness` | `float` | yes | mm |\n| `bridge_width` | `float` | yes | mm |\n| `cap_distance` | `float` | yes | mm |\n| `displacement` | `float` | yes | how far the arms pass each other, mm |\n| `displacement_start` | `int` | yes | rail point where the displacement starts |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `shared_profile` | `bool` | yes | every station uses the same profile asset |\n| `stations` | `List[BypassStation]` | yes | |\n| `tip_rotation` | `float` | yes | roll of the tip about the rail tangent, degrees |\n| `top_height` | `float` | yes | mm |\n| `top_width` | `float` | yes | mm |\n| `use_stations` | `bool` | yes | build from Stations instead of the top/bottom gradient |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |\n| `set_station(index: int, position: float, width: float, height: float, profile_name=None)` | |","metadata":{"title":"Bypass","section":"BypassShank (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassshank-section","source":"https://www.rhinoartisan.com/docs/scripting/python/bypass/#bypassshank-section","collection":"scripting","hash":"8cbbb7893f0548a53276cb2a5de6c36f","indexed_by":"docs-index"}},{"content":"Cabochon\n\nCabochon stones and their settings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.CabochonApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Cabochon` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Cabochon` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Creates a cabochon stone (the ArtisanCabochon tool, headless) and adds it to the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Cabochons currently selected in the active doc. |","metadata":{"title":"Cabochon","url":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/","source":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/","collection":"scripting","hash":"9dcc85a318044892e3904ddf8e5171ec","indexed_by":"docs-index"}},{"content":"Cabochon — ra.cabochon.all()\n\n```python\nra.cabochon.all() -> List[Cabochon]\n```\n\n`Cabochon` handles for every object of this kind in the active document (empty when there is no document).\n\nra.cabochon.bylayer()\n```python\nra.cabochon.by_layer(layer_name: str) -> List[Cabochon]\n```\n\n`Cabochon` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Cabochon","section":"ra.cabochon.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochonall","source":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochonall","collection":"scripting","hash":"2d9dfa1dcb865b434babe968d28db088","indexed_by":"docs-index"}},{"content":"Cabochon — ra.cabochon.count()\n\n```python\nra.cabochon.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.cabochon.create()\n```python\nra.cabochon.create(x=None, y=None, z=None, shape=None, type=None, angle=None, girdle_height=None, plane=None, girdle_angle=None) -> Cabochon\n```\n\nCreates a cabochon stone (the ArtisanCabochon tool, headless) and adds it to the active document. Unlike Bezel/AdvancedBezel, a cabochon does NOT wrap a mother gem: it is its own stone, placed on `plane` (omitted = world XY, like the panel's \"add on plane\"). All dimensional arguments are millimetres. Omit (None) to keep the tool's default -- or the user's saved defaults -- for that parameter (x 4, y 8, z 2, angle 15 degrees, girdle_height 1). `shape` accepts case-insensitive CabochonShape names (\"Round\", \"Oval\", \"Rectangular\", \"Heart\", \"Pear\", \"Marquise\", \"Diamond\"); `type` accepts CabochonType names (\"Cabochon\", \"FlatTopSingleBevel\", \"FlatTopDoubleBevel\", \"BuffTopSingleBevel\", \"BuffTopDoubleBevel\"). Omitted/None keeps the default (Round / Cabochon or the saved defaults). Throws ArgumentException for an unknown shape/type name and InvalidOperationException when the geometry fails to compute.\n\n| Parameter | Type | |\n|---|---|---|\n| `x` | `float` | optional — None = the tool default |\n| `y` | `float` | optional — None = the tool default |\n| `z` | `float` | optional — None = the tool default |\n| `shape` | `str` | optional — None = the tool default |\n| `type` | `str` | optional — None = the tool default |\n| `angle` | `Optional[float]` | optional — None = the tool default |\n| `girdle_height` | `Optional[float]` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `girdle_angle` | `Optional[float]` | optional — None = the tool default |","metadata":{"title":"Cabochon","section":"ra.cabochon.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochoncount","source":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochoncount","collection":"scripting","hash":"eff933a70fccd1a2293af564628b00c0","indexed_by":"docs-index"}},{"content":"Cabochon — ra.cabochon.find()\n\n```python\nra.cabochon.find(id: IdLike) -> Cabochon\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.cabochon.selected()\n```python\nra.cabochon.selected() -> List[Cabochon]\n```\n\nCabochons currently selected in the active doc. Empty list if nothing is selected or the selection contains no cabochons.","metadata":{"title":"Cabochon","section":"ra.cabochon.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochonfind","source":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#racabochonfind","collection":"scripting","hash":"c46bccea39112fb8745a402e296e67e5","indexed_by":"docs-index"}},{"content":"Cabochon — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nCabochon (handle)\nA cabochon is its own stone (round / oval / rectangular / ... dome cut): it is not built around a mother gem, so it extends ParametricObject directly and MotherGemId is always None. The setters recompute the stone and replace it in place, keeping its Guid (the same thing the panel does on accept), and take LITERAL values: a 0 angle is a straight wall and a 0 girdle height is no girdle.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees |\n| `cut_type` | `str` | yes | CabochonType name (\"Cabochon\", \"FlatTopSingleBevel\", ...) |\n| `girdle_angle` | `float` | yes | degrees |\n| `girdle_height` | `float` | yes | millimetres |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `shape` | `str` | yes | CabochonShape name (\"Round\", \"Oval\", ...) |\n| `size_x` | `float` | yes | millimetres |\n| `size_y` | `float` | yes | millimetres |\n| `size_z` | `float` | yes | dome height, millimetres |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_size(x: float, y: float, z: float)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Cabochon","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/cabochon/#handles","collection":"scripting","hash":"59d9689276e5e07c303f64cb8857de1f","indexed_by":"docs-index"}},{"content":"Cathedral\n\nCathedral shanks: arms rising toward the setting.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.CathedralApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Cathedral` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Cathedral` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a cathedral ring shank (the ArtisanCathedral tool, headless): a band whose arms rise toward the setting, optionally with a pavé row of gems along the top. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Cathedrals currently selected in the active doc. |","metadata":{"title":"Cathedral","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/","collection":"scripting","hash":"9e1563c0d29b8cdcc82540be76696999","indexed_by":"docs-index"}},{"content":"Cathedral — ra.cathedral.all()\n\n```python\nra.cathedral.all() -> List[Cathedral]\n```\n\n`Cathedral` handles for every object of this kind in the active document (empty when there is no document).\n\nra.cathedral.bylayer()\n```python\nra.cathedral.by_layer(layer_name: str) -> List[Cathedral]\n```\n\n`Cathedral` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Cathedral","section":"ra.cathedral.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralall","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralall","collection":"scripting","hash":"93e690169a10c99e309afbca4019364c","indexed_by":"docs-index"}},{"content":"Cathedral — ra.cathedral.count()\n\n```python\nra.cathedral.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Cathedral","section":"ra.cathedral.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcount","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcount","collection":"scripting","hash":"0d1efe833d7dd25480c272633e49f72b","indexed_by":"docs-index"}},{"content":"Cathedral — ra.cathedral.create()\n\n```python\nra.cathedral.create(top_width=None, top_height=None, bottom_width=None, bottom_height=None, arm_width=None, arm_height=None, finger_diameter=None, with_gems=None, gem_size=None, gems_angle=None, profile=None, plane=None, element=None) -> Cathedral\n```\n\nBuilds a cathedral ring shank (the ArtisanCathedral tool, headless): a band whose arms rise toward the setting, optionally with a pavé row of gems along the top. This is the shank under most halo and solitaire designs. Millimetres; omitting keeps the tool default (or the user's saved defaults): top_width 2.5, top_height 1.9, bottom_width 3.5, bottom_height 1.8, arm_width 4.5, arm_height 3.5. `finger_diameter` 0 = the document's configured finger size. `with_gems` True enables the gem row (`gem_size` default 1.3 mm, `gems_angle` default 180 degrees of the shank covered). `profile` picks a RING_PROFILE asset by name; omitted = the default profile. `plane` omitted = world XY. Returns an Cathedral handle to the new shank. `element` = name of a saved cathedral element (ra.elements.list(\"Cathedral\")) to start from instead of the tool defaults; explicit arguments override it.","metadata":{"title":"Cathedral","section":"ra.cathedral.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcreate","collection":"scripting","hash":"ef67b420ca4f5caeba56a5a002aaed72","indexed_by":"docs-index"}},{"content":"Cathedral — ra.cathedral.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `top_width` | `float` | optional — None = the tool default |\n| `top_height` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `bottom_height` | `float` | optional — None = the tool default |\n| `arm_width` | `float` | optional — None = the tool default |\n| `arm_height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `gems_angle` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Cathedral","section":"ra.cathedral.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralcreate","collection":"scripting","hash":"3ec8398cd0e855ad18fee32c984e697d","indexed_by":"docs-index"}},{"content":"Cathedral — ra.cathedral.find()\n\n```python\nra.cathedral.find(id: IdLike) -> Cathedral\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.cathedral.selected()\n```python\nra.cathedral.selected() -> List[Cathedral]\n```\n\nCathedrals currently selected in the active doc.","metadata":{"title":"Cathedral","section":"ra.cathedral.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralfind","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#racathedralfind","collection":"scripting","hash":"cdeba712754aa46aae796d9a48202446","indexed_by":"docs-index"}},{"content":"Cathedral — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nCathedral (handle)\nCathedral ring shank (multiple gems possible) — no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gems` | CathedralGems | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `shank` | CathedralShank | | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_bottom_height(height: float)` | |\n| `set_bottom_width(width: float)` | |\n| `set_element(element: str)` | Applies a saved Cathedral element (ra.elements.list(\"Cathedral\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `set_top_height(height: float)` | |\n| `set_top_width(width: float)` | Shortcuts for the most common edits — same effect as the equivalent Shank setters. |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Cathedral","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#handles","collection":"scripting","hash":"91aba6735a0857fd9eecba7e06efd7a3","indexed_by":"docs-index"}},{"content":"Cathedral — CathedralGems (section)\n\nThe pavé row a cathedral carries along its top — one run per arm.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees of the band covered by gems (180 = top half) |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | bright-cut width, mm |\n| `double_prong_setting` | `bool` | yes | |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_enabled` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_visible` | `bool` | yes | bake the drill cutters as visible objects |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | how deep the gems sit inside, mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_margin` | `float` | yes | inner margin, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `margin` | `float` | yes | side margin, mm |\n| `min_distance` | `float` | yes | minimum distance between gems, mm |\n| `prong_diameter` | `float` | yes | mm — used when AutomaticProngDiameter is False |\n| `prong_height` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `scallop_gem_height` | `float` | | |\n| `scallop_gem_width` | `float` | | Scalloped-setting proportions (percentages, not mm). |\n| `scallop_prong_height` | `float` | | |\n| `scallop_prong_width` | `float` | | |\n| `scallop_rail_height` | `float` | | |\n| `scallop_rail_width` | `float` | | |\n| `scallop_remove_channel` | `bool` | yes | |\n| `vertical` | `float` | yes | vertical displacement of the row, mm |","metadata":{"title":"Cathedral","section":"CathedralGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralgems-section","collection":"scripting","hash":"df11617fd13d693ee49a15e90a7e913b","indexed_by":"docs-index"}},{"content":"Cathedral — CathedralGems (section)\n\n| Method | |\n|---|---|\n| `set_scallop_gem(width: float, height: float)` | |\n| `set_scallop_prong(width: float, height: float)` | |\n| `set_scallop_rail(width: float, height: float)` | |","metadata":{"title":"Cathedral","section":"CathedralGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralgems-section","collection":"scripting","hash":"2d6c914dcd31a9bb5b4f383a87f91cec","indexed_by":"docs-index"}},{"content":"Cathedral — CathedralShank (section)\n\nThe cathedral band itself: the two band sections, the rising arms and the bridge that spans between them.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `arm_angle` | `float` | yes | degrees |\n| `arm_height` | `float` | yes | how high the arms climb over the finger circle, mm |\n| `arm_tangent` | `float` | yes | tangency of the arm transition |\n| `arm_width` | `float` | yes | opening between the rising arms, mm |\n| `bottom_height` | `float` | yes | mm |\n| `bottom_width` | `float` | yes | band section at the bottom, mm |\n| `bridge_diameter` | `float` | yes | mm |\n| `bridge_enabled` | `bool` | yes | the bridge spanning between the arms |\n| `bridge_fillet` | `float` | yes | mm |\n| `bridge_thickness` | `float` | yes | mm |\n| `bridge_width` | `float` | yes | mm |\n| `cap_distance` | `float` | yes | mm |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `top_height` | `float` | yes | mm |\n| `top_width` | `float` | yes | band section at the top, mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Cathedral","section":"CathedralShank (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralshank-section","source":"https://www.rhinoartisan.com/docs/scripting/python/cathedral/#cathedralshank-section","collection":"scripting","hash":"cb0454cbf5fc87a6d479ab9b406f64b5","indexed_by":"docs-index"}},{"content":"Chain\n\nChains along a curve.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ChainApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Places `copies` transformed copies of the given objects along the curve (alternating odd/even rotations are the tool's advanced options and keep their saved defaults). |","metadata":{"title":"Chain","url":"https://www.rhinoartisan.com/docs/scripting/python/chain/","source":"https://www.rhinoartisan.com/docs/scripting/python/chain/","collection":"scripting","hash":"2769b73500cb94b2cc28ee52ffb212ec","indexed_by":"docs-index"}},{"content":"Chain — ra.chain.create()\n\n```python\nra.chain.create(object_ids: Sequence[IdLike], curve_id: IdLike, copies=None) -> List[str]\n```\n\nPlaces `copies` transformed copies of the given objects along the curve (alternating odd/even rotations are the tool's advanced options and keep their saved defaults). Returns the ids of the copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `curve_id` | `IdLike` | required |\n| `copies` | `int` | optional — None = the tool default |","metadata":{"title":"Chain","section":"ra.chain.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/chain/#rachaincreate","source":"https://www.rhinoartisan.com/docs/scripting/python/chain/#rachaincreate","collection":"scripting","hash":"3652ffbe58884a65721bb70f44806eda","indexed_by":"docs-index"}},{"content":"Channel\n\nChannel settings along a curve.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ChannelApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | Channels are baked as groups carrying RaObjectUserData, so they resolve like the other group-based types. |\n| `by_layer()` | `Channel` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds the channel along `curve_id`. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_curve()` | The channels built on `curve_id`. |\n| `selected()` | `Channel` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Channel","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/","collection":"scripting","hash":"51f2a29ffb39979c6391818af0edcedb","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.all()\n\n```python\nra.channel.all() -> List[Channel]\n```\n\nChannels are baked as groups carrying RaObjectUserData, so they resolve like the other group-based types. Create returns the member ids; these return handles you can read and edit.\n\nra.channel.bylayer()\n```python\nra.channel.by_layer(layer_name: str) -> List[Channel]\n```\n\n`Channel` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Channel","section":"ra.channel.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelall","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelall","collection":"scripting","hash":"8acd2132547d1198abaab61388c771ce","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.count()\n\n```python\nra.channel.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Channel","section":"ra.channel.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcount","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcount","collection":"scripting","hash":"3a63b7846a4681fa3e6be956f63eed81","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.create()\n\n```python\nra.channel.create(curve_id: IdLike, gem_size=None, width=None, height=None, min_distance=None, orientation_ids=None, profile=None, prong_type=None, gem_shape=None, run_mode=None, position_z=None, rotation=None, gem_inside=None, vertical=None, force_even_number=None, prong_height=None) -> List[str]\n```\n\nBuilds the channel along `curve_id`. Millimetres; omitting keeps the tool default (or the user's saved defaults): gem_size 1.8, width 3, height 2, min_distance 0.1. `orientation_ids` optionally orient the channel onto those surfaces/breps. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the tool's default (the \"domed rectangle\" profile when available). Open curves run as a segment, closed curves all the way around, exactly like the tool. Returns the ids of the created objects (metal, then gems), all grouped as one editable Channel.","metadata":{"title":"Channel","section":"ra.channel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcreate","collection":"scripting","hash":"b19c5ba051c5f3d8936808349a9ac5f9","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `gem_size` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `min_distance` | `float` | optional — None = the tool default |\n| `orientation_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `gem_shape` | `str` | optional — None = the tool default |\n| `run_mode` | `str` | optional — None = the tool default |\n| `position_z` | `float` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `vertical` | `float` | optional — None = the tool default |\n| `force_even_number` | `Optional[bool]` | optional — None = the tool default |\n| `prong_height` | `float` | optional — None = the tool default |","metadata":{"title":"Channel","section":"ra.channel.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelcreate","collection":"scripting","hash":"e33f3cb7fd490280a1b5666d5a5f8b85","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.find()\n\n```python\nra.channel.find(id: IdLike) -> Channel\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.channel.forcurve()\n```python\nra.channel.for_curve(curve_id: IdLike) -> List[Channel]\n```\n\nThe channels built on `curve_id`.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |","metadata":{"title":"Channel","section":"ra.channel.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelfind","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelfind","collection":"scripting","hash":"b3020c83239b74695e1064fc872da231","indexed_by":"docs-index"}},{"content":"Channel — ra.channel.selected()\n\n```python\nra.channel.selected() -> List[Channel]\n```\n\n`Channel` handles for the objects of this kind currently selected in the active document.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Channel","section":"ra.channel.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelselected","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#rachannelselected","collection":"scripting","hash":"f9e704c03cabbfadc7a9baea70dad0c4","indexed_by":"docs-index"}},{"content":"Channel — Channel (handle)\n\nA channel setting: the metal rail built along a curve plus the run of stones set into it. Setters regenerate it in place (the group keeps its id) and take LITERAL values -- 0 and negatives are allowed where the parameter is signed.","metadata":{"title":"Channel","section":"Channel (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","collection":"scripting","hash":"f792714249cb768ccdd25bdf96c2a1d0","indexed_by":"docs-index"}},{"content":"Channel — Channel (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `automatic_prong_size` | `bool` | yes | |\n| `boolean_cutters` | `bool` | yes | |\n| `bright_cut` | `float` | yes | |\n| `curve_id` | `str` | | Rhino id of the curve the channel was built on. |\n| `fillet_factor` | `float` | yes | |\n| `flip_curve` | `bool` | yes | reverse the stone order and start point |\n| `force_even_number` | `bool` | yes | |\n| `gem_inside` | `float` | yes | signed |\n| `gem_shape` | `str` | yes | The stones and how they are held. \"ROUND\" or \"PRINCESS\" |\n| `gem_size` | `float` | yes | |\n| `height` | `float` | yes | |\n| `inner_height` | `float` | yes | |\n| `inner_width` | `float` | yes | |\n| `invert_segment` | `bool` | yes | closed curve: take the other arc |\n| `layer_name` | `str` | | |\n| `margin` | `float` | yes | SEGMENT: gap left at each end, mm |\n| `min_distance` | `float` | yes | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `position_z` | `float` | yes | signed |\n| `profile_name` | `str` | | CHANNEL_PROFILE asset name |\n| `prong_distance` | `float` | yes | signed |\n| `prong_end_mode` | `str` | yes | \"SINGLE\" or \"DOUBLE\" |\n| `prong_external_diameter` | `float` | | |\n| `prong_height` | `float` | yes | |\n| `prong_internal_diameter` | `float` | | |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `rotation` | `float` | yes | degrees, signed |\n| `run_mode` | `str` | yes | How much of the curve is used: \"FULL\" (the whole loop) or \"SEGMENT\". |\n| `vertical` | `float` | yes | signed |\n| `width` | `float` | yes | The metal rail section. |","metadata":{"title":"Channel","section":"Channel (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","collection":"scripting","hash":"7e7ce47366f2cf310a129f9bcb4f31e2","indexed_by":"docs-index"}},{"content":"Channel — Channel (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_profile(asset_name: str)` | CHANNEL_PROFILE asset |\n| `set_prong_diameters(external: float, internal_diameter: float)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Channel","section":"Channel (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/channel/#channel-handle","collection":"scripting","hash":"6bcc2b14a032cb8163090eb59f30a11c","indexed_by":"docs-index"}},{"content":"Charm\n\nCharms.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.CharmApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: width 8, height 6, thickness 2.8. |\n\nra.charm.create()\n```python\nra.charm.create(plane=None, width=None, height=None, thickness=None, profile=None, element=None) -> str\n```\n\nDefaults: width 8, height 6, thickness 2.8. `element` = name of a saved Charm element (ra.elements.list(\"Charm\")) to start from; explicit arguments override it (`profile` replaces its curve).\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Charm","url":"https://www.rhinoartisan.com/docs/scripting/python/charm/","source":"https://www.rhinoartisan.com/docs/scripting/python/charm/","collection":"scripting","hash":"0661c9afa02aa95ca2cbd88307d06cd9","indexed_by":"docs-index"}},{"content":"Class Ring\n\nClass rings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ClassRingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `ClassRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `ClassRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a class ring (the ArtisanClassRing tool, headless): a heavy signet-style body with a flat top seat and one stone on it — a faceted gem or a cabochon, regenerated with the ring. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Class rings currently selected in the active doc. |","metadata":{"title":"Class Ring","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/","collection":"scripting","hash":"571d4de93546d90bb738cc5ca396ec62","indexed_by":"docs-index"}},{"content":"Class Ring — ra.classring.all()\n\n```python\nra.class_ring.all() -> List[ClassRing]\n```\n\n`ClassRing` handles for every object of this kind in the active document (empty when there is no document).\n\nra.classring.bylayer()\n```python\nra.class_ring.by_layer(layer_name: str) -> List[ClassRing]\n```\n\n`ClassRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Class Ring","section":"ra.classring.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringall","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringall","collection":"scripting","hash":"a95844651ec8c3ce78086f7cf6a1abc4","indexed_by":"docs-index"}},{"content":"Class Ring — ra.classring.count()\n\n```python\nra.class_ring.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Class Ring","section":"ra.classring.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcount","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcount","collection":"scripting","hash":"493b5414ad7baf70898330e4f63dc145","indexed_by":"docs-index"}},{"content":"Class Ring — ra.classring.create()\n\n```python\nra.class_ring.create(top_width=None, top_height=None, depth=None, offset=None, stand_height=None, bottom_width=None, bottom_height=None, side_width=None, top_surface_height=None, angle=None, gem_shape=None, stone_type=None, cabochon_height=None, move_z=None, finger_diameter=None, plane=None, element=None) -> ClassRing\n```\n\nBuilds a class ring (the ArtisanClassRing tool, headless): a heavy signet-style body with a flat top seat and one stone on it — a faceted gem or a cabochon, regenerated with the ring. Millimetres; omitting keeps the tool default (or the user's saved defaults). Top seat: top_width 2, top_height 3, depth 1, offset 1, stand_height 1. Shank: bottom_width 2, bottom_height 2, side_width 2, top_surface_height 1, angle 3 degrees. `gem_shape` ROUND | OVAL (default) | CUSHION; `stone_type` GEMSTONE (default) | CABOCHON with `cabochon_height` (2) and `moveZ` (stone lift, NaN = default 0). `finger_diameter` 0 = document ring size. `plane` omitted = world ZX (the tool's own frame: finger axis along world Y). `element` = name of a saved ClassRing element (ra.elements.list(\"ClassRing\")) to start from; explicit arguments override it (its finger size is always replaced). Returns an ClassRing handle to the new ring (its stone is a child).","metadata":{"title":"Class Ring","section":"ra.classring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcreate","collection":"scripting","hash":"1ea3b22211fd11039b84ec931ed84d8a","indexed_by":"docs-index"}},{"content":"Class Ring — ra.classring.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `top_width` | `float` | optional — None = the tool default |\n| `top_height` | `float` | optional — None = the tool default |\n| `depth` | `float` | optional — None = the tool default |\n| `offset` | `float` | optional — None = the tool default |\n| `stand_height` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `bottom_height` | `float` | optional — None = the tool default |\n| `side_width` | `float` | optional — None = the tool default |\n| `top_surface_height` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `gem_shape` | `str` | optional — None = the tool default |\n| `stone_type` | `str` | optional — None = the tool default |\n| `cabochon_height` | `float` | optional — None = the tool default |\n| `move_z` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Class Ring","section":"ra.classring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringcreate","collection":"scripting","hash":"55c0e7cb72e8d37ada3e69a4e6cc0807","indexed_by":"docs-index"}},{"content":"Class Ring — ra.classring.find()\n\n```python\nra.class_ring.find(id: IdLike) -> ClassRing\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.classring.selected()\n```python\nra.class_ring.selected() -> List[ClassRing]\n```\n\nClass rings currently selected in the active doc.","metadata":{"title":"Class Ring","section":"ra.classring.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringfind","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#raclassringfind","collection":"scripting","hash":"33882b333a2d9fd85b0b1377f494a471","indexed_by":"docs-index"}},{"content":"Class Ring — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Class Ring","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#handles","collection":"scripting","hash":"a1f0e3707a650e4417902086fee1d77a","indexed_by":"docs-index"}},{"content":"Class Ring — ClassRing (handle)\n\nClass ring (the ArtisanClassRing tool): a signet-like body with a flat top seat holding one stone (faceted gem or cabochon). The stone is a child object regenerated together with the ring — it is NOT a free-standing gem, so it has no MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | |\n| `bottom_height` | `float` | yes | |\n| `bottom_width` | `float` | yes | Shank (mm / degrees) |\n| `cabochon_height` | `float` | yes | |\n| `children` | `List[str]` | | The baked stone (gem or cabochon brep), if any. |\n| `depth` | `float` | yes | |\n| `gem_shape` | `str` | yes | Stone: \"ROUND\" \\| \"OVAL\" \\| \"CUSHION\"; \"GEMSTONE\" \\| \"CABOCHON\". |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `move_z` | `float` | yes | |\n| `object_type` | `str` | | |\n| `offset` | `float` | yes | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `side_width` | `float` | yes | |\n| `stand_height` | `float` | yes | |\n| `stone_type` | `str` | yes | |\n| `top_height` | `float` | yes | |\n| `top_surface_height` | `float` | yes | |\n| `top_width` | `float` | yes | Top seat (mm) |","metadata":{"title":"Class Ring","section":"ClassRing (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#classring-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#classring-handle","collection":"scripting","hash":"c6c8b9348241c21c7a5c3d96034b1ff5","indexed_by":"docs-index"}},{"content":"Class Ring — ClassRing (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved ClassRing element (ra.elements.list(\"ClassRing\")) to this ring: its top, shank and stone replace the current ones, the ring size stays, and the ring and its stone regenerate in place (same id). |\n| `set_finger_diameter(finger_diameter: float)` | |\n| `set_gem(gem_shape=None, stone_type=None, cabochon_height=None, move_z=None)` | |\n| `set_shank(bottom_width=None, bottom_height=None, side_width=None, top_surface_height=None, angle=None)` | |\n| `set_top_side(top_width=None, top_height=None, depth=None, offset=None, stand_height=None)` | Mutations regenerate the ring and its stone in place (same ring Guid; the stone gets a new id) and call LicenseGate.RequireValid() first. |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Class Ring","section":"ClassRing (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#classring-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/class-ring/#classring-handle","collection":"scripting","hash":"3ac0444d0ac0f1711283d1cd7fffe795","indexed_by":"docs-index"}},{"content":"Classic\n\nClassic ring shanks: comfort-fit bands at the document finger size, optionally with a stone row.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ClassicApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Classic` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Classic` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a classic ring shank (the ArtisanClassic tool, headless): a comfort-fit band at the document's finger size, optionally with a row of gems around the top. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Classics currently selected in the active doc. |","metadata":{"title":"Classic","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/","collection":"scripting","hash":"cc24b9b87818cf7abe75c37d29aebc91","indexed_by":"docs-index"}},{"content":"Classic — ra.classic.all()\n\n```python\nra.classic.all() -> List[Classic]\n```\n\n`Classic` handles for every object of this kind in the active document (empty when there is no document).\n\nra.classic.bylayer()\n```python\nra.classic.by_layer(layer_name: str) -> List[Classic]\n```\n\n`Classic` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Classic","section":"ra.classic.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassicall","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassicall","collection":"scripting","hash":"74421869e872df7d05f82cd826b71f7e","indexed_by":"docs-index"}},{"content":"Classic — ra.classic.count()\n\n```python\nra.classic.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.classic.create()\n```python\nra.classic.create(width=None, height=None, finger_diameter=None, with_gems=None, gem_size=None, gems_angle=None, profile=None, plane=None, element=None) -> Classic\n```\n\nBuilds a classic ring shank (the ArtisanClassic tool, headless): a comfort-fit band at the document's finger size, optionally with a row of gems around the top. This is the scriptable way to give a design its ring body. Millimetres; omitting keeps the tool default (or the user's saved defaults): width 3, height 2. `finger_diameter` 0 = the document's configured finger size. `with_gems` True enables the gem row (`gem_size` default 1.2 mm, `gems_angle` default 180 degrees of the shank covered). `profile` picks a RING_PROFILE asset by name; omitted = the default profile. `plane` omitted = world XY. Returns an Classic handle to the new shank. `element` = name of a saved Classic element (ra.elements.list(\"Classic\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `gems_angle` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Classic","section":"ra.classic.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassiccount","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassiccount","collection":"scripting","hash":"9b89e6de6c9a2e829158c33313984855","indexed_by":"docs-index"}},{"content":"Classic — ra.classic.find()\n\n```python\nra.classic.find(id: IdLike) -> Classic\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.classic.selected()\n```python\nra.classic.selected() -> List[Classic]\n```\n\nClassics currently selected in the active doc.","metadata":{"title":"Classic","section":"ra.classic.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassicfind","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#raclassicfind","collection":"scripting","hash":"50b742ac10fef003c006f44899d452e1","indexed_by":"docs-index"}},{"content":"Classic — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nClassic (handle)\nClassic ring shank (multiple gems possible) — no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `advanced` | ClassicAdvanced | | |\n| `bottom_profile` | ClassicProfile | | |\n| `external_profile` | ClassicExternalProfile | | |\n| `gems` | ClassicGems | | |\n| `layer_name` | `str` | | |\n| `mid_profile` | ClassicProfile | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `top_profile` | ClassicProfile | | Parameter sections — each is a live view over the shank's stored parameters; their setters regenerate the shank in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Classic element (ra.elements.list(\"Classic\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `set_height(height: float)` | |\n| `set_width(width: float)` | Shortcuts for the two most common edits — same effect as TopProfile.SetWidth / TopProfile.SetHeight. |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Classic","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#handles","collection":"scripting","hash":"e9169a8497908523bfe878fafeb88884","indexed_by":"docs-index"}},{"content":"Classic — ClassicAdvanced (section)\n\nThe classic shank's Advanced section: the opening at the bottom of the band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `cut_bumping` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `cut_length` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `opening_type` | `str` | yes | \"NONE\", \"CUT\" or \"STRANGLE\" |\n| `strangle_base_x` | `float` | | mm |\n| `strangle_base_y` | `float` | | mm |\n| `strangle_base_z` | `float` | | mm |\n| `strangle_opening` | `float` | yes | mm — used when OpeningType is \"STRANGLE\" |\n\n| Method | |\n|---|---|\n| `set_strangle_base(x: float, y: float, z: float)` | |","metadata":{"title":"Classic","section":"ClassicAdvanced (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicadvanced-section","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicadvanced-section","collection":"scripting","hash":"2fba8e30554b2710a6ce2ae07c423fb8","indexed_by":"docs-index"}},{"content":"Classic — ClassicProfile (section)\n\nOne of the shank's three section profiles (top / mid / bottom). The top profile is always enabled; mid and bottom are optional.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `comfort` | `float` | yes | mm — used when Type is \"COMFORT\" |\n| `displacement` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `height` | `float` | yes | mm |\n| `orientation` | `int` | yes | 0 = Natural, 1 = Reverse (flips the profile curve) |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees |\n| `thickness` | `float` | yes | mm — used when Type is \"THICKNESS\" |\n| `type` | `str` | yes | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Classic","section":"ClassicProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicprofile-section","collection":"scripting","hash":"243a5ab3035a169dc1fa26a4ba907dab","indexed_by":"docs-index"}},{"content":"Classic — ClassicExternalProfile (section)\n\nThe optional external profile carved on the shank's outside face.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom` | `float` | yes | external height at the bottom, mm |\n| `enabled` | `bool` | yes | |\n| `mid` | `float` | yes | external height at the middle, mm |\n| `profile_name` | `str` | | EXTERNAL_RING_PROFILE asset name, \"\" when unset |\n| `top` | `float` | yes | external height at the top, mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | EXTERNAL_RING_PROFILE asset by name — list them with ra.assets.list(\"EXTERNAL_RING_PROFILE\") |","metadata":{"title":"Classic","section":"ClassicExternalProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicexternalprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicexternalprofile-section","collection":"scripting","hash":"dcbaeef2c2fbb4501158e59c8186543b","indexed_by":"docs-index"}},{"content":"Classic — ClassicGems (section)\n\nThe gems row a shank can carry around its band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees of the band covered by gems (180 = top half) |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | bright-cut width, mm |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | how deep the gems sit inside, mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `margin` | `float` | yes | side margin, mm |\n| `min_distance` | `float` | yes | minimum distance between gems, mm |\n| `prong_diameter` | `float` | yes | mm — used when AutomaticProngDiameter is False |\n| `prong_height` | `float` | yes | mm |\n| `prong_move_in_z` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `vertical` | `float` | yes | vertical displacement of the row, mm |","metadata":{"title":"Classic","section":"ClassicGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/classic/#classicgems-section","collection":"scripting","hash":"26d074ffd80bdfc60ac4903661762813","indexed_by":"docs-index"}},{"content":"Cluster\n\nCluster settings around a centre stone.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ClusterApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Cluster` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Cluster` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a cluster of small stones around an existing gem -- the ArtisanCluster tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Cluster` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Clusters currently selected in the active doc. |","metadata":{"title":"Cluster","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/","collection":"scripting","hash":"7595850131dd6fb155d5c807e66660af","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.all()\n\n```python\nra.cluster.all() -> List[Cluster]\n```\n\n`Cluster` handles for every object of this kind in the active document (empty when there is no document).\n\nra.cluster.bylayer()\n```python\nra.cluster.by_layer(layer_name: str) -> List[Cluster]\n```\n\n`Cluster` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Cluster","section":"ra.cluster.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterall","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterall","collection":"scripting","hash":"870f0bb95432a284600b37bec2506310","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.count()\n\n```python\nra.cluster.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Cluster","section":"ra.cluster.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercount","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercount","collection":"scripting","hash":"c6ea11c62c9ff6b582f9529d54eb7c5c","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.create()\n\n```python\nra.cluster.create(gem_id: IdLike, stone_size=None, stone_distance=None, distance_to_gem=None, prong_number=None, prong_diameter=None, rail_diameter=None, double_rail=None, rail_diameter2=None, prong_orientation=None, internal_prong_diameter=None, external_prong_diameter=None, central_prong_diameter=None, stones_z_position=None, stones_rotation=None, element=None) -> Cluster\n```\n\nBuilds a cluster of small stones around an existing gem -- the ArtisanCluster tool, headless. `gem_id` must be a gem in the active document with a cluster-friendly shape (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER); the kernel picks the matching shape variant internally. Millimetres; omitting keeps the tool default (or the user's saved defaults): stone_size 1.6, stone_distance 0.2, distance_to_gem 1.0, prong_diameter 0.8 (applied to the internal, external and central prongs alike), rail_diameter 1.0. `prong_number` is 3, 4 or 5 (default 4). `element` = name of a saved Cluster element (ra.elements.list(\"Cluster\")) to start from instead of the defaults; explicit arguments override it. Returns an Cluster handle to the new cluster group.","metadata":{"title":"Cluster","section":"ra.cluster.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercreate","collection":"scripting","hash":"a73e2be456c121c02e9f0271c22612ca","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `stone_size` | `float` | optional — None = the tool default |\n| `stone_distance` | `float` | optional — None = the tool default |\n| `distance_to_gem` | `float` | optional — None = the tool default |\n| `prong_number` | `int` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `rail_diameter` | `float` | optional — None = the tool default |\n| `double_rail` | `Optional[bool]` | optional — None = the tool default |\n| `rail_diameter2` | `float` | optional — None = the tool default |\n| `prong_orientation` | `str` | optional — None = the tool default |\n| `internal_prong_diameter` | `float` | optional — None = the tool default |\n| `external_prong_diameter` | `float` | optional — None = the tool default |\n| `central_prong_diameter` | `float` | optional — None = the tool default |\n| `stones_z_position` | `float` | optional — None = the tool default |\n| `stones_rotation` | `float` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Cluster","section":"ra.cluster.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclustercreate","collection":"scripting","hash":"69c803ec682f2395b02f2b8229c08c35","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.find()\n\n```python\nra.cluster.find(id: IdLike) -> Cluster\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.cluster.forgem()\n```python\nra.cluster.for_gem(gem_id: IdLike) -> List[Cluster]\n```\n\n`Cluster` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Cluster","section":"ra.cluster.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterfind","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterfind","collection":"scripting","hash":"f467f4eb04d9190974557d88a101d5b0","indexed_by":"docs-index"}},{"content":"Cluster — ra.cluster.selected()\n\n```python\nra.cluster.selected() -> List[Cluster]\n```\n\nClusters currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Cluster","section":"ra.cluster.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterselected","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#raclusterselected","collection":"scripting","hash":"cc4e5ffb5fa8388aaf252c96f2c5054a","indexed_by":"docs-index"}},{"content":"Cluster — Cluster (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `central_prong_diameter` | `float` | yes | |\n| `cluster_stone_count` | `int` | | Stones forming the cluster (around the center gem) |\n| `cluster_stone_size` | `float` | | |\n| `cluster_stone_weight` | `float` | | |\n| `cluster_total_weight` | `float` | | |\n| `distance_to_gem` | `float` | yes | |\n| `double_rail` | `bool` | yes | |\n| `external_prong_diameter` | `float` | yes | |\n| `fillet_factor` | `float` | yes | |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `internal_prong_diameter` | `float` | yes | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong_count` | `int` | yes | 3, 4 or 5 |\n| `prong_orientation` | `str` | yes | \"CURVE\" \\| \"CENTER\" |\n| `rail_diameter1` | `float` | yes | |\n| `rail_diameter2` | `float` | yes | |\n| `stone_distance` | `float` | yes | |\n| `stone_size` | `float` | yes | Current values. Millimetres / degrees; several are signed. |\n| `stones_rotation` | `float` | yes | signed |\n| `stones_z_position` | `float` | yes | signed |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_base_height(height: float)` | |\n| `set_base_move_in_z(move_in_z: float)` | signed |\n| `set_base_width(width: float)` | |\n| `set_element(element: str)` | Applies a saved Cluster element (ra.elements.list(\"Cluster\")) to this cluster: its parameters replace the current ones, the mother gem stays, and the cluster regenerates in place (same id). |\n| `set_prong_diameter(diameter: float)` | all three families at once |\n| `set_rail_move_in_z1(move_in_z: float)` | signed |\n| `set_rail_move_in_z2(move_in_z: float)` | signed |","metadata":{"title":"Cluster","section":"Cluster (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#cluster-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#cluster-handle","collection":"scripting","hash":"184037bbb81c75c4dee5e21ff5812c0c","indexed_by":"docs-index"}},{"content":"Cluster — Cluster (handle)\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Cluster","section":"Cluster (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#cluster-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/cluster/#cluster-handle","collection":"scripting","hash":"7361c8becfe777b06facee4769f70a86","indexed_by":"docs-index"}},{"content":"Curve\n\nCurve helpers for jewelry layouts.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.CurveApi`.","metadata":{"title":"Curve","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/","collection":"scripting","hash":"655c4e4f4a6555e59364253b7b18274b","indexed_by":"docs-index"}},{"content":"Curve — Functions\n\n| Function | |\n|---|---|\n| `add_sketches()` | Replicates the ArtisanAddSketches panel's Accept: places reference sketch images on the faces of a 10 x 10 x 10 mm box at the origin -- two textured surfaces per image (top: z=0 and z=10; front: y=0 and y=10; side: x=0 and x=10, the far one mirrored), rendered display mode, all in one group. |\n| `advanced()` | Replicates ArtisanAdvancedCurve: a degree-3 control-point curve through `points`, mirrored by `symmetry` (NONE \\| X \\| Y \\| XY -- the \"Quad\" option), optionally closed, plus an offset copy with connecting lines when `offset` != 0 (default 1 mm; NaN/omitted = default, 0 = no offset). |\n| `auto_join()` | Replicates ArtisanAutoJoin: joins the open, visible curves of the document whose ends touch (document tolerance), like running _Join on all of them. |\n| `connect()` | Replicates ArtisanCurveConnect: an arc blend leaving `first_id` at the point of its surface closest to `first_point` (along the normal) and arriving at `second_id` near `second_point` against its normal. |\n| `cross()` | Replicates the ArtisanCrossBuilder panel's Accept: a closed cross outline centred at the world origin (the panel does the same), stored as a parametric CrossCustomObject on the primary user layer. |\n| `infinite()` | Replicates ArtisanInfiniteCurve: a very long line (`type` LINE, centred on `base_point`) or ray (RAY, starting at `base_point`) used as a construction reference. |\n| `infinite_loop()` | Replicates ArtisanInfiniteLoopCurve: a closed lemniscate (\"infinity symbol\") interpolated through sampled points, centred at `center`. |\n| `iso_curves()` | Replicates ArtisanIsoCurve: extracts the isocurve(s) of `surface_id` (a surface, or the face of a solid nearest to `point`) passing through the point of the surface closest to `point`. |","metadata":{"title":"Curve","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#functions","collection":"scripting","hash":"1dc6be22d3853d11a8c702b693a43265","indexed_by":"docs-index"}},{"content":"Curve — Functions\n\n| Function | |\n|---|---|\n| `waves()` | Replicates ArtisanWaves: a smooth wave (`waves` full periods, default 3, peak-to-peak `height` mm, default 3) flowed along `curve_id` from its start to its end. |","metadata":{"title":"Curve","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#functions","collection":"scripting","hash":"0264026f63d715a6055ce5ccc3f80285","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.addsketches()\n\n```python\nra.curve.add_sketches(top_image_path=None, front_image_path=None, side_image_path=None) -> List[str]\n```\n\nReplicates the ArtisanAddSketches panel's Accept: places reference sketch images on the faces of a 10 x 10 x 10 mm box at the origin -- two textured surfaces per image (top: z=0 and z=10; front: y=0 and y=10; side: x=0 and x=10, the far one mirrored), rendered display mode, all in one group. Give at least one image path (PNG/JPG). Returns the ids of the surfaces added.\n\n| Parameter | Type | |\n|---|---|---|\n| `top_image_path` | `str` | optional — None = the tool default |\n| `front_image_path` | `str` | optional — None = the tool default |\n| `side_image_path` | `str` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.addsketches()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveaddsketches","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveaddsketches","collection":"scripting","hash":"05c1be7084769ca0c0da0c0501ddbc8f","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.advanced()\n\n```python\nra.curve.advanced(points: Sequence[PointLike], sharp_indices=None, symmetry=None, close=None, offset=None, plane=None) -> List[str]\n```\n\nReplicates ArtisanAdvancedCurve: a degree-3 control-point curve through `points`, mirrored by `symmetry` (NONE | X | Y | XY -- the \"Quad\" option), optionally closed, plus an offset copy with connecting lines when `offset` != 0 (default 1 mm; NaN/omitted = default, 0 = no offset). `sharp_indices` are 0-based indices of the points picked with Shift in the command (kinks). `plane` is the symmetry/offset plane; omitted = the active view's construction plane. Returns the ids of the curves added to the primary user layer.\n\n| Parameter | Type | |\n|---|---|---|\n| `points` | `Sequence[PointLike]` | required |\n| `sharp_indices` | `Sequence[int]` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |\n| `close` | `bool` | optional — None = the tool default |\n| `offset` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.advanced()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveadvanced","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveadvanced","collection":"scripting","hash":"f4d7a79f71f2a3fc5f392595b339b685","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.autojoin()\n\n```python\nra.curve.auto_join(curve_ids=None) -> List[str]\n```\n\nReplicates ArtisanAutoJoin: joins the open, visible curves of the document whose ends touch (document tolerance), like running _Join on all of them. `curve_ids` restricts the candidates (closed curves are always skipped); None/empty = every visible curve. Curves that do not touch anything are left untouched. Each joined result keeps the attributes of its first member. Returns the ids of the NEW joined curves.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.autojoin()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveautojoin","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveautojoin","collection":"scripting","hash":"054bcb5735c87697df7d9a05647e5177","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.connect()\n\n```python\nra.curve.connect(first_id: IdLike, first_point: PointLike, second_id: IdLike, second_point: PointLike) -> str\n```\n\nReplicates ArtisanCurveConnect: an arc blend leaving `first_id` at the point of its surface closest to `first_point` (along the normal) and arriving at `second_id` near `second_point` against its normal. Both ids must be solids/surfaces (breps); the two may be the same object. The result is a ConnectCurveCustomObject that remembers both parents. Returns the curve id.\n\n| Parameter | Type | |\n|---|---|---|\n| `first_id` | `IdLike` | required |\n| `first_point` | `PointLike` | required |\n| `second_id` | `IdLike` | required |\n| `second_point` | `PointLike` | required |","metadata":{"title":"Curve","section":"ra.curve.connect()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveconnect","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveconnect","collection":"scripting","hash":"280d41b910a8409fe02a11de30cb329e","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.cross()\n\n```python\nra.curve.cross(width=None, height=None, thickness=None, displacement=None, radius=None, mode=None) -> str\n```\n\nReplicates the ArtisanCrossBuilder panel's Accept: a closed cross outline centred at the world origin (the panel does the same), stored as a parametric CrossCustomObject on the primary user layer. Defaults come from the user's saved Cross Builder defaults, else width 4, height 6, thickness 1, displacement 1, mode ROUND. `mode` is NONE | ROUND | CHAMFER; `radius` is the corner radius for ROUND/CHAMFER (0 = saved default, minimum 0.1 like the panel). Returns the curve id.\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `displacement` | `float` | optional — None = the tool default |\n| `radius` | `float` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.cross()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurvecross","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurvecross","collection":"scripting","hash":"cc24d9d0b9f297726f88d47798c33d13","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.infinite()\n\n```python\nra.curve.infinite(base_point: PointLike, mode=None, second_point=None, third_point=None, angle=None, length=None, type=None, use_c_plane=None) -> str\n```\n\nReplicates ArtisanInfiniteCurve: a very long line (`type` LINE, centred on `base_point`) or ray (RAY, starting at `base_point`) used as a construction reference. `mode` chooses the direction: TWO_POINTS (needs second_point) | HORIZONTAL | VERTICAL | ANGLE (uses `angle` in degrees) | AXIS_X | AXIS_Y | AXIS_Z | BISECTOR (needs second_point and third_point: bisector of the angle they form at base_point) HORIZONTAL/VERTICAL/ANGLE follow the active construction plane when `useCPlane` is True, else World XY. `length` 0 = 10x the scene's bounding-box diagonal (minimum 1000 mm). Returns the line id.\n\n| Parameter | Type | |\n|---|---|---|\n| `base_point` | `PointLike` | required |\n| `mode` | `str` | optional — None = the tool default |\n| `second_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `third_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `length` | `float` | optional — None = the tool default |\n| `type` | `str` | optional — None = the tool default |\n| `use_c_plane` | `bool` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.infinite()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveinfinite","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveinfinite","collection":"scripting","hash":"20d8bcd74817f7b28198fcf0b01b11b0","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.infiniteloop()\n\n```python\nra.curve.infinite_loop(center: PointLike, kind=None, width=None, height_ratio=None, height=None, flat_bottom=None, samples=None, rotation=None, use_c_plane=None) -> str\n```\n\nReplicates ArtisanInfiniteLoopCurve: a closed lemniscate (\"infinity symbol\") interpolated through sampled points, centred at `center`. `kind` BERNOULLI (default) or GERONO; `width` total width in mm (default 100); `height_ratio` scales the natural lobe height (default 0.5); `height` lifts the strands in Z at the crossing so one passes over the other (0 = flat; signed); `flat_bottom` raises only the upper lobe; `samples` points per loop (default 180); `rotation` in degrees around the plane normal; plane = active CPlane or World XY. Returns the curve id.\n\n| Parameter | Type | |\n|---|---|---|\n| `center` | `PointLike` | required |\n| `kind` | `str` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height_ratio` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `flat_bottom` | `bool` | optional — None = the tool default |\n| `samples` | `int` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `use_c_plane` | `bool` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.infiniteloop()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveinfiniteloop","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveinfiniteloop","collection":"scripting","hash":"85b4990b3f371648a8f91836bf3f7270","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.isocurves()\n\n```python\nra.curve.iso_curves(surface_id: IdLike, point: PointLike, direction=None) -> List[str]\n```\n\nReplicates ArtisanIsoCurve: extracts the isocurve(s) of `surface_id` (a surface, or the face of a solid nearest to `point`) passing through the point of the surface closest to `point`. `direction` U | V | BOTH (default U). Each result is a smart IsoCurveCustomObject (remembers its surface) on the primary user layer. Returns the ids (1 or 2 curves).\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_id` | `IdLike` | required |\n| `point` | `PointLike` | required |\n| `direction` | `str` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.isocurves()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveisocurves","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurveisocurves","collection":"scripting","hash":"981d857c492a53c8fb8159597733ef03","indexed_by":"docs-index"}},{"content":"Curve — ra.curve.waves()\n\n```python\nra.curve.waves(curve_id: IdLike, waves=None, height=None) -> str\n```\n\nReplicates ArtisanWaves: a smooth wave (`waves` full periods, default 3, peak-to-peak `height` mm, default 3) flowed along `curve_id` from its start to its end. Plain curve added with the document's current attributes; the source curve is left untouched. Returns the new curve id.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `waves` | `int` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |","metadata":{"title":"Curve","section":"ra.curve.waves()","url":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurvewaves","source":"https://www.rhinoartisan.com/docs/scripting/python/curve/#racurvewaves","collection":"scripting","hash":"aa09be03e94d8b7411da709dbb1745bd","indexed_by":"docs-index"}},{"content":"Cutter\n\nThe cutters that carve the seat of a stone into the metal.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.CutterApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Cutter` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Cutter` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds one cutter per gem (the ArtisanCutters tool, headless): the cutting/drilling solid used to open the gem seat in the metal. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Cutter` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Cutters currently selected in the active doc. |","metadata":{"title":"Cutter","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/","collection":"scripting","hash":"45dc7eb13d7ebe1aa39589ce4939c09c","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.all()\n\n```python\nra.cutter.all() -> List[Cutter]\n```\n\n`Cutter` handles for every object of this kind in the active document (empty when there is no document).\n\nra.cutter.bylayer()\n```python\nra.cutter.by_layer(layer_name: str) -> List[Cutter]\n```\n\n`Cutter` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Cutter","section":"ra.cutter.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterall","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterall","collection":"scripting","hash":"84be74f822bac8ba5ddc285d1adeb7f3","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.count()\n\n```python\nra.cutter.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Cutter","section":"ra.cutter.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercount","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercount","collection":"scripting","hash":"896267c3df81f17b33427c72d0cd3f7c","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.create()\n\n```python\nra.cutter.create(gem_ids=None, size_top=None, size_bottom=None, size_drill=None, height_top=None, height_crown=None, height_girdle=None, height_pavilion=None, height_drill=None, gem_inside=None, drill_type=None, fit_to_gem=None, clearance=None) -> List[Cutter]\n```\n\nBuilds one cutter per gem (the ArtisanCutters tool, headless): the cutting/drilling solid used to open the gem seat in the metal. `gem_ids` None/empty = the currently selected gems. Size arguments are PERCENTAGES of the gem size (the tool's own convention), except `gem_inside`, which is millimetres added to the gem outline (negative shrinks). Pass 0 to keep the tool default (size_top 40, size_bottom 40, size_drill 40, height_top 100, height_crown 34, height_girdle 3, height_pavilion 71). `height_drill` uses -1 as \"keep default (200)\" because 0 is meaningful: it disables the drill body entirely. `drill_type` -1 keeps the default; valid values are 0 = gem shape, 1 = round, 2 = square, 3 = hexagon. Same geometry as the panel: the size arguments scale the gem outline, the heights are % of the gem height, and the pavilion is a straight cone from the girdle outline to one point `height_pavilion` % below it. It does not follow the real pavilion of fancy cuts (cushion, oval...), where it can sit inside the stone just below the girdle: raise height_pavilion / height_girdle or give gem_inside a positive margin when the cutter must enclose the stone. `fit_to_gem` True computes gem_inside, height_girdle and height_pavilion per gem so the cutter encloses the gem's real girdle and pavilion with `clearance` mm (NaN = 0.05), overriding those three arguments; the crown, top and drill stay as given. Returns one Cutter handle per gem, in input order.","metadata":{"title":"Cutter","section":"ra.cutter.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercreate","collection":"scripting","hash":"e43443a63d3ce29b0c32901939756434","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `size_top` | `float` | optional — None = the tool default |\n| `size_bottom` | `float` | optional — None = the tool default |\n| `size_drill` | `float` | optional — None = the tool default |\n| `height_top` | `float` | optional — None = the tool default |\n| `height_crown` | `float` | optional — None = the tool default |\n| `height_girdle` | `float` | optional — None = the tool default |\n| `height_pavilion` | `float` | optional — None = the tool default |\n| `height_drill` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `drill_type` | `int` | optional — None = the tool default |\n| `fit_to_gem` | `bool` | optional — None = the tool default |\n| `clearance` | `float` | optional — None = the tool default |","metadata":{"title":"Cutter","section":"ra.cutter.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercreate","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racuttercreate","collection":"scripting","hash":"70440e79a27f6ba265a94fad2bcfd7eb","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.find()\n\n```python\nra.cutter.find(id: IdLike) -> Cutter\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.cutter.forgem()\n```python\nra.cutter.for_gem(gem_id: IdLike) -> List[Cutter]\n```\n\n`Cutter` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Cutter","section":"ra.cutter.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterfind","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterfind","collection":"scripting","hash":"58184251f98d695257fd524c9a1a29a4","indexed_by":"docs-index"}},{"content":"Cutter — ra.cutter.selected()\n\n```python\nra.cutter.selected() -> List[Cutter]\n```\n\nCutters currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nCutter (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `drill_type` | `int` | yes | 0 gem shape, 1 round, 2 square, 3 hexagon |\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `height_crown` | `float` | yes | |\n| `height_drill` | `float` | yes | |\n| `height_girdle` | `float` | yes | |\n| `height_pavilion` | `float` | yes | |\n| `height_top` | `float` | yes | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `size_bottom` | `float` | yes | |\n| `size_drill` | `float` | yes | |\n| `size_top` | `float` | yes | Sizes and heights are PERCENTAGES of the mother gem, except GemInside which is millimetres. 0 is legal for all of them (a 0 drill height means no drill body at all). |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `fit_to_gem(clearance=None)` | Fit to gem: sets GemInside, HeightGirdle and HeightPavilion so the cutter encloses this gem's real pavilion and girdle with `clearance` mm (NaN = 0.05). |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Cutter","section":"ra.cutter.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterselected","source":"https://www.rhinoartisan.com/docs/scripting/python/cutter/#racutterselected","collection":"scripting","hash":"09592a80a02311e25f1c101b90d502b8","indexed_by":"docs-index"}},{"content":"Document\n\nThe document: open/save/new, computation mode, metals, ring size, STL/PDF/GLB exports.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.DocumentApi`.","metadata":{"title":"Document","url":"https://www.rhinoartisan.com/docs/scripting/python/document/","source":"https://www.rhinoartisan.com/docs/scripting/python/document/","collection":"scripting","hash":"8bdc257c9d02536f2ae36e85a734ce56","indexed_by":"docs-index"}},{"content":"Document — Functions\n\n| Function | |\n|---|---|\n| `get_computation_mode()` | Current computation mode as a string (\"Render\" or \"Manufacturing\"). |\n| `get_metals()` | The document's metals by position, honoring how many the document uses (1, 2 or 3 entries). |\n| `get_path()` | Full path of the active document, or empty for an unsaved document. |\n| `get_ring_size()` | The document's current finger size, or None when the document has no ring size (non-ring designs). |\n| `glb()` | Exports the whole document to a GLB file (the same conversion the Realtime Render pipeline uses). |\n| `glb_batch()` | Converts every .3dm in `folder` (and its subfolders when `recursive`) to a GLB next to it, with the same conversion as Glb() -- the configurator's batch export (ArtisanConfFolderToGlb) without touching the open document: each file is read on its own, in the background. |\n| `is_modified()` | True when the active document has unsaved changes. |\n| `new()` | Creates a new document, replacing the active one — like File > New, but without the template picker: `template` is a .3dm template file path, or None for Rhino's default template. |\n| `open()` | Opens a 3dm file. |\n| `refresh_all()` | Regenerates the parametric objects, exactly like the Outliner's Refresh button: by default only the ones flagged as pending (RequireRegenerate — e.g. |\n| `report_pdf()` | Exports a layout page to a 300-dpi PDF (vector where possible). |\n| `ring_size_regions()` | The available sizing regions (\"EU\", \"US\", ...) for SetRingSize. |\n| `save()` | Saves the active document. |\n| `save_copy()` | Saves a COPY of the active document to `path` (File > SaveCopyAs): the document keeps its own path and modified state, you keep working in the original file — checkpoints and versioning from a flow. |","metadata":{"title":"Document","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#functions","collection":"scripting","hash":"81625026a00e6cf732f8080958a2c640","indexed_by":"docs-index"}},{"content":"Document — Functions\n\n| Function | |\n|---|---|\n| `set_computation_mode()` | Switches the computation mode, exactly like the Outliner's Rendering/Manufacturing selector: when the mode actually changes, every parametric object is REGENERATED at the new quality (a long operation on heavy documents). |\n| `set_metal()` | Sets a document metal, exactly like the Outliner's metal selector: the change re-applies the metal materials on the layers. |\n| `set_ring_size()` | Changes the ring's finger size, exactly like the Outliner's size selector: the parametric ring geometry is UPDATED to the new size and every object refreshed (long on heavy documents). |\n| `set_ring_size_by_diameter()` | Same, but from an inner diameter in mm -- resolves to the nearest catalog size of `region` (omitted = the document's current region). |\n| `stl()` | Exports geometry to a binary STL for 3D printing: everything visible, or only the current selection with `only_selection`. |","metadata":{"title":"Document","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#functions","collection":"scripting","hash":"7ee3cc663ba5fa74d22ef510b5d53e3f","indexed_by":"docs-index"}},{"content":"Document — ra.document.getcomputationmode()\n\n```python\nra.document.get_computation_mode() -> str\n```\n\nCurrent computation mode as a string (\"Render\" or \"Manufacturing\").\n\nra.document.getmetals()\n```python\nra.document.get_metals() -> List[str]\n```\n\nThe document's metals by position, honoring how many the document uses (1, 2 or 3 entries).\n\nra.document.getpath()\n```python\nra.document.get_path() -> str\n```\n\nFull path of the active document, or empty for an unsaved document.","metadata":{"title":"Document","section":"ra.document.getcomputationmode()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentgetcomputationmode","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentgetcomputationmode","collection":"scripting","hash":"28603cd79deedc66412f67c712a49b2f","indexed_by":"docs-index"}},{"content":"Document — ra.document.getringsize()\n\n```python\nra.document.get_ring_size() -> RingSizeInfo\n```\n\nThe document's current finger size, or None when the document has no ring size (non-ring designs).\n\nra.document.glb()\n```python\nra.document.glb(path: str) -> str\n```\n\nExports the whole document to a GLB file (the same conversion the Realtime Render pipeline uses).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |","metadata":{"title":"Document","section":"ra.document.getringsize()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentgetringsize","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentgetringsize","collection":"scripting","hash":"862dffa896fb626b77bd441e8df99d6c","indexed_by":"docs-index"}},{"content":"Document — ra.document.glbbatch()\n\n```python\nra.document.glb_batch(folder: str, recursive=None, overwrite=None) -> List[GlbBatchItem]\n```\n\nConverts every .3dm in `folder` (and its subfolders when `recursive`) to a GLB next to it, with the same conversion as Glb() -- the configurator's batch export (ArtisanConfFolderToGlb) without touching the open document: each file is read on its own, in the background. GLBs already there are kept unless `overwrite`. Returns one row per file.\n\n| Parameter | Type | |\n|---|---|---|\n| `folder` | `str` | required |\n| `recursive` | `bool` | optional — None = the tool default |\n| `overwrite` | `bool` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.glbbatch()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentglbbatch","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentglbbatch","collection":"scripting","hash":"ba4acd4ed94ca62a4e0c051efb753f31","indexed_by":"docs-index"}},{"content":"Document — ra.document.ismodified()\n\n```python\nra.document.is_modified() -> bool\n```\n\nTrue when the active document has unsaved changes.\n\nra.document.new()\n```python\nra.document.new(template=None, discard_changes=None)\n```\n\nCreates a new document, replacing the active one — like File > New, but without the template picker: `template` is a .3dm template file path, or None for Rhino's default template. Fails on unsaved changes unless `discard_changes` is True.\n\n| Parameter | Type | |\n|---|---|---|\n| `template` | `str` | optional — None = the tool default |\n| `discard_changes` | `bool` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.ismodified()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentismodified","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentismodified","collection":"scripting","hash":"1d234d3ac09d8ba38e01be3ca0f958db","indexed_by":"docs-index"}},{"content":"Document — ra.document.open()\n\n```python\nra.document.open(path: str, discard_changes=None) -> str\n```\n\nOpens a 3dm file. The active document is replaced, like File > Open. Fails when the current document has unsaved changes, unless `discard_changes` is True (there is never a save prompt). Returns the full path opened.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `discard_changes` | `bool` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.open()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentopen","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentopen","collection":"scripting","hash":"d2e4acc5310d628939a7a497887aabcc","indexed_by":"docs-index"}},{"content":"Document — ra.document.refreshall()\n\n```python\nra.document.refresh_all(force=None)\n```\n\nRegenerates the parametric objects, exactly like the Outliner's Refresh button: by default only the ones flagged as pending (RequireRegenerate — e.g. children whose mother moved); `force` True regenerates EVERYTHING (the button's double-click), a long operation on heavy documents.\n\n| Parameter | Type | |\n|---|---|---|\n| `force` | `bool` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.refreshall()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentrefreshall","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentrefreshall","collection":"scripting","hash":"f4014fc9fffd1ff966427cd5fc136ea8","indexed_by":"docs-index"}},{"content":"Document — ra.document.reportpdf()\n\n```python\nra.document.report_pdf(path: str, page_name=None) -> str\n```\n\nExports a layout page to a 300-dpi PDF (vector where possible). `page_name` defaults to \"Template\" -- the layout the report-template tools produce. Throws listing the available layouts when the page doesn't exist (the underlying service only logged it).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `page_name` | `str` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.reportpdf()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentreportpdf","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentreportpdf","collection":"scripting","hash":"2fe21609a3a80f0d5b3818c7514964a4","indexed_by":"docs-index"}},{"content":"Document — ra.document.ringsizeregions()\n\n```python\nra.document.ring_size_regions() -> List[str]\n```\n\nThe available sizing regions (\"EU\", \"US\", ...) for SetRingSize.\n\nra.document.save()\n```python\nra.document.save(path=None) -> str\n```\n\nSaves the active document. With `path` it saves a copy there and the document adopts that path (File > Save As); without it the document must already have a path. Returns the full path written.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.ringsizeregions()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentringsizeregions","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentringsizeregions","collection":"scripting","hash":"d5ff67f612924c9aaf1ef31cee4a1b82","indexed_by":"docs-index"}},{"content":"Document — ra.document.savecopy()\n\n```python\nra.document.save_copy(path: str) -> str\n```\n\nSaves a COPY of the active document to `path` (File > SaveCopyAs): the document keeps its own path and modified state, you keep working in the original file — checkpoints and versioning from a flow. Returns the full path written.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |","metadata":{"title":"Document","section":"ra.document.savecopy()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsavecopy","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsavecopy","collection":"scripting","hash":"351b253ce2c86cfe3c0e4398979a21c8","indexed_by":"docs-index"}},{"content":"Document — ra.document.setcomputationmode()\n\n```python\nra.document.set_computation_mode(mode: str)\n```\n\nSwitches the computation mode, exactly like the Outliner's Rendering/Manufacturing selector: when the mode actually changes, every parametric object is REGENERATED at the new quality (a long operation on heavy documents). \"Render\" = smooth display quality; \"Manufacturing\" = production-accurate geometry.\n\n| Parameter | Type | |\n|---|---|---|\n| `mode` | `str` | required |","metadata":{"title":"Document","section":"ra.document.setcomputationmode()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetcomputationmode","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetcomputationmode","collection":"scripting","hash":"2237c29a28f70519a48e20dc39b60d37","indexed_by":"docs-index"}},{"content":"Document — ra.document.setmetal()\n\n```python\nra.document.set_metal(metal: str, position=None)\n```\n\nSets a document metal, exactly like the Outliner's metal selector: the change re-applies the metal materials on the layers. metal Metal enum name (\"GOLD_YELLOW_18\", \"PLATINUM\", ... -- see ra.weight.metals()) position 0 (default) = the WHOLE document uses this metal (single-metal mode); 1, 2 or 3 = that metal position (using different metals per position turns the document into a 2- or 3-metal design, as in the Outliner).\n\n| Parameter | Type | |\n|---|---|---|\n| `metal` | `str` | required |\n| `position` | `int` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.setmetal()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetmetal","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetmetal","collection":"scripting","hash":"d1e18dd9c14f5a026dcb040547f49744","indexed_by":"docs-index"}},{"content":"Document — ra.document.setringsize()\n\n```python\nra.document.set_ring_size(region: str, size: str)\n```\n\nChanges the ring's finger size, exactly like the Outliner's size selector: the parametric ring geometry is UPDATED to the new size and every object refreshed (long on heavy documents). `region` accepts the catalog ids (\"USA\", \"EUROPE\", \"BRITISH\", ...) and the common short aliases (\"US\", \"EU\", \"UK\", ...). Only valid on ring designs with a current size.\n\n| Parameter | Type | |\n|---|---|---|\n| `region` | `str` | required |\n| `size` | `str` | required |","metadata":{"title":"Document","section":"ra.document.setringsize()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetringsize","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetringsize","collection":"scripting","hash":"4506880f101f2961a28a44a41c57d19f","indexed_by":"docs-index"}},{"content":"Document — ra.document.setringsizebydiameter()\n\n```python\nra.document.set_ring_size_by_diameter(diameter: float, region=None)\n```\n\nSame, but from an inner diameter in mm -- resolves to the nearest catalog size of `region` (omitted = the document's current region).\n\n| Parameter | Type | |\n|---|---|---|\n| `diameter` | `float` | required |\n| `region` | `str` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.setringsizebydiameter()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetringsizebydiameter","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentsetringsizebydiameter","collection":"scripting","hash":"3cfb9222ad451f1879714cd8ed39ff22","indexed_by":"docs-index"}},{"content":"Document — ra.document.stl()\n\n```python\nra.document.stl(path: str, only_selection=None) -> str\n```\n\nExports geometry to a binary STL for 3D printing: everything visible, or only the current selection with `only_selection`. Runs Rhino's native STL exporter with its default meshing parameters.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `only_selection` | `bool` | optional — None = the tool default |","metadata":{"title":"Document","section":"ra.document.stl()","url":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentstl","source":"https://www.rhinoartisan.com/docs/scripting/python/document/#radocumentstl","collection":"scripting","hash":"b0af35b80ebea293c53eb39a37f5f686","indexed_by":"docs-index"}},{"content":"Drafting\n\nReports, gems maps, cost tables, dimensions.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.DraftingApi`, `ArtisanPlugin.Scripting.DraftingExtraApi`.","metadata":{"title":"Drafting","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/","collection":"scripting","hash":"83b8cef657fa2354d0fe44cc191ff0a3","indexed_by":"docs-index"}},{"content":"Drafting — Functions\n\n| Function | |\n|---|---|\n| `create_breakdown_table()` | Draws one of the four Breakdown cost tables into the document at `point` (the ArtisanBreakdownMetals / ArtisanBreakdownGems / ArtisanBreakdownProcesses / ArtisanBreakdownExtras commands without their pick prompt). |\n| `create_gems_map()` | Draws the gems map (the 2D stone chart: one colored circle + size label per gem in the document) centered at `point`, same as the ArtisanGemsMap command but without the pick prompt. |\n| `create_gems_table()` | Draws the gems list table (the ArtisanGemsList command family) starting at `point`: one row per distinct gem with SHAPE, size \"X x Y\", carats, quantity, total carats and compound, rows 1.5 units apart, in black. |\n| `create_metals_table()` | Draws the metals weight table (the ArtisanMetalsList / ArtisanMetalsListBySelection commands without their checklist dialog and prompts) at `point`: a header row (Weight / Processed) and one row per requested metal with the estimated cast weight computed from the summed volume of the measured objects -- gems are skipped; Breps, extrusions, meshes and SubDs count. |\n| `create_report()` | Creates the A4 report layout page for the current design (same as the ArtisanReport command): logo, four detail views (top, perspective, front, side), title block with name, metal + weight, finger size, notes and date. |\n| `create_report_from_template()` | Creates a report from a TEMPLATE (the Report panel's Create button, headless): imports the template's layout as the next \"Report N\" page, zooms every detail, and replaces the template tags ([CLIENT_ID], [PO], [STYLE], [CAD_DESIGNER], [DESCRIPTION], metals, [PRODUCT_SIZE], custom fields...) plus the special list markers (METAL_LIST, GEM_LIST, PROCESS_LIST, EXTRA_LIST, GEM_MAP). |","metadata":{"title":"Drafting","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","collection":"scripting","hash":"ec4ff32948f548d75ca06b973c34d408","indexed_by":"docs-index"}},{"content":"Drafting — Functions\n\n| Function | |\n|---|---|\n| `export_gems_list()` | Writes the gems list as a semicolon-delimited CSV (same columns as the ArtisanGemsListToExcel command: Shape, Size X, Size Y, Carats, Quantity, Total Carats), without the save-file dialog. |\n| `generate_dimensions()` | Generic auto-dimensioning of the design. |\n| `generate_dimensions_by_box()` | Bounding-box dimensions (the ArtisanGenerateDimensionsByBox command without its selection prompt): meshes the given objects together at low resolution and draws three linear dimensions around the global bounding box -- width in X above the model, depth in Y at its right and the real height in Z. |\n| `generate_dimensions_from_bangle()` | Bangle dimensions (the ArtisanGenerateDimensionsFromBangle command without its selection prompt): meshes the given objects together at low resolution, sections the mesh with the world XY / YZ planes and dimensions the four cross sections (top, bottom, left, right) plus the two global spans between them. |\n| `generate_dimensions_from_ring()` | Ring-specific dimensions: bottom, top and size annotations built from the ring mesh and the document's finger size. |\n| `report_templates()` | The report template names available to CreateReportFromTemplate — the *.3dm files in the configured report-templates folder, without extension. |\n| `add_logo()` | Creates the report logo file from the given objects (same as ArtisanAddLogo): copies them, scales the copies so the largest extent is 28 mm, centers them at (65, 25, 0), exports the copies as logo.3dm in the Artisan user folder and deletes the copies. |\n| `apply_artisan_layout()` | Applies the Artisan window layout (ArtisanLayout / the ribbon's Window Layout button): imports ArtisanSkin.rhw and activates the \"Artisan\" layout. |","metadata":{"title":"Drafting","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","collection":"scripting","hash":"a3f65ce82554e238aafa9792aeb78d9b","indexed_by":"docs-index"}},{"content":"Drafting — Functions\n\n| Function | |\n|---|---|\n| `create_technical_chart()` | The technical chart (ArtisanTechnicalChart panel, headless): the production breakdown WITHOUT prices — per metal the net weight, waste, total and wax weight, volume and surface area; the gems by shape and size with carats and setting type; the setting, printing and extra processes. |\n| `export_gems_list_by_ids()` | Writes the gems list of the given gems as a semicolon-delimited CSV (ArtisanGemsListToExcelBySelection / ...BySelectionGroups without the pick and the save dialog; columns Shape, Size X, Size Y, Carats, Quantity, Total Carats). |\n| `open_report_template()` | Opens a report template for editing (ArtisanOpenReportTemplate without the file dialog). |\n| `reduce_dimensions()` | Reduces the DISPLAYED value of distance dimensions by `percentage` (same as ArtisanDimensionsReduce / ...BySelection): only the text is overridden, the geometry is untouched. |\n| `restore_dimensions()` | Restores distance dimensions to their real measured value by putting back the \"<>\" placeholder (same as ArtisanDimensionsRestore / ...BySelection). |\n| `save_report_template()` | Saves the ACTIVE document as a report template (ArtisanSaveReportTemplate without the save dialog): a \"Save As\" into the report-templates folder, so the document adopts that path. |","metadata":{"title":"Drafting","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#functions","collection":"scripting","hash":"1a6697c2d62ed87446e6e4305685ce9e","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.createbreakdowntable()\n\n```python\nra.drafting.create_breakdown_table(category: str, point: PointLike, scale=None)\n```\n\nDraws one of the four Breakdown cost tables into the document at `point` (the ArtisanBreakdownMetals / ArtisanBreakdownGems / ArtisanBreakdownProcesses / ArtisanBreakdownExtras commands without their pick prompt). One method instead of four because the commands are identical except for the table they draw. category METALS | GEMS | PROCESSES | EXTRAS (case-insensitive). point insertion point (top-left corner of the table). scale layout / text-height scale factor; None = the tool default (2). Like the commands, when no breakdown has been computed yet (or it is empty) it is computed first from the active manufacturer -- the commands ask with a yes/no dialog, here it happens silently through the same engine ra.pricing.calculate() uses. The texts are grouped as BREAKDOWN_METALS / BREAKDOWN_GEMS / BREAKDOWN_PROCESSES / BREAKDOWN_EXTRAS respectively.\n\n| Parameter | Type | |\n|---|---|---|\n| `category` | `str` | required |\n| `point` | `PointLike` | required |\n| `scale` | `float` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.createbreakdowntable()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatebreakdowntable","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatebreakdowntable","collection":"scripting","hash":"5fd79e9818b613a511a2a54cf677ac0f","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.creategemsmap()\n\n```python\nra.drafting.create_gems_map(point: PointLike, scale=None, spherical=None, expand_overlapping=None)\n```\n\nDraws the gems map (the 2D stone chart: one colored circle + size label per gem in the document) centered at `point`, same as the ArtisanGemsMap command but without the pick prompt. scale drawing scale factor (command default 2; valid 0.01-10) spherical False = planar projection (default), True = spherical expand_overlapping True = push overlapping circles apart so every label is readable The resulting curves/texts/hatches are grouped as \"GEMS_MAP\". With no gems in the document it draws nothing and reports it on the command line, same as the command.\n\n| Parameter | Type | |\n|---|---|---|\n| `point` | `PointLike` | required |\n| `scale` | `float` | optional — None = the tool default |\n| `spherical` | `bool` | optional — None = the tool default |\n| `expand_overlapping` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.creategemsmap()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreategemsmap","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreategemsmap","collection":"scripting","hash":"3f33a5f848b193d6740066688ed050f3","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.creategemstable()\n\n```python\nra.drafting.create_gems_table(point: PointLike, only_selection=None, group_by_selection=None)\n```\n\nDraws the gems list table (the ArtisanGemsList command family) starting at `point`: one row per distinct gem with SHAPE, size \"X x Y\", carats, quantity, total carats and compound, rows 1.5 units apart, in black. only_selection True = only the currently selected gems (the ArtisanGemsListBySelection command); False = every visible gem in the document (ArtisanGemsList). group_by_selection True = the ArtisanGemsListBySelectionGroups variant: the SELECTED gems are bucketed by their Rhino group and drawn as one sub-table per group, each with the group's name as a header row (plus an \"Ungrouped\" section for gems in no group). Implies only_selection. The texts are grouped as \"GEMS_LIST\" (\"GEMS_LIST_BY_SELECTION_GROUPS\" for the grouped variant). With no visible gems it draws nothing, like the command; the selection variants throw when the selection holds no gems, mirroring the commands' cancel.\n\n| Parameter | Type | |\n|---|---|---|\n| `point` | `PointLike` | required |\n| `only_selection` | `bool` | optional — None = the tool default |\n| `group_by_selection` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.creategemstable()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreategemstable","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreategemstable","collection":"scripting","hash":"5228a09f649feffa2360497686592166","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.createmetalstable()\n\n```python\nra.drafting.create_metals_table(point: PointLike, metals: Sequence[str], include_wax=None, only_selection=None)\n```\n\nDraws the metals weight table (the ArtisanMetalsList / ArtisanMetalsListBySelection commands without their checklist dialog and prompts) at `point`: a header row (Weight / Processed) and one row per requested metal with the estimated cast weight computed from the summed volume of the measured objects -- gems are skipped; Breps, extrusions, meshes and SubDs count. The Processed column is the weight after finishing (the configured processed-weight percentage removed); the wax row has none. Everything is added to a new unnamed group, like the commands. metals Metal enum names to list (the command's checklist: GOLD_24 ... PALLADIUM), case-insensitive. Rows keep the checklist order regardless of input order. include_wax True = append the wax weight row (the checklist's Wax entry), using the configured wax density. only_selection True = measure only the currently selected objects (ArtisanMetalsListBySelection); False = every non-hidden object in the document.\n\n| Parameter | Type | |\n|---|---|---|\n| `point` | `PointLike` | required |\n| `metals` | `Sequence[str]` | required |\n| `include_wax` | `bool` | optional — None = the tool default |\n| `only_selection` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.createmetalstable()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatemetalstable","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatemetalstable","collection":"scripting","hash":"61cae4dd863a79d52d3d730af59b2be3","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.createreport()\n\n```python\nra.drafting.create_report() -> bool\n```\n\nCreates the A4 report layout page for the current design (same as the ArtisanReport command): logo, four detail views (top, perspective, front, side), title block with name, metal + weight, finger size, notes and date. Returns True when the command reports success. Implemented by invoking the command itself -- it needs no input, and wrapping it keeps the report identical to the one users get from the ribbon (and picks up future improvements automatically).","metadata":{"title":"Drafting","section":"ra.drafting.createreport()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatereport","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatereport","collection":"scripting","hash":"62c241c6d74ca974f72eb4cc218749d6","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.createreportfromtemplate()\n\n```python\nra.drafting.create_report_from_template(template=None, style=None, client_id=None, po=None, cad_designer=None, description=None, custom_fields=None, spherical_gems_map=None) -> str\n```\n\nCreates a report from a TEMPLATE (the Report panel's Create button, headless): imports the template's layout as the next \"Report N\" page, zooms every detail, and replaces the template tags ([CLIENT_ID], [PO], [STYLE], [CAD_DESIGNER], [DESCRIPTION], metals, [PRODUCT_SIZE], custom fields...) plus the special list markers (METAL_LIST, GEM_LIST, PROCESS_LIST, EXTRA_LIST, GEM_MAP). template template name from ReportTemplates(); None = the first one (the panel's default selection) style/client_id/po/cad_designer/description the title-block fields; None keeps the value the document already carries (the panel's fields) custom_fields extra [MY_FIELD] tag values by field name; merged over the document's saved custom fields spherical_gems_map projection of the GEM_MAP marker The breakdown is recomputed silently when missing (the tags read it). Returns the name of the new layout page (e.g. \"Report 1\") — print it to PDF with ra.document.report_pdf(path, page_name: that_name).\n\n| Parameter | Type | |\n|---|---|---|\n| `template` | `str` | optional — None = the tool default |\n| `style` | `str` | optional — None = the tool default |\n| `client_id` | `str` | optional — None = the tool default |\n| `po` | `str` | optional — None = the tool default |\n| `cad_designer` | `str` | optional — None = the tool default |\n| `description` | `str` | optional — None = the tool default |\n| `custom_fields` | `Dict[str, str]` | optional — None = the tool default |\n| `spherical_gems_map` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.createreportfromtemplate()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatereportfromtemplate","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingcreatereportfromtemplate","collection":"scripting","hash":"f8194333c6d2797e938098c2f9904d63","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.exportgemslist()\n\n```python\nra.drafting.export_gems_list(path: str, only_selection=None, use_system_decimals=None) -> str\n```\n\nWrites the gems list as a semicolon-delimited CSV (same columns as the ArtisanGemsListToExcel command: Shape, Size X, Size Y, Carats, Quantity, Total Carats), without the save-file dialog. path destination file; \".csv\" is appended when missing only_selection True = only the currently selected gems use_system_decimals True = format numbers with the system's decimal separator (the command's \"Force Point\" option inverted); default is invariant (point) Returns the full path actually written.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `only_selection` | `bool` | optional — None = the tool default |\n| `use_system_decimals` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.exportgemslist()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingexportgemslist","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingexportgemslist","collection":"scripting","hash":"e4ce88681406e873c21782345557f222","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.generatedimensions()\n\n```python\nra.drafting.generate_dimensions() -> bool\n```\n\nGeneric auto-dimensioning of the design.\n\nra.drafting.generatedimensionsbybox()\n```python\nra.drafting.generate_dimensions_by_box(object_ids: Sequence[IdLike], offset=None, add_box=None)\n```\n\nBounding-box dimensions (the ArtisanGenerateDimensionsByBox command without its selection prompt): meshes the given objects together at low resolution and draws three linear dimensions around the global bounding box -- width in X above the model, depth in Y at its right and the real height in Z. Exactly like the command, the low resolution analysis mesh and a marker point at the Y dimension's plane origin are also left in the document. object_ids objects to dimension (the command's selection). offset gap between the geometry and the dimension lines (the command's Offset option; default 2, valid 0-100). add_box True = also add the bounding box as a Brep (the command's Box option).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `offset` | `float` | optional — None = the tool default |\n| `add_box` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.generatedimensions()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensions","collection":"scripting","hash":"472d5706560096d8022d35c762c2a9a2","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.generatedimensionsfrombangle()\n\n```python\nra.drafting.generate_dimensions_from_bangle(object_ids: Sequence[IdLike], offset=None, add_box=None)\n```\n\nBangle dimensions (the ArtisanGenerateDimensionsFromBangle command without its selection prompt): meshes the given objects together at low resolution, sections the mesh with the world XY / YZ planes and dimensions the four cross sections (top, bottom, left, right) plus the two global spans between them. The bangle is expected centered on the world origin, like the command expects. object_ids objects to dimension (the command's selection). offset gap between the geometry and the dimension lines (the command's Offset option; default 2, valid 0-100). add_box True = also add the bounding box as a Brep (the command's Box option).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `offset` | `float` | optional — None = the tool default |\n| `add_box` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.generatedimensionsfrombangle()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensionsfrombangle","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensionsfrombangle","collection":"scripting","hash":"1005e29850c76234387c1864e0dd20ab","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.generatedimensionsfromring()\n\n```python\nra.drafting.generate_dimensions_from_ring() -> bool\n```\n\nRing-specific dimensions: bottom, top and size annotations built from the ring mesh and the document's finger size.\n\nra.drafting.reporttemplates()\n```python\nra.drafting.report_templates() -> List[str]\n```\n\nThe report template names available to CreateReportFromTemplate — the *.3dm files in the configured report-templates folder, without extension. Read-only.","metadata":{"title":"Drafting","section":"ra.drafting.generatedimensionsfromring()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensionsfromring","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftinggeneratedimensionsfromring","collection":"scripting","hash":"65842e0c057406fca9568a2c14d9051c","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.addlogo()\n\n```python\nra.drafting.add_logo(ids: Sequence[IdLike]) -> str\n```\n\nCreates the report logo file from the given objects (same as ArtisanAddLogo): copies them, scales the copies so the largest extent is 28 mm, centers them at (65, 25, 0), exports the copies as logo.3dm in the Artisan user folder and deletes the copies. The originals are untouched. Returns the full path of logo.3dm.\n\n| Parameter | Type | |\n|---|---|---|\n| `ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Drafting","section":"ra.drafting.addlogo()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingaddlogo","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingaddlogo","collection":"scripting","hash":"20d8f9d9434a43be5f4ea0ddbf71d16b","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.applyartisanlayout()\n\n```python\nra.drafting.apply_artisan_layout() -> bool\n```\n\nApplies the Artisan window layout (ArtisanLayout / the ribbon's Window Layout button): imports ArtisanSkin.rhw and activates the \"Artisan\" layout. Rhino 8 or later only. Returns True when applied.\n\nra.drafting.createtechnicalchart()\n```python\nra.drafting.create_technical_chart(path=None, quote_certified=None) -> TechnicalChartResult\n```\n\nThe technical chart (ArtisanTechnicalChart panel, headless): the production breakdown WITHOUT prices — per metal the net weight, waste, total and wax weight, volume and surface area; the gems by shape and size with carats and setting type; the setting, printing and extra processes. The breakdown is recomputed first (the panel's Create button) and stored in the document. path optional export: \".xlsx\" (the panel's Excel, no prices) or \".json\" (the raw breakdown object); None = no file quote_certified False = skip the live Nivoda quote of certified diamonds (faster, offline) Returns the chart as data (plus Path when a file was written).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | optional — None = the tool default |\n| `quote_certified` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.applyartisanlayout()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingapplyartisanlayout","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingapplyartisanlayout","collection":"scripting","hash":"49d4f32c77c83f4316ca28e75fd9ada0","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.exportgemslistbyids()\n\n```python\nra.drafting.export_gems_list_by_ids(path: str, ids=None, group_by_rhino_groups=None, use_system_decimals=None) -> str\n```\n\nWrites the gems list of the given gems as a semicolon-delimited CSV (ArtisanGemsListToExcelBySelection / ...BySelectionGroups without the pick and the save dialog; columns Shape, Size X, Size Y, Carats, Quantity, Total Carats). Non-gem ids are ignored. ids gem ids; None = every visible gem group_by_rhino_groups True = one section per Rhino group the gems belong to (group name as header) plus an \"Ungrouped Gems\" section at the end use_system_decimals True = system decimal separator (default point) Returns the full path written (\".csv\" appended when missing).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `group_by_rhino_groups` | `bool` | optional — None = the tool default |\n| `use_system_decimals` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.exportgemslistbyids()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingexportgemslistbyids","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingexportgemslistbyids","collection":"scripting","hash":"e26597c4169ea3be315bb0e431542709","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.openreporttemplate()\n\n```python\nra.drafting.open_report_template(template: str, save_changes_first=None, discard_changes=None) -> str\n```\n\nOpens a report template for editing (ArtisanOpenReportTemplate without the file dialog). The active document is REPLACED by the template file — every id of the previous document becomes invalid. template name from ra.drafting.report_templates() or a full .3dm path save_changes_first True = save the current document before (it must already have a path) discard_changes True = lose unsaved changes silently Fails when the document has unsaved changes and neither flag is set. Returns the full path opened.\n\n| Parameter | Type | |\n|---|---|---|\n| `template` | `str` | required |\n| `save_changes_first` | `bool` | optional — None = the tool default |\n| `discard_changes` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.openreporttemplate()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingopenreporttemplate","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingopenreporttemplate","collection":"scripting","hash":"03387490c393ff7ffea76a2cfd1a530b","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.reducedimensions()\n\n```python\nra.drafting.reduce_dimensions(percentage=None, ids=None) -> DimensionValueReport\n```\n\nReduces the DISPLAYED value of distance dimensions by `percentage` (same as ArtisanDimensionsReduce / ...BySelection): only the text is overridden, the geometry is untouched. Metal shrinks when cast, so plans often need the pre-shrinkage value. Angular dimensions and dimensions already overridden are skipped. percentage 0 = the command default (5); valid 0-100 ids dimension ids; None = every dimension in the document Returns the counts: Changed and Skipped (already overridden).\n\n| Parameter | Type | |\n|---|---|---|\n| `percentage` | `float` | optional — None = the tool default |\n| `ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.reducedimensions()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingreducedimensions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingreducedimensions","collection":"scripting","hash":"8342b55c83de89d794e34d92c9397cfe","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.restoredimensions()\n\n```python\nra.drafting.restore_dimensions(ids=None) -> int\n```\n\nRestores distance dimensions to their real measured value by putting back the \"<>\" placeholder (same as ArtisanDimensionsRestore / ...BySelection). Dimensions that already show the real value are left alone. ids dimension ids; None = every dimension in the document Returns the number of dimensions restored.\n\n| Parameter | Type | |\n|---|---|---|\n| `ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.restoredimensions()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingrestoredimensions","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingrestoredimensions","collection":"scripting","hash":"7dc5cf56c24122ffb25148c7249272d9","indexed_by":"docs-index"}},{"content":"Drafting — ra.drafting.savereporttemplate()\n\n```python\nra.drafting.save_report_template(name: str, overwrite=None) -> str\n```\n\nSaves the ACTIVE document as a report template (ArtisanSaveReportTemplate without the save dialog): a \"Save As\" into the report-templates folder, so the document adopts that path. Design a layout page with the [TAGS] first; afterwards it is listed by ra.drafting.report_templates() and usable with ra.drafting.create_report_from_template(name). name template name (\".3dm\" optional) or a full .3dm path overwrite True = replace an existing template of that name Returns the full path written.\n\n| Parameter | Type | |\n|---|---|---|\n| `name` | `str` | required |\n| `overwrite` | `bool` | optional — None = the tool default |","metadata":{"title":"Drafting","section":"ra.drafting.savereporttemplate()","url":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingsavereporttemplate","source":"https://www.rhinoartisan.com/docs/scripting/python/drafting/#radraftingsavereporttemplate","collection":"scripting","hash":"dad8d8901d147a9a84c841fb5248bae1","indexed_by":"docs-index"}},{"content":"Elements\n\nSaved element presets: build from them, apply them, save objects as new ones, organize the library.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ElementsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `count()` | Number of objects of this kind in the active document. |\n| `delete()` | PERMANENTLY deletes a saved element (as the panels' delete does; there is no trash). |\n| `duplicate()` | Copies a saved element as `new_name` (empty = \" (Copy)\"), sharing its preview image. |\n| `export_bundle()` | Exports a saved element as a bundle file (its parameters and preview) to `file_path` (.zip), to share it or move it to another machine. |\n| `find()` | Finds one saved element by name within a type (case-insensitive). |\n| `get_parameters_json()` | The stored parameters of a saved element, as JSON. |\n| `import_bundle()` | Imports an element bundle exported by ExportBundle (or the panels) into the library. |\n| `list()` | The saved elements of one type, newest library order. |\n| `rename()` | Renames a saved element; the new name must be free within its type. |\n| `save_from_object()` | Saves an existing parametric object's parameters as a new element (the panels' \"save as element\"): `object_id` is the object, or any member of a parametric group (bail, basket, halo...); `name` must be new within its type. |\n| `set_favorite()` | Marks or unmarks a saved element as favorite (favorites list first). |\n| `types()` | The element types the library can hold, as the names List() takes. |","metadata":{"title":"Elements","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/","collection":"scripting","hash":"ce2234a36b9a8f322aa72e7e515d1bf6","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.count()\n\n```python\nra.elements.count(type: str) -> int\n```\n\nNumber of objects of this kind in the active document.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n\nra.elements.delete()\n```python\nra.elements.delete(type: str, name: str) -> bool\n```\n\nPERMANENTLY deletes a saved element (as the panels' delete does; there is no trash). Objects built from it are not affected. Returns True when it is gone.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementscount","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementscount","collection":"scripting","hash":"2ca1d134bd6dab41302adfe3281339f6","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.duplicate()\n\n```python\nra.elements.duplicate(type: str, name: str, new_name=None) -> ElementInfo\n```\n\nCopies a saved element as `new_name` (empty = \" (Copy)\"), sharing its preview image.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `new_name` | `str` | optional — None = the tool default |","metadata":{"title":"Elements","section":"ra.elements.duplicate()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsduplicate","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsduplicate","collection":"scripting","hash":"0ced326a08417df372dc4e13d33efc7c","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.exportbundle()\n\n```python\nra.elements.export_bundle(type: str, name: str, file_path: str) -> str\n```\n\nExports a saved element as a bundle file (its parameters and preview) to `file_path` (.zip), to share it or move it to another machine. Returns the written path.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `file_path` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.exportbundle()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsexportbundle","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsexportbundle","collection":"scripting","hash":"c323995f1adc90f14804213c90deaae2","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.find()\n\n```python\nra.elements.find(type: str, name: str) -> ElementInfo\n```\n\nFinds one saved element by name within a type (case-insensitive). Throws listing the available names when it does not match, so a script or an agent can correct itself.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsfind","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsfind","collection":"scripting","hash":"b291e574e0dcf60322236e966f5e51a6","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.getparametersjson()\n\n```python\nra.elements.get_parameters_json(type: str, name: str) -> str\n```\n\nThe stored parameters of a saved element, as JSON. Mostly useful to inspect a preset; the facades take the element by name instead.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.getparametersjson()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsgetparametersjson","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsgetparametersjson","collection":"scripting","hash":"e7d8984b1a5971e5c654d918a2e709a4","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.importbundle()\n\n```python\nra.elements.import_bundle(file_path: str) -> ElementInfo\n```\n\nImports an element bundle exported by ExportBundle (or the panels) into the library. Returns the imported element.\n\n| Parameter | Type | |\n|---|---|---|\n| `file_path` | `str` | required |\n\nra.elements.list()\n```python\nra.elements.list(type: str) -> List[ElementInfo]\n```\n\nThe saved elements of one type, newest library order. `type` is one of Types() -- \"Bezel\", \"Basket\", \"Halo\", \"Peghead\"...\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.importbundle()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsimportbundle","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsimportbundle","collection":"scripting","hash":"e7c361a15b53f7ffe47d3690425e30c2","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.rename()\n\n```python\nra.elements.rename(type: str, name: str, new_name: str) -> ElementInfo\n```\n\nRenames a saved element; the new name must be free within its type.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `new_name` | `str` | required |\n\nra.elements.savefromobject()\n```python\nra.elements.save_from_object(object_id: IdLike, name: str) -> ElementInfo\n```\n\nSaves an existing parametric object's parameters as a new element (the panels' \"save as element\"): `object_id` is the object, or any member of a parametric group (bail, basket, halo...); `name` must be new within its type. No preview image. Returns the saved element.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_id` | `IdLike` | required |\n| `name` | `str` | required |","metadata":{"title":"Elements","section":"ra.elements.rename()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsrename","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementsrename","collection":"scripting","hash":"e205cf3f0d6b0d568a6888bced0a1046","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.setfavorite()\n\n```python\nra.elements.set_favorite(type: str, name: str, favorite=None) -> ElementInfo\n```\n\nMarks or unmarks a saved element as favorite (favorites list first).\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `name` | `str` | required |\n| `favorite` | `bool` | optional — None = the tool default |","metadata":{"title":"Elements","section":"ra.elements.setfavorite()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementssetfavorite","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementssetfavorite","collection":"scripting","hash":"0d3636db11a0d14fa774387f7df0042d","indexed_by":"docs-index"}},{"content":"Elements — ra.elements.types()\n\n```python\nra.elements.types() -> List[str]\n```\n\nThe element types the library can hold, as the names List() takes.","metadata":{"title":"Elements","section":"ra.elements.types()","url":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementstypes","source":"https://www.rhinoartisan.com/docs/scripting/python/elements/#raelementstypes","collection":"scripting","hash":"48d186319b081b803f3ef4b1f002e656","indexed_by":"docs-index"}},{"content":"Engraving\n\nRing engravings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.EngravingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Engraves `text` around a ring of the given inner `diameter` (mm; 0 = the session's current finger size, default 17.35). |","metadata":{"title":"Engraving","url":"https://www.rhinoartisan.com/docs/scripting/python/engraving/","source":"https://www.rhinoartisan.com/docs/scripting/python/engraving/","collection":"scripting","hash":"166bbae1974d2fc92f208c21d9089ee1","indexed_by":"docs-index"}},{"content":"Engraving — ra.engraving.create()\n\n```python\nra.engraving.create(text: str, diameter=None, angle=None, height=None, spacing=None, thickness=None, font=None, font_style=None, horizontal_align=None, vertical_align=None, plane=None) -> List[str]\n```\n\nEngraves `text` around a ring of the given inner `diameter` (mm; 0 = the session's current finger size, default 17.35). `angle` rotates the text around the ring (the tool's gumball, degrees). `thickness` 0 keeps flat engraving curves only; > 0 also builds the solid text. Defaults: font Bienchen regular, height 1.5, spacing 0.5, horizontal align CENTER, vertical align CENTER. `plane` is the text orientation plane (default: active construction plane). Returns the ids of the created objects (solid text on the metal layer, engraving curves on the user layer, all grouped as an editable Engrave Ring component).\n\n| Parameter | Type | |\n|---|---|---|\n| `text` | `str` | required |\n| `diameter` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `spacing` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `font` | `str` | optional — None = the tool default |\n| `font_style` | `str` | optional — None = the tool default |\n| `horizontal_align` | `str` | optional — None = the tool default |\n| `vertical_align` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Engraving","section":"ra.engraving.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/engraving/#raengravingcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/engraving/#raengravingcreate","collection":"scripting","hash":"51f36e2e0ad4227bdce732c84dab0486","indexed_by":"docs-index"}},{"content":"Errors and transactions — ra.transaction()\n\n```python\nwith ra.transaction(\"Move the side stones\"):\n    for g in ra.gems.selected():\n        g.move((0, 0, -0.5))\n```\n\nEvery change made inside the block is one undo step. Leaving the block — normally or by exception — closes the undo record. Mutations need a valid license; read-only calls never do.","metadata":{"title":"Errors and transactions","section":"ra.transaction()","url":"https://www.rhinoartisan.com/docs/scripting/python/errors/#ratransaction","source":"https://www.rhinoartisan.com/docs/scripting/python/errors/#ratransaction","collection":"scripting","hash":"34533b43f01a6a3b5d911966bb655967","indexed_by":"docs-index"}},{"content":"Errors and transactions — Errors\n\nAll of them are plain Python exceptions too (`except Exception` catches them); the message is on `str(e)` and `e.Message`.\n\n| Error | Underlying type | When |\n|---|---|---|\n| `ra.ValidationError` | `ScriptingValidationException` | An argument was rejected before anything was computed: wrong enum name, value out of range, unknown id, malformed JSON. |\n| `ra.ComputeError` | `ScriptingComputeException` | The arguments were accepted but the kernel could not build the geometry; `.Code` carries the kernel key (e.g. INVALID_PROFILE). |\n| `ra.StateError` | `ScriptingStateException` | The document is not in a state where the call makes sense: no active document, the object no longer exists, nothing is selected. |\n| `ra.LicenseError` | `ScriptingNotLicensedException` | The call needs a valid RhinoArtisan license. |\n\n`ra.ArgumentError` is the base of `ValidationError`, `ComputeError` and `LicenseError` (`System.ArgumentException`).","metadata":{"title":"Errors and transactions","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/python/errors/#errors","source":"https://www.rhinoartisan.com/docs/scripting/python/errors/#errors","collection":"scripting","hash":"72611f921fbb7b54c74ea688962aa2dd","indexed_by":"docs-index"}},{"content":"Eternity\n\nEternity bands with stones all around.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.EternityApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Eternity` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Eternity` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds an eternity ring (the ArtisanEternity tool, headless): a band with gems all around, at the document's finger size. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Eternities currently selected in the active doc. |","metadata":{"title":"Eternity","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/","collection":"scripting","hash":"1bb35cacd26347249c1a20db06a80148","indexed_by":"docs-index"}},{"content":"Eternity — ra.eternity.all()\n\n```python\nra.eternity.all() -> List[Eternity]\n```\n\n`Eternity` handles for every object of this kind in the active document (empty when there is no document).\n\nra.eternity.bylayer()\n```python\nra.eternity.by_layer(layer_name: str) -> List[Eternity]\n```\n\n`Eternity` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Eternity","section":"ra.eternity.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternityall","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternityall","collection":"scripting","hash":"bbfc58476a88456e5b6f7c50c61762cd","indexed_by":"docs-index"}},{"content":"Eternity — ra.eternity.count()\n\n```python\nra.eternity.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.eternity.create()\n```python\nra.eternity.create(gem_size=None, gem_shape=None, shank_width=None, shank_height=None, finger_diameter=None, profile=None, plane=None, element=None) -> Eternity\n```\n\nBuilds an eternity ring (the ArtisanEternity tool, headless): a band with gems all around, at the document's finger size. Standalone -- no mother gem or curve needed. Millimetres; omitting keeps the tool default (or the user's saved defaults): gem_size ~2 (round diamonds), shank_width 2.25, shank_height 1.5. `gem_shape` accepts GemShape names (default ROUND). `finger_diameter` 0 = the document's finger size. `plane` omitted = world XY. `profile` picks a RING_PROFILE asset by name for the shank; omitted = the default profile. Returns an Eternity handle to the new ring group. `element` = name of a saved eternity element (ra.elements.list(\"Eternity\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_size` | `float` | optional — None = the tool default |\n| `gem_shape` | `str` | optional — None = the tool default |\n| `shank_width` | `float` | optional — None = the tool default |\n| `shank_height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Eternity","section":"ra.eternity.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternitycount","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternitycount","collection":"scripting","hash":"ebce146b4ad85b282f55e9e17b4926f6","indexed_by":"docs-index"}},{"content":"Eternity — ra.eternity.find()\n\n```python\nra.eternity.find(id: IdLike) -> Eternity\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.eternity.selected()\n```python\nra.eternity.selected() -> List[Eternity]\n```\n\nEternities currently selected in the active doc.","metadata":{"title":"Eternity","section":"ra.eternity.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternityfind","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#raeternityfind","collection":"scripting","hash":"289f2bb69805ec7eee88fc852a1f387a","indexed_by":"docs-index"}},{"content":"Eternity — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nEternity (handle)\nEternity ring: a band with gems all around. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bezels` | EternityBezels | | |\n| `gems` | EternityGems | | Parameter sections — each is a live view over the ring's stored parameters; their setters regenerate the ring in place (same Guid) and call LicenseGate.RequireValid() first. Millimetres. |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prongs` | EternityProngs | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | e.g. \"6\", \"M\" |\n| `ring_size_region` | `str` | | e.g. \"US\", \"EU\" |\n| `shank` | EternityShank | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Eternity element (ra.elements.list(\"Eternity\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Eternity","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#handles","collection":"scripting","hash":"fd08e3d3ff46cc4e44c52d41e8de02c3","indexed_by":"docs-index"}},{"content":"Eternity — EternityBezels (section)\n\nThe bezel rails wrapping the stone row.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_rail` | EternityRail | | |\n| `profile_shape` | `str` | yes | \"ROUND\" or \"SQUARE\" |\n| `rail_mode` | `str` | yes | \"SINGLE\" or \"DOUBLE\" |\n| `rail_shape` | `str` | yes | \"ROUND\", \"RECTANGLE\" or \"OVAL\" |\n| `remove_finger` | `bool` | yes | |\n| `top_rail` | EternityRail | | |","metadata":{"title":"Eternity","section":"EternityBezels (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternitybezels-section","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternitybezels-section","collection":"scripting","hash":"618d1732bcdbe555feadde9c4e22d0f0","indexed_by":"docs-index"}},{"content":"Eternity — EternityGems (section)\n\nThe stones that run around the band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `carat_weight` | `float` | yes | |\n| `distribution` | `str` | yes | \"FULL\", \"HALF\", \"THREEQUARTERS\", \"FIVESTONES\", \"SEVENSTONES\", \"NINESTONES\" |\n| `material` | `str` | yes | \"Diamond\", \"Ruby\", ... |\n| `min_distance` | `float` | yes | minimum distance between stones, mm |\n| `move_in_z` | `float` | yes | radial displacement of the stone row, mm |\n| `orientation` | `str` | yes | \"NATURAL\" or \"ROTATED\" |\n| `shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `size_x` | `float` | | mm |\n| `size_y` | `float` | | mm |\n| `size_z` | `float` | | mm |\n\n| Method | |\n|---|---|\n| `set_size(size_x: float, size_y: float, size_z: float)` | |","metadata":{"title":"Eternity","section":"EternityGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternitygems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternitygems-section","collection":"scripting","hash":"ddf2474dbdce02ed2038374bb8a928e3","indexed_by":"docs-index"}},{"content":"Eternity — EternityProngs (section)\n\nThe prongs holding the stones.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_diameter` | `float` | yes | mm |\n| `bottom_distance` | `float` | yes | mm |\n| `distribution` | `str` | yes | \"SHARED\" or \"INDIVIDUAL_FOR_EACH_GEM\" |\n| `expansion_manufacturing` | `float` | yes | mm |\n| `height_over_girdle` | `float` | yes | mm |\n| `individual_bottom_distance` | `float` | yes | mm — used when Distribution is individual |\n| `individual_top_distance` | `float` | yes | mm — used when Distribution is individual |\n| `mode` | `str` | yes | \"STRAIGHT\" or \"CURVED\" |\n| `top_diameter` | `float` | yes | mm |\n| `top_distance` | `float` | yes | mm |","metadata":{"title":"Eternity","section":"EternityProngs (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityprongs-section","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityprongs-section","collection":"scripting","hash":"3f151493fd1641ae2c5c70407054f27f","indexed_by":"docs-index"}},{"content":"Eternity — EternityShank (section)\n\nThe band: an upper and a lower half plus the caps where they meet.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `ending_cap` | `float` | yes | mm |\n| `lower` | EternityShankParams | | |\n| `starting_cap` | `float` | yes | mm |\n| `upper` | EternityShankParams | | |\n\nEternityRail (section)\nOne of the two rails that form the bezel around the stones.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `diameter` | `float` | yes | mm |\n| `height` | `float` | yes | mm |\n| `move_in_z` | `float` | yes | mm |\n| `thread_diameter` | `float` | yes | mm |\n| `thread_x` | `float` | | mm |\n| `thread_y` | `float` | | mm |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_thread(x: float, y: float)` | |","metadata":{"title":"Eternity","section":"EternityShank (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityshank-section","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityshank-section","collection":"scripting","hash":"fdd0f0820b467610b94890aa1a952ebd","indexed_by":"docs-index"}},{"content":"Eternity — EternityShankParams (section)\n\nOne of the two band halves (upper / lower) of an eternity ring.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `height` | `float` | yes | mm |\n| `height_comfort` | `float` | yes | mm |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `profile_orientation` | `int` | yes | 0 = Natural, 1 = Reverse |\n| `profile_thickness` | `float` | yes | mm |\n| `profile_type` | `int` | yes | |\n| `type` | `str` | yes | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Eternity","section":"EternityShankParams (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityshankparams-section","source":"https://www.rhinoartisan.com/docs/scripting/python/eternity/#eternityshankparams-section","collection":"scripting","hash":"639549834d4988599fd96834171fd036","indexed_by":"docs-index"}},{"content":"File Search\n\nInstant search over indexed design files.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.FileSearchApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `count()` | Number of files currently in the index. |\n| `reindex()` | Rebuilds the index from the configured folders on a background thread and returns immediately -- results of a Search right after may still be from the old index. |\n| `search()` | Searches the file index. |","metadata":{"title":"File Search","url":"https://www.rhinoartisan.com/docs/scripting/python/file-search/","source":"https://www.rhinoartisan.com/docs/scripting/python/file-search/","collection":"scripting","hash":"1dba4388748d1bf2715861d92a5a7b11","indexed_by":"docs-index"}},{"content":"File Search — ra.filesearch.count()\n\n```python\nra.file_search.count() -> int\n```\n\nNumber of files currently in the index.\n\nra.filesearch.reindex()\n```python\nra.file_search.reindex(full=None)\n```\n\nRebuilds the index from the configured folders on a background thread and returns immediately -- results of a Search right after may still be from the old index. `full` forces a clean re-scan.\n\n| Parameter | Type | |\n|---|---|---|\n| `full` | `bool` | optional — None = the tool default |","metadata":{"title":"File Search","section":"ra.filesearch.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/file-search/#rafilesearchcount","source":"https://www.rhinoartisan.com/docs/scripting/python/file-search/#rafilesearchcount","collection":"scripting","hash":"d6c971f30107e63c3fb59b8903878b37","indexed_by":"docs-index"}},{"content":"File Search — ra.filesearch.search()\n\n```python\nra.file_search.search(query: str, max=None) -> List[Any]\n```\n\nSearches the file index. Multiple whitespace-separated tokens must ALL match (order-independent); results are ranked exact-name, starts-with, contains. An EMPTY query returns the most recently modified files. Each entry has: FullPath, FileName, Extension, Size (bytes) and ModifiedUtc.\n\n| Parameter | Type | |\n|---|---|---|\n| `query` | `str` | required |\n| `max` | `int` | optional — None = the tool default |","metadata":{"title":"File Search","section":"ra.filesearch.search()","url":"https://www.rhinoartisan.com/docs/scripting/python/file-search/#rafilesearchsearch","source":"https://www.rhinoartisan.com/docs/scripting/python/file-search/#rafilesearchsearch","collection":"scripting","hash":"b300789cb4d3216674c9dfbd9c8c2d3d","indexed_by":"docs-index"}},{"content":"Files\n\nFile utilities: standardize, elements import/export, layer exports.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.FileApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `export_elements()` | Exports every saved element of one type to a JSON file (the ArtisanExportElementsByType tool, headless) -- the way to carry the user's presets (bezels, baskets, halos...) to another machine. |\n| `import_elements()` | Imports elements into the user's library (the ArtisanImportElementsByFile tool, headless): either a single \".raelement\" bundle (element + preview) or a \".json\" array as written by ExportElements. |\n| `save_as_template()` | Saves the active document as the Artisan template (the ArtisanSaveAsTemplate tool, headless): Rhino's SaveAsTemplate to \" /Templates/template.3dm\", the file ArtisanNew starts from. |\n| `standardize()` | Standardizes a document that came from elsewhere (the ArtisanStandardize tool, headless), running the same sequence as the command: explode every block instance, recover the gems (ArtisanGemsRecover), move solids/meshes to the metal layers (ArtisanOrganizeObjectsByLayers), purge all render materials, re-apply the Artisan design materials, and estimate the ring size. |","metadata":{"title":"Files","url":"https://www.rhinoartisan.com/docs/scripting/python/files/","source":"https://www.rhinoartisan.com/docs/scripting/python/files/","collection":"scripting","hash":"d5fac7e7d74244266b9ecf1bc3d87a5d","indexed_by":"docs-index"}},{"content":"Files — ra.files.exportelements()\n\n```python\nra.files.export_elements(type: str, path: str) -> ElementsExport\n```\n\nExports every saved element of one type to a JSON file (the ArtisanExportElementsByType tool, headless) -- the way to carry the user's presets (bezels, baskets, halos...) to another machine. `type` is one of ra.elements.types() (\"Bezel\", \"Basket\", \"Halo\", \"Peghead\"...); the store's own names (\"ADVANCED_BASKET\") are also accepted. '.json' is appended when missing; the folder is created.\n\n| Parameter | Type | |\n|---|---|---|\n| `type` | `str` | required |\n| `path` | `str` | required |","metadata":{"title":"Files","section":"ra.files.exportelements()","url":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesexportelements","source":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesexportelements","collection":"scripting","hash":"784070cb631c873d4555286a05ab6ed3","indexed_by":"docs-index"}},{"content":"Files — ra.files.importelements()\n\n```python\nra.files.import_elements(path: str) -> ElementsImport\n```\n\nImports elements into the user's library (the ArtisanImportElementsByFile tool, headless): either a single \".raelement\" bundle (element + preview) or a \".json\" array as written by ExportElements. Elements that already exist (same id) are skipped, like the tool; where the tool asks \"add the new ones?\" this just adds them. Returns what was imported.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |","metadata":{"title":"Files","section":"ra.files.importelements()","url":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesimportelements","source":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesimportelements","collection":"scripting","hash":"d483ab33d37fd70e5ab0a591e4ad0346","indexed_by":"docs-index"}},{"content":"Files — ra.files.saveastemplate()\n\n```python\nra.files.save_as_template(path=None) -> str\n```\n\nSaves the active document as the Artisan template (the ArtisanSaveAsTemplate tool, headless): Rhino's SaveAsTemplate to \" /Templates/template.3dm\", the file ArtisanNew starts from. `path` overrides the destination ('.3dm' appended, folder created). Returns the full path written.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | optional — None = the tool default |","metadata":{"title":"Files","section":"ra.files.saveastemplate()","url":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilessaveastemplate","source":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilessaveastemplate","collection":"scripting","hash":"1215de456260b09e6dabbcff5a39ef49","indexed_by":"docs-index"}},{"content":"Files — ra.files.standardize()\n\n```python\nra.files.standardize() -> StandardizeResult\n```\n\nStandardizes a document that came from elsewhere (the ArtisanStandardize tool, headless), running the same sequence as the command: explode every block instance, recover the gems (ArtisanGemsRecover), move solids/meshes to the metal layers (ArtisanOrganizeObjectsByLayers), purge all render materials, re-apply the Artisan design materials, and estimate the ring size. Long on heavy documents. Returns counts of what was cleaned.","metadata":{"title":"Files","section":"ra.files.standardize()","url":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesstandardize","source":"https://www.rhinoartisan.com/docs/scripting/python/files/#rafilesstandardize","collection":"scripting","hash":"9b49b204710c66f06046f40e0702bd63","indexed_by":"docs-index"}},{"content":"Gem Orientation\n\nFix the orientation plane of stones without moving them.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemOrientationApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `flip_plane()` | The ArtisanGemsFlipPlane command, headless: flips the parametric plane stored in each gem (its Z axis is reversed) WITHOUT moving the stone's geometry. |","metadata":{"title":"Gem Orientation","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-orientation/","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-orientation/","collection":"scripting","hash":"22802daca4199636f597fb1340c9dba1","indexed_by":"docs-index"}},{"content":"Gem Orientation — ra.gemorientation.flipplane()\n\n```python\nra.gem_orientation.flip_plane(gem_ids=None) -> int\n```\n\nThe ArtisanGemsFlipPlane command, headless: flips the parametric plane stored in each gem (its Z axis is reversed) WITHOUT moving the stone's geometry. Use it when a gem's settings (prongs, baskets, cutters...) come out upside down: after the flip they regenerate on the other side. `gem_ids` None/empty = the selected gems (the command requires an explicit selection). Returns the number of gems whose plane was flipped.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Orientation","section":"ra.gemorientation.flipplane()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-orientation/#ragemorientationflipplane","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-orientation/#ragemorientationflipplane","collection":"scripting","hash":"5042906447158f4505b37f7ca24aa3e1","indexed_by":"docs-index"}},{"content":"Gem Size\n\nStones by millimetre size instead of carats.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemSizeApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Creates a gem from its dimensions in mm and adds it to the active document, returning the same Gem handle ra.gems.create returns. |\n| `same_size()` | The actual ArtisanGemBySize command: given some reference gems, finds every gem in the document with the same width (SizeX, 0.001 mm tolerance) -- e.g. |","metadata":{"title":"Gem Size","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/","collection":"scripting","hash":"561a092a8e2c71bc12c8e84c9ce83c8a","indexed_by":"docs-index"}},{"content":"Gem Size — ra.gemsize.create()\n\n```python\nra.gem_size.create(shape: str, material: str, size_x: float, size_y=None, size_z=None, plane=None) -> Gem\n```\n\nCreates a gem from its dimensions in mm and adds it to the active document, returning the same Gem handle ra.gems.create returns. `shape` / `material` accept the GemApi vocabularies (ra.gems.shapes() / ra.gems.materials()). `sizeX` is the width (diameter for ROUND); `sizeY` (length) and `sizeZ` (depth) 0 = the shape's standard proportions. `plane` is where the gem sits (default: world XY at the origin); the carat weight is derived from the mesh volume.\n\n| Parameter | Type | |\n|---|---|---|\n| `shape` | `str` | required |\n| `material` | `str` | required |\n| `size_x` | `float` | required |\n| `size_y` | `float` | optional — None = the tool default |\n| `size_z` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Gem Size","section":"ra.gemsize.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#ragemsizecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#ragemsizecreate","collection":"scripting","hash":"31123d12b2535e0de6f33054c5ab58df","indexed_by":"docs-index"}},{"content":"Gem Size — ra.gemsize.samesize()\n\n```python\nra.gem_size.same_size(gem_ids=None) -> List[str]\n```\n\nThe actual ArtisanGemBySize command: given some reference gems, finds every gem in the document with the same width (SizeX, 0.001 mm tolerance) -- e.g. \"all the 1.5 mm stones\". `gem_ids` empty/None uses the selected gems. Read-only, no license: returns the matching ids (reference gems included); pair with select_objects / ra.gems.find.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Size","section":"ra.gemsize.samesize()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#ragemsizesamesize","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#ragemsizesamesize","collection":"scripting","hash":"0d2a9034da22ccaad163be7428010c54","indexed_by":"docs-index"}},{"content":"Gem Size — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nGem (handle)\nPublic scripting view of a gem placed in the current RhinoDoc. This is intentionally narrow — it does NOT expose the underlying ShapesKernel GemObject. The LLM-generated Python scripts (and any third party) can only do what this surface allows, and every mutation passes through LicenseGate.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `carat_weight` | `float` | yes | |\n| `layer_name` | `str` | | |\n| `material` | `str` | yes | compound name, e.g. \"Diamond\" |\n| `plane` | `Plane` | yes | the gem's full placement plane (origin + orientation) |\n| `position` | `Point3d` | | origin of the gem's plane |\n| `shape` | `str` | yes | \"ROUND\", \"PRINCESS\", \"MARQUISE\", ... |\n| `size_x` | `float` | | mm |\n| `size_y` | `float` | | mm |\n| `size_z` | `float` | | mm |\n\n| Method | |\n|---|---|\n| `copy(translation=None) -> Gem` | duplicate displaced by `translation`, returns the new gem |\n| `delete()` | |\n| `flip()` | turn the gem upside down (180° around its own X axis) |\n| `move(translation: VectorLike)` | |\n| `rotate(degrees: float)` | spin around the gem's own Z axis (positive = counter-clockwise) |\n| `scale(factor: float)` | uniform scale of the current size (factor > 0) |\n| `select(on: bool)` | Selection state in the viewport. |\n| `set_size(size_x: float, size_y: float, size_z: float)` | resize to explicit mm dimensions |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Gem Size","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-size/#handles","collection":"scripting","hash":"140a25bd93322ace09b5cd1f6f2f0e0f","indexed_by":"docs-index"}},{"content":"Gem Tools\n\nUtilities over existing stones: centers, tags, alignment, curves from gems, copy by gems, colors by size.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemToolsApi`.","metadata":{"title":"Gem Tools","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/","collection":"scripting","hash":"6ff300bde95cdaa46c24067da906f996","indexed_by":"docs-index"}},{"content":"Gem Tools — Functions\n\n| Function | |\n|---|---|\n| `add_center_points()` | The ArtisanGemsCenter command, headless: adds a point object at the center (plane origin) of each gem. |\n| `add_tags()` | The ArtisanGemTags command, headless: places a 3-line text entity on the top face (table) of each gem -- measures (\"X x Y\" in mm), carat weight and material -- with the text height scaled to the stone (18% of its largest side). |\n| `align_gems()` | The ArtisanAlignGems command, headless: drops each gem onto the target objects by shooting a ray from the gem's center along its own axis (+Z first, then -Z, so a gem already past the surface still lands on it) and translating the gem to the hit point. |\n| `center_between_gems()` | The ArtisanCenterBetweenGems command, headless: for every triple of mutually adjacent gems (center distance below the sum of their diameters, near-equilateral unless the stones are big enough to still share a prong) it fits the circle tangent to the three girdle circles and adds it to the document -- the classic shared-prong guide. |\n| `centers()` | Center of each gem (its plane origin, on the girdle), read-only: nothing is added to the document, no license needed. |\n| `color_by_size()` | The ArtisanGemsColorBySize command, headless: paints every gem with a per-size display color (sizes grouped with a 1e-3 mm tolerance; color 0 is always the smallest size), so equal stones read at a glance. |\n| `copy_by_gems()` | The ArtisanCopyByGems command, headless: copies `object_ids` (a prong, a cutter, a bezel...) onto every gem in `target_gem_ids`, mapping from the origin gem's plane to each target gem's plane (history-linked copies, like the command). |","metadata":{"title":"Gem Tools","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#functions","collection":"scripting","hash":"6242216ce35e0a5f691c164dde327b42","indexed_by":"docs-index"}},{"content":"Gem Tools — Functions\n\n| Function | |\n|---|---|\n| `curve_from_gems()` | The ArtisanCurveFromGems command, headless: interpolates a degree-3 curve through the centers of the gems, IN THE ORDER of `gem_ids` (selection order when None) -- the order defines the shape of the curve, just like the pick order does in the command. |\n| `extract_gem_curves()` | The ArtisanGemsCurve command, headless: duplicates the girdle curve of each gem as a plain document curve (useful as a cutting/section profile). |\n| `offset_gem_curves()` | The ArtisanGemOffset command, headless: offsets the girdle curve of each gem OUTWARD by `distance` mm (the command's default is 1.0) and adds the result as the parametric gem-offset curve, linked with history to its gem so it follows when the gem moves. |\n| `recover_gems()` | The ArtisanGemsRecover command, headless: scans the WHOLE document for dumb gem geometry exported by Matrix, MatrixGold, RhinoGold or an older RhinoArtisan (recognized by their exact mesh/brep topology) and replaces each one with a parametric Artisan gemstone of the measured shape and size. |\n| `rotate_gems()` | The document effect of the ArtisanGemsOrientation handles (and of ArtisanRotateGemsLeft/Right), headless: rotates each gem around its own plane normal, in place. |","metadata":{"title":"Gem Tools","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#functions","collection":"scripting","hash":"6c0a18bd0538fe9c73bee5bf1cdf335f","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.addcenterpoints()\n\n```python\nra.gem_tools.add_center_points(gem_ids=None) -> List[str]\n```\n\nThe ArtisanGemsCenter command, headless: adds a point object at the center (plane origin) of each gem. Returns the ids of the created points.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.addcenterpoints()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaddcenterpoints","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaddcenterpoints","collection":"scripting","hash":"eb37420c97ab7e9cd2e352f4e868bdee","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.addtags()\n\n```python\nra.gem_tools.add_tags(gem_ids=None) -> List[str]\n```\n\nThe ArtisanGemTags command, headless: places a 3-line text entity on the top face (table) of each gem -- measures (\"X x Y\" in mm), carat weight and material -- with the text height scaled to the stone (18% of its largest side). The tags land on the primary user layer. None/empty `gem_ids` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the ids of the created text entities.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.addtags()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaddtags","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaddtags","collection":"scripting","hash":"4083a8de65be727c5ea6b6fe0d9e3118","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.aligngems()\n\n```python\nra.gem_tools.align_gems(target_ids: Sequence[IdLike], gem_ids=None, flip=None, adapt_to_surface=None, align_top=None) -> int\n```\n\nThe ArtisanAlignGems command, headless: drops each gem onto the target objects by shooting a ray from the gem's center along its own axis (+Z first, then -Z, so a gem already past the surface still lands on it) and translating the gem to the hit point. The targets are meshed as one high-resolution mesh, like the command. Positions are aligned; the gem keeps its own orientation unless told otherwise: `flip` True = turn the gem upside down at the landing point (the command's Flip toggle; default No); `adapt_to_surface` True = orient the gem's axis to the surface normal at the landing point (the command's Orientation toggle, Keep by default); `align_top` True = sink the gem along its axis by its own height above the girdle, so the top face (table) sits on the surface (the command's Alignment toggle, On Girdle by default). Gems whose axis never hits the targets are skipped, like in the command. None/empty `gem_ids` = the selected gems. In-place moves: returns the number of gems aligned.\n\n| Parameter | Type | |\n|---|---|---|\n| `target_ids` | `Sequence[IdLike]` | required |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `flip` | `bool` | optional — None = the tool default |\n| `adapt_to_surface` | `bool` | optional — None = the tool default |\n| `align_top` | `bool` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.aligngems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaligngems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsaligngems","collection":"scripting","hash":"2225daba22ff9fdb704abb3c1eeae9d6","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.centerbetweengems()\n\n```python\nra.gem_tools.center_between_gems(gem_ids=None) -> List[str]\n```\n\nThe ArtisanCenterBetweenGems command, headless: for every triple of mutually adjacent gems (center distance below the sum of their diameters, near-equilateral unless the stones are big enough to still share a prong) it fits the circle tangent to the three girdle circles and adds it to the document -- the classic shared-prong guide. The circles are grouped so one click picks the whole guide set. None/empty `gem_ids` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the ids of the created circles (may be empty when no triple qualifies).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.centerbetweengems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscenterbetweengems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscenterbetweengems","collection":"scripting","hash":"a722642d15baa4993893e2bb217c95d1","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.centers()\n\n```python\nra.gem_tools.centers(gem_ids=None) -> List[Point3d]\n```\n\nCenter of each gem (its plane origin, on the girdle), read-only: nothing is added to the document, no license needed. The points come back in the same order as `gem_ids` (selection order when None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.centers()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscenters","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscenters","collection":"scripting","hash":"94fd76ebeab298466b35b462c72265db","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.colorbysize()\n\n```python\nra.gem_tools.color_by_size(gem_ids=None) -> int\n```\n\nThe ArtisanGemsColorBySize command, headless: paints every gem with a per-size display color (sizes grouped with a 1e-3 mm tolerance; color 0 is always the smallest size), so equal stones read at a glance. None/empty `gem_ids` = the selected gems, or every gem in the document when nothing is selected (command behavior on Enter). Returns the number of gems recolored.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.colorbysize()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscolorbysize","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscolorbysize","collection":"scripting","hash":"698b81e19f243b59e5c97a7ce9e9cc46","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.copybygems()\n\n```python\nra.gem_tools.copy_by_gems(object_ids: Sequence[IdLike], target_gem_ids: Sequence[IdLike], origin_gem_id=None, scale=None) -> List[str]\n```\n\nThe ArtisanCopyByGems command, headless: copies `object_ids` (a prong, a cutter, a bezel...) onto every gem in `target_gem_ids`, mapping from the origin gem's plane to each target gem's plane (history-linked copies, like the command). `origin_gem_id` = None means the objects are modeled on the world XY plane (the command's \"Enter = CPlane\" answer). `scale` is the command's option list: \"No\" (default) copy as-is \"2D\" scale X/Y by targetGemSizeX / originGemSizeX \"3D\" scale X/Y/Z by the same factor None/empty `object_ids` = the current selection. Returns the ids of the created copies (targets x objects).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `target_gem_ids` | `Sequence[IdLike]` | required |\n| `origin_gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `scale` | `str` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.copybygems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscopybygems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscopybygems","collection":"scripting","hash":"859f7a64fe818e0d052bfee27347b8c5","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.curvefromgems()\n\n```python\nra.gem_tools.curve_from_gems(gem_ids=None) -> str\n```\n\nThe ArtisanCurveFromGems command, headless: interpolates a degree-3 curve through the centers of the gems, IN THE ORDER of `gem_ids` (selection order when None) -- the order defines the shape of the curve, just like the pick order does in the command. Consecutive coincident centers (stacked duplicates) are skipped. At least two distinct centers are required. Returns the id of the created curve.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.curvefromgems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscurvefromgems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolscurvefromgems","collection":"scripting","hash":"9d357acbd333788110e638f7820c6676","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.extractgemcurves()\n\n```python\nra.gem_tools.extract_gem_curves(gem_ids=None) -> List[str]\n```\n\nThe ArtisanGemsCurve command, headless: duplicates the girdle curve of each gem as a plain document curve (useful as a cutting/section profile). Returns the ids of the created curves.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.extractgemcurves()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsextractgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsextractgemcurves","collection":"scripting","hash":"aff578c473755b004873fc8505b152e4","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.offsetgemcurves()\n\n```python\nra.gem_tools.offset_gem_curves(gem_ids=None, distance=None) -> List[str]\n```\n\nThe ArtisanGemOffset command, headless: offsets the girdle curve of each gem OUTWARD by `distance` mm (the command's default is 1.0) and adds the result as the parametric gem-offset curve, linked with history to its gem so it follows when the gem moves. A `distance` smaller than the document tolerance adds the girdle curve unchanged (same as answering 0 in the command). Gems whose offset fails (self intersecting result, etc.) are skipped, like in the command. Returns the ids of the created curves.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.offsetgemcurves()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsoffsetgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsoffsetgemcurves","collection":"scripting","hash":"002410bfaa013529a18f1016faab591b","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.recovergems()\n\n```python\nra.gem_tools.recover_gems() -> int\n```\n\nThe ArtisanGemsRecover command, headless: scans the WHOLE document for dumb gem geometry exported by Matrix, MatrixGold, RhinoGold or an older RhinoArtisan (recognized by their exact mesh/brep topology) and replaces each one with a parametric Artisan gemstone of the measured shape and size. The command already runs without prompts, so it is invoked directly -- that keeps the recovery byte-identical to the ribbon button and picks up new fingerprints automatically. Returns the number of gems recovered (0 = nothing recognizable).","metadata":{"title":"Gem Tools","section":"ra.gemtools.recovergems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsrecovergems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsrecovergems","collection":"scripting","hash":"1851687104be4764e6a8f672352edef7","indexed_by":"docs-index"}},{"content":"Gem Tools — ra.gemtools.rotategems()\n\n```python\nra.gem_tools.rotate_gems(gem_ids=None, angle_degrees=None) -> int\n```\n\nThe document effect of the ArtisanGemsOrientation handles (and of ArtisanRotateGemsLeft/Right), headless: rotates each gem around its own plane normal, in place. `angle_degrees` is counter-clockwise when positive (each click of the orientation gumball is +90, the default); pass a negative angle to rotate clockwise. Returns the number of gems rotated.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `angle_degrees` | `float` | optional — None = the tool default |","metadata":{"title":"Gem Tools","section":"ra.gemtools.rotategems()","url":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsrotategems","source":"https://www.rhinoartisan.com/docs/scripting/python/gem-tools/#ragemtoolsrotategems","collection":"scripting","hash":"6cf153e3fcb4e8366ea92943b653155e","indexed_by":"docs-index"}},{"content":"Gems By Network\n\nStones over a network of intersecting curves, sized to meet at the nodes.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemsByNetworkApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Fills `curve_ids` with stones and bakes them as loose gems. |\n\nra.gemsbynetwork.create()\n```python\nra.gems_by_network.create(curve_ids=None, gem_size=None, min_distance=None, move_in_z=None, fit_to_end=None) -> List[str]\n```\n\nFills `curve_ids` with stones and bakes them as loose gems. Millimetres; 0 keeps the default: the user's saved Gems on Network defaults when there are any, otherwise the tool's (gem_size 1.0, min_distance 0.1, moveInZ 0: the stones sit on the curves). `curve_ids` None/empty uses the current selection. Returns the ids of the baked gems.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `min_distance` | `float` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `fit_to_end` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Gems By Network","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-by-network/","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-by-network/","collection":"scripting","hash":"eb772724017ff81a947034e111b797cf","indexed_by":"docs-index"}},{"content":"Gems From Circle\n\nTurn circles into round stones of the matching size.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemsFromCircleApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Turns circles into round gems -- the ArtisanGemsFromCircle tool, headless. |\n\nra.gemsfromcircle.create()\n```python\nra.gems_from_circle.create(curve_ids: Sequence[IdLike], gem_material=None) -> List[str]\n```\n\nTurns circles into round gems -- the ArtisanGemsFromCircle tool, headless. Every curve in `curve_ids` that is a circle (0.001 mm tolerance) becomes a ROUND gem of that diameter, placed on the circle's plane and added to the secondary gems layer; other curves are skipped. `gem_material` accepts the GemApi vocabulary (default Diamond). Returns the ids of the created gems (empty if no circle).\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `gem_material` | `str` | optional — None = the tool default |","metadata":{"title":"Gems From Circle","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-from-circle/","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-from-circle/","collection":"scripting","hash":"09eaed318736daf134dc61082519b2be","indexed_by":"docs-index"}},{"content":"Gems On Curve\n\nA run of stones along one curve, with prongs and cutters, editable afterwards.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemsOnCurveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `GemsOnCurve` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `GemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Distributes a row of identical gems along an existing curve -- the ArtisanGemsOnCurve tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_curve()` | |\n| `selected()` | GemsOnCurves currently selected in the active doc. |","metadata":{"title":"Gems On Curve","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/","collection":"scripting","hash":"2c100f0fe33048d512e3874679fdb18a","indexed_by":"docs-index"}},{"content":"Gems On Curve — ra.gemsoncurve.all()\n\n```python\nra.gems_on_curve.all() -> List[GemsOnCurve]\n```\n\n`GemsOnCurve` handles for every object of this kind in the active document (empty when there is no document).\n\nra.gemsoncurve.bylayer()\n```python\nra.gems_on_curve.by_layer(layer_name: str) -> List[GemsOnCurve]\n```\n\n`GemsOnCurve` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Gems On Curve","section":"ra.gemsoncurve.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurveall","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurveall","collection":"scripting","hash":"60790e6b87f4311031db0cb6e080b607","indexed_by":"docs-index"}},{"content":"Gems On Curve — ra.gemsoncurve.count()\n\n```python\nra.gems_on_curve.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.gemsoncurve.create()\n```python\nra.gems_on_curve.create(curve_id: IdLike, gem_size=None, distance=None, gem_shape=None, gem_material=None, prongs=None, cutters=None, orientation_ids=None) -> GemsOnCurve\n```\n\nDistributes a row of identical gems along an existing curve -- the ArtisanGemsOnCurve tool, headless. `curve_id` must be a curve in the active document; it becomes the row's parent (see ForCurve). Millimetres; omitting keeps the tool default (or the user's saved defaults): gem_size 1.5, distance 0.2. `gem_shape`/`gem_material` accept the GemApi vocabularies (default ROUND Diamond). `prongs` True also builds the shared prongs; `cutters` True bakes one cutter per gem into a separate group. `orientation_ids` optionally orient the gems onto those surfaces/breps. Returns an GemsOnCurve handle to the new row.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `gem_size` | `float` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `gem_shape` | `str` | optional — None = the tool default |\n| `gem_material` | `str` | optional — None = the tool default |\n| `prongs` | `bool` | optional — None = the tool default |\n| `cutters` | `bool` | optional — None = the tool default |\n| `orientation_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Gems On Curve","section":"ra.gemsoncurve.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurvecount","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurvecount","collection":"scripting","hash":"60067775ac0f64f2110ac3e6043a85ec","indexed_by":"docs-index"}},{"content":"Gems On Curve — ra.gemsoncurve.find()\n\n```python\nra.gems_on_curve.find(id: IdLike) -> GemsOnCurve\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.gemsoncurve.forcurve()\n```python\nra.gems_on_curve.for_curve(curve_id: IdLike) -> List[GemsOnCurve]\n```\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |","metadata":{"title":"Gems On Curve","section":"ra.gemsoncurve.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurvefind","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurvefind","collection":"scripting","hash":"71916799b446f3f63394ba7e0761821b","indexed_by":"docs-index"}},{"content":"Gems On Curve — ra.gemsoncurve.selected()\n\n```python\nra.gems_on_curve.selected() -> List[GemsOnCurve]\n```\n\nGemsOnCurves currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Gems On Curve","section":"ra.gemsoncurve.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurveselected","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#ragemsoncurveselected","collection":"scripting","hash":"123a7ac13ce1c6df65c8b774b6c76686","indexed_by":"docs-index"}},{"content":"Gems On Curve — GemsOnCurve (handle)\n\nA row of identical gems distributed along a parent curve. The \"Mother\" here is the curve, not a single gem — accessible via CurveId. GemShape/Material/CaratWeight describe the gem template that gets repeated along the curve.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `alignment_vertical` | `str` | yes | \"TOP\" \\| \"ON_GIRDLE\" |\n| `curve_id` | `str` | | |\n| `cutters_enabled` | `bool` | yes | |\n| `distance` | `float` | yes | |\n| `flip_curve` | `bool` | yes | |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | yes | |\n| `gem_orientation` | `str` | yes | \"NATURAL\" \\| \"UPSIDE_DOWN\" |\n| `gem_shape` | `str` | yes | |\n| `gem_size` | `float` | yes | Current values (millimetres / degrees; several are signed). |\n| `gem_size_y` | `float` | yes | 0 = symmetric; only used by asymmetric shapes |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `move_by_z` | `float` | yes | signed |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong_diameter` | `float` | yes | |\n| `prong_end_mode` | `str` | yes | \"SINGLE\" \\| \"DOUBLE\" |\n| `prong_height_over_girdle` | `float` | yes | |\n| `prong_height_under_girdle` | `float` | yes | |\n| `prong_type` | `str` | yes | \"INDIVIDUAL\" \\| \"SHARED\" |\n| `prongs_enabled` | `bool` | yes | |\n| `rotate90` | `bool` | yes | |\n| `rotation_on_curve` | `float` | yes | degrees, signed |\n| `starting_point` | `str` | yes | \"BOUNDARY\" \\| \"CENTER\" |\n| `stone_count` | `int` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_prong_distance_shared(distance: float)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Gems On Curve","section":"GemsOnCurve (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#gemsoncurve-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-curve/#gemsoncurve-handle","collection":"scripting","hash":"25a8a5de9c59e67d6f6ee03f3edfbd19","indexed_by":"docs-index"}},{"content":"Gems On Two Curves\n\nStones fitted between two rails, sized to the gap.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemsOn2CurvesApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `GemsOn2Curves` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `GemsOn2Curves` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Fills the space between two curves with round gems whose diameter adapts to the local width -- the ArtisanGemsOn2Curves tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `GemsOn2Curves` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Gems On Two Curves","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/","collection":"scripting","hash":"fd84411692b87c07dd34c67e828bfb21","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — ra.gemsontwocurves.all()\n\n```python\nra.gems_on_two_curves.all() -> List[GemsOn2Curves]\n```\n\n`GemsOn2Curves` handles for every object of this kind in the active document (empty when there is no document).\n\nra.gemsontwocurves.bylayer()\n```python\nra.gems_on_two_curves.by_layer(layer_name: str) -> List[GemsOn2Curves]\n```\n\n`GemsOn2Curves` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Gems On Two Curves","section":"ra.gemsontwocurves.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvesall","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvesall","collection":"scripting","hash":"a576400a29845e558e284c63b9d1266b","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — ra.gemsontwocurves.count()\n\n```python\nra.gems_on_two_curves.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Gems On Two Curves","section":"ra.gemsontwocurves.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescount","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescount","collection":"scripting","hash":"8c39b456972e73ce23c1fb26f0f2e758","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — ra.gemsontwocurves.create()\n\n```python\nra.gems_on_two_curves.create(curve1_id: IdLike, curve2_id: IdLike, distance=None, min_size=None, move_in_z=None, gem_material=None, algorithm=None, align_on_top=None, flip=None, flip1=None, flip2=None, rebuild_curves=None, prongs=None, prong_type=None, prong_end_mode=None, prong_diameter=None, prong_distance=None, prong_height_over_girdle=None, prong_height_under_girdle=None, group=None) -> GemsOn2CurvesResult\n```\n\nFills the space between two curves with round gems whose diameter adapts to the local width -- the ArtisanGemsOn2Curves tool, headless. Millimetres; omitting keeps the tool default (or the user's saved defaults): distance 0.2 between gems, min_size 1 (smaller gems are dropped). `algorithm` is SPINE (default) or TANGENCY; `gem_material` accepts the GemApi vocabulary (default Diamond). `prongs` True also bakes the prongs (SHARED by default, or INDIVIDUAL) as metal. Returns the group id plus the gem/prong ids; `group` False bakes loose gems instead.","metadata":{"title":"Gems On Two Curves","section":"ra.gemsontwocurves.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescreate","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescreate","collection":"scripting","hash":"b485ecae12313cf5b53c1aba14d8c3f9","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — ra.gemsontwocurves.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `curve1_id` | `IdLike` | required |\n| `curve2_id` | `IdLike` | required |\n| `distance` | `float` | optional — None = the tool default |\n| `min_size` | `float` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `gem_material` | `str` | optional — None = the tool default |\n| `algorithm` | `str` | optional — None = the tool default |\n| `align_on_top` | `Optional[bool]` | optional — None = the tool default |\n| `flip` | `Optional[bool]` | optional — None = the tool default |\n| `flip1` | `Optional[bool]` | optional — None = the tool default |\n| `flip2` | `Optional[bool]` | optional — None = the tool default |\n| `rebuild_curves` | `Optional[bool]` | optional — None = the tool default |\n| `prongs` | `bool` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `prong_end_mode` | `str` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `prong_distance` | `float` | optional — None = the tool default |\n| `prong_height_over_girdle` | `float` | optional — None = the tool default |\n| `prong_height_under_girdle` | `float` | optional — None = the tool default |\n| `group` | `bool` | optional — None = the tool default |","metadata":{"title":"Gems On Two Curves","section":"ra.gemsontwocurves.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescreate","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvescreate","collection":"scripting","hash":"4dc022946561b6096aaa79779960f676","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — ra.gemsontwocurves.find()\n\n```python\nra.gems_on_two_curves.find(id: IdLike) -> GemsOn2Curves\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.gemsontwocurves.selected()\n```python\nra.gems_on_two_curves.selected() -> List[GemsOn2Curves]\n```\n\n`GemsOn2Curves` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Gems On Two Curves","section":"ra.gemsontwocurves.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvesfind","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#ragemsontwocurvesfind","collection":"scripting","hash":"9d0d8c00b5f564a109c65ca00ac91e4b","indexed_by":"docs-index"}},{"content":"Gems On Two Curves — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nGemsOn2Curves (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `curve1_id` | `str` | | |\n| `curve2_id` | `str` | | |\n| `layer_name` | `str` | | |\n| `member_count` | `int` | | Rhino objects in the group |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `parameters_json` | `str` | | the kernel model, as stored in the group |\n| `position` | `Point3d` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `get_parameter(path: str) -> str` | dotted JSON path; None when absent |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Gems On Two Curves","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/gems-on-two-curves/#handles","collection":"scripting","hash":"936c6bd9192b2ab709ba978b7d5a0566","indexed_by":"docs-index"}},{"content":"Gems\n\nCreate, query and edit stones: shapes, materials, carats, placement, copies, collisions.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GemApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Gem` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Gem` handles on the layer with the given full path (empty when the layer does not exist). |\n| `by_material()` | |\n| `collisions()` | Returns every pair of gems whose meshes intersect (each entry is an array of the two colliding gems). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Creates a new gem and adds it to the active document, returning a handle to it. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `materials()` | Valid values for the `material` argument (\"DIAMOND\", \"RUBY\", ...). |\n| `selected()` | Returns the gems that are currently selected in the active doc. |\n| `shapes()` | Valid values for the `shape` argument of Create / SetShape-style calls (\"ROUND\", \"PRINCESS\", \"MARQUISE\", ...). |","metadata":{"title":"Gems","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/","collection":"scripting","hash":"f58756c0085bdb347e60a7736d8aae67","indexed_by":"docs-index"}},{"content":"Gems — ra.gems.all()\n\n```python\nra.gems.all() -> List[Gem]\n```\n\n`Gem` handles for every object of this kind in the active document (empty when there is no document).\n\nra.gems.bylayer()\n```python\nra.gems.by_layer(layer_name: str) -> List[Gem]\n```\n\n`Gem` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Gems","section":"ra.gems.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsall","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsall","collection":"scripting","hash":"ebcb0ba56b547a192c0867b68d68892c","indexed_by":"docs-index"}},{"content":"Gems — ra.gems.bymaterial()\n\n```python\nra.gems.by_material(material_name: str) -> List[Gem]\n```\n\n| Parameter | Type | |\n|---|---|---|\n| `material_name` | `str` | required |\n\nra.gems.collisions()\n```python\nra.gems.collisions() -> List[List[Gem]]\n```\n\nReturns every pair of gems whose meshes intersect (each entry is an array of the two colliding gems). Same mesh-mesh test as the ArtisanGemsCollision command, scoped to the gems GemApi manages. Read-only: safe without a Transaction and without a license.","metadata":{"title":"Gems","section":"ra.gems.bymaterial()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsbymaterial","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsbymaterial","collection":"scripting","hash":"25970df59c04a2a0d5a58cbf19212159","indexed_by":"docs-index"}},{"content":"Gems — ra.gems.count()\n\n```python\nra.gems.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.gems.create()\n```python\nra.gems.create(shape: str, material: str, carat_weight: float, plane: PlaneLike) -> Gem\n```\n\nCreates a new gem and adds it to the active document, returning a handle to it. `shape` accepts case-insensitive GemShape names (\"ROUND\", \"PRINCESS\", \"MARQUISE\", \"EMERALD\", ...). `material` accepts compound names (\"Diamond\", \"Ruby\", \"Sapphire\", ...) -- the string is normalized (dashes / spaces become underscores) before matching the GemCompound enum. `carat_weight` drives the gem's size via the same proportion table QuickGems uses. `plane` is where the gem is placed; pass Plane.WorldXY for \"at the origin\". Throws ScriptingNotLicensedException if the license is invalid.\n\n| Parameter | Type | |\n|---|---|---|\n| `shape` | `str` | required |\n| `material` | `str` | required |\n| `carat_weight` | `float` | required |\n| `plane` | `PlaneLike` | required |","metadata":{"title":"Gems","section":"ra.gems.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemscount","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemscount","collection":"scripting","hash":"608ee02fc38e6458d6eea1ebcfc52be4","indexed_by":"docs-index"}},{"content":"Gems — ra.gems.find()\n\n```python\nra.gems.find(id: IdLike) -> Gem\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.gems.materials()\n```python\nra.gems.materials() -> List[str]\n```\n\nValid values for the `material` argument (\"DIAMOND\", \"RUBY\", ...). Read-only, no license.","metadata":{"title":"Gems","section":"ra.gems.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsfind","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsfind","collection":"scripting","hash":"5654c0c18f9ad0695b99cca8ee0dee57","indexed_by":"docs-index"}},{"content":"Gems — ra.gems.selected()\n\n```python\nra.gems.selected() -> List[Gem]\n```\n\nReturns the gems that are currently selected in the active doc. Empty list if nothing is selected (or selection contains no gems).\n\nra.gems.shapes()\n```python\nra.gems.shapes() -> List[str]\n```\n\nValid values for the `shape` argument of Create / SetShape-style calls (\"ROUND\", \"PRINCESS\", \"MARQUISE\", ...). Read-only, no license.","metadata":{"title":"Gems","section":"ra.gems.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsselected","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#ragemsselected","collection":"scripting","hash":"852c289d5380be914356681cfad9f294","indexed_by":"docs-index"}},{"content":"Gems — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nGem (handle)\nPublic scripting view of a gem placed in the current RhinoDoc. This is intentionally narrow — it does NOT expose the underlying ShapesKernel GemObject. The LLM-generated Python scripts (and any third party) can only do what this surface allows, and every mutation passes through LicenseGate.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `carat_weight` | `float` | yes | |\n| `layer_name` | `str` | | |\n| `material` | `str` | yes | compound name, e.g. \"Diamond\" |\n| `plane` | `Plane` | yes | the gem's full placement plane (origin + orientation) |\n| `position` | `Point3d` | | origin of the gem's plane |\n| `shape` | `str` | yes | \"ROUND\", \"PRINCESS\", \"MARQUISE\", ... |\n| `size_x` | `float` | | mm |\n| `size_y` | `float` | | mm |\n| `size_z` | `float` | | mm |\n\n| Method | |\n|---|---|\n| `copy(translation=None) -> Gem` | duplicate displaced by `translation`, returns the new gem |\n| `delete()` | |\n| `flip()` | turn the gem upside down (180° around its own X axis) |\n| `move(translation: VectorLike)` | |\n| `rotate(degrees: float)` | spin around the gem's own Z axis (positive = counter-clockwise) |\n| `scale(factor: float)` | uniform scale of the current size (factor > 0) |\n| `select(on: bool)` | Selection state in the viewport. |\n| `set_size(size_x: float, size_y: float, size_z: float)` | resize to explicit mm dimensions |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Gems","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/gems/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/gems/#handles","collection":"scripting","hash":"53c08cbbc68c99857ed9cc04b15e4c79","indexed_by":"docs-index"}},{"content":"Graduated\n\nGraduated shanks: a run of stones shrinking away from the centre.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.GraduatedApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Graduated` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Graduated` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a graduated shank -- the ArtisanGraduated tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `Graduated` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Graduated","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/","collection":"scripting","hash":"4388e44b7b3135bc10e048561aa8f8d3","indexed_by":"docs-index"}},{"content":"Graduated — ra.graduated.all()\n\n```python\nra.graduated.all() -> List[Graduated]\n```\n\n`Graduated` handles for every object of this kind in the active document (empty when there is no document).\n\nra.graduated.bylayer()\n```python\nra.graduated.by_layer(layer_name: str) -> List[Graduated]\n```\n\n`Graduated` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Graduated","section":"ra.graduated.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedall","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedall","collection":"scripting","hash":"147e0e65b3af0245f18870828a86980d","indexed_by":"docs-index"}},{"content":"Graduated — ra.graduated.count()\n\n```python\nra.graduated.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Graduated","section":"ra.graduated.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedcount","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedcount","collection":"scripting","hash":"643b8eaf1410f51833269e8cc749b40f","indexed_by":"docs-index"}},{"content":"Graduated — ra.graduated.create()\n\n```python\nra.graduated.create(finger_diameter=None, number_of_stones=None, size_start=None, size_end=None, center_stone_size=None, top_width=None, top_height=None, bottom_width=None, bottom_height=None, profile=None, plane=None, element=None) -> Graduated\n```\n\nBuilds a graduated shank -- the ArtisanGraduated tool, headless. Millimetres; omitting keeps the tool default (or the user's saved defaults): number_of_stones 4 per side, size_start 2.5, size_end 1.5, center_stone_size 6.1, top profile 1.5 x 1.6, bottom profile 3.0 x 1.6. `finger_diameter` 0 = the document's finger size. `profile` picks a RING_PROFILE asset by name for both band sections. Returns an Graduated handle: use handle.Shank / handle.Gems to adjust the rest of the parameters. `element` = name of a saved graduated element (ra.elements.list(\"Graduated\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `number_of_stones` | `int` | optional — None = the tool default |\n| `size_start` | `float` | optional — None = the tool default |\n| `size_end` | `float` | optional — None = the tool default |\n| `center_stone_size` | `float` | optional — None = the tool default |\n| `top_width` | `float` | optional — None = the tool default |\n| `top_height` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `bottom_height` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Graduated","section":"ra.graduated.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedcreate","collection":"scripting","hash":"dd17df724240bd5dda02dd58221f7717","indexed_by":"docs-index"}},{"content":"Graduated — ra.graduated.find()\n\n```python\nra.graduated.find(id: IdLike) -> Graduated\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.graduated.selected()\n```python\nra.graduated.selected() -> List[Graduated]\n```\n\n`Graduated` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Graduated","section":"ra.graduated.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedfind","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#ragraduatedfind","collection":"scripting","hash":"be79cd4cf5a73c15288daff65db30908","indexed_by":"docs-index"}},{"content":"Graduated — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nGraduated (handle)\nGraduated shank: a band whose section grows from the centre stone down toward the finger, carrying a run of stones that shrink along the way. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gems` | GraduatedGems | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `shank` | GraduatedShank | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Graduated element (ra.elements.list(\"Graduated\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Graduated","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#handles","collection":"scripting","hash":"f70d96a0958b42b316c18ed2140da27a","indexed_by":"docs-index"}},{"content":"Graduated — GraduatedGems (section)\n\nThe graduated stone run: stones stepping down in size from the centre stone toward the band, with prongs that taper along the way.","metadata":{"title":"Graduated","section":"GraduatedGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","collection":"scripting","hash":"1a7fd22e73002afca24a3032d97c30ba","indexed_by":"docs-index"}},{"content":"Graduated — GraduatedGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | mm |\n| `center_stone_size` | `float` | yes | mm |\n| `distance` | `float` | yes | gap between adjacent stones, mm |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `end_prong_count` | `int` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | mm |\n| `gem_move_in_z_end` | `float` | | mm |\n| `gem_move_in_z_start` | `float` | | mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `inner_height` | `float` | yes | mm |\n| `inner_width` | `float` | yes | mm |\n| `lift` | `float` | yes | mm |\n| `number_of_stones` | `int` | yes | per side |\n| `prong_cut_by_ring_size` | `bool` | yes | |\n| `prong_diameter_end` | `float` | | |\n| `prong_diameter_start` | `float` | | |\n| `prong_distance` | `float` | yes | |\n| `prong_grow` | `float` | yes | |\n| `prong_height_end` | `float` | | |\n| `prong_height_start` | `float` | | |\n| `prong_min_diameter` | `float` | yes | |\n| `prong_move_in_z` | `float` | yes | |\n| `prong_over_girdle_end` | `float` | | |\n| `prong_over_girdle_start` | `float` | | |\n| `prong_separation_end` | `float` | | |\n| `prong_separation_start` | `float` | | |\n| `prong_spacing` | `float` | yes | |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `prongs_enabled` | `bool` | yes | Prongs — most sizes taper from the centre stone (Start) to the band (End). |\n| `size_end` | `float` | | nearest the band, mm |\n| `size_start` | `float` | | nearest the centre stone, mm |","metadata":{"title":"Graduated","section":"GraduatedGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","collection":"scripting","hash":"b6104f46d36f9fec21ebfb6441c05822","indexed_by":"docs-index"}},{"content":"Graduated — GraduatedGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `under_bezel_bottom_width` | `float` | yes | mm |\n| `under_bezel_enabled` | `bool` | yes | The rail under the stones. |\n| `under_bezel_gem_inside` | `float` | yes | rail offset into the stone, mm |\n| `under_bezel_girdle_width` | `float` | yes | top diameter span, mm |\n| `under_bezel_height` | `float` | yes | 0 = auto (drop to the finger curve) |\n| `under_bezel_over_girdle` | `float` | yes | rise above the girdle, mm |\n| `under_bezel_width` | `float` | yes | total radial width, mm |\n| `vertical` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_gem_move_in_z(start: float, end: float)` | |\n| `set_prong_diameters(start: float, end: float)` | |\n| `set_prong_heights(start: float, end: float)` | |\n| `set_prong_over_girdle(start: float, end: float)` | |\n| `set_prong_separation(start: float, end: float)` | |\n| `set_sizes(start: float, end: float)` | start = nearest the centre stone |","metadata":{"title":"Graduated","section":"GraduatedGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedgems-section","collection":"scripting","hash":"cee748064cbc2bc4d2b0da45d2eabf5e","indexed_by":"docs-index"}},{"content":"Graduated — GraduatedShank (section)\n\nThe graduated band: two profiles that the section morphs between, plus the opening at the bottom.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_profile` | GraduatedProfile | | |\n| `cut_bumping` | `float` | yes | mm |\n| `opening_margin` | `float` | yes | mm |\n| `top_profile` | GraduatedProfile | | |","metadata":{"title":"Graduated","section":"GraduatedShank (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedshank-section","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedshank-section","collection":"scripting","hash":"3e34501c06093a348317af314a1285b9","indexed_by":"docs-index"}},{"content":"Graduated — GraduatedProfile (section)\n\nOne of a graduated band's two profiles (top / bottom). Same shape as a classic profile, on its own model.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `comfort` | `float` | yes | mm — used when Type is \"COMFORT\" |\n| `displacement` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `height` | `float` | yes | mm |\n| `orientation` | `int` | yes | 0 = Natural, 1 = Reverse |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees |\n| `thickness` | `float` | yes | mm — used when Type is \"THICKNESS\" |\n| `type` | `str` | yes | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name |","metadata":{"title":"Graduated","section":"GraduatedProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/graduated/#graduatedprofile-section","collection":"scripting","hash":"d29c078c3e2894841e37cbe37e2c8efb","indexed_by":"docs-index"}},{"content":"Halo\n\nA halo of small stones around a centre stone.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.HaloApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Halo` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Halo` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a halo of small stones around an existing gem -- the ArtisanHalo tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Halo` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Halos currently selected in the active doc. |","metadata":{"title":"Halo","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/","collection":"scripting","hash":"67748ec70f8c901379d49e3496a77166","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.all()\n\n```python\nra.halo.all() -> List[Halo]\n```\n\n`Halo` handles for every object of this kind in the active document (empty when there is no document).\n\nra.halo.bylayer()\n```python\nra.halo.by_layer(layer_name: str) -> List[Halo]\n```\n\n`Halo` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Halo","section":"ra.halo.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahaloall","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahaloall","collection":"scripting","hash":"9a84360669e53bb017ec502190a18eba","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.count()\n\n```python\nra.halo.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Halo","section":"ra.halo.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocount","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocount","collection":"scripting","hash":"591ae14d15e64b6b066523415b7c5d77","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.create()\n\n```python\nra.halo.create(gem_id: IdLike, stone_size=None, stone_distance=None, distance_to_gem=None, channel_width=None, channel_height=None, prong_type=None, profile=None, channel_position_z=None, channel_rotation=None, channel_bright_cut=None, channel_inner_width=None, channel_inner_height=None, stone_vertical=None, stone_gem_inside=None, drill_type=None, force_even_number=None, prong_count=None, prong_diameter=None, prong_profile=None, element=None, prong_mode=None) -> Halo\n```\n\nBuilds a halo of small stones around an existing gem -- the ArtisanHalo tool, headless. `gem_id` must be a gem in the active document with a halo-friendly shape (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER, PEAR). Millimetres; omitting keeps the tool default (or the user's saved defaults): stone_size 1.2, stone_distance 0.2, distance_to_gem 1.2, channel_width 1.5, channel_height 1.5. `prong_type` is NONE (default), SHARED or SCALLOPED: how the halo stones are held. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the default profile. The center stone's prongs: `prong_mode` ROUND, CUSTOM (the `prong_profile` section; a profile alone implies it) or CLAW (DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and tuned through the handle (SetClawGemInside...). `element` = name of a saved Halo element (ra.elements.list(\"Halo\")) to start from instead of the defaults; explicit arguments override it. Returns an Halo handle to the new halo group.","metadata":{"title":"Halo","section":"ra.halo.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocreate","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocreate","collection":"scripting","hash":"81789301d4eba3f9b3a60a6a226f4a37","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `stone_size` | `float` | optional — None = the tool default |\n| `stone_distance` | `float` | optional — None = the tool default |\n| `distance_to_gem` | `float` | optional — None = the tool default |\n| `channel_width` | `float` | optional — None = the tool default |\n| `channel_height` | `float` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `channel_position_z` | `float` | optional — None = the tool default |\n| `channel_rotation` | `float` | optional — None = the tool default |\n| `channel_bright_cut` | `float` | optional — None = the tool default |\n| `channel_inner_width` | `float` | optional — None = the tool default |\n| `channel_inner_height` | `float` | optional — None = the tool default |\n| `stone_vertical` | `float` | optional — None = the tool default |\n| `stone_gem_inside` | `float` | optional — None = the tool default |\n| `drill_type` | `str` | optional — None = the tool default |\n| `force_even_number` | `Optional[bool]` | optional — None = the tool default |\n| `prong_count` | `int` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `prong_profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Halo","section":"ra.halo.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocreate","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalocreate","collection":"scripting","hash":"dcb41c4831cab088875f02ad2225134e","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.find()\n\n```python\nra.halo.find(id: IdLike) -> Halo\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.halo.forgem()\n```python\nra.halo.for_gem(gem_id: IdLike) -> List[Halo]\n```\n\n`Halo` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Halo","section":"ra.halo.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalofind","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahalofind","collection":"scripting","hash":"dfa0150fcf695b2560643e89c16b0e41","indexed_by":"docs-index"}},{"content":"Halo — ra.halo.selected()\n\n```python\nra.halo.selected() -> List[Halo]\n```\n\nHalos currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Halo","section":"ra.halo.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahaloselected","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#rahaloselected","collection":"scripting","hash":"3330309de7da4d4d720f9a0c6e3e0232","indexed_by":"docs-index"}},{"content":"Halo — Halo (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `channel_bright_cut` | `float` | yes | |\n| `channel_distance_to_gem` | `float` | yes | |\n| `channel_height` | `float` | yes | |\n| `channel_inner_height` | `float` | yes | |\n| `channel_inner_width` | `float` | yes | |\n| `channel_position_z` | `float` | yes | signed |\n| `channel_rotation` | `float` | yes | degrees, signed |\n| `channel_width` | `float` | yes | The metal rail carrying the halo stones. PositionZ and Rotation are what make a halo sit flush, float or tilt. |\n| `claw_gem_inside` | `float` | yes | The halo's own claw tip, CLAW mode only (built in Render mode only), under the panel's names: how far in toward the gem the tip reaches (a fraction of the way to the gem centre; 0 builds no tip). |\n| `claw_tension` | `float` | yes | 1-100 |\n| `claw_tip_distance` | `float` | yes | the panel's \"Tip distance\": height of the rounded tip |\n| `claw_tip_height` | `float` | yes | |\n| `claw_tip_width` | `float` | yes | |\n| `drill_type` | `str` | yes | \"NONE\" \\| \"ROUND\" \\| \"QUAD\" |\n| `force_even_number` | `bool` | yes | |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `halo_stone_count` | `int` | | Stones forming the halo ring (around the center gem) |\n| `halo_stone_size` | `float` | | |\n| `halo_stone_weight` | `float` | | |\n| `halo_total_weight` | `float` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong_count` | `int` | yes | the MOTHER gem's prongs |\n| `prong_diameter` | `float` | yes | |\n| `prong_mode` | `str` | yes | \"ROUND\" \\| \"CUSTOM\" \\| \"CLAW\": the mother gem's prongs, as on every setting with prongs. |\n| `stone_setting` | `str` | yes | \"NONE\" \\| \"SHARED\" \\| \"SCALLOPED\" |","metadata":{"title":"Halo","section":"Halo (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#halo-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#halo-handle","collection":"scripting","hash":"b901a414c35fd669953c77714051b050","indexed_by":"docs-index"}},{"content":"Halo — Halo (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_automatic_prong_size(automatic: bool)` | |\n| `set_channel_profile(asset_name: str)` | CHANNEL_PROFILE asset |\n| `set_drill_size(width: float, height: float)` | |\n| `set_element(element: str)` | Applies a saved Halo element (ra.elements.list(\"Halo\")) to this halo: its parameters replace the current ones, the mother gem stays, and the halo regenerates in place (same id). |\n| `set_fillet_factor(factor: float)` | |\n| `set_prong_gem_inside(gem_inside: float)` | signed |\n| `set_prong_height_over_girdle(height: float)` | |\n| `set_prong_profile(asset_name: str)` | CLOSED_PROFILE asset; switches the prongs to CUSTOM |\n| `set_prong_rotation(degrees: float)` | signed |\n| `set_stone_distance(stone_distance: float)` | |\n| `set_stone_gem_inside(gem_inside: float)` | signed |\n| `set_stone_size(stone_size: float)` | Parametric edits -- each regenerates the halo (the group keeps its id, so this handle stays valid; the member objects are rebuilt) and calls LicenseGate.RequireValid() first. |\n| `set_stone_vertical(vertical: float)` | signed |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Halo","section":"Halo (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/halo/#halo-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/halo/#halo-handle","collection":"scripting","hash":"65780a7155d77e3f19a19fce1d94db9d","indexed_by":"docs-index"}},{"content":"Hidden Halo\n\nA hidden halo under the centre stone.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.HiddenHaloApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `HiddenHalo` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `HiddenHalo` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a hidden halo -- a ring of small stones tucked UNDER an existing gem, facing outward -- the ArtisanHiddenHalo tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `HiddenHalo` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Hidden halos currently selected in the active doc. |","metadata":{"title":"Hidden Halo","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/","collection":"scripting","hash":"79463a63d3818c3edd70f69e499fdf5b","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.all()\n\n```python\nra.hidden_halo.all() -> List[HiddenHalo]\n```\n\n`HiddenHalo` handles for every object of this kind in the active document (empty when there is no document).\n\nra.hiddenhalo.bylayer()\n```python\nra.hidden_halo.by_layer(layer_name: str) -> List[HiddenHalo]\n```\n\n`HiddenHalo` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhaloall","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhaloall","collection":"scripting","hash":"d95cb80b5b09d3a188a3c5f8c988d25e","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.count()\n\n```python\nra.hidden_halo.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocount","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocount","collection":"scripting","hash":"070f22d2a9f434d1a54eba1bedc0383c","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.create()\n\n```python\nra.hidden_halo.create(gem_id: IdLike, stone_size=None, stone_distance=None, channel_width=None, channel_height=None, rail_shape=None, prong_type=None, profile=None, rail_x_length=None, rail_y_length=None, stone_shape=None, distance_to_gem=None, channel_position_z=None, channel_rotation=None, prong_distance=None, force_even_number=None) -> HiddenHalo\n```\n\nBuilds a hidden halo -- a ring of small stones tucked UNDER an existing gem, facing outward -- the ArtisanHiddenHalo tool, headless. `gem_id` must be a gem in the active document; any center-gem shape works (the rail is parametric, chosen by `rail_shape`, and does not follow the gem's outline). Millimetres; omitting keeps the tool default (or the user's saved defaults): stone_size 0.9, stone_distance 0.10, channel_width 1.1, channel_height 1.0. `rail_shape` is CIRCLE (default), SQUARE (opens at 5.50 x 5.50) or OVAL (5.50 x 8.70). `prong_type` is NONE (default), SHARED or SCALLOPED. `profile` picks a CHANNEL_PROFILE asset by name; omitted = the tool's \"014\" channel profile (falling back to the type default). Returns an HiddenHalo handle to the new hidden halo group.","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocreate","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocreate","collection":"scripting","hash":"693a5eafe4b42530daec64c9fb9b15d0","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `stone_size` | `float` | optional — None = the tool default |\n| `stone_distance` | `float` | optional — None = the tool default |\n| `channel_width` | `float` | optional — None = the tool default |\n| `channel_height` | `float` | optional — None = the tool default |\n| `rail_shape` | `str` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `rail_x_length` | `float` | optional — None = the tool default |\n| `rail_y_length` | `float` | optional — None = the tool default |\n| `stone_shape` | `str` | optional — None = the tool default |\n| `distance_to_gem` | `float` | optional — None = the tool default |\n| `channel_position_z` | `float` | optional — None = the tool default |\n| `channel_rotation` | `float` | optional — None = the tool default |\n| `prong_distance` | `float` | optional — None = the tool default |\n| `force_even_number` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocreate","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalocreate","collection":"scripting","hash":"70cf1741299a37f4b22946a888139310","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.find()\n\n```python\nra.hidden_halo.find(id: IdLike) -> HiddenHalo\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.hiddenhalo.forgem()\n```python\nra.hidden_halo.for_gem(gem_id: IdLike) -> List[HiddenHalo]\n```\n\n`HiddenHalo` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalofind","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhalofind","collection":"scripting","hash":"d288b8faa2ef578ebb5e7fb9e213faa4","indexed_by":"docs-index"}},{"content":"Hidden Halo — ra.hiddenhalo.selected()\n\n```python\nra.hidden_halo.selected() -> List[HiddenHalo]\n```\n\nHidden halos currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Hidden Halo","section":"ra.hiddenhalo.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhaloselected","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#rahiddenhaloselected","collection":"scripting","hash":"802f2f04b584a9476a1fc0db52054e76","indexed_by":"docs-index"}},{"content":"Hidden Halo — HiddenHalo (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `channel_distance_to_gem` | `float` | yes | |\n| `channel_height` | `float` | yes | |\n| `channel_position_z` | `float` | yes | signed |\n| `channel_rotation` | `float` | yes | degrees, signed |\n| `channel_width` | `float` | yes | The rail section. Rotation defaults to 90 and PositionZ to -0.6: together they are what makes the halo \"hidden\". |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong_distance` | `float` | yes | |\n| `rail_shape` | `str` | yes | Ring shape of the hidden halo rail: \"CIRCLE\", \"SQUARE\" or \"OVAL\". |\n| `rail_x_length` | `float` | | Extents of the SQUARE / OVAL rail (ignored by CIRCLE), millimetres. |\n| `rail_y_length` | `float` | | |\n| `stone_count` | `int` | | Small stones forming the hidden ring (under the center gem) |\n| `stone_setting` | `str` | yes | \"NONE\" \\| \"SHARED\" \\| \"SCALLOPED\" |\n| `stone_shape` | `str` | yes | \"ROUND\" \\| \"PRINCESS\" |\n| `stone_size` | `float` | yes | |\n| `stone_weight` | `float` | | |\n| `total_stone_weight` | `float` | | |","metadata":{"title":"Hidden Halo","section":"HiddenHalo (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#hiddenhalo-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#hiddenhalo-handle","collection":"scripting","hash":"bfe2327b5d0501fcf881b7407d1baca3","indexed_by":"docs-index"}},{"content":"Hidden Halo — HiddenHalo (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_channel_bright_cut(bright_cut: float)` | |\n| `set_channel_inner_height(height: float)` | |\n| `set_channel_inner_width(width: float)` | |\n| `set_channel_profile(asset_name: str)` | CHANNEL_PROFILE asset |\n| `set_force_even_number(force_even: bool)` | |\n| `set_prong_height(height: float)` | |\n| `set_rail_size(x_length: float, y_length: float)` | SQUARE / OVAL only |\n| `set_stone_distance(stone_distance: float)` | |\n| `set_stone_gem_inside(gem_inside: float)` | signed |\n| `set_stone_vertical(vertical: float)` | signed |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Hidden Halo","section":"HiddenHalo (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#hiddenhalo-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/hidden-halo/#hiddenhalo-handle","collection":"scripting","hash":"d3cc263dfd6dd822c5612fd756bda5bb","indexed_by":"docs-index"}},{"content":"Hinge\n\nHinges.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.HingeApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `point` marks where the hinge goes ON the brep (the tool's pick-point-on-solid). |\n\nra.hinge.create()\n```python\nra.hinge.create(brep_id: IdLike, point: PointLike, diameter=None, cut_diameter=None, thickness=None, number_of_males=None, opening_angle=None) -> List[str]\n```\n\n`point` marks where the hinge goes ON the brep (the tool's pick-point-on-solid). Defaults: pin diameter 0.7, cut diameter 4, thickness 1, 1 male, opening angle 10. Returns the ids of the resulting breps.\n\n| Parameter | Type | |\n|---|---|---|\n| `brep_id` | `IdLike` | required |\n| `point` | `PointLike` | required |\n| `diameter` | `float` | optional — None = the tool default |\n| `cut_diameter` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `number_of_males` | `int` | optional — None = the tool default |\n| `opening_angle` | `float` | optional — None = the tool default |","metadata":{"title":"Hinge","url":"https://www.rhinoartisan.com/docs/scripting/python/hinge/","source":"https://www.rhinoartisan.com/docs/scripting/python/hinge/","collection":"scripting","hash":"ec0190401057f411951c6ac884383c66","indexed_by":"docs-index"}},{"content":"Honeycomb\n\nHoneycomb patterns over surfaces.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.HoneyCombApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: cell diameter 6, wall thickness 0.8. |\n\nra.honeycomb.create()\n```python\nra.honeycomb.create(curve_id: IdLike, diameter=None, thickness=None, height=None) -> List[str]\n```\n\nDefaults: cell diameter 6, wall thickness 0.8. Returns the created object ids (pattern breps and helper curves).\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `diameter` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |","metadata":{"title":"Honeycomb","url":"https://www.rhinoartisan.com/docs/scripting/python/honeycomb/","source":"https://www.rhinoartisan.com/docs/scripting/python/honeycomb/","collection":"scripting","hash":"f0e93c270c2534530eeea2b2c989c1aa","indexed_by":"docs-index"}},{"content":"Huggie\n\nHuggie earrings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.HuggieApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `mode` is \"CLOSED\" (hoop with hinge, default) or \"OPENED\" (partial hoop with post). |\n\nra.huggie.create()\n```python\nra.huggie.create(plane=None, inner_width=None, inner_height=None, mode=None, aperture=None, aperture_percentage=None, profile=None) -> str\n```\n\n`mode` is \"CLOSED\" (hoop with hinge, default) or \"OPENED\" (partial hoop with post). `aperture` is the closed-mode opening in mm (default 6.5); `aperture_percentage` is the opened-mode opening as a 0..1 fraction (default 0.25, pass -1 to keep it). `profile` names a ring-profile asset applied to the three huggie profiles. Defaults: inner width 15, inner height 20.\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `inner_width` | `float` | optional — None = the tool default |\n| `inner_height` | `float` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `aperture` | `float` | optional — None = the tool default |\n| `aperture_percentage` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |","metadata":{"title":"Huggie","url":"https://www.rhinoartisan.com/docs/scripting/python/huggie/","source":"https://www.rhinoartisan.com/docs/scripting/python/huggie/","collection":"scripting","hash":"e8c87c73100d1472651b484f694d8362","indexed_by":"docs-index"}},{"content":"Link\n\nChain links.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.LinkApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: width 9, height 6, wire diameter 3, twist angle 90. |\n\nra.link.create()\n```python\nra.link.create(plane=None, width=None, height=None, diameter=None, twist_angle=None) -> str\n```\n\nDefaults: width 9, height 6, wire diameter 3, twist angle 90. Pass twist_angle -1 to keep the default (0 is a valid twist).\n\n| Parameter | Type | |\n|---|---|---|\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `twist_angle` | `float` | optional — None = the tool default |","metadata":{"title":"Link","url":"https://www.rhinoartisan.com/docs/scripting/python/link/","source":"https://www.rhinoartisan.com/docs/scripting/python/link/","collection":"scripting","hash":"0e38d87c55cb69e1aa29dd3a9bf7c088","indexed_by":"docs-index"}},{"content":"Manufacturing\n\nProduction: repair, printability checks, identifiers, sprues, resizing, exports.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ManufacturingApi`.","metadata":{"title":"Manufacturing","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/","collection":"scripting","hash":"0cec5b7422966c77c9d0083159ef9162","indexed_by":"docs-index"}},{"content":"Manufacturing — Functions\n\n| Function | |\n|---|---|\n| `add_identifier()` | Adds an identifier tag to a closed ring mesh (the ArtisanIdentifier tool, headless): a pipe between the two given points on the mesh carrying an engraved reference text. |\n| `automatic_repair()` | Repairs the given objects into a single printable mesh (the ArtisanAutomaticRepair tool, headless): closes gaps, fixes normals, makes the result watertight. |\n| `balance_check()` | Checks how a pendant/earring hangs (the ArtisanBalancerChecker tool): the piece hangs from `base_id` (the bail or hook), and gravity pulls its volume centroid straight below the hook. |\n| `detect_non_printable()` | Flags the objects that would not print (the ArtisanQuickNonPrintableDetector tool): bad objects, duplicates, open surfaces and open polysurfaces, using Rhino's own selectors. |\n| `export_all_in_one()` | Merges solids/meshes into ONE printable mesh and writes a binary STL (the ArtisanExportAllInOne tool, headless). |\n| `export_from_layers()` | Writes one STL per visible layer holding meshes, named \" .stl\" inside `folder` (the ArtisanExportFromLayers tool, headless). |\n| `import_to_layers()` | Imports every STL in `folder`, each file into its own layer named after the file with a distinct color per layer (the ArtisanImportToLayers tool, headless). |\n| `quick_check()` | The ArtisanQuickCheck tool, scriptable: verifies each mesh is valid and watertight, and (like the tool) recolors it green when printable, red when not. |\n| `reduce_thickness()` | Hollows a wall down to a uniform minimum thickness (the ArtisanReduceThickness tool, headless). |","metadata":{"title":"Manufacturing","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","collection":"scripting","hash":"681ac5451ef3bbef923ab53b947bf0e7","indexed_by":"docs-index"}},{"content":"Manufacturing — Functions\n\n| Function | |\n|---|---|\n| `resize_ring()` | Batch ring resizer (the ArtisanResizer tool, headless): takes a CLOSED ring mesh and produces one resized copy per target diameter, laid out in a row (spaced by the tool's ring distance) on child layers under a \"Resizer\" parent layer, one group per size -- same output as the tool's Layers mode. |\n| `sprue_cluster_tree()` | Cluster casting tree (the ArtisanSprueClusterTree tool, headless): a cylinder built as a grid of two crossed helix families (rhombic cells) standing on `base_point`, with an anchor node at every crossing; a copy of the given meshes is placed on the nodes in round-robin, each held by a mini-connector (diameter 1, length 6). |\n| `sprue_curve()` | Perimeter-frame sprue (the ArtisanSprueCurve tool, headless): a closed pipe frame around the piece with tapered connectors reaching it and a horizontal injection post on the front side. |\n| `sprue_external_frames()` | External-frame sprue (the ArtisanSprueExternalFrames tool, headless), meant for elongated pieces laid in a row (chains, bracelets): a rounded-rectangle runner around the combined bounding box of the given meshes, with pairs of thin stubs reaching inward from the long sides and, optionally, one from each short end. |\n| `sprue_external_tree()` | External-tree sprue for casting (the ArtisanSprueExternalTree tool, headless): a tapered trunk standing OUTSIDE the mesh at `trunk_base_point` with one branch per contact point reaching the outside of the closed mesh. |\n| `sprue_helix()` | Helix casting tree (the ArtisanSprueHelix tool, headless): a conical base, a vertical trunk and a helical wire climbing around it, with `copies` copies of the link mesh hung along the wire -- the tool for printing whole chains in one tree. |","metadata":{"title":"Manufacturing","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","collection":"scripting","hash":"e9313c984d6489e1ae800e9bf39d190e","indexed_by":"docs-index"}},{"content":"Manufacturing — Functions\n\n| Function | |\n|---|---|\n| `sprue_inner_branches()` | Inner-branches sprue for casting (the ArtisanSprueInnerBranches tool, headless): a central post rising from `base_point` with one branch per contact point reaching the inside of the closed mesh (typically a ring), optionally mirrored by symmetry. |\n| `sprue_inner_tree()` | Builds an inner-tree sprue for casting (the ArtisanSprueInnerTree tool, headless): a trunk from `base_point` with branches reaching each of `contact_points` on the closed mesh. |\n| `sprue_multiple_copies()` | Multiple-copies sprue (the ArtisanSprueMultipleCopies tool, headless): a tapered trunk between `trunk_start` and `trunk_end` with one curved branch from the trunk to each of `contact_points` on the mesh(es). |\n| `sprue_single()` | Single sprue post (the ArtisanSprueSingle tool, headless): one tapered connector at `point`, which should lie ON the mesh (it plays the role of the tool's pick-point-on-mesh prompt). |\n| `sprue_spiral()` | Flat spiral casting sprue (the ArtisanSprueSpiral tool, headless): the same chain-printing idea as the helix but with the wire coiled FLAT, standing on legs, each link hung from a single vertical connector. |\n| `sprue_tree()` | Radial casting tree (the ArtisanSprueTree tool, headless): a base + conical trunk rising from `base_point`, with `floors` floors x `pieces_per_floor` branches around it, and a copy of the given meshes distributed over the branches in round-robin. |","metadata":{"title":"Manufacturing","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#functions","collection":"scripting","hash":"b8db00688f8cfb0db15da238b9658a18","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.addidentifier()\n\n```python\nra.manufacturing.add_identifier(mesh_id: IdLike, point1: PointLike, point2: PointLike, text=None, diameter=None, thickness=None, font_size=None, overlapping=None) -> str\n```\n\nAdds an identifier tag to a closed ring mesh (the ArtisanIdentifier tool, headless): a pipe between the two given points on the mesh carrying an engraved reference text. The two points play the role of the tool's two interactive picks -- both should lie on/near the mesh. Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): diameter 1.5, thickness 1.5, font_size 2, overlapping 0.15. Returns the Guid of the new mesh (ring + tag); the original mesh is left in the document, same as the tool.\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `point1` | `PointLike` | required |\n| `point2` | `PointLike` | required |\n| `text` | `str` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `font_size` | `float` | optional — None = the tool default |\n| `overlapping` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.addidentifier()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingaddidentifier","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingaddidentifier","collection":"scripting","hash":"a5030d566c114761a6587d314d4ec0da","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.automaticrepair()\n\n```python\nra.manufacturing.automatic_repair(object_ids=None, precision=None, delete_original=None) -> RepairResult\n```\n\nRepairs the given objects into a single printable mesh (the ArtisanAutomaticRepair tool, headless): closes gaps, fixes normals, makes the result watertight. Rhino 8+ only (uses ShrinkWrap). object_ids objects to repair; None/empty = current selection. Gems are skipped automatically, like the tool. precision repair precision in mm; 0 = the tool's configured default (typically 0.025). Smaller = more faithful and slower. delete_original True = remove the source objects after the repair. The repaired mesh is added to the last user layer with the wax color from the settings, same as the tool's Accept button. Long operation: Rhino stays busy while it computes.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `precision` | `float` | optional — None = the tool default |\n| `delete_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.automaticrepair()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingautomaticrepair","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingautomaticrepair","collection":"scripting","hash":"cc8d8a49a2cadedb61d3c690370fb6bd","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.balancecheck()\n\n```python\nra.manufacturing.balance_check(base_id: IdLike, geometry_ids: Sequence[IdLike], apply=None, delete_original=None, tolerance=None) -> BalanceReport\n```\n\nChecks how a pendant/earring hangs (the ArtisanBalancerChecker tool): the piece hangs from `base_id` (the bail or hook), and gravity pulls its volume centroid straight below the hook. The report gives the tilt the piece would take, in degrees (0 = it hangs straight). apply True = replicate the tool's Accept: adds ROTATED COPIES of the geometry so the centroid hangs below the base point (the originals stay unless delete_original). Default False = report only. delete_original with apply, removes the source geometry. tolerance degrees under which IsBalanced is True (default 1). Read-only unless `apply` is True.\n\n| Parameter | Type | |\n|---|---|---|\n| `base_id` | `IdLike` | required |\n| `geometry_ids` | `Sequence[IdLike]` | required |\n| `apply` | `bool` | optional — None = the tool default |\n| `delete_original` | `bool` | optional — None = the tool default |\n| `tolerance` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.balancecheck()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingbalancecheck","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingbalancecheck","collection":"scripting","hash":"3b0f2873a7f450a674ea235a48929c08","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.detectnonprintable()\n\n```python\nra.manufacturing.detect_non_printable() -> NonPrintableReport\n```\n\nFlags the objects that would not print (the ArtisanQuickNonPrintableDetector tool): bad objects, duplicates, open surfaces and open polysurfaces, using Rhino's own selectors. Like the tool it leaves the offenders SELECTED so you can see them; the report lists them by category. Cheap; run it before an STL export. Nothing flagged = Count 0 and an empty selection.","metadata":{"title":"Manufacturing","section":"ra.manufacturing.detectnonprintable()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingdetectnonprintable","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingdetectnonprintable","collection":"scripting","hash":"88dc1bde9d23c5a5c30003cd4625a9b5","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.exportallinone()\n\n```python\nra.manufacturing.export_all_in_one(path: str, object_ids=None, allow_non_printable=None) -> AllInOneExport\n```\n\nMerges solids/meshes into ONE printable mesh and writes a binary STL (the ArtisanExportAllInOne tool, headless). Breps, extrusions and SubDs are meshed with the tool's fine analysis parameters; every part is repaired and checked. path destination .stl (extension appended, folder created) object_ids objects to export; None/empty = current selection, and when nothing is selected every visible solid/mesh that is not a gem (like the tool's filter) allow_non_printable the tool asks \"part of the geometry is not printable, export anyway?\": False (default) fails listing the offending ids (and selects them, like the tool); True exports the valid part anyway. Returns the path plus the check summary.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `allow_non_printable` | `bool` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.exportallinone()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingexportallinone","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingexportallinone","collection":"scripting","hash":"4895689e0fbb6b1efb1b0452d224eb37","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.exportfromlayers()\n\n```python\nra.manufacturing.export_from_layers(folder: str, overwrite=None) -> List[LayerExport]\n```\n\nWrites one STL per visible layer holding meshes, named \" .stl\" inside `folder` (the ArtisanExportFromLayers tool, headless). Only MESH objects are exported, exactly like the tool: mesh your solids first (AutomaticRepair / ExportAllInOne mesh on the fly, this one does not). Layers without meshes are ignored. overwrite the tool asks per existing file; False skips those files (reported with Skipped = True), True (default) replaces them. Returns one entry per layer with meshes.\n\n| Parameter | Type | |\n|---|---|---|\n| `folder` | `str` | required |\n| `overwrite` | `bool` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.exportfromlayers()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingexportfromlayers","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingexportfromlayers","collection":"scripting","hash":"0c92f9fcb16e339195824d398b786439","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.importtolayers()\n\n```python\nra.manufacturing.import_to_layers(folder: str) -> List[LayerImport]\n```\n\nImports every STL in `folder`, each file into its own layer named after the file with a distinct color per layer (the ArtisanImportToLayers tool, headless). Files that bring no objects are skipped without creating a layer. Returns one entry per imported file. Any previous selection is cleared.\n\n| Parameter | Type | |\n|---|---|---|\n| `folder` | `str` | required |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.importtolayers()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingimporttolayers","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingimporttolayers","collection":"scripting","hash":"4333db4651c2c2fba3e51309f16d95d1","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.quickcheck()\n\n```python\nra.manufacturing.quick_check(object_ids=None) -> List[MeshCheckResult]\n```\n\nThe ArtisanQuickCheck tool, scriptable: verifies each mesh is valid and watertight, and (like the tool) recolors it green when printable, red when not. `object_ids` None/empty = current selection; non-mesh objects are skipped. Returns one result per checked mesh.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.quickcheck()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingquickcheck","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingquickcheck","collection":"scripting","hash":"44a6cab0cde97d1e2c57fa391dd14ad3","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.reducethickness()\n\n```python\nra.manufacturing.reduce_thickness(object_id: IdLike, points: Sequence[PointLike], thickness=None, radius=None, steps=None) -> ReduceThicknessResult\n```\n\nHollows a wall down to a uniform minimum thickness (the ArtisanReduceThickness tool, headless). The tool is a brush: you paint the side of the wall you want to sink and it drops to the target thickness, measured against the opposite wall and the gems (gems count as walls and their seats are masked, so nothing thins under a stone). Here the brush strokes become `points`: every point is a brush center ON the object's surface, on the side to hollow (usually the inside of the shank). object_id mesh, polysurface, extrusion or SubD; the result is always a mesh that REPLACES it (same attributes/layer) points brush centers on the surface, in order thickness target wall thickness in mm; None = the tool default 0.8 radius brush radius in mm; None = the tool default (8% of the object's bounding-box diagonal) steps brush steps applied at each point; 0 = 4. The center lands on the target at once, the rim converges with more steps. The tool warns when vertices end below the target; here that count is returned as ThinVertices instead. Returns the new mesh id and the grams saved with the document's first metal.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_id` | `IdLike` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `thickness` | `float` | optional — None = the tool default |\n| `radius` | `float` | optional — None = the tool default |\n| `steps` | `int` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.reducethickness()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingreducethickness","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingreducethickness","collection":"scripting","hash":"9452aa916f9093494f31eb55e8538fe1","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.resizering()\n\n```python\nra.manufacturing.resize_ring(mesh_id: IdLike, from_diameter: float, to_diameters: Sequence[float], names=None) -> List[ResizedRing]\n```\n\nBatch ring resizer (the ArtisanResizer tool, headless): takes a CLOSED ring mesh and produces one resized copy per target diameter, laid out in a row (spaced by the tool's ring distance) on child layers under a \"Resizer\" parent layer, one group per size -- same output as the tool's Layers mode. mesh_id the ring mesh to resize from_diameter the ring's CURRENT inner diameter in mm; 0 = the document's finger size to_diameters target inner diameters in mm (e.g. [16.5, 17.35, 18.2]) names optional labels, parallel to to_diameters; default is the diameter formatted (\"17.35\") The user's saved Resizer defaults (mode, alignment, identifier tag, sprue, ring spacing) apply when there are any, like in the tool; an identifier tag or sprue they enable goes into its ring's layer and group. Long operation (one boolean pipeline per size).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `from_diameter` | `float` | required |\n| `to_diameters` | `Sequence[float]` | required |\n| `names` | `Sequence[str]` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.resizering()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingresizering","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingresizering","collection":"scripting","hash":"6afdf6f0554ccd17715121cab59571d5","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.sprueclustertree()\n\n```python\nra.manufacturing.sprue_cluster_tree(mesh_ids=None, base_point=None, copies_per_mesh=None, diameter=None, height=None, cells_around=None, rows=None, wire_diameter=None) -> List[str]\n```\n\nCluster casting tree (the ArtisanSprueClusterTree tool, headless): a cylinder built as a grid of two crossed helix families (rhombic cells) standing on `base_point`, with an anchor node at every crossing; a copy of the given meshes is placed on the nodes in round-robin, each held by a mini-connector (diameter 1, length 6). Copies anchor by the bottom-center of their bounding box, like the tool's default pick. mesh_ids the model meshes; None/empty = current selection. base_point where the base sits (default: world origin). copies_per_mesh copies of EACH mesh; 0 = fill the free nodes. Numeric arguments with 0 keep the tool defaults: diameter 65, height 90, cells_around 8, rows 7, wire_diameter 3 (mm). Long operation. Returns the ids of ALL the meshes added (grid, base, connectors and every model copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `base_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `copies_per_mesh` | `int` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `cells_around` | `int` | optional — None = the tool default |\n| `rows` | `int` | optional — None = the tool default |\n| `wire_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.sprueclustertree()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueclustertree","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueclustertree","collection":"scripting","hash":"9d74b9e041c19e9e594df1f5c5421348","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruecurve()\n\n```python\nra.manufacturing.sprue_curve(mesh_id: IdLike, curve_id=None, offset=None, smooth=None, width=None, height=None, connection_count=None, connection_diameter=None, symmetry=None) -> List[str]\n```\n\nPerimeter-frame sprue (the ArtisanSprueCurve tool, headless): a closed pipe frame around the piece with tapered connectors reaching it and a horizontal injection post on the front side. The frame is the automatic silhouette of the piece pushed outwards by `offset`, or the curve `curve_id` when given (the tool's custom-curve pick). Connections are seeded equidistant along the frame, exactly like the tool's initial layout. mesh_id the piece mesh. curve_id optional closed perimeter curve; None/omitted = automatic silhouette. symmetry \"None\", \"X\", \"Y\" or \"Quad\" (case-insensitive); None = None. Numeric arguments with 0 keep the tool defaults: offset 2, width 1, height 1, connection_count 4, connection_diameter 0.3 (mm); `smooth` uses -1 = default (8 iterations) because 0 is a real value (no smoothing). The injection post keeps the tool defaults (external diameter 3, length 5). Returns the ids of the meshes added (frame, injection and connectors), baked to the last user layer with the wax color, same as the tool's Accept.","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruecurve()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruecurve","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruecurve","collection":"scripting","hash":"1de4ecddf22d5b21dc3ddadf9a633740","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruecurve()\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `offset` | `float` | optional — None = the tool default |\n| `smooth` | `int` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `connection_count` | `int` | optional — None = the tool default |\n| `connection_diameter` | `float` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruecurve()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruecurve","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruecurve","collection":"scripting","hash":"e07822712b47dc30f54c992ceacd24fb","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.sprueexternalframes()\n\n```python\nra.manufacturing.sprue_external_frames(mesh_ids=None, margin=None, corner_radius=None, frame_diameter=None, connector_count=None, connector_separation=None, connector_length=None, end_connectors=None) -> List[str]\n```\n\nExternal-frame sprue (the ArtisanSprueExternalFrames tool, headless), meant for elongated pieces laid in a row (chains, bracelets): a rounded-rectangle runner around the combined bounding box of the given meshes, with pairs of thin stubs reaching inward from the long sides and, optionally, one from each short end. mesh_ids the pieces the frame is built around; None/empty = current selection end_connectors True = include the two short-side stubs (the tool's default) Numeric arguments with 0 keep the tool defaults: margin 3, corner_radius 3, frame_diameter 2, connector_separation 5, connector_length 4 (mm); connector_count 0 = one stub pair per given object (what the tool seeds on selection). Returns the ids of the frame meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `margin` | `float` | optional — None = the tool default |\n| `corner_radius` | `float` | optional — None = the tool default |\n| `frame_diameter` | `float` | optional — None = the tool default |\n| `connector_count` | `int` | optional — None = the tool default |\n| `connector_separation` | `float` | optional — None = the tool default |\n| `connector_length` | `float` | optional — None = the tool default |\n| `end_connectors` | `bool` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.sprueexternalframes()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueexternalframes","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueexternalframes","collection":"scripting","hash":"c9dd13bad7ce6faecbf500b13384e9b6","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.sprueexternaltree()\n\n```python\nra.manufacturing.sprue_external_tree(mesh_id: IdLike, trunk_base_point: PointLike, contact_points: Sequence[PointLike], height=None, top_diameter=None, bottom_diameter=None, branch_trunk_diameter=None, branch_contact_diameter=None) -> List[str]\n```\n\nExternal-tree sprue for casting (the ArtisanSprueExternalTree tool, headless): a tapered trunk standing OUTSIDE the mesh at `trunk_base_point` with one branch per contact point reaching the outside of the closed mesh. The tool's two interactive picks become explicit arguments; the tool seeds the trunk beside the mesh (bounding-box Max.X + 5, centre Y, Z = 0). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 20, top_diameter 3, bottom_diameter 5, branch_trunk_diameter 2, branch_contact_diameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `trunk_base_point` | `PointLike` | required |\n| `contact_points` | `Sequence[PointLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `top_diameter` | `float` | optional — None = the tool default |\n| `bottom_diameter` | `float` | optional — None = the tool default |\n| `branch_trunk_diameter` | `float` | optional — None = the tool default |\n| `branch_contact_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.sprueexternaltree()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueexternaltree","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueexternaltree","collection":"scripting","hash":"c5fed2ad46c776895f9aca244f7c1c48","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruehelix()\n\n```python\nra.manufacturing.sprue_helix(link_mesh_id: IdLike, base_point=None, copies=None, wire_diameter=None, trunk_diameter=None, connector_length=None, connector_diameter=None, clearance_margin=None) -> List[str]\n```\n\nHelix casting tree (the ArtisanSprueHelix tool, headless): a conical base, a vertical trunk and a helical wire climbing around it, with `copies` copies of the link mesh hung along the wire -- the tool for printing whole chains in one tree. Like the tool's Generate button, the helix is auto-sized (turns, diameter, trunk length, one support arm per turn) so the requested copies fit without collisions; the link is chained along its longest axis, same as the tool's initial pick. link_mesh_id the chain link (mesh or SubD) base_point where the tree stands on the plate; (0,0,0) = origin, the tool's starting position Numeric arguments with 0 keep the tool defaults: copies 125, wire_diameter 3, trunk_diameter 10, connector_length 3.25, connector_diameter 1.5, clearance_margin 0 (mm). Long operation (the auto-sizing searches for a collision-free layout). Returns the ids of ALL the meshes added (tree + one mesh per copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | |\n|---|---|---|\n| `link_mesh_id` | `IdLike` | required |\n| `base_point` | `PointLike` | optional — None = the tool default |\n| `copies` | `int` | optional — None = the tool default |\n| `wire_diameter` | `float` | optional — None = the tool default |\n| `trunk_diameter` | `float` | optional — None = the tool default |\n| `connector_length` | `float` | optional — None = the tool default |\n| `connector_diameter` | `float` | optional — None = the tool default |\n| `clearance_margin` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruehelix()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruehelix","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruehelix","collection":"scripting","hash":"e4c5ea71d37e11c3b8beb0e792fca3f6","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.sprueinnerbranches()\n\n```python\nra.manufacturing.sprue_inner_branches(mesh_id: IdLike, base_point: PointLike, contact_points: Sequence[PointLike], height=None, top_diameter=None, branch_contact_diameter=None, symmetry=None) -> List[str]\n```\n\nInner-branches sprue for casting (the ArtisanSprueInnerBranches tool, headless): a central post rising from `base_point` with one branch per contact point reaching the inside of the closed mesh (typically a ring), optionally mirrored by symmetry. The tool's two interactive picks become explicit arguments. mesh_id the closed mesh to sprue base_point where the central post stands; the tool seeds it under the mesh centre at Z = 0 contact_points points ON the mesh where the branches attach symmetry 0 = none (default), 1 = vertical mirror (X), 2 = horizontal mirror (Y), 3 = quad -- the tool's Symmetry combo, which multiplies each contact point Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height = the mesh bounding-box centre height (what the tool seeds on selection), top_diameter 3, branch_contact_diameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, wax color, same as the tool's Accept).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `base_point` | `PointLike` | required |\n| `contact_points` | `Sequence[PointLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `top_diameter` | `float` | optional — None = the tool default |\n| `branch_contact_diameter` | `float` | optional — None = the tool default |\n| `symmetry` | `int` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.sprueinnerbranches()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueinnerbranches","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueinnerbranches","collection":"scripting","hash":"70335fe4701ff19838bdb92db81d5bde","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.sprueinnertree()\n\n```python\nra.manufacturing.sprue_inner_tree(mesh_id: IdLike, base_point: PointLike, contact_points: Sequence[PointLike], height=None, top_diameter=None, bottom_diameter=None, branch_contact_diameter=None) -> List[str]\n```\n\nBuilds an inner-tree sprue for casting (the ArtisanSprueInnerTree tool, headless): a trunk from `base_point` with branches reaching each of `contact_points` on the closed mesh. The two interactive picks of the tool become explicit arguments. Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 10, top_diameter 3, bottom_diameter 5, branch_contact_diameter 0.8 (mm). Returns the ids of the sprue meshes added (last user layer, same as the tool's Accept).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `base_point` | `PointLike` | required |\n| `contact_points` | `Sequence[PointLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `top_diameter` | `float` | optional — None = the tool default |\n| `bottom_diameter` | `float` | optional — None = the tool default |\n| `branch_contact_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.sprueinnertree()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueinnertree","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingsprueinnertree","collection":"scripting","hash":"226ec25ea649042ca729954f23e0cc26","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruemultiplecopies()\n\n```python\nra.manufacturing.sprue_multiple_copies(mesh_ids: Sequence[IdLike], trunk_start: PointLike, trunk_end: PointLike, contact_points: Sequence[PointLike], top_diameter=None, bottom_diameter=None, branch_trunk_diameter=None, branch_contact_diameter=None) -> List[str]\n```\n\nMultiple-copies sprue (the ArtisanSprueMultipleCopies tool, headless): a tapered trunk between `trunk_start` and `trunk_end` with one curved branch from the trunk to each of `contact_points` on the mesh(es). The tool's three interactive picks become arguments; where the tool asks for a matching point ON the trunk per contact, this method projects each contact onto the trunk line instead (closest point), which is the natural headless equivalent. mesh_ids the piece mesh(es), merged like the tool's selector; None/empty = current selection. trunk_start bottom end of the trunk. trunk_end top end of the trunk. contact_points points on the mesh the branches reach (at least one). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): top_diameter 1.3, bottom_diameter 2.3, branch_trunk_diameter 1.2, branch_contact_diameter 0.8 (mm). Returns the ids of the meshes added (trunk + one per branch), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_ids` | `Sequence[IdLike]` | required |\n| `trunk_start` | `PointLike` | required |\n| `trunk_end` | `PointLike` | required |\n| `contact_points` | `Sequence[PointLike]` | required |\n| `top_diameter` | `float` | optional — None = the tool default |\n| `bottom_diameter` | `float` | optional — None = the tool default |\n| `branch_trunk_diameter` | `float` | optional — None = the tool default |\n| `branch_contact_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruemultiplecopies()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruemultiplecopies","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruemultiplecopies","collection":"scripting","hash":"209f492f603ac8418687eaabca7aae88","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruesingle()\n\n```python\nra.manufacturing.sprue_single(mesh_id: IdLike, point: PointLike, height=None, top_x=None, top_y=None, bottom_x=None, bottom_y=None, inside_ring=None) -> str\n```\n\nSingle sprue post (the ArtisanSprueSingle tool, headless): one tapered connector at `point`, which should lie ON the mesh (it plays the role of the tool's pick-point-on-mesh prompt). Numeric arguments with 0 keep the tool defaults (or the user's saved defaults): height 2, top 1.5 x 1.5, bottom 1.5 x 1.5, inside_ring 0.2 (mm). Returns the Guid of the sprue mesh (added as-is, same as the tool's Accept).\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_id` | `IdLike` | required |\n| `point` | `PointLike` | required |\n| `height` | `float` | optional — None = the tool default |\n| `top_x` | `float` | optional — None = the tool default |\n| `top_y` | `float` | optional — None = the tool default |\n| `bottom_x` | `float` | optional — None = the tool default |\n| `bottom_y` | `float` | optional — None = the tool default |\n| `inside_ring` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruesingle()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruesingle","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruesingle","collection":"scripting","hash":"93086ecd1c1c5ca0798755c655de2ee3","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruespiral()\n\n```python\nra.manufacturing.sprue_spiral(link_mesh_id: IdLike, base_point=None, copies=None, max_diameter=None, wire_diameter=None, connector_length=None, clearance_margin=None, show_base=None) -> List[str]\n```\n\nFlat spiral casting sprue (the ArtisanSprueSpiral tool, headless): the same chain-printing idea as the helix but with the wire coiled FLAT, standing on legs, each link hung from a single vertical connector. Like the tool's Generate button, the spiral is auto-sized (turns, turn spacing, inner eye) so the requested copies fit within `max_diameter`; the link hangs from its Y axis, same as the tool's initial pick. link_mesh_id the chain link (mesh or SubD) base_point centre of the spiral on the plate; (0,0,0) = origin, the tool's starting position show_base True = add the honeycomb base plate under the legs (off by default, like the tool) Numeric arguments with 0 keep the tool defaults: copies 60, max_diameter 100, wire_diameter 3, connector_length 3.25, clearance_margin 0 (mm). Long operation (the auto-sizing searches for a collision-free layout). Returns the ids of ALL the meshes added (spiral + one mesh per copy), baked to the last user layer with the wax color, same as the tool's Accept.\n\n| Parameter | Type | |\n|---|---|---|\n| `link_mesh_id` | `IdLike` | required |\n| `base_point` | `PointLike` | optional — None = the tool default |\n| `copies` | `int` | optional — None = the tool default |\n| `max_diameter` | `float` | optional — None = the tool default |\n| `wire_diameter` | `float` | optional — None = the tool default |\n| `connector_length` | `float` | optional — None = the tool default |\n| `clearance_margin` | `float` | optional — None = the tool default |\n| `show_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruespiral()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruespiral","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruespiral","collection":"scripting","hash":"736cf37ac4115c18d5b0f02eb4d6fcf3","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruetree()\n\n```python\nra.manufacturing.sprue_tree(mesh_ids=None, base_point=None, copies_per_mesh=None, height=None, bottom_diameter=None, top_diameter=None, floors=None, pieces_per_floor=None, branch_diameter=None) -> List[str]\n```\n\nRadial casting tree (the ArtisanSprueTree tool, headless): a base + conical trunk rising from `base_point`, with `floors` floors x `pieces_per_floor` branches around it, and a copy of the given meshes distributed over the branches in round-robin. Each copy hangs from its branch by the bottom-center of its bounding box (the tool's default anchor) with the default branch (length 8.5, angle 15 deg). mesh_ids the model meshes; None/empty = current selection. base_point where the base sits (default: world origin, like the tool). copies_per_mesh copies of EACH mesh; 0 = fill the free branches (the tool's automatic mode). Numeric arguments with 0 keep the tool defaults: height 150, bottom_diameter 10, top_diameter 10, floors 7, pieces_per_floor 8, branch_diameter 1.5 (mm). Long operation. Returns the ids of ALL the meshes added (base, trunk, connectors and every model copy), baked to the last user layer with the wax color, same as the tool's Accept.","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruetree()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruetree","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruetree","collection":"scripting","hash":"f2c8bee0a6eb62b588be884976e89418","indexed_by":"docs-index"}},{"content":"Manufacturing — ra.manufacturing.spruetree()\n\n| Parameter | Type | |\n|---|---|---|\n| `mesh_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `base_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `copies_per_mesh` | `int` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `bottom_diameter` | `float` | optional — None = the tool default |\n| `top_diameter` | `float` | optional — None = the tool default |\n| `floors` | `int` | optional — None = the tool default |\n| `pieces_per_floor` | `int` | optional — None = the tool default |\n| `branch_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Manufacturing","section":"ra.manufacturing.spruetree()","url":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruetree","source":"https://www.rhinoartisan.com/docs/scripting/python/manufacturing/#ramanufacturingspruetree","collection":"scripting","hash":"ad038e631640615a7823b97c104a6061","indexed_by":"docs-index"}},{"content":"Martini\n\nMartini settings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.MartiniApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Martini` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Martini` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a martini setting -- four tapering prongs meeting in a point below an existing gem, with an optional upper rail and two lateral side gems -- the ArtisanMartini tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Martini` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Martinis currently selected in the active doc. |","metadata":{"title":"Martini","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/","collection":"scripting","hash":"7eda90ce21c38252ea3d80b323eb59fc","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.all()\n\n```python\nra.martini.all() -> List[Martini]\n```\n\n`Martini` handles for every object of this kind in the active document (empty when there is no document).\n\nra.martini.bylayer()\n```python\nra.martini.by_layer(layer_name: str) -> List[Martini]\n```\n\n`Martini` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Martini","section":"ra.martini.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartiniall","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartiniall","collection":"scripting","hash":"db577e11c600b445c6b42233c1273fec","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.count()\n\n```python\nra.martini.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Martini","section":"ra.martini.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicount","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicount","collection":"scripting","hash":"6a73355cde1d0de87e9a97ed09a92b80","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.create()\n\n```python\nra.martini.create(gem_id: IdLike, prong_height=None, prong_diameter_top=None, prong_diameter_bottom=None, upper_rail=None, side_gems=None, side_gem_size=None, prong_mode=None, face_tangent=None, prong_profile_name=None, rail_width=None, rail_height=None, rail_height_under_girdle=None, rail_profile_name=None, side_gem_shape=None, side_bezel_width=None, side_distance=None) -> Martini\n```\n\nBuilds a martini setting -- four tapering prongs meeting in a point below an existing gem, with an optional upper rail and two lateral side gems -- the ArtisanMartini tool, headless. `gem_id` must be a gem in the active document with a martini-friendly shape (any shape except TRIANGLE and COFFIN). Millimetres; 0 (or None) keeps the tool default (or the user's saved defaults): prong_height 5.40, prong_diameter_top 1.30, prong_diameter_bottom 1.30, side_gem_size 1.40; upper_rail and side_gems are both enabled by default. As in the panel, the prong \"face tangent\" behaviour is seeded from the gem's symmetry unless `face_tangent` says otherwise. `prong_mode` picks the prong construction: ROUND (default), CUSTOM (the `prong_profile_name` section; a profile alone implies it) or CLAW; DEFAULT and CIRCLE also mean ROUND. Claw tips are built in Render mode only, and are shaped through the returned handle (martini.claw_cap_height = ... and friends), because their defaults are signed and this signature reads 0 as \"keep the default\". Returns an Martini handle to the new martini group.","metadata":{"title":"Martini","section":"ra.martini.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicreate","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicreate","collection":"scripting","hash":"4a7f047b08d8125b8bd39564f2cc7d06","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `prong_height` | `float` | optional — None = the tool default |\n| `prong_diameter_top` | `float` | optional — None = the tool default |\n| `prong_diameter_bottom` | `float` | optional — None = the tool default |\n| `upper_rail` | `Optional[bool]` | optional — None = the tool default |\n| `side_gems` | `Optional[bool]` | optional — None = the tool default |\n| `side_gem_size` | `float` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |\n| `face_tangent` | `Optional[bool]` | optional — None = the tool default |\n| `prong_profile_name` | `str` | optional — None = the tool default |\n| `rail_width` | `float` | optional — None = the tool default |\n| `rail_height` | `float` | optional — None = the tool default |\n| `rail_height_under_girdle` | `float` | optional — None = the tool default |\n| `rail_profile_name` | `str` | optional — None = the tool default |\n| `side_gem_shape` | `str` | optional — None = the tool default |\n| `side_bezel_width` | `float` | optional — None = the tool default |\n| `side_distance` | `float` | optional — None = the tool default |","metadata":{"title":"Martini","section":"ra.martini.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicreate","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinicreate","collection":"scripting","hash":"cb6e77f68f85a0ab1e3f25fad9002433","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.find()\n\n```python\nra.martini.find(id: IdLike) -> Martini\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.martini.forgem()\n```python\nra.martini.for_gem(gem_id: IdLike) -> List[Martini]\n```\n\n`Martini` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Martini","section":"ra.martini.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinifind","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartinifind","collection":"scripting","hash":"1fbd8333a9faf4f08e302ed10b4adda8","indexed_by":"docs-index"}},{"content":"Martini — ra.martini.selected()\n\n```python\nra.martini.selected() -> List[Martini]\n```\n\nMartinis currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nMartini (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `claw_cap_distance` | `float` | yes | mm the claw apex is pulled in toward the gem centre |\n| `claw_cap_height` | `float` | yes | mm the apex moves up (+) or down (-) |\n| `claw_tip_smoothness` | `float` | yes | body-to-tip blend, 0-1 |\n| `claw_tip_width` | `float` | yes | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `face_tangent` | `bool` | yes | |\n| `gem_carat_weight` | `float` | | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong_diameter_bottom` | `float` | yes | |\n| `prong_diameter_top` | `float` | yes | |\n| `prong_height` | `float` | yes | Prongs (4, tapering to a point below the gem). Millimetres. |\n| `prong_mode` | `str` | yes | Prong construction: \"ROUND\", \"CUSTOM\" or \"CLAW\". The claw values only shape the prong tips in CLAW mode, and claw tips are built in Render mode only. |\n| `side_gem_size` | `float` | yes | |\n| `side_gems_enabled` | `bool` | yes | |\n| `upper_rail_enabled` | `bool` | yes | Upper rail and lateral side gems |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Martini","section":"ra.martini.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartiniselected","source":"https://www.rhinoartisan.com/docs/scripting/python/martini/#ramartiniselected","collection":"scripting","hash":"539a780ada96659bfe34e8dfc7c75212","indexed_by":"docs-index"}},{"content":"Matching Shank\n\nMatching shanks fitted against an engagement ring.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.MatchingShankApi`, `ArtisanPlugin.Scripting.MatchingShankBuilderApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `MatchingShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `MatchingShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_ring()` | The matching shanks fitted against a given ring. |\n| `selected()` | `MatchingShank` handles for the objects of this kind currently selected in the active document. |\n| `create()` | Builds a matching shank (the ArtisanMatchingShank tool, headless): a band shaped to sit against an existing ring -- the mother -- so the pair stacks without a gap. |","metadata":{"title":"Matching Shank","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/","collection":"scripting","hash":"638b74f007b9e48d93e43877a13a16ff","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.all()\n\n```python\nra.matching_shank.all() -> List[MatchingShank]\n```\n\n`MatchingShank` handles for every object of this kind in the active document (empty when there is no document).\n\nra.matchingshank.bylayer()\n```python\nra.matching_shank.by_layer(layer_name: str) -> List[MatchingShank]\n```\n\n`MatchingShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Matching Shank","section":"ra.matchingshank.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankall","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankall","collection":"scripting","hash":"3d5c640e62e991dea10d15f6cdf5d5a3","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.count()\n\n```python\nra.matching_shank.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.matchingshank.find()\n```python\nra.matching_shank.find(id: IdLike) -> MatchingShank\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Matching Shank","section":"ra.matchingshank.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcount","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcount","collection":"scripting","hash":"5e01bc1a6e0f4932823e88b8f2addfa7","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.forring()\n\n```python\nra.matching_shank.for_ring(ring_id: IdLike) -> List[MatchingShank]\n```\n\nThe matching shanks fitted against a given ring.\n\n| Parameter | Type | |\n|---|---|---|\n| `ring_id` | `IdLike` | required |\n\nra.matchingshank.selected()\n```python\nra.matching_shank.selected() -> List[MatchingShank]\n```\n\n`MatchingShank` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Matching Shank","section":"ra.matchingshank.forring()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankforring","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankforring","collection":"scripting","hash":"f4361dfa3bdc3a83c77184df753b787a","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.create()\n\n```python\nra.matching_shank.create(ring_ids: Sequence[IdLike], width=None, height=None, finger_diameter=None, profile=None, metal=None, clearance=None, distance=None, top_distance=None, interior_type=None, comfort=None, number_of_points=None, flip_side=None, both_sides=None, with_gems=None, gem_size=None, gem_distribution=None, element=None) -> MatchingShank\n```","metadata":{"title":"Matching Shank","section":"ra.matchingshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","collection":"scripting","hash":"f94739ecfe2a93cde785b1bde8d829fd","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.create()\n\nBuilds a matching shank (the ArtisanMatchingShank tool, headless): a band shaped to sit against an existing ring -- the mother -- so the pair stacks without a gap. The mother ring must sit at the origin like every Artisan ring (the rail is the finger-size circle there). `ring_ids`: the ring to hug -- document ids of its solids (breps, extrusions, meshes) or the Id of an Artisan shank handle (classic, eternity, wedding band...; its stones are ignored). Millimetres; omitting keeps the tool default (or the user's saved defaults): width 3, height 2, number_of_points 8, comfort 0.3. NaN keeps the default for the signed / zero-legit ones: clearance 0.3 (gap kept against the mother), distance 0 (axial gap; negative presses into the mother), top_distance 0. `interior_type` \"SOLID\" | \"COMFORT\". `flip_side` builds on the other side of the mother, `both_sides` one band on each side (both baked in the same group). `with_gems` adds a row of round stones along the crest: `gem_size` (default 1.5), `gem_distribution` \"FULL\" | \"SIDE\" | \"TOP\". `finger_diameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name; `metal` a Metal name (omitted = the document's Metal 01). `element` = name of a saved MatchingShank element (ra.elements.list(\"MatchingShank\")) to start from; explicit arguments override it (its finger size and ring are always replaced). Returns the MatchingShank handle of the new group; the mother ring is its parametric mother, so the band follows the ring's edits.","metadata":{"title":"Matching Shank","section":"ra.matchingshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","collection":"scripting","hash":"1ec3b92a3204bfd5491c57fd1470f8c7","indexed_by":"docs-index"}},{"content":"Matching Shank — ra.matchingshank.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `ring_ids` | `Sequence[IdLike]` | required |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `metal` | `str` | optional — None = the tool default |\n| `clearance` | `float` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `top_distance` | `float` | optional — None = the tool default |\n| `interior_type` | `str` | optional — None = the tool default |\n| `comfort` | `float` | optional — None = the tool default |\n| `number_of_points` | `int` | optional — None = the tool default |\n| `flip_side` | `bool` | optional — None = the tool default |\n| `both_sides` | `bool` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `gem_distribution` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Matching Shank","section":"ra.matchingshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#ramatchingshankcreate","collection":"scripting","hash":"bf7ca12481893c28b02d292db7cab486","indexed_by":"docs-index"}},{"content":"Matching Shank — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Matching Shank","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#handles","collection":"scripting","hash":"3a919c1e93c72bd4136c2c1d7b353013","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShank (handle)\n\nA matching shank: a band shaped to sit against an existing ring (the \"mother\"), so the pair stacks without a gap. Holds several gems, so no single MotherGem — the mothers it was fitted to are in MotherRingIds.","metadata":{"title":"Matching Shank","section":"MatchingShank (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","collection":"scripting","hash":"744ad8ba8723faeefca17578b410dda5","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShank (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `both_sides` | `bool` | yes | build one band on each side |\n| `bottom_height` | `float` | yes | mm — 0 = same as the top |\n| `bottom_width` | `float` | yes | band section at the bottom, mm — 0 = same as the top |\n| `clearance` | `float` | yes | gap kept against the mother, mm |\n| `comfort` | `float` | yes | mm — used when InteriorType is \"COMFORT\" |\n| `curve_from_ring_size` | `bool` | | rail generated from the ring size instead of a picked curve |\n| `distance` | `float` | yes | axial gap; negative presses the band into the mother, mm |\n| `flip_side` | `bool` | yes | build on the other side of the mother |\n| `gems` | MatchingShankGems | | |\n| `interior_type` | `str` | yes | \"SOLID\" or \"COMFORT\" |\n| `layer_name` | `str` | | |\n| `metal` | `str` | | e.g. \"GOLD_YELLOW_18\" |\n| `mother_gem_id` | `str` | | |\n| `mother_ring_ids` | `List[str]` | | The ring(s) this shank was fitted against, and the rail it follows. |\n| `number_of_points` | `int` | yes | sections used to follow the mother — always even |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `profile_height` | `float` | yes | mm |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `profile_width` | `float` | yes | band section at the top, mm |\n| `ring_curve_id` | `str` | | None when built from the ring size |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `section_contact_offsets` | `List[float]` | | |\n| `section_deltas` | `List[float]` | yes | Per-section fit. Deltas are yours to set; contact offsets are what the last computation measured (read-only output). |\n| `top_distance` | `float` | yes | extra axial gap at the ring top, fading to 0 at 90 degrees, mm |","metadata":{"title":"Matching Shank","section":"MatchingShank (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","collection":"scripting","hash":"7aa7f5c849c6d2ecd5739250f79dbbeb","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShank (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved MatchingShank element (ra.elements.list(\"MatchingShank\")) to this shank: its band and gems replace the current ones, the ring size, mother ring(s) and rail stay, and the shank regenerates in place. |\n| `set_profile(asset_name: str)` | Setters — each regenerates the shank in place (same Guid), re-baking its gems and prongs, and calls LicenseGate.RequireValid() first. |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Matching Shank","section":"MatchingShank (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshank-handle","collection":"scripting","hash":"977c6d7dac903fcc033ae3df6868157f","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShankGems (section)\n\nThe gems row a matching shank can carry. A live view over the shank's stored parameters: getters read the current values, setters regenerate the shank in place (same Guid) and are license-gated.","metadata":{"title":"Matching Shank","section":"MatchingShankGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","collection":"scripting","hash":"cafd752be88cdf9afc334de49fb70127","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShankGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bottom_inner_height` | `float` | yes | mm — 0 = same as the top |\n| `bottom_inner_width` | `float` | yes | mm — 0 = same as the top |\n| `bright_cut` | `float` | yes | mm |\n| `distribution` | `str` | yes | \"FULL\", \"SIDE\" or \"TOP\" |\n| `double_prong_setting` | `bool` | yes | |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_enabled` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_visible` | `bool` | yes | |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `end_angle` | `float` | | degrees — used when Distribution is \"SIDE\" |\n| `end_prong_count` | `int` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `gem_size_end` | `float` | | mm |\n| `gem_size_middle` | `float` | | mm |\n| `gem_size_start` | `float` | | mm |\n| `gradient` | `bool` | yes | Stone-size gradient along the row. |\n| `gradient_middle_position` | `float` | yes | 0..1 |\n| `gradient_points` | `int` | yes | |\n| `inner_height` | `float` | yes | inner channel height at the top, mm |\n| `inner_margin` | `float` | yes | mm |\n| `inner_width` | `float` | yes | inner channel width at the top, mm |\n| `margin` | `float` | yes | mm |\n| `min_distance` | `float` | yes | mm |\n| `prong_bottom_diameter` | `float` | yes | mm — 0 = same as the top |\n| `prong_diameter` | `float` | yes | mm |\n| `prong_distance` | `float` | yes | mm |\n| `prong_grow` | `float` | yes | mm |\n| `prong_height` | `float` | yes | mm |","metadata":{"title":"Matching Shank","section":"MatchingShankGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","collection":"scripting","hash":"1742235fa46b394d417c489a560bf2b6","indexed_by":"docs-index"}},{"content":"Matching Shank — MatchingShankGems (section)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `prong_min_diameter` | `float` | yes | mm |\n| `prong_spacing` | `float` | yes | mm |\n| `prong_top_diameter` | `float` | yes | mm — 0 = automatic |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `row_offset` | `float` | yes | mm |\n| `scallop_gem_height` | `float` | | |\n| `scallop_gem_width` | `float` | | Scalloped-setting proportions (percentages, not mm). |\n| `scallop_prong_height` | `float` | | |\n| `scallop_prong_width` | `float` | | |\n| `scallop_rail_height` | `float` | | |\n| `scallop_rail_width` | `float` | | |\n| `scallop_remove_channel` | `bool` | yes | |\n| `start_angle` | `float` | | degrees from the top — used when Distribution is \"SIDE\" |\n| `top_angle` | `float` | yes | total arc in degrees — used when Distribution is \"TOP\" |\n| `vertical` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_gem_size_gradient(start: float, middle: float, end: float)` | |\n| `set_scallop_gem(width: float, height: float)` | |\n| `set_scallop_prong(width: float, height: float)` | |\n| `set_scallop_rail(width: float, height: float)` | |\n| `set_side_angles(start_angle: float, end_angle: float)` | |","metadata":{"title":"Matching Shank","section":"MatchingShankGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/matching-shank/#matchingshankgems-section","collection":"scripting","hash":"ef55d09a8dbd5da91035dbd2d902fe8f","indexed_by":"docs-index"}},{"content":"Mesh\n\nMesh decimation.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.MeshApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `decimate()` | Decimates meshes with Rhino's quadric edge-collapse reduction (the ArtisanMeshDecimate command, headless). |\n| `decimate_to_tolerance()` | Decimates meshes as much as a deviation budget allows (the ArtisanMeshDecimateTolerance command, headless). |","metadata":{"title":"Mesh","url":"https://www.rhinoartisan.com/docs/scripting/python/mesh/","source":"https://www.rhinoartisan.com/docs/scripting/python/mesh/","collection":"scripting","hash":"115cad8351520f047207a9f445e28e8a","indexed_by":"docs-index"}},{"content":"Mesh — ra.mesh.decimate()\n\n```python\nra.mesh.decimate(object_ids=None, percentage=None) -> DecimateResult\n```\n\nDecimates meshes with Rhino's quadric edge-collapse reduction (the ArtisanMeshDecimate command, headless). Distortion is allowed: the reducer prioritizes hitting the target face count over shape fidelity, so heavy percentages give a faceted low-poly look. object_ids meshes to decimate; None/empty = current selection. percentage faces to REMOVE, 1-99 (default 50). Each mesh is replaced in place (same Guid). Returns totals so the script can report \"N meshes: X faces -> Y faces\".\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `percentage` | `float` | optional — None = the tool default |","metadata":{"title":"Mesh","section":"ra.mesh.decimate()","url":"https://www.rhinoartisan.com/docs/scripting/python/mesh/#rameshdecimate","source":"https://www.rhinoartisan.com/docs/scripting/python/mesh/#rameshdecimate","collection":"scripting","hash":"8406e61eb9a46ff9ac9906552aa3ceca","indexed_by":"docs-index"}},{"content":"Mesh — ra.mesh.decimatetotolerance()\n\n```python\nra.mesh.decimate_to_tolerance(object_ids=None, tolerance_mm=None) -> DecimateToleranceResult\n```\n\nDecimates meshes as much as a deviation budget allows (the ArtisanMeshDecimateTolerance command, headless). Each mesh is reduced to the heaviest percentage whose result still stays within tolerance_mm of the original surface, so the shape is guaranteed and the face count is whatever falls out. object_ids meshes to decimate; None/empty = current selection. tolerance_mm max deviation in MILLIMETRES, None = the default (0.05). Each mesh is replaced in place (same Guid). Meshes that cannot lose a single percent within tolerance are left untouched and counted in MeshesUnchanged.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `tolerance_mm` | `float` | optional — None = the tool default |","metadata":{"title":"Mesh","section":"ra.mesh.decimatetotolerance()","url":"https://www.rhinoartisan.com/docs/scripting/python/mesh/#rameshdecimatetotolerance","source":"https://www.rhinoartisan.com/docs/scripting/python/mesh/#rameshdecimatetotolerance","collection":"scripting","hash":"408044d158c006f3c6d32bda7c9fe5f9","indexed_by":"docs-index"}},{"content":"Micro Setting\n\nMicro settings (micro-pave heads).\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.MicroSettingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | A micro setting is baked as a GROUP carrying RaObjectUserData (both here and in the panel); nothing in the product ever creates a MicroSettingCustomObject, so resolving that type found nothing and every query below returned empty. |\n| `by_layer()` | `MicroSetting` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds the micro-setting (pavé infrastructure: cutters, V-cutters, optional channel and row prongs) for a run of small gems -- the ArtisanMicroSetting tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | MicroSettings currently selected in the active doc. |","metadata":{"title":"Micro Setting","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/","collection":"scripting","hash":"1e34f77586796c37c19fc307462dc4b1","indexed_by":"docs-index"}},{"content":"Micro Setting — ra.microsetting.all()\n\n```python\nra.micro_setting.all() -> List[MicroSetting]\n```\n\nA micro setting is baked as a GROUP carrying RaObjectUserData (both here and in the panel); nothing in the product ever creates a MicroSettingCustomObject, so resolving that type found nothing and every query below returned empty.\n\nra.microsetting.bylayer()\n```python\nra.micro_setting.by_layer(layer_name: str) -> List[MicroSetting]\n```\n\n`MicroSetting` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Micro Setting","section":"ra.microsetting.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingall","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingall","collection":"scripting","hash":"b032134f136c77c1f45f11e616daf170","indexed_by":"docs-index"}},{"content":"Micro Setting — ra.microsetting.count()\n\n```python\nra.micro_setting.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.microsetting.create()\n```python\nra.micro_setting.create(gem_ids=None, cutters=None, v_cutters=None, channel=None, row_prongs=None) -> List[str]\n```\n\nBuilds the micro-setting (pavé infrastructure: cutters, V-cutters, optional channel and row prongs) for a run of small gems -- the ArtisanMicroSetting tool, headless. `gem_ids` None/empty = the currently selected gems; at least one gem is required. The enable flags default to the tool's behavior (cutters and V-cutters on, channel and row prongs off); pass True/False to override, or None to keep the default (or the user's saved defaults). Numeric parameters keep the tool defaults. Returns the ids of every object baked (cutters, V-cutters, channel and prongs), all grouped under one MicroSetting group.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `cutters` | `Optional[bool]` | optional — None = the tool default |\n| `v_cutters` | `Optional[bool]` | optional — None = the tool default |\n| `channel` | `Optional[bool]` | optional — None = the tool default |\n| `row_prongs` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Micro Setting","section":"ra.microsetting.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingcount","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingcount","collection":"scripting","hash":"6342aff68ee2c96cf4158f70cd37dbbd","indexed_by":"docs-index"}},{"content":"Micro Setting — ra.microsetting.find()\n\n```python\nra.micro_setting.find(id: IdLike) -> MicroSetting\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.microsetting.selected()\n```python\nra.micro_setting.selected() -> List[MicroSetting]\n```\n\nMicroSettings currently selected in the active doc.","metadata":{"title":"Micro Setting","section":"ra.microsetting.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingfind","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#ramicrosettingfind","collection":"scripting","hash":"365156ec1268180c061e148262c13329","indexed_by":"docs-index"}},{"content":"Micro Setting — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nMicroSetting (handle)\nA micro setting: the cutters, V-cutters, channel and row prongs cut and built around a run of stones. Each block is a section mirroring the panel's own. READ-ONLY: the parametric engine has no RegenerateMicroSetting -- the only edit path is reopening the panel (2ShapesEdit.EditMicroSetting) -- so there are no in-place setters. Recreate with ra.micro_setting.create (and Delete) to change one.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `channel` | MicroSettingChannel | | |\n| `channel_enabled` | `bool` | | |\n| `cutters` | MicroSettingCutters | | |\n| `cutters_enabled` | `bool` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `row_prongs` | MicroSettingRowProngs | | |\n| `row_prongs_enabled` | `bool` | | |\n| `v_cutters` | MicroSettingCutters | | |\n| `v_cutters_enabled` | `bool` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Micro Setting","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#handles","collection":"scripting","hash":"139f6b02fb47108be4491b2d5f6b3ce4","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSettingChannel (section)\n\nThe channel rail running under the stones.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `close` | `bool` | | |\n| `enabled` | `bool` | | |\n| `end_bend` | `float` | | signed |\n| `end_extension` | `float` | | signed |\n| `end_height` | `float` | | |\n| `end_over_girdle` | `float` | | signed |\n| `end_width` | `float` | | |\n| `flat_ends` | `bool` | | |\n| `keep` | `bool` | | |\n| `precise` | `bool` | | |\n| `shape` | `str` | | UShape, VShape, Square, Trapezoidal, FrenchSetting |\n| `shape_factor` | `float` | | |\n| `start_bend` | `float` | | signed |\n| `start_extension` | `float` | | signed |\n| `start_height` | `float` | | |\n| `start_over_girdle` | `float` | | signed |\n| `start_width` | `float` | | |","metadata":{"title":"Micro Setting","section":"MicroSettingChannel (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingchannel-section","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingchannel-section","collection":"scripting","hash":"387b2a240cc221d449ad2ffc57962b98","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSettingCutters (section)\n\nThe cutters carved under each stone. The same shape describes the plain CUTTERS and the V-CUTTERS; the members marked \"cutters only\" read as empty/0 on the V-cutters, which have no such parameter.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `enabled` | `bool` | | |\n| `end_height` | `float` | | mm |\n| `end_width` | `float` | | mm |\n| `keep` | `bool` | | the cutter solids are kept instead of booleaned |\n| `length` | `float` | | mm |\n| `over_girdle` | `float` | | mm, signed |\n| `over_girdle_middle` | `float` | | mm, signed |\n| `shape` | `str` | | cutters only: U_SHAPE, V_SHAPE, SQUARE, TRAPEZOIDAL, FRENCH_SETTING |\n| `shape_factor` | `float` | | cutters only |\n| `start_height` | `float` | | mm |\n| `start_width` | `float` | | mm |\n| `width_by_percentage` | `bool` | | cutters only: width sized as a % of each stone |\n| `width_percentage` | `float` | | cutters only |","metadata":{"title":"Micro Setting","section":"MicroSettingCutters (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingcutters-section","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingcutters-section","collection":"scripting","hash":"8619b219e167db4cd6ad7395cdb61b48","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSettingRowProngs (section)\n\nThe prongs shared between consecutive stones.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `allow_collisions` | `bool` | | |\n| `close` | `bool` | | |\n| `diameter` | `float` | | mm |\n| `diameter_by_percentage` | `bool` | | diameter sized as a % of the gap between stones |\n| `enabled` | `bool` | | |\n| `height_over_girdle` | `float` | | mm, signed |\n| `height_under_girdle` | `float` | | mm, signed |\n| `inside_percentage` | `float` | | |\n| `smart_adapt` | `bool` | | |","metadata":{"title":"Micro Setting","section":"MicroSettingRowProngs (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingrowprongs-section","source":"https://www.rhinoartisan.com/docs/scripting/python/micro-setting/#microsettingrowprongs-section","collection":"scripting","hash":"ef3d4629e2a9ed68ed123302a21ce9fe","indexed_by":"docs-index"}},{"content":"Milgrain\n\nMilgrain beading along curves.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.MilgrainApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: bead diameter 0.8, overlapping 0.1. |\n\nra.milgrain.create()\n```python\nra.milgrain.create(curve_id: IdLike, diameter=None, overlapping=None) -> str\n```\n\nDefaults: bead diameter 0.8, overlapping 0.1.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `diameter` | `float` | optional — None = the tool default |\n| `overlapping` | `float` | optional — None = the tool default |","metadata":{"title":"Milgrain","url":"https://www.rhinoartisan.com/docs/scripting/python/milgrain/","source":"https://www.rhinoartisan.com/docs/scripting/python/milgrain/","collection":"scripting","hash":"d2fe5ae644e08e286faaf5663ac71a53","indexed_by":"docs-index"}},{"content":"Named Pendant\n\nName pendants from text.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.NamedPendantApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: font Arial bold, height 5, thickness 0.4, spacing 0.5. |\n\nra.namedpendant.create()\n```python\nra.named_pendant.create(text: str, plane=None, height=None, thickness=None, font=None, element=None) -> List[str]\n```\n\nDefaults: font Arial bold, height 5, thickness 0.4, spacing 0.5. Returns the ids of the created breps (letters + plate/rail). `element` = name of a saved NamedPendant element (ra.elements.list(\"NamedPendant\")) to start from; `text` and the explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `text` | `str` | required |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `font` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Named Pendant","url":"https://www.rhinoartisan.com/docs/scripting/python/named-pendant/","source":"https://www.rhinoartisan.com/docs/scripting/python/named-pendant/","collection":"scripting","hash":"cdc78c600423ead6773906efddcfefae","indexed_by":"docs-index"}},{"content":"Nivoda\n\nNivoda certified-diamond search.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.NivodaApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `clear_cache()` | Drops the service's in-memory query cache so the next Search hits the live API (results are otherwise cached for ~30 minutes). |\n| `search()` | Searches certified diamonds matching `shape` (GemShape name, e.g. |","metadata":{"title":"Nivoda","url":"https://www.rhinoartisan.com/docs/scripting/python/nivoda/","source":"https://www.rhinoartisan.com/docs/scripting/python/nivoda/","collection":"scripting","hash":"178fadaee49974b323dd079e2207845c","indexed_by":"docs-index"}},{"content":"Nivoda — ra.nivoda.clearcache()\n\n```python\nra.nivoda.clear_cache()\n```\n\nDrops the service's in-memory query cache so the next Search hits the live API (results are otherwise cached for ~30 minutes).\n\nra.nivoda.search()\n```python\nra.nivoda.search(shape: str, carats: float, lab_grown=None) -> List[Any]\n```\n\nSearches certified diamonds matching `shape` (GemShape name, e.g. \"ROUND\") and `carats` (the service queries the range [carats-0.01, carats+0.1]). Returns the best matches (the service caps how many items each query fetches). Each item has: Price (in CENTS -- divide by 100, same as DiamondCertified does), Discount, and NivodaDiamond.{ImageUrl, VideoUrl, Availability, SupplierStockId, Certificate with Lab/Shape/CertNumber/Cut/ Carats/Clarity/Color/Polish/Symmetry/measurements}.\n\n| Parameter | Type | |\n|---|---|---|\n| `shape` | `str` | required |\n| `carats` | `float` | required |\n| `lab_grown` | `bool` | optional — None = the tool default |","metadata":{"title":"Nivoda","section":"ra.nivoda.clearcache()","url":"https://www.rhinoartisan.com/docs/scripting/python/nivoda/#ranivodaclearcache","source":"https://www.rhinoartisan.com/docs/scripting/python/nivoda/#ranivodaclearcache","collection":"scripting","hash":"820951c4963674981ab1d87d85103b49","indexed_by":"docs-index"}},{"content":"Panels\n\nThe open Artisan command panel: which one it is, and closing it without applying.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PanelsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `active()` | The command panel currently open (\"Bail\", \"Cutter\", \"Basket\"...), or None when none is. |\n| `close()` | Closes the open command panel WITHOUT applying it, like its X button: the live preview is discarded and objects hidden while editing come back. |","metadata":{"title":"Panels","url":"https://www.rhinoartisan.com/docs/scripting/python/panels/","source":"https://www.rhinoartisan.com/docs/scripting/python/panels/","collection":"scripting","hash":"47bed7e2b35e28c6b4269ed5b8159c63","indexed_by":"docs-index"}},{"content":"Panels — ra.panels.active()\n\n```python\nra.panels.active() -> str\n```\n\nThe command panel currently open (\"Bail\", \"Cutter\", \"Basket\"...), or None when none is.\n\nra.panels.close()\n```python\nra.panels.close() -> str\n```\n\nCloses the open command panel WITHOUT applying it, like its X button: the live preview is discarded and objects hidden while editing come back. Returns the closed panel's name, or None when none was open.","metadata":{"title":"Panels","section":"ra.panels.active()","url":"https://www.rhinoartisan.com/docs/scripting/python/panels/#rapanelsactive","source":"https://www.rhinoartisan.com/docs/scripting/python/panels/#rapanelsactive","collection":"scripting","hash":"5222e453582031b3e49707ed6d43ed98","indexed_by":"docs-index"}},{"content":"Pattern\n\nRepeated patterns over surfaces.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PatternApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Repeats the source object in a columns x rows grid (defaults 2x3), then, when `surface_id` is given, flows the whole grid onto that surface (Sporph). |","metadata":{"title":"Pattern","url":"https://www.rhinoartisan.com/docs/scripting/python/pattern/","source":"https://www.rhinoartisan.com/docs/scripting/python/pattern/","collection":"scripting","hash":"8969f5977ec22a7f5b023f521a956e61","indexed_by":"docs-index"}},{"content":"Pattern — ra.pattern.create()\n\n```python\nra.pattern.create(object_id: IdLike, surface_id=None, columns=None, rows=None, x_padding=None, y_padding=None, rotation=None, z_move=None, max_thickness=None, reverse_mode=None) -> List[str]\n```\n\nRepeats the source object in a columns x rows grid (defaults 2x3), then, when `surface_id` is given, flows the whole grid onto that surface (Sporph). `rotation` (deg) accumulates per cell around Z; `z_move` lifts the source before arraying; `max_thickness` > 0 also rescales the source in Z to that thickness. `reverse_mode` mirrors the flow surface: 0 none, 1 reverse U, 2 reverse V, 3 both (-1 keeps the default). Paddings, rotation and z_move of 0 keep the saved/tool defaults (which are 0). Returns the created object ids; the source object is left untouched, exactly like the panel.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_id` | `IdLike` | required |\n| `surface_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `columns` | `int` | optional — None = the tool default |\n| `rows` | `int` | optional — None = the tool default |\n| `x_padding` | `float` | optional — None = the tool default |\n| `y_padding` | `float` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `z_move` | `float` | optional — None = the tool default |\n| `max_thickness` | `float` | optional — None = the tool default |\n| `reverse_mode` | `int` | optional — None = the tool default |","metadata":{"title":"Pattern","section":"ra.pattern.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/pattern/#rapatterncreate","source":"https://www.rhinoartisan.com/docs/scripting/python/pattern/#rapatterncreate","collection":"scripting","hash":"a128cbf89dbd188d8d61c63620d7b2ba","indexed_by":"docs-index"}},{"content":"Pave Along Surface\n\nPave rows following a surface direction.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PaveAlongSurfaceApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Rows of round diamonds along the isocurves of a surface -- the ArtisanPaveAlongSurface (Pave UV) tool, headless. |","metadata":{"title":"Pave Along Surface","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-along-surface/","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-along-surface/","collection":"scripting","hash":"a28ee1e090ed6b79dc2b90d9a136cddc","indexed_by":"docs-index"}},{"content":"Pave Along Surface — ra.pavealongsurface.create()\n\n```python\nra.pave_along_surface.create(surface_id: IdLike, points: Sequence[PointLike], gem_size=None, distance=None, border_distance=None, direction=None, justify=None, vertical_alignment=None) -> List[str]\n```\n\nRows of round diamonds along the isocurves of a surface -- the ArtisanPaveAlongSurface (Pave UV) tool, headless. `surface_id` is a surface or single-face polysurface; each entry of `points` replaces one click on it and yields one row along the isocurve through that point, in `direction` U (default) or V. Millimetres; omitting keeps the tool default (or the user's saved defaults): gem_size 1.5, distance 0.1 between gems, border_distance 0.2. `justify` True squeezes the row to fill the isocurve; `vertical_alignment` CENTER (default) / TOP / BOTTOM shifts the row sideways by half a gem. Positions shared by two rows are baked once. Returns the ids of the created gems.\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_id` | `IdLike` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `gem_size` | `float` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `border_distance` | `float` | optional — None = the tool default |\n| `direction` | `str` | optional — None = the tool default |\n| `justify` | `Optional[bool]` | optional — None = the tool default |\n| `vertical_alignment` | `str` | optional — None = the tool default |","metadata":{"title":"Pave Along Surface","section":"ra.pavealongsurface.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-along-surface/#rapavealongsurfacecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-along-surface/#rapavealongsurfacecreate","collection":"scripting","hash":"7aa937ce32d5f2ad93e2d7f3f4d53e41","indexed_by":"docs-index"}},{"content":"Pave Shank\n\nPave shanks: rows of stones along the band.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PaveShankApi`, `ArtisanPlugin.Scripting.PaveShankBuilderApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `PaveShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `PaveShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `PaveShank` handles for the objects of this kind currently selected in the active document. |\n| `create()` | Builds a pavé shank (the ArtisanPaveShank tool, headless): a classic band carrying one or more longitudinal rows of round stones, each row running along the band at a lateral offset from its centre. |","metadata":{"title":"Pave Shank","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/","collection":"scripting","hash":"929ba691637b05477fe88f508eca6765","indexed_by":"docs-index"}},{"content":"Pave Shank — ra.paveshank.all()\n\n```python\nra.pave_shank.all() -> List[PaveShank]\n```\n\n`PaveShank` handles for every object of this kind in the active document (empty when there is no document).\n\nra.paveshank.bylayer()\n```python\nra.pave_shank.by_layer(layer_name: str) -> List[PaveShank]\n```\n\n`PaveShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Pave Shank","section":"ra.paveshank.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankall","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankall","collection":"scripting","hash":"3d7a635d83607081da46e28587301508","indexed_by":"docs-index"}},{"content":"Pave Shank — ra.paveshank.count()\n\n```python\nra.pave_shank.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.paveshank.find()\n```python\nra.pave_shank.find(id: IdLike) -> PaveShank\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Pave Shank","section":"ra.paveshank.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcount","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcount","collection":"scripting","hash":"94107558cd46f1b5a16a2474c7ac4e72","indexed_by":"docs-index"}},{"content":"Pave Shank — ra.paveshank.selected()\n\n```python\nra.pave_shank.selected() -> List[PaveShank]\n```\n\n`PaveShank` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Pave Shank","section":"ra.paveshank.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankselected","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankselected","collection":"scripting","hash":"9c21e19ce36cf2af4ffae59df193d79d","indexed_by":"docs-index"}},{"content":"Pave Shank — ra.paveshank.create()\n\n```python\nra.pave_shank.create(width=None, height=None, finger_diameter=None, profile=None, opening_type=None, gem_size=None, spacing=None, offset=None, start_angle=None, end_angle=None, mirror=None, row_offsets=None, with_cutters=None, plane=None, element=None) -> PaveShank\n```\n\nBuilds a pavé shank (the ArtisanPaveShank tool, headless): a classic band carrying one or more longitudinal rows of round stones, each row running along the band at a lateral offset from its centre. Millimetres; omitting keeps the tool default (or the user's saved defaults): width 2.5, height 2.5, gem_size 1.2, spacing 0.15, offset 0 (middle of the band). Angles in degrees; NaN keeps the default (start_angle 0, end_angle 360 = full turn). `row_offsets` given = one row per lateral offset (all sharing gem_size / spacing / angles), otherwise the row settings apply to the default single row; `mirror` also places every row at -offset. `opening_type` \"NONE\" | \"CUT\" | \"STRANGLE\" (default STRANGLE). `with_cutters` subtracts one cutter per stone from the band, like the panel does. `finger_diameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name; `plane` omitted = world XY. `element` = name of a saved PaveShank element (ra.elements.list(\"PaveShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the PaveShank handle of the new shank (stones and prongs are its children).","metadata":{"title":"Pave Shank","section":"ra.paveshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcreate","collection":"scripting","hash":"d93aaaea69bd814c956b7dd65ea92b9c","indexed_by":"docs-index"}},{"content":"Pave Shank — ra.paveshank.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `opening_type` | `str` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `spacing` | `float` | optional — None = the tool default |\n| `offset` | `float` | optional — None = the tool default |\n| `start_angle` | `float` | optional — None = the tool default |\n| `end_angle` | `float` | optional — None = the tool default |\n| `mirror` | `bool` | optional — None = the tool default |\n| `row_offsets` | `Sequence[float]` | optional — None = the tool default |\n| `with_cutters` | `bool` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Pave Shank","section":"ra.paveshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#rapaveshankcreate","collection":"scripting","hash":"e41075063f9cb86970b666951110d381","indexed_by":"docs-index"}},{"content":"Pave Shank — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nPaveShank (handle)\nPave shank: a band carrying one or more longitudinal rows of stones. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `advanced` | ClassicAdvanced | | |\n| `cutters_enabled` | `bool` | yes | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `rail` | PaveShankRail | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `top_profile` | ClassicProfile | | The band section and the opening — the same models the classic shank uses. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved PaveShank element (ra.elements.list(\"PaveShank\")) to this shank: its band, rows and cutters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Pave Shank","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#handles","collection":"scripting","hash":"fc401fde890dd8c9f219693334c09910","indexed_by":"docs-index"}},{"content":"Pave Shank — ClassicAdvanced (section)\n\nThe classic shank's Advanced section: the opening at the bottom of the band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `cut_bumping` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `cut_length` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `opening_type` | `str` | yes | \"NONE\", \"CUT\" or \"STRANGLE\" |\n| `strangle_base_x` | `float` | | mm |\n| `strangle_base_y` | `float` | | mm |\n| `strangle_base_z` | `float` | | mm |\n| `strangle_opening` | `float` | yes | mm — used when OpeningType is \"STRANGLE\" |\n\n| Method | |\n|---|---|\n| `set_strangle_base(x: float, y: float, z: float)` | |","metadata":{"title":"Pave Shank","section":"ClassicAdvanced (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#classicadvanced-section","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#classicadvanced-section","collection":"scripting","hash":"6503d1bc67ea1d95d51daa16b4d155d0","indexed_by":"docs-index"}},{"content":"Pave Shank — PaveShankRail (section)\n\nThe rail: the gem rows the band carries and the prongs holding them.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `prong_diameter` | `float` | yes | global default, mm |\n| `prong_height` | `float` | yes | global default, mm |\n| `prongs` | `List[PaveShankProng]` | | |\n| `rows` | `List[PaveShankRow]` | yes | |\n| `show_prongs` | `bool` | yes | |\n\n| Method | |\n|---|---|\n| `set_row(index: int, gem_size: float, offset: float, spacing: float, start_angle: float, end_angle: float)` | Edits one row in place. |","metadata":{"title":"Pave Shank","section":"PaveShankRail (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#paveshankrail-section","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#paveshankrail-section","collection":"scripting","hash":"d3f48beb40366d9864c304bcfbf47a30","indexed_by":"docs-index"}},{"content":"Pave Shank — ClassicProfile (section)\n\nOne of the shank's three section profiles (top / mid / bottom). The top profile is always enabled; mid and bottom are optional.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `comfort` | `float` | yes | mm — used when Type is \"COMFORT\" |\n| `displacement` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `height` | `float` | yes | mm |\n| `orientation` | `int` | yes | 0 = Natural, 1 = Reverse (flips the profile curve) |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees |\n| `thickness` | `float` | yes | mm — used when Type is \"THICKNESS\" |\n| `type` | `str` | yes | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Pave Shank","section":"ClassicProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#classicprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/pave-shank/#classicprofile-section","collection":"scripting","hash":"442880bc06f9eb5449597c0654b7142e","indexed_by":"docs-index"}},{"content":"Pave\n\nAutomatic pave over surfaces: one size in a regular grid, with prongs and cutters.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PaveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `on_surface()` | Paves the given objects. |\n| `on_surface_detailed()` | Same as OnSurface, but returns every id it created -- the gems, the prongs and the cutters -- instead of only the gems. |","metadata":{"title":"Pave","url":"https://www.rhinoartisan.com/docs/scripting/python/pave/","source":"https://www.rhinoartisan.com/docs/scripting/python/pave/","collection":"scripting","hash":"4cd0914472060b38730304475b858913","indexed_by":"docs-index"}},{"content":"Pave — ra.pave.onsurface()\n\n```python\nra.pave.on_surface(surface_ids: Sequence[IdLike], gem_diameter=None, prong_diameter=None, distance_to_border=None, prongs=None, cutters=None, variable_size=None, fill_mode=None, start_point=None, prong_over_girdle=None, prong_under_girdle=None, gap_mode=None, manual_gap=None, extra_gap=None, gem_inside=None, min_prongs_per_gem=None, prong_border_distance=None, border_from_prong=None, gem_diameter_min=None, prong_diameter_min=None, cutter_size_top=None, cutter_height_top=None, cutter_size_bottom=None, cutter_gem_inside=None) -> List[str]\n```\n\nPaves the given objects. Millimetres; omitting keeps the tool default: gem_diameter 1.3 (shrinking to gem_diameter_min 0.9 when variable_size), prong_diameter 0.8, distance_to_border 0.1. `prongs`/`cutters` toggle those outputs (tool defaults: prongs on, cutters off). `fill_mode` is FROM_BORDER (default) or FROM_CENTER; FROM_CENTER needs `start_point` on (or near) the surface. Returns the ids of the created gems.","metadata":{"title":"Pave","section":"ra.pave.onsurface()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurface","source":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurface","collection":"scripting","hash":"0c10bc1df527051f24df227fd8d1551d","indexed_by":"docs-index"}},{"content":"Pave — ra.pave.onsurface()\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_ids` | `Sequence[IdLike]` | required |\n| `gem_diameter` | `float` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `distance_to_border` | `float` | optional — None = the tool default |\n| `prongs` | `bool` | optional — None = the tool default |\n| `cutters` | `bool` | optional — None = the tool default |\n| `variable_size` | `Optional[bool]` | optional — None = the tool default |\n| `fill_mode` | `str` | optional — None = the tool default |\n| `start_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `prong_over_girdle` | `float` | optional — None = the tool default |\n| `prong_under_girdle` | `float` | optional — None = the tool default |\n| `gap_mode` | `str` | optional — None = the tool default |\n| `manual_gap` | `float` | optional — None = the tool default |\n| `extra_gap` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `min_prongs_per_gem` | `int` | optional — None = the tool default |\n| `prong_border_distance` | `float` | optional — None = the tool default |\n| `border_from_prong` | `Optional[bool]` | optional — None = the tool default |\n| `gem_diameter_min` | `float` | optional — None = the tool default |\n| `prong_diameter_min` | `float` | optional — None = the tool default |\n| `cutter_size_top` | `float` | optional — None = the tool default |\n| `cutter_height_top` | `float` | optional — None = the tool default |\n| `cutter_size_bottom` | `float` | optional — None = the tool default |\n| `cutter_gem_inside` | `float` | optional — None = the tool default |","metadata":{"title":"Pave","section":"ra.pave.onsurface()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurface","source":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurface","collection":"scripting","hash":"7593437db51a3f1b3d15f21f0fcd863e","indexed_by":"docs-index"}},{"content":"Pave — ra.pave.onsurfacedetailed()\n\n```python\nra.pave.on_surface_detailed(surface_ids: Sequence[IdLike], gem_diameter=None, prong_diameter=None, distance_to_border=None, prongs=None, cutters=None, variable_size=None, fill_mode=None, start_point=None, prong_over_girdle=None, prong_under_girdle=None, gap_mode=None, manual_gap=None, extra_gap=None, gem_inside=None, min_prongs_per_gem=None, prong_border_distance=None, border_from_prong=None, gem_diameter_min=None, prong_diameter_min=None, cutter_size_top=None, cutter_height_top=None, cutter_size_bottom=None, cutter_gem_inside=None) -> PaveResult\n```\n\nSame as OnSurface, but returns every id it created -- the gems, the prongs and the cutters -- instead of only the gems. OnSurface threw the prong and cutter ids away, so a script could not select, re-layer or boolean what it had just built.","metadata":{"title":"Pave","section":"ra.pave.onsurfacedetailed()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurfacedetailed","source":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurfacedetailed","collection":"scripting","hash":"e497b76649d06e6229149bc21dd25ccf","indexed_by":"docs-index"}},{"content":"Pave — ra.pave.onsurfacedetailed()\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_ids` | `Sequence[IdLike]` | required |\n| `gem_diameter` | `float` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `distance_to_border` | `float` | optional — None = the tool default |\n| `prongs` | `bool` | optional — None = the tool default |\n| `cutters` | `bool` | optional — None = the tool default |\n| `variable_size` | `Optional[bool]` | optional — None = the tool default |\n| `fill_mode` | `str` | optional — None = the tool default |\n| `start_point` | `Optional[PointLike]` | optional — None = the tool default |\n| `prong_over_girdle` | `float` | optional — None = the tool default |\n| `prong_under_girdle` | `float` | optional — None = the tool default |\n| `gap_mode` | `str` | optional — None = the tool default |\n| `manual_gap` | `float` | optional — None = the tool default |\n| `extra_gap` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `min_prongs_per_gem` | `int` | optional — None = the tool default |\n| `prong_border_distance` | `float` | optional — None = the tool default |\n| `border_from_prong` | `Optional[bool]` | optional — None = the tool default |\n| `gem_diameter_min` | `float` | optional — None = the tool default |\n| `prong_diameter_min` | `float` | optional — None = the tool default |\n| `cutter_size_top` | `float` | optional — None = the tool default |\n| `cutter_height_top` | `float` | optional — None = the tool default |\n| `cutter_size_bottom` | `float` | optional — None = the tool default |\n| `cutter_gem_inside` | `float` | optional — None = the tool default |","metadata":{"title":"Pave","section":"ra.pave.onsurfacedetailed()","url":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurfacedetailed","source":"https://www.rhinoartisan.com/docs/scripting/python/pave/#rapaveonsurfacedetailed","collection":"scripting","hash":"40b90438e0a3738e5aa5a361496ae551","indexed_by":"docs-index"}},{"content":"Pearl\n\nPearls and their cups.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PearlApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Pearl` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Pearl` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Creates a pearl (the ArtisanPearl tool, headless) and adds it to the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Pearls currently selected in the active doc. |","metadata":{"title":"Pearl","url":"https://www.rhinoartisan.com/docs/scripting/python/pearl/","source":"https://www.rhinoartisan.com/docs/scripting/python/pearl/","collection":"scripting","hash":"b0fc44ffc6164fc816afc1f1f32d06f7","indexed_by":"docs-index"}},{"content":"Pearl — ra.pearl.all()\n\n```python\nra.pearl.all() -> List[Pearl]\n```\n\n`Pearl` handles for every object of this kind in the active document (empty when there is no document).\n\nra.pearl.bylayer()\n```python\nra.pearl.by_layer(layer_name: str) -> List[Pearl]\n```\n\n`Pearl` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Pearl","section":"ra.pearl.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlall","source":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlall","collection":"scripting","hash":"ad36bf1fe5cfc2cf97d40ec22af6877e","indexed_by":"docs-index"}},{"content":"Pearl — ra.pearl.count()\n\n```python\nra.pearl.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.pearl.create()\n```python\nra.pearl.create(diameter=None, calotte=None, calotte_angle=None, calotte_thickness=None, wire=None, wire_diameter=None, wire_length=None, plane=None) -> Pearl\n```\n\nCreates a pearl (the ArtisanPearl tool, headless) and adds it to the active document. A pearl is its own stone -- a sphere placed on `plane` (omitted = world XY) -- optionally baked together with two metal children, exactly like the panel's Accept: a calotte (cup holding the pearl) and a wire (post drilled into it). The children become PearlCalotteCustomObject / PearlWireCustomObject instances linked to the pearl, on the metal layer with the metal material. All dimensional arguments are millimetres. Omit (None) to keep the tool's default -- or the user's saved defaults -- for that parameter (diameter 6, calotte_angle 35 degrees, calotte_thickness 1, wire_diameter 1, wire_length 8). `calotte` / `wire` omitted (None) keep the default (both enabled); pass False to skip that child. Throws InvalidOperationException when the geometry fails to compute (e.g. calotte thickness must be > 0.2 mm).\n\n| Parameter | Type | |\n|---|---|---|\n| `diameter` | `float` | optional — None = the tool default |\n| `calotte` | `Optional[bool]` | optional — None = the tool default |\n| `calotte_angle` | `float` | optional — None = the tool default |\n| `calotte_thickness` | `float` | optional — None = the tool default |\n| `wire` | `Optional[bool]` | optional — None = the tool default |\n| `wire_diameter` | `float` | optional — None = the tool default |\n| `wire_length` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Pearl","section":"ra.pearl.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlcount","source":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlcount","collection":"scripting","hash":"63daa38762dac4f3569ab3b3017ebf9c","indexed_by":"docs-index"}},{"content":"Pearl — ra.pearl.find()\n\n```python\nra.pearl.find(id: IdLike) -> Pearl\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.pearl.selected()\n```python\nra.pearl.selected() -> List[Pearl]\n```\n\nPearls currently selected in the active doc. Empty list if nothing is selected or the selection contains no pearls.","metadata":{"title":"Pearl","section":"ra.pearl.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlfind","source":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#rapearlfind","collection":"scripting","hash":"a61c7466408f9e86b7bec4b281ad178a","indexed_by":"docs-index"}},{"content":"Pearl — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nPearl (handle)\nA pearl is its own stone (a sphere on a plane) with two optional metal children baked alongside it: a calotte (cup) and a wire (post). It is not built around a mother gem, so it extends ParametricObject directly and MotherGemId is always None. Read-only: the parametric engine has no Regenerate for pearls, so there are no in-place setters (recreate + Delete to change one).\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `calotte_angle` | `float` | | degrees |\n| `calotte_id` | `str` | | None when there is no calotte child |\n| `calotte_thickness` | `float` | | millimetres |\n| `diameter` | `float` | | pearl sphere diameter, millimetres |\n| `has_calotte` | `bool` | | a calotte child was baked with this pearl |\n| `has_wire` | `bool` | | a wire child was baked with this pearl |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `wire_diameter` | `float` | | millimetres |\n| `wire_id` | `str` | | None when there is no wire child |\n| `wire_length` | `float` | | millimetres |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Pearl","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/pearl/#handles","collection":"scripting","hash":"bd79392ed7baa702a5e82b8c31e86b4b","indexed_by":"docs-index"}},{"content":"Peghead\n\nPeghead seats under a stone: prongs, height, thickness.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PegheadApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Peghead` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Peghead` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a peghead (prong head) around an existing gem -- the ArtisanPeghead tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Peghead` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Pegheads currently selected in the active doc. |","metadata":{"title":"Peghead","url":"https://www.rhinoartisan.com/docs/scripting/python/peghead/","source":"https://www.rhinoartisan.com/docs/scripting/python/peghead/","collection":"scripting","hash":"21f2fb9c92b3c204134c37373cec4114","indexed_by":"docs-index"}},{"content":"Peghead — ra.peghead.all()\n\n```python\nra.peghead.all() -> List[Peghead]\n```\n\n`Peghead` handles for every object of this kind in the active document (empty when there is no document).\n\nra.peghead.bylayer()\n```python\nra.peghead.by_layer(layer_name: str) -> List[Peghead]\n```\n\n`Peghead` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Peghead","section":"ra.peghead.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadall","source":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadall","collection":"scripting","hash":"929821fc7c79caeb4eae114e84c45ff1","indexed_by":"docs-index"}},{"content":"Peghead — ra.peghead.count()\n\n```python\nra.peghead.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.peghead.create()\n```python\nra.peghead.create(gem_id: IdLike, prongs=None, height=None, thickness=None, girdle_width=None, over_girdle_height=None, gem_inside=None, profile=None, element=None) -> Peghead\n```\n\nBuilds a peghead (prong head) around an existing gem -- the ArtisanPeghead tool, headless. `gem_id` must be a gem in the active document; the peghead is a parametric child of that gem. Millimetres; omitting keeps the tool default (or the user's saved defaults): height 5, thickness 1, girdle_width 0.8, over_girdle_height 1. `prongs` 0 keeps the default (4); use 3, 4, 6... or a negative count for the rotated variant (-4 = 4 prongs at 45 degrees). `gem_inside` defaults to 0 and accepts negatives. `profile` picks a PEGHEAD_PROFILE asset by name (see ra.assets.list(\"PEGHEAD_PROFILE\")); omitted = the default profile. `element` = name of a saved Peghead element (ra.elements.list(\"Peghead\")) to start from instead of the defaults; explicit arguments (profile included) override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `prongs` | `int` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `girdle_width` | `float` | optional — None = the tool default |\n| `over_girdle_height` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Peghead","section":"ra.peghead.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadcount","source":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadcount","collection":"scripting","hash":"47c1e23a5aa90a6e1cdc041ae94b3e01","indexed_by":"docs-index"}},{"content":"Peghead — ra.peghead.find()\n\n```python\nra.peghead.find(id: IdLike) -> Peghead\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.peghead.forgem()\n```python\nra.peghead.for_gem(gem_id: IdLike) -> List[Peghead]\n```\n\n`Peghead` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Peghead","section":"ra.peghead.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadfind","source":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadfind","collection":"scripting","hash":"958015b45d8bfc7f869d7001204f3b6f","indexed_by":"docs-index"}},{"content":"Peghead — ra.peghead.selected()\n\n```python\nra.peghead.selected() -> List[Peghead]\n```\n\nPegheads currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nPeghead (handle)\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `girdle_width` | `float` | yes | |\n| `height` | `float` | yes | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `over_girdle_height` | `float` | yes | |\n| `position` | `Point3d` | | |\n| `profile_name` | `str` | | PEGHEAD_PROFILE asset name, \"\" when unset |\n| `prongs` | `int` | yes | Current values (millimetres, except Prongs). negative = the rotated variant |\n| `thickness` | `float` | yes | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved Peghead element (ra.elements.list(\"Peghead\")) to this peghead: its parameters replace the current ones, the mother gem stays, and the peghead regenerates in place (same Guid). |\n| `set_profile(asset_name: str)` | PEGHEAD_PROFILE asset name |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Peghead","section":"ra.peghead.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadselected","source":"https://www.rhinoartisan.com/docs/scripting/python/peghead/#rapegheadselected","collection":"scripting","hash":"9d6e0752a54f34854be9620707b2f6c2","indexed_by":"docs-index"}},{"content":"Pricing\n\nPrices and cost breakdowns, markup and taxes profiles.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.PricingApi`, `ArtisanPlugin.Scripting.PricingExtraApi`.","metadata":{"title":"Pricing","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/","collection":"scripting","hash":"dbd3086dee75e880b265f3f72ac49a90","indexed_by":"docs-index"}},{"content":"Pricing — Functions\n\n| Function | |\n|---|---|\n| `calculate()` | Recomputes the price for the current document using the active manufacturer / market and returns the totals plus the per-category breakdown. |\n| `calculate_detailed()` | Like Calculate(), but returning the SAME line-level detail the Breakdown panel shows: one line per metal (weight, waste, price), per certified diamond, per gem group (count, carats, sieve, price per carat, setting type), per process (metal processes, setting labor, additionals) and per extra component. |\n| `get_settings_json()` | The settings as indented JSON — the whole manufacturer, or just the node at `path` (dot-separated, case-insensitive, [n] for list items: \"Markets\", \"Diamonds.CertificateFromCt\", \"Cfp.Items[2]\"). |\n| `set_setting()` | Updates ONE cost value by path and persists the manufacturer file — e.g. |\n| `show_panel()` | Opens the Breakdown (price details) panel. |\n| `get_markup_json()` | The markup profile as indented JSON (the ArtisanMarkup dialog): Name, Notes, the main-stone cost bands P100_90 ... |\n| `get_taxes_json()` | The tax profile as indented JSON (the ArtisanTaxes dialog): Mode (None, European, American, Canadian, OtherCountry), the region and tax id of that mode (EuropeanCountry/EuropeanVatId, AmericanState/ AmericanSaleTaxId, CanadianProvince/CanadianSaleTaxId, OtherCountry/ UniqueTaxPercentage) and IncludeTaxesToPricing. |\n| `set_markup()` | Updates one or more markup values and saves Markup.json (the dialog's Accept). |\n| `set_taxes()` | Updates the tax profile and saves Taxes.json (the dialog's Accept). |\n| `tax_regions()` | The valid regions for a tax mode, to pick `region` in SetTaxes: EU member countries (European), US states (American), Canadian provinces (Canadian) or every country (OtherCountry). |","metadata":{"title":"Pricing","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#functions","collection":"scripting","hash":"72bad266a468aa95e95a4ac51e35db04","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.calculate()\n\n```python\nra.pricing.calculate(quote_certified=None, export=None) -> PriceResult\n```\n\nRecomputes the price for the current document using the active manufacturer / market and returns the totals plus the per-category breakdown. Use it to answer \"what's the price?\" without opening the panel. `quote_certified` False = skip the live Nivoda quotes for the certified diamonds (every diamond above the manufacturer's CertificateFromCt threshold): fast and offline, but those stones price as 0. Default True = quote them live with your saved Nivoda filter, like the panel. `export` True = export sale: metal is costed without the import duty / levy set in Breakdown Settings; False = domestic (duty included); None keeps the document's current choice.\n\n| Parameter | Type | |\n|---|---|---|\n| `quote_certified` | `bool` | optional — None = the tool default |\n| `export` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Pricing","section":"ra.pricing.calculate()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingcalculate","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingcalculate","collection":"scripting","hash":"b61ccfd34e57b3862cc39eedadc9c8bc","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.calculatedetailed()\n\n```python\nra.pricing.calculate_detailed(quote_certified=None, export=None) -> PriceBreakdownDetails\n```\n\nLike Calculate(), but returning the SAME line-level detail the Breakdown panel shows: one line per metal (weight, waste, price), per certified diamond, per gem group (count, carats, sieve, price per carat, setting type), per process (metal processes, setting labor, additionals) and per extra component. Read-only.\n\n| Parameter | Type | |\n|---|---|---|\n| `quote_certified` | `bool` | optional — None = the tool default |\n| `export` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Pricing","section":"ra.pricing.calculatedetailed()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingcalculatedetailed","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingcalculatedetailed","collection":"scripting","hash":"4a3acd8e127466f5824da248683ad514","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.getsettingsjson()\n\n```python\nra.pricing.get_settings_json(path=None) -> str\n```\n\nThe settings as indented JSON — the whole manufacturer, or just the node at `path` (dot-separated, case-insensitive, [n] for list items: \"Markets\", \"Diamonds.CertificateFromCt\", \"Cfp.Items[2]\"). Read-only.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | optional — None = the tool default |","metadata":{"title":"Pricing","section":"ra.pricing.getsettingsjson()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricinggetsettingsjson","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricinggetsettingsjson","collection":"scripting","hash":"c3a909492bb0e334d8d3405ca9e27312","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.setsetting()\n\n```python\nra.pricing.set_setting(path: str, value: str)\n```\n\nUpdates ONE cost value by path and persists the manufacturer file — e.g. SetSetting(\"Markets.Gold\", \"68.5\") or SetSetting(\"Diamonds.CertificateFromCt\", \"0.30\"). The value string is converted to the target type (number, bool, string or enum name). The next Calculate() prices with the new value.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `value` | `str` | required |","metadata":{"title":"Pricing","section":"ra.pricing.setsetting()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsetsetting","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsetsetting","collection":"scripting","hash":"dafcc4b8054bdb36ce918b1cc3d09e4e","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.showpanel()\n\n```python\nra.pricing.show_panel()\n```\n\nOpens the Breakdown (price details) panel. Call after Calculate() so the panel shows the freshly computed totals. Must run on the UI thread (Flow Studio's Apply does).\n\nra.pricing.getmarkupjson()\n```python\nra.pricing.get_markup_json() -> str\n```\n\nThe markup profile as indented JSON (the ArtisanMarkup dialog): Name, Notes, the main-stone cost bands P100_90 ... P10_0 (markup % by how much of the total cost the main stone represents), OnlySettingMarkup (% when only the setting is sold) and the loose diamonds/gemstones bands D0_030, D030_049, D050_069, D070_099, D10 (by carat). All values are percentages. Read-only.","metadata":{"title":"Pricing","section":"ra.pricing.showpanel()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingshowpanel","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingshowpanel","collection":"scripting","hash":"77c73d196dfa0eba8efff643a12ddcbd","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.gettaxesjson()\n\n```python\nra.pricing.get_taxes_json() -> str\n```\n\nThe tax profile as indented JSON (the ArtisanTaxes dialog): Mode (None, European, American, Canadian, OtherCountry), the region and tax id of that mode (EuropeanCountry/EuropeanVatId, AmericanState/ AmericanSaleTaxId, CanadianProvince/CanadianSaleTaxId, OtherCountry/ UniqueTaxPercentage) and IncludeTaxesToPricing. Read-only.","metadata":{"title":"Pricing","section":"ra.pricing.gettaxesjson()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricinggettaxesjson","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricinggettaxesjson","collection":"scripting","hash":"f6b46b275348a9680009f0a69ced7b26","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.setmarkup()\n\n```python\nra.pricing.set_markup(values: Dict[str, str]) -> str\n```\n\nUpdates one or more markup values and saves Markup.json (the dialog's Accept). `values` maps field name -> value, e.g. {\"P100_90\": \"35\", \"only_setting_markup\": \"120\", \"Name\": \"Retail\"}; names are matched ignoring case and underscores. Fields not given keep their value. Returns the profile JSON after the change.\n\n| Parameter | Type | |\n|---|---|---|\n| `values` | `Dict[str, str]` | required |","metadata":{"title":"Pricing","section":"ra.pricing.setmarkup()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsetmarkup","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsetmarkup","collection":"scripting","hash":"d35d9a7ef7844bfe0222299f159c1497","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.settaxes()\n\n```python\nra.pricing.set_taxes(mode=None, region=None, tax_id=None, unique_tax_percentage=None, include_taxes_to_pricing=None, name=None, notes=None) -> str\n```\n\nUpdates the tax profile and saves Taxes.json (the dialog's Accept). Every argument is optional; None/NaN keeps the stored value. mode None, European, American, Canadian or OtherCountry region country / state / province of the (new or stored) mode, by code or name — see TaxRegions() tax_id the VAT id (European) or sale tax id (American, Canadian); ignored by the other modes unique_tax_percentage flat tax % (OtherCountry only) include_taxes_to_pricing bake the tax into prices (European and OtherCountry only, as in the dialog) name, notes the profile's info fields Returns the profile JSON after the change.\n\n| Parameter | Type | |\n|---|---|---|\n| `mode` | `str` | optional — None = the tool default |\n| `region` | `str` | optional — None = the tool default |\n| `tax_id` | `str` | optional — None = the tool default |\n| `unique_tax_percentage` | `float` | optional — None = the tool default |\n| `include_taxes_to_pricing` | `Optional[bool]` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |\n| `notes` | `str` | optional — None = the tool default |","metadata":{"title":"Pricing","section":"ra.pricing.settaxes()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsettaxes","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingsettaxes","collection":"scripting","hash":"fc9b54d72edf77a16fb214a53f4c7001","indexed_by":"docs-index"}},{"content":"Pricing — ra.pricing.taxregions()\n\n```python\nra.pricing.tax_regions(mode: str) -> List[TaxRegion]\n```\n\nThe valid regions for a tax mode, to pick `region` in SetTaxes: EU member countries (European), US states (American), Canadian provinces (Canadian) or every country (OtherCountry). Read-only.\n\n| Parameter | Type | |\n|---|---|---|\n| `mode` | `str` | required |","metadata":{"title":"Pricing","section":"ra.pricing.taxregions()","url":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingtaxregions","source":"https://www.rhinoartisan.com/docs/scripting/python/pricing/#rapricingtaxregions","collection":"scripting","hash":"49db2c19aaffbfe2ec8e5445e4664174","indexed_by":"docs-index"}},{"content":"Profile Sweep\n\nSweeps of a profile along rails.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ProfileSweepApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `curve_ids` are the closed profiles, in sweep order (at least 2). |","metadata":{"title":"Profile Sweep","url":"https://www.rhinoartisan.com/docs/scripting/python/profile-sweep/","source":"https://www.rhinoartisan.com/docs/scripting/python/profile-sweep/","collection":"scripting","hash":"da000940557be06b9aed7b8770661e91","indexed_by":"docs-index"}},{"content":"Profile Sweep — ra.profilesweep.create()\n\n```python\nra.profile_sweep.create(curve_ids: Sequence[IdLike], start_cap=None, end_cap=None, start_cap_height=None, end_cap_height=None, start_continuity=None, end_continuity=None, start_flip=None, end_flip=None, symmetry=None, sub_d=None, sub_d_segments=None, sub_d_rail_segments=None) -> List[str]\n```\n\n`curve_ids` are the closed profiles, in sweep order (at least 2). Caps are \"NONE\", \"FLAT\" or \"ROUND\" per side (default ROUND, height 0.2). Continuities are 0..4 (G0 position .. G4; default 1 tangency, -1 keeps it). `symmetry` is \"NONE\", \"VERTICAL\" (mirror world YZ), \"HORIZONTAL\" (mirror world ZX) or \"QUAD\" (both). `subD` True outputs a SubD instead of a Brep (caps do not apply); segments default 32 cross-section / 10 rail. Returns the ids of the created objects (Breps are parametric ProfileSweep custom objects; the source curves stay untouched).\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `start_cap` | `str` | optional — None = the tool default |\n| `end_cap` | `str` | optional — None = the tool default |\n| `start_cap_height` | `float` | optional — None = the tool default |\n| `end_cap_height` | `float` | optional — None = the tool default |\n| `start_continuity` | `int` | optional — None = the tool default |\n| `end_continuity` | `int` | optional — None = the tool default |\n| `start_flip` | `bool` | optional — None = the tool default |\n| `end_flip` | `bool` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |\n| `sub_d` | `bool` | optional — None = the tool default |\n| `sub_d_segments` | `int` | optional — None = the tool default |\n| `sub_d_rail_segments` | `int` | optional — None = the tool default |","metadata":{"title":"Profile Sweep","section":"ra.profilesweep.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/profile-sweep/#raprofilesweepcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/profile-sweep/#raprofilesweepcreate","collection":"scripting","hash":"17a3cb0b3dcda784bf6b0fbe76922f05","indexed_by":"docs-index"}},{"content":"Prong\n\nProngs: dynamic (between stones), automatic, custom and axis-aligned.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ProngApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | Ids of every Artisan prong (ProngCustomObject) in the active document. |\n| `automatic_prongs()` | The \"Automatic\" button of ArtisanDynamicProngs, headless: searches every triplet of neighbouring ROUND gems in `gem_ids` (None = every visible round gem in the document, like the panel) and drops one prong in the gap between them, oriented by the gems' planes -- no base geometry needed. |\n| `custom_prongs()` | The ArtisanCustomProngs command, headless: copies `object_ids` (a custom prong modeled as a surface, polysurface, mesh or SubD; None = the current selection) onto every Artisan prong in `prong_ids` (None = every prong in the document), mapping from the source's base plane (bottom-centre of its bounding box on the active CPlane, or `base_plane` when given) to each prong's base plane. |\n| `dynamic_prongs()` | The ArtisanDynamicProngs panel, headless: drops one loose prong at each of `points`, seated on the closest point of `base_ids` (surfaces, polysurfaces or meshes; None = the current selection) and oriented by the face normal there. |\n| `prong_axis()` | The ArtisanProngAxis panel, headless: for each gem in `gem_ids` (None = the selected gems) draws the central axis line of every prong (curves only, no thickness) as one editable \"ProngAxis\" group per gem, ready for ArtisanEdit. |","metadata":{"title":"Prong","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/","collection":"scripting","hash":"3f088efeae83bbe91629416f421ef08a","indexed_by":"docs-index"}},{"content":"Prong — ra.prong.all()\n\n```python\nra.prong.all() -> List[str]\n```\n\nIds of every Artisan prong (ProngCustomObject) in the active document.\n\nra.prong.automaticprongs()\n```python\nra.prong.automatic_prongs(gem_ids=None, mode=None, diameter=None, diameter_top=None, diameter_mid=None, diameter_bottom=None, height_over_girdle=None, height_under_girdle=None, extension_for_manufacturing=None, min_diameter=None, gem_inside=None) -> List[str]\n```\n\nThe \"Automatic\" button of ArtisanDynamicProngs, headless: searches every triplet of neighbouring ROUND gems in `gem_ids` (None = every visible round gem in the document, like the panel) and drops one prong in the gap between them, oriented by the gems' planes -- no base geometry needed. Candidates within 0.5 mm of an existing visible prong are skipped. Prong parameters as in DynamicProngs; in AUTOMATIC mode each prong takes the diameter that fits its gap (+ gem_inside, never below min_diameter). Returns the ids of the new prongs.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `diameter_top` | `float` | optional — None = the tool default |\n| `diameter_mid` | `float` | optional — None = the tool default |\n| `diameter_bottom` | `float` | optional — None = the tool default |\n| `height_over_girdle` | `float` | optional — None = the tool default |\n| `height_under_girdle` | `float` | optional — None = the tool default |\n| `extension_for_manufacturing` | `float` | optional — None = the tool default |\n| `min_diameter` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |","metadata":{"title":"Prong","section":"ra.prong.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongall","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongall","collection":"scripting","hash":"a87c108cd77baa87b0cf2b26790a55ae","indexed_by":"docs-index"}},{"content":"Prong — ra.prong.customprongs()\n\n```python\nra.prong.custom_prongs(object_ids=None, prong_ids=None, scale=None, move_in_z=None, delete_originals=None, base_plane=None) -> List[str]\n```\n\nThe ArtisanCustomProngs command, headless: copies `object_ids` (a custom prong modeled as a surface, polysurface, mesh or SubD; None = the current selection) onto every Artisan prong in `prong_ids` (None = every prong in the document), mapping from the source's base plane (bottom-centre of its bounding box on the active CPlane, or `base_plane` when given) to each prong's base plane. `scale` is the command's option: NO (default, copy as-is), 1D (height only), 2D (width only, from the prong diameter) or 3D (uniform, from the prong diameter). `moveInZ` lifts each copy along its prong axis in mm; `delete_originals` removes the replaced Artisan prongs. Returns the ids of the copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `prong_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `scale` | `str` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `delete_originals` | `bool` | optional — None = the tool default |\n| `base_plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Prong","section":"ra.prong.customprongs()","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongcustomprongs","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongcustomprongs","collection":"scripting","hash":"cb31649ca32a765a06d1723bd58a7f68","indexed_by":"docs-index"}},{"content":"Prong — ra.prong.dynamicprongs()\n\n```python\nra.prong.dynamic_prongs(base_ids: Sequence[IdLike], points: Sequence[PointLike], mode=None, diameter=None, diameter_top=None, diameter_mid=None, diameter_bottom=None, height_over_girdle=None, height_under_girdle=None, extension_for_manufacturing=None, min_diameter=None, gem_inside=None, flip=None, symmetry=None) -> List[str]\n```\n\nThe ArtisanDynamicProngs panel, headless: drops one loose prong at each of `points`, seated on the closest point of `base_ids` (surfaces, polysurfaces or meshes; None = the current selection) and oriented by the face normal there. Millimetres; omitting keeps the tool default (or the user's saved prong defaults): BASIC mode with diameter 0.8, height_over_girdle 0.6, height_under_girdle 1, extension_for_manufacturing 0.8. `mode` BASIC (one diameter), ADVANCED (diameter_top/Mid/Bottom) or AUTOMATIC (min_diameter + gem_inside); omitted = saved mode, or ADVANCED when a top/mid/bottom diameter is given. `flip` turns the prongs upside down; `symmetry` NONE (default), X, Y or XY mirrors each prong across the world YZ / ZX planes like the panel combo. Returns the ids of the new prongs (one group, metal layer).","metadata":{"title":"Prong","section":"ra.prong.dynamicprongs()","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongdynamicprongs","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongdynamicprongs","collection":"scripting","hash":"50acc9c856052d38705c30152c790c8a","indexed_by":"docs-index"}},{"content":"Prong — ra.prong.dynamicprongs()\n\n| Parameter | Type | |\n|---|---|---|\n| `base_ids` | `Sequence[IdLike]` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `mode` | `str` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `diameter_top` | `float` | optional — None = the tool default |\n| `diameter_mid` | `float` | optional — None = the tool default |\n| `diameter_bottom` | `float` | optional — None = the tool default |\n| `height_over_girdle` | `float` | optional — None = the tool default |\n| `height_under_girdle` | `float` | optional — None = the tool default |\n| `extension_for_manufacturing` | `float` | optional — None = the tool default |\n| `min_diameter` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `flip` | `bool` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |","metadata":{"title":"Prong","section":"ra.prong.dynamicprongs()","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongdynamicprongs","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongdynamicprongs","collection":"scripting","hash":"f1afe8ca4dd19b285a426b64c5474d27","indexed_by":"docs-index"}},{"content":"Prong — ra.prong.prongaxis()\n\n```python\nra.prong.prong_axis(gem_ids=None, prongs=None, straight=None, height=None, gem_inside=None, over_girdle=None, bottom_rail_inside=None) -> List[str]\n```\n\nThe ArtisanProngAxis panel, headless: for each gem in `gem_ids` (None = the selected gems) draws the central axis line of every prong (curves only, no thickness) as one editable \"ProngAxis\" group per gem, ready for ArtisanEdit. omitting keeps the tool default (or the user's saved defaults): `prongs` 4, `height` 4 mm, `over_girdle` 0.3, `gem_inside` 0, `bottom_rail_inside` 0; `straight` True (False = the axis rises vertically then leans in). Returns the ids of the created curves.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `prongs` | `int` | optional — None = the tool default |\n| `straight` | `Optional[bool]` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `over_girdle` | `float` | optional — None = the tool default |\n| `bottom_rail_inside` | `float` | optional — None = the tool default |","metadata":{"title":"Prong","section":"ra.prong.prongaxis()","url":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongprongaxis","source":"https://www.rhinoartisan.com/docs/scripting/python/prong/#raprongprongaxis","collection":"scripting","hash":"33f0ba86c53a87ce2296cf8a72374168","indexed_by":"docs-index"}},{"content":"Raster To Vector\n\nTrace an image into curves.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RasterToVectorApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Vectorizes the image at `path` and adds the traced curves to the document. |\n\nra.rastertovector.create()\n```python\nra.raster_to_vector.create(path: str, threshold=None, ignore_area=None, corner_threshold=None, tolerance=None, target_width=None) -> List[str]\n```\n\nVectorizes the image at `path` and adds the traced curves to the document. Returns the ids of the added curves. threshold 0..1 black/white cut (default 0.51). Lower keeps more dark detail, higher more of the image. ignore_area speckles up to this many pixels are dropped (default 2) corner_threshold Potrace alphamax: 0 = sharp polygons, higher = rounder (default 1.0) tolerance curve optimization tolerance (default 0.2) target_width if > 0, the result is uniformly scaled so its total width is exactly this many model units (e.g. fit a motif to 12 mm). 0 = the tool's native sizing (1 unit per 50 image pixels).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `threshold` | `float` | optional — None = the tool default |\n| `ignore_area` | `int` | optional — None = the tool default |\n| `corner_threshold` | `float` | optional — None = the tool default |\n| `tolerance` | `float` | optional — None = the tool default |\n| `target_width` | `float` | optional — None = the tool default |","metadata":{"title":"Raster To Vector","url":"https://www.rhinoartisan.com/docs/scripting/python/raster-to-vector/","source":"https://www.rhinoartisan.com/docs/scripting/python/raster-to-vector/","collection":"scripting","hash":"d3433ae9a5b3f4b38d6c344c3b1eba20","indexed_by":"docs-index"}},{"content":"Realtime Render\n\nThe web Realtime Render viewer: open, update, camera, materials, screenshots.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RealtimeRenderApi`.","metadata":{"title":"Realtime Render","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/","collection":"scripting","hash":"122709f10e67c106d0e6d05869fc8711","indexed_by":"docs-index"}},{"content":"Realtime Render — Functions\n\n| Function | |\n|---|---|\n| `capture_views()` | Captures the 8 standard orbital views (front, back, left, right, three-quarter x2, top, bottom) as PNGs into `folder` -- one call, camera restored afterwards. |\n| `edit_viewer_material()` | Live-edits a catalog material everywhere it is currently applied: color (CSS color), roughness 0-1, ior (gems, ~1.4-2.4), opacity 0-1. |\n| `get_viewer_items()` | JSON array with the viewer's parts and their current materials ([{uuid, material, ...}]). |\n| `record_turntable()` | One-call 360: turns auto-rotation on, records `seconds` of video to `path`, and schedules the rotation back off inside the page when the recording ends -- the script needs no sleeps or timers. |\n| `set_material_by_layer()` | Applies a viewer catalog material to every part on a layer. |\n| `set_viewer_background()` | Sets the viewer's background gradient. |\n| `set_viewer_camera()` | Places the VIEWER camera at `position` looking at `target` (viewer/GLB coordinates, which match the Rhino model in mm). |\n| `set_viewer_camera_preset()` | Moves the VIEWER camera to a named preset. |\n| `set_viewer_environment()` | Sets the lighting environment: a preset name (studio, sunset, dawn, night, warehouse, forest, apartment, city, park, lobby) or an HDR/EXR URL. |\n| `set_viewer_material()` | Changes one part's material in the viewer. |\n| `set_viewer_option()` | Sets ANY single viewer option by its dot-path key -- backgrounds, bevel, jewelry shadows, AO, depth of field, bloom, vignette, caustics, studio lights, auto_rotate... |\n| `set_viewer_options()` | Applies a batch of viewer options in one call. |","metadata":{"title":"Realtime Render","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#functions","collection":"scripting","hash":"5cd5aeedb17f6e748d9acee9b78604f6","indexed_by":"docs-index"}},{"content":"Realtime Render — Functions\n\n| Function | |\n|---|---|\n| `show_realtime_render()` | Opens the Realtime Render window (or activates it when already open), same as the ArtisanRealtimeRender command -- which is hidden from the command list, so this is the only scriptable way in. |\n| `start_video_recording()` | Starts recording the viewer to a video file. |\n| `stop_video_recording()` | Stops a manual recording started with seconds = 0; the file is then written to the path given to StartVideoRecording. |\n| `update_render()` | Re-exports the current document to the viewer (the ArtisanRenderUpdate command). |\n| `viewer_screenshot()` | Saves a PNG of the current viewer frame to `path` and returns the full path written (\".png\" appended when missing). |\n| `viewer_zoom_extents()` | Frames the whole model in the viewer. |","metadata":{"title":"Realtime Render","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#functions","collection":"scripting","hash":"227ce186f5e3b1adb033d2d336ec9c9e","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.captureviews()\n\n```python\nra.realtime_render.capture_views(folder: str, width=None, height=None) -> str\n```\n\nCaptures the 8 standard orbital views (front, back, left, right, three-quarter x2, top, bottom) as PNGs into `folder` -- one call, camera restored afterwards. Returns the paths written, one per line. Slow: expect a few seconds; the call waits up to 2 minutes.\n\n| Parameter | Type | |\n|---|---|---|\n| `folder` | `str` | required |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.captureviews()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendercaptureviews","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendercaptureviews","collection":"scripting","hash":"b0b84eb426d435d4ad3d8d3c5dfd9514","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.editviewermaterial()\n\n```python\nra.realtime_render.edit_viewer_material(material_name: str, color=None, roughness=None, ior=None, opacity=None)\n```\n\nLive-edits a catalog material everywhere it is currently applied: color (CSS color), roughness 0-1, ior (gems, ~1.4-2.4), opacity 0-1. Pass None/negative to leave a property untouched. The edit is ephemeral -- re-applying the material from the catalog resets it.\n\n| Parameter | Type | |\n|---|---|---|\n| `material_name` | `str` | required |\n| `color` | `str` | optional — None = the tool default |\n| `roughness` | `float` | optional — None = the tool default |\n| `ior` | `float` | optional — None = the tool default |\n| `opacity` | `float` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.editviewermaterial()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendereditviewermaterial","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendereditviewermaterial","collection":"scripting","hash":"0ff55385ad40452b65804d13cd7ad3b2","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.getvieweritems()\n\n```python\nra.realtime_render.get_viewer_items() -> str\n```\n\nJSON array with the viewer's parts and their current materials ([{uuid, material, ...}]). Call this FIRST to learn the part names (uuids) to pass to SetViewerMaterial.\n\nra.realtimerender.recordturntable()\n```python\nra.realtime_render.record_turntable(path: str, seconds=None, width=None, height=None, frame_rate=None) -> str\n```\n\nOne-call 360: turns auto-rotation on, records `seconds` of video to `path`, and schedules the rotation back off inside the page when the recording ends -- the script needs no sleeps or timers. Returns the path armed; the file appears when the recording finishes.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `seconds` | `float` | optional — None = the tool default |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |\n| `frame_rate` | `int` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.getvieweritems()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendergetvieweritems","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendergetvieweritems","collection":"scripting","hash":"5bce0afb4c98a437149d168dc900a4bc","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setmaterialbylayer()\n\n```python\nra.realtime_render.set_material_by_layer(layer_name: str, material_name: str) -> int\n```\n\nApplies a viewer catalog material to every part on a layer. `layer_name` matches the viewer item's layer or name, case-insensitive and treating spaces and underscores as equal -- so \"METAL_01\", \"metal 01\" and \"Metal 01\" all hit the Rhino layer \"Metal 01\". Returns how many parts changed; throws listing the available layers when nothing matches. Viewer-only: the Rhino document is untouched.\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |\n| `material_name` | `str` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setmaterialbylayer()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetmaterialbylayer","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetmaterialbylayer","collection":"scripting","hash":"72f38f19faa7255c1d8cc22bc035aa22","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setviewerbackground()\n\n```python\nra.realtime_render.set_viewer_background(top_color: str, bottom_color=None)\n```\n\nSets the viewer's background gradient. Colors are CSS colors (\"#1a1a2e\", \"white\"...). Pass None/empty to leave one end unchanged.\n\n| Parameter | Type | |\n|---|---|---|\n| `top_color` | `str` | required |\n| `bottom_color` | `str` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setviewerbackground()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewerbackground","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewerbackground","collection":"scripting","hash":"c597d8b251a55d4b782e4912151e2366","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setviewercamera()\n\n```python\nra.realtime_render.set_viewer_camera(position: PointLike, target: PointLike)\n```\n\nPlaces the VIEWER camera at `position` looking at `target` (viewer/GLB coordinates, which match the Rhino model in mm).\n\n| Parameter | Type | |\n|---|---|---|\n| `position` | `PointLike` | required |\n| `target` | `PointLike` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setviewercamera()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewercamera","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewercamera","collection":"scripting","hash":"787d883d2633dc68fc38d9560db03197","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setviewercamerapreset()\n\n```python\nra.realtime_render.set_viewer_camera_preset(preset: str)\n```\n\nMoves the VIEWER camera to a named preset. Valid presets: front, back, left, right, top, bottom, three-quarter, three-quarter-left, detail, dramatic-low. The preset frames the model automatically.\n\n| Parameter | Type | |\n|---|---|---|\n| `preset` | `str` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setviewercamerapreset()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewercamerapreset","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewercamerapreset","collection":"scripting","hash":"bcdd55c60537152a3273c56f791d9e0b","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setviewerenvironment()\n\n```python\nra.realtime_render.set_viewer_environment(preset_or_url: str, intensity=None)\n```\n\nSets the lighting environment: a preset name (studio, sunset, dawn, night, warehouse, forest, apartment, city, park, lobby) or an HDR/EXR URL. `intensity` > 0 also sets the environment intensity (1 = neutral).\n\n| Parameter | Type | |\n|---|---|---|\n| `preset_or_url` | `str` | required |\n| `intensity` | `float` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setviewerenvironment()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewerenvironment","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewerenvironment","collection":"scripting","hash":"8a8ab3be8bb0636b5ff8a7b54a9d04b1","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setviewermaterial()\n\n```python\nra.realtime_render.set_viewer_material(part_uuid: str, material_name: str)\n```\n\nChanges one part's material in the viewer. `part_uuid` comes from GetViewerItems(); `material_name` is a viewer catalog name (e.g. \"YELLOW_GOLD\", \"WHITE_GOLD\", \"PLATINUM\", \"DIAMOND\", \"RUBY\"). Viewer-only: the Rhino document is not modified.\n\n| Parameter | Type | |\n|---|---|---|\n| `part_uuid` | `str` | required |\n| `material_name` | `str` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setviewermaterial()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewermaterial","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetviewermaterial","collection":"scripting","hash":"cb24ac6cccd6a8d06f7d8003de95f19c","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setvieweroption()\n\n```python\nra.realtime_render.set_viewer_option(path: str, value: str)\n```\n\nSets ANY single viewer option by its dot-path key -- backgrounds, bevel, jewelry shadows, AO, depth of field, bloom, vignette, caustics, studio lights, auto_rotate... `value` is parsed as bool, number or string (\"True\", \"0.4\", \"#ffffff\").\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `value` | `str` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setvieweroption()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetvieweroption","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetvieweroption","collection":"scripting","hash":"17d07db8cf7857de8f693a86243026a9","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.setvieweroptions()\n\n```python\nra.realtime_render.set_viewer_options(options_json: str)\n```\n\nApplies a batch of viewer options in one call. `options_json` is a JSON object of option keys to values, e.g. {\"effect_composer_bloom_enabled\":True,\"effect_composer_bloom_intensity\":0.6}.\n\n| Parameter | Type | |\n|---|---|---|\n| `options_json` | `str` | required |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.setvieweroptions()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetvieweroptions","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendersetvieweroptions","collection":"scripting","hash":"1c959ad58d7ad044280bde580b864769","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.showrealtimerender()\n\n```python\nra.realtime_render.show_realtime_render() -> bool\n```\n\nOpens the Realtime Render window (or activates it when already open), same as the ArtisanRealtimeRender command -- which is hidden from the command list, so this is the only scriptable way in.\n\nra.realtimerender.startvideorecording()\n```python\nra.realtime_render.start_video_recording(path: str, seconds=None, width=None, height=None, frame_rate=None) -> str\n```\n\nStarts recording the viewer to a video file. `seconds` > 0 stops and saves automatically after that long; 0 records until StopVideoRecording(). The finished file lands at `path` (the window reroutes the viewer's download there). The viewer picks the codec: mp4 (h264) when the OS supports it, webm otherwise -- keep \".mp4\".\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `seconds` | `float` | optional — None = the tool default |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |\n| `frame_rate` | `int` | optional — None = the tool default |","metadata":{"title":"Realtime Render","section":"ra.realtimerender.showrealtimerender()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendershowrealtimerender","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerendershowrealtimerender","collection":"scripting","hash":"edf9d904a1be8e144b8d8786eff9d121","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.stopvideorecording()\n\n```python\nra.realtime_render.stop_video_recording()\n```\n\nStops a manual recording started with seconds = 0; the file is then written to the path given to StartVideoRecording. Saving is asynchronous -- give it a moment before reading the file.\n\nra.realtimerender.updaterender()\n```python\nra.realtime_render.update_render()\n```\n\nRe-exports the current document to the viewer (the ArtisanRenderUpdate command). The export runs in the background; this returns as soon as it is queued. Requires the Realtime Render window to be open -- throws a clear error otherwise (the command only logged it, which a script would never see).","metadata":{"title":"Realtime Render","section":"ra.realtimerender.stopvideorecording()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerenderstopvideorecording","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerenderstopvideorecording","collection":"scripting","hash":"0d5a0f69047ee5ae23d09bf83ee2e8d4","indexed_by":"docs-index"}},{"content":"Realtime Render — ra.realtimerender.viewerscreenshot()\n\n```python\nra.realtime_render.viewer_screenshot(path: str) -> str\n```\n\nSaves a PNG of the current viewer frame to `path` and returns the full path written (\".png\" appended when missing).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n\nra.realtimerender.viewerzoomextents()\n```python\nra.realtime_render.viewer_zoom_extents()\n```\n\nFrames the whole model in the viewer.","metadata":{"title":"Realtime Render","section":"ra.realtimerender.viewerscreenshot()","url":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerenderviewerscreenshot","source":"https://www.rhinoartisan.com/docs/scripting/python/realtime-render/#rarealtimerenderviewerscreenshot","collection":"scripting","hash":"79af6d371d18636289390cd897345525","indexed_by":"docs-index"}},{"content":"Relations\n\nParent/child relations between parametric objects.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RelationsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `apply_element()` | The ArtisanApplyElement command, headless: takes the parameters of one existing Artisan element in the document (`source_id`: a member of a parametric group -- Halo, Cluster, Basket, AdvancedBasket, Tulip, Martini, TrellisGemset, Gems on Curve, Advanced Gems on Curve, MicroSetting -- or a parametric custom object: Bezel, Cutter, Peghead, Rope, Milgrain, SmartProfile) and builds the same element on each target mother, with the very bake of the command (group + RaObjectUserData, metal materials, gems layer...). |\n| `meet_mothers_and_children()` | Re-matches every parametric child with its mother, exactly like the ArtisanRefreshRelations command (and the Yes branch of ArtisanMeetMothersAndChildrenCommand): each bezel, cutter, halo, rope... |","metadata":{"title":"Relations","url":"https://www.rhinoartisan.com/docs/scripting/python/relations/","source":"https://www.rhinoartisan.com/docs/scripting/python/relations/","collection":"scripting","hash":"815b438da3fb828c852424ad38aec54d","indexed_by":"docs-index"}},{"content":"Relations — ra.relations.applyelement()\n\n```python\nra.relations.apply_element(source_id: IdLike, target_ids: Sequence[IdLike]) -> List[str]\n```\n\nThe ArtisanApplyElement command, headless: takes the parameters of one existing Artisan element in the document (`source_id`: a member of a parametric group -- Halo, Cluster, Basket, AdvancedBasket, Tulip, Martini, TrellisGemset, Gems on Curve, Advanced Gems on Curve, MicroSetting -- or a parametric custom object: Bezel, Cutter, Peghead, Rope, Milgrain, SmartProfile) and builds the same element on each target mother, with the very bake of the command (group + RaObjectUserData, metal materials, gems layer...). Targets are gems for the gem-based elements and curves for the curve-based ones (Rope, Milgrain, SmartProfile, Gems on Curve); a MicroSetting takes the whole target list as ONE gem row. This is \"copy the setting of that gem onto these gems\" -- it reads the element in the document, not the saved library (see ElementsApi for presets). Returns the ids of every object created (the members of each new element).\n\n| Parameter | Type | |\n|---|---|---|\n| `source_id` | `IdLike` | required |\n| `target_ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Relations","section":"ra.relations.applyelement()","url":"https://www.rhinoartisan.com/docs/scripting/python/relations/#rarelationsapplyelement","source":"https://www.rhinoartisan.com/docs/scripting/python/relations/#rarelationsapplyelement","collection":"scripting","hash":"6185de0013023175931308206570af60","indexed_by":"docs-index"}},{"content":"Relations — ra.relations.meetmothersandchildren()\n\n```python\nra.relations.meet_mothers_and_children()\n```\n\nRe-matches every parametric child with its mother, exactly like the ArtisanRefreshRelations command (and the Yes branch of ArtisanMeetMothersAndChildrenCommand): each bezel, cutter, halo, rope... re-adopts the nearest gem / curve as mother, so children moved or copied with native Rhino commands follow the right mother again. This is NOT ra.document.refresh_all (that regenerates the geometry of pending children); run this first, then RefreshAll if the geometry must be rebuilt. The transform facades already run it.","metadata":{"title":"Relations","section":"ra.relations.meetmothersandchildren()","url":"https://www.rhinoartisan.com/docs/scripting/python/relations/#rarelationsmeetmothersandchildren","source":"https://www.rhinoartisan.com/docs/scripting/python/relations/#rarelationsmeetmothersandchildren","collection":"scripting","hash":"15a8caffeaa98c9e8ededb9bf312fd62","indexed_by":"docs-index"}},{"content":"Relief\n\n2.5D reliefs: creators, the operation stack, sculpt/smooth by points, bake, heightmaps.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ReliefApi`.","metadata":{"title":"Relief","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/","collection":"scripting","hash":"3c924b33b2ff4bc14152ba2cb6b24631","indexed_by":"docs-index"}},{"content":"Relief — Functions\n\n| Function | |\n|---|---|\n| `add_carbon()` | Adds a carbon copy (rubbing) operation: an image laid over the workbench (centred, aspect kept, like AddImage) that shows only where the brush has rubbed. |\n| `add_extrude()` | Adds a flat extrusion operation: closed curves raised to a constant height (None = the default 1.0; negative engraves), with an optional feathered edge in model units. |\n| `add_geometry()` | Adds a projected-geometry operation (parameters as in CreateFromGeometry). |\n| `add_image()` | Adds an image height-map operation (parameters as in CreateFromImage; clip_curve_ids are optional closed curves the image fits and is clipped to). |\n| `add_profile()` | Adds a profile (puffed) operation to the document's relief project. |\n| `add_sculpt()` | Adds a sculpt (brush) operation dabbed programmatically: one smooth dab per point, each raising (or carving, negative height) the field by up to `height` mm at its center. |\n| `add_smooth()` | Adds a smooth (brush) operation dabbed programmatically: everything below it in the stack is blurred where the painted mask says so -- the panel's Smooth brush, headless. |\n| `add_texture()` | Adds a tiled 3D-texture operation from the Textures3D library. |\n| `bake()` | Recomputes the saved project at full resolution and bakes the output mesh into the document (the panel's Accept, headless). |\n| `clear_project()` | Deletes the document's saved relief project entirely (settings and all operations). |\n| `create_from_curves()` | Bakes a relief mesh from closed curves filled with a height profile (the classic puffed relief) in one call, without touching the document's saved relief project. |","metadata":{"title":"Relief","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#functions","collection":"scripting","hash":"b7055711f42fafceaabb18afe0908893","indexed_by":"docs-index"}},{"content":"Relief — Functions\n\n| Function | |\n|---|---|\n| `create_from_geometry()` | Bakes a relief mesh from document geometry (meshes, breps, extrusions, SubDs) projected top-down onto the workbench — the height of each object above the plane becomes the relief. |\n| `create_from_image()` | Bakes a relief mesh from a grayscale image height map (white = highest) in one call, without touching the document's saved relief project. |\n| `export_heightmap()` | Recomputes the saved project at full resolution and writes it as a 16-bit grayscale TIFF height map (black = lowest point), for CNC/CAM pipelines. |\n| `get_project()` | The document's saved relief project settings; Exists=False (all zeros) when the document has none. |\n| `move_operation()` | Moves one operation to a new position in the stack (0 = first applied). |\n| `operations()` | The saved project's operation stack in apply order; empty list when the document has no project. |\n| `profile_names()` | Names accepted by the \"profile\" parameter of profile operations: the four built-in presets (Round, Smooth, Chamfer, Plateau) followed by the user's saved custom profiles. |\n| `remove_operation()` | Removes one operation from the saved project. |\n| `set_operation_combine()` | Changes how one operation merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply). |\n| `set_operation_enabled()` | Enables or disables one operation of the saved project (the panel's eye toggle); disabled operations are skipped by Bake. |\n| `setup_project()` | Creates the document's relief project — or reconfigures its settings, keeping the existing operation stack. |","metadata":{"title":"Relief","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#functions","collection":"scripting","hash":"fa4c533b5d3f0367f3c491ae0223400d","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addcarbon()\n\n```python\nra.relief.add_carbon(image_path: str, points: Sequence[PointLike], radius=None, strength=None, height=None, invert=None, base_radius=None, scale=None, offset_x=None, offset_y=None, combine=None, name=None) -> str\n```\n\nAdds a carbon copy (rubbing) operation: an image laid over the workbench (centred, aspect kept, like AddImage) that shows only where the brush has rubbed. The strokes are dabbed programmatically, one dab per point, each adding up to `strength` coverage at its centre; the panel's Carbon brush can keep rubbing (or Ctrl-erasing) afterwards. image_path image file; brightness -> height like AddImage. points world points to rub; at least one. radius dab radius in model units (0 = 2.0). strength 0-1 coverage per dab (0 = 1.0, full). height height at pure white in mm (0 = 0.5). invert flip brightness. base_radius mm of broad tones (lighting, vignette) removed from the image before rubbing (0 = 2.0; pass a negative value for none). scale multiplier over the fitted size (0 = 1.0). offsetX/Y shift of the image centre from the workbench centre, mm. Returns the operation's Guid. Nothing is baked until Bake().","metadata":{"title":"Relief","section":"ra.relief.addcarbon()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddcarbon","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddcarbon","collection":"scripting","hash":"5867d85dc6520046146c04b79341af83","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addcarbon()\n\n| Parameter | Type | |\n|---|---|---|\n| `image_path` | `str` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `radius` | `float` | optional — None = the tool default |\n| `strength` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `invert` | `bool` | optional — None = the tool default |\n| `base_radius` | `float` | optional — None = the tool default |\n| `scale` | `float` | optional — None = the tool default |\n| `offset_x` | `float` | optional — None = the tool default |\n| `offset_y` | `float` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addcarbon()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddcarbon","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddcarbon","collection":"scripting","hash":"82892e592c3c5739d4eea5887e175447","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addextrude()\n\n```python\nra.relief.add_extrude(curve_ids: Sequence[IdLike], height=None, feather=None, combine=None, name=None) -> str\n```\n\nAdds a flat extrusion operation: closed curves raised to a constant height (None = the default 1.0; negative engraves), with an optional feathered edge in model units. Returns the operation's Guid.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `feather` | `float` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addextrude()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddextrude","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddextrude","collection":"scripting","hash":"a4feb0f6921fb3a46da9be44f898d99d","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addgeometry()\n\n```python\nra.relief.add_geometry(object_ids: Sequence[IdLike], feather=None, combine=None, name=None) -> str\n```\n\nAdds a projected-geometry operation (parameters as in CreateFromGeometry). Returns the operation's Guid.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `feather` | `float` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addgeometry()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddgeometry","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddgeometry","collection":"scripting","hash":"9814e618bfd021886cb9b5e45fc7935f","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addimage()\n\n```python\nra.relief.add_image(image_path: str, height=None, invert=None, scale=None, clip_curve_ids=None, combine=None, name=None) -> str\n```\n\nAdds an image height-map operation (parameters as in CreateFromImage; clip_curve_ids are optional closed curves the image fits and is clipped to). Returns the operation's Guid.\n\n| Parameter | Type | |\n|---|---|---|\n| `image_path` | `str` | required |\n| `height` | `float` | optional — None = the tool default |\n| `invert` | `bool` | optional — None = the tool default |\n| `scale` | `float` | optional — None = the tool default |\n| `clip_curve_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addimage()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddimage","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddimage","collection":"scripting","hash":"7eb77edb9008f220c32fb6f226c91cda","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addprofile()\n\n```python\nra.relief.add_profile(curve_ids: Sequence[IdLike], height=None, profile=None, starting_height=None, fixed_profile_width=None, feather=None, combine=None, name=None) -> str\n```\n\nAdds a profile (puffed) operation to the document's relief project. Parameters as in CreateFromCurves; combine sets how the layer merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply); name labels the card in the panel (None = auto \"Profile N\"). If the document has no project yet, one is created auto-fitted to the curves — call SetupProject first to control the workbench. Nothing is baked until Bake(). Returns the operation's Guid.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `starting_height` | `float` | optional — None = the tool default |\n| `fixed_profile_width` | `float` | optional — None = the tool default |\n| `feather` | `float` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addprofile()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddprofile","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddprofile","collection":"scripting","hash":"55ac32c2f9fbfe0181af0465788ed07d","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addsculpt()\n\n```python\nra.relief.add_sculpt(points: Sequence[PointLike], radius=None, height=None, combine=None, name=None) -> str\n```\n\nAdds a sculpt (brush) operation dabbed programmatically: one smooth dab per point, each raising (or carving, negative height) the field by up to `height` mm at its center. The same operation the panel's Sculpt brush paints -- editable, reorderable and re-dabbable in the panel afterwards. Points are projected onto the workbench plane, so sample a curve and pass the points to \"stroke\" along it. points world points to dab; at least one. radius dab radius in model units (0 = 2.0). height signed height per dab in model units (0 = 0.5); dabs on the same spot accumulate, like brush passes. combine how the layer merges into the stack (default Add). Returns the operation's Guid. Nothing is baked until Bake().\n\n| Parameter | Type | |\n|---|---|---|\n| `points` | `Sequence[PointLike]` | required |\n| `radius` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addsculpt()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddsculpt","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddsculpt","collection":"scripting","hash":"f3cb7e43820a04ca541abe2fd5945b0b","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addsmooth()\n\n```python\nra.relief.add_smooth(points: Sequence[PointLike], radius=None, strength=None, blur_radius=None, name=None) -> str\n```\n\nAdds a smooth (brush) operation dabbed programmatically: everything below it in the stack is blurred where the painted mask says so -- the panel's Smooth brush, headless. In-place by nature: it filters the accumulated field instead of contributing a layer, so it has no combine mode. points world points to dab; at least one. radius dab radius in model units (0 = 2.0). strength 0-1 mask strength per dab (0 = 1.0, full smoothing). blur_radius blur kernel radius in model units (0 = 1.0). Returns the operation's Guid. Nothing is baked until Bake().\n\n| Parameter | Type | |\n|---|---|---|\n| `points` | `Sequence[PointLike]` | required |\n| `radius` | `float` | optional — None = the tool default |\n| `strength` | `float` | optional — None = the tool default |\n| `blur_radius` | `float` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addsmooth()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddsmooth","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddsmooth","collection":"scripting","hash":"abf860a6bea2067592562dc8f575b924","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.addtexture()\n\n```python\nra.relief.add_texture(texture_name: str, height=None, tiles_u=None, tiles_v=None, invert=None, clip_curve_ids=None, combine=None, name=None) -> str\n```\n\nAdds a tiled 3D-texture operation from the Textures3D library. texture_name filename inside the library (e.g. \"KNURL01.jpg\"); see the Texture3D smart component for the available set. height height at pure white in model units (None = the default 0.5). tilesU/V repetitions across the workbench or the clip-curve bounds (None = the default 4). clip_curve_ids optional closed curves to clip the texture to. Returns the operation's Guid.\n\n| Parameter | Type | |\n|---|---|---|\n| `texture_name` | `str` | required |\n| `height` | `float` | optional — None = the tool default |\n| `tiles_u` | `float` | optional — None = the tool default |\n| `tiles_v` | `float` | optional — None = the tool default |\n| `invert` | `bool` | optional — None = the tool default |\n| `clip_curve_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `combine` | `str` | optional — None = the tool default |\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.addtexture()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddtexture","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefaddtexture","collection":"scripting","hash":"152c63f6354e1e5c324ca1e0602300fb","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.bake()\n\n```python\nra.relief.bake() -> str\n```\n\nRecomputes the saved project at full resolution and bakes the output mesh into the document (the panel's Accept, headless). The project stays in the document so it can be re-edited and re-baked. Returns the Guid of the baked mesh.\n\nra.relief.clearproject()\n```python\nra.relief.clear_project()\n```\n\nDeletes the document's saved relief project entirely (settings and all operations). Baked meshes are ordinary meshes and are not touched.","metadata":{"title":"Relief","section":"ra.relief.bake()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefbake","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefbake","collection":"scripting","hash":"a90fd364107a928a289182f318218ea9","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.createfromcurves()\n\n```python\nra.relief.create_from_curves(curve_ids: Sequence[IdLike], height=None, profile=None, starting_height=None, fixed_profile_width=None, feather=None, world_width=None, world_height=None, resolution=None, workbench=None, solid=None, cap_distance=None, delete_base=None) -> str\n```\n\nBakes a relief mesh from closed curves filled with a height profile (the classic puffed relief) in one call, without touching the document's saved relief project. curve_ids closed curves to fill; at least one. height peak height in model units (None = the default 1.0); negative engraves. profile cross-section name from ProfileNames() (None/\"\" = \"Round\"). starting_height Z offset where the profile takes off (default 0). fixed_profile_width 0 = inflate: the profile peaks at the deepest point of the curve set; > 0 = the profile spans exactly this width from the curve edge, in model units. feather edge blend distance in model units (0 = hard edge). world_width/Height, resolution, workbench, solid, cap_distance, delete_base as in CreateFromImage. Returns the Guid of the baked mesh.","metadata":{"title":"Relief","section":"ra.relief.createfromcurves()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromcurves","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromcurves","collection":"scripting","hash":"f6aaa664dd4bf269c25107b7d3ba6314","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.createfromcurves()\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `starting_height` | `float` | optional — None = the tool default |\n| `fixed_profile_width` | `float` | optional — None = the tool default |\n| `feather` | `float` | optional — None = the tool default |\n| `world_width` | `float` | optional — None = the tool default |\n| `world_height` | `float` | optional — None = the tool default |\n| `resolution` | `int` | optional — None = the tool default |\n| `workbench` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `solid` | `bool` | optional — None = the tool default |\n| `cap_distance` | `float` | optional — None = the tool default |\n| `delete_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.createfromcurves()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromcurves","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromcurves","collection":"scripting","hash":"14fefff9c177a86c0babbdca44266c6c","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.createfromgeometry()\n\n```python\nra.relief.create_from_geometry(object_ids: Sequence[IdLike], feather=None, world_width=None, world_height=None, resolution=None, workbench=None, solid=None, cap_distance=None, delete_base=None) -> str\n```\n\nBakes a relief mesh from document geometry (meshes, breps, extrusions, SubDs) projected top-down onto the workbench — the height of each object above the plane becomes the relief. One call, without touching the document's saved relief project. object_ids objects to project; at least one. feather edge blend distance in model units (0 = hard edge). world_width/Height, resolution, workbench, solid, cap_distance, delete_base as in CreateFromImage (auto-fit covers the objects). Returns the Guid of the baked mesh.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `feather` | `float` | optional — None = the tool default |\n| `world_width` | `float` | optional — None = the tool default |\n| `world_height` | `float` | optional — None = the tool default |\n| `resolution` | `int` | optional — None = the tool default |\n| `workbench` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `solid` | `bool` | optional — None = the tool default |\n| `cap_distance` | `float` | optional — None = the tool default |\n| `delete_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.createfromgeometry()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromgeometry","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromgeometry","collection":"scripting","hash":"67a5f64d8bd83450b17fa53c76e85a40","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.createfromimage()\n\n```python\nra.relief.create_from_image(image_path: str, height=None, invert=None, scale=None, region_curve_ids=None, world_width=None, world_height=None, resolution=None, workbench=None, solid=None, cap_distance=None, delete_base=None) -> str\n```\n\nBakes a relief mesh from a grayscale image height map (white = highest) in one call, without touching the document's saved relief project. image_path PNG/JPG/BMP/TIFF file; pixel brightness maps to height. height height at pure white in model units (None = the default 1.0); negative engraves. invert True maps black to the highest point. scale multiplier over the fitted image size (None = the default 1.0). region_curve_ids closed planar curves; the image fits their bounds and is clipped to their interior. None/empty = image centered on the workbench keeping its aspect ratio. world_width/Height workbench size in model units (0 = fit the region curves with a 10% margin, or 50 when there are none). resolution grid nodes along the larger side, 64-4096 (0 = 512). workbench plane the relief sits on, grid centered at its origin (None = world XY, auto-centered on the region curves). solid True (default) bakes a closed solid; False an open mesh. cap_distance solid thickness below the base plane (None = the default 1.0). delete_base True trims away grid cells no operation touched. Returns the Guid of the baked mesh.","metadata":{"title":"Relief","section":"ra.relief.createfromimage()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromimage","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromimage","collection":"scripting","hash":"ab0d4394e460e721ad7396aa2e3e4523","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.createfromimage()\n\n| Parameter | Type | |\n|---|---|---|\n| `image_path` | `str` | required |\n| `height` | `float` | optional — None = the tool default |\n| `invert` | `bool` | optional — None = the tool default |\n| `scale` | `float` | optional — None = the tool default |\n| `region_curve_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `world_width` | `float` | optional — None = the tool default |\n| `world_height` | `float` | optional — None = the tool default |\n| `resolution` | `int` | optional — None = the tool default |\n| `workbench` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `solid` | `bool` | optional — None = the tool default |\n| `cap_distance` | `float` | optional — None = the tool default |\n| `delete_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.createfromimage()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromimage","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefcreatefromimage","collection":"scripting","hash":"085a5626206919e6227726b8fd338c39","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.exportheightmap()\n\n```python\nra.relief.export_heightmap(file_path: str)\n```\n\nRecomputes the saved project at full resolution and writes it as a 16-bit grayscale TIFF height map (black = lowest point), for CNC/CAM pipelines. file_path should end in .tif/.tiff.\n\n| Parameter | Type | |\n|---|---|---|\n| `file_path` | `str` | required |","metadata":{"title":"Relief","section":"ra.relief.exportheightmap()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefexportheightmap","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefexportheightmap","collection":"scripting","hash":"ab7dc2ad0dd9b8643483a82dffbd9b20","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.getproject()\n\n```python\nra.relief.get_project() -> ReliefProjectInfo\n```\n\nThe document's saved relief project settings; Exists=False (all zeros) when the document has none. Read-only.\n\nra.relief.moveoperation()\n```python\nra.relief.move_operation(operation_id: IdLike, new_index: int)\n```\n\nMoves one operation to a new position in the stack (0 = first applied).\n\n| Parameter | Type | |\n|---|---|---|\n| `operation_id` | `IdLike` | required |\n| `new_index` | `int` | required |","metadata":{"title":"Relief","section":"ra.relief.getproject()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefgetproject","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefgetproject","collection":"scripting","hash":"faf82daa0f42c1ef6a7ec5d7b09fcef8","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.operations()\n\n```python\nra.relief.operations() -> List[ReliefOperationInfo]\n```\n\nThe saved project's operation stack in apply order; empty list when the document has no project. Read-only.\n\nra.relief.profilenames()\n```python\nra.relief.profile_names() -> List[str]\n```\n\nNames accepted by the \"profile\" parameter of profile operations: the four built-in presets (Round, Smooth, Chamfer, Plateau) followed by the user's saved custom profiles. Read-only.","metadata":{"title":"Relief","section":"ra.relief.operations()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefoperations","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefoperations","collection":"scripting","hash":"11f49ceaa49a554ecaca2128641b0c17","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.removeoperation()\n\n```python\nra.relief.remove_operation(operation_id: IdLike)\n```\n\nRemoves one operation from the saved project.\n\n| Parameter | Type | |\n|---|---|---|\n| `operation_id` | `IdLike` | required |\n\nra.relief.setoperationcombine()\n```python\nra.relief.set_operation_combine(operation_id: IdLike, combine: str)\n```\n\nChanges how one operation merges into the stack (Add, Subtract, ZMax, ZMin, Absolute, Multiply). Order matters: combine modes apply over whatever the operations below already built.\n\n| Parameter | Type | |\n|---|---|---|\n| `operation_id` | `IdLike` | required |\n| `combine` | `str` | required |","metadata":{"title":"Relief","section":"ra.relief.removeoperation()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefremoveoperation","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefremoveoperation","collection":"scripting","hash":"a4dfd5fb2a4a0373d6cc869b02fae1d7","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.setoperationenabled()\n\n```python\nra.relief.set_operation_enabled(operation_id: IdLike, enabled: bool)\n```\n\nEnables or disables one operation of the saved project (the panel's eye toggle); disabled operations are skipped by Bake.\n\n| Parameter | Type | |\n|---|---|---|\n| `operation_id` | `IdLike` | required |\n| `enabled` | `bool` | required |","metadata":{"title":"Relief","section":"ra.relief.setoperationenabled()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefsetoperationenabled","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefsetoperationenabled","collection":"scripting","hash":"cfa03f90d09eb43a9331a74327e8a5ea","indexed_by":"docs-index"}},{"content":"Relief — ra.relief.setupproject()\n\n```python\nra.relief.setup_project(world_width=None, world_height=None, resolution=None, workbench=None, solid=None, cap_distance=None, delete_base=None)\n```\n\nCreates the document's relief project — or reconfigures its settings, keeping the existing operation stack. Same defaults as the panel: world_width/Height workbench size in model units (0 = 50). resolution grid nodes along the larger side, 64-4096 (0 = 512). workbench plane the relief sits on (None = world XY). solid True (default) = closed solid; False = open mesh. cap_distance solid thickness below the plane (None = the default 1.0). delete_base True trims cells no operation touched.\n\n| Parameter | Type | |\n|---|---|---|\n| `world_width` | `float` | optional — None = the tool default |\n| `world_height` | `float` | optional — None = the tool default |\n| `resolution` | `int` | optional — None = the tool default |\n| `workbench` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `solid` | `bool` | optional — None = the tool default |\n| `cap_distance` | `float` | optional — None = the tool default |\n| `delete_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Relief","section":"ra.relief.setupproject()","url":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefsetupproject","source":"https://www.rhinoartisan.com/docs/scripting/python/relief/#rareliefsetupproject","collection":"scripting","hash":"9b05038002a87ac1ca6c221031e6ae80","indexed_by":"docs-index"}},{"content":"Render Studio\n\nRender Studio: environments, materials, stills and turntables.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RenderStudioApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `apply_environment()` | Applies a scene environment by name (see ListEnvironments()) as both the lighting and the reflection/refraction environment -- what clicking an Environment tile does. |\n| `apply_material()` | Applies a studio material (see ListMaterials()) the way the panel does: non-Grounds families skin the given objects (and every member of their groups); the Grounds family targets the ground plane instead and ignores `object_ids`. |\n| `list_environments()` | Scene environment names available to ApplyEnvironment (the tiles in the panel's Environment tab), sorted alphabetically. |\n| `list_material_families()` | Material family names (the panel's Metals / Gems / Grounds / Misc tabs; one folder per family, so custom families show up too). |\n| `list_materials()` | Material names inside one family, sorted -- the tiles the panel shows for that tab. |\n| `render_still()` | Renders a still through the studio pipeline (_Render on the current renderer -- Cycles unless the user changed it -- then _-SaveRenderWindowAs) and returns the full path written (\".png\" appended when the path has no extension). |\n| `render_turntable()` | Renders a turntable MP4 the way the panel's Turntable mode does: the camera orbits the current target on a horizontal circle through the current camera position (starting there), one frame is rendered per step, and the bundled ffmpeg assembles the video. |","metadata":{"title":"Render Studio","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/","collection":"scripting","hash":"b185f6276727911e4746d7c2629c21f3","indexed_by":"docs-index"}},{"content":"Render Studio — ra.renderstudio.applyenvironment()\n\n```python\nra.render_studio.apply_environment(name=None)\n```\n\nApplies a scene environment by name (see ListEnvironments()) as both the lighting and the reflection/refraction environment -- what clicking an Environment tile does. `name` None/empty = the studio's default setup (2Shapes environment + diamond refraction environment + white ground plane), same as the panel applies before any render.\n\n| Parameter | Type | |\n|---|---|---|\n| `name` | `str` | optional — None = the tool default |","metadata":{"title":"Render Studio","section":"ra.renderstudio.applyenvironment()","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudioapplyenvironment","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudioapplyenvironment","collection":"scripting","hash":"fe27632907845e8788b54bc3834fe6b4","indexed_by":"docs-index"}},{"content":"Render Studio — ra.renderstudio.applymaterial()\n\n```python\nra.render_studio.apply_material(family: str, name: str, object_ids=None)\n```\n\nApplies a studio material (see ListMaterials()) the way the panel does: non-Grounds families skin the given objects (and every member of their groups); the Grounds family targets the ground plane instead and ignores `object_ids`. `object_ids` None/empty = current selection. The material is loaded once per document and reused on later calls (matched by its FAMILY-NAME tag). Ensures the default studio lighting is in place first, exactly like a panel click.\n\n| Parameter | Type | |\n|---|---|---|\n| `family` | `str` | required |\n| `name` | `str` | required |\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Render Studio","section":"ra.renderstudio.applymaterial()","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudioapplymaterial","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudioapplymaterial","collection":"scripting","hash":"6dc3c7d2a4e9a6735964312c62c5e594","indexed_by":"docs-index"}},{"content":"Render Studio — ra.renderstudio.listenvironments()\n\n```python\nra.render_studio.list_environments() -> List[str]\n```\n\nScene environment names available to ApplyEnvironment (the tiles in the panel's Environment tab), sorted alphabetically.\n\nra.renderstudio.listmaterialfamilies()\n```python\nra.render_studio.list_material_families() -> List[str]\n```\n\nMaterial family names (the panel's Metals / Gems / Grounds / Misc tabs; one folder per family, so custom families show up too).","metadata":{"title":"Render Studio","section":"ra.renderstudio.listenvironments()","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiolistenvironments","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiolistenvironments","collection":"scripting","hash":"bdf3f93b1cab4ae29226a084e181d372","indexed_by":"docs-index"}},{"content":"Render Studio — ra.renderstudio.listmaterials()\n\n```python\nra.render_studio.list_materials(family: str) -> List[str]\n```\n\nMaterial names inside one family, sorted -- the tiles the panel shows for that tab. Throws listing the valid families when the family doesn't exist.\n\n| Parameter | Type | |\n|---|---|---|\n| `family` | `str` | required |\n\nra.renderstudio.renderstill()\n```python\nra.render_studio.render_still(path: str, width=None, height=None, samples=None) -> str\n```\n\nRenders a still through the studio pipeline (_Render on the current renderer -- Cycles unless the user changed it -- then _-SaveRenderWindowAs) and returns the full path written (\".png\" appended when the path has no extension). `width`/`height` 0 = 800x600 (the panel default), pixels. `samples` 0 = 500 Cycles passes (the studio's document default). The render window stays open afterwards, as it does for the panel's Render button. Blocks until the render finishes; throws when it is cancelled.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |\n| `samples` | `int` | optional — None = the tool default |","metadata":{"title":"Render Studio","section":"ra.renderstudio.listmaterials()","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiolistmaterials","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiolistmaterials","collection":"scripting","hash":"f8dd535f60aa656c4d5b276d43bacd14","indexed_by":"docs-index"}},{"content":"Render Studio — ra.renderstudio.renderturntable()\n\n```python\nra.render_studio.render_turntable(path: str, seconds=None, frames_per_second=None, width=None, height=None, samples=None, raytraced=None) -> str\n```\n\nRenders a turntable MP4 the way the panel's Turntable mode does: the camera orbits the current target on a horizontal circle through the current camera position (starting there), one frame is rendered per step, and the bundled ffmpeg assembles the video. Returns the full path written (\".mp4\" appended when missing). Frames are left in a FRAMES_ folder next to the video, as the panel leaves them. `seconds` 0 = 5; `frames_per_second` 0 = 12 (panel defaults; total frames = seconds * fps + 1). `width`/`height` 0 = 800x600, pixels. `samples` 0 = 500 passes. `raytraced` True (the panel's Cycles mode) renders every frame with _Render; False captures the viewport in its current display mode instead -- much faster, lower quality. Blocks until the video is written; expect minutes in raytraced mode.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `seconds` | `int` | optional — None = the tool default |\n| `frames_per_second` | `int` | optional — None = the tool default |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |\n| `samples` | `int` | optional — None = the tool default |\n| `raytraced` | `bool` | optional — None = the tool default |","metadata":{"title":"Render Studio","section":"ra.renderstudio.renderturntable()","url":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiorenderturntable","source":"https://www.rhinoartisan.com/docs/scripting/python/render-studio/#rarenderstudiorenderturntable","collection":"scripting","hash":"dd1b1cd3722500aed7da879e713c1dda","indexed_by":"docs-index"}},{"content":"Render\n\nRender materials, staging and batch rendering.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RenderApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `apply_design_materials()` | Applies the DESIGN (viewport) materials to every visible object in the active document -- the ArtisanApplyDesignMaterials command, headless. |\n| `apply_render_materials()` | Applies the photorealistic RENDER materials to every visible object in the active document -- the ArtisanApplyRenderMaterials command, headless. |\n| `batch_render()` | Renders every .3dm file in `folder` (optionally recursing into sub-folders) with the current render engine -- the ArtisanBatchRendering command, headless: no options dialog, no folder picker, no progress window (per-file failures come back in the result instead). |\n| `create_pair()` | Duplicates the objects as the second piece of a pair -- the ArtisanPair command, headless. |\n| `lie_on_ground()` | Rotates the objects around the X (or Y) axis so they lie as FLAT on the ground plane as possible -- the ArtisanLyingOnTheGround command, used to stage pieces for renders. |","metadata":{"title":"Render","url":"https://www.rhinoartisan.com/docs/scripting/python/render/","source":"https://www.rhinoartisan.com/docs/scripting/python/render/","collection":"scripting","hash":"9fca191603e0111512758a2f29f7d428","indexed_by":"docs-index"}},{"content":"Render — ra.render.applydesignmaterials()\n\n```python\nra.render.apply_design_materials() -> int\n```\n\nApplies the DESIGN (viewport) materials to every visible object in the active document -- the ArtisanApplyDesignMaterials command, headless. Global, like the command: no selection is taken. Gems, diamonds, pearls and cabochons get their gem material from the document material table; breps, extrusions, meshes and SubDs get the document's Metal 1 material (the command deliberately ignores the Metal 02/03 layers on this side of the switch). Returns the number of objects visited.","metadata":{"title":"Render","section":"ra.render.applydesignmaterials()","url":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderapplydesignmaterials","source":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderapplydesignmaterials","collection":"scripting","hash":"87075a236cc144627c47c9ac45c70bf0","indexed_by":"docs-index"}},{"content":"Render — ra.render.applyrendermaterials()\n\n```python\nra.render.apply_render_materials() -> int\n```\n\nApplies the photorealistic RENDER materials to every visible object in the active document -- the ArtisanApplyRenderMaterials command, headless. Global, like the command: no selection is taken. Gems and diamonds get their gem RenderMaterial from the render catalog; pearls and cabochons the pearl material; breps, extrusions, meshes and SubDs the render metal of their LAYER (\"Metal 01\"/\"Metal 02\"/ \"Metal 03\" map to the document's metal positions, anything else falls back to Metal 1). Same side effects as the command: raises the document render sampling to 25 samples and, on Rhino 8+, installs the default 2Shapes environment when none (or the stock \"Studio\" one) is active. Returns the number of objects visited.","metadata":{"title":"Render","section":"ra.render.applyrendermaterials()","url":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderapplyrendermaterials","source":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderapplyrendermaterials","collection":"scripting","hash":"411778a7f795a623ec91e7a41d7b0b9f","indexed_by":"docs-index"}},{"content":"Render — ra.render.batchrender()\n\n```python\nra.render.batch_render(folder: str, include_subfolders=None, extension=None, custom_resolution=None, width=None, height=None) -> BatchRenderResult\n```\n\nRenders every .3dm file in `folder` (optionally recursing into sub-folders) with the current render engine -- the ArtisanBatchRendering command, headless: no options dialog, no folder picker, no progress window (per-file failures come back in the result instead). Each image is saved NEXT TO its .3dm with the same base name and the given extension (\".jpg\" or \".png\", the dialog's two formats; jpg is the dialog default). When `custom_resolution` is True every file renders at `width` x `height` pixels (dialog defaults 1920 x 1080, valid 16..20000); when False each file renders at its own saved render settings. WARNING -- the ACTIVE DOCUMENT CHANGES during the run: each file is opened with _-Open, replacing whatever is open, and (same as the command) the ORIGINAL DOCUMENT IS NOT RESTORED -- the last rendered file stays active when this returns. Before each open the current document's modified flag is cleared so Rhino never prompts to save, which means unsaved changes in the open document are silently discarded. Save your work before calling this.\n\n| Parameter | Type | |\n|---|---|---|\n| `folder` | `str` | required |\n| `include_subfolders` | `bool` | optional — None = the tool default |\n| `extension` | `str` | optional — None = the tool default |\n| `custom_resolution` | `bool` | optional — None = the tool default |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |","metadata":{"title":"Render","section":"ra.render.batchrender()","url":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderbatchrender","source":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderbatchrender","collection":"scripting","hash":"607decc19ceef5ee9d521ed2f059406d","indexed_by":"docs-index"}},{"content":"Render — ra.render.createpair()\n\n```python\nra.render.create_pair(object_ids=None, distance=None, angle=None, mirror=None) -> List[str]\n```\n\nDuplicates the objects as the second piece of a pair -- the ArtisanPair command, headless. The copy is rotated `angle` degrees around the Z axis at the selection's bounding-box center, moved `distance` mm along X, and optionally mirrored (for asymmetric designs like earrings). Defaults match the command (20 mm, -20 degrees, no mirror). `object_ids` None/empty = current selection. Returns the ids of the copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `mirror` | `bool` | optional — None = the tool default |","metadata":{"title":"Render","section":"ra.render.createpair()","url":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarendercreatepair","source":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarendercreatepair","collection":"scripting","hash":"06e6cd1628699f648b4c44ead94e09e7","indexed_by":"docs-index"}},{"content":"Render — ra.render.lieonground()\n\n```python\nra.render.lie_on_ground(object_ids=None, around_x=None, keep_original=None)\n```\n\nRotates the objects around the X (or Y) axis so they lie as FLAT on the ground plane as possible -- the ArtisanLyingOnTheGround command, used to stage pieces for renders. Scans rotations in 0.5-degree steps minimizing the total Z height, then picks the face-down orientation of the two candidates. `keep_original` True leaves the original in place and flattens a copy (the command's DeleteOriginal toggle, inverted). `object_ids` None/empty = current selection.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `around_x` | `bool` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Render","section":"ra.render.lieonground()","url":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderlieonground","source":"https://www.rhinoartisan.com/docs/scripting/python/render/#rarenderlieonground","collection":"scripting","hash":"b8aadfe902d89430adbd6a544c2a21cf","indexed_by":"docs-index"}},{"content":"Results\n\nPlain read-only records. Every one has `to_dict()`, prints as `Name(field=value, ...)` and iterates as `(field, value)` pairs.\n\nAdvancedGemsOnCurveResult\nWhat ra.advanced_gems_on_curve.create hands back: the parametric group id (the Unique of its RaObjectUserData, what ArtisanEdit uses) and the gems.\n\n| Field | Type | |\n|---|---|---|\n| `carats` | `float` | |\n| `count` | `int` | |\n| `gem_ids` | `List[str]` | |\n| `unique` | `str` | |","metadata":{"title":"Results","url":"https://www.rhinoartisan.com/docs/scripting/python/results/","source":"https://www.rhinoartisan.com/docs/scripting/python/results/","collection":"scripting","hash":"4d76b72867a5cda20f4823b6832b69f5","indexed_by":"docs-index"}},{"content":"Results — AiImageResult\n\nAn image generated with fal.ai.\n\n| Field | Type | |\n|---|---|---|\n| `mode` | `str` | Generative AI Studio mode the prompt was tuned for |\n| `model` | `str` | fal.ai model used (Options > Assistant: Image / Text-to-image model) |\n| `path` | `str` | The image file written |\n| `source` | `str` | What the image was made from: \"viewport\", \"prompt\" or the source file |","metadata":{"title":"Results","section":"AiImageResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#aiimageresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#aiimageresult","collection":"scripting","hash":"f6dc573c829c1cd52b61e330090b83b6","indexed_by":"docs-index"}},{"content":"Results — AllInOneExport\n\n| Field | Type | |\n|---|---|---|\n| `all_printable` | `bool` | False = some objects had errors |\n| `faces` | `int` | triangles in the STL |\n| `non_printable_ids` | `List[str]` | |\n| `object_count` | `int` | objects merged |\n| `path` | `str` | STL written |\n\nAssetInfo\n| Field | Type | |\n|---|---|---|\n| `id` | `int` | |\n| `is_default` | `bool` | True for the asset the Create methods use when no profile is given. |\n| `name` | `str` | |\n| `point_count` | `int` | Control points of the half profile (a rough complexity hint). |\n| `semantic` | `str` | |\n| `type` | `str` | TypeOfAssetBackend name |","metadata":{"title":"Results","section":"AllInOneExport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#allinoneexport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#allinoneexport","collection":"scripting","hash":"ea81d946d62b809aaaf89df75576c7ea","indexed_by":"docs-index"}},{"content":"Results — AzureResult\n\nWhat ra.azure.create baked: the carved solid (boolean on) or the loose cutters (boolean off), plus the thinnest metal wall left between two neighbouring holes (-1 when there is a single hole).\n\n| Field | Type | |\n|---|---|---|\n| `cutter_ids` | `List[str]` | cutter ids (empty when boolean is on) |\n| `holes` | `int` | azure holes generated (one per gem that projected onto the solid) |\n| `min_wall_distance` | `float` | mm between the two closest holes; -1 with fewer than two holes |\n| `result_id` | `str` | carved solid id (None when boolean is off) |","metadata":{"title":"Results","section":"AzureResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#azureresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#azureresult","collection":"scripting","hash":"a0fd67b394c3863e50263067c729ca04","indexed_by":"docs-index"}},{"content":"Results — BalanceReport\n\n| Field | Type | |\n|---|---|---|\n| `applied` | `bool` | True = the corrected copies were added |\n| `base_point` | `Point3d` | center of the base object's bounding box (the hook) |\n| `centroid` | `Point3d` | volume centroid of the hanging geometry |\n| `is_balanced` | `bool` | TiltDegrees below `tolerance` |\n| `new_ids` | `List[str]` | the rotated copies when applied |\n| `tilt_degrees` | `float` | angle between the hang line and straight down; 0 = balanced |","metadata":{"title":"Results","section":"BalanceReport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#balancereport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#balancereport","collection":"scripting","hash":"4f064376ca70362ff6bdcd1fe7e5f689","indexed_by":"docs-index"}},{"content":"Results — BatchRenderResult\n\n| Field | Type | |\n|---|---|---|\n| `failed` | `List[str]` | file NAMES whose image was not produced |\n| `output_files` | `List[str]` | full paths of the images written |\n| `processed` | `int` | .3dm files opened and attempted |\n\nBoutiqueCatalogDesign\nA design of an installed Boutique collection.\n\n| Field | Type | |\n|---|---|---|\n| `available` | `bool` | Whether the design's file is on this computer (Insert needs it) |\n| `collection` | `str` | Collection name, e.g. \"Solitaires\" |\n| `collection_folder` | `str` | Collection folder name (stable; use it to disambiguate) |\n| `currency` | `str` | Currency of the prices |\n| `description` | `str` | Design description |\n| `id` | `str` | Design id within its collection |\n| `name` | `str` | Design name |\n| `preview` | `str` | Preview image file (empty when there is none) |\n| `regular_price` | `str` | Retail price as the collection lists it (text, may be empty) |\n| `sale_price` | `str` | Sale price as the collection lists it (text, may be empty) |\n| `sku` | `str` | Design SKU |","metadata":{"title":"Results","section":"BatchRenderResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#batchrenderresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#batchrenderresult","collection":"scripting","hash":"2936031eeae2364f957af535db643a8a","indexed_by":"docs-index"}},{"content":"Results — BoutiqueKit\n\nA kit of the online Boutique catalog.\n\n| Field | Type | |\n|---|---|---|\n| `date` | `str` | Publication date |\n| `folder` | `str` | Folder it installs into |\n| `installed` | `bool` | Whether its folder is on this computer |\n| `name` | `str` | Kit name |\n| `type` | `str` | \"collections\" or \"components\" |\n| `up_to_date` | `bool` | Installed and not updated in the catalog since |","metadata":{"title":"Results","section":"BoutiqueKit","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#boutiquekit","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#boutiquekit","collection":"scripting","hash":"f5b05da907adf696e47fe3b900c9bf61","indexed_by":"docs-index"}},{"content":"Results — CutByRingSizeResult\n\n| Field | Type | |\n|---|---|---|\n| `cut_count` | `int` | objects cut |\n| `diameter` | `float` | cylinder diameter used, mm |\n| `failed_count` | `int` | objects the boolean could not cut |\n| `failed_ids` | `List[str]` | untouched originals |\n| `object_ids` | `List[str]` | the new (cut) objects |\n\nDecimateResult\n| Field | Type | |\n|---|---|---|\n| `faces_after` | `int` | |\n| `faces_before` | `int` | |\n| `meshes_decimated` | `int` | |","metadata":{"title":"Results","section":"CutByRingSizeResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#cutbyringsizeresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#cutbyringsizeresult","collection":"scripting","hash":"dca1e6f3c7571bfb9cb46eac24f58b3b","indexed_by":"docs-index"}},{"content":"Results — DecimateToleranceResult\n\n| Field | Type | |\n|---|---|---|\n| `max_deviation_mm` | `float` | Largest deviation across every decimated mesh, in mm. |\n| `meshes_decimated` | `int` | |\n| `meshes_unchanged` | `int` | |\n| `triangles_after` | `int` | |\n| `triangles_before` | `int` | In TRIANGLES: the reducer triangulates quads, so a quad mesh's Faces.Count is not comparable with the result's. |","metadata":{"title":"Results","section":"DecimateToleranceResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#decimatetoleranceresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#decimatetoleranceresult","collection":"scripting","hash":"ab3d683b89fca43afaeb1747f86661b3","indexed_by":"docs-index"}},{"content":"Results — DimensionValueReport\n\nResult of ra.drafting.reduce_dimensions().\n\n| Field | Type | |\n|---|---|---|\n| `changed` | `int` | |\n| `percentage` | `float` | |\n| `skipped` | `int` | |\n\nDismantledBoolean\nOne dismantled boolean, as listed by ListDismantled.\n\n| Field | Type | |\n|---|---|---|\n| `cutter_ids` | `List[str]` | |\n| `id` | `str` | |\n| `missing_ids` | `List[str]` | |\n| `operation` | `str` | |\n| `target_ids` | `List[str]` | |","metadata":{"title":"Results","section":"DimensionValueReport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#dimensionvaluereport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#dimensionvaluereport","collection":"scripting","hash":"80f90b8099f44b302e35dc33ae0edeaf","indexed_by":"docs-index"}},{"content":"Results — ElementInfo\n\nOne saved element in the user's library.\n\n| Field | Type | |\n|---|---|---|\n| `favorite` | `bool` | |\n| `id` | `str` | |\n| `name` | `str` | |\n| `type` | `str` | |\n\nElementsExport\n| Field | Type | |\n|---|---|---|\n| `count` | `int` | elements in the file |\n| `path` | `str` | JSON written |\n| `type` | `str` | library type exported (store name, e.g. \"BEZEL\") |","metadata":{"title":"Results","section":"ElementInfo","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#elementinfo","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#elementinfo","collection":"scripting","hash":"02f105c0945ca24cc65c4dad8328d9f8","indexed_by":"docs-index"}},{"content":"Results — ElementsImport\n\n| Field | Type | |\n|---|---|---|\n| `duplicates` | `int` | elements that already existed (skipped) |\n| `imported` | `int` | new elements added to the library |\n| `names` | `List[str]` | names of the imported elements |\n| `path` | `str` | |\n\nGemsOn2CurvesResult\nWhat ra.gems_on_two_curves.create hands back: the parametric group id (the Unique of its RaObjectUserData, what ArtisanEdit uses), the gem ids and the prong ids (empty unless `prongs` was requested).\n\n| Field | Type | |\n|---|---|---|\n| `carats` | `float` | |\n| `count` | `int` | |\n| `gem_ids` | `List[str]` | |\n| `prong_ids` | `List[str]` | |\n| `unique` | `str` | |","metadata":{"title":"Results","section":"ElementsImport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#elementsimport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#elementsimport","collection":"scripting","hash":"b8b1ebda323e45744c805f0731a2bd5f","indexed_by":"docs-index"}},{"content":"Results — GlbBatchItem\n\nOne file of a GLB batch.\n\n| Field | Type | |\n|---|---|---|\n| `error` | `str` | Why it failed (empty otherwise) |\n| `glb` | `str` | The .glb next to it |\n| `source` | `str` | The .3dm read |\n| `status` | `str` | \"exported\", \"skipped\" (the GLB was already there) or \"failed\" |\n\nGlobalThicknessResult\n| Field | Type | |\n|---|---|---|\n| `average_mm` | `float` | mean over measurable samples |\n| `max_mm` | `float` | thickest measured wall |\n| `mesh_id` | `str` | colorized mesh when colorize=True, else None |\n| `min_mm` | `float` | thinnest measured wall |\n| `sample_count` | `int` | vertices with a valid measurement |\n| `thin_percentage` | `float` | % of measurable samples below the threshold -- the figure the command prints on the command line |\n| `thin_spots` | `List[ThinSpot]` | |\n| `unmeasurable_count` | `int` | vertices where no wall was found |","metadata":{"title":"Results","section":"GlbBatchItem","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#glbbatchitem","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#glbbatchitem","collection":"scripting","hash":"a9d9bc7f120a397041979fe423fd5ca6","indexed_by":"docs-index"}},{"content":"Results — LayerExport\n\n| Field | Type | |\n|---|---|---|\n| `faces` | `int` | triangles written |\n| `layer` | `str` | layer name (= file name) |\n| `path` | `str` | STL written, or the existing file when skipped |\n| `skipped` | `bool` | True = file existed and overwrite was False |\n\nLayerImport\n| Field | Type | |\n|---|---|---|\n| `file_path` | `str` | STL imported |\n| `ids` | `List[str]` | |\n| `layer` | `str` | layer it went to (file name without extension) |\n| `object_count` | `int` | objects the file brought in |","metadata":{"title":"Results","section":"LayerExport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#layerexport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#layerexport","collection":"scripting","hash":"8cc107cf99b5430a7a04365bb887f9ff","indexed_by":"docs-index"}},{"content":"Results — MeshCheckResult\n\n| Field | Type | |\n|---|---|---|\n| `id` | `str` | |\n| `is_closed` | `bool` | |\n| `is_manifold` | `bool` | |\n| `is_valid` | `bool` | |\n| `printable` | `bool` | valid, closed AND manifold/oriented -- the same green/red verdict the tool paints (QuickCheckCommand.IsPrintable) |\n\nMetalWeightResult\nOne metal position of the document (or an ad-hoc object set).\n\n| Field | Type | |\n|---|---|---|\n| `grams` | `float` | cast weight |\n| `layer` | `str` | e.g. \"Metal 01\" (or \"Metal 01+02+03\" when the doc uses one metal) |\n| `metal` | `str` | Metal enum name, e.g. \"GOLD_YELLOW_18\" |\n| `processed_grams` | `float` | after the configured finishing loss % |\n| `volume` | `float` | model units^3 (mm3 in a mm document) |\n| `wax_grams` | `float` | wax model weight at the configured wax density |","metadata":{"title":"Results","section":"MeshCheckResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#meshcheckresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#meshcheckresult","collection":"scripting","hash":"fe6d4ce7145eeec87a2fa154dda2a384","indexed_by":"docs-index"}},{"content":"Results — NonPrintableReport\n\n| Field | Type | |\n|---|---|---|\n| `bad_objects` | `List[str]` | Rhino's SelBadObjects |\n| `count` | `int` | objects flagged (now selected) |\n| `duplicates` | `List[str]` | SelDup |\n| `open_polysurfaces` | `List[str]` | SelOpenPolysrf |\n| `open_surfaces` | `List[str]` | SelOpenSrf |\n\nPaveResult\nEverything one pavé run created, split by kind.\n\n| Field | Type | |\n|---|---|---|\n| `all` | `List[str]` | Gems + prongs + cutters, for \"select everything I just built\". |\n| `cutters` | `List[str]` | |\n| `gems` | `List[str]` | |\n| `prongs` | `List[str]` | |","metadata":{"title":"Results","section":"NonPrintableReport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#nonprintablereport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#nonprintablereport","collection":"scripting","hash":"bef83ca21a93590d6a4dbbc7826824bc","indexed_by":"docs-index"}},{"content":"Results — PriceBreakdownDetails\n\nResult of ra.pricing.calculate_detailed(): the panel's line-level detail. All costs in the manufacturer's currency; weights in grams; sizes in mm.\n\n| Field | Type | |\n|---|---|---|\n| `additional_processes` | `List[PriceNamedCost]` | |\n| `currency` | `str` | |\n| `diamonds` | `List[PriceDiamondLine]` | |\n| `diamonds_carats` | `float` | |\n| `diamonds_count` | `int` | |\n| `diamonds_total` | `float` | |\n| `extras` | `List[PriceNamedCost]` | |\n| `extras_total` | `float` | |\n| `gems` | `List[PriceGemLine]` | |\n| `gems_carats` | `float` | |\n| `gems_count` | `int` | |\n| `gems_total` | `float` | |\n| `metal_processes` | `List[PriceMetalProcessLine]` | |\n| `metal_total` | `float` | |\n| `metals` | `List[PriceMetalLine]` | |\n| `processes_additional_cost` | `float` | |\n| `processes_metal_cost` | `float` | |\n| `processes_setting_cost` | `float` | |\n| `processes_total` | `float` | |\n| `setting_processes` | `List[PriceSettingProcessLine]` | |\n| `total` | `float` | |\n| `total_formatted` | `str` | |","metadata":{"title":"Results","section":"PriceBreakdownDetails","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricebreakdowndetails","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricebreakdowndetails","collection":"scripting","hash":"b90d0dc852a620812b648591d1b80dfd","indexed_by":"docs-index"}},{"content":"Results — PriceDiamondLine\n\n| Field | Type | |\n|---|---|---|\n| `carats` | `float` | |\n| `certificate_id` | `str` | |\n| `dealer` | `str` | |\n| `lab_grown` | `bool` | |\n| `price` | `float` | |\n| `quoted` | `bool` | False = no live Nivoda quote (offline, quote_certified = False, or no match): the stone counts in the carat totals but prices as 0. |\n| `shape` | `str` | |","metadata":{"title":"Results","section":"PriceDiamondLine","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricediamondline","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricediamondline","collection":"scripting","hash":"42f0b31e7aba8573c115e3acc8528aa9","indexed_by":"docs-index"}},{"content":"Results — PriceGemLine\n\n| Field | Type | |\n|---|---|---|\n| `carats` | `float` | |\n| `cost` | `float` | |\n| `count` | `int` | |\n| `price_per_carat` | `float` | |\n| `setting_type` | `str` | |\n| `shape` | `str` | |\n| `sieve` | `str` | |\n| `size_mm` | `float` | |\n\nPriceMetalLine\n| Field | Type | |\n|---|---|---|\n| `cost` | `float` | |\n| `metal` | `str` | |\n| `price_per_gram` | `float` | |\n| `total_weight_grams` | `float` | |\n| `waste` | `float` | |\n| `weight_grams` | `float` | |","metadata":{"title":"Results","section":"PriceGemLine","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricegemline","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricegemline","collection":"scripting","hash":"a7a3eae3a74361fb43787dc23f33cec4","indexed_by":"docs-index"}},{"content":"Results — PriceMetalProcessLine\n\n| Field | Type | |\n|---|---|---|\n| `cast_finish_polish_cost` | `float` | |\n| `finishing_cost` | `float` | |\n| `metal` | `str` | |\n| `printing_cost` | `float` | |\n| `printing_size` | `str` | |\n| `rhodium_cost` | `float` | |\n\nPriceNamedCost\n| Field | Type | |\n|---|---|---|\n| `cost` | `float` | |\n| `name` | `str` | |","metadata":{"title":"Results","section":"PriceMetalProcessLine","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricemetalprocessline","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricemetalprocessline","collection":"scripting","hash":"411ab94468d52b4b588fb1d60a73fd61","indexed_by":"docs-index"}},{"content":"Results — PriceResult\n\nResult of ra.pricing.calculate(): the grand total plus the per-category breakdown, in the active manufacturer's currency. TotalFormatted is the total already rendered with the currency symbol (e.g. \"1,234.00 €\").\n\n| Field | Type | |\n|---|---|---|\n| `currency` | `str` | |\n| `diamonds` | `float` | |\n| `extras` | `float` | |\n| `gems` | `float` | |\n| `metal` | `float` | |\n| `processes` | `float` | |\n| `total` | `float` | |\n| `total_formatted` | `str` | |","metadata":{"title":"Results","section":"PriceResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#priceresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#priceresult","collection":"scripting","hash":"11aac5900b982af6d4481971c05384eb","indexed_by":"docs-index"}},{"content":"Results — PriceSettingProcessLine\n\n| Field | Type | |\n|---|---|---|\n| `cost` | `float` | |\n| `count` | `int` | |\n| `setting_type` | `str` | |\n\nReduceThicknessResult\n| Field | Type | |\n|---|---|---|\n| `final_grams` | `float` | weight after |\n| `grams_saved` | `float` | |\n| `masked_near_gems` | `int` | vertices protected around gems |\n| `mesh_id` | `str` | the hollowed mesh (replaces the original) |\n| `original_grams` | `float` | weight before, first document metal (0 = open mesh) |\n| `thin_vertices` | `int` | vertices that ended below the target thickness |","metadata":{"title":"Results","section":"PriceSettingProcessLine","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricesettingprocessline","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#pricesettingprocessline","collection":"scripting","hash":"a0a3013125c6971722955f882b52ac61","indexed_by":"docs-index"}},{"content":"Results — ReliefOperationInfo\n\n| Field | Type | |\n|---|---|---|\n| `combine_mode` | `str` | |\n| `enabled` | `bool` | |\n| `id` | `str` | |\n| `index` | `int` | Position in the stack, 0 = first applied. |\n| `missing_references` | `bool` | True when a referenced curve/object no longer resolves or a referenced image/texture file is missing; the operation is skipped. |\n| `name` | `str` | |\n| `type` | `str` | \"profile\", \"extrude\", \"image\", \"texture\", \"geometry\", \"carbon\", \"sculpt\" or \"smooth\". |","metadata":{"title":"Results","section":"ReliefOperationInfo","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#reliefoperationinfo","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#reliefoperationinfo","collection":"scripting","hash":"be558cac7abfdd7bfe28a52a3ccc166f","indexed_by":"docs-index"}},{"content":"Results — ReliefProjectInfo\n\n| Field | Type | |\n|---|---|---|\n| `cap_distance` | `float` | |\n| `delete_base` | `bool` | |\n| `exists` | `bool` | False when the document has no saved relief project. |\n| `operation_count` | `int` | |\n| `output_type` | `str` | \"Mesh\" (open relief) or \"Thickness\" (closed solid). |\n| `resolution` | `int` | |\n| `world_height` | `float` | |\n| `world_width` | `float` | |","metadata":{"title":"Results","section":"ReliefProjectInfo","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#reliefprojectinfo","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#reliefprojectinfo","collection":"scripting","hash":"53e2191342da7c3aea5c584ba50a0075","indexed_by":"docs-index"}},{"content":"Results — RepairResult\n\n| Field | Type | |\n|---|---|---|\n| `is_closed` | `bool` | True = watertight, printable |\n| `mesh_id` | `str` | the repaired watertight mesh added to the doc |\n| `naked_edges` | `int` | remaining open edges (0 is what you want) |\n| `shells` | `int` | number of separate shells in the result |\n\nResizedRing\n| Field | Type | |\n|---|---|---|\n| `diameter` | `float` | target inner diameter (mm) |\n| `name` | `str` | size label, also the child layer suffix |\n| `ring_id` | `str` | the resized ring mesh |","metadata":{"title":"Results","section":"RepairResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#repairresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#repairresult","collection":"scripting","hash":"869726d5d41472da5179fc2223c9f9c2","indexed_by":"docs-index"}},{"content":"Results — RingSizeEstimate\n\n| Field | Type | |\n|---|---|---|\n| `inner_diameter` | `float` | measured gap along X at Z=0, mm |\n| `inner_height` | `float` | measured gap along Z at X=0, mm (0 = open/unknown) |\n| `is_ring` | `bool` | enough ring-like features found |\n| `probability` | `float` | 0..100 score |\n| `region` | `str` | sizing region used for the lookup |\n| `ring_curve_id` | `str` | inserted ring curve (add_ring_curve), else Empty |\n| `size` | `str` | closest catalog size label |\n| `size_diameter` | `float` | catalog diameter of that size, mm |","metadata":{"title":"Results","section":"RingSizeEstimate","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#ringsizeestimate","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#ringsizeestimate","collection":"scripting","hash":"a410ecf0b886cc4864b360f423e0a96a","indexed_by":"docs-index"}},{"content":"Results — RingSizeInfo\n\n| Field | Type | |\n|---|---|---|\n| `diameter` | `float` | inner diameter, mm |\n| `region` | `str` | e.g. \"EU\", \"US\" |\n| `size` | `str` | e.g. \"54\", \"7\" |\n\nStandardizeResult\n| Field | Type | |\n|---|---|---|\n| `blocks_exploded` | `int` | block definitions the document had |\n| `materials_left` | `int` | materials Rhino refused to remove (0 normally) |\n| `materials_removed` | `int` | render materials purged |","metadata":{"title":"Results","section":"RingSizeInfo","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#ringsizeinfo","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#ringsizeinfo","collection":"scripting","hash":"975ce184754339ef72e5587e5eafcb2d","indexed_by":"docs-index"}},{"content":"Results — SweepResult\n\nWhat the rail sweeps bake: the oriented profile curves (plus the inner curves of the CLOSE / COMFORT / THICKNESS modes) and, when `sweep` is True, the swept breps.\n\n| Field | Type | |\n|---|---|---|\n| `brep_ids` | `List[str]` | |\n| `curve_ids` | `List[str]` | |\n\nTaxRegion\nOne entry of ra.pricing.tax_regions(): the code to pass as `region` and its display name.\n\n| Field | Type | |\n|---|---|---|\n| `code` | `str` | |\n| `name` | `str` | |","metadata":{"title":"Results","section":"SweepResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#sweepresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#sweepresult","collection":"scripting","hash":"1fcc31987dfb30d61b95250b2bf901e0","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartGem\n\n| Field | Type | |\n|---|---|---|\n| `carats` | `float` | |\n| `count` | `int` | |\n| `setting_type` | `str` | |\n| `shape` | `str` | |\n| `sieve` | `str` | |\n| `size_mm` | `float` | |\n\nTechnicalChartMetal\n| Field | Type | |\n|---|---|---|\n| `area_mm2` | `float` | |\n| `metal` | `str` | |\n| `total_weight_grams` | `float` | |\n| `volume_mm3` | `float` | |\n| `waste_grams` | `float` | |\n| `wax_weight_grams` | `float` | |\n| `weight_grams` | `float` | |","metadata":{"title":"Results","section":"TechnicalChartGem","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartgem","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartgem","collection":"scripting","hash":"6022f316b415adccdf6033ec0f514f4d","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartMetalProcess\n\n| Field | Type | |\n|---|---|---|\n| `invalid_size` | `bool` | |\n| `metal` | `str` | |\n| `print_size_name` | `str` | |\n| `printing_size` | `str` | |\n\nTechnicalChartResult\nResult of ra.drafting.create_technical_chart(): the breakdown without prices. Weights in grams, sizes in mm, volume in mm3, area in mm2.\n\n| Field | Type | |\n|---|---|---|\n| `additional_processes` | `List[str]` | |\n| `created_at` | `str` | |\n| `extras` | `List[str]` | |\n| `gems` | `List[TechnicalChartGem]` | |\n| `metal_processes` | `List[TechnicalChartMetalProcess]` | |\n| `metals` | `List[TechnicalChartMetal]` | |\n| `path` | `str` | |\n| `setting_processes` | `List[TechnicalChartSettingProcess]` | |","metadata":{"title":"Results","section":"TechnicalChartMetalProcess","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartmetalprocess","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartmetalprocess","collection":"scripting","hash":"074d632cd06cdccc0e99fdf402d0b4b8","indexed_by":"docs-index"}},{"content":"Results — TechnicalChartSettingProcess\n\n| Field | Type | |\n|---|---|---|\n| `count` | `int` | |\n| `setting_type` | `str` | |\n\nThinSpot\n| Field | Type | |\n|---|---|---|\n| `point` | `Point3d` | vertex position on the analysis mesh |\n| `thickness_mm` | `float` | wall thickness measured there |\n\nTimeTrackingDay\nTime on every file on one day.\n\n| Field | Type | |\n|---|---|---|\n| `date` | `str` | \"yyyy-MM-dd\" (local day) |\n| `hours` | `float` | Same, in hours |\n| `seconds` | `int` | Seconds worked that day |","metadata":{"title":"Results","section":"TechnicalChartSettingProcess","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartsettingprocess","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#technicalchartsettingprocess","collection":"scripting","hash":"1199d3b57e625a92e69d9a82a9056e0b","indexed_by":"docs-index"}},{"content":"Results — TimeTrackingFile\n\nTime on one file within the report's period.\n\n| Field | Type | |\n|---|---|---|\n| `days` | `int` | Days with time on it |\n| `hours` | `float` | Same, in hours |\n| `last_date` | `str` | Last day with time on it, \"yyyy-MM-dd\" |\n| `name` | `str` | File name, e.g. \"Solitaire.3dm\" (the panel groups by it) |\n| `path` | `str` | Full path where it was last worked on |\n| `seconds` | `int` | Seconds worked in the period |","metadata":{"title":"Results","section":"TimeTrackingFile","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#timetrackingfile","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#timetrackingfile","collection":"scripting","hash":"1bfac679ace3bd2e817455cd6dc70e9d","indexed_by":"docs-index"}},{"content":"Results — TimeTrackingReport\n\nA time report over a period of days.\n\n| Field | Type | |\n|---|---|---|\n| `daily` | `List[TimeTrackingDay]` | Per day, oldest first |\n| `enabled` | `bool` | Whether the tracker is counting time now (Options) |\n| `files` | `List[TimeTrackingFile]` | Per file, most worked first |\n| `from_` | `str` | First day of the period, \"yyyy-MM-dd\" (empty for ALL) |\n| `idle_threshold_minutes` | `int` | Minutes without keyboard or mouse after which time stops counting |\n| `period` | `str` | ALL, TODAY, WEEK (since Monday) or MONTH |\n| `to` | `str` | Today, \"yyyy-MM-dd\" |\n| `total_hours` | `float` | Same, in hours |\n| `total_seconds` | `int` | Seconds on every file in the period |","metadata":{"title":"Results","section":"TimeTrackingReport","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#timetrackingreport","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#timetrackingreport","collection":"scripting","hash":"847f999028625f7fe9f251f4937c800b","indexed_by":"docs-index"}},{"content":"Results — TrilogyResult\n\nWhat a Trilogy setting call baked: the three stones it was built on (existing ids, never rebaked), the ring curve it was measured against (the Three Stones finger circle when the set came from ArtisanThreeStones) and the new metal / stone objects, all grouped under `GroupName` with `Unique` as the editable object's identity.\n\n| Field | Type | |\n|---|---|---|\n| `center_gem_id` | `str` | |\n| `group_name` | `str` | |\n| `metal_ids` | `List[str]` | |\n| `ring_curve_id` | `str` | |\n| `side_a_gem_id` | `str` | |\n| `side_b_gem_id` | `str` | |\n| `stone_ids` | `List[str]` | |\n| `style` | `str` | |\n| `unique` | `str` | |","metadata":{"title":"Results","section":"TrilogyResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#trilogyresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#trilogyresult","collection":"scripting","hash":"17b861d83faaa59f7740d7df5e0d262e","indexed_by":"docs-index"}},{"content":"Results — UpdateResult\n\nOutcome of UpdateAll / Update.\n\n| Field | Type | |\n|---|---|---|\n| `found` | `int` | |\n| `messages` | `List[str]` | |\n| `rebuilt` | `int` | |\n| `result_ids` | `List[str]` | |\n| `skipped` | `int` | |","metadata":{"title":"Results","section":"UpdateResult","url":"https://www.rhinoartisan.com/docs/scripting/python/results/#updateresult","source":"https://www.rhinoartisan.com/docs/scripting/python/results/#updateresult","collection":"scripting","hash":"06f72725987340d71c6304906511732f","indexed_by":"docs-index"}},{"content":"Ring Curve\n\nRing rail curves at the document finger size (closed, open, bypass, shaped).\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RingCurveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create_bypass()` | A bypass ring curve (crossed ends). |\n| `create_closed()` | A closed ring curve (full circle at the finger size). |\n| `create_open()` | An open ring curve (circle with a gap). |\n| `create_shape()` | `shape_type` is \"ROUND\" (uses `diameter`) or \"ELLIPSE\" (uses `width` x `height`). |","metadata":{"title":"Ring Curve","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/","collection":"scripting","hash":"e850391e46f94b9f9d977d80496b7abf","indexed_by":"docs-index"}},{"content":"Ring Curve — ra.ringcurve.createbypass()\n\n```python\nra.ring_curve.create_bypass(opening_length=None, angle=None, offset_x=None, offset_y=None, tangent=None, finger_diameter=None, plane=None, profile=None, element=None) -> str\n```\n\nA bypass ring curve (crossed ends). `element` = name of a saved RingCurve element (ra.elements.list(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always BYPASS).\n\n| Parameter | Type | |\n|---|---|---|\n| `opening_length` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `offset_x` | `float` | optional — None = the tool default |\n| `offset_y` | `float` | optional — None = the tool default |\n| `tangent` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Ring Curve","section":"ra.ringcurve.createbypass()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreatebypass","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreatebypass","collection":"scripting","hash":"6f80e6fe942968d571cc9808240275a8","indexed_by":"docs-index"}},{"content":"Ring Curve — ra.ringcurve.createclosed()\n\n```python\nra.ring_curve.create_closed(finger_diameter=None, plane=None, profile=None, element=None) -> str\n```\n\nA closed ring curve (full circle at the finger size). `element` = name of a saved RingCurve element (ra.elements.list(\"RingCurve\")) to start from; explicit arguments override it (its finger size is always replaced, and the curve type is always CLOSE).\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Ring Curve","section":"ra.ringcurve.createclosed()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateclosed","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateclosed","collection":"scripting","hash":"7d1a528969291457ccd3ca9a482cf2de","indexed_by":"docs-index"}},{"content":"Ring Curve — ra.ringcurve.createopen()\n\n```python\nra.ring_curve.create_open(opening_length=None, finger_diameter=None, plane=None, profile=None, element=None) -> str\n```\n\nAn open ring curve (circle with a gap). `element` = name of a saved RingCurve element (ra.elements.list(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always OPEN).\n\n| Parameter | Type | |\n|---|---|---|\n| `opening_length` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Ring Curve","section":"ra.ringcurve.createopen()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateopen","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateopen","collection":"scripting","hash":"b6c72335aefb0223a883cde050735ad5","indexed_by":"docs-index"}},{"content":"Ring Curve — ra.ringcurve.createshape()\n\n```python\nra.ring_curve.create_shape(shape_type=None, diameter=None, width=None, height=None, offset=None, move_in_z=None, opening_length=None, finger_diameter=None, plane=None, profile=None, element=None) -> str\n```\n\n`shape_type` is \"ROUND\" (uses `diameter`) or \"ELLIPSE\" (uses `width` x `height`). `element` = name of a saved RingCurve element (ra.elements.list(\"RingCurve\")) to start from; explicit arguments override it -- with an element, an argument left at its signature default keeps the element's value (its finger size is always replaced, and the curve type is always SHAPE).\n\n| Parameter | Type | |\n|---|---|---|\n| `shape_type` | `str` | optional — None = the tool default |\n| `diameter` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `offset` | `float` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `opening_length` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Ring Curve","section":"ra.ringcurve.createshape()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateshape","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-curve/#raringcurvecreateshape","collection":"scripting","hash":"ad8b01c29855c3d0b220107550dead85","indexed_by":"docs-index"}},{"content":"Ring Extrude\n\nRings extruded from a frontal profile.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RingExtrudeApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | Ids of every RingExtrude body in the active document. |\n| `create()` | Builds a ring body by extruding silhouettes (the ArtisanRingExtrude tool, headless): a frontal silhouette (an EXTERNAL_RING_PROFILE asset) and a lateral silhouette (a RING_SIDE_CURVE asset) are grown around the finger circle by the lengths below and intersected — the quick way to get a wide, sculpted band. |","metadata":{"title":"Ring Extrude","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/","collection":"scripting","hash":"d1af2e35fa3ea343ad42dedc9f65420d","indexed_by":"docs-index"}},{"content":"Ring Extrude — ra.ringextrude.all()\n\n```python\nra.ring_extrude.all() -> List[str]\n```\n\nIds of every RingExtrude body in the active document.","metadata":{"title":"Ring Extrude","section":"ra.ringextrude.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudeall","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudeall","collection":"scripting","hash":"ebe7cecf3a3d4c7fee573caf1a46ff96","indexed_by":"docs-index"}},{"content":"Ring Extrude — ra.ringextrude.create()\n\n```python\nra.ring_extrude.create(top_length=None, side_length=None, bottom_length=None, top_thickness=None, bottom_thickness=None, hollow=None, linear_thickness=None, angle=None, symmetry=None, advanced_top_thickness=None, advanced_lateral_thickness=None, frontal_profile=None, lateral_profile=None, finger_diameter=None, plane=None) -> str\n```\n\nBuilds a ring body by extruding silhouettes (the ArtisanRingExtrude tool, headless): a frontal silhouette (an EXTERNAL_RING_PROFILE asset) and a lateral silhouette (a RING_SIDE_CURVE asset) are grown around the finger circle by the lengths below and intersected — the quick way to get a wide, sculpted band. Millimetres; omitting keeps the tool default (or the user's saved defaults): top_length 2, side_length 2, bottom_length 2 (metal over the finger at top / sides / bottom), top_thickness 2, bottom_thickness 2 (band width, frontal view). `hollow` True carves the inside with `linear_thickness` (2), `angle` (degrees, NaN = 0), `symmetry` SYMMETRIC (default) | ASYMMETRIC with `advanced_top_thickness` / `advanced_lateral_thickness` (2). `frontal_profile` / `lateral_profile` pick assets by name (see AssetsApi). `finger_diameter` 0 = document ring size. `plane` omitted = world XY. Returns the Guid of the new ring body (a RingExtrude custom object).","metadata":{"title":"Ring Extrude","section":"ra.ringextrude.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudecreate","collection":"scripting","hash":"814dc3c00d09581de73a3cb29f3ff283","indexed_by":"docs-index"}},{"content":"Ring Extrude — ra.ringextrude.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `top_length` | `float` | optional — None = the tool default |\n| `side_length` | `float` | optional — None = the tool default |\n| `bottom_length` | `float` | optional — None = the tool default |\n| `top_thickness` | `float` | optional — None = the tool default |\n| `bottom_thickness` | `float` | optional — None = the tool default |\n| `hollow` | `Optional[bool]` | optional — None = the tool default |\n| `linear_thickness` | `float` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `symmetry` | `str` | optional — None = the tool default |\n| `advanced_top_thickness` | `float` | optional — None = the tool default |\n| `advanced_lateral_thickness` | `float` | optional — None = the tool default |\n| `frontal_profile` | `str` | optional — None = the tool default |\n| `lateral_profile` | `str` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Ring Extrude","section":"ra.ringextrude.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-extrude/#raringextrudecreate","collection":"scripting","hash":"c20e0a3640a9b738f849dc2db5ef3dd9","indexed_by":"docs-index"}},{"content":"Ring Tools\n\nUtilities on ring geometry: cut by ring size, estimate size, rail helpers.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RingToolsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `cut_by_ring_size()` | Cuts the finger hole through objects (the ArtisanCutByRingSize tool, headless): subtracts a cylinder of `finger_diameter` running along world Y — rings are modelled at the origin by convention — from every brep / extrusion / SubD / mesh in `ids`. |\n| `estimate_ring_size()` | Estimates the finger size of a modelled ring (the ArtisanEstimateRingSize tool): sections the geometry with the XY and YZ planes through the origin, measures the inner gap along X (diameter) and along Z (inner height), scores how ring-like the result is (0..100) and looks up the closest catalog size in `region` (omitted = the document's region, USA without one). |","metadata":{"title":"Ring Tools","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/","collection":"scripting","hash":"bc184f8c6b0da1fb06bf197dcfa30043","indexed_by":"docs-index"}},{"content":"Ring Tools — ra.ringtools.cutbyringsize()\n\n```python\nra.ring_tools.cut_by_ring_size(ids: Sequence[IdLike], finger_diameter=None) -> CutByRingSizeResult\n```\n\nCuts the finger hole through objects (the ArtisanCutByRingSize tool, headless): subtracts a cylinder of `finger_diameter` running along world Y — rings are modelled at the origin by convention — from every brep / extrusion / SubD / mesh in `ids`. 0 = the document's ring size. The pieces replace the originals with the same attributes; objects the boolean cannot cut are left as they are and reported in FailedIds. Returns the count of cut / failed objects and the new ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `ids` | `Sequence[IdLike]` | required |\n| `finger_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Ring Tools","section":"ra.ringtools.cutbyringsize()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/#raringtoolscutbyringsize","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/#raringtoolscutbyringsize","collection":"scripting","hash":"d5a88af3fb9255e3bf96ce9d0a55878e","indexed_by":"docs-index"}},{"content":"Ring Tools — ra.ringtools.estimateringsize()\n\n```python\nra.ring_tools.estimate_ring_size(ids=None, region=None, add_ring_curve=None) -> RingSizeEstimate\n```\n\nEstimates the finger size of a modelled ring (the ArtisanEstimateRingSize tool): sections the geometry with the XY and YZ planes through the origin, measures the inner gap along X (diameter) and along Z (inner height), scores how ring-like the result is (0..100) and looks up the closest catalog size in `region` (omitted = the document's region, USA without one). `ids` omitted = every visible, unlocked brep / surface / mesh. Read-only. `add_ring_curve` True also inserts an Artisan ring curve at the estimated size (requires a licence, like the command). Returns a RingSizeEstimate; IsRing False when nothing ring-like was found (Probability, Size empty).\n\n| Parameter | Type | |\n|---|---|---|\n| `ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `region` | `str` | optional — None = the tool default |\n| `add_ring_curve` | `bool` | optional — None = the tool default |","metadata":{"title":"Ring Tools","section":"ra.ringtools.estimateringsize()","url":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/#raringtoolsestimateringsize","source":"https://www.rhinoartisan.com/docs/scripting/python/ring-tools/#raringtoolsestimateringsize","collection":"scripting","hash":"543c69a9f6cd0bba27fc375cce990339","indexed_by":"docs-index"}},{"content":"Rope\n\nRope twists.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.RopeApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: strand diameter 1.6, width 3, 3 threads, 5 turns. |\n\nra.rope.create()\n```python\nra.rope.create(curve_id: IdLike, diameter=None, width=None, threads=None, turns=None) -> str\n```\n\nDefaults: strand diameter 1.6, width 3, 3 threads, 5 turns.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `diameter` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `threads` | `int` | optional — None = the tool default |\n| `turns` | `int` | optional — None = the tool default |","metadata":{"title":"Rope","url":"https://www.rhinoartisan.com/docs/scripting/python/rope/","source":"https://www.rhinoartisan.com/docs/scripting/python/rope/","collection":"scripting","hash":"8b049688d4a8f5cdf4906c262b4bce5a","indexed_by":"docs-index"}},{"content":"Scoop Ring\n\nScoop rings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ScoopRingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `apply()` | Scoops (hollows out) a ring shank from the inside — the ArtisanScoopRing tool, headless. |","metadata":{"title":"Scoop Ring","url":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/","source":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/","collection":"scripting","hash":"321cdb3e72182580fc71fb0fba7b7e13","indexed_by":"docs-index"}},{"content":"Scoop Ring — ra.scoopring.apply()\n\n```python\nra.scoop_ring.apply(object_id: IdLike, face_indices: Sequence[int], thickness=None, central_angle=None, transition_angle=None, transition_inset=None, smoothing=None, liner=None, liner_thickness=None, liner_swap=None) -> List[str]\n```\n\nScoops (hollows out) a ring shank from the inside — the ArtisanScoopRing tool, headless. `object_id` is the closed ring solid (brep or extrusion, modelled at the origin with the finger axis along world Y) and `face_indices` the brep faces to scoop away (the faces the user would click: typically the inner/side faces). The scoop is symmetric: `central_angle` degrees fully hollowed at the bottom of the ring plus `transition_angle` degrees of fade-out on each side. Only the symmetric mode of the panel is exposed. Millimetres; omitting keeps the tool default (or the user's saved defaults): thickness 1 (wall left), central_angle 108, transition_angle 15, transition_inset 3.5. `smoothing` = loft rebuild points 30 (smooth) | 60 (medium) | 120 (fine) | 0 (precise, exact sections); None = default. `liner` True adds an inner liner of `liner_thickness` (0.8); `liner_swap` flips which side the liner keeps. Replaces the original object (same attributes/layer) and returns the ids of the scooped shank followed by the liner pieces, if any.","metadata":{"title":"Scoop Ring","section":"ra.scoopring.apply()","url":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/#rascoopringapply","source":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/#rascoopringapply","collection":"scripting","hash":"8133ee257941abe06e758c687dff0a6b","indexed_by":"docs-index"}},{"content":"Scoop Ring — ra.scoopring.apply()\n\n| Parameter | Type | |\n|---|---|---|\n| `object_id` | `IdLike` | required |\n| `face_indices` | `Sequence[int]` | required |\n| `thickness` | `float` | optional — None = the tool default |\n| `central_angle` | `float` | optional — None = the tool default |\n| `transition_angle` | `float` | optional — None = the tool default |\n| `transition_inset` | `float` | optional — None = the tool default |\n| `smoothing` | `Optional[int]` | optional — None = the tool default |\n| `liner` | `Optional[bool]` | optional — None = the tool default |\n| `liner_thickness` | `float` | optional — None = the tool default |\n| `liner_swap` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Scoop Ring","section":"ra.scoopring.apply()","url":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/#rascoopringapply","source":"https://www.rhinoartisan.com/docs/scripting/python/scoop-ring/#rascoopringapply","collection":"scripting","hash":"c9f97cf08a7e7e622d7f2617720bc691","indexed_by":"docs-index"}},{"content":"Semantics\n\nSemantic descriptions of the design.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SemanticsApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `describe_document()` | Returns a human-readable summary of the active document: design type and subtype, finger size, metals, gems and the parametric elements it contains. |","metadata":{"title":"Semantics","url":"https://www.rhinoartisan.com/docs/scripting/python/semantics/","source":"https://www.rhinoartisan.com/docs/scripting/python/semantics/","collection":"scripting","hash":"2a09705af6c2a97296b8cc2331de72b4","indexed_by":"docs-index"}},{"content":"Semantics — ra.semantics.describedocument()\n\n```python\nra.semantics.describe_document() -> str\n```\n\nReturns a human-readable summary of the active document: design type and subtype, finger size, metals, gems and the parametric elements it contains. Empty string when there is no document. Perfect answer material for \"what is this design?\" questions.","metadata":{"title":"Semantics","section":"ra.semantics.describedocument()","url":"https://www.rhinoartisan.com/docs/scripting/python/semantics/#rasemanticsdescribedocument","source":"https://www.rhinoartisan.com/docs/scripting/python/semantics/#rasemanticsdescribedocument","collection":"scripting","hash":"6401cdb0bbfe69f5fc205bd75b7c4eaa","indexed_by":"docs-index"}},{"content":"Signet Ring\n\nSignet rings with a shaped top face.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SignetRingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `SignetRing` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `SignetRing` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a signet ring -- the ArtisanSignetRing tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `SignetRing` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Signet Ring","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/","collection":"scripting","hash":"f84650bd231eedce40e351986d971af1","indexed_by":"docs-index"}},{"content":"Signet Ring — ra.signetring.all()\n\n```python\nra.signet_ring.all() -> List[SignetRing]\n```\n\n`SignetRing` handles for every object of this kind in the active document (empty when there is no document).\n\nra.signetring.bylayer()\n```python\nra.signet_ring.by_layer(layer_name: str) -> List[SignetRing]\n```\n\n`SignetRing` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Signet Ring","section":"ra.signetring.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringall","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringall","collection":"scripting","hash":"043085b341d1ee381d6cc0bfcd51ec89","indexed_by":"docs-index"}},{"content":"Signet Ring — ra.signetring.count()\n\n```python\nra.signet_ring.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Signet Ring","section":"ra.signetring.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcount","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcount","collection":"scripting","hash":"cf85b0ca8370551cece100f81b5e3abc","indexed_by":"docs-index"}},{"content":"Signet Ring — ra.signetring.create()\n\n```python\nra.signet_ring.create(finger_diameter=None, width=None, height=None, height_position=None, rotation=None, width_bottom_profile=None, height_bottom_profile=None, width_middle_profile=None, height_middle_profile=None, recess=None, thickness=None, inner_height=None, profile=None, plane=None, element=None) -> SignetRing\n```\n\nBuilds a signet ring -- the ArtisanSignetRing tool, headless. Millimetres / degrees; omitting keeps the tool default (or the user's saved defaults). `finger_diameter` 0 = the document's finger size. `recess` hollows the face; `thickness` and `inner_height` shape that recess. Returns an SignetRing handle to the new ring. `element` = name of a saved signet ring element (ra.elements.list(\"SignetRing\")) to start from instead of the tool defaults; explicit arguments override it.","metadata":{"title":"Signet Ring","section":"ra.signetring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcreate","collection":"scripting","hash":"0111b8a4f30431104b0dafb1d02b065f","indexed_by":"docs-index"}},{"content":"Signet Ring — ra.signetring.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `height_position` | `float` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `width_bottom_profile` | `float` | optional — None = the tool default |\n| `height_bottom_profile` | `float` | optional — None = the tool default |\n| `width_middle_profile` | `float` | optional — None = the tool default |\n| `height_middle_profile` | `float` | optional — None = the tool default |\n| `recess` | `Optional[bool]` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `inner_height` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Signet Ring","section":"ra.signetring.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringcreate","collection":"scripting","hash":"bdcde471fc2e645a8e180af9da299981","indexed_by":"docs-index"}},{"content":"Signet Ring — ra.signetring.find()\n\n```python\nra.signet_ring.find(id: IdLike) -> SignetRing\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.signetring.selected()\n```python\nra.signet_ring.selected() -> List[SignetRing]\n```\n\n`SignetRing` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Signet Ring","section":"ra.signetring.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringfind","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#rasignetringfind","collection":"scripting","hash":"b8c94e08ed7f9393c3f08327fd432822","indexed_by":"docs-index"}},{"content":"Signet Ring — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nSignetRing (handle)\nSignet ring: a flat face carried on a band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `face` | SignetFace | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved SignetRing element (ra.elements.list(\"SignetRing\")) to this ring: its parameters replace the current ones, the ring size stays, and the ring regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Signet Ring","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#handles","collection":"scripting","hash":"c293eb0d7bea82d28a82444b2f376121","indexed_by":"docs-index"}},{"content":"Signet Ring — SignetFace (section)\n\nThe signet face and the band under it — shared by the classic signet and the advanced one. A live view over the ring's stored parameters: getters read the current values, setters regenerate the ring in place (same Guid) and are license-gated.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `height` | `float` | yes | face height, mm |\n| `height_bottom_profile` | `float` | | mm |\n| `height_middle_profile` | `float` | | mm |\n| `height_position` | `float` | yes | how high the face sits over the finger, mm |\n| `inner_height` | `float` | yes | mm — used when Recess is on |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `recess` | `bool` | yes | hollow the back of the face |\n| `rotation` | `float` | yes | degrees |\n| `shape_mode` | `str` | yes | \"Circle\" or \"Custom\" |\n| `tangent` | `float` | yes | |\n| `thickness` | `float` | yes | mm — used when Recess is on |\n| `width` | `float` | yes | face width, mm |\n| `width_bottom_profile` | `float` | | band section at the bottom, mm |\n| `width_middle_profile` | `float` | | band section at the middle, mm |\n\n| Method | |\n|---|---|\n| `set_bottom_profile(width: float, height: float)` | |\n| `set_middle_profile(width: float, height: float)` | |\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Signet Ring","section":"SignetFace (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#signetface-section","source":"https://www.rhinoartisan.com/docs/scripting/python/signet-ring/#signetface-section","collection":"scripting","hash":"de1508ec0efce9882cd8bac23cd84d94","indexed_by":"docs-index"}},{"content":"Smart Component\n\nEdit bails, named pendants, bangles, beads, charms, links, milgrain, ropes, 3D textures and ring engravings after creation (their model as JSON).\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SmartComponentApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `SmartComponent` handles for every such component in the active document. |\n| `by_layer()` | Handles on the layer with the given full path. |\n| `count()` | Number of such components in the active document. |\n| `find()` | The handle for `id` (the component, or any member of a bail / named pendant group), or None when it is not one of these components. |\n| `selected()` | Components with at least one selected member. |","metadata":{"title":"Smart Component","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/","collection":"scripting","hash":"b38680b2559ae61ec4436443b7cad8fa","indexed_by":"docs-index"}},{"content":"Smart Component — ra.smartcomponent.all()\n\n```python\nra.smart_component.all() -> List[SmartComponent]\n```\n\n`SmartComponent` handles for every such component in the active document.\n\nra.smartcomponent.bylayer()\n```python\nra.smart_component.by_layer(layer_name: str) -> List[SmartComponent]\n```\n\nHandles on the layer with the given full path.\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Smart Component","section":"ra.smartcomponent.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentall","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentall","collection":"scripting","hash":"4cbf0b7e81a412ee28b7960db9783dbb","indexed_by":"docs-index"}},{"content":"Smart Component — ra.smartcomponent.count()\n\n```python\nra.smart_component.count() -> int\n```\n\nNumber of such components in the active document.\n\nra.smartcomponent.find()\n```python\nra.smart_component.find(id: IdLike) -> SmartComponent\n```\n\nThe handle for `id` (the component, or any member of a bail / named pendant group), or None when it is not one of these components.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Smart Component","section":"ra.smartcomponent.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentcount","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentcount","collection":"scripting","hash":"d39d09225776476cb6e0a16f224c7b93","indexed_by":"docs-index"}},{"content":"Smart Component — ra.smartcomponent.selected()\n\n```python\nra.smart_component.selected() -> List[SmartComponent]\n```\n\nComponents with at least one selected member.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Smart Component","section":"ra.smartcomponent.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentselected","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#rasmartcomponentselected","collection":"scripting","hash":"c66b61e7da4ca5a870ecc146bcd64da9","indexed_by":"docs-index"}},{"content":"Smart Component — SmartComponent (handle)\n\nA smart component that has no typed handle of its own -- Bail, Named Pendant, Engrave Ring (parametric groups) and Bangle, Bead, Charm, Link, Milgrain, Rope, Texture3D (custom objects) -- edited through its kernel model as JSON. Paths are the model's property path (\"TopProfile.Width\", \"DiameterTop\"; snake_case works too: \"top_profile.width\"), shown by ParametersJson. Every change regenerates the component in place (same id), like the panel.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `component` | `str` | | Bail \\| NamedPendant \\| EngraveRing \\| Bangle \\| Bead \\| Charm \\| Link \\| Milgrain \\| Rope \\| Texture3D |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `parameters_json` | `str` | | the kernel model, as stored in the object |\n| `position` | `Point3d` | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `get_parameter(path: str) -> str` | dotted path; None when absent |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved element of the same component (ra.elements.list(\"Bail\")...): its parameters replace the current ones (a named pendant keeps its text) and it regenerates in place. |\n| `set_parameter(path: str, value: str)` | one value (kept as the model's number / bool / string); regenerates |\n| `set_parameters(json: str)` | Several values at once, as a JSON object merged into the model ({\"DiameterTop\": 3, \"TopProfile\": {\"Width\": 2}}); regenerates once. |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Smart Component","section":"SmartComponent (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#smartcomponent-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-component/#smartcomponent-handle","collection":"scripting","hash":"1b0b77a8271275e9a971ab3bdec04d4b","indexed_by":"docs-index"}},{"content":"Smart Profile\n\nSmart Profiles: profile sections swept along a curve, varying along the way.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SmartProfileApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `SmartProfile` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `SmartProfile` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Sweeps profile sections along existing curves (the ArtisanProfiles \"Smart Profiles\" tool, headless): one smart profile per curve, linked to it (editing the curve regenerates it). |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | Smart profiles currently selected in the active doc. |","metadata":{"title":"Smart Profile","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/","collection":"scripting","hash":"b1ef65489ef00092e447ddc8bd3fd8b1","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.all()\n\n```python\nra.smart_profile.all() -> List[SmartProfile]\n```\n\n`SmartProfile` handles for every object of this kind in the active document (empty when there is no document).\n\nra.smartprofile.bylayer()\n```python\nra.smart_profile.by_layer(layer_name: str) -> List[SmartProfile]\n```\n\n`SmartProfile` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Smart Profile","section":"ra.smartprofile.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofileall","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofileall","collection":"scripting","hash":"8fc87fb9c2d7781ba561563bb4a9bf72","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.count()\n\n```python\nra.smart_profile.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Smart Profile","section":"ra.smartprofile.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecount","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecount","collection":"scripting","hash":"3b9b73b21450aaf3271a46f12ff9bb22","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.create()\n\n```python\nra.smart_profile.create(curve_ids: Sequence[IdLike], count=None, positions=None, widths=None, heights=None, rotations=None, displacements=None, profiles=None, section_types=None, width=None, height=None, profile=None, section_type=None, thickness=None, comfort=None, start_cap_distance=None, end_cap_distance=None, rebuild_points=None, orientation_ids=None, element=None) -> List[SmartProfile]\n```","metadata":{"title":"Smart Profile","section":"ra.smartprofile.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","collection":"scripting","hash":"09d7b4ef3fb6e4b80334b430d5f06d35","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.create()\n\nSweeps profile sections along existing curves (the ArtisanProfiles \"Smart Profiles\" tool, headless): one smart profile per curve, linked to it (editing the curve regenerates it). Each section sits at a normalized position t in 0..1 along the curve and has its own RING_PROFILE asset, width, height, rotation and displacement. Sections, in priority order: `positions` (with optional parallel `widths`, `heights`, `rotations`, `displacements`, `profiles`, `section_types`; 0 / empty = the uniform value) replace everything; else `count` (2+) identical sections spread evenly (closed curves skip t = 1); else the user's saved default sections; else 2 sections at the ends. At least two sections. `width` / `height` (0 = 1 mm), `profile` (default RING_PROFILE, or \"id: \"), `section_type` COMFORT (default) | SOLID | THICKNESS with `thickness` (0.7) and `comfort` (0.3) apply to every section without its own value. `start_cap_distance` / `end_cap_distance` dome the ends of open curves (literal mm, NaN keeps 1). `rebuild_points` 0 keeps the profiles as drawn, 4+ rebuilds them. `orientation_ids` = solids/meshes whose surface orients the sections (e.g. the ring the profile runs on). Curves with kinks give mitred pieces: fillet them first. `element` = name of a saved SmartProfile element (ra.elements.list(\"SmartProfile\")) to start from, in place of the saved defaults (its sections are used unless `positions` / `count` are given); explicit arguments override it. Returns one SmartProfile handle per curve.","metadata":{"title":"Smart Profile","section":"ra.smartprofile.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","collection":"scripting","hash":"40d7f8e48dde12812ddd74810cfada6d","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `count` | `int` | optional — None = the tool default |\n| `positions` | `Sequence[float]` | optional — None = the tool default |\n| `widths` | `Sequence[float]` | optional — None = the tool default |\n| `heights` | `Sequence[float]` | optional — None = the tool default |\n| `rotations` | `Sequence[float]` | optional — None = the tool default |\n| `displacements` | `Sequence[float]` | optional — None = the tool default |\n| `profiles` | `Sequence[str]` | optional — None = the tool default |\n| `section_types` | `Sequence[str]` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `section_type` | `str` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `comfort` | `float` | optional — None = the tool default |\n| `start_cap_distance` | `float` | optional — None = the tool default |\n| `end_cap_distance` | `float` | optional — None = the tool default |\n| `rebuild_points` | `int` | optional — None = the tool default |\n| `orientation_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Smart Profile","section":"ra.smartprofile.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilecreate","collection":"scripting","hash":"1907e9eff76503192c7ce2cd6b560482","indexed_by":"docs-index"}},{"content":"Smart Profile — ra.smartprofile.find()\n\n```python\nra.smart_profile.find(id: IdLike) -> SmartProfile\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.smartprofile.selected()\n```python\nra.smart_profile.selected() -> List[SmartProfile]\n```\n\nSmart profiles currently selected in the active doc.","metadata":{"title":"Smart Profile","section":"ra.smartprofile.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilefind","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#rasmartprofilefind","collection":"scripting","hash":"f7eb3008ccb0a34d08a4f9464df885ab","indexed_by":"docs-index"}},{"content":"Smart Profile — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Smart Profile","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#handles","collection":"scripting","hash":"c12f1d268958952257eeff2ca46cde72","indexed_by":"docs-index"}},{"content":"Smart Profile — SmartProfile (handle)\n\nSmart profile (the ArtisanProfiles tool): a document curve swept through N RING_PROFILE sections, each placed at a normalized position `t` along the curve (0 = start, 1 = end). Stays linked to the curve: editing the curve regenerates it. Sections are always sorted by t, so an index refers to the n-th section along the curve.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `curve_id` | `str` | | The document curve the profile follows. |\n| `end_cap_distance` | `float` | yes | Dome height of the end cap (open curves), mm. |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `rebuild_points` | `int` | yes | 0 = profiles used as drawn; else rebuilt to this many points. |\n| `section_count` | `int` | | |\n| `section_heights` | `List[float]` | | mm, same order |\n| `section_mirror_of` | `List[int]` | | -1 for a normal section, else the index of the section it mirrors |\n| `section_positions` | `List[float]` | | t of each section, sorted |\n| `section_profiles` | `List[str]` | | RING_PROFILE asset name of each section, same order |\n| `section_rotations` | `List[float]` | | degrees, same order |\n| `section_types` | `List[str]` | | COMFORT \\| SOLID \\| THICKNESS, same order |\n| `section_widths` | `List[float]` | | mm, same order |\n| `start_cap_distance` | `float` | yes | Dome height of the start cap (open curves), mm. |","metadata":{"title":"Smart Profile","section":"SmartProfile (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","collection":"scripting","hash":"d516bef8db6639af9f70ef997fe1e072","indexed_by":"docs-index"}},{"content":"Smart Profile — SmartProfile (handle)\n\n| Method | |\n|---|---|\n| `add_section(t: float, width=None, height=None, profile=None)` | Adds a section at t (0..1, at least 0.002 from the others). |\n| `delete()` | |\n| `mirror_section(index: int)` | Adds a section that mirrors `index` across the curve (t = 1 - t, rotation negated) and follows it from then on. |\n| `move(translation: VectorLike)` | |\n| `remove_section(index: int)` | |\n| `set_all_sections(width: float, height: float)` | |\n| `set_element(element: str)` | Applies a saved SmartProfile element (ra.elements.list(\"SmartProfile\")): its sections and settings replace the current ones; the curve and the orientation objects stay. |\n| `set_height(height: float)` | every section |\n| `set_profile(profile: str)` | every section: RING_PROFILE asset name or \"id: \" |\n| `set_section(index: int, width=None, height=None)` | Mutations regenerate the profile in place (same Guid) and call LicenseGate.RequireValid() first. |\n| `set_section_displacement(index: int, displacement: float)` | sideways offset of the section, mm (literal: 0 = centered) |\n| `set_section_position(index: int, t: float)` | |\n| `set_section_profile(index: int, profile: str)` | RING_PROFILE asset name or \"id: \" |\n| `set_section_reversed(index: int, reversed: bool)` | True = profile drawn reversed |\n| `set_section_rotation(index: int, degrees: float)` | |\n| `set_section_type(index: int, section_type: str, thickness=None, comfort=None)` | COMFORT \\| SOLID \\| THICKNESS; thickness/comfort mm, 0 keeps |\n| `set_sections(sections_json: str)` | Replaces every section from a JSON array, the same shape create_smart_profile takes: [{\"t\": 0, \"width\": 2, \"height\": 1, \"rotation\": 0, \"displacement\": 0, \"profile\": \"...\", \"type\": \"COMFORT\"}, ...] (only t is required; 2+ entries). |","metadata":{"title":"Smart Profile","section":"SmartProfile (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","collection":"scripting","hash":"b9f68d1eb8346f7a38d3fd863f685136","indexed_by":"docs-index"}},{"content":"Smart Profile — SmartProfile (handle)\n\n| Method | |\n|---|---|\n| `set_width(width: float)` | every section |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Smart Profile","section":"SmartProfile (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/smart-profile/#smartprofile-handle","collection":"scripting","hash":"435669a1762d6d5e057b75716760d74e","indexed_by":"docs-index"}},{"content":"Solid\n\nSolid modelling helpers: caps, shells, sweeps, offsets.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SolidApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `cap_round()` | Rounded (domed) cap over a closed planar curve (the ArtisanCapRound command): a RoundCapCustomObject linked to the curve, on the metal layer with the metal material. |\n| `curve_shell()` | Hollow shell (a wall + a floor) built from one or more closed planar curves (the ArtisanCurveShell command): one CurveShellCustomObject per curve on the metal layer with the metal material. |\n| `cut()` | Cuts solids with planar closed curves (the ArtisanCut command): each curve is extruded through the solids (twice the bounding-box diagonal, centred on the curve plane) and subtracted. |\n| `recess()` | Recess (default) or protrusion of the region a closed curve marks on a solid's face (the ArtisanRecess command): the curve is pulled onto the face, the face is split and the inner piece is offset `height` mm (default 0.5) and subtracted (recess) or united (protrusion). |\n| `sweep_one_rail()` | Orients profile curves along one rail and sweeps them (the ArtisanCurves1Rail command). |\n| `sweep_two_rails()` | Orients profile curves between two rails and sweeps them (the ArtisanCurves2Rails command). |","metadata":{"title":"Solid","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/","collection":"scripting","hash":"46b45ddaea6ec85a231ffb8a87849cb0","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.capround()\n\n```python\nra.solid.cap_round(curve_id: IdLike, height=None, flip=None) -> str\n```\n\nRounded (domed) cap over a closed planar curve (the ArtisanCapRound command): a RoundCapCustomObject linked to the curve, on the metal layer with the metal material. height 0 = the user's saved default or 5 mm; flip None = saved default (False = along the curve normal). Returns the id of the cap object.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `height` | `float` | optional — None = the tool default |\n| `flip` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Solid","section":"ra.solid.capround()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcapround","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcapround","collection":"scripting","hash":"1b8a3a38df1c1263cc815aedcaa01720","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.curveshell()\n\n```python\nra.solid.curve_shell(curve_ids: Sequence[IdLike], height=None, width_thickness=None, height_thickness=None, profile=None, flip=None) -> List[str]\n```\n\nHollow shell (a wall + a floor) built from one or more closed planar curves (the ArtisanCurveShell command): one CurveShellCustomObject per curve on the metal layer with the metal material. 0 = the user's saved default or the tool default: height 3, width_thickness 1 (wall), height_thickness 2 (floor; must be < height). profile ROUND | SHARP (offset corners); flip None = saved default. Returns the new ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_ids` | `Sequence[IdLike]` | required |\n| `height` | `float` | optional — None = the tool default |\n| `width_thickness` | `float` | optional — None = the tool default |\n| `height_thickness` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `flip` | `Optional[bool]` | optional — None = the tool default |","metadata":{"title":"Solid","section":"ra.solid.curveshell()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcurveshell","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcurveshell","collection":"scripting","hash":"e0b6c7471f7aa5d6c356e7c74ba3bf45","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.cut()\n\n```python\nra.solid.cut(solid_ids: Sequence[IdLike], curve_ids: Sequence[IdLike]) -> List[str]\n```\n\nCuts solids with planar closed curves (the ArtisanCut command): each curve is extruded through the solids (twice the bounding-box diagonal, centred on the curve plane) and subtracted. The originals are replaced by the results, which keep their layer / material. Returns the ids of the resulting breps.\n\n| Parameter | Type | |\n|---|---|---|\n| `solid_ids` | `Sequence[IdLike]` | required |\n| `curve_ids` | `Sequence[IdLike]` | required |","metadata":{"title":"Solid","section":"ra.solid.cut()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcut","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidcut","collection":"scripting","hash":"76c9dbb97b1522d54d7f3c49c9133074","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.recess()\n\n```python\nra.solid.recess(curve_id: IdLike, solid_id: IdLike, height=None, protrusion=None, face_index=None) -> List[str]\n```\n\nRecess (default) or protrusion of the region a closed curve marks on a solid's face (the ArtisanRecess command): the curve is pulled onto the face, the face is split and the inner piece is offset `height` mm (default 0.5) and subtracted (recess) or united (protrusion). face_index -1 = the face closest to the curve. The original is replaced by the result (same layer / material). Returns the new ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `solid_id` | `IdLike` | required |\n| `height` | `float` | optional — None = the tool default |\n| `protrusion` | `bool` | optional — None = the tool default |\n| `face_index` | `int` | optional — None = the tool default |","metadata":{"title":"Solid","section":"ra.solid.recess()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidrecess","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidrecess","collection":"scripting","hash":"d0a72eb4d44ddade2712565d2308e02a","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.sweeponerail()\n\n```python\nra.solid.sweep_one_rail(rail_id: IdLike, profile_ids: Sequence[IdLike], mode=None, thickness=None, flip=None, sweep=None, positions=None) -> SweepResult\n```\n\nOrients profile curves along one rail and sweeps them (the ArtisanCurves1Rail command). Profiles are drawn flat on World XY (base = bottom of their bounding box) and distributed evenly from the rail start, or at `positions` (normalized 0..1, one per profile). mode OPEN | CLOSE (chord) | COMFORT (curved inner) | THICKNESS (inner offset by `thickness`, NaN = 0.6 mm; negative allowed). flip mirrors the profiles across the rail; sweep False = only the oriented curves. Returns the ids of the swept breps and of the baked curves.\n\n| Parameter | Type | |\n|---|---|---|\n| `rail_id` | `IdLike` | required |\n| `profile_ids` | `Sequence[IdLike]` | required |\n| `mode` | `str` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `flip` | `bool` | optional — None = the tool default |\n| `sweep` | `bool` | optional — None = the tool default |\n| `positions` | `Sequence[float]` | optional — None = the tool default |","metadata":{"title":"Solid","section":"ra.solid.sweeponerail()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidsweeponerail","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidsweeponerail","collection":"scripting","hash":"c123698ff5fd29728038192460ab8255","indexed_by":"docs-index"}},{"content":"Solid — ra.solid.sweeptworails()\n\n```python\nra.solid.sweep_two_rails(rail1_id: IdLike, rail2_id: IdLike, profile_ids: Sequence[IdLike], mode=None, thickness=None, keep_proportion=None, sweep=None, positions=None) -> SweepResult\n```\n\nOrients profile curves between two rails and sweeps them (the ArtisanCurves2Rails command). Each profile's endpoints land on rail 1 and rail 2 (start->end), scaled to the distance between the rails: keep_proportion False = uniform scale, True = the height is kept. Profiles spread evenly along rail 1 (rail 2 by closest point) or at `positions` (normalized 0..1 on rail 1). mode / thickness / sweep as in SweepOneRail. Returns the swept brep ids and the baked curve ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `rail1_id` | `IdLike` | required |\n| `rail2_id` | `IdLike` | required |\n| `profile_ids` | `Sequence[IdLike]` | required |\n| `mode` | `str` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `keep_proportion` | `bool` | optional — None = the tool default |\n| `sweep` | `bool` | optional — None = the tool default |\n| `positions` | `Sequence[float]` | optional — None = the tool default |","metadata":{"title":"Solid","section":"ra.solid.sweeptworails()","url":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidsweeptworails","source":"https://www.rhinoartisan.com/docs/scripting/python/solid/#rasolidsweeptworails","collection":"scripting","hash":"9e7141a4a05a125d802ff8438bf0c110","indexed_by":"docs-index"}},{"content":"Split Shank\n\nSplit shanks.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.SplitShankApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `SplitShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `SplitShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a split shank -- the ArtisanSplitShank tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `SplitShank` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Split Shank","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/","collection":"scripting","hash":"3227d3f18b43bb09fa4825b0a9867fd7","indexed_by":"docs-index"}},{"content":"Split Shank — ra.splitshank.all()\n\n```python\nra.split_shank.all() -> List[SplitShank]\n```\n\n`SplitShank` handles for every object of this kind in the active document (empty when there is no document).\n\nra.splitshank.bylayer()\n```python\nra.split_shank.by_layer(layer_name: str) -> List[SplitShank]\n```\n\n`SplitShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Split Shank","section":"ra.splitshank.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankall","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankall","collection":"scripting","hash":"de713f129288253b311f22a76c48832e","indexed_by":"docs-index"}},{"content":"Split Shank — ra.splitshank.count()\n\n```python\nra.split_shank.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.splitshank.create()\n```python\nra.split_shank.create(finger_diameter=None, opening_length=None, arm_height=None, split_width=None, split_start=None, top_size=None, bottom_size=None, plane=None, element=None) -> SplitShank\n```\n\nBuilds a split shank -- the ArtisanSplitShank tool, headless. Millimetres / degrees; omitting keeps the tool default (or the user's saved defaults). `finger_diameter` 0 = the document's finger size. Returns an SplitShank handle to the new shank. `element` = name of a saved split shank element (ra.elements.list(\"SplitShank\")) to start from instead of the tool defaults; explicit arguments override it.\n\n| Parameter | Type | |\n|---|---|---|\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `opening_length` | `float` | optional — None = the tool default |\n| `arm_height` | `float` | optional — None = the tool default |\n| `split_width` | `float` | optional — None = the tool default |\n| `split_start` | `float` | optional — None = the tool default |\n| `top_size` | `float` | optional — None = the tool default |\n| `bottom_size` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Split Shank","section":"ra.splitshank.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankcount","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankcount","collection":"scripting","hash":"5cda0f88c77d236cbb7366728713b981","indexed_by":"docs-index"}},{"content":"Split Shank — ra.splitshank.find()\n\n```python\nra.split_shank.find(id: IdLike) -> SplitShank\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.splitshank.selected()\n```python\nra.split_shank.selected() -> List[SplitShank]\n```\n\n`SplitShank` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Split Shank","section":"ra.splitshank.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankfind","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#rasplitshankfind","collection":"scripting","hash":"e3b5baad891c20cee574b7d85d389da8","indexed_by":"docs-index"}},{"content":"Split Shank — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nSplitShank (handle)\nSplit shank: a band that opens into two arms toward the setting. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `curve` | SplitShankCurve | | |\n| `gems` | SplitShankGems | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `sections` | `List[SplitShankSection]` | | The three swept profiles, ordered bottom -> side -> top. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved SplitShank element (ra.elements.list(\"SplitShank\")) to this shank: its parameters replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n| `set_section(index: int, position: float, width: float, height: float, type=None, profile_name=None)` | Edits one of the three sections in place. |\n| `set_section_enabled(index: int, enabled: bool)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Split Shank","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#handles","collection":"scripting","hash":"5c457181b8a1cc4f0e39628c6f5f4be9","indexed_by":"docs-index"}},{"content":"Split Shank — SplitShankCurve (section)\n\nThe rail a split shank is swept along: how the arms rise, open and split.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `arm_height` | `float` | yes | rise of the arm tips above the ring top, mm |\n| `arm_offset` | `float` | yes | extra outward bulge beyond the reference shape, mm |\n| `lateral_displacement` | `float` | yes | Y displacement of the arm tips, mm |\n| `lateral_inclination` | `float` | yes | inclination of the arms along the finger axis, degrees |\n| `opening_length` | `float` | yes | frontal X distance between the arm tips, mm (0 = touching) |\n| `split_start` | `float` | yes | where along the rail the split begins, 0..1 |\n| `split_width` | `float` | yes | separation between the front and back arm pairs, mm |","metadata":{"title":"Split Shank","section":"SplitShankCurve (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#splitshankcurve-section","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#splitshankcurve-section","collection":"scripting","hash":"3585fe724d33620987530240ae6f3693","indexed_by":"docs-index"}},{"content":"Split Shank — SplitShankGems (section)\n\nThe pave run along a split shank's arms, with a top-to-bottom size gradient.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bottom_size` | `float` | | stone size at the ring bottom, mm |\n| `bright_cut` | `float` | yes | mm |\n| `channel_clearance` | `float` | yes | mm |\n| `channel_shape` | `str` | yes | |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `enabled` | `bool` | yes | |\n| `flip_end` | `bool` | yes | |\n| `flip_start` | `bool` | yes | |\n| `gem_inside` | `float` | yes | mm |\n| `inner_height` | `float` | yes | mm |\n| `inner_width` | `float` | yes | mm |\n| `margin_bottom` | `float` | | run start, in mm of arc length from the rail start (Start gumball) |\n| `margin_top` | `float` | | how far below the arm tip the gem run stops, mm (End gumball) |\n| `min_distance` | `float` | yes | mm |\n| `move_in_z` | `float` | yes | mm |\n| `prong_diameter` | `float` | yes | mm |\n| `prong_height` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `shank_size` | `float` | yes | mm |\n| `shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `spacing` | `float` | yes | gap between gems (arms and trunk alike), mm |\n| `top_size` | `float` | | stone size at the arm tip, mm |\n| `transition_size` | `float` | yes | mm |\n| `v_cutters` | `bool` | yes | |\n| `vertical` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `clear_gem_sizes()` | drop every per-stone override (back to the size gradient) |\n| `set_gem_size(position: float, diameter: float)` | per-stone override; position = normalised rail t (0..1), snaps to the nearest stone |\n| `set_margins(top: float, bottom: float)` | |\n| `set_sizes(top_size: float, bottom_size: float)` | |","metadata":{"title":"Split Shank","section":"SplitShankGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#splitshankgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/split-shank/#splitshankgems-section","collection":"scripting","hash":"c3c325fcbb7a1bff2d865c6f0d6dffd0","indexed_by":"docs-index"}},{"content":"Tapered Baguettes\n\nTapered baguettes between two curves.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TaperedBaguettesApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Places tapered baguettes spanning between two rail curves -- the ArtisanTaperedBaguettesOnCurves tool, headless. |\n\nra.taperedbaguettes.create()\n```python\nra.tapered_baguettes.create(curve_a_id: IdLike, curve_b_id: IdLike, points=None, count=None, top_width=None, bottom_width=None, depth_percentage=None, gem_material=None) -> List[str]\n```\n\nPlaces tapered baguettes spanning between two rail curves -- the ArtisanTaperedBaguettesOnCurves tool, headless. Each entry of `points` replaces one click: the rail closest to the point carries the wide (top) edge, the gem runs straight to the closest point on the other rail and its length follows that span. Without `points`, `count` > 0 spreads that many baguettes evenly along the first curve (top edge on it). Millimetres; omitting keeps the tool default: top_width 1.75, bottom_width 1.25, depth_percentage 64. `gem_material` accepts the GemApi vocabulary (default Diamond). The gems are baked loose (no group) on the primary gems layer, like the command. Returns their ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_a_id` | `IdLike` | required |\n| `curve_b_id` | `IdLike` | required |\n| `points` | `Sequence[PointLike]` | optional — None = the tool default |\n| `count` | `int` | optional — None = the tool default |\n| `top_width` | `float` | optional — None = the tool default |\n| `bottom_width` | `float` | optional — None = the tool default |\n| `depth_percentage` | `int` | optional — None = the tool default |\n| `gem_material` | `str` | optional — None = the tool default |","metadata":{"title":"Tapered Baguettes","url":"https://www.rhinoartisan.com/docs/scripting/python/tapered-baguettes/","source":"https://www.rhinoartisan.com/docs/scripting/python/tapered-baguettes/","collection":"scripting","hash":"a7cb357f0141e030eab6108697825c5e","indexed_by":"docs-index"}},{"content":"Text On Curve\n\nText laid along a curve.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TextOnCurveApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Creates the text along `curve_id` and returns the Guids of the added objects (breps and/or curves). |","metadata":{"title":"Text On Curve","url":"https://www.rhinoartisan.com/docs/scripting/python/text-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/python/text-on-curve/","collection":"scripting","hash":"f62a1dd27fecda1d8e4c09b2f846c0e4","indexed_by":"docs-index"}},{"content":"Text On Curve — ra.textoncurve.create()\n\n```python\nra.text_on_curve.create(curve_id: IdLike, text: str, height=None, thickness=None, spacing=None, font=None, rotation=None, move_z=None, horizontal_align=None, vertical_align=None, flip_horizontal=None, flip_vertical=None) -> List[str]\n```\n\nCreates the text along `curve_id` and returns the Guids of the added objects (breps and/or curves). text what to write (required) height letter height in mm (default 1.5) thickness extrusion depth in mm; 0 = curves only (default 0) spacing letter spacing (default 0.5) font installed font name (default \"Bienchen\", the tool's default) rotation letter rotation in degrees moveZ lift above the curve in mm horizontal_align LEFT | CENTER | RIGHT | JUSTIFY (default LEFT) vertical_align TOP | CENTER | BOTTOM (default CENTER) flip_horizontal / flip_vertical mirror the text\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `text` | `str` | required |\n| `height` | `float` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `spacing` | `float` | optional — None = the tool default |\n| `font` | `str` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `move_z` | `float` | optional — None = the tool default |\n| `horizontal_align` | `str` | optional — None = the tool default |\n| `vertical_align` | `str` | optional — None = the tool default |\n| `flip_horizontal` | `bool` | optional — None = the tool default |\n| `flip_vertical` | `bool` | optional — None = the tool default |","metadata":{"title":"Text On Curve","section":"ra.textoncurve.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/text-on-curve/#ratextoncurvecreate","source":"https://www.rhinoartisan.com/docs/scripting/python/text-on-curve/#ratextoncurvecreate","collection":"scripting","hash":"ab23fb67493e999972a5a1a7d7c951a6","indexed_by":"docs-index"}},{"content":"Texture 3d\n\n3D textures applied to surfaces.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.Texture3DApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | `texture_path` optional image file (grayscale heightmap); omitted = the default texture. |\n\nra.texture3d.create()\n```python\nra.texture_3d.create(surface_id: IdLike, texture_path=None, u=None, v=None, height=None, rotation=None) -> str\n```\n\n`texture_path` optional image file (grayscale heightmap); omitted = the default texture. Defaults: 1x1 repeats, relief height 0.6, resolution 0.5. Returns the id of the textured object.\n\n| Parameter | Type | |\n|---|---|---|\n| `surface_id` | `IdLike` | required |\n| `texture_path` | `str` | optional — None = the tool default |\n| `u` | `int` | optional — None = the tool default |\n| `v` | `int` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |","metadata":{"title":"Texture 3d","url":"https://www.rhinoartisan.com/docs/scripting/python/texture-3d/","source":"https://www.rhinoartisan.com/docs/scripting/python/texture-3d/","collection":"scripting","hash":"4897989eaaca3c00b79893f1a8be7d93","indexed_by":"docs-index"}},{"content":"Three Stones\n\nThe classic three-stone layout.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ThreeStonesApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Creates the editable Three Stones group. |","metadata":{"title":"Three Stones","url":"https://www.rhinoartisan.com/docs/scripting/python/three-stones/","source":"https://www.rhinoartisan.com/docs/scripting/python/three-stones/","collection":"scripting","hash":"e504796adc9826adb0107fb988996549","indexed_by":"docs-index"}},{"content":"Three Stones — ra.threestones.create()\n\n```python\nra.three_stones.create(center_shape: str, center_carats: float, side_shape: str, side_carats: float, center_material=None, side_material=None, center_distance=None, center_rotation=None, side_distance=None, side_angle=None, side_rotation=None, side_rotation_y=None, finger_diameter=None) -> List[str]\n```\n\nCreates the editable Three Stones group. The center stone sits at the top of the finger size; the side stones mirror each other at `side_angle` degrees to each side, optionally leaning toward the center (`sideRotationY`). The stones always come from the arguments; the placement starts from the user's saved Three Stones defaults when there are any (an argument left at its signature default keeps the saved value), otherwise from the tool's own. `finger_diameter` 0 = the document's finger size. Returns the gem ids as [center, side A, side B] (the group also carries the finger reference circle).\n\n| Parameter | Type | |\n|---|---|---|\n| `center_shape` | `str` | required |\n| `center_carats` | `float` | required |\n| `side_shape` | `str` | required |\n| `side_carats` | `float` | required |\n| `center_material` | `str` | optional — None = the tool default |\n| `side_material` | `str` | optional — None = the tool default |\n| `center_distance` | `float` | optional — None = the tool default |\n| `center_rotation` | `float` | optional — None = the tool default |\n| `side_distance` | `float` | optional — None = the tool default |\n| `side_angle` | `float` | optional — None = the tool default |\n| `side_rotation` | `float` | optional — None = the tool default |\n| `side_rotation_y` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Three Stones","section":"ra.threestones.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/three-stones/#rathreestonescreate","source":"https://www.rhinoartisan.com/docs/scripting/python/three-stones/#rathreestonescreate","collection":"scripting","hash":"7db14733da02a71e12bc1d43d1356a50","indexed_by":"docs-index"}},{"content":"Time Tracking\n\nThe time tracker's records (the ArtisanTimeTracker panel), read-only: how long each saved file has been worked on, per day.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TimeTrackingApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `report()` | Time worked per file and per day, as the Time Tracker panel shows it. |","metadata":{"title":"Time Tracking","url":"https://www.rhinoartisan.com/docs/scripting/python/time-tracking/","source":"https://www.rhinoartisan.com/docs/scripting/python/time-tracking/","collection":"scripting","hash":"1e8143a1285fc6bc08968331ed4c893a","indexed_by":"docs-index"}},{"content":"Time Tracking — ra.timetracking.report()\n\n```python\nra.time_tracking.report(period=None, file=None) -> TimeTrackingReport\n```\n\nTime worked per file and per day, as the Time Tracker panel shows it. `period`: ALL (default), TODAY, WEEK (since Monday) or MONTH. `file` keeps only the files whose name or path contains it (case-insensitive). Reads the tracker's live records (the log file on disk can lag a few minutes). Read-only.\n\n| Parameter | Type | |\n|---|---|---|\n| `period` | `str` | optional — None = the tool default |\n| `file` | `str` | optional — None = the tool default |","metadata":{"title":"Time Tracking","section":"ra.timetracking.report()","url":"https://www.rhinoartisan.com/docs/scripting/python/time-tracking/#ratimetrackingreport","source":"https://www.rhinoartisan.com/docs/scripting/python/time-tracking/#ratimetrackingreport","collection":"scripting","hash":"0a00d2b3047f33c260212a42ddacaae0","indexed_by":"docs-index"}},{"content":"Toi Et Moi\n\nTwo stones facing each other.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ToiEtMoiApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Creates the editable Toi et Moi group. |\n\nra.toietmoi.create()\n```python\nra.toi_et_moi.create(shape_a: str, carats_a: float, shape_b: str, carats_b: float, material_a=None, material_b=None, angle_a=None, angle_b=None, rotation_ya=None, rotation_yb=None, distance=None, finger_diameter=None) -> List[str]\n```\n\nCreates the editable Toi et Moi group. Per stone: shape (GemShape name), carats and material; placement starts from the user's saved Toi et Moi defaults when there are any (an argument left at its signature default keeps the saved value), otherwise from the tool's (stone A at +14 degrees leaning +20, stone B mirrored), unless the angle/rotationY arguments say otherwise. `finger_diameter` 0 = the document's finger size. Returns the ids of the two gems (the group also carries the finger reference circle).\n\n| Parameter | Type | |\n|---|---|---|\n| `shape_a` | `str` | required |\n| `carats_a` | `float` | required |\n| `shape_b` | `str` | required |\n| `carats_b` | `float` | required |\n| `material_a` | `str` | optional — None = the tool default |\n| `material_b` | `str` | optional — None = the tool default |\n| `angle_a` | `float` | optional — None = the tool default |\n| `angle_b` | `float` | optional — None = the tool default |\n| `rotation_ya` | `float` | optional — None = the tool default |\n| `rotation_yb` | `float` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |","metadata":{"title":"Toi Et Moi","url":"https://www.rhinoartisan.com/docs/scripting/python/toi-et-moi/","source":"https://www.rhinoartisan.com/docs/scripting/python/toi-et-moi/","collection":"scripting","hash":"7bc8f9f35bfef092f1cbb46f66eb536a","indexed_by":"docs-index"}},{"content":"Transform\n\nMove, rotate, scale, mirror, arrays, deformations (bend, twist, taper), flow, placement on objects.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TransformApi`.","metadata":{"title":"Transform","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/","collection":"scripting","hash":"dfa7430110d09ce5ac8ab73dfb7b92ab","indexed_by":"docs-index"}},{"content":"Transform — Functions\n\n| Function | |\n|---|---|\n| `array_linear()` | Copies the objects `count` times in total (original included) along `step`: copy i sits at i * step. |\n| `array_on_curve()` | The ArtisanArrayOnCurve panel, headless: distributes copies of the objects along `curve_id`, each copy reoriented to the curve's perpendicular frame (the objects are expected modeled around the world origin on the XY plane, like the panel). |\n| `array_polar()` | The ArtisanArrayPolar panel, headless: revolves the objects around the axis of `plane` (\"TOP\" = around world Z, \"FRONT\" = around Y, \"SIDE\" = around X, \"CPLANE\" = the active viewport's construction plane), `copies` per row over `angle` degrees (alignment JUSTIFY spreads over the full 360 regardless of angle; LEFT/CENTER/RIGHT start the sweep before/around/after the original). |\n| `bend()` | Bends the objects around their bounding-box center (the ArtisanBend tool, headless). |\n| `center()` | The ArtisanCenter command, headless: translates the objects, as one set, so the center of their common world-axis bounding box lands on the world origin (0,0,0). |\n| `copies()` | The ArtisanCopies command, headless: duplicates the objects `count` times (1..100; 0 = 1) along -Y for a production tray, each copy one selection-height further (the union bounding box's Y extent), so multi-object models keep their parts together and the copies touch edge to edge. |\n| `copy_on_objects()` | The ArtisanCopyOnObjects command, headless: copies the objects onto the target objects, once per point in `points` (each point replicates one click of the command; the command loops until Enter). |","metadata":{"title":"Transform","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","collection":"scripting","hash":"90e6dc07887e63f8b7fc513374070bf9","indexed_by":"docs-index"}},{"content":"Transform — Functions\n\n| Function | |\n|---|---|\n| `distribute()` | The ArtisanDistribute command, headless: lays the objects out in a row along +X for a print/casting tray -- each piece resting on Z = 0 with its back edge on Y = 0, left edges chained with a 10 % gap of each piece's width. |\n| `duplicate()` | Duplicates the objects in place (a copy on top of each original) — the starting point of \"duplicate and vary\" Flow recipes. |\n| `flow_by_curve()` | The ArtisanSmartFlowbyCurve panel, headless: flows the objects from `base_curve_id` onto `target_curve_id` (Rhino's Flow space morph). |\n| `flow_by_surface()` | The ArtisanSmartFlowbySurface panel, headless: flows the objects from `base_surface_id` onto `target_surface_id` (Rhino's Sporph space morph; the first face of a polysurface/extrusion is used, like the panel). |\n| `mirror()` | Mirrors the objects across a world plane through `origin` (None = the world origin): \"XY\", \"YZ\" or \"XZ\". |\n| `mirror_opposite()` | The ArtisanMirrorOpposite command, headless: places one copy of each object on the opposite side of `plane`'s origin (None = the active viewport's construction plane, like the command; world XY when there is no view). |\n| `mirror_quad()` | The ArtisanMirrorQuad command, headless: mirrors the objects into the other three quadrants of `plane` (None = the active viewport's construction plane, like the command; world XY when there is no view). |\n| `move()` | Translates the objects by `translation` mm. |\n| `move_by_normal()` | The ArtisanMoveByNormal command, headless: moves each object along the normal of `surface_id` -- evaluated at the surface point closest to the object's bounding-box center, so each object follows its own local normal -- by `distance` mm (the command's initial default is 1.0; negative moves against the normal). |","metadata":{"title":"Transform","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","collection":"scripting","hash":"387729fd3b6f7ffdea77cab5cf65f0cf","indexed_by":"docs-index"}},{"content":"Transform — Functions\n\n| Function | |\n|---|---|\n| `move_on_objects()` | The ArtisanMoveOnObjects command, headless: same placement math as CopyOnObjects (same base mesh, same per-object frame from the mesh point and normal closest to the bounding-box center) but the objects are MOVED in place onto the single `point` (pulled onto the base mesh first, like the command's cursor constraint). |\n| `move_random()` | The ArtisanMoveRandom command, headless: moves EACH object by `distance` mm along its own random unit direction (a different direction per object), to break the perfect regularity of pave stones or beads. |\n| `orient_on_surface()` | The ArtisanOrientOnSurface command, headless: copies the objects onto `surface_id` (a surface/polysurface/extrusion), once per point in `points` (each point = one click of the command). |\n| `rotate()` | Rotates the objects `angle_degrees` around `axis` (\"X\", \"Y\" or \"Z\", world-oriented) through `center` (None = the center of the common bounding box, so the selection spins in place). |\n| `scale()` | Scales the objects by `factor` about `center` (None = the center of the common bounding box). |\n| `scale_by_center()` | The ArtisanScaleByCenter command, headless: scales the objects uniformly by `factor` (> 0; 1 = no change) about the center of their common bounding box, so the set grows/shrinks in place. |\n| `scale_by_weight()` | Uniformly scales the objects so they weigh exactly `target_grams` when cast in `metal` (the ArtisanScaleByWeight tool, headless). |\n| `scale_to_dimensions()` | The ArtisanScaleByDimensions panel, headless: scales the objects (as one set, about the center of their common world-axis bounding box) so that box measures exactly the given sizes, in mm. |","metadata":{"title":"Transform","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","collection":"scripting","hash":"adf6d5a49f0997d42abf260c5075ca50","indexed_by":"docs-index"}},{"content":"Transform — Functions\n\n| Function | |\n|---|---|\n| `taper()` | Tapers the objects along a bounding-box axis (the ArtisanTaper tool, headless): the section grows/shrinks linearly toward the \"Top\" end of the axis - tapered shanks, cone-ing a motif. |\n| `twist()` | Twists the objects `angle_degrees` around a bounding-box axis (the ArtisanTwist tool, headless) - rope-like shanks, twisted wires, spiral motifs. |","metadata":{"title":"Transform","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#functions","collection":"scripting","hash":"eb01ec65e5c4a36b4496510bd6e64441","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.arraylinear()\n\n```python\nra.transform.array_linear(object_ids=None, count=None, step=None) -> List[str]\n```\n\nCopies the objects `count` times in total (original included) along `step`: copy i sits at i * step. Returns the ids of the created copies ((count - 1) x objects).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `count` | `int` | optional — None = the tool default |\n| `step` | `Optional[VectorLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.arraylinear()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarraylinear","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarraylinear","collection":"scripting","hash":"8c481ae8bd7d9882eded5484fd90084d","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.arrayoncurve()\n\n```python\nra.transform.array_on_curve(object_ids=None, curve_id=None, copies=None, distance=None, alignment=None, mode=None, rotation=None, move_in_z=None, surface_ids=None, keep_original=None) -> List[str]\n```\n\nThe ArtisanArrayOnCurve panel, headless: distributes copies of the objects along `curve_id`, each copy reoriented to the curve's perpendicular frame (the objects are expected modeled around the world origin on the XY plane, like the panel). With `surface_ids` the frames also lean on those objects' render mesh normal — the panel's optional base surface, for arrays that hug a shank. `alignment` START/CENTER/END packs the run with `distance` mm between copies; JUSTIFY spreads `copies` evenly over the whole curve and ignores `distance`. `mode` END keeps the copies' ends inside the curve, CENTER lets the first/last centers sit on the curve ends. `rotation` (degrees, around the running axis) and `moveInZ` (mm) offset every copy. `keep_original` False deletes the source objects (the panel's default). Returns the ids of the created copies (copies x objects).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `copies` | `int` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |\n| `alignment` | `str` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `rotation` | `float` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `surface_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.arrayoncurve()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarrayoncurve","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarrayoncurve","collection":"scripting","hash":"3abf8fb496c1ce123c2499f764df703d","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.arraypolar()\n\n```python\nra.transform.array_polar(object_ids=None, copies=None, angle=None, plane=None, alignment=None, mode=None, rows=None, rows_distance=None, both_sides=None, keep_original=None) -> List[str]\n```\n\nThe ArtisanArrayPolar panel, headless: revolves the objects around the axis of `plane` (\"TOP\" = around world Z, \"FRONT\" = around Y, \"SIDE\" = around X, \"CPLANE\" = the active viewport's construction plane), `copies` per row over `angle` degrees (alignment JUSTIFY spreads over the full 360 regardless of angle; LEFT/CENTER/RIGHT start the sweep before/around/after the original). `mode` adds rows (\"ONE\" single row; \"MULTI\"/\"MULTI_INTER\" stack rows every rows_distance mm along the axis, INTER staggering odd rows half a step; the SPHERICAL variants wrap the rows around the axis origin instead — for domed pave). both_sides mirrors the extra rows below the first. `keep_original` False deletes the source objects (the panel's default: the first JUSTIFY copy lands on the original). Returns the ids of the created copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `copies` | `int` | optional — None = the tool default |\n| `angle` | `float` | optional — None = the tool default |\n| `plane` | `str` | optional — None = the tool default |\n| `alignment` | `str` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `rows` | `int` | optional — None = the tool default |\n| `rows_distance` | `float` | optional — None = the tool default |\n| `both_sides` | `bool` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.arraypolar()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarraypolar","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformarraypolar","collection":"scripting","hash":"c509dfa0317caf78a6d1104d9196d685","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.bend()\n\n```python\nra.transform.bend(object_ids: Sequence[IdLike], x_pos=None, x_neg=None, y_pos=None, y_neg=None, plane=None, rigid_ids=None, keep_original=None) -> List[str]\n```\n\nBends the objects around their bounding-box center (the ArtisanBend tool, headless). The jewelry move: curve a flat motif so it wraps the finger - e.g. bend a flat band or pattern around the ring curvature before a flow/boolean. For that, bend on the default \"XY\" plane with equal x_pos/x_neg and the amount that matches the finger diameter (see ra.document.get_ring_size().Diameter). `x_pos`, `x_neg`, `y_pos`, `y_neg` are how far (mm) each side of the bounding box is pushed along the bend plane's normal - exactly the four gumball handles of the panel. Positive lifts toward the plane normal, negative bends the other way, 0 leaves that side straight. At least one must be non-zero. Pass the same value to a pair for a symmetric bend (the panel's Symmetrical / Quad modes just mirror one handle onto the others). `plane` is the bend plane: \"XY\" (default, bends up in Z), \"ZX\" or \"YZ\". Returns the new object ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `x_pos` | `float` | optional — None = the tool default |\n| `x_neg` | `float` | optional — None = the tool default |\n| `y_pos` | `float` | optional — None = the tool default |\n| `y_neg` | `float` | optional — None = the tool default |\n| `plane` | `str` | optional — None = the tool default |\n| `rigid_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.bend()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformbend","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformbend","collection":"scripting","hash":"0f2e04422bf2e40dd210e2796694727b","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.center()\n\n```python\nra.transform.center(object_ids=None) -> List[str]\n```\n\nThe ArtisanCenter command, headless: translates the objects, as one set, so the center of their common world-axis bounding box lands on the world origin (0,0,0). In-place move; the arrangement between the objects is kept. Returns the ids of the moved objects.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.center()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcenter","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcenter","collection":"scripting","hash":"ef2c5251124c5bb1ee316692c194fb94","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.copies()\n\n```python\nra.transform.copies(object_ids=None, count=None) -> List[str]\n```\n\nThe ArtisanCopies command, headless: duplicates the objects `count` times (1..100; 0 = 1) along -Y for a production tray, each copy one selection-height further (the union bounding box's Y extent), so multi-object models keep their parts together and the copies touch edge to edge. Returns the ids of the copies (count x objects), in copy-major order.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `count` | `int` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.copies()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcopies","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcopies","collection":"scripting","hash":"9927b80e89e7b5998fd6ea593a834630","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.copyonobjects()\n\n```python\nra.transform.copy_on_objects(object_ids: Sequence[IdLike], target_ids: Sequence[IdLike], points: Sequence[PointLike]) -> List[str]\n```\n\nThe ArtisanCopyOnObjects command, headless: copies the objects onto the target objects, once per point in `points` (each point replicates one click of the command; the command loops until Enter). The frame is derived exactly like the command does: the targets are meshed (render-quality) into one base mesh; for each object, the mesh point and face normal closest to the object's bounding-box center define the origin plane, and the same offset applied at the picked point defines the destination plane -- so a group of objects keeps its arrangement and each copy reorients to the surface normal. Points are pulled onto the base mesh first, like the command's cursor constraint. Plain copies, no history/parametric link (the command records none). Returns the ids of the created copies (points x objects), in point-major order.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `target_ids` | `Sequence[IdLike]` | required |\n| `points` | `Sequence[PointLike]` | required |","metadata":{"title":"Transform","section":"ra.transform.copyonobjects()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcopyonobjects","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformcopyonobjects","collection":"scripting","hash":"e223950b6194298062c50445c540826c","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.distribute()\n\n```python\nra.transform.distribute(object_ids=None) -> List[str]\n```\n\nThe ArtisanDistribute command, headless: lays the objects out in a row along +X for a print/casting tray -- each piece resting on Z = 0 with its back edge on Y = 0, left edges chained with a 10 % gap of each piece's width. Objects sharing a Rhino group travel together as ONE piece (a ring + its gems is not dismembered); ungrouped objects are a piece each. Order = the order of the ids. In-place move; returns the ids moved.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.distribute()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformdistribute","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformdistribute","collection":"scripting","hash":"e6adc5df43fb78fa562dbaf5c70af1aa","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.duplicate()\n\n```python\nra.transform.duplicate(object_ids=None) -> List[str]\n```\n\nDuplicates the objects in place (a copy on top of each original) — the starting point of \"duplicate and vary\" Flow recipes. Returns the ids of the copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.duplicate()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformduplicate","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformduplicate","collection":"scripting","hash":"3e445de9c95f93eb363027864489be2b","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.flowbycurve()\n\n```python\nra.transform.flow_by_curve(deformable_ids: Sequence[IdLike], base_curve_id: IdLike, target_curve_id: IdLike, rigid_ids=None, flip_base=None) -> List[str]\n```\n\nThe ArtisanSmartFlowbyCurve panel, headless: flows the objects from `base_curve_id` onto `target_curve_id` (Rhino's Flow space morph). `deformable_ids` are morphed (a shank, a pattern...); `rigid_ids` keep their shape and are only re-placed along the curve (gems, settings). At least one of the two lists is required. `flip_base` reverses the base curve direction (the panel's flip button) when the result lands mirrored. Same bake as the panel's Accept: the originals stay, the deformed copies keep the source layer/material and carry Rhino history (editing either curve or the source re-flows them); rigid copies are TransformWithHistory copies. Returns the ids of the created copies (deformed first, then rigid).\n\n| Parameter | Type | |\n|---|---|---|\n| `deformable_ids` | `Sequence[IdLike]` | required |\n| `base_curve_id` | `IdLike` | required |\n| `target_curve_id` | `IdLike` | required |\n| `rigid_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `flip_base` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.flowbycurve()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformflowbycurve","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformflowbycurve","collection":"scripting","hash":"1b109892a906496cc006435f269e2ec6","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.flowbysurface()\n\n```python\nra.transform.flow_by_surface(deformable_ids: Sequence[IdLike], base_surface_id: IdLike, target_surface_id: IdLike, rigid_ids=None, base_orientation=None, target_orientation=None) -> List[str]\n```\n\nThe ArtisanSmartFlowbySurface panel, headless: flows the objects from `base_surface_id` onto `target_surface_id` (Rhino's Sporph space morph; the first face of a polysurface/extrusion is used, like the panel). `deformable_ids` are morphed, `rigid_ids` keep their shape and are re-placed frame-to-frame (gems, settings); at least one of the two lists is required. `base_orientation` / `target_orientation` are the panel's UV combos: \"None\" (default), \"ReverseU\", \"ReverseV\" or \"SwapUV\" -- use them when the result lands mirrored or rotated. Same bake as the Accept: originals stay, copies keep the source layer/material and carry Rhino history. Returns the ids of the created copies (deformed first, then rigid).\n\n| Parameter | Type | |\n|---|---|---|\n| `deformable_ids` | `Sequence[IdLike]` | required |\n| `base_surface_id` | `IdLike` | required |\n| `target_surface_id` | `IdLike` | required |\n| `rigid_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `base_orientation` | `str` | optional — None = the tool default |\n| `target_orientation` | `str` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.flowbysurface()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformflowbysurface","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformflowbysurface","collection":"scripting","hash":"cb7eb46a8eec5983834e8bd5331d37e2","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.mirror()\n\n```python\nra.transform.mirror(object_ids=None, plane=None, origin=None, copy=None) -> List[str]\n```\n\nMirrors the objects across a world plane through `origin` (None = the world origin): \"XY\", \"YZ\" or \"XZ\". Unlike the two jewelry mirrors (MirrorQuad/MirrorOpposite) this is the plain mirror, plain copies without history. `copy` False mirrors in place.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `plane` | `str` | optional — None = the tool default |\n| `origin` | `Optional[PointLike]` | optional — None = the tool default |\n| `copy` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.mirror()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirror","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirror","collection":"scripting","hash":"3dc2b3833b167a3d285c5e4a4f921d68","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.mirroropposite()\n\n```python\nra.transform.mirror_opposite(object_ids=None, plane=None) -> List[str]\n```\n\nThe ArtisanMirrorOpposite command, headless: places one copy of each object on the opposite side of `plane`'s origin (None = the active viewport's construction plane, like the command; world XY when there is no view). The two mirrors compose into a 180-degree rotation around the plane's vertical axis, so the copy keeps its handedness. History-linked copies, like the command. Returns the ids of the created copies (1 per object).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.mirroropposite()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirroropposite","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirroropposite","collection":"scripting","hash":"e40e0e4bb03175df1e12877d96842abd","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.mirrorquad()\n\n```python\nra.transform.mirror_quad(object_ids=None, plane=None) -> List[str]\n```\n\nThe ArtisanMirrorQuad command, headless: mirrors the objects into the other three quadrants of `plane` (None = the active viewport's construction plane, like the command; world XY when there is no view). Each object gets three history-linked copies -- across the plane's ZX plane, across its YZ plane, and across both -- so the four quadrants stay symmetric and the copies follow when the original is edited. Returns the ids of the created copies (3 per object).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.mirrorquad()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirrorquad","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmirrorquad","collection":"scripting","hash":"f1e9709d7dc5e088e6a7a2a9a158d237","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.move()\n\n```python\nra.transform.move(object_ids=None, translation=None, copy=None) -> List[str]\n```\n\nTranslates the objects by `translation` mm. `copy` True leaves the originals and returns the ids of the copies; False moves in place and returns the same ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `translation` | `Optional[VectorLike]` | optional — None = the tool default |\n| `copy` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.move()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmove","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmove","collection":"scripting","hash":"0b309294817b1c6db2b782d5e720c8e5","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.movebynormal()\n\n```python\nra.transform.move_by_normal(object_ids: Sequence[IdLike], surface_id: IdLike, distance=None) -> int\n```\n\nThe ArtisanMoveByNormal command, headless: moves each object along the normal of `surface_id` -- evaluated at the surface point closest to the object's bounding-box center, so each object follows its own local normal -- by `distance` mm (the command's initial default is 1.0; negative moves against the normal). `surface_id` must be a surface or a single-face polysurface/extrusion, like the command's surface pick. In-place moves: returns the number of objects moved.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `surface_id` | `IdLike` | required |\n| `distance` | `float` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.movebynormal()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmovebynormal","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmovebynormal","collection":"scripting","hash":"033a810c791569ba5babfcfcda53ffad","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.moveonobjects()\n\n```python\nra.transform.move_on_objects(object_ids: Sequence[IdLike], target_ids: Sequence[IdLike], point: PointLike) -> int\n```\n\nThe ArtisanMoveOnObjects command, headless: same placement math as CopyOnObjects (same base mesh, same per-object frame from the mesh point and normal closest to the bounding-box center) but the objects are MOVED in place onto the single `point` (pulled onto the base mesh first, like the command's cursor constraint). Returns the number of objects moved.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `target_ids` | `Sequence[IdLike]` | required |\n| `point` | `PointLike` | required |","metadata":{"title":"Transform","section":"ra.transform.moveonobjects()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmoveonobjects","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmoveonobjects","collection":"scripting","hash":"a14193f06f5ce027c1bdceb1b5d6a66b","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.moverandom()\n\n```python\nra.transform.move_random(object_ids=None, distance=None) -> List[str]\n```\n\nThe ArtisanMoveRandom command, headless: moves EACH object by `distance` mm along its own random unit direction (a different direction per object), to break the perfect regularity of pave stones or beads. 0 = the command's default distance, 0.05 mm; the command accepts -1000..1000. In-place move; returns the ids moved.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `distance` | `float` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.moverandom()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmoverandom","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformmoverandom","collection":"scripting","hash":"f07bf437ecd205d928b37c1440abd894","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.orientonsurface()\n\n```python\nra.transform.orient_on_surface(object_ids: Sequence[IdLike], surface_id: IdLike, points: Sequence[PointLike], scale=None, angle_degrees=None, normal_offset=None, alignment=None, flip=None) -> List[str]\n```\n\nThe ArtisanOrientOnSurface command, headless: copies the objects onto `surface_id` (a surface/polysurface/extrusion), once per point in `points` (each point = one click of the command). The set is anchored by the active construction plane (world XY headless) whose origin sits at the bounding-box `alignment` point (\"Center\" default, \"Top\" or \"Bottom\" = the box's top/bottom face center) and mapped to the surface frame at the point closest to each pick. Options as the command: `scale` (uniform, 0 = 1), `angle_degrees` (spin around the surface normal), `normal_offset` (mm along the normal, negative = into the surface) and `flip` (the command's Flip toggle: False = the command's default orientation, True = the other side). Returns the ids of the created copies (points x objects), in point-major order.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `surface_id` | `IdLike` | required |\n| `points` | `Sequence[PointLike]` | required |\n| `scale` | `float` | optional — None = the tool default |\n| `angle_degrees` | `float` | optional — None = the tool default |\n| `normal_offset` | `float` | optional — None = the tool default |\n| `alignment` | `str` | optional — None = the tool default |\n| `flip` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.orientonsurface()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformorientonsurface","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformorientonsurface","collection":"scripting","hash":"133786d4f421e6663458e136eca5215a","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.rotate()\n\n```python\nra.transform.rotate(object_ids=None, angle_degrees=None, axis=None, center=None, copy=None) -> List[str]\n```\n\nRotates the objects `angle_degrees` around `axis` (\"X\", \"Y\" or \"Z\", world-oriented) through `center` (None = the center of the common bounding box, so the selection spins in place). Positive angles are counter-clockwise looking down the axis. `copy` True rotates copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `angle_degrees` | `float` | optional — None = the tool default |\n| `axis` | `str` | optional — None = the tool default |\n| `center` | `Optional[PointLike]` | optional — None = the tool default |\n| `copy` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.rotate()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformrotate","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformrotate","collection":"scripting","hash":"0d4d5784c2758fbe6f50e9621b24dc23","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.scale()\n\n```python\nra.transform.scale(object_ids=None, factor=None, factor_y=None, factor_z=None, center=None, copy=None) -> List[str]\n```\n\nScales the objects by `factor` about `center` (None = the center of the common bounding box). `factorY`/`factorZ` 0 = same as `factor` (uniform); given, each axis scales by its own factor (world axes). `copy` True scales copies.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `factor` | `float` | optional — None = the tool default |\n| `factor_y` | `float` | optional — None = the tool default |\n| `factor_z` | `float` | optional — None = the tool default |\n| `center` | `Optional[PointLike]` | optional — None = the tool default |\n| `copy` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.scale()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscale","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscale","collection":"scripting","hash":"5f5a34e159d5f1edf736f516f70ad64a","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.scalebycenter()\n\n```python\nra.transform.scale_by_center(object_ids=None, factor=None) -> List[str]\n```\n\nThe ArtisanScaleByCenter command, headless: scales the objects uniformly by `factor` (> 0; 1 = no change) about the center of their common bounding box, so the set grows/shrinks in place. The scale plane is the active construction plane (world XY headless) moved to that center, like the command. In place; returns the ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `factor` | `float` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.scalebycenter()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscalebycenter","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscalebycenter","collection":"scripting","hash":"b73606b217d146e0b3f10bb16e518677","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.scalebyweight()\n\n```python\nra.transform.scale_by_weight(object_ids: Sequence[IdLike], target_grams: float, metal=None, keep_original=None) -> float\n```\n\nUniformly scales the objects so they weigh exactly `target_grams` when cast in `metal` (the ArtisanScaleByWeight tool, headless). `metal` empty/None = the document's primary metal; `keep_original` True scales a copy and leaves the original (the tool's DeleteOriginal toggle, inverted). Objects must be closed solids/ meshes for their volume to count. Returns the scale factor that was applied (1.0 = it already weighed the target).\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `target_grams` | `float` | required |\n| `metal` | `str` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.scalebyweight()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscalebyweight","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscalebyweight","collection":"scripting","hash":"98c213c3cc89ad8d64f0a5f4eee5368c","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.scaletodimensions()\n\n```python\nra.transform.scale_to_dimensions(object_ids: Sequence[IdLike], size_x=None, size_y=None, size_z=None, keep_aspect=None, keep_original=None) -> List[str]\n```\n\nThe ArtisanScaleByDimensions panel, headless: scales the objects (as one set, about the center of their common world-axis bounding box) so that box measures exactly the given sizes, in mm. 0 on an axis = leave that axis alone (factor from the other axes, or 1). With `keep_aspect` True (the panel's Keep Aspect toggle, on by default) exactly ONE of sizeX/sizeY/sizeZ must be given and the scale is uniform on the three axes -- \"make it 20 mm wide\". With `keep_aspect` False each given axis scales independently. An axis on which the selection is flat (zero extent) cannot be driven, same as the panel disabling that field. `keep_original` True scales a copy and leaves the original (the panel's Delete Original toggle, inverted; the panel default is to delete). Returns the ids of the resulting objects: new copies when `keep_original` is True, the same ids (scaled in place) otherwise.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `size_x` | `float` | optional — None = the tool default |\n| `size_y` | `float` | optional — None = the tool default |\n| `size_z` | `float` | optional — None = the tool default |\n| `keep_aspect` | `bool` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.scaletodimensions()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscaletodimensions","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformscaletodimensions","collection":"scripting","hash":"3db58fd07bf62d8a17c77923fed808c1","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.taper()\n\n```python\nra.transform.taper(object_ids: Sequence[IdLike], delta_mm: float, direction=None, mode=None, break_one=None, break_two=None, flat=None, infinite=None, rigid_ids=None, keep_original=None) -> List[str]\n```\n\nTapers the objects along a bounding-box axis (the ArtisanTaper tool, headless): the section grows/shrinks linearly toward the \"Top\" end of the axis - tapered shanks, cone-ing a motif. `delta_mm` is how much the half-width changes at the far end, in mm: positive widens, negative narrows; must be non-zero. `direction` and the `mode`/`break_one`/`break_two` trio work exactly like Twist's (defaults \"ZTop\", \"Uniform\", 0.5, 0.75). `flat` tapers only in the gumball plane's X (one-directional squeeze); `infinite` extends the taper beyond the axis ends instead of clamping. Returns the new object ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `delta_mm` | `float` | required |\n| `direction` | `str` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `break_one` | `float` | optional — None = the tool default |\n| `break_two` | `float` | optional — None = the tool default |\n| `flat` | `bool` | optional — None = the tool default |\n| `infinite` | `bool` | optional — None = the tool default |\n| `rigid_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.taper()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformtaper","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformtaper","collection":"scripting","hash":"f76e6b4e3ef8416cdead92a8fef37c1c","indexed_by":"docs-index"}},{"content":"Transform — ra.transform.twist()\n\n```python\nra.transform.twist(object_ids: Sequence[IdLike], angle_degrees: float, direction=None, mode=None, break_one=None, break_two=None, rigid_ids=None, keep_original=None) -> List[str]\n```\n\nTwists the objects `angle_degrees` around a bounding-box axis (the ArtisanTwist tool, headless) - rope-like shanks, twisted wires, spiral motifs. `direction` is the twist axis through the bounding box: \"ZTop\" (default), \"ZBottom\", \"YTop\", \"YBottom\", \"XTop\", \"XBottom\" - the \"Top\" end is the one that rotates. `mode` limits where the twist happens along that axis: \"Uniform\" (default, whole length), \"OneBreak\" (only past `break_one`) or \"TwoBreaks\" (only between `break_one` and `break_two`). The breaks are normalized 0-1 positions on the axis; 0 = the tool defaults (0.5 and 0.75). Circles are rebuilt to 10-point degree-3 curves before twisting (same as the command), so they can actually deform. Returns the new object ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `angle_degrees` | `float` | required |\n| `direction` | `str` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `break_one` | `float` | optional — None = the tool default |\n| `break_two` | `float` | optional — None = the tool default |\n| `rigid_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `keep_original` | `bool` | optional — None = the tool default |","metadata":{"title":"Transform","section":"ra.transform.twist()","url":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformtwist","source":"https://www.rhinoartisan.com/docs/scripting/python/transform/#ratransformtwist","collection":"scripting","hash":"ccd0a5e383e51909fcbe0cb5a9163a5f","indexed_by":"docs-index"}},{"content":"Trellis Gemset\n\nTrellis settings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TrellisGemsetApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `TrellisGemset` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `TrellisGemset` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a trellis gemset (four crossing prongs descending from the gem girdle to a ring curve, plus an optional upper rail) around an existing gem -- the ArtisanTrellisGemset tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `TrellisGemset` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Trellis gemsets currently selected in the active doc. |","metadata":{"title":"Trellis Gemset","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/","collection":"scripting","hash":"8078ae2d3d12f7898eebdbdb055f52d2","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.all()\n\n```python\nra.trellis_gemset.all() -> List[TrellisGemset]\n```\n\n`TrellisGemset` handles for every object of this kind in the active document (empty when there is no document).\n\nra.trellisgemset.bylayer()\n```python\nra.trellis_gemset.by_layer(layer_name: str) -> List[TrellisGemset]\n```\n\n`TrellisGemset` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetall","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetall","collection":"scripting","hash":"691455dfcee6dd251c37047be5ffe18d","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.count()\n\n```python\nra.trellis_gemset.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcount","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcount","collection":"scripting","hash":"397975522f65445a563cdfc1c795b898","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.create()\n\n```python\nra.trellis_gemset.create(gem_id: IdLike, prongs_diameter=None, opening_angle=None, curve_vertical_separation=None, rail_width=None, rail_height=None, rotate90=None, ring_curve_id=None, prong_mode=None) -> TrellisGemset\n```\n\nBuilds a trellis gemset (four crossing prongs descending from the gem girdle to a ring curve, plus an optional upper rail) around an existing gem -- the ArtisanTrellisGemset tool, headless. `gem_id` must be a gem in the active document; pointed / irregular outlines (PEAR, HEART, TRILLION, TRIANGLE, CALF, COFFIN, BAGUETTE) are not supported. Millimetres / degrees; omitting keeps the tool default (or the user's saved defaults): prongs_diameter 1.05, opening_angle 52, curve_vertical_separation 5.6, rail_width 1.5, rail_height 1.2. `rotate90` True rotates the whole gemset 90 degrees around the gem's table normal (False keeps the model's value). `ring_curve_id` picks an existing document curve the prongs land on -- it must lie entirely below the gem girdle; None (the default) generates the same finger-size circle under the gem the panel builds. `prong_mode` is ROUND (default) or CLAW, the top of every prong (DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and tuned through the handle (SetClawCapDistance...). Returns an TrellisGemset handle to the new trellis group.","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcreate","collection":"scripting","hash":"55793bf260dd9874e4e1877b67d6c364","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `prongs_diameter` | `float` | optional — None = the tool default |\n| `opening_angle` | `float` | optional — None = the tool default |\n| `curve_vertical_separation` | `float` | optional — None = the tool default |\n| `rail_width` | `float` | optional — None = the tool default |\n| `rail_height` | `float` | optional — None = the tool default |\n| `rotate90` | `Optional[bool]` | optional — None = the tool default |\n| `ring_curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetcreate","collection":"scripting","hash":"27a4ce695278964b2eb7a41b853468fe","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.find()\n\n```python\nra.trellis_gemset.find(id: IdLike) -> TrellisGemset\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.trellisgemset.forgem()\n```python\nra.trellis_gemset.for_gem(gem_id: IdLike) -> List[TrellisGemset]\n```\n\n`TrellisGemset` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetfind","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetfind","collection":"scripting","hash":"e489bd2a67154bfe4fc8dbde8180c9b8","indexed_by":"docs-index"}},{"content":"Trellis Gemset — ra.trellisgemset.selected()\n\n```python\nra.trellis_gemset.selected() -> List[TrellisGemset]\n```\n\nTrellis gemsets currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Trellis Gemset","section":"ra.trellisgemset.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetselected","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#ratrellisgemsetselected","collection":"scripting","hash":"7bd3cca4d6009413a3bf6603fbd41332","indexed_by":"docs-index"}},{"content":"Trellis Gemset — TrellisGemset (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom_profile` | `str` | yes | \"CIRCLE\" \\| \"SQUARE\" \\| \"CUSTOM\" |\n| `claw_cap_distance` | `float` | yes | The claw actually built, the same numbers as on a martini: mm the apex is pulled in toward the gem centre. (The panel shows these as adjustments from None = the default claw: 1.00 / -0.50 / 0.25 / 0.05.) |\n| `claw_cap_height` | `float` | yes | mm the apex moves up (+) or down (-) |\n| `claw_tip_smoothness` | `float` | yes | body-to-tip blend, 0-1 |\n| `claw_tip_width` | `float` | yes | apex thickness as a fraction of the prong: 0 sharp point - 1 full |\n| `cross_height` | `float` | yes | signed |\n| `curve_vertical_separation` | `float` | yes | Vertical gap between the gem girdle plane and the top of the auto-generated default ring curve (only meaningful when no ring curve was selected). |\n| `face_tangent` | `bool` | yes | |\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | signed |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `opening_angle` | `float` | yes | |\n| `over_girdle` | `float` | yes | |\n| `position` | `Point3d` | | |\n| `prong_mode` | `str` | yes | Construction modes and the rest of the current values. The top of every prong: \"ROUND\" \\| \"CLAW\" (claw tips are built in Render mode only); BottomProfile is the section at the bottom. |\n| `prongs_diameter` | `float` | yes | Crossing prongs (the trellis \"X\" descending from the gem girdle to the ring curve). Millimetres / degrees. |\n| `ring_curve_id` | `str` | | Rhino id of the ring curve the trellis was built on, or None when the auto-generated default curve under the gem was used. |\n| `ring_separation_y` | `float` | yes | |","metadata":{"title":"Trellis Gemset","section":"TrellisGemset (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#trellisgemset-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#trellisgemset-handle","collection":"scripting","hash":"2c540408f4a4c883821804ab099cc88b","indexed_by":"docs-index"}},{"content":"Trellis Gemset — TrellisGemset (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `rotate90` | `bool` | yes | |\n| `upper_rail_enabled` | `bool` | yes | Upper rail wrapping the gem under the girdle. |\n| `upper_rail_height` | `float` | yes | |\n| `upper_rail_mode` | `str` | yes | \"CIRCLE\" \\| \"CUSTOM\" |\n| `upper_rail_width` | `float` | yes | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_bottom_height(height: float)` | |\n| `set_bottom_width(width: float)` | |\n| `set_extension_for_manufacturing(extension: float)` | |\n| `set_profile_start(start: float)` | 0-0.95 |\n| `set_upper_rail_chamfer(chamfer: bool)` | |\n| `set_upper_rail_chamfer_offset(offset: float)` | signed |\n| `set_upper_rail_external_x(x: float)` | |\n| `set_upper_rail_external_y(y: float)` | |\n| `set_upper_rail_height_under_girdle(height: float)` | |\n| `set_upper_rail_profile(asset_name: str)` | CLOSED_PROFILE asset |\n| `set_upper_rail_rotation(degrees: float)` | signed |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Trellis Gemset","section":"TrellisGemset (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#trellisgemset-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/trellis-gemset/#trellisgemset-handle","collection":"scripting","hash":"48c87745cc04a61b25f6f74367510c9b","indexed_by":"docs-index"}},{"content":"Trilogy\n\nThree-stone families: trellis, halo, individual, bezel set, east-west.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TrilogyApi`.","metadata":{"title":"Trilogy","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/","collection":"scripting","hash":"3cb3786e552b33ee60a42d94ebee053e","indexed_by":"docs-index"}},{"content":"Trilogy — Functions\n\n| Function | |\n|---|---|\n| `all()` | `Trilogy` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Trilogy` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create_bezel_set()` | Three bezels on a Three Stones (ArtisanTrilogyBezelSet, headless): one bezel per gem, the two sides sharing the center's parameters unless `side_edition` (or any side* argument) splits them. |\n| `create_east_west()` | Three advanced baskets on a Three Stones (ArtisanTrilogyEastWest, headless). |\n| `create_halo()` | Three halos on a Three Stones (ArtisanTrilogyHalo, headless): the side halos share the center's parameters unless `side_edition` (or a side* argument) splits them; `cut_sides_with_center` (default on) fuses the sides into the center halo, `cut_by_ring_size` trims them flush with the ring. |\n| `create_individual()` | One setting per slot on a Three Stones (ArtisanTrilogyIndividual, headless): `center_setting` / `side_setting` are TULIP, MARTINI or ADVANCED_BASKET (defaults: tulip in the center, advanced basket -- a single rail -- on the sides). |\n| `create_trellis()` | Trellis gemset on a Three Stones (ArtisanTrilogyTrellis, headless): 4 shank prongs from the side gems down to the ring curve, 4 cross prongs over the center stone and three under-girdle rails. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Trilogy` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | `Trilogy` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Trilogy","section":"Functions","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#functions","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#functions","collection":"scripting","hash":"cebef31dff15e2698b05d2ca9e857cd4","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.all()\n\n```python\nra.trilogy.all() -> List[Trilogy]\n```\n\n`Trilogy` handles for every object of this kind in the active document (empty when there is no document).\n\nra.trilogy.bylayer()\n```python\nra.trilogy.by_layer(layer_name: str) -> List[Trilogy]\n```\n\n`Trilogy` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Trilogy","section":"ra.trilogy.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyall","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyall","collection":"scripting","hash":"d5ff6d76379b906170ea63a61991b33f","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.count()\n\n```python\nra.trilogy.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Trilogy","section":"ra.trilogy.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycount","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycount","collection":"scripting","hash":"87e413d097c52eb0e40c986e169987ea","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createbezelset()\n\n```python\nra.trilogy.create_bezel_set(gem_id=None, gem_ids=None, height=None, width=None, girdle_height=None, girdle_width=None, gem_inside=None, profile=None, support_count=None, side_edition=None, side_height=None, side_width=None, side_girdle_height=None, side_girdle_width=None, cut_by_ring_size=None, cut_by_ring_size_sides=None, element=None) -> TrilogyResult\n```\n\nThree bezels on a Three Stones (ArtisanTrilogyBezelSet, headless): one bezel per gem, the two sides sharing the center's parameters unless `side_edition` (or any side* argument) splits them. mm; 0 = the tool/saved default (height 3.8, width 1.5, girdle 0.3 x 1.5). `profile` names a BEZEL_PROFILE asset; `cut_by_ring_size` trims the bezels flush with the ring size. Returns the TrilogyResult (ids).","metadata":{"title":"Trilogy","section":"ra.trilogy.createbezelset()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatebezelset","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatebezelset","collection":"scripting","hash":"0348f2098444579906f5c97203616a75","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createbezelset()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `width` | `float` | optional — None = the tool default |\n| `girdle_height` | `float` | optional — None = the tool default |\n| `girdle_width` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `support_count` | `int` | optional — None = the tool default |\n| `side_edition` | `Optional[bool]` | optional — None = the tool default |\n| `side_height` | `float` | optional — None = the tool default |\n| `side_width` | `float` | optional — None = the tool default |\n| `side_girdle_height` | `float` | optional — None = the tool default |\n| `side_girdle_width` | `float` | optional — None = the tool default |\n| `cut_by_ring_size` | `Optional[bool]` | optional — None = the tool default |\n| `cut_by_ring_size_sides` | `Optional[bool]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Trilogy","section":"ra.trilogy.createbezelset()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatebezelset","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatebezelset","collection":"scripting","hash":"1e5bdf581f27e68f9d1e8a2e8a984b3f","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createeastwest()\n\n```python\nra.trilogy.create_east_west(gem_id=None, gem_ids=None, preset=None, side_preset=None, prong_mode=None, prong_diameter=None, prong_height=None, rail_width=None, rail_height=None, rail_profile=None, side_edition=None, element=None) -> TrilogyResult\n```\n\nThree advanced baskets on a Three Stones (ArtisanTrilogyEastWest, headless). Each basket takes its gem shape's default prong layout (emerald -> 4 corners, trillion -> 3 vertices...) unless `preset` / `side_preset` name another one (ra.advanced_basket.presets names, e.g. PRONG_ROUND_6, or a 1-based index). Sides share the center's basket when both shapes match; different shapes (or `side_edition`) give them their own. mm; None = the default. Returns the TrilogyResult.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `preset` | `str` | optional — None = the tool default |\n| `side_preset` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |\n| `prong_diameter` | `float` | optional — None = the tool default |\n| `prong_height` | `float` | optional — None = the tool default |\n| `rail_width` | `float` | optional — None = the tool default |\n| `rail_height` | `float` | optional — None = the tool default |\n| `rail_profile` | `str` | optional — None = the tool default |\n| `side_edition` | `Optional[bool]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Trilogy","section":"ra.trilogy.createeastwest()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreateeastwest","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreateeastwest","collection":"scripting","hash":"70f96650077505f72dcbf4199af346c3","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createhalo()\n\n```python\nra.trilogy.create_halo(gem_id=None, gem_ids=None, stone_size=None, stone_distance=None, distance_to_gem=None, channel_width=None, channel_height=None, prong_type=None, profile=None, cut_by_ring_size=None, cut_sides_with_center=None, side_edition=None, side_stone_size=None, side_stone_distance=None, side_channel_width=None, side_channel_height=None, ring_curve_id=None, element=None, prong_mode=None) -> TrilogyResult\n```\n\nThree halos on a Three Stones (ArtisanTrilogyHalo, headless): the side halos share the center's parameters unless `side_edition` (or a side* argument) splits them; `cut_sides_with_center` (default on) fuses the sides into the center halo, `cut_by_ring_size` trims them flush with the ring. Gems must be halo-friendly (ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER, PEAR). mm; None = the default (stone 1.2, distance 0.2, channel 1.8 x 1.5). `profile` = CHANNEL_PROFILE asset. `prong_mode` = the three stones' prongs: ROUND, CUSTOM or CLAW (claw tips in Render mode only). Returns the TrilogyResult (halo stones in StoneIds).","metadata":{"title":"Trilogy","section":"ra.trilogy.createhalo()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatehalo","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatehalo","collection":"scripting","hash":"9031c9107b75d0542a25b29f2e923589","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createhalo()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `stone_size` | `float` | optional — None = the tool default |\n| `stone_distance` | `float` | optional — None = the tool default |\n| `distance_to_gem` | `float` | optional — None = the tool default |\n| `channel_width` | `float` | optional — None = the tool default |\n| `channel_height` | `float` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `cut_by_ring_size` | `Optional[bool]` | optional — None = the tool default |\n| `cut_sides_with_center` | `Optional[bool]` | optional — None = the tool default |\n| `side_edition` | `Optional[bool]` | optional — None = the tool default |\n| `side_stone_size` | `float` | optional — None = the tool default |\n| `side_stone_distance` | `float` | optional — None = the tool default |\n| `side_channel_width` | `float` | optional — None = the tool default |\n| `side_channel_height` | `float` | optional — None = the tool default |\n| `ring_curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Trilogy","section":"ra.trilogy.createhalo()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatehalo","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatehalo","collection":"scripting","hash":"64b4ee65a919f605705eca61ec1c3776","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createindividual()\n\n```python\nra.trilogy.create_individual(gem_id=None, gem_ids=None, center_setting=None, side_setting=None, center_rotation=None, side_rotation=None, tulip_prongs=None, rail_profile=None, scale_setting_to_gem=None, ring_curve_id=None, element=None, prong_mode=None) -> TrilogyResult\n```\n\nOne setting per slot on a Three Stones (ArtisanTrilogyIndividual, headless): `center_setting` / `side_setting` are TULIP, MARTINI or ADVANCED_BASKET (defaults: tulip in the center, advanced basket -- a single rail -- on the sides). `center_rotation` / `side_rotation` spin each setting about its gem (degrees; default 45 for a ROUND center, 0 otherwise); `tulip_prongs` 4 or 6. `prong_mode` ROUND or CLAW on whichever setting each slot uses (claw tips in Render mode only). Returns the TrilogyResult.\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `center_setting` | `str` | optional — None = the tool default |\n| `side_setting` | `str` | optional — None = the tool default |\n| `center_rotation` | `float` | optional — None = the tool default |\n| `side_rotation` | `float` | optional — None = the tool default |\n| `tulip_prongs` | `int` | optional — None = the tool default |\n| `rail_profile` | `str` | optional — None = the tool default |\n| `scale_setting_to_gem` | `Optional[bool]` | optional — None = the tool default |\n| `ring_curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Trilogy","section":"ra.trilogy.createindividual()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreateindividual","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreateindividual","collection":"scripting","hash":"5c2453db0a5ee2c4a97ba224b360dc4e","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createtrellis()\n\n```python\nra.trilogy.create_trellis(gem_id=None, gem_ids=None, shank_prong_diameter=None, cross_prong_diameter=None, rail_width=None, rail_height=None, rail_under_girdle=None, center_rail=None, side_rails=None, curve_vertical_separation=None, side_rail_edition=None, side_rail_width=None, side_rail_height=None, ring_curve_id=None, element=None, prong_mode=None) -> TrilogyResult\n```\n\nTrellis gemset on a Three Stones (ArtisanTrilogyTrellis, headless): 4 shank prongs from the side gems down to the ring curve, 4 cross prongs over the center stone and three under-girdle rails. The ring curve is the set's finger circle, `ring_curve_id` (must sit below the gems) or a circle at the document size. mm; None = the default (prongs 1.05, rail 1.0 x 0.9, under girdle 1.45). `prong_mode` ROUND or CLAW, the top of every prong (claw tips in Render mode only). Returns the TrilogyResult.","metadata":{"title":"Trilogy","section":"ra.trilogy.createtrellis()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatetrellis","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatetrellis","collection":"scripting","hash":"b86260e27dadac2d9a26fcc83f3c2a5c","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.createtrellis()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `gem_ids` | `Sequence[IdLike]` | optional — None = the tool default |\n| `shank_prong_diameter` | `float` | optional — None = the tool default |\n| `cross_prong_diameter` | `float` | optional — None = the tool default |\n| `rail_width` | `float` | optional — None = the tool default |\n| `rail_height` | `float` | optional — None = the tool default |\n| `rail_under_girdle` | `float` | optional — None = the tool default |\n| `center_rail` | `Optional[bool]` | optional — None = the tool default |\n| `side_rails` | `Optional[bool]` | optional — None = the tool default |\n| `curve_vertical_separation` | `float` | optional — None = the tool default |\n| `side_rail_edition` | `Optional[bool]` | optional — None = the tool default |\n| `side_rail_width` | `float` | optional — None = the tool default |\n| `side_rail_height` | `float` | optional — None = the tool default |\n| `ring_curve_id` | `Optional[IdLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Trilogy","section":"ra.trilogy.createtrellis()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatetrellis","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogycreatetrellis","collection":"scripting","hash":"32ff8a3fc3e63c672428fbad61c617fc","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.find()\n\n```python\nra.trilogy.find(id: IdLike) -> Trilogy\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.trilogy.forgem()\n```python\nra.trilogy.for_gem(gem_id: IdLike) -> List[Trilogy]\n```\n\n`Trilogy` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Trilogy","section":"ra.trilogy.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyfind","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyfind","collection":"scripting","hash":"b2f9bf84f8a1b78571e55b8d7c0b6a75","indexed_by":"docs-index"}},{"content":"Trilogy — ra.trilogy.selected()\n\n```python\nra.trilogy.selected() -> List[Trilogy]\n```\n\n`Trilogy` handles for the objects of this kind currently selected in the active document.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Trilogy","section":"ra.trilogy.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyselected","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#ratrilogyselected","collection":"scripting","hash":"d77c66dcc67a6f3403f84280a5a4799a","indexed_by":"docs-index"}},{"content":"Trilogy — Trilogy (handle)\n\nThe five Trilogy settings (bezel set, east-west, halo, individual, trellis) dressed over a Three Stones.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `center_gem_id` | `str` | | |\n| `layer_name` | `str` | | |\n| `member_count` | `int` | | Rhino objects in the group |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `parameters_json` | `str` | | the kernel model, as stored in the group |\n| `position` | `Point3d` | | |\n| `ring_curve_id` | `str` | | |\n| `side_a_gem_id` | `str` | | |\n| `side_b_gem_id` | `str` | | |\n| `style` | `str` | | BEZEL_SET \\| EAST_WEST \\| HALO \\| INDIVIDUAL \\| TRELLIS |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `get_parameter(path: str) -> str` | dotted JSON path; None when absent |\n| `move(translation: VectorLike)` | |\n| `regenerate()` | |\n| `set_element(element: str)` | Applies a saved element of this trilogy's own style (ra.elements.list (\"TrilogyHalo\") for a HALO...) in place: the gems stay, a preset of another style is rejected, and the trilogy regenerates (same id). |\n| `set_parameter(path: str, value: str)` | regenerates in place (same id) |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Trilogy","section":"Trilogy (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#trilogy-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/trilogy/#trilogy-handle","collection":"scripting","hash":"559bc66b728a02664843f6d5c6972f84","indexed_by":"docs-index"}},{"content":"Tulip\n\nTulip settings.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TulipApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Tulip` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Tulip` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `create()` | Builds a tulip setting -- petal-shaped SubD prongs holding an existing gem -- the ArtisanTulip tool, headless. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `for_gem()` | `Tulip` handles whose mother gem is `gem_id` (empty for None). |\n| `selected()` | Tulips currently selected in the active doc. |","metadata":{"title":"Tulip","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/","collection":"scripting","hash":"c0eab4242ab948fec96c6d8672cb5a11","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.all()\n\n```python\nra.tulip.all() -> List[Tulip]\n```\n\n`Tulip` handles for every object of this kind in the active document (empty when there is no document).\n\nra.tulip.bylayer()\n```python\nra.tulip.by_layer(layer_name: str) -> List[Tulip]\n```\n\n`Tulip` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Tulip","section":"ra.tulip.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipall","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipall","collection":"scripting","hash":"1503f7c46b898fa9e37b4a334359ccb7","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.count()\n\n```python\nra.tulip.count() -> int\n```\n\nNumber of objects of this kind in the active document.","metadata":{"title":"Tulip","section":"ra.tulip.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcount","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcount","collection":"scripting","hash":"919039b35621ff282e4986557c089d8a","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.create()\n\n```python\nra.tulip.create(gem_id: IdLike, prong_count=None, pipe_diameter=None, height=None, bulge_width=None, mode=None, ornament=None, ornament_placement=None, ornament_diameter=None, gem_inside=None, move_in_z=None, bulge_inside=None, bulge_spread=None, cap_distance_to_center=None, cap_height=None, tip_width=None, prong_mode=None) -> Tulip\n```\n\nBuilds a tulip setting -- petal-shaped SubD prongs holding an existing gem -- the ArtisanTulip tool, headless. `gem_id` must be a gem in the active document; any shape works. On asymmetric stones (oval, marquise, ...) the ornament placement defaults to the X axis with per-axis leaf editing, exactly like the panel. omitting keeps the tool default (or the user's saved defaults): prong_count 4 (valid values 4 or 6), pipe_diameter 1.15 mm, height 1.7 (a vertical SCALE FACTOR of the whole setting, not mm), bulge_width 1.5 (multiplier on the reference tangential bow). `prong_mode` is ROUND (default) or CLAW (`mode` is its older name; DEFAULT and CIRCLE also mean ROUND); claw tips are built in Render mode only and shaped by `cap_distance_to_center`, `cap_height` and `tip_width` here or the handle's Claw* setters. `ornament` is NONE (default), UNION or LEAF. Returns an Tulip handle to the new tulip group.","metadata":{"title":"Tulip","section":"ra.tulip.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcreate","collection":"scripting","hash":"2f1037d01ed82e84d40c8605b4687001","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |\n| `prong_count` | `int` | optional — None = the tool default |\n| `pipe_diameter` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `bulge_width` | `float` | optional — None = the tool default |\n| `mode` | `str` | optional — None = the tool default |\n| `ornament` | `str` | optional — None = the tool default |\n| `ornament_placement` | `str` | optional — None = the tool default |\n| `ornament_diameter` | `float` | optional — None = the tool default |\n| `gem_inside` | `float` | optional — None = the tool default |\n| `move_in_z` | `float` | optional — None = the tool default |\n| `bulge_inside` | `float` | optional — None = the tool default |\n| `bulge_spread` | `float` | optional — None = the tool default |\n| `cap_distance_to_center` | `float` | optional — None = the tool default |\n| `cap_height` | `float` | optional — None = the tool default |\n| `tip_width` | `float` | optional — None = the tool default |\n| `prong_mode` | `str` | optional — None = the tool default |","metadata":{"title":"Tulip","section":"ra.tulip.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipcreate","collection":"scripting","hash":"39c168d51ac565046ce3155476eb22f9","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.find()\n\n```python\nra.tulip.find(id: IdLike) -> Tulip\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |\n\nra.tulip.forgem()\n```python\nra.tulip.for_gem(gem_id: IdLike) -> List[Tulip]\n```\n\n`Tulip` handles whose mother gem is `gem_id` (empty for None).\n\n| Parameter | Type | |\n|---|---|---|\n| `gem_id` | `IdLike` | required |","metadata":{"title":"Tulip","section":"ra.tulip.find()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipfind","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipfind","collection":"scripting","hash":"6c14757a8f287352bdea99e14f4266ea","indexed_by":"docs-index"}},{"content":"Tulip — ra.tulip.selected()\n\n```python\nra.tulip.selected() -> List[Tulip]\n```\n\nTulips currently selected in the active doc.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Tulip","section":"ra.tulip.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipselected","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#ratulipselected","collection":"scripting","hash":"f779862c5f964e560f400ed451fd2ee4","indexed_by":"docs-index"}},{"content":"Tulip — Tulip (handle)\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bulge_width` | `float` | yes | the model's DepthBulge |\n| `claw_cap_distance` | `float` | yes | The claw tips, CLAW mode only (built in Render mode only), under the names the other settings use. The cap distance (in toward the gem centre) and height (up/down) scale with the stone: mm at the tulip's reference size. |\n| `claw_cap_height` | `float` | yes | |\n| `claw_tip_length` | `float` | yes | length of the claw tip, times the tube diameter (default 1) |\n| `claw_tip_smoothness` | `float` | yes | body-to-tip blend, 0-1 (the panel leaves it at 0) |\n| `claw_tip_width` | `float` | yes | apex thickness as a fraction of the petal tube: 0 sharp point - 1 full |\n| `gem_carat_weight` | `float` | | |\n| `gem_inside` | `float` | yes | signed |\n| `gem_material` | `str` | | |\n| `gem_shape` | `str` | | |\n| `height` | `float` | yes | vertical scale factor (not mm) |\n| `layer_name` | `str` | | |\n| `mode` | `str` | yes | \"Round\" or \"Claw\" (older name of ProngMode) |\n| `mother_gem_id` | `str` | | |\n| `move_in_z` | `float` | yes | signed |\n| `object_type` | `str` | | |\n| `ornament` | `str` | yes | \"None\", \"Union\" or \"Leaf\" |\n| `ornament_placement` | `str` | yes | \"AXIS_X\", \"AXIS_Y\" or \"BOTH\" |\n| `pipe_diameter` | `float` | yes | mm |\n| `position` | `Point3d` | | |\n| `prong_count` | `int` | yes | Petal prongs holding the center gem 4 or 6 |\n| `prong_mode` | `str` | yes | \"ROUND\" or \"CLAW\", as on every setting with prongs |","metadata":{"title":"Tulip","section":"Tulip (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#tulip-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#tulip-handle","collection":"scripting","hash":"b08e5237bcf16186019d6dd368884dcc","indexed_by":"docs-index"}},{"content":"Tulip — Tulip (handle)\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_bulge_close_bottom(close: float)` | |\n| `set_bulge_close_top(close: float)` | |\n| `set_bulge_inside(bulge_inside: float)` | signed |\n| `set_bulge_spread(spread: float)` | |\n| `set_cap_distance_to_center(distance: float)` | Older names of SetClawCapDistance, SetClawCapHeight and SetClawTipWidth. |\n| `set_cap_height(height: float)` | |\n| `set_extension_for_manufacturing(extension: float)` | |\n| `set_ornament_diameter(diameter: float)` | |\n| `set_tip_width(width: float)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Tulip","section":"Tulip (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#tulip-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/tulip/#tulip-handle","collection":"scripting","hash":"18dc907c649146f10d2696c84e73fce2","indexed_by":"docs-index"}},{"content":"Two Rows Shank\n\nTwo-row shanks.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.TwoRowsShankApi`, `ArtisanPlugin.Scripting.TwoRowsShankBuilderApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `TwoRowsShank` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `TwoRowsShank` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `TwoRowsShank` handles for the objects of this kind currently selected in the active document. |\n| `create()` | Builds a two-rows shank (the ArtisanTwoRowsShank tool, headless): a classic band with a channel carved on each face, each carrying a row of round stones held by prongs. |","metadata":{"title":"Two Rows Shank","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/","collection":"scripting","hash":"ea6622a0d809b2fde7eb008fea0b0224","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ra.tworowsshank.all()\n\n```python\nra.two_rows_shank.all() -> List[TwoRowsShank]\n```\n\n`TwoRowsShank` handles for every object of this kind in the active document (empty when there is no document).\n\nra.tworowsshank.bylayer()\n```python\nra.two_rows_shank.by_layer(layer_name: str) -> List[TwoRowsShank]\n```\n\n`TwoRowsShank` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Two Rows Shank","section":"ra.tworowsshank.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankall","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankall","collection":"scripting","hash":"22cc6a3eafb87a47e11a1a403873fcd1","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ra.tworowsshank.count()\n\n```python\nra.two_rows_shank.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.tworowsshank.find()\n```python\nra.two_rows_shank.find(id: IdLike) -> TwoRowsShank\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Two Rows Shank","section":"ra.tworowsshank.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcount","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcount","collection":"scripting","hash":"19693642c96151b61790a02ad1fe109a","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ra.tworowsshank.selected()\n\n```python\nra.two_rows_shank.selected() -> List[TwoRowsShank]\n```\n\n`TwoRowsShank` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Two Rows Shank","section":"ra.tworowsshank.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankselected","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankselected","collection":"scripting","hash":"9205796e6e62f423739a7ce0651e7e3c","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ra.tworowsshank.create()\n\n```python\nra.two_rows_shank.create(width=None, height=None, finger_diameter=None, profile=None, layout_mode=None, top_angle=None, start_angle=None, end_angle=None, gem_size=None, channel_width=None, channel_offset=None, rail_mode=None, with_gems=None, with_cutters=None, plane=None, element=None) -> TwoRowsShank\n```\n\nBuilds a two-rows shank (the ArtisanTwoRowsShank tool, headless): a classic band with a channel carved on each face, each carrying a row of round stones held by prongs. Millimetres; omitting keeps the tool default (or the user's saved defaults): width 3, height 2 (band section), gem_size 1.0, channel_width 1.3 (span along the face), channel_offset 0.3 (depth carved into the band). `layout_mode` \"FULL\" | \"SIDE_ANGLE\" (uses start_angle / end_angle, defaults 30-150) | \"TOP_ANGLE\" (uses top_angle, default 60; the tool default). `rail_mode` \"DOUBLE\" (one channel per face, the default) | \"SINGLE\" (one wide channel). `with_gems` False bakes the carved band alone; `with_cutters` adds a parametric drill cutter under every stone, like the panel does. `finger_diameter` 0 = the document's finger size; `profile` picks a RING_PROFILE asset by name (omitted = the triangular profile the command starts from, or the default one); `plane` omitted = world XY. `element` = name of a saved TwoRowsShank element (ra.elements.list(\"TwoRowsShank\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the TwoRowsShank handle of the new shank (stones, cutters and prongs are its children).","metadata":{"title":"Two Rows Shank","section":"ra.tworowsshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcreate","collection":"scripting","hash":"94f24d9f26009a8c557da552a9eca005","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ra.tworowsshank.create()\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `layout_mode` | `str` | optional — None = the tool default |\n| `top_angle` | `float` | optional — None = the tool default |\n| `start_angle` | `float` | optional — None = the tool default |\n| `end_angle` | `float` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `channel_width` | `float` | optional — None = the tool default |\n| `channel_offset` | `float` | optional — None = the tool default |\n| `rail_mode` | `str` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `with_cutters` | `bool` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Two Rows Shank","section":"ra.tworowsshank.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#ratworowsshankcreate","collection":"scripting","hash":"50b0ccaedcc7d55b1bd7411a8c053c30","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nTwoRowsShank (handle)\nTwo-rows shank: a classic band carrying two parallel rows of stones, one on each face. Multiple gems, so no single MotherGem.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `advanced` | ClassicAdvanced | | |\n| `bottom_profile` | ClassicProfile | | |\n| `cutters_enabled` | `bool` | yes | |\n| `external_profile` | ClassicExternalProfile | | |\n| `gems` | ClassicGems | | The stones on the rails — the same options as a classic gems row. |\n| `gems_enabled` | `bool` | yes | |\n| `layer_name` | `str` | | |\n| `mid_profile` | ClassicProfile | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `prong` | TwoRowsProng | | |\n| `rail` | TwoRowsRail | | Two-rows specifics. |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |\n| `top_profile` | ClassicProfile | | The band is a full classic shank, so it exposes the same sections. |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved TwoRowsShank element (ra.elements.list(\"TwoRowsShank\")) to this shank: its band, rails and gems replace the current ones, the ring size stays, and the shank regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Two Rows Shank","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#handles","collection":"scripting","hash":"90801e498b363dd754be22cc6d5b234f","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ClassicAdvanced (section)\n\nThe classic shank's Advanced section: the opening at the bottom of the band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `cut_bumping` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `cut_length` | `float` | yes | mm — used when OpeningType is \"CUT\" |\n| `opening_type` | `str` | yes | \"NONE\", \"CUT\" or \"STRANGLE\" |\n| `strangle_base_x` | `float` | | mm |\n| `strangle_base_y` | `float` | | mm |\n| `strangle_base_z` | `float` | | mm |\n| `strangle_opening` | `float` | yes | mm — used when OpeningType is \"STRANGLE\" |\n\n| Method | |\n|---|---|\n| `set_strangle_base(x: float, y: float, z: float)` | |","metadata":{"title":"Two Rows Shank","section":"ClassicAdvanced (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicadvanced-section","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicadvanced-section","collection":"scripting","hash":"ef1d75d957db35847f11c3d5ba11bf66","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ClassicProfile (section)\n\nOne of the shank's three section profiles (top / mid / bottom). The top profile is always enabled; mid and bottom are optional.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `comfort` | `float` | yes | mm — used when Type is \"COMFORT\" |\n| `displacement` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `height` | `float` | yes | mm |\n| `orientation` | `int` | yes | 0 = Natural, 1 = Reverse (flips the profile curve) |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `rotation` | `float` | yes | degrees |\n| `thickness` | `float` | yes | mm — used when Type is \"THICKNESS\" |\n| `type` | `str` | yes | \"SOLID\", \"COMFORT\" or \"THICKNESS\" |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | RING_PROFILE asset by name — list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Two Rows Shank","section":"ClassicProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicprofile-section","collection":"scripting","hash":"3d69c616813e87e8e91a8285113ed531","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ClassicExternalProfile (section)\n\nThe optional external profile carved on the shank's outside face.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `bottom` | `float` | yes | external height at the bottom, mm |\n| `enabled` | `bool` | yes | |\n| `mid` | `float` | yes | external height at the middle, mm |\n| `profile_name` | `str` | | EXTERNAL_RING_PROFILE asset name, \"\" when unset |\n| `top` | `float` | yes | external height at the top, mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | EXTERNAL_RING_PROFILE asset by name — list them with ra.assets.list(\"EXTERNAL_RING_PROFILE\") |","metadata":{"title":"Two Rows Shank","section":"ClassicExternalProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicexternalprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicexternalprofile-section","collection":"scripting","hash":"ab6789f9388be9617b91ec7e959a1e06","indexed_by":"docs-index"}},{"content":"Two Rows Shank — ClassicGems (section)\n\nThe gems row a shank can carry around its band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `angle` | `float` | yes | degrees of the band covered by gems (180 = top half) |\n| `automatic_prong_diameter` | `bool` | yes | |\n| `bright_cut` | `float` | yes | bright-cut width, mm |\n| `drill_allow_intersection` | `bool` | yes | |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_for_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | how deep the gems sit inside, mm |\n| `gem_shape` | `str` | yes | \"ROUND\", \"PRINCESS\", ... |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `margin` | `float` | yes | side margin, mm |\n| `min_distance` | `float` | yes | minimum distance between gems, mm |\n| `prong_diameter` | `float` | yes | mm — used when AutomaticProngDiameter is False |\n| `prong_height` | `float` | yes | mm |\n| `prong_move_in_z` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"NONE\", \"SHARED\" or \"SCALLOPED\" |\n| `vertical` | `float` | yes | vertical displacement of the row, mm |","metadata":{"title":"Two Rows Shank","section":"ClassicGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicgems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#classicgems-section","collection":"scripting","hash":"8978f65d1dc85b9b5b1b4761894f5144","indexed_by":"docs-index"}},{"content":"Two Rows Shank — TwoRowsProng (section)\n\nThe prong cross-section of a two-rows band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `distance` | `float` | yes | mm |\n| `end_prong_count` | `int` | yes | |\n| `external_diameter` | `float` | yes | mm |\n| `internal_diameter` | `float` | yes | mm |\n\nTwoRowsRail (section)\nThe channel carved on each face of a two-rows band, and how the two gem rows sit in it.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `central_wall` | `float` | yes | metal left between the two rows in DOUBLE, mm |\n| `cut_orientation` | `str` | yes | \"ANGLED\" (follows the face) or \"HORIZONTAL\"; SINGLE is always horizontal |\n| `end_angle` | `float` | | degrees — used when LayoutMode is \"SIDE_ANGLE\" |\n| `end_margin` | `float` | yes | gap between the channel end and the first/last gem, mm |\n| `fit_tolerance` | `float` | yes | mm |\n| `layout_mode` | `str` | yes | \"FULL\", \"SIDE_ANGLE\" or \"TOP_ANGLE\" |\n| `offset` | `float` | yes | depth carved into the band, mm |\n| `outer_border` | `float` | yes | SINGLE only: metal rim on each side of the band, mm |\n| `rail_mode` | `str` | yes | \"DOUBLE\" (one cutter per row) or \"SINGLE\" (one wider cutter) |\n| `rotation` | `float` | yes | degrees |\n| `row_spacing` | `float` | yes | gap between the two gem rows, mm |\n| `start_angle` | `float` | | degrees — used when LayoutMode is \"SIDE_ANGLE\" |\n| `top_angle` | `float` | yes | total arc in degrees — used when LayoutMode is \"TOP_ANGLE\" |\n| `width` | `float` | yes | span of the channel along the face, mm |\n\n| Method | |\n|---|---|\n| `set_side_angles(start_angle: float, end_angle: float)` | |","metadata":{"title":"Two Rows Shank","section":"TwoRowsProng (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#tworowsprong-section","source":"https://www.rhinoartisan.com/docs/scripting/python/two-rows-shank/#tworowsprong-section","collection":"scripting","hash":"8409314aebec6d40071c45c02a41cf6d","indexed_by":"docs-index"}},{"content":"User Element\n\nUser-defined elements.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.UserElementApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Tags the given objects as a user element named `name` (the tool's whole flow: group them, attach the UserElement user data, and give non-gem solid geometry the metal material). |\n| `list()` | Names of the user elements in the active document (read-only). |","metadata":{"title":"User Element","url":"https://www.rhinoartisan.com/docs/scripting/python/user-element/","source":"https://www.rhinoartisan.com/docs/scripting/python/user-element/","collection":"scripting","hash":"f0c261b02e1d59859842c0bcdbe17eb7","indexed_by":"docs-index"}},{"content":"User Element — ra.userelement.create()\n\n```python\nra.user_element.create(object_ids: Sequence[IdLike], name: str) -> str\n```\n\nTags the given objects as a user element named `name` (the tool's whole flow: group them, attach the UserElement user data, and give non-gem solid geometry the metal material). Returns the element's unique id.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `name` | `str` | required |","metadata":{"title":"User Element","section":"ra.userelement.create()","url":"https://www.rhinoartisan.com/docs/scripting/python/user-element/#rauserelementcreate","source":"https://www.rhinoartisan.com/docs/scripting/python/user-element/#rauserelementcreate","collection":"scripting","hash":"519d26f8529b6ca12e8c1771d6ea7f28","indexed_by":"docs-index"}},{"content":"User Element — ra.userelement.list()\n\n```python\nra.user_element.list() -> List[str]\n```\n\nNames of the user elements in the active document (read-only).","metadata":{"title":"User Element","section":"ra.userelement.list()","url":"https://www.rhinoartisan.com/docs/scripting/python/user-element/#rauserelementlist","source":"https://www.rhinoartisan.com/docs/scripting/python/user-element/#rauserelementlist","collection":"scripting","hash":"78cacbfe21f4ad444be79079d31f1c53","indexed_by":"docs-index"}},{"content":"View\n\nViewport cameras, display modes, named views and captures.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.ViewApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `capture()` | Captures `viewport` (None = the active one) to a PNG at the given pixel size (0 = the viewport's current size). |\n| `describe()` | The open viewports, the saved named views and the available display modes — the vocabularies the other methods accept. |\n| `import_named_views()` | Imports the named views saved in another 3dm file into the active document — the way to give every document of a batch run the same standard camera angles: keep them once in a template 3dm, import, then RestoreNamedView + Capture per angle. |\n| `restore_named_view()` | Restores a saved named view onto `viewport` (None = the active one). |\n| `save_named_view()` | Saves (or overwrites) the current camera of `viewport` as a named view — the building block for reusable batch-render angles. |\n| `set_camera()` | Places the camera of `viewport` (None = the active one) at `location` looking at `target`, in perspective projection. |\n| `set_display_mode()` | Switches the display mode of `viewport` (None = the active one). |\n| `zoom_extents()` | Zooms `viewport` (None = the active one) to the extents of the visible geometry. |","metadata":{"title":"View","url":"https://www.rhinoartisan.com/docs/scripting/python/view/","source":"https://www.rhinoartisan.com/docs/scripting/python/view/","collection":"scripting","hash":"b9ad2824fa98467bf448af142995d604","indexed_by":"docs-index"}},{"content":"View — ra.view.capture()\n\n```python\nra.view.capture(path: str, width=None, height=None, viewport=None) -> str\n```\n\nCaptures `viewport` (None = the active one) to a PNG at the given pixel size (0 = the viewport's current size). Returns the full path written (\".png\" appended when missing; folders are created).\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |\n| `width` | `int` | optional — None = the tool default |\n| `height` | `int` | optional — None = the tool default |\n| `viewport` | `str` | optional — None = the tool default |","metadata":{"title":"View","section":"ra.view.capture()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewcapture","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewcapture","collection":"scripting","hash":"a063b774396bf28990c313cd424b3afc","indexed_by":"docs-index"}},{"content":"View — ra.view.describe()\n\n```python\nra.view.describe() -> str\n```\n\nThe open viewports, the saved named views and the available display modes — the vocabularies the other methods accept.\n\nra.view.importnamedviews()\n```python\nra.view.import_named_views(path: str) -> List[str]\n```\n\nImports the named views saved in another 3dm file into the active document — the way to give every document of a batch run the same standard camera angles: keep them once in a template 3dm, import, then RestoreNamedView + Capture per angle. A view whose name already exists in the document is skipped (the document's own view wins). Returns the names imported.\n\n| Parameter | Type | |\n|---|---|---|\n| `path` | `str` | required |","metadata":{"title":"View","section":"ra.view.describe()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewdescribe","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewdescribe","collection":"scripting","hash":"0b34076549ab36f510f8f38e30b8a57f","indexed_by":"docs-index"}},{"content":"View — ra.view.restorenamedview()\n\n```python\nra.view.restore_named_view(name: str, viewport=None)\n```\n\nRestores a saved named view onto `viewport` (None = the active one). The names come from Describe().\n\n| Parameter | Type | |\n|---|---|---|\n| `name` | `str` | required |\n| `viewport` | `str` | optional — None = the tool default |\n\nra.view.savenamedview()\n```python\nra.view.save_named_view(name: str, viewport=None)\n```\n\nSaves (or overwrites) the current camera of `viewport` as a named view — the building block for reusable batch-render angles.\n\n| Parameter | Type | |\n|---|---|---|\n| `name` | `str` | required |\n| `viewport` | `str` | optional — None = the tool default |","metadata":{"title":"View","section":"ra.view.restorenamedview()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewrestorenamedview","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewrestorenamedview","collection":"scripting","hash":"7f58bdc4b8ad97f6f83002a3877fb41f","indexed_by":"docs-index"}},{"content":"View — ra.view.setcamera()\n\n```python\nra.view.set_camera(location: PointLike, target: PointLike, lens_mm=None, viewport=None)\n```\n\nPlaces the camera of `viewport` (None = the active one) at `location` looking at `target`, in perspective projection. `lens_mm` > 0 also sets the 35mm-equivalent lens length (50 is a natural product shot, 85-100 flattens like a macro lens).\n\n| Parameter | Type | |\n|---|---|---|\n| `location` | `PointLike` | required |\n| `target` | `PointLike` | required |\n| `lens_mm` | `float` | optional — None = the tool default |\n| `viewport` | `str` | optional — None = the tool default |","metadata":{"title":"View","section":"ra.view.setcamera()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewsetcamera","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewsetcamera","collection":"scripting","hash":"094946fbdcb4500770d2a83c8d386412","indexed_by":"docs-index"}},{"content":"View — ra.view.setdisplaymode()\n\n```python\nra.view.set_display_mode(mode: str, viewport=None)\n```\n\nSwitches the display mode of `viewport` (None = the active one). Mode names come from Describe() — e.g. Wireframe, Shaded, Rendered, Raytraced, Arctic, Pen.\n\n| Parameter | Type | |\n|---|---|---|\n| `mode` | `str` | required |\n| `viewport` | `str` | optional — None = the tool default |","metadata":{"title":"View","section":"ra.view.setdisplaymode()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewsetdisplaymode","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewsetdisplaymode","collection":"scripting","hash":"2bf60dd553701adc72a69b5bea345afe","indexed_by":"docs-index"}},{"content":"View — ra.view.zoomextents()\n\n```python\nra.view.zoom_extents(viewport=None)\n```\n\nZooms `viewport` (None = the active one) to the extents of the visible geometry.\n\n| Parameter | Type | |\n|---|---|---|\n| `viewport` | `str` | optional — None = the tool default |","metadata":{"title":"View","section":"ra.view.zoomextents()","url":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewzoomextents","source":"https://www.rhinoartisan.com/docs/scripting/python/view/#raviewzoomextents","collection":"scripting","hash":"588928ff5dd35ac8b44f325b0eee1b3f","indexed_by":"docs-index"}},{"content":"Voronoi\n\nVoronoi patterns over surfaces.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.VoronoiApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `create()` | Defaults: 100 points, flat (thickness/height 0 keep the saved or tool defaults). |\n\nra.voronoi.create()\n```python\nra.voronoi.create(curve_id: IdLike, points=None, thickness=None, height=None, both_sides=None) -> List[str]\n```\n\nDefaults: 100 points, flat (thickness/height 0 keep the saved or tool defaults). Returns the created object ids.\n\n| Parameter | Type | |\n|---|---|---|\n| `curve_id` | `IdLike` | required |\n| `points` | `int` | optional — None = the tool default |\n| `thickness` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `both_sides` | `bool` | optional — None = the tool default |","metadata":{"title":"Voronoi","url":"https://www.rhinoartisan.com/docs/scripting/python/voronoi/","source":"https://www.rhinoartisan.com/docs/scripting/python/voronoi/","collection":"scripting","hash":"a5e2d2797aebdf0cef3ad58657b2543e","indexed_by":"docs-index"}},{"content":"Wedding Band\n\nSingle wedding bands.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.WeddingBandApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `WeddingBand` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `WeddingBand` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `WeddingBand` handles for the objects of this kind currently selected in the active document. |","metadata":{"title":"Wedding Band","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/","collection":"scripting","hash":"f27f43a73153889c2d35802aedec5bef","indexed_by":"docs-index"}},{"content":"Wedding Band — ra.weddingband.all()\n\n```python\nra.wedding_band.all() -> List[WeddingBand]\n```\n\n`WeddingBand` handles for every object of this kind in the active document (empty when there is no document).\n\nra.weddingband.bylayer()\n```python\nra.wedding_band.by_layer(layer_name: str) -> List[WeddingBand]\n```\n\n`WeddingBand` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Wedding Band","section":"ra.weddingband.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandall","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandall","collection":"scripting","hash":"a9ea41467790d638ec4cf1b4129f78c7","indexed_by":"docs-index"}},{"content":"Wedding Band — ra.weddingband.count()\n\n```python\nra.wedding_band.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.weddingband.find()\n```python\nra.wedding_band.find(id: IdLike) -> WeddingBand\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Wedding Band","section":"ra.weddingband.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandcount","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandcount","collection":"scripting","hash":"7dd50bcca1c8a949b035b814cf9474ff","indexed_by":"docs-index"}},{"content":"Wedding Band — ra.weddingband.selected()\n\n```python\nra.wedding_band.selected() -> List[WeddingBand]\n```\n\n`WeddingBand` handles for the objects of this kind currently selected in the active document.\n\nHandles\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.","metadata":{"title":"Wedding Band","section":"ra.weddingband.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandselected","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#raweddingbandselected","collection":"scripting","hash":"4204c0f27afa17f876cd844dc558b89a","indexed_by":"docs-index"}},{"content":"Wedding Band — WeddingBand (handle)\n\nA single wedding band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `region` | `str` | | sizing region, \"\" when unset |\n| `ring` | WeddingRing | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved WeddingBand element (ra.elements.list(\"WeddingBand\")) to this band: its profile, gems and metal replace the current ones, the ring size stays, and the band regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(**kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Wedding Band","section":"WeddingBand (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingband-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingband-handle","collection":"scripting","hash":"8c8da28e4cbdb3a363aeef4f6dfe8910","indexed_by":"docs-index"}},{"content":"Wedding Band — WeddingRing (section)\n\nOne ring of a wedding set, or the single band of a wedding band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gems` | WeddingGems | | |\n| `metal` | `str` | yes | e.g. \"GOLD_YELLOW_18\" |\n| `profile` | WeddingProfile | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |","metadata":{"title":"Wedding Band","section":"WeddingRing (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingring-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingring-section","collection":"scripting","hash":"0d619b5c66ed16bf17a0d495286a615f","indexed_by":"docs-index"}},{"content":"Wedding Band — WeddingGems (section)\n\nThe stones a wedding ring can carry around its band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `automatic_prong_diameter` | `bool` | yes | |\n| `custom_distance` | `str` | yes | \"Continuous\" or \"Equidistant\" |\n| `distribution` | `str` | yes | \"Full\", \"Half\", \"Onequarter\" or \"Custom\" |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | mm |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `min_distance` | `float` | yes | mm |\n| `number_of_gems` | `int` | yes | used when Distribution is \"Custom\" |\n| `prong_diameter` | `float` | yes | mm |\n| `prong_height` | `float` | yes | mm |\n| `prong_move_in_z` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"None\", \"Shared\" or \"Channel\" |\n| `shape` | `str` | yes | \"Round\" or \"Princess\" |\n| `vertical` | `float` | yes | mm |","metadata":{"title":"Wedding Band","section":"WeddingGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddinggems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddinggems-section","collection":"scripting","hash":"0100e56cb17b9dda1133b89a0e7f8616","indexed_by":"docs-index"}},{"content":"Wedding Band — WeddingProfile (section)\n\nThe band section of a wedding ring: its section and profile asset.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `height` | `float` | yes | mm |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Wedding Band","section":"WeddingProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding-band/#weddingprofile-section","collection":"scripting","hash":"f33e2207c2e7e51b6512d201c7a7b262","indexed_by":"docs-index"}},{"content":"Wedding\n\nWedding sets (band pairs) built as one editable object.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.WeddingApi`, `ArtisanPlugin.Scripting.WeddingBuilderApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `all()` | `Wedding` handles for every object of this kind in the active document (empty when there is no document). |\n| `by_layer()` | `Wedding` handles on the layer with the given full path (empty when the layer does not exist). |\n| `count()` | Number of objects of this kind in the active document. |\n| `find()` | The handle for `id`, or None when the id does not belong to an object of this kind. |\n| `selected()` | `Wedding` handles for the objects of this kind currently selected in the active document. |\n| `create_band()` | Builds a single wedding band (the ArtisanWeddingBand tool, headless): a plain band lofted from a RING_PROFILE asset at the document's finger size, optionally with a row of stones around it. |\n| `create_set()` | Builds a wedding set (the ArtisanWeddingRing tool, headless): two bands baked together as one group -- his and hers -- each with its own section, metal, finger size and optional stones. |","metadata":{"title":"Wedding","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/","collection":"scripting","hash":"123f92ff022a011ceb1c4c4743d5902d","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.all()\n\n```python\nra.wedding.all() -> List[Wedding]\n```\n\n`Wedding` handles for every object of this kind in the active document (empty when there is no document).\n\nra.wedding.bylayer()\n```python\nra.wedding.by_layer(layer_name: str) -> List[Wedding]\n```\n\n`Wedding` handles on the layer with the given full path (empty when the layer does not exist).\n\n| Parameter | Type | |\n|---|---|---|\n| `layer_name` | `str` | required |","metadata":{"title":"Wedding","section":"ra.wedding.all()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingall","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingall","collection":"scripting","hash":"1fbce4b4bc5b6301db69279c0abc24d2","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.count()\n\n```python\nra.wedding.count() -> int\n```\n\nNumber of objects of this kind in the active document.\n\nra.wedding.find()\n```python\nra.wedding.find(id: IdLike) -> Wedding\n```\n\nThe handle for `id`, or None when the id does not belong to an object of this kind.\n\n| Parameter | Type | |\n|---|---|---|\n| `id` | `IdLike` | required |","metadata":{"title":"Wedding","section":"ra.wedding.count()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcount","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcount","collection":"scripting","hash":"a4898a8003c45933bf81248354291a22","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.selected()\n\n```python\nra.wedding.selected() -> List[Wedding]\n```\n\n`Wedding` handles for the objects of this kind currently selected in the active document.","metadata":{"title":"Wedding","section":"ra.wedding.selected()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingselected","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingselected","collection":"scripting","hash":"3b7b0e90dc3e2a5464e9d3d1b000d5bb","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.createband()\n\n```python\nra.wedding.create_band(width=None, height=None, finger_diameter=None, profile=None, metal=None, with_gems=None, gem_size=None, gem_shape=None, distribution=None, number_of_gems=None, prong_type=None, plane=None, element=None) -> WeddingBand\n```\n\nBuilds a single wedding band (the ArtisanWeddingBand tool, headless): a plain band lofted from a RING_PROFILE asset at the document's finger size, optionally with a row of stones around it. Millimetres; omitting keeps the tool default: width 3, height 2. `finger_diameter` 0 = the document's finger size. `profile` picks a RING_PROFILE asset by name (omitted = the default profile); `metal` a Metal name like \"GOLD_YELLOW_18\" (omitted = the document's Metal 01). `with_gems` True enables the stones: `gem_size` (default 1.2), `gem_shape` \"Round\" | \"Princess\", `distribution` \"Full\" | \"Half\" | \"Onequarter\" | \"Custom\" (+ `number_of_gems`), `prong_type` \"None\" | \"Shared\" | \"Channel\". `plane` omitted = world XY. `element` = name of a saved WeddingBand element (ra.elements.list(\"WeddingBand\")) to start from; explicit arguments override it (its finger size is always replaced). Returns the WeddingBand handle of the new band group.","metadata":{"title":"Wedding","section":"ra.wedding.createband()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateband","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateband","collection":"scripting","hash":"252945686614c3598cce811f27429d79","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.createband()\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `metal` | `str` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `gem_shape` | `str` | optional — None = the tool default |\n| `distribution` | `str` | optional — None = the tool default |\n| `number_of_gems` | `int` | optional — None = the tool default |\n| `prong_type` | `str` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |\n| `element` | `str` | optional — None = the tool default |","metadata":{"title":"Wedding","section":"ra.wedding.createband()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateband","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateband","collection":"scripting","hash":"a0a89296be9f65da917e3cebfab1a327","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.createset()\n\n```python\nra.wedding.create_set(width=None, height=None, second_width=None, second_height=None, finger_diameter=None, second_finger_diameter=None, profile=None, second_profile=None, metal=None, second_metal=None, with_gems=None, gem_size=None, second_with_gems=None, second_gem_size=None, plane=None) -> Wedding\n```\n\nBuilds a wedding set (the ArtisanWeddingRing tool, headless): two bands baked together as one group -- his and hers -- each with its own section, metal, finger size and optional stones. Millimetres; omitting keeps the tool default (width 3, height 2 for both). `finger_diameter` / `second_finger_diameter` 0 = the document's finger size. `profile` / `second_profile` pick RING_PROFILE assets by name (omitted = the default profile); `metal` / `second_metal` are Metal names (omitted = the document's Metal 01). `with_gems` + `gem_size` (and the `second*` pair) add a full row of round stones to that ring. `plane` omitted = world XY. Returns the Wedding handle of the new set (FirstRing / SecondRing).","metadata":{"title":"Wedding","section":"ra.wedding.createset()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateset","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateset","collection":"scripting","hash":"0f71ca058132a7c0edef1c0a45aa32ad","indexed_by":"docs-index"}},{"content":"Wedding — ra.wedding.createset()\n\n| Parameter | Type | |\n|---|---|---|\n| `width` | `float` | optional — None = the tool default |\n| `height` | `float` | optional — None = the tool default |\n| `second_width` | `float` | optional — None = the tool default |\n| `second_height` | `float` | optional — None = the tool default |\n| `finger_diameter` | `float` | optional — None = the tool default |\n| `second_finger_diameter` | `float` | optional — None = the tool default |\n| `profile` | `str` | optional — None = the tool default |\n| `second_profile` | `str` | optional — None = the tool default |\n| `metal` | `str` | optional — None = the tool default |\n| `second_metal` | `str` | optional — None = the tool default |\n| `with_gems` | `bool` | optional — None = the tool default |\n| `gem_size` | `float` | optional — None = the tool default |\n| `second_with_gems` | `bool` | optional — None = the tool default |\n| `second_gem_size` | `float` | optional — None = the tool default |\n| `plane` | `Optional[PlaneLike]` | optional — None = the tool default |","metadata":{"title":"Wedding","section":"ra.wedding.createset()","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateset","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#raweddingcreateset","collection":"scripting","hash":"93a8ab1cf83a61e7d51a56c7044f56c8","indexed_by":"docs-index"}},{"content":"Wedding — Handles\n\nObjects returned by the functions above. Assigning a settable property regenerates the object; the change is one undo step inside `ra.transaction()`.\n\nWedding (handle)\nA wedding set: the two rings baked together as one group.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `first_ring` | WeddingRing | | |\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `region` | `str` | | sizing region of the set, \"\" when unset |\n| `second_ring` | WeddingRing | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n\nPlus what every handle has: `id`, `delete()`, `update(kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Wedding","section":"Handles","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#handles","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#handles","collection":"scripting","hash":"d0123b4ee60c0e92444a51230da404ef","indexed_by":"docs-index"}},{"content":"Wedding — WeddingBand (handle)\n\nA single wedding band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `layer_name` | `str` | | |\n| `mother_gem_id` | `str` | | |\n| `object_type` | `str` | | |\n| `position` | `Point3d` | | |\n| `region` | `str` | | sizing region, \"\" when unset |\n| `ring` | WeddingRing | | |\n\n| Method | |\n|---|---|\n| `delete()` | |\n| `move(translation: VectorLike)` | |\n| `set_element(element: str)` | Applies a saved WeddingBand element (ra.elements.list(\"WeddingBand\")) to this band: its profile, gems and metal replace the current ones, the ring size stays, and the band regenerates in place (same id). |\n\nPlus what every handle has: `id`, `delete()`, `update(kwargs)`, `parameters()`, equality and hashing by id, and `raw` (the underlying .NET object).","metadata":{"title":"Wedding","section":"WeddingBand (handle)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingband-handle","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingband-handle","collection":"scripting","hash":"1b0defd7b5089e673b1c4c907309de3d","indexed_by":"docs-index"}},{"content":"Wedding — WeddingRing (section)\n\nOne ring of a wedding set, or the single band of a wedding band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `gems` | WeddingGems | | |\n| `metal` | `str` | yes | e.g. \"GOLD_YELLOW_18\" |\n| `profile` | WeddingProfile | | |\n| `ring_diameter_mm` | `float` | | |\n| `ring_size_label` | `str` | | |\n| `ring_size_region` | `str` | | |","metadata":{"title":"Wedding","section":"WeddingRing (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingring-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingring-section","collection":"scripting","hash":"e5117544c056c0f495038fd0f5f5bd27","indexed_by":"docs-index"}},{"content":"Wedding — WeddingGems (section)\n\nThe stones a wedding ring can carry around its band.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `automatic_prong_diameter` | `bool` | yes | |\n| `custom_distance` | `str` | yes | \"Continuous\" or \"Equidistant\" |\n| `distribution` | `str` | yes | \"Full\", \"Half\", \"Onequarter\" or \"Custom\" |\n| `drill_height` | `float` | yes | mm |\n| `drill_type` | `str` | yes | \"NONE\", \"ROUND\" or \"QUAD\" |\n| `drill_width` | `float` | yes | mm |\n| `enabled` | `bool` | yes | |\n| `extension_manufacturing` | `float` | yes | mm |\n| `gem_inside` | `float` | yes | mm |\n| `gem_size` | `float` | yes | mm |\n| `inner_height` | `float` | yes | inner channel height, mm |\n| `inner_width` | `float` | yes | inner channel width, mm |\n| `min_distance` | `float` | yes | mm |\n| `number_of_gems` | `int` | yes | used when Distribution is \"Custom\" |\n| `prong_diameter` | `float` | yes | mm |\n| `prong_height` | `float` | yes | mm |\n| `prong_move_in_z` | `float` | yes | mm |\n| `prong_type` | `str` | yes | \"None\", \"Shared\" or \"Channel\" |\n| `shape` | `str` | yes | \"Round\" or \"Princess\" |\n| `vertical` | `float` | yes | mm |","metadata":{"title":"Wedding","section":"WeddingGems (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddinggems-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddinggems-section","collection":"scripting","hash":"2823506180f78e74b11e4a1ffff3a5ec","indexed_by":"docs-index"}},{"content":"Wedding — WeddingProfile (section)\n\nThe band section of a wedding ring: its section and profile asset.\n\n| Property | Type | Settable | |\n|---|---|---|---|\n| `height` | `float` | yes | mm |\n| `profile_name` | `str` | | RING_PROFILE asset name, \"\" when unset |\n| `width` | `float` | yes | mm |\n\n| Method | |\n|---|---|\n| `set_profile(asset_name: str)` | list them with ra.assets.list(\"RING_PROFILE\") |","metadata":{"title":"Wedding","section":"WeddingProfile (section)","url":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingprofile-section","source":"https://www.rhinoartisan.com/docs/scripting/python/wedding/#weddingprofile-section","collection":"scripting","hash":"f531c2a9c7922ff75932c946301e584e","indexed_by":"docs-index"}},{"content":"Weight\n\nMetal weights: per layer, per selection, by area.\n\n```python\nimport rhinoartisan as ra\n```\n\nWraps `ArtisanPlugin.Scripting.WeightApi`.\n\nFunctions\n| Function | |\n|---|---|\n| `calculate()` | Per-metal breakdown of the whole document, mirroring ArtisanWeight: volumes come from the \"Metal 01/02/03\" layers and are grouped by the document's configured number of metals (1, 2 or 3). |\n| `calculate_by_area()` | Sheet-metal style estimate (the ArtisanWeightByArea tool): total surface AREA of the given objects x `thickness` = volume, cast in `metal`. |\n| `calculate_for_objects()` | Weight of an arbitrary set of objects if cast in `metal` (the ArtisanWeightBySelection idea, scriptable). |\n| `calculate_for_selection()` | Weight of the current viewport selection if cast in `metal`. |\n| `calculate_selection_by_area()` | By-area estimate of the current viewport selection. |\n| `metals()` | Valid names for the `metal` argument of the ForObjects/ForSelection variants (\"GOLD_YELLOW_18\", \"PLATINUM\", \"SILVER\", ...). |","metadata":{"title":"Weight","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/","collection":"scripting","hash":"d323bcb72a712cef04a4973d79b6f3f5","indexed_by":"docs-index"}},{"content":"Weight — ra.weight.calculate()\n\n```python\nra.weight.calculate() -> List[MetalWeightResult]\n```\n\nPer-metal breakdown of the whole document, mirroring ArtisanWeight: volumes come from the \"Metal 01/02/03\" layers and are grouped by the document's configured number of metals (1, 2 or 3). Entries whose layer has no geometry report zero weights rather than being omitted.","metadata":{"title":"Weight","section":"ra.weight.calculate()","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculate","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculate","collection":"scripting","hash":"e9874a106cfbb08b2f0380583411c792","indexed_by":"docs-index"}},{"content":"Weight — ra.weight.calculatebyarea()\n\n```python\nra.weight.calculate_by_area(object_ids: Sequence[IdLike], thickness: float, metal=None) -> MetalWeightResult\n```\n\nSheet-metal style estimate (the ArtisanWeightByArea tool): total surface AREA of the given objects x `thickness` = volume, cast in `metal`. Useful for shells and pieces modeled as open surfaces. `metal` empty/None = the document's primary metal.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `thickness` | `float` | required |\n| `metal` | `str` | optional — None = the tool default |","metadata":{"title":"Weight","section":"ra.weight.calculatebyarea()","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculatebyarea","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculatebyarea","collection":"scripting","hash":"5264135564e5eda2c79aca8bf46dbeb7","indexed_by":"docs-index"}},{"content":"Weight — ra.weight.calculateforobjects()\n\n```python\nra.weight.calculate_for_objects(object_ids: Sequence[IdLike], metal: str) -> MetalWeightResult\n```\n\nWeight of an arbitrary set of objects if cast in `metal` (the ArtisanWeightBySelection idea, scriptable). Objects must be closed solids/meshes for their volume to count.\n\n| Parameter | Type | |\n|---|---|---|\n| `object_ids` | `Sequence[IdLike]` | required |\n| `metal` | `str` | required |","metadata":{"title":"Weight","section":"ra.weight.calculateforobjects()","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculateforobjects","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculateforobjects","collection":"scripting","hash":"c43e9773ae6cd876165916270f3b521e","indexed_by":"docs-index"}},{"content":"Weight — ra.weight.calculateforselection()\n\n```python\nra.weight.calculate_for_selection(metal: str) -> MetalWeightResult\n```\n\nWeight of the current viewport selection if cast in `metal`.\n\n| Parameter | Type | |\n|---|---|---|\n| `metal` | `str` | required |\n\nra.weight.calculateselectionbyarea()\n```python\nra.weight.calculate_selection_by_area(thickness: float, metal=None) -> MetalWeightResult\n```\n\nBy-area estimate of the current viewport selection.\n\n| Parameter | Type | |\n|---|---|---|\n| `thickness` | `float` | required |\n| `metal` | `str` | optional — None = the tool default |","metadata":{"title":"Weight","section":"ra.weight.calculateforselection()","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculateforselection","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightcalculateforselection","collection":"scripting","hash":"f7328ccd84565563378a11d53e614b16","indexed_by":"docs-index"}},{"content":"Weight — ra.weight.metals()\n\n```python\nra.weight.metals() -> List[str]\n```\n\nValid names for the `metal` argument of the ForObjects/ForSelection variants (\"GOLD_YELLOW_18\", \"PLATINUM\", \"SILVER\", ...).","metadata":{"title":"Weight","section":"ra.weight.metals()","url":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightmetals","source":"https://www.rhinoartisan.com/docs/scripting/python/weight/#raweightmetals","collection":"scripting","hash":"03d83e69f32e78d5e0678f1012d4dadb","indexed_by":"docs-index"}},{"content":"API Reference\n\nThe Scripting API lives in the `ArtisanPlugin.Scripting` namespace. Facades are grouped by what they work on:\n\nFile Search Instant search over your indexed design files.\n\nDocument Open, save and export — plus mode, metals, ring size and describe.\n\nGems Create, query and edit stones — plus utilities and undo.\n\nBooleans Union, difference, intersection and split — editable Artisan booleans.\n\nShanks Every ring body: classic, cathedral, eternity, bypass, split, pave and more.\n\nGemsets Every setting: bezels to halos, pavé to channels — and their cutters.\n\nAccessories Bails, bangles, beads, charms, chains and friends.\n\nCurves & Text Ring rails, text on curve, image tracing.\n\nAssets The profile library the parametric tools build from.\n\nElements Your saved presets: build from them, apply them, manage the library.\n\nTransform Scale by weight or dimensions, deform, mirror, place on surfaces.\n\nRelief 2.5D height-field reliefs: creators, the project stack, heightmaps.\n\nAnalysis Wall thickness and metal weights.\n\nDrafting Reports, gems maps, cost tables, auto-dimensions.\n\nManufacturing Repair, printability, sprues, resizing, decimation.\n\nPricing The Breakdown engine — totals, line detail, cost settings.\n\nRealtime Render The live viewer: camera, materials, scene, captures and video.\n\nRender Staging, materials, batch rendering and Render Studio.\n\nViews Viewport cameras, named views and captures.\n\nIntegrations Nivoda certified-diamond sourcing.\n\nHandles vs facades. Facades (static classes) query and create; handles (`IGem`, `IBezel`, …) represent one object in the document and carry its properties and mutations. Every handle interface has its own page under Handles.","metadata":{"title":"API Reference","url":"https://www.rhinoartisan.com/docs/scripting/reference/","source":"https://www.rhinoartisan.com/docs/scripting/reference/","collection":"scripting","hash":"de39e2048c72c8cb4a0622dd136b9269","indexed_by":"docs-index"}},{"content":"API Reference\n\nCreate coverage varies. Every facade can *query* its objects; not all of them can *create* yet. Each page states what the facade can create versus what it only reads. Creation coverage grows release by release.","metadata":{"title":"API Reference","url":"https://www.rhinoartisan.com/docs/scripting/reference/","source":"https://www.rhinoartisan.com/docs/scripting/reference/","collection":"scripting","hash":"a6250cd10badf2ac74d1b0fc9da48d8c","indexed_by":"docs-index"}},{"content":"API Reference — Everything at a glance\n\nThe complete exported surface, one row per facade. Bold methods modify the document.\n\n| Facade | Methods |\n|---|---|\n| `GemApi` | Shapes, Materials, All, Find, Count, Selected, ByLayer, ByMaterial, Collisions, Create |\n| `IGem` handle | Id, Shape, Material, CaratWeight, SizeX/Y/Z, Position, Plane, LayerName · SetMaterial, SetCaratWeight, SetSize, Scale, Move, SetPlane, Rotate, Flip, Copy, Delete, Select |\n| `CutterApi` | All, Find, Count, Selected, ByLayer, ForGem, Create (with fitToGem) · handle: setters + FitToGem |\n| `BooleanApi` | Union, Difference, Intersection, Split |\n| `BezelApi` | All, Find, Count, Selected, ByLayer, ForGem, Create · handle: SetHeight, SetWidth, SetGirdleHeight, SetGirdleWidth, SetGemInside |\n| `PegheadApi` | All, Find, Count, Selected, ByLayer, ForGem, Create · handle: SetProngs, SetHeight, SetThickness, SetGirdleWidth, SetOverGirdleHeight, SetGemInside |\n| `BasketApi` | All, Find, Count, Selected, ByLayer, ByGemMaterial, ForGem, Create · handle: SetProngCount, SetProngDiameter, SetProngHeight |\n| `HaloApi` | All, Find, Count, Selected, ByLayer, ForGem, Create · handle: SetStoneSize, SetStoneDistance |\n| `ClassicApi` | All, Find, Count, Selected, ByLayer, Create · handle: SetWidth, SetHeight + full section views (TopProfile, MidProfile, BottomProfile, ExternalProfile, Advanced, Gems) |\n| `CathedralApi` | All, Find, Count, Selected, ByLayer, Create · handle: SetTopWidth, SetTopHeight, SetBottomWidth, SetBottomHeight + section views (Shank, Gems) |\n| `EternityApi` | All, Find, Count, Selected, ByLayer, Create · handle: section views (Gems, Prongs, Bezels, Shank) |","metadata":{"title":"API Reference","section":"Everything at a glance","url":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","source":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","collection":"scripting","hash":"21fd168fa72f1017abbb5ed2621b92c0","indexed_by":"docs-index"}},{"content":"API Reference — Everything at a glance\n\n| Facade | Methods |\n|---|---|\n| `AdvancedCathedralApi`, `BypassApi`, `SplitShankApi`, `GraduatedApi`, `PaveShankApi`, `TwoRowsShankApi`, `MatchingShankApi`, `SignetRingApi`, `AdvancedSignetRingApi`, `WeddingApi`, `WeddingBandApi` | All, Find, Count, Selected, ByLayer (+ForRing on MatchingShank) · fully editable handles — see Handles |\n| `GemsOnCurveApi` | All, Find, Count, Selected, ByLayer, ForCurve, Create |\n| `GemsByNetworkApi` | All, Find, Count, Selected, ByLayer, ForCurve |\n| `ClusterApi` | All, Find, Count, Selected, ByLayer, ForGem, Create |\n| `HiddenHaloApi`, `TulipApi`, `MartiniApi`, `TrellisGemsetApi` | All, Find, Count, Selected, ByLayer, ForGem, Create · handles with 2 parametric setters each |\n| `AdvancedBezelApi`, `CabochonApi`, `PearlApi` | All, Find, Count, Selected, ByLayer (+ForGem on AdvancedBezel), Create |\n| `AdvancedBasketApi` | All, Find, Count, Selected, ByLayer, ForGem, Create · handle: SetProngCount, SetProngDiameter, SetProngHeight, SetRailCount |\n| `GemToolsApi` | Centers, AddCenterPoints, CenterBetweenGems, CurveFromGems, ExtractGemCurves, OffsetGemCurves, CopyByGems, ColorBySize, RotateGems, AlignGems, AddTags, RecoverGems |\n| `MicroSettingApi` | All, Find, Count, Selected, ByLayer, Create |\n| `ChannelApi` | Create |\n| `PaveApi` | OnSurface |\n| `ToiEtMoiApi` | Create |\n| `RingCurveApi` | CreateClosed, CreateOpen, CreateBypass, CreateShape |\n| `TextOnCurveApi` | Create |\n| `RasterToVectorApi` | Create |\n| `AssetsApi` | Types, List, GetDefault, ExportAsCurve, Rename, Duplicate, SetDefault, Delete |\n| `ElementsApi` | Types, List, Count, Find, GetParametersJson, SaveFromObject, Rename, Duplicate, SetFavorite, Delete, ExportBundle, ImportBundle |","metadata":{"title":"API Reference","section":"Everything at a glance","url":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","source":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","collection":"scripting","hash":"2b23357eae1847f356c6be4ffd17f25d","indexed_by":"docs-index"}},{"content":"API Reference — Everything at a glance\n\n| Facade | Methods |\n|---|---|\n| `BailApi`, `BangleApi`, `BeadApi`, `CharmApi`, `LinkApi`, `NamedPendantApi`, `HingeApi`, `MilgrainApi`, `RopeApi`, `VoronoiApi`, `HoneyCombApi`, `Texture3DApi`, `ChainApi`, `PatternApi`, `ProfileSweepApi`, `EngravingApi` | Create (one per component) |\n| `SmartComponentApi` | All, Find, Count, Selected, ByLayer · handle: GetParameter, SetParameter, SetParameters, SetElement (Bail, Named pendant, Bangle, Bead, Charm, Link, Milgrain, Rope, Texture 3D, Engraving) |\n| `SmartProfileApi` | All, Find, Count, Selected, ByLayer, Create · fully editable handle, section by section |\n| `UserElementApi` | List, Create |\n| `DocumentApi` | GetComputationMode, GetMetals, GetRingSize, RingSizeRegions, GetPath, IsModified, ReportPdf, Glb, Stl, SetComputationMode, SetMetal, SetRingSize, SetRingSizeByDiameter, Open, Save, New |\n| `ViewApi` | Describe, SetCamera, RestoreNamedView, SetDisplayMode, ZoomExtents, SaveNamedView, ImportNamedViews, Capture |\n| `TransformApi` | ScaleByWeight, ScaleToDimensions, CopyOnObjects, MoveOnObjects, MoveByNormal, MirrorQuad, MirrorOpposite, Bend, Twist, Taper |\n| `ReliefApi` | GetProject, Operations, ProfileNames, ExportHeightmap, CreateFromImage, CreateFromCurves, CreateFromGeometry, SetupProject, AddProfile, AddExtrude, AddImage, AddTexture, AddGeometry, AddSculpt, AddSmooth, SetOperationEnabled, SetOperationCombine, MoveOperation, RemoveOperation, ClearProject, Bake |\n| `MeshApi` | Decimate, DecimateToTolerance |\n| `AnalyzeApi` | ThicknessAt, ThicknessAtPoints, GlobalThickness |\n| `WeightApi` | Metals, Calculate, CalculateForObjects, CalculateForSelection, CalculateByArea, CalculateSelectionByArea |","metadata":{"title":"API Reference","section":"Everything at a glance","url":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","source":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","collection":"scripting","hash":"cf3a3288592c9d61ad20540ec1920279","indexed_by":"docs-index"}},{"content":"API Reference — Everything at a glance\n\n| Facade | Methods |\n|---|---|\n| `DraftingApi` | ReportTemplates, ExportGemsList, CreateReport, CreateReportFromTemplate, CreateGemsMap, CreateGemsTable, CreateMetalsTable, CreateBreakdownTable, GenerateDimensions, GenerateDimensionsFromRing, GenerateDimensionsByBox, GenerateDimensionsFromBangle |\n| `ManufacturingApi` | AutomaticRepair, AddIdentifier, SprueSingle, SprueInnerTree, SprueInnerBranches, SprueExternalTree, SprueMultipleCopies, SprueCurve, SprueExternalFrames, SprueTree, SprueClusterTree, SprueHelix, SprueSpiral, ResizeRing, QuickCheck |\n| `PricingApi` | Calculate, CalculateDetailed, GetSettingsJson, ShowPanel, SetSetting |\n| `RealtimeRenderApi` | ShowRealtimeRender, UpdateRender, SetViewerCameraPreset, SetViewerCamera, ViewerZoomExtents, GetViewerItems, SetMaterialByLayer, SetViewerMaterial, EditViewerMaterial, SetViewerBackground, SetViewerEnvironment, SetViewerOption, SetViewerOptions, ViewerScreenshot, CaptureViews, StartVideoRecording, StopVideoRecording, RecordTurntable |\n| `RenderApi` | CreatePair, LieOnGround, ApplyDesignMaterials, ApplyRenderMaterials, BatchRender |\n| `RenderStudioApi` | ListEnvironments, ListMaterialFamilies, ListMaterials, ApplyEnvironment, ApplyMaterial, RenderStill, RenderTurntable |\n| `NivodaApi` | Search, ClearCache |\n| `FileSearchApi` | Search, Count, Reindex |\n| `SemanticsApi` | DescribeDocument |\n| `PanelsApi` | Active, Close |\n| `Transaction` | Begin |\n\nThe guides here walk through each area with examples. For the exact signature of every method of every facade — including the facades without a guide yet — see the .NET API, generated from the plugin so it always matches your version. For Python 3, the rhinoartisan package.","metadata":{"title":"API Reference","section":"Everything at a glance","url":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","source":"https://www.rhinoartisan.com/docs/scripting/reference/#everything-at-a-glance","collection":"scripting","hash":"aba3a8756401557595ffc56b39adfa10","indexed_by":"docs-index"}},{"content":"Accessories\n\nEvery smart component in Artisan's Components family can be created from a script. Each facade mirrors its panel's Accept button exactly — same custom object type, same destination layer, same metal material — and the result is the same editable component the panel inserts. Each has its own page.\n\nBail The pendant bail, with optional O-ring.\n\nBangle A bangle from width, height and aperture — open or closed.\n\nBead A bead with its stringing hole, square or round.\n\nCharm A charm from a profile asset.\n\nLink A chain link, with optional twist.\n\nNamed pendant A name written as a solid, editable pendant.\n\nHinge Cut a hinge into an existing solid.\n\nMilgrain A run of beads along a curve.\n\nRope Twisted strands along a curve.\n\nVoronoi Fill a closed curve with a Voronoi pattern.\n\nHoneycomb Fill a closed curve with hexagonal cells.\n\nTexture 3D Emboss a grayscale heightmap onto a surface.\n\nChain Repeat objects along a curve.\n\nPattern A grid of copies, optionally flowed onto a surface.\n\nProfile sweep A parametric sweep through closed profile curves.\n\nSmart profile Profile sections swept along a curve, editable section by section.\n\nUser element Tag a selection as a named, Outliner-listed element.\n\nEngraving Text engraved around a ring band.\n\nEditing smart components Find a bail, bangle, charm… and edit it after creation.","metadata":{"title":"Accessories","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/","collection":"scripting","hash":"0fcb95362136cd4367f4507f1f9473a3","indexed_by":"docs-index"}},{"content":"Accessories — What each one starts from\n\nThe first thing to know about a component is what you have to give it. That decides whether you can build it out of nothing or whether something must already exist in the document.\n\n| Starts from | Components |\n|---|---|\n| A plane — free-standing, built out of nothing | Bail, Bangle, Bead, Charm, Link, Named pendant, Engraving |\n| A curve | Milgrain, Rope, Voronoi, Honeycomb, Chain, Smart profile |\n| A surface | Texture 3D |\n| An existing solid or object | Hinge, Pattern, Profile sweep, User element |\n\nIn the free-standing components, an omitted or invalid `plane` uses the active view's construction plane.","metadata":{"title":"Accessories","section":"What each one starts from","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#what-each-one-starts-from","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#what-each-one-starts-from","collection":"scripting","hash":"85a20b1c6e856a7f634784c154beaeed","indexed_by":"docs-index"}},{"content":"Accessories — Conventions\n\nThe `0`-keeps-default convention: every numeric parameter accepts `0` to mean \"use the tool's default (or my saved defaults)\". The exceptions are the parameters where `0` is itself meaningful — Link's `twistAngle`, Hinge's `openingAngle`, Pattern's `reverseMode` and Profile sweep's continuities — which use `-1` instead.\n\n`profile` does not mean the same thing everywhere: Bail and Bangle take a `RING_PROFILE` asset name, Charm takes a `CHARM_PROFILE` one, and Bead takes a fixed `\"SQUARE\"` / `\"ROUND\"` vocabulary rather than an asset at all.\n\nSaved-defaults nuance: for Bail, Bangle and Charm, passing an explicit `profile` skips your saved defaults for the other parameters too; the rest apply saved defaults before your overrides.","metadata":{"title":"Accessories","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#conventions","collection":"scripting","hash":"087aa188113521cc52a1f2832d362d7f","indexed_by":"docs-index"}},{"content":"Accessories — What comes back\n\nUnlike the gemsets and shanks, most of these facades return plain object ids, not parametric handles. To edit a component after creating it, pass one of those ids to `SmartComponentApi.Find`:\n\n- Editable by path: Bail, Named pendant, Bangle, Bead, Charm, Link, Milgrain, Rope, Texture 3D and Engraving. `SetParameter(\"top_profile.width\", …)` regenerates the component in place, and `SetElement(name)` applies a saved preset where that component has one.\n- Typed handle: Smart profile returns `ISmartProfile` handles directly.\n- Not editable from scripts: Voronoi, Honeycomb, Hinge, Chain, Pattern, Profile sweep and User element. Re-open them in their panel, or delete and rebuild. `UserElementApi.List()` still names the user elements in the document.\n\nBail, Bangle, Bead, Charm, Named pendant and Smart profile can also start from a saved element with `element=`.\n\n- All of these are licensed mutations — wrap them in a `Transaction` for one-step undo.\n- Passing an id that isn't the expected kind fails with a clear message (*\"Object … is not a curve.\"*), and a computation that can't succeed with the given inputs raises *\"… computation failed\"* naming the tool.","metadata":{"title":"Accessories","section":"What comes back","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#what-comes-back","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#what-comes-back","collection":"scripting","hash":"978abc01c3d7abdcc990ac8b4d5f376d","indexed_by":"docs-index"}},{"content":"Accessories — Where the results land\n\nMost components route their geometry to the metal layer with the document's metal material, exactly like the panel's Accept — but not all of them, and the difference matters if you are building a pipeline that expects everything on one layer.\n\n| Lands on | Components |\n|---|---|\n| Metal layer, metal material — the norm | Bail, Bangle, Bead, Charm, Link, Milgrain, Rope, Texture 3D, Engraving (its solid text; the curves go to the user layer) |\n| Metal material, but the current layer | Named pendant |\n| The source object's attributes — layer, colour and material inherited | Hinge, Chain |\n| Default attributes — no layer routing, no material | Pattern, Profile sweep |\n| Mixed | Voronoi, Honeycomb — only some result shapes become editable components with the metal material; Honeycomb's lattice curves land on the secondary object layer with default attributes |\n\nHinge is the one destructive component: like the tool's Accept, the source solid is *replaced* by the hinged parts.","metadata":{"title":"Accessories","section":"Where the results land","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#where-the-results-land","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/#where-the-results-land","collection":"scripting","hash":"67086c37533448f809c688e2df86595a","indexed_by":"docs-index"}},{"content":"Bail\n\n```python\nfrom ArtisanPlugin.Scripting import BailApi\n```\n\nThe bail is the loop soldered or fused to the top of a pendant so a chain can pass through it. Artisan builds it as a tapered arch swept along a ring profile - wider where it meets the pendant, narrower at the top - and can add a torus O-ring hanging from it.","metadata":{"title":"Bail","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/","collection":"scripting","hash":"04a780f7377dfeb60b074612ec72824e","indexed_by":"docs-index"}},{"content":"Bail — Create\n\n```python\nids = BailApi.Create(plane = ..., diameterTop = 3, diameterBottom = 1, distance = 5,\n                     withORing = False, name = None, profile = None,\n                     topWidth = 4, topHeight = 1.4, bottomWidth = 1, bottomHeight = 1,\n                     topProfile = None, bottomProfile = None,\n                     startingOnTop = 0.5, startingOnBottom = 0.5, curveTension = 1,\n                     oRingThickness = 1, oRingDiameter = 2, oRingOverlap = 1,\n                     oRingRotation = 0, element = None)                  # -> [ids]\n```","metadata":{"title":"Bail","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","collection":"scripting","hash":"b1d6389431ceb837eb6e5eae0295a637","indexed_by":"docs-index"}},{"content":"Bail — Create\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `plane` | active CPlane | Placement plane. If omitted or invalid, the active view's construction plane is used, then `Plane.WorldXY` |\n| `diameterTop` | `3` | Diameter at the top of the arch, mm |\n| `diameterBottom` | `1` | Diameter where the bail meets the pendant, mm |\n| `distance` | `5` | Height of the bail, mm |\n| `topWidth` / `topHeight` | `4` / `1.4` | Wire cross-section at the top, mm. This, not the diameters, is what drives the weight |\n| `bottomWidth` / `bottomHeight` | `1` / `1` | Wire cross-section at the bottom, mm |\n| `profile` | saved/default | A `RING_PROFILE` asset name (or `\"id: \"`) for both the top and the bottom |\n| `topProfile` / `bottomProfile` | — | The same, for one end only. These override `profile` |\n| `startingOnTop` / `startingOnBottom` | `0.5` | Where the side curves leave the top loop and reach the bottom one |\n| `curveTension` | `1` | Tension of the side curves |\n| `withORing` | `False` | `True` also builds the torus O-ring. `False` builds none |\n| `oRingThickness` / `oRingDiameter` / `oRingOverlap` | `1` / `2` / `1` | O-ring size, mm |\n| `oRingRotation` | `0` | O-ring rotation, degrees |\n| `name` | `\"Bail\"` | Name stored on the component, shown in the Outliner |\n| `element` | — | A saved Bail element (for example the factory `BL001`) to start from |\n\n`profile` here is a `RING_PROFILE` asset name - the same vocabulary as shanks and bangles. See Assets for the names available in your installation. (Bead's `profile` is a fixed `\"SQUARE\"`/`\"ROUND\"` vocabulary instead, and Charm's is a `CHARM_PROFILE` - the three are not interchangeable.)","metadata":{"title":"Bail","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","collection":"scripting","hash":"3ab7c2bbfeccd7327ca949fedfb7efe9","indexed_by":"docs-index"}},{"content":"Bail — Create\n\nMillimetres follow the house `0`-keeps-default convention: `0` means \"use the tool's default, or my saved defaults\". The three curve-shape arguments and `oRingRotation`, where `0` is a meaningful value, keep their default when omitted.\n\n`Create` returns the ids of the created breps: one for the bail itself, plus a second for the O-ring when there is one. The breps are added as Artisan brep objects on the metal layer, so the bail is weighed with the piece, and they get the document's metal material. They are gathered into a single group that carries the serialised parameters in user data. That group is what makes the component editable afterwards.","metadata":{"title":"Bail","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#create","collection":"scripting","hash":"8b3afe875ac865b6868822d524fe708b","indexed_by":"docs-index"}},{"content":"Bail — Where the starting values come from\n\n1. With `element`: the preset replaces the whole starting model. A `profile` you pass replaces both of its profiles. `withORing = False` keeps the preset's own O-ring choice, and `True` forces one.\n2. Without `element`: the ring-profile asset is resolved first. Your saved bail defaults replace the model, but only when you pass no profile at all (`profile`, `topProfile` or `bottomProfile`). If you ask for a profile, pass the other dimensions you care about alongside it.\n3. Every explicit argument is then applied on top.\n\nThis is a licensed mutation, so it needs a valid licence, and it fails with *\"No active document.\"* when there is none. If the geometry cannot be computed with the given numbers, it raises *\"Bail computation failed with the given parameters.\"* and nothing is added. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Bail","section":"Where the starting values come from","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#where-the-starting-values-come-from","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#where-the-starting-values-come-from","collection":"scripting","hash":"198529f4bc3577eb4c7232044b42d93b","indexed_by":"docs-index"}},{"content":"Bail — Edit\n\nA bail stays editable after creation: `SmartComponentApi` finds it from any of its pieces and edits its parameters by path, keeping the same ids:\n\n```python\nfrom ArtisanPlugin.Scripting import BailApi, SmartComponentApi, Transaction\n\nwith Transaction.Begin(\"Heavier bail\"):\n    ids = BailApi.Create(element = \"BL001\", withORing = True)\n    bail = SmartComponentApi.Find(ids[0])\n    bail.SetParameters('{\"DiameterTop\": 3.5, \"TopProfile\": {\"Width\": 4.5}}')\n```\n\nThrough MCP, use `create_bail` to create and `edit_object` to edit, for example `{\"top_profile.width\": 4.5}`.","metadata":{"title":"Bail","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bail/#edit","collection":"scripting","hash":"1009ffb3bbc012746e5d985e4b2145e3","indexed_by":"docs-index"}},{"content":"Bangle\n\n```python\nfrom ArtisanPlugin.Scripting import BangleApi\n```\n\nA bangle is the rigid bracelet that slips over the hand rather than fastening around the wrist. Artisan sweeps a ring profile around an oval defined by its width and height, either as a full closed hoop or as an open one with a gap of a given aperture.","metadata":{"title":"Bangle","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/","collection":"scripting","hash":"e7f7a5dd9eb64d57d46903e29bba8249","indexed_by":"docs-index"}},{"content":"Bangle — Create\n\n```python\nid = BangleApi.Create(plane = ..., width = 50, height = 30, aperture = 10,\n                      closed = False, profile = None)                     # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `plane` | active CPlane | Placement plane; omitted or invalid falls back to the active view's construction plane, then to `Plane.WorldXY` |\n| `width` | `50` | Inner width of the oval, mm |\n| `height` | `30` | Inner height of the oval, mm |\n| `aperture` | `10` | Opening of the open type, mm - ignored when `closed` is `True` |\n| `closed` | `False` | `True` builds the full hoop (type `CLOSED`) |\n| `profile` | saved/default | A `RING_PROFILE` asset name, applied to all three bangle profiles |\n\n`profile` here is a `RING_PROFILE` asset name, like Bail's - see Assets. It is the same string for all three of the bangle's profile slots. Do not confuse it with Bead's fixed `\"SQUARE\"`/`\"ROUND\"` vocabulary or Charm's `CHARM_PROFILE`.\n\nNumeric parameters follow the `0`-keeps-default convention: `0` means \"use the tool's default, or my saved defaults\". There is no `-1` sentinel on this facade.\n\n`Create` returns the single Guid of the bangle object - a parametric Bangle custom object, added to the metal layer with the document's metal material, exactly like the panel's Accept.\n\nDefaults resolve as in the tool: the ring-profile asset is resolved first (by name when `profile` is given), then your saved bangle defaults replace the whole model - but only when no explicit `profile` was passed. Requesting a profile therefore skips your saved defaults for width, height and aperture as well, so state them explicitly when you need them.","metadata":{"title":"Bangle","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/#create","collection":"scripting","hash":"40959005c23a7f458abbcd8096e4e2d8","indexed_by":"docs-index"}},{"content":"Bangle — Create\n\nThis is a licensed mutation and needs an active document. A failed computation raises *\"Bangle computation failed\"* with the kernel's message appended, and adds nothing. Wrap the call in a `Transaction` for one-step undo.","metadata":{"title":"Bangle","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bangle/#create","collection":"scripting","hash":"8edc3b38fb1e684180e7ee699be84b6c","indexed_by":"docs-index"}},{"content":"Bead\n\n```python\nfrom ArtisanPlugin.Scripting import BeadApi\n```\n\nA bead is the small pierced body strung onto a chain, cord or bracelet. Artisan builds it from its overall width and height with a stringing hole bored straight through, in either a square-sectioned or a round-sectioned form.","metadata":{"title":"Bead","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bead/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bead/","collection":"scripting","hash":"dbdc33f8cceb0178a54c7dbbb7985319","indexed_by":"docs-index"}},{"content":"Bead — Create\n\n```python\nid = BeadApi.Create(plane = ..., width = 10, height = 10, holeDiameter = 3,\n                    profile = None)                                       # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `plane` | active CPlane | Placement plane; omitted or invalid falls back to the active view's construction plane, then to `Plane.WorldXY` |\n| `width` | `10` | Overall width, mm |\n| `height` | `10` | Overall height, mm |\n| `holeDiameter` | `3` | Diameter of the stringing hole, mm |\n| `profile` | `\"SQUARE\"` | `\"SQUARE\"` or `\"ROUND\"` |\n\nBead's `profile` is not an asset name. It is a fixed vocabulary of exactly two values, `\"SQUARE\"` (the default) or `\"ROUND\"`, matched case-insensitively and trimmed. Anything else raises *\"Unknown bead profile '…'. Valid values: SQUARE, ROUND.\"* Bail and Bangle take a `RING_PROFILE` asset name and Charm a `CHARM_PROFILE` name (see Assets); none of those names will work here.\n\nThe three numbers follow the `0`-keeps-default convention: `0` means \"use the tool's default, or my saved defaults\". No `-1` sentinel is needed on this facade.\n\n`Create` returns the single Guid of the bead - a parametric Bead custom object, added to the metal layer with the document's metal material, exactly like the panel's Accept.\n\nDefaults resolve slightly differently from Bail, Bangle and Charm: because `profile` is not an asset here, your saved bead defaults are always applied first, whether or not you pass a `profile`, and your explicit arguments then override them. There is no skip-my-defaults trap on this page.\n\nThis is a licensed mutation and needs an active document. If the bead cannot be built with the given numbers it raises *\"Bead computation failed with the given parameters.\"* Wrap the call in a `Transaction` for one-step undo.","metadata":{"title":"Bead","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bead/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/bead/#create","collection":"scripting","hash":"6e1e515dc105d856bcb281cd604d35e8","indexed_by":"docs-index"}},{"content":"Chain\n\n```python\nfrom ArtisanPlugin.Scripting import ChainApi\n```\n\nA chain is a run of identical links threaded one after another along a path - the neckchain, the bracelet, the run of charms down a drop earring. Artisan divides the curve into equal segments, builds a perpendicular frame at each division point, and drops a copy of your link geometry onto every frame, so each copy sits square to the curve as it turns.","metadata":{"title":"Chain","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/","collection":"scripting","hash":"dda611d848b6bc94f3160021b3c229ea","indexed_by":"docs-index"}},{"content":"Chain — Create\n\n```python\nids = ChainApi.Create(objectIds, curveId, copies = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | current selection | The link objects to repeat. Empty or `None` falls back to the objects currently selected in the document |\n| `curveId` | required | The curve to lay the chain along; must resolve to a curve |\n| `copies` | `10` | Number of divisions of the curve |\n\n`copies` follows the house `0`-keeps-default convention: `0` means \"use the tool's default of 10, or my saved chain defaults\". Chain has no `-1` sentinel.\n\nThe count is a division count, not a placement count. The curve is divided by `copies` segments with the ends included, so an open curve receives `copies + 1` placements - `copies = 10` gives eleven copies of each source object, one at each end. The advanced options of the panel are not exposed here and keep whatever your saved defaults hold: the alternating odd/even rotations about X, Y and Z that give a chain its twist, the include-ends flag and curve adaptation.\n\n`Create` returns the ids of the copies it made - one id per source object per division point, so a two-object selection along a ten-division curve returns twenty-two ids. The source objects are kept. They are not consumed, moved or hidden; the copies are added alongside them.","metadata":{"title":"Chain","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/#create","collection":"scripting","hash":"7b1407f160575faefadfd133cf1b2007","indexed_by":"docs-index"}},{"content":"Chain — Create\n\nThe copies are made with Rhino's transform-with-history, so each one inherits the attributes of the object it came from - its layer, its colour, its material - and stays linked to the source through Rhino's history record. This is not the metal-layer routing the other accessories perform: the copies land where their sources lived, and it is the source objects themselves that Artisan moves onto the metal layer as it works. Chain also does not create an editable smart object; the results are ordinary Rhino copies, not a component you can reopen in the panel.\n\nPlacement is measured from the active view's construction plane, positioned at the centre of the combined bounding box of all the source objects. Move that centre and you move the chain relative to its curve.\n\nThis is a licensed mutation and needs an active document. It raises *\"Object <id> is not a curve.\"* when `curveId` names something else, *\"At least one object to repeat is required.\"* when neither `objectIds` nor the selection yields anything, *\"INVALID_COPIES\"* when the resolved copy count is 1 or less, and *\"Chain computation failed on that curve.\"* when no frames can be built along it. Wrap the call in a `Transaction` to get one-step undo over the whole run.","metadata":{"title":"Chain","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/chain/#create","collection":"scripting","hash":"1b01ea0e87eac1f975c62d4bb9a52670","indexed_by":"docs-index"}},{"content":"Charm\n\n```python\nfrom ArtisanPlugin.Scripting import CharmApi\n```\n\nA charm is the small flat pendant that hangs from a bracelet or a chain - a heart, a star, a clover. Artisan takes the outline from a charm profile asset and gives it its width, height and metal thickness.","metadata":{"title":"Charm","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/charm/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/charm/","collection":"scripting","hash":"b07513a1e0ef79dcf961c33c1cccc9f9","indexed_by":"docs-index"}},{"content":"Charm — Create\n\n```python\nid = CharmApi.Create(plane = ..., width = 8, height = 6, thickness = 2.8,\n                     profile = None)                                      # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `plane` | active CPlane | Placement plane; omitted or invalid falls back to the active view's construction plane, then to `Plane.WorldXY` |\n| `width` | `8` | Overall width, mm |\n| `height` | `6` | Overall height, mm |\n| `thickness` | `2.8` | Metal thickness, mm |\n| `profile` | saved/default | A `CHARM_PROFILE` asset name |\n\n`profile` here is a `CHARM_PROFILE` asset name - its own family, listed separately in Assets. Bail and Bangle take `RING_PROFILE` names and Bead takes the fixed `\"SQUARE\"`/`\"ROUND\"` vocabulary; a ring-profile name passed here will not resolve to the shape you expect.\n\nThe three numbers follow the `0`-keeps-default convention: `0` means \"use the tool's default, or my saved defaults\". This facade has no `-1` sentinel.\n\n`Create` returns the single Guid of the charm - a parametric Charm custom object, added to the metal layer with the document's metal material, exactly like the panel's Accept.\n\nDefaults resolve as in the tool: the charm-profile asset is resolved first (by name when `profile` is given), then your saved charm defaults replace the whole model - but only when no explicit `profile` was passed. Asking for a profile therefore also discards your saved width, height and thickness, so pass them alongside it.\n\nThis is a licensed mutation and needs an active document. If the charm cannot be built it raises *\"Charm computation failed with the given parameters.\"* Wrap the call in a `Transaction` for one-step undo.","metadata":{"title":"Charm","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/charm/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/charm/#create","collection":"scripting","hash":"53aec4f4af841750d2363f0f0ee6a493","indexed_by":"docs-index"}},{"content":"Engraving\n\n```python\nfrom ArtisanPlugin.Scripting import EngravingApi\n```\n\nThis is the ArtisanEngraveRing tool: the dedication engraved around a ring band - a date, a name, a line of a vow - not free-form engraving on an arbitrary surface. The tool takes the ring's inner diameter, wraps the text around that circle at the letter height and spacing you give it, and returns the lettering as engraving curves, plus solid letters when you ask for a thickness.","metadata":{"title":"Engraving","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/","collection":"scripting","hash":"887a30d35984dd55096b36d2f2b20bf3","indexed_by":"docs-index"}},{"content":"Engraving — Create\n\n```python\nids = EngravingApi.Create(text, diameter = 0, angle = 0, height = 1.5,\n                          spacing = 0.5, thickness = 0, font = None,\n                          fontStyle = \"Regular\", horizontalAlign = \"CENTER\",\n                          verticalAlign = \"CENTER\", plane = ...)          # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `text` | required | The text to engrave - empty or whitespace throws |\n| `diameter` | `0` -> the session's current finger size (`17.35` when none is set) | Inner diameter of the ring the text wraps around, mm |\n| `angle` | `0` | Rotates the text around the ring, degrees - the tool's gumball |\n| `height` | `0` -> tool default `1.5` | Cap height of the letters, mm |\n| `spacing` | `0` keeps -> tool default `0.5` | Letter spacing, mm; any non-zero value is taken, including negatives |\n| `thickness` | `0` | `0` gives flat engraving curves only; `> 0` also builds the solid text to that depth, mm |\n| `font` | `None` -> tool default Bienchen | Name of an installed font |\n| `fontStyle` | `None` -> `Regular` | `Regular`, `Bold` or `Italic` (case-insensitive) |\n| `horizontalAlign` | `None` -> `CENTER` | `LEFT`, `CENTER`, `RIGHT` or `JUSTIFY` |\n| `verticalAlign` | `None` -> `CENTER` | `TOP`, `CENTER` or `BOTTOM` |\n| `plane` | omitted or invalid -> the active view's construction plane, then world XY | The text orientation plane |\n\n`thickness` is the switch that decides what you get. At `0` the tool computes the lettering as engraving curves only - the outlines you would hand to a rotary engraver, or use as a cutter later. Above `0` it also builds the solid text as breps of that depth, which is what you want when the letters are to be raised or subtracted from the band.","metadata":{"title":"Engraving","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/#create","collection":"scripting","hash":"85695e8e3a2a5e0b58a4e3d813133374","indexed_by":"docs-index"}},{"content":"Engraving — Create\n\nDefaults resolve from your saved Engrave Ring defaults when you have any; otherwise from the tool's `TextOnCurve` model, seeded with `HorizontalAlign = \"CENTER\"` - so a fresh session centres the text even though the bare model would left-align it. Everything you pass explicitly overrides that. The diameter is read from the session's current finger size unless you give one, and the text is always spread over the full domain of the ring curve, as the panel does.\n\n`Create` returns a list of Guids, one per object baked, with no handle interface on the facade. The solid text breps go on the primary metal layer and the engraving curves on the primary user layer, and all of them join a single group named `Engrave Ring `. That group carries the serialised parameters as user data, which is what makes the result an editable Engrave Ring smart component the panel can re-open later.\n\nAn empty `text` throws `ArgumentException` before anything is computed, as do an unknown `fontStyle` or alignment name. When neither curves nor solids come out - in practice an unusable text or a font name that is not installed - `Create` raises `InvalidOperationException` with *\"Engraving computation failed. Check the text and the font name.\"* and adds nothing. This is a licensed mutation and needs an active document; wrap it in a `Transaction` so the group and all its parts undo in one step.","metadata":{"title":"Engraving","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/engraving/#create","collection":"scripting","hash":"6df955068ad6cf50bac7bc410c0ed97d","indexed_by":"docs-index"}},{"content":"Hinge\n\n```python\nfrom ArtisanPlugin.Scripting import HingeApi\n```\n\nA hinge is what lets a bangle, a locket or a hinged shank open: interleaved knuckles cut from the metal itself, threaded on a pin. The tool takes a solid you have already modelled, cuts it at the point you mark, builds the male and female knuckles and the pin, and hands back the resulting parts - the same operation the ArtisanHinge panel performs when you pick a point on a solid and press Accept.","metadata":{"title":"Hinge","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/","collection":"scripting","hash":"10a78f644bda66ff5b4b0f049696a139","indexed_by":"docs-index"}},{"content":"Hinge — Create\n\n```python\nids = HingeApi.Create(brepId, point, diameter = 0.7, cutDiameter = 4, thickness = 1,\n                      numberOfMales = 1, openingAngle = -1)              # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `brepId` | required | The solid to hinge - must be a brep, or geometry convertible to one |\n| `point` | required | Where the hinge goes on the solid (a `Point3d`) |\n| `diameter` | `0` -> tool default `0.7` | Pin diameter, mm |\n| `cutDiameter` | `0` -> tool default `4` | Diameter of the knuckle cut, mm |\n| `thickness` | `0` -> tool default `1` | Knuckle wall thickness, mm |\n| `numberOfMales` | `0` -> tool default `1` | Number of male knuckles |\n| `openingAngle` | `-1` -> tool default `10` | How far the hinge opens, degrees |\n\nUnlike Link and Named pendant, Hinge takes no plane: it works on an existing object. `brepId` must resolve to a brep - or to geometry with a brep form, which is converted - otherwise `ArgumentException` is thrown with the message *\"Object ... is not a solid/brep.\"*\n\nThe numeric parameters follow the house `0`-keeps-default convention, with `openingAngle` as the exception: `0` is a valid opening angle (a hinge that stays shut), so it uses `-1` as its keep-default sentinel and only values of `0` or greater are applied. Defaults start from the `Hinge` model the command uses and are overwritten by the user's saved hinge defaults when they have any.","metadata":{"title":"Hinge","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/#create","collection":"scripting","hash":"f54e2580ee065fdc2a4b9d71024cc3ee","indexed_by":"docs-index"}},{"content":"Hinge — Create\n\n`point` marks where the hinge sits on the solid, exactly as the tool's pick-point-on-solid does. It is not required to lie exactly on a face: the API projects it to the closest point on the brep with a very generous tolerance and takes the surface normal there to build the cutting plane. A point far off the solid will still project somewhere, but the resulting plane is unlikely to be usable and the computation typically fails with *\"Hinge computation failed. Check that the point lies on the solid.\"*\n\nHinge is destructive by design: like the tool's Accept, the source solid is *replaced* by the hinged parts. A failed computation leaves the input untouched.\n\nThe order matters and is worth stating plainly. The geometry is computed first; only if it succeeds is the source object deleted and the new parts added. So a thrown `InvalidOperationException` means your original solid is still there, unchanged.\n\n`Create` returns the list of Guids of the resulting parts. There is no handle and no query methods. Note that the parts are added with the source object's attributes, so they inherit its layer and material rather than being moved onto the metal layer - Hinge modifies an existing piece rather than adding a fresh accessory to it. Being a licensed and destructive mutation, this is the facade most worth wrapping in a `Transaction`, so that the delete and the additions undo together in one step.","metadata":{"title":"Hinge","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/hinge/#create","collection":"scripting","hash":"6ab69c75990f663dc1212e965cb273ac","indexed_by":"docs-index"}},{"content":"Honeycomb\n\n```python\nfrom ArtisanPlugin.Scripting import HoneyCombApi\n```\n\nThe regular hexagonal lattice used for openwork pendants, pierced panels and lightened backs - the disciplined cousin of the Voronoi pattern. The tool tiles hexagons of `diameter` across your closed outline, keeps the segments that fall inside it, then thickens those segments into walls and extrudes them.","metadata":{"title":"Honeycomb","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/","collection":"scripting","hash":"538d22ba5b4042f1182e3cbe21d89efe","indexed_by":"docs-index"}},{"content":"Honeycomb — Create\n\n```python\nids = HoneyCombApi.Create(curveId, diameter = 6, thickness = 0.8, height = 0)   # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | - | The existing outline the lattice fills - must be planar and closed |\n| `diameter` | `6` | Size of one hexagonal cell, mm |\n| `thickness` | `0.8` | Wall thickness, mm - `0` gives bare centre lines and no solid |\n| `height` | `0` | Wall height, mm - `0` gives flat outlines and no solid |\n\nThe curve must be closed. An open curve stops the computation with `CURVE_MUST_BE_CLOSED`, and a non-planar one with `CURVE_MUST_BE_PLANNAR`. The lattice is generated in the curve's own plane and transformed back, so the outline can sit anywhere in space as long as it is flat. A cell diameter the outline cannot accommodate raises `INVALID_PARAMETERS`.\n\n`height` defaults to `0`, and like Voronoi the kernel stops at whichever stage your parameters reach - centre lines, thickened outlines, or extruded walls. Pass `height > 0` if you want metal.\n\n```python\nfrom ArtisanPlugin.Scripting import HoneyCombApi, Transaction\n\nwith Transaction.Begin(\"Honeycomb back\"):\n    ids = HoneyCombApi.Create(curveId, diameter = 4, thickness = 0.5, height = 1.0)\n```\n\nThe returned list mixes two kinds of object, exactly as the panel's Accept does:\n\n- The solid, when the walls resolve to a single brep: a Honeycomb smart component (`HoneyCombCustomObject`, mother = your curve) on the metal layer with the document's metal material. If the walls resolve to several disjoint solids instead, no solid is added at all - only the curves below come back.\n- The lattice curves, always: the centre lines or the thickened wall outlines, added to the secondary object layer (*Object 02*) with default attributes, not to the metal layer and with no material.","metadata":{"title":"Honeycomb","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/#create","collection":"scripting","hash":"694eb53ea9386520e4635c7bc2c08a98","indexed_by":"docs-index"}},{"content":"Honeycomb — Create\n\nSo a call with a height returns the solid *and* its outline curves; a call without one returns only curves. If the thickened outlines collapse to a single curve the computation raises `INVALID_CURVES`, and any other failure surfaces as *\"Honeycomb computation failed on that curve.\"*\n\nEvery numeric parameter follows the house `0`-keeps-default convention - `0` means \"use my saved Honeycomb defaults, or the tool's\" - and no `-1` sentinel is needed, since `0` is not a meaningful cell size, thickness or height. Passing an id that is not a curve fails with *\"Object … is not a curve.\"* The lattice rotation angle the model carries is not exposed on this facade.\n\nThis is a licensed mutation - wrap it in a `Transaction` for one-step undo.","metadata":{"title":"Honeycomb","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/honeycomb/#create","collection":"scripting","hash":"5cc12f3a51b7ad7518bdc416f71c7e04","indexed_by":"docs-index"}},{"content":"Link\n\n```python\nfrom ArtisanPlugin.Scripting import LinkApi\n```\n\nA link is one closed loop of wire - the unit a chain is made of. The tool sweeps a round wire section around a rectangular loop of the given width and height, and can twist the loop about its long axis so that consecutive links interlock the way a figure-of-eight or twisted-curb chain does. It mirrors the ArtisanLink panel's Accept exactly.","metadata":{"title":"Link","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/","collection":"scripting","hash":"26ae42837688a4aacdae14cd6e2529f7","indexed_by":"docs-index"}},{"content":"Link — Create\n\n```python\nid = LinkApi.Create(plane = ..., width = 9, height = 6, diameter = 3,\n                    twistAngle = -1)                                # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `plane` | omitted or invalid -> the active view's construction plane | The plane the link is built on |\n| `width` | `0` -> tool default `9` | Length of the loop, mm |\n| `height` | `0` -> tool default `6` | Width of the loop across, mm |\n| `diameter` | `0` -> tool default `3` | Wire section diameter, mm |\n| `twistAngle` | `-1` -> tool default `90` | Twist of the loop about its long axis, degrees |\n\nAll dimensions are millimetres. Every numeric parameter follows the house `0`-keeps-default convention - except `twistAngle`, where `0` is a perfectly valid value (a flat, untwisted link). That parameter uses `-1` as its keep-default sentinel: only a value of `0` or greater is applied, so pass `-1`, or leave it out, to keep the default twist.\n\nDefaults resolve in two steps. `Create` starts from the same `Link` model the ArtisanLink command does, then overwrites it with the user's saved link defaults when they have any. Whatever you pass explicitly is applied on top of that, so a saved default only shows through on parameters you left at their sentinel.\n\nIf `plane` is omitted or is not a valid plane, the link is built on the construction plane of the active viewport, falling back to world XY when there is no active view.\n\n`Create` returns the Guid of the single baked link object. There is no handle and no query methods - a link is a plain result, not a live smart component you can interrogate later. The object lands on the metal layer with the document's metal material, exactly as the panel's Accept leaves it.","metadata":{"title":"Link","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/#create","collection":"scripting","hash":"4c0b67fcb4cf6638ffb56670f26703d3","indexed_by":"docs-index"}},{"content":"Link — Create\n\n`Create` throws `InvalidOperationException` when the geometry fails to compute with the given parameters - a wire diameter too large for the loop is the usual cause - and when the licence is not valid. Because this is a licensed mutation of the document, wrap it in a `Transaction` if you want the creation to collapse into a single undo step.","metadata":{"title":"Link","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/link/#create","collection":"scripting","hash":"956ed53cba31149687d420e4177589b5","indexed_by":"docs-index"}},{"content":"Milgrain\n\n```python\nfrom ArtisanPlugin.Scripting import MilgrainApi\n```\n\nMilgrain is the row of minute beads a setter runs along an edge or a bezel rim to soften it and catch the light - traditionally raised with a knurling wheel. The tool does the same digitally: it takes a curve you have already drawn, spaces spheres of the given diameter along it, and overlaps them slightly so the run reads as one continuous beaded rope rather than a string of separate balls.","metadata":{"title":"Milgrain","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/milgrain/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/milgrain/","collection":"scripting","hash":"aecc037b353138ff0be2c9638f31aba6","indexed_by":"docs-index"}},{"content":"Milgrain — Create\n\n```python\nid = MilgrainApi.Create(curveId, diameter = 0.8, overlapping = 0.1)     # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | required | The curve the beads run along |\n| `diameter` | `0` -> tool default `0.8` | Bead diameter, mm |\n| `overlapping` | `0` -> tool default `0.1` | How much consecutive beads overlap, mm |\n\nMilgrain takes no plane: the curve is the path, and it decides where the beads go. `curveId` is resolved against the document and must be a curve; anything else - a solid, a surface, or an id that is not in the document at all - throws `ArgumentException` with the message *\"Object ... is not a curve.\"* before any geometry work begins.\n\nBoth numeric parameters follow the house `0`-keeps-default convention, and there is no `-1` sentinel here: neither a zero bead diameter nor a zero overlap is meaningful. Defaults come from the `Milgrain` model the ArtisanMilgrain command uses, overwritten by the user's saved milgrain defaults when they have any.\n\n`Create` returns the single Guid of the baked milgrain object. There is no handle and no query methods on this facade. The object is a smart component that remembers the curve it was built on, and it lands on the metal layer with the document's metal material, exactly as the panel's Accept leaves it. The source curve itself is left alone.\n\n`Create` throws `InvalidOperationException` with *\"Milgrain computation failed on that curve.\"* when the beads cannot be built - a curve far shorter than one bead, or an overlap large enough to swallow the spacing, are the usual causes - and it throws when the licence is not valid. Wrap the call in a `Transaction` if you want it to undo as a single step.","metadata":{"title":"Milgrain","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/milgrain/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/milgrain/#create","collection":"scripting","hash":"81f019adbf34e48d51c4bd06bca7aeda","indexed_by":"docs-index"}},{"content":"Named pendant\n\n```python\nfrom ArtisanPlugin.Scripting import NamedPendantApi\n```\n\nA name pendant is a word cut in metal and worn as a pendant: the letters are extruded to a thickness and joined to each other - and, on a script font, to the connecting plate or rail that keeps loose letters from falling apart. The tool takes the text and a font, builds the letter solids on the plane you give it, and bakes them as an editable smart component so the name can be changed afterwards from the panel.","metadata":{"title":"Named pendant","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/","collection":"scripting","hash":"31b931ce804bda1408d0a027ef684441","indexed_by":"docs-index"}},{"content":"Named pendant — Create\n\n```python\nids = NamedPendantApi.Create(text, plane = ..., height = 5, thickness = 0.4,\n                             font = None)                              # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `text` | required | The name to write - empty or whitespace throws |\n| `plane` | omitted or invalid -> the active view's construction plane | The plane the name is written on |\n| `height` | `0` -> tool default `5` | Cap height of the letters, mm |\n| `thickness` | `0` -> tool default `0.4` | Extrusion depth of the letters, mm |\n| `font` | `None` -> tool default Arial bold | Name of an installed font |\n\n`text` is the only required argument; a null, empty or whitespace string throws `ArgumentException` before anything is computed. The numeric parameters follow the house `0`-keeps-default convention, and `font` keeps the default when it is null or whitespace. Defaults come from the same `NamedPendant` model the ArtisanNamedPendant command uses, overwritten by the user's saved named-pendant defaults when they have any.\n\nAn omitted or invalid `plane` falls back to the construction plane of the active viewport, and to world XY when there is no active view.\n\n`Create` returns a list of Guids - one per baked brep, so letters plus any plate or rail the font requires - not a single id. There is no handle and no query methods on this facade; if you need to reach the result again, keep the returned ids.","metadata":{"title":"Named pendant","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/#create","collection":"scripting","hash":"27ecdc6b9ca43295ce05e6dd7287897b","indexed_by":"docs-index"}},{"content":"Named pendant — Create\n\nThe parts are baked as editable brep custom objects, given the document's metal material and put into one Rhino group named `Named Pendant `. The parameters are serialised onto that group as smart-component user data, which is what lets the panel re-open and re-edit the name later. Note that, unlike the other accessories, the parts keep the document's current layer rather than being moved to the metal layer - only the material is applied.\n\n`Create` throws `InvalidOperationException` when the name fails to compute, which in practice means an unusable text or a font name that is not installed. Being a licensed mutation, it is worth wrapping in a `Transaction` so the whole pendant - group and all its parts - undoes in one step.","metadata":{"title":"Named pendant","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/named-pendant/#create","collection":"scripting","hash":"cc7ce1cc3f02297e1822dd537bd0313d","indexed_by":"docs-index"}},{"content":"Pattern\n\n```python\nfrom ArtisanPlugin.Scripting import PatternApi\n```\n\nPattern is the motif repeater: one carved element - a scroll, a link, a pierced cell, a bead - laid out in a rectangular grid and then wrapped onto a curved body so the repeat follows a dome, a band or the shoulder of a ring. Artisan arrays a duplicate of the source in world XY, measures the bounding rectangle of the finished grid, and morphs that rectangle onto the target surface with a Sporph flow.","metadata":{"title":"Pattern","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/","collection":"scripting","hash":"367874ec92e70466d1043ef469d9991b","indexed_by":"docs-index"}},{"content":"Pattern — Create\n\n```python\nids = PatternApi.Create(objectId, surfaceId = Guid.Empty, columns = 2, rows = 3,\n                        xPadding = 0, yPadding = 0, rotation = 0, zMove = 0,\n                        maxThickness = 0, reverseMode = -1)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectId` | required | The source object to repeat; must exist in the document |\n| `surfaceId` | none | Surface to flow the finished grid onto. Omit to leave the grid flat. A brep is accepted and its first face is used |\n| `columns` | `2` | Cells across |\n| `rows` | `3` | Cells down |\n| `xPadding` | `0` | Gap added between columns, mm |\n| `yPadding` | `0` | Gap added between rows, mm |\n| `rotation` | `0` | Degrees about Z, accumulating cell by cell |\n| `zMove` | `0` | Lifts the source before arraying, mm |\n| `maxThickness` | off | `> 0` rescales the source in Z to that thickness before arraying |\n| `reverseMode` | keep (`-1`) | Mirrors the flow. See below |","metadata":{"title":"Pattern","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#create","collection":"scripting","hash":"ea38ead6ec07fd12e72a3ee1d98c554f","indexed_by":"docs-index"}},{"content":"Pattern — reverseMode\n\nThe flow maps a flat rectangle onto your surface, and which corner of the rectangle meets which corner of the surface decides whether the pattern lands the right way round or mirrored. `reverseMode` flips the rectangle before the morph:\n\n| Value | Effect |\n|---|---|\n| `0` | No reversal |\n| `1` | Reverse U |\n| `2` | Reverse V |\n| `3` | Reverse both |\n| `-1` | Keep the saved or tool default |\n\nValues outside `0`-`3` are silently treated as no reversal. `reverseMode` has no effect at all when `surfaceId` is omitted, since nothing is flowed.\n\nNumeric parameters follow the house `0`-keeps-default convention, except `reverseMode`. Zero is a meaningful mode there - it means \"no reversal\" - so it uses a `-1` sentinel instead.\n\nNote also that `xPadding`, `yPadding`, `rotation` and `zMove` are compared against zero rather than tested for positivity: negative values are applied as given, and only an exact `0` keeps the default (which is itself `0`).","metadata":{"title":"Pattern","section":"reverseMode","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#reversemode","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#reversemode","collection":"scripting","hash":"01e6644389fe0933f21916c758f93e0c","indexed_by":"docs-index"}},{"content":"Pattern — Result\n\n`Create` returns the ids of the created copies, one per cell. The source object is left untouched - it is not consumed, moved or hidden; the grid is built from duplicates, exactly as the panel does it.\n\nUnlike every other smart component, Pattern's results are baked with default attributes: no metal-layer routing, no metal material, no group, no editable custom object. They land on the document's current layer with the current display attributes, as plain geometry. If you want them on a particular layer or material, set that yourself on the returned ids afterwards.\n\nThe source is duplicated and translated so its bounding-box minimum sits at the world origin before the grid is built, so the array starts at the origin rather than where the source object happens to sit. `zMove` is applied to that repositioned copy, and `maxThickness` rescales it in Z only, keeping X and Y as they are.\n\nYour saved pattern defaults always replace the model before the arguments are applied - Pattern takes no profile asset, so there is no \"explicit profile skips the saved defaults\" caveat here.\n\nThis is a licensed mutation and needs an active document. It raises *\"Object <id> not found.\"* for a missing `objectId`, *\"Object <id> is not a surface.\"* when `surfaceId` names something with no usable surface, and *\"Pattern computation failed with the given parameters (...)\"* for geometry that cannot be built - including *INVALID_COLUMNS* or *INVALID_ROWS* for a grid smaller than one cell, and *INVALID_MAX_THICKNESS* for a `maxThickness` below `0.1` mm. Nothing is added when the computation fails. Wrap the call in a `Transaction` to get one-step undo over the whole grid.","metadata":{"title":"Pattern","section":"Result","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#result","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/pattern/#result","collection":"scripting","hash":"aa004c94b5313e1e53915490717333ad","indexed_by":"docs-index"}},{"content":"Profile sweep\n\n```python\nfrom ArtisanPlugin.Scripting import ProfileSweepApi\n```\n\nA profile sweep is the body a jeweller builds by lofting a chain of closed sections: the waist of a shank that swells towards the head, the tapering arm of a bypass, the horn of a claw. You draw the closed profiles where you want them along the piece, and the tool sweeps through them in the order you list, with a chosen end condition and cap at each end.","metadata":{"title":"Profile sweep","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/","collection":"scripting","hash":"c78127fb515f10fab9566863f684f1f5","indexed_by":"docs-index"}},{"content":"Profile sweep — Create\n\n```python\nids = ProfileSweepApi.Create(curveIds, startCap = \"ROUND\", endCap = \"ROUND\",\n                             startCapHeight = 0.2, endCapHeight = 0.2,\n                             startContinuity = -1, endContinuity = -1,\n                             startFlip = False, endFlip = False,\n                             symmetry = \"NONE\", subD = False,\n                             subDSegments = 32, subDRailSegments = 10)   # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveIds` | required | The closed profile curves, in sweep order; at least two |\n| `startCap` / `endCap` | `None` -> `ROUND` | Cap on that end: `NONE`, `FLAT` or `ROUND` |\n| `startCapHeight` / `endCapHeight` | `0` -> tool default `0.2` | Height of a `ROUND` cap, mm |\n| `startContinuity` / `endContinuity` | `-1` keeps -> tangency (`1`) | End condition: `0` G0 position, `1` G1 tangency, `2` G2 curvature, `3` G3, `4` G4 |\n| `startFlip` / `endFlip` | `False` | Flips that end condition |\n| `symmetry` | `None` -> `NONE` | `NONE`, `VERTICAL` (mirror across world YZ), `HORIZONTAL` (mirror across world ZX) or `QUAD` (both) |\n| `subD` | `False` | `True` outputs a SubD instead of a Brep; caps do not apply |\n| `subDSegments` | `0` -> tool default `32` | Cross-section samples per profile, clamped to 3..256; SubD output only |\n| `subDRailSegments` | `0` -> tool default `10` | Total rings along the rail, clamped to 1..50; SubD output only |","metadata":{"title":"Profile sweep","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","collection":"scripting","hash":"cd918b9a65dd232c8be251248e05c979","indexed_by":"docs-index"}},{"content":"Profile sweep — Create\n\nThe continuities are the one place where the house `0`-keeps-default convention would lie, because `0` is a real value here - G0, position continuity. They therefore use a `-1` sentinel: pass `-1` (the default) to keep the tool's or your saved value, and `0` when you actually want position continuity. Anything outside `0..4` throws `ArgumentException`. Every other numeric parameter behaves as usual: `0` keeps the tool's default or your saved profile-sweep defaults.\n\n`Create` returns a list of Guids and nothing else - there is no handle interface on this facade, so keep the ids if you need to reach the result again.\n\nWhat is in that list depends on `subD`. Brep results are baked as parametric ProfileSweep custom objects: the Outliner lists them, they can be re-edited from the panel, and their mothers are the profile curves you passed in. SubD results are added as plain SubDs, with no parameters attached and nothing to re-edit. Either way the source curves stay untouched, and - unlike most accessories - neither output is routed to the metal layer or given the metal material; they are baked where the document currently is.\n\nSymmetry mirrors the finished sweep and then tries to join the pieces, so `VERTICAL` or `HORIZONTAL` usually still returns one id rather than two, and `QUAD` one rather than four. When the mirrored pieces cannot be joined you get the separate pieces back.\n\nDefaults come from the `ProfileSweep` model the ArtisanProfileSweep command uses, replaced wholesale by your saved profile-sweep defaults when you have any, and then overridden by whatever you passed explicitly.","metadata":{"title":"Profile sweep","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","collection":"scripting","hash":"6adbdea6850f7786f04146427ab87b95","indexed_by":"docs-index"}},{"content":"Profile sweep — Create\n\nFewer than two curves throws `ArgumentException`, as does an id that is not a curve, an unknown cap mode or an unknown symmetry name. Curves that are not closed planar profiles do not throw at resolution time - they fail in the kernel and raise `InvalidOperationException` with *\"Profile sweep computation failed. Check that the curves are closed planar profiles.\"*, adding nothing to the document. This is a licensed mutation and needs an active document; wrap it in a `Transaction` for one-step undo.","metadata":{"title":"Profile sweep","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/profile-sweep/#create","collection":"scripting","hash":"9e7b1453a99eea9b62f3a1023521ed88","indexed_by":"docs-index"}},{"content":"Rope\n\n```python\nfrom ArtisanPlugin.Scripting import RopeApi\n```\n\nThe twisted rope wire jewellers use as a bezel border, a decorative shank or the edge of a bangle: several round strands laid side by side and wound around each other. The tool builds one cross-section from `threads` overlapping circles, extrudes it, twists the extrusion `turns` complete revolutions, and then flows the whole twisted bar onto the curve you give it.","metadata":{"title":"Rope","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/","collection":"scripting","hash":"faf3205886e612a7e8a7b966dccce077","indexed_by":"docs-index"}},{"content":"Rope — Create\n\n```python\nid = RopeApi.Create(curveId, diameter = 1.6, width = 3, threads = 3, turns = 5)   # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | - | The existing curve the rope runs along - it is the rail, not a plane |\n| `diameter` | `1.6` | Diameter of a single strand, mm |\n| `width` | `3` | Overall diameter of the finished rope - the circle the strands sit inside |\n| `threads` | `3` | How many strands are wound together |\n| `turns` | `5` | Complete twists over the whole length of the curve |\n\n`width` and `diameter` work together: each strand is placed at `(width - diameter) / 2` from the centre, so a wide rope with thin strands leaves the strands separate. When the strands do not overlap enough to merge into one closed profile the computation stops with `REDUCE_THE_WIDTH_OR_INCREASE_THREAD_DIAMETER`. An open curve comes back with its two ends capped; a closed curve comes back as a continuous loop with no caps.\n\nReturns the id of a single Rope smart component - a `RopeCustomObject` that remembers `curveId` as its mother curve, so the Outliner can still edit it afterwards. It lands on the metal layer with the document's metal material, exactly like the panel's Accept. The source curve is left untouched.\n\nEvery numeric parameter follows the house `0`-keeps-default convention: pass `0` (or omit it) and the value comes from your saved Rope defaults, or from the tool defaults above if you have none. There is no `-1` sentinel here - `0` is not a meaningful strand diameter, width, thread count or turn count, so nothing is lost.\n\nPassing an id that is not a curve fails immediately with *\"Object … is not a curve.\"*, and a curve the rope cannot be flowed onto raises *\"Rope computation failed on that curve.\"*","metadata":{"title":"Rope","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/#create","collection":"scripting","hash":"d0de7271d23d795bf760dd4e5e6568a4","indexed_by":"docs-index"}},{"content":"Rope — Create\n\nThis is a licensed mutation. Wrap it in a `Transaction` so the whole thing undoes in one step:\n\n```python\nfrom ArtisanPlugin.Scripting import RopeApi, Transaction\n\nwith Transaction.Begin(\"Rope border\"):\n    RopeApi.Create(curveId, diameter = 0.9, width = 2.2, threads = 4, turns = 12)\n```","metadata":{"title":"Rope","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/rope/#create","collection":"scripting","hash":"2352304f6ce301f23fadf0df5bbbe5fb","indexed_by":"docs-index"}},{"content":"Editing smart components\n\n```python\nfrom ArtisanPlugin.Scripting import SmartComponentApi\n```\n\nThe accessory creators (`BailApi`, `BangleApi`, `BeadApi`, …) return plain object ids. `SmartComponentApi` gives you a handle on the result, so a component can be edited after it is created, take a preset, or be read back. This works from a script and through MCP, without opening its panel.\n\nIt covers Bail, Named pendant, Bangle, Bead, Charm, Link, Milgrain, Rope, Texture 3D and Engrave ring. Voronoi, Honeycomb and User element are not covered yet.","metadata":{"title":"Editing smart components","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/","collection":"scripting","hash":"2224e2b1eca5d0345e01a53eabe87b7d","indexed_by":"docs-index"}},{"content":"Editing smart components — Finding them\n\n| Method | Returns |\n|---|---|\n| `Find(id)` | The handle for a component. For bails and named pendants the id can be any member of the group. Returns `None` when the id isn't one of these components |\n| `All()` / `Count()` | Every component of these kinds in the document |\n| `Selected()` | Components with at least one member selected |\n| `ByLayer(name)` | Components on a layer, by full path |","metadata":{"title":"Editing smart components","section":"Finding them","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#finding-them","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#finding-them","collection":"scripting","hash":"b02dfed88617ff8a161f1fca4c3fe3d6","indexed_by":"docs-index"}},{"content":"Editing smart components — The handle\n\nA smart component has no typed setters. `ISmartComponent` edits the stored kernel model directly, the same JSON its panel saves:\n\n| Member | Does |\n|---|---|\n| `Component` | `Bail`, `NamedPendant`, `EngraveRing`, `Bangle`, `Bead`, `Charm`, `Link`, `Milgrain`, `Rope` or `Texture3D` |\n| `ParametersJson` | The whole model, as JSON. Read it to discover the paths |\n| `GetParameter(path)` | One value, or `None` when the path doesn't exist |\n| `SetParameter(path, value)` | Sets one value and regenerates |\n| `SetParameters(json)` | Merges a JSON object into the model and regenerates once |\n| `SetElement(name)` | Applies a saved element of the same component. A named pendant keeps its text |\n\nA path is dotted. You can write it in PascalCase (`TopProfile.Width`) or snake_case (`top_profile.width`). The value you set is converted to the type of the stored value, and an unknown path fails instead of being added silently. Numbers are always read and written with a `.` decimal separator, whatever the Windows language.\n\n```python\nfrom ArtisanPlugin.Scripting import SmartComponentApi, Transaction\n\nbail = SmartComponentApi.Find(bailId)\nprint(bail.Component, bail.GetParameter(\"top_profile.width\"))\n\nwith Transaction.Begin(\"Edit the bail\"):\n    bail.SetParameter(\"diameter_top\", \"3.5\")\n    bail.SetParameters('{\"TorusEnable\": true, \"TorusDiameter\": 2.4}')\n```\n\nThe ids stay the same when a component regenerates. Bails and named pendants rebuild their breps inside the same group, on the plane stored on their members. Link, Milgrain, Rope and Texture 3D rebuild on their plane, mother curve or surface. The pieces stay on the layer they were on.","metadata":{"title":"Editing smart components","section":"The handle","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#the-handle","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#the-handle","collection":"scripting","hash":"1042ebf491561e04b208fe5c69bdae73","indexed_by":"docs-index"}},{"content":"Editing smart components — From the MCP\n\nMCP reaches these components as `SMART_COMPONENT`, with the same tools as any other parametric object:\n\n- `list_objects` lists them.\n- `describe_object_parameters` shows the current model and its paths.\n- `edit_object` edits by path, for example `{\"top_profile.width\": 4.5}`, or applies a preset with `{\"element\": \"BL001\"}`.\n- `delete_objects` deletes them.\n\nIn the Python package, this page corresponds to `ra.smart_component`.","metadata":{"title":"Editing smart components","section":"From the MCP","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#from-the-mcp","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-components/#from-the-mcp","collection":"scripting","hash":"43476dc85c75b9581d4f9a8cc05baa07","indexed_by":"docs-index"}},{"content":"Smart profile\n\n```python\nfrom ArtisanPlugin.Scripting import SmartProfileApi\n```\n\nA smart profile is the Smart Profiles tool of the Solid tab (`ArtisanProfiles`) without its panel. It sweeps `RING_PROFILE` sections along an existing curve to make bands, wires, frames and free-form rims whose section can change along the way. Each section sits at a normalized position `t` along the curve (0 = start, 1 = end) and has its own profile asset, width, height, rotation and sideways displacement.\n\nThe result stays linked to the curve: when you edit the curve, the profile regenerates. It differs from Profile sweep in what it sweeps through. Profile sweep lofts through closed curves that you draw in place, while a smart profile places profile assets parametrically along one rail.","metadata":{"title":"Smart profile","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/","collection":"scripting","hash":"2e2dfedea48aa37222b6e57badb9d0d9","indexed_by":"docs-index"}},{"content":"Smart profile — Create\n\n```python\nprofiles = SmartProfileApi.Create(curveIds, count = 0, positions = None,\n                                  widths = None, heights = None, rotations = None,\n                                  displacements = None, profiles = None, sectionTypes = None,\n                                  width = 0, height = 0, profile = None, sectionType = None,\n                                  thickness = 0, comfort = 0,\n                                  startCapDistance = None, endCapDistance = None,\n                                  rebuildPoints = 0, orientationIds = None,\n                                  element = None)                  # -> [ISmartProfile]\n```\n\nYou get one smart profile per curve, as one `ISmartProfile` handle each. The sections are decided in priority order:\n\n1. `positions`: one section per `t`. The parallel lists `widths`, `heights`, `rotations`, `displacements`, `profiles` and `sectionTypes` are optional; a `0` or an empty entry takes the uniform value.\n2. `count` (2 or more): identical sections spread evenly. Closed curves skip `t = 1`.\n3. `element`: the sections of a saved SmartProfile element.\n4. Your saved default sections.\n5. Otherwise, two sections, one at each end.\n\nA smart profile always has at least two sections.","metadata":{"title":"Smart profile","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#create","collection":"scripting","hash":"2d6961be8def242a4bac8ba9f7ea6550","indexed_by":"docs-index"}},{"content":"Smart profile — Create\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `width` / `height` | `0` -> `1` | Section size in mm, for sections without their own |\n| `profile` | default `RING_PROFILE` | Asset name or `\"id: \"`, for sections without their own |\n| `sectionType` | `COMFORT` | `COMFORT`, `SOLID` or `THICKNESS` |\n| `thickness` | `0.7` | Wall thickness of `THICKNESS` sections, mm |\n| `comfort` | `0.3` | Comfort-fit depth of `COMFORT` sections, mm |\n| `startCapDistance` / `endCapDistance` | `1` | Dome height of the ends of open curves, literal mm (`0` = flat) |\n| `rebuildPoints` | `0` | `0` keeps the profiles as drawn. `4` or more rebuilds each profile to that many points for a smoother loft |\n| `orientationIds` | curve frame | Solids or meshes whose surface orients the sections, such as the ring the profile runs on |\n| `element` | — | A saved SmartProfile element to start from. Its sections are used unless you pass `positions` or `count`, and explicit arguments override it |\n\nCurves with kinks produce mitred pieces. Fillet the corners first if you want one continuous body.\n\n```python\nfrom ArtisanPlugin.Scripting import SmartProfileApi, Transaction\n\nwith Transaction.Begin(\"Tapered rim\"):\n    p = SmartProfileApi.Create([railId],\n                               positions = [0, 0.5, 1],\n                               widths    = [1.2, 2.4, 1.2],\n                               heights   = [1.0, 1.6, 1.0],\n                               profile   = \"Knife Edge\")[0]\n```","metadata":{"title":"Smart profile","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#create","collection":"scripting","hash":"04cad6bf24d25f951fd2f541354d8f36","indexed_by":"docs-index"}},{"content":"Smart profile — Edit\n\n`ISmartProfile` exposes the curve (`CurveId`) and the sections as parallel read-only lists: `SectionPositions`, `SectionWidths`, `SectionHeights`, `SectionRotations`, `SectionProfiles`, `SectionTypes` and `SectionMirrorOf` (`-1`, or the index of the section it mirrors). Sections are always sorted by `t`, so an index refers to the n-th section along the curve. Every change regenerates the profile in place, keeping the same id:\n\n| Method | Does |\n|---|---|\n| `SetSection(index, width = 0, height = 0)` | Resizes one section. `0` keeps the value, so you can change only the width |\n| `SetSectionPosition` / `SetSectionRotation` / `SetSectionDisplacement` / `SetSectionProfile` / `SetSectionReversed` | Edit one section |\n| `SetSectionType(index, type, thickness = 0, comfort = 0)` | `COMFORT`, `SOLID` or `THICKNESS` |\n| `AddSection(t, width = 0, height = 0, profile = None)` | Inserts a section. It must be at least 0.002 away from the others |\n| `RemoveSection(index)` | Removes one |\n| `MirrorSection(index)` | Adds a section at `1 - t`, with the rotation negated, that keeps following its source |\n| `SetSections(json)` | Replaces every section from a JSON array: `[{\"t\": 0, \"width\": 2, \"height\": 1, \"rotation\": 0, \"displacement\": 0, \"profile\": \"…\", \"type\": \"COMFORT\"}, …]`. Only `t` is required, and at least 2 entries |\n| `SetAllSections(width, height)` / `SetWidth` / `SetHeight` / `SetProfile` | Apply to every section |\n| `SetStartCapDistance` / `SetEndCapDistance` / `SetRebuildPoints` | Global settings |\n| `SetElement(name)` | Applies a saved SmartProfile element. The curve and the orientation objects stay |\n\nA mirrored section follows its source, so edit the source instead.","metadata":{"title":"Smart profile","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#edit","collection":"scripting","hash":"00301cc6e5712865f1f436fe4b7a105b","indexed_by":"docs-index"}},{"content":"Smart profile — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.\n\nFrom the MCP\n`create_smart_profile` takes the sections as an array of objects (`{\"t\": 0.5, \"width\": 2.4, …}`). `edit_object` reaches every method above by its snake_case name:\n\n```json\n{\"set_section\": {\"index\": 1, \"width\": 1.6}}\n{\"add_section\": {\"t\": 0.25, \"width\": 1.8}}\n{\"sections\": [{\"t\": 0, \"width\": 1}, {\"t\": 1, \"width\": 2}]}\n```\n\nIn the Python package, this page corresponds to `ra.smart_profile`.","metadata":{"title":"Smart profile","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/smart-profile/#queries","collection":"scripting","hash":"1fa4c318fb025bb075087377e6c813d0","indexed_by":"docs-index"}},{"content":"Texture 3D\n\n```python\nfrom ArtisanPlugin.Scripting import Texture3DApi\n```\n\nRelief pushed into a metal surface from a picture: hammered finishes, woven and basket patterns, bark, engine-turning, a logo raised out of a signet face. The tool reads a grayscale image as a heightmap and rebuilds your surface as a new one whose points are displaced along the surface normal - white pixels rise to the full relief height, black pixels stay flush.","metadata":{"title":"Texture 3D","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/","collection":"scripting","hash":"c287e2885f19f8ef963ff815eef8c862","indexed_by":"docs-index"}},{"content":"Texture 3D — Create\n\n```python\nid = Texture3DApi.Create(surfaceId, texturePath = None, u = 1, v = 1,\n                         height = 0.6, rotation = 0)                      # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `surfaceId` | - | The existing surface to emboss |\n| `texturePath` | the default texture | Path to an image file on disk |\n| `u` | `1` | How many times the image is tiled across the surface's U direction |\n| `v` | `1` | How many times it is tiled across V |\n| `height` | `0.6` | Relief at pure white, mm - black sits flush with the original surface |\n| `rotation` | `0` | Degrees the tiled image is turned before it is applied |\n\n`texturePath` is optional. Omit it and the tool uses its own default texture, the same one the panel opens with. Give a path and the file must exist on disk, or the call fails with *\"Texture image not found: '…'\"*. The image does not have to be grayscale to begin with - it is converted before use.\n\n`u` and `v` tile, they do not stretch: `u = 3, v = 2` lays six copies of the image over the surface, so the motif gets smaller and repeats rather than distorting. `height` scales linearly with pixel brightness, so a mid-grey pixel rises to half of it. `rotation` turns the tiled image about its centre before it is wrapped onto the surface; unusually for this API it is applied whenever it is non-zero rather than only when positive, so negative angles work as you would expect.","metadata":{"title":"Texture 3D","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/#create","collection":"scripting","hash":"b9243614f4c83b928124bf3b7cf79b40","indexed_by":"docs-index"}},{"content":"Texture 3D — Create\n\nBehind the scenes the facade repeats the panel's worker exactly: resize the bitmap by the texture resolution, convert it to grayscale, tile it `u` × `v`, rotate it, and bake the result to a temporary JPEG that the kernel reads while computing. The kernel then samples one point per pixel across the surface's domain and offsets each along the normal, so the image's pixel count decides how heavy the resulting geometry is - a large photograph produces a very dense NURBS surface. The four edge rows and columns are pinned at zero displacement, so a textured patch still meets its neighbours cleanly.\n\nReturns the id of a single Texture 3D smart component (`Texture3DCustomObject`, mother = your surface), on the metal layer with the document's metal material, exactly like the panel's Accept. The source surface is left in the document.\n\nNote the input check: unlike the curve-based facades, this one only verifies that the id exists - *\"Object … not found.\"* - and does not report a wrong object type up front. A non-surface simply fails later with *\"Texture computation failed. Check the surface and the image.\"*\n\n`u`, `v` and `height` follow the house `0`-keeps-default convention: `0` means \"use my saved Texture 3D defaults, or the tool's\". No `-1` sentinel is needed, since none of them is meaningful at zero.\n\nThis is a licensed mutation. Wrap it in a `Transaction` for one-step undo:\n\n```python\nfrom ArtisanPlugin.Scripting import Texture3DApi, Transaction\n\nwith Transaction.Begin(\"Hammered face\"):\n    Texture3DApi.Create(surfaceId, r\"C:\\textures\\hammered.png\", u = 2, v = 2,\n                        height = 0.35, rotation = 15)\n```","metadata":{"title":"Texture 3D","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/texture-3d/#create","collection":"scripting","hash":"d773571abe851b53a393ac1f7b2dc46f","indexed_by":"docs-index"}},{"content":"User element\n\n```python\nfrom ArtisanPlugin.Scripting import UserElementApi\n```\n\nA user element is your own part - a crown you modelled by hand, a gallery, a signature motif - promoted to a named component so the rest of Artisan treats it as one thing. The tool does not remodel anything: it groups the objects you selected, stamps the group with UserElement data carrying the name, and gives the solid metal parts the document's metal material.","metadata":{"title":"User element","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/","collection":"scripting","hash":"7d9a7b2ce0b76933a9ed8098b5fb7359","indexed_by":"docs-index"}},{"content":"User element — List\n\n```python\nnames = UserElementApi.List()          # -> [\"Crown v2\", \"Gallery A\", ...]\n```\n\nReturns the names of the user elements in the active document, read from the UserElement data on the document's groups, in group order. Names are not unique - two elements created with the same name appear twice. `List` is read-only: it needs an active document but no licence, and it returns names only, with no way back to the objects or the element id.","metadata":{"title":"User element","section":"List","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/#list","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/#list","collection":"scripting","hash":"8f566ddacbe1da72872fc2b6a6850249","indexed_by":"docs-index"}},{"content":"User element — Create\n\n```python\nuid = UserElementApi.Create(objectIds, \"Crown v2\")     # -> id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | required | The document objects to tag; ids that are not in the document are silently dropped, and an empty result throws |\n| `name` | required | The element's name, as the Outliner shows it - empty or whitespace throws |\n\n`Create` runs the tool's whole flow. It makes a new Rhino group named `UserElement `, attaches the UserElement user data to that group with your `name`, and then walks the objects: non-gem solid geometry (breps, extrusions and meshes) is given the document's metal material, while gems and everything else - curves, points, annotations - only join the group. Nothing is moved to another layer, and no geometry is rebuilt or replaced.\n\nIt returns a single Guid: the element's own unique id, the one stored in the user data. This is not a document object id and not a group index, so `doc.Objects.FindId` will not find it; it identifies the element, not a piece of geometry. There is no handle interface on this facade, and no method that resolves an element id back to its objects.\n\nUser elements live in the document — `Create` tags an existing selection; there is no on-disk library and no insert-by-name flow. To reuse an element across documents, use Rhino blocks or a template file.\n\n`Create` is a licensed mutation and needs an active document. Since it touches the attributes of every object you pass as well as creating the group, wrap it in a `Transaction` so the whole tagging undoes in one step.","metadata":{"title":"User element","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/user-element/#create","collection":"scripting","hash":"c27011241380c3a77d3815e089907000","indexed_by":"docs-index"}},{"content":"Voronoi\n\n```python\nfrom ArtisanPlugin.Scripting import VoronoiApi\n```\n\nThe irregular, cracked-mud cell pattern used for openwork pendants, pierced ring panels and cut-out earrings. The tool scatters `points` random seeds inside the bounding box of your outline, builds the Voronoi web from their Delaunay triangulation, trims every edge at the outline, then thickens and extrudes those edges into metal walls.","metadata":{"title":"Voronoi","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/","collection":"scripting","hash":"2905c97c6e713161cdbbf28590cba5f5","indexed_by":"docs-index"}},{"content":"Voronoi — Create\n\n```python\nids = VoronoiApi.Create(curveId, points = 100, thickness = 0, height = 0,\n                        bothSides = False)                                  # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | - | The existing outline the pattern fills - must be planar and closed |\n| `points` | `100` | Seed points scattered in the outline's bounding box |\n| `thickness` | `0` | Wall thickness, mm - `0` gives bare centre lines and no solid |\n| `height` | `0` | Wall height, mm - `0` gives flat outlines and no solid |\n| `bothSides` | `False` | The panel's symmetry toggle |\n\nThe curve must be closed. An open curve stops the computation with `CURVE_MUST_BE_CLOSED`; a curve that does not lie in a plane stops it with `CURVE_MUST_BE_PLANNAR`. The pattern is generated in that curve's own plane and transformed back, so the outline does not have to sit on the world XY plane.\n\n`points` is a seed count, not a cell count: edges that fall entirely outside the outline are discarded and edges that cross it are trimmed, so the finished web always has fewer cells than seeds.\n\nBoth `thickness` and `height` must be greater than zero to get solid geometry. The kernel works in three stages - centre lines, then thickened outlines, then extruded walls - and stops at the stage your parameters reach. With `thickness = 0` it produces bare lines; with a thickness but no height it produces flat closed outlines. In neither case is there a solid, and `Create` returns an empty list having added nothing to the document. Since the model's own defaults for both are `0`, a bare `VoronoiApi.Create(curveId)` does exactly that. Always pass both:\n\n```python\nfrom ArtisanPlugin.Scripting import VoronoiApi, Transaction","metadata":{"title":"Voronoi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/#create","collection":"scripting","hash":"07edabf8c922ae6a927a25139c3812c6","indexed_by":"docs-index"}},{"content":"Voronoi — Create\n\nwith Transaction.Begin(\"Voronoi panel\"):\n    ids = VoronoiApi.Create(curveId, points = 140, thickness = 0.6, height = 1.2)\n```\n\nWhen the walls resolve to one solid you get a single id: a Voronoi smart component (`VoronoiCustomObject`, mother = your curve) on the metal layer with the document's metal material, exactly like the panel's Accept. When they resolve to several disjoint solids you get several ids, but those are plain breps - routed to the metal layer, without the metal material and without the editable component wrapper. This mirrors the panel, which asks *\"the result is multiple solids, add anyway?\"* at that point.\n\nIf the thickened outlines cannot be unioned into an outer boundary plus interiors the computation raises `NO_SOLUTION`; a failure at any stage surfaces as *\"Voronoi computation failed on that curve.\"*\n\n`bothSides` is recorded on the component - it is the symmetry button in the panel - but the current Voronoi computation does not read it, so it changes nothing about the geometry produced.\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use my saved Voronoi defaults, or the tool's\". No `-1` sentinel is needed, because `0` is not a meaningful point count, thickness or height. Passing an id that is not a curve fails with *\"Object … is not a curve.\"*\n\nThis is a licensed mutation - wrap it in a `Transaction` for one-step undo.","metadata":{"title":"Voronoi","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/accessories/voronoi/#create","collection":"scripting","hash":"6b207933e367f8664613940cb5e59352","indexed_by":"docs-index"}},{"content":"Analysis\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi as analyze, WeightApi as weight\n```\n\nThe measuring side of the API: wall-thickness probing and metal weights. Each has its own page.\n\nThickness Wall thickness at one point, or many at once.\n\nGlobal thickness The whole-piece wall map: stats, thin spots, optional colorized mesh.\n\nWeights Per-metal grams for the document, ids or the selection.\n\nWeight by area Sheet-metal estimate for open shells: area × thickness.","metadata":{"title":"Analysis","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/","collection":"scripting","hash":"f382198ece76b57571bfb7c54cd4051c","indexed_by":"docs-index"}},{"content":"Analysis — Read-only by default\n\nAnalysis is the one corner of the API you can run freely on a document without changing it. Every method here is read-only unless you explicitly ask for the drawing:\n\n| Page | Mutates the document? |\n|---|---|\n| Thickness | Only with `annotate = True`, which draws the measurement line, its text dot and end points |\n| Global thickness | Only with `colorize = True`, which adds the vertex-coloured mesh |\n| Weights | Never |\n| Weight by area | Never |\n\nThe two opt-in drawing paths also trigger the licence check and belong inside a `Transaction`; the pure measurements need neither.","metadata":{"title":"Analysis","section":"Read-only by default","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#read-only-by-default","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#read-only-by-default","collection":"scripting","hash":"d9fbebfc2423dbea10776b677e07881e","indexed_by":"docs-index"}},{"content":"Analysis — Two ways to weigh\n\nThe distinction matters and is easy to get wrong:\n\n- Weights computes the true volume of closed solids and multiplies by the metal density. This is the number you quote.\n- Weight by area multiplies surface area by a thickness you supply, as a sheet-metal estimate for open shells that have no volume to measure.\n\nWeight by area on a closed solid sums the whole skin — both walls of a hollow shell — so the estimate roughly doubles and is silently wrong. Use it only on the open sheets it is meant for.","metadata":{"title":"Analysis","section":"Two ways to weigh","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#two-ways-to-weigh","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#two-ways-to-weigh","collection":"scripting","hash":"c206fe8e916ac252e9f1652c5b2b7f3e","indexed_by":"docs-index"}},{"content":"Analysis — Conventions\n\nMillimetres and grams throughout. Metal names come from `WeightApi.Metals()`; matching is case-insensitive and tolerates dashes and spaces.\n\n`0` is not the \"tool default\" sentinel here. A thickness result of `0` means not measurable — no opposite wall was found, or the probe was shorter than tolerance — and Weight by area's `thickness` rejects `0` outright.","metadata":{"title":"Analysis","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/#conventions","collection":"scripting","hash":"281359ab8a095f0d528f52d22a991b14","indexed_by":"docs-index"}},{"content":"Global thickness\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi as analyze\n```\n\nWhere `ThicknessAt` answers \"how thick is it *here*\", `GlobalThickness` answers \"where is this piece thinnest\". It meshes the objects at high resolution and measures the wall thickness at every vertex of that analysis mesh, giving you the statistics and the list of offending spots that the ArtisanGlobalThickness command can only paint on screen. This is the pre-casting check: run it over a finished ring, get the minimum wall and the percentage of the surface below your foundry's limit, and decide whether to thicken before you export.","metadata":{"title":"Global thickness","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/","collection":"scripting","hash":"11ae98cc5adbe4ac56bf938ba8212f50","indexed_by":"docs-index"}},{"content":"Global thickness — Usage\n\n```python\nr = analyze.GlobalThickness(objectIds, thinThresholdMm = 0, colorize = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Objects to analyse; meshed together on every call |\n| `thinThresholdMm` | `0` -> tool default `0.6` | Walls thinner than this count as thin spots, mm. `0` keeps the command's default of 0.6 mm |\n| `colorize` | `False` | `True` also adds a vertex-coloured copy of the analysis mesh to the document |\n\nAll values in and out are millimetres. Per the house convention, `0` for the threshold means \"keep the tool default\" - it does not mean \"no threshold\". A negative threshold throws `ArgumentOutOfRangeException` with `\"Threshold must be >= 0.\"`.","metadata":{"title":"Global thickness","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#usage","collection":"scripting","hash":"197d8457993885f2c1751a6701bdf1d9","indexed_by":"docs-index"}},{"content":"Global thickness — What comes back\n\n`GlobalThicknessResult`:\n\n| Field | Meaning |\n|---|---|\n| `MinMm` | Thinnest measured wall, mm. `0` when nothing was measurable |\n| `MaxMm` | Thickest measured wall, mm |\n| `AverageMm` | Mean over the measurable samples, mm. `0` when nothing was measurable |\n| `SampleCount` | Number of mesh vertices that produced a valid measurement |\n| `UnmeasurableCount` | Number of vertices where no opposite wall was found |\n| `ThinPercentage` | Percentage of the measurable samples below the threshold - the figure the command prints on the command line. Note the denominator is `SampleCount`, not the total vertex count |\n| `MeshId` | Guid of the colourised mesh when `colorize = True`, otherwise `Guid.Empty` |\n| `ThinSpots` | The measurable vertices below the threshold, thinnest first, capped at the worst 100 |\n\nEach entry of `ThinSpots` is a `ThinSpot`:\n\n| Field | Meaning |\n|---|---|\n| `Point` | The vertex position on the analysis mesh, as a `Point3d` |\n| `ThicknessMm` | The wall thickness measured there, mm |\n\nThe cap matters: if a piece has thousands of thin vertices, `ThinSpots` still holds only 100 of them. Use `ThinPercentage` and `SampleCount` to judge how widespread the problem is, and `ThinSpots` to find where to start.","metadata":{"title":"Global thickness","section":"What comes back","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#what-comes-back","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#what-comes-back","collection":"scripting","hash":"29d9c7a5f32a03511962572a32395690","indexed_by":"docs-index"}},{"content":"Global thickness — Does it mutate the document?\n\nWith `colorize = False` - the default - no. It is a pure measurement: nothing is added, nothing is changed, no licence is checked, and `MeshId` comes back as `Guid.Empty`.\n\nWith `colorize = True` it adds one mesh object to the document: a duplicate of the analysis mesh carrying one vertex colour per vertex, in the command's own palette - red for thin, green for acceptable, black for vertices where no wall could be measured. This is the same mesh the command's `KeepMesh = Yes` exit leaves behind. It is a document mutation, so wrap the call in a `Transaction`, and expect a licence check: `colorize = True` calls the licence gate up front and fails the whole call if the licence is invalid. The views are redrawn once the mesh is added.\n\nTo be plain about the old wording: the call produces stats and thin spots always, and the colorised mesh only when you ask for it.\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi as analyze, Transaction\n\nwith Transaction.Begin(\"Global thickness\"):\n    r = analyze.GlobalThickness(ids, thinThresholdMm = 0.8, colorize = True)\n\nprint(\"min %.2f mm, %.1f%% thin over %d samples\" % (r.MinMm, r.ThinPercentage, r.SampleCount))\nfor s in r.ThinSpots[:5]:\n    print(round(s.ThicknessMm, 2), s.Point)\n```\n\nDelete the mesh by its `MeshId` when you are done with it - it is an ordinary document object.","metadata":{"title":"Global thickness","section":"Does it mutate the document?","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#does-it-mutate-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#does-it-mutate-the-document","collection":"scripting","hash":"1bdcb6aae78c8857d25034b7767a79ae","indexed_by":"docs-index"}},{"content":"Global thickness — Cost and errors\n\nThis is a long operation on dense geometry: one ray cast per vertex of a high-resolution mesh. A full ring with pavé can take a noticeable while, and the mesh is rebuilt on every call, so measure once and reuse the result rather than calling it in a loop.\n\nIt throws:\n\n- `InvalidOperationException` - `\"No active document.\"`\n- `ArgumentOutOfRangeException` - `\"Threshold must be >= 0.\"`\n- `ArgumentException` - `\"At least one object id is required.\"`\n- `InvalidOperationException` - `\"Could not build an analysis mesh from the given objects.\"`","metadata":{"title":"Global thickness","section":"Cost and errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#cost-and-errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/global-thickness/#cost-and-errors","collection":"scripting","hash":"c2e858aca899b53feb2e966e37bcc9a3","indexed_by":"docs-index"}},{"content":"Thickness\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi as analyze\n```\n\nThe scriptable version of the ArtisanThickness probe: how much metal there is between the point you touch and the far wall behind it. This is the number that decides whether a shank will survive casting, whether a pavé bed still has meat under the seats, and whether a hollowed pendant is thin enough to be worth hollowing. The tool meshes the objects you give it at high resolution and, for each point, casts through the material to find the opposite wall - so the value is the true wall thickness at that spot, not a surface offset.\n\nBoth methods are read-only by default. They need no `Transaction` and no licence. Passing `annotate = True` changes that: the tool then draws the same purple measure the command leaves behind, which is a document mutation.","metadata":{"title":"Thickness","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/","collection":"scripting","hash":"dc9f4317b1635019df2cf1323febf6b9","indexed_by":"docs-index"}},{"content":"Thickness — One point\n\n```python\nmm = analyze.ThicknessAt(objectIds, point, annotate = False)   # -> wall thickness in mm\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | The objects to measure through; they are meshed together |\n| `point` | - | A `Rhino.Geometry.Point3d` on or near the surface |\n| `annotate` | `False` | `True` also draws the measure into the document |\n\nReturns the thickness in model units - millimetres in a millimetre document. It returns `0` when no measurement is possible at that point, which happens when the ray finds no opposite wall or the measured line is shorter than the document tolerance. Treat `0` as \"not measurable here\", not as \"zero thickness\".\n\n`ThicknessAt` is a thin wrapper over `ThicknessAtPoints` with a one-element list, which means it re-meshes the objects on every call. Measuring twenty points with twenty calls builds the analysis mesh twenty times.","metadata":{"title":"Thickness","section":"One point","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#one-point","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#one-point","collection":"scripting","hash":"6f1bd7d8330707ebe278402c68b1429c","indexed_by":"docs-index"}},{"content":"Thickness — Many points\n\n```python\nvalues = analyze.ThicknessAtPoints(objectIds, points, annotate = False)   # -> list of mm\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | The objects to measure through; meshed once for the whole batch |\n| `points` | - | A sequence of `Point3d` |\n| `annotate` | `False` | `True` draws one measure per successful point |\n\nThe returned list is parallel to `points`: same length, same order, with `0` in the slots where nothing could be measured. This is the method to reach for whenever you have more than one point, because the high-resolution meshing happens once rather than per point.\n\n```python\nfrom Rhino.Geometry import Point3d\n\npts = [Point3d(0, 0, 5), Point3d(2, 0, 5), Point3d(4, 0, 5)]\nfor p, mm in zip(pts, analyze.ThicknessAtPoints(ids, pts)):\n    print(p, \"->\", \"n/a\" if mm == 0 else round(mm, 2))\n```","metadata":{"title":"Thickness","section":"Many points","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#many-points","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#many-points","collection":"scripting","hash":"324d79ba9268c502df71deb34d58235b","indexed_by":"docs-index"}},{"content":"Thickness — Annotating\n\nWith `annotate = True` the tool mirrors the command's own output for each measurable point: a purple line across the wall, a text dot at its midpoint carrying the value and the document's unit name, and a point at each end - all four added to a group named `2Shapes Measure S `, so a single click selects the whole measure. The views are redrawn once at the end.\n\nThat is a document mutation, so wrap the call in a `Transaction` to keep it as one undo step. It also calls the licence gate before doing any work, so an invalid licence fails the whole call rather than leaving half the measures behind.\n\n```python\nfrom ArtisanPlugin.Scripting import AnalyzeApi as analyze, Transaction\n\nwith Transaction.Begin(\"Thickness measures\"):\n    analyze.ThicknessAtPoints(ids, pts, annotate = True)\n```","metadata":{"title":"Thickness","section":"Annotating","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#annotating","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#annotating","collection":"scripting","hash":"8009006791b0fbd0cb7fbe834ac3f35c","indexed_by":"docs-index"}},{"content":"Thickness — Errors\n\nBoth methods throw before measuring anything:\n\n- `InvalidOperationException` - `\"No active document.\"`\n- `ArgumentException` - `\"At least one object id is required.\"` when `objectIds` is null or empty\n- `InvalidOperationException` - `\"Could not build an analysis mesh from the given objects.\"` when the objects produce no valid mesh\n\nAn empty `points` sequence is not an error; you simply get an empty list back.","metadata":{"title":"Thickness","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/thickness/#errors","collection":"scripting","hash":"209ac9826d67abbd32d9d31386afe795","indexed_by":"docs-index"}},{"content":"Weight by area\n\n```python\nfrom ArtisanPlugin.Scripting import WeightApi as weight\n```\n\nThe volume-based weight methods need closed geometry. Plenty of jewellery is not modelled that way: a stamped pendant, a hollow dome, a piece of sheet bent into a cuff, an earring back - all of these are often single open surfaces with the material thickness existing only in the maker's head. `CalculateByArea` is the estimate for those: it adds up the surface area of the objects you give it, multiplies by the thickness you state, and treats the product as the volume to cast.\n\nRead-only, like everything in `WeightApi`: no licence gate, no `Transaction`.","metadata":{"title":"Weight by area","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/","collection":"scripting","hash":"34029891951aa76608c567b915a38087","indexed_by":"docs-index"}},{"content":"Weight by area — Usage\n\n```python\nr = weight.CalculateByArea(objectIds, thickness, metal = None)   # -> MetalWeightResult\nr = weight.CalculateSelectionByArea(thickness, metal = None)     # same, over the viewport selection\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Objects whose area to sum. `CalculateSelectionByArea` takes the current selection instead |\n| `thickness` | - | Required. Sheet thickness in model units - mm in a millimetre document. Must be > 0 |\n| `metal` | `None` | A name from `Metals()`. Empty or `None` uses the document's primary metal |\n\nNote that `thickness` does not follow the usual \"`0` keeps the tool default\" convention: `0` or any negative value throws `ArgumentOutOfRangeException` with `\"Thickness must be > 0.\"`. There is no default sheet thickness to fall back on. The `metal` argument is the one that takes a sentinel here, and its sentinel is `None`/empty, not `0`.\n\n`CalculateSelectionByArea` is a straight wrapper: it gathers the selected ids, calls `CalculateByArea`, and relabels the result. Selecting nothing gives zeros rather than an error.","metadata":{"title":"Weight by area","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#usage","collection":"scripting","hash":"1630f850dbf1b246fd337ff036c4021c","indexed_by":"docs-index"}},{"content":"Weight by area — What comes back\n\nThe same `MetalWeightResult` as the volume-based methods - `Layer`, `Metal`, `Volume`, `Grams`, `ProcessedGrams`, `WaxGrams` - with two differences worth keeping in mind:\n\n- `Volume` is the synthetic area x thickness figure, not a measured volume.\n- `Layer` is the literal `\"(by area)\"`, or `\"(selection, by area)\"` from the selection variant. Nothing is read from, or attributed to, the Metal layers.\n\n`Grams`, `ProcessedGrams` and `WaxGrams` are then derived exactly as elsewhere: density x volume, the configured finishing loss, and the configured wax density.","metadata":{"title":"Weight by area","section":"What comes back","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#what-comes-back","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#what-comes-back","collection":"scripting","hash":"970045e3351295dd32b6ae4c2ca788e1","indexed_by":"docs-index"}},{"content":"Weight by area — When it is the right tool\n\nReach for it when the geometry is an open surface or shell and the material thickness is a manufacturing parameter rather than modelled geometry. Sheet, stamped and formed parts are the typical case.\n\nDo not reach for it for solid, closed pieces - use `CalculateForObjects` or `Calculate()`, which measure the real volume. If you pass a closed solid anyway, the area sum takes its entire skin, inner and outer faces included, so a hollow closed shell counts both walls and comes out roughly twice as heavy as intended, and a plain solid gets a shell of `thickness` wrapped around a body that is already full. The method has no way to detect this; it will happily return a confident, wrong number.\n\nArea is summed for Breps, extrusions, meshes and SubDs only. Curves, points and annotations contribute nothing. Ids that do not resolve, and geometry too degenerate to compute an area for, are skipped silently - so an empty or unresolvable id list gives a valid result with zero grams.\n\n```python\nfrom ArtisanPlugin.Scripting import WeightApi as weight\n\nr = weight.CalculateByArea(shell_ids, 0.8, \"SILVER_925\")\nprint(\"%.2f mm2 of 0.8 mm sheet -> %.2f g\" % (r.Volume / 0.8, r.Grams))\n```\n\nBoth methods throw `InvalidOperationException` `\"No active document.\"` when no document is open, and `ArgumentException` for an unknown metal name (see metal names).","metadata":{"title":"Weight by area","section":"When it is the right tool","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#when-it-is-the-right-tool","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weight-by-area/#when-it-is-the-right-tool","collection":"scripting","hash":"f034b13411dd3e568e4bdef74934da8b","indexed_by":"docs-index"}},{"content":"Weights\n\n```python\nfrom ArtisanPlugin.Scripting import WeightApi as weight\n```\n\nWhat the piece will cost to cast. `WeightApi` wraps the same `WeightTools` math the ArtisanWeight command uses - volume of the closed geometry multiplied by the metal's density - so the grams a script reports always match the figures in the dialog. Volume comes from Breps, extrusions, meshes and SubDs; objects that are not closed contribute nothing meaningful, which is why open shells need weight by area instead.\n\nEverything on this page is read-only: no licence gate, no `Transaction`, nothing added to the document.","metadata":{"title":"Weights","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/","collection":"scripting","hash":"5fa64ffa2dd0777d9e3ff36601004a3c","indexed_by":"docs-index"}},{"content":"Weights — Metal names\n\n```python\nweight.Metals()   # -> [\"GOLD_24\", \"GOLD_YELLOW_22\", \"GOLD_YELLOW_18\", ..., \"PLATINUM\", \"SILVER_925\", ...]\n```\n\n`Metals()` returns the exact names the `metal` argument accepts - the members of the `Metal` enum, covering the gold karats and colours, the silver and platinum alloys, palladium, rhodium, steel, zinc, zamac and pewter.\n\nMatching is forgiving, the same convention as `GemApi`: the name is trimmed, dashes and spaces are converted to underscores, and the comparison is case-insensitive. So `\"GOLD_YELLOW_18\"`, `\"gold yellow 18\"` and `\"gold-yellow-18\"` all resolve to the same metal. What it does *not* do is reorder words or translate trade names - `\"18k yellow gold\"` will not parse.\n\nAn unrecognised name throws `ArgumentException` reading `Unknown metal ' '. Valid names: .`, and an empty or whitespace name throws `\"Metal name is required.\"`.","metadata":{"title":"Weights","section":"Metal names","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#metal-names","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#metal-names","collection":"scripting","hash":"a89e49fb7bef65e300e6b397d9abe0af","indexed_by":"docs-index"}},{"content":"Weights — The result\n\nEvery method on this page returns a `MetalWeightResult`:\n\n| Field | Meaning |\n|---|---|\n| `Layer` | What the row describes: a Metal layer name from `Calculate()`, or the literal `\"(objects)\"` / `\"(selection)\"` from the other two |\n| `Metal` | The resolved `Metal` enum name, e.g. `\"GOLD_YELLOW_18\"` |\n| `Volume` | Volume in model units cubed - mm³ in a millimetre document |\n| `Grams` | Cast weight: volume x the metal's density |\n| `ProcessedGrams` | The cast weight after the configured finishing loss percentage (Options; 5% out of the box) |\n| `WaxGrams` | Weight of the wax model at the configured wax density (Options; 0.97 out of the box) |\n\nDensities honour the user's Custom Metal List when one is configured, so a house alloy gives house grams.","metadata":{"title":"Weights","section":"The result","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#the-result","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#the-result","collection":"scripting","hash":"19de1734539020058c85bcfed451450a","indexed_by":"docs-index"}},{"content":"Weights — Whole document\n\n```python\nrows = weight.Calculate()   # -> list of MetalWeightResult, one per metal position\n```\n\nThe per-metal breakdown of the document, mirroring the ArtisanWeight dialog. Volumes are read from the layers named `Metal 01`, `Metal 02` and `Metal 03`, then grouped according to how many metals the document is configured for:\n\n| Document metals | Rows returned |\n|---|---|\n| 1 | `Metal 01+02+03` - everything on the Metal layers casts together, in the document's first metal |\n| 2 | `Metal 01`, then `Metal 02+03` combined in the second metal |\n| 3 | `Metal 01`, `Metal 02`, `Metal 03`, each in its own document metal |\n\nThe metals themselves come from the document settings, not from an argument - `Calculate()` takes no parameters. A layer that is missing or holds no geometry still produces a row, with zero volume and zero grams, rather than being dropped. If there is no active document, `Calculate()` returns an empty list rather than throwing; it is the only method here that does not require one.","metadata":{"title":"Weights","section":"Whole document","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#whole-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#whole-document","collection":"scripting","hash":"30d153509242d7c2ce4fc8a05ab6cc48","indexed_by":"docs-index"}},{"content":"Weights — Given objects\n\n```python\nr = weight.CalculateForObjects(objectIds, \"GOLD_YELLOW_18\")\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | The objects to weigh; ids that are not in the document are silently skipped |\n| `metal` | - | Required. A name from `Metals()` |\n\nThe scriptable form of \"weigh this bit\": what an arbitrary set of objects would weigh if cast in one metal, regardless of which layer they live on. Layers and document metal settings are ignored entirely - one set of ids, one metal, one result with `Layer` set to `\"(objects)\"`.\n\nThe objects must be closed solids or meshes for their volume to count. An empty id list, or ids that all fail to resolve, gives a valid result with zero volume and zero grams.","metadata":{"title":"Weights","section":"Given objects","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#given-objects","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#given-objects","collection":"scripting","hash":"f6561ef29d5b076c6e00b5c70bb5f7d9","indexed_by":"docs-index"}},{"content":"Weights — Current selection\n\n```python\nr = weight.CalculateForSelection(\"PLATINUM\")\n```\n\nThe same calculation over whatever is selected in the viewport: it collects the selected object ids and hands them to `CalculateForObjects`, then relabels the result's `Layer` as `\"(selection)\"`. `metal` is required here too - the selection carries no metal of its own. With nothing selected you get zeros, not an error.\n\nBoth `CalculateForObjects` and `CalculateForSelection` throw `InvalidOperationException` `\"No active document.\"` when there is no document open, and the metal name is parsed before anything else, so a typo fails immediately.\n\n```python\nfrom ArtisanPlugin.Scripting import WeightApi as weight\n\nfor row in weight.Calculate():\n    print(\"%-16s %-18s %8.2f g  (%.2f g processed)\"\n          % (row.Layer, row.Metal, row.Grams, row.ProcessedGrams))\n```","metadata":{"title":"Weights","section":"Current selection","url":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#current-selection","source":"https://www.rhinoartisan.com/docs/scripting/reference/analysis/weights/#current-selection","collection":"scripting","hash":"1a15a856164e661ecf830772c14c2041","indexed_by":"docs-index"}},{"content":"Assets\n\n```python\nfrom ArtisanPlugin.Scripting import AssetsApi as assets\n```\n\n`AssetsApi` gives scripts access to your profile library, the curves the parametric tools build from. Scripts can list assets, reference them by name or id, draw one as a curve to preview it, and organize the library.\n\nScripts never create assets. An asset is a half profile with per-type rules: it is mirrored across its vertical axis, and a `RING_SIDE_CURVE` stays open. An arbitrary curve doesn't follow those rules, so new assets are still drawn in the Assets editor.\n\n| Method | Returns |\n|---|---|\n| `Types()` | Valid asset types: `RING_PROFILE`, `EXTERNAL_RING_PROFILE`, `RING_SIDE_CURVE`, `BEZEL_PROFILE`, `CHANNEL_PROFILE`, `CHARM_PROFILE`, `PEGHEAD_PROFILE`, … |\n| `List(type = None)` | Assets in the library, optionally filtered by type. Each has `Id`, `Name`, `Type`, `Semantic`, `IsDefault` and `PointCount` (the control points of the half profile, which hint at its complexity) |\n| `GetDefault(type)` | The default asset for a type: the one every `Create` uses when no `profile` is given |\n| `ExportAsCurve(type, name, width = 0, height = 0, plane = None)` | Adds the profile to the document as a curve and returns its id. See Previewing a profile |\n| `Rename` / `Duplicate` / `SetDefault` / `Delete` | Library management. See Organizing the library |","metadata":{"title":"Assets","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/","collection":"scripting","hash":"9dc926410bf218a6b466a771b03b05cb","indexed_by":"docs-index"}},{"content":"Assets — Referencing a profile\n\nWherever a method takes a `profile` parameter — a creation method like `ClassicApi.Create`, or a handle setter like `TopProfile.SetProfile` — you pass the asset's name. It is matched case-insensitively within its type (and against the asset's `Semantic` description, so libraries renamed on migration keep resolving). Omitting it falls back to the type's default, and an unknown name fails with the list of available ones.\n\nWhen two assets share a name, pick one by id with `\"id: \"` (the `Id` that `List` returns), for example `profile = \"id:42\"`. This works in every `profile` argument and every `SetProfile`, and in the MCP tools' `*profile` arguments too. An id from another asset type is rejected, and the error says which type the slot takes.\n\n```python\nfrom ArtisanPlugin.Scripting import AssetsApi as assets, ClassicApi as classic, Transaction\n\nfor a in assets.List(\"RING_PROFILE\"):\n    print(a.Name, \"-\", a.Semantic)\n\nprint(\"default:\", assets.GetDefault(\"RING_PROFILE\").Name)\n\nwith Transaction.Begin(\"Ring on a knife-edge profile\"):\n    classic.Create(width = 2.4, profile = \"Knife Edge\")\n```","metadata":{"title":"Assets","section":"Referencing a profile","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#referencing-a-profile","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#referencing-a-profile","collection":"scripting","hash":"ff381be39f747a742cec2f5d8271effa","indexed_by":"docs-index"}},{"content":"Assets — Which type does a slot take?\n\nEach profile slot accepts one asset type. The ones the API exposes today:\n\n| Slot | Asset type |\n|---|---|\n| Shank profiles — `ClassicApi.Create`, `IClassic.TopProfile`/`MidProfile`/`BottomProfile`, `ICathedral.Shank`, `IEternity.Shank.Upper`/`Lower`, `IBypass`/`IAdvancedCathedral` stations, `IMatchingShank`, `IWeddingRing.Profile`, `ISignetFace` | `RING_PROFILE` |\n| `IClassic.ExternalProfile` | `EXTERNAL_RING_PROFILE` |\n| `IAdvancedSignetRing.SetLateralProfile` | `RING_SIDE_CURVE` |\n| Bezels | `BEZEL_PROFILE` |\n| Channels and halos | `CHANNEL_PROFILE` |\n| Pegheads | `PEGHEAD_PROFILE` |\n| Charms | `CHARM_PROFILE` |\n\nList before you set: `assets.List(\"RING_PROFILE\")` tells you exactly which names the shank setters will accept, so a script never guesses.","metadata":{"title":"Assets","section":"Which type does a slot take?","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#which-type-does-a-slot-take","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#which-type-does-a-slot-take","collection":"scripting","hash":"4394a003400460e05369fd6dc4a77603","indexed_by":"docs-index"}},{"content":"Assets — Previewing a profile\n\n```python\ncurveId = assets.ExportAsCurve(\"RING_PROFILE\", \"Knife Edge\", width = 4, height = 2)\n```\n\n`ExportAsCurve` adds the asset to the document as a curve, so you can see the exact shape before building with it. You get the shape the tools actually build from: mirrored and closed, or open for `RING_SIDE_CURVE`.\n\n- Size: `width` × `height` mm, where `0` means 5 × 3 like the Assets panel's insert. A side curve keeps its aspect ratio and only follows `height`.\n- Position: centred on `plane`, which defaults to the active construction plane.\n- Library: unchanged. Delete the curve when you are done looking.","metadata":{"title":"Assets","section":"Previewing a profile","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#previewing-a-profile","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#previewing-a-profile","collection":"scripting","hash":"eec06af71cd8028e35766bc77a280c61","indexed_by":"docs-index"}},{"content":"Assets — Organizing the library\n\nEach method picks the asset by `type` and `name`, where `name` can also be `\"id: \"`. Names stay unique within a type, and changes are saved to disk immediately.\n\n| Method | Does |\n|---|---|\n| `Rename(type, name, newName)` | Renames a user asset |\n| `Duplicate(type, name, newName = None)` | Copies any asset, standard ones included, as a new user asset. An empty `newName` gives `\" (Copy)\"`. This is how you get an editable copy of a factory profile |\n| `SetDefault(type, name)` | Makes it the default of its type, so every `Create` uses it when no `profile` is given |\n| `Delete(type, name)` | Deletes a user asset permanently. Objects already built from it keep their embedded copy |\n\nStandard (factory) assets cannot be renamed or deleted, because tool defaults and scripts refer to them by name. Duplicate one instead.\n\n```python\nfrom ArtisanPlugin.Scripting import AssetsApi as assets\n\ncopy = assets.Duplicate(\"RING_PROFILE\", \"Knife Edge\", \"Knife Edge - soft\")\nassets.SetDefault(\"RING_PROFILE\", copy.Name)\n```","metadata":{"title":"Assets","section":"Organizing the library","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#organizing-the-library","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#organizing-the-library","collection":"scripting","hash":"7f5d04d6dfdc44d1b07182cdacb60124","indexed_by":"docs-index"}},{"content":"Assets — From the MCP\n\nAI assistants have the same features through MCP:\n\n- `list_assets` browses the library.\n- `export_asset_curve` draws a profile as a curve.\n- `manage_assets` renames, duplicates, sets the default and deletes.\n\nSee the tool reference. In the Python package, this page corresponds to `ra.assets`.","metadata":{"title":"Assets","section":"From the MCP","url":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#from-the-mcp","source":"https://www.rhinoartisan.com/docs/scripting/reference/assets/#from-the-mcp","collection":"scripting","hash":"3d181d2b67e90620cb7fdedac388f2af","indexed_by":"docs-index"}},{"content":"Booleans\n\n```python\nfrom ArtisanPlugin.Scripting import BooleanApi as boolean\n```\n\nThe four solid operations, headless — and the reason they have their own facade rather than deferring to `rs.Boolean*`: an Artisan boolean stays editable. Rhino's booleans consume their inputs and hand back a finished brep. Artisan's bake the result into a named group carrying the operation and its parameters, hide the originals instead of deleting them, and leave the whole thing dismantlable and recomputable afterwards through ArtisanEdit and ArtisanBooleanUpdate. Same engine as the `ArtisanBooleanUnion` / `Difference` / `Intersection` / `Split` commands.\n\nUnion Fuse two or more solids into one.\n\nDifference Subtract the cutters from the targets.\n\nIntersection Keep only the volume the two sets share.\n\nSplit Cut the targets into parts along the cutters.\n\n```python\ncutters = cutter.Create([g.Id])                    # the gem seats\nboolean.Difference([shankId], cutters)             # ...carved out of the shank\n```","metadata":{"title":"Booleans","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/","collection":"scripting","hash":"a0a6c1c90ff0649ece4494e1c3eec206","indexed_by":"docs-index"}},{"content":"Booleans — Union\n\n```python\nids = boolean.Union(objectIds)          # -> the result group's member ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Two or more solids to fuse. Fewer than two raises *\"Union needs at least two solids.\"* |\n\nUnion is the one operation with a single set — there are no cutters, every solid is a peer.","metadata":{"title":"Booleans","section":"Union","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#union","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#union","collection":"scripting","hash":"daa020b5d7f3b6e9987e0061cf090e67","indexed_by":"docs-index"}},{"content":"Booleans — Difference\n\n```python\nids = boolean.Difference(targetIds, cutterIds)     # -> the result group's member ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `targetIds` | — | The solids to keep |\n| `cutterIds` | — | The solids to subtract from them |\n\nThe workhorse: this is the final \"make it solid\" step of most pieces — subtracting the gem cutters from a shank before printing.","metadata":{"title":"Booleans","section":"Difference","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#difference","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#difference","collection":"scripting","hash":"dc755834eba3492859fc417270c5aee3","indexed_by":"docs-index"}},{"content":"Booleans — Intersection\n\n```python\nids = boolean.Intersection(targetIds, cutterIds)   # -> the result group's member ids\n```\n\nKeeps only the volume common to both sets.\n\nSplit\n```python\nids = boolean.Split(targetIds, cutterIds)          # -> the result group's member ids\n```\n\nCuts the targets along the cutters and keeps every resulting piece, rather than discarding one side.","metadata":{"title":"Booleans","section":"Intersection","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#intersection","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#intersection","collection":"scripting","hash":"85fd1ebd5ca9e3d374f5cef12e05a55a","indexed_by":"docs-index"}},{"content":"Booleans — What comes back\n\nAll four return the ids of the members of the result group — the result breps, which inherit the layer, colour and material of the *first target* you passed. Order the targets deliberately if that matters.\n\nWhat lands in the document is not a bare brep but an Artisan boolean:\n\n| | |\n|---|---|\n| The group | Named `Boolean `, carrying `RaObjectUserData` with the operation, the target and cutter ids, and the tolerance used |\n| The originals | Hidden, not deleted — both targets and cutters. Unhide them and you have your inputs back |\n| The tolerance | The document's `ModelAbsoluteTolerance`, recorded in the parameters |\n\nThat stored state is what lets ArtisanEdit and ArtisanBooleanUpdate take a scripted boolean apart later, exactly as if you had run the command by hand.\n\nBecause the originals are only hidden, a document with many booleans carries every input solid it ever consumed. That is what makes them re-editable, but it is worth knowing before you export or measure — hidden objects still exist.","metadata":{"title":"Booleans","section":"What comes back","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#what-comes-back","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#what-comes-back","collection":"scripting","hash":"24eb5ce6921cb5b5dff83c799efaa099","indexed_by":"docs-index"}},{"content":"Booleans — Failures\n\nBooleans are licensed mutations and need an active document. They validate before touching anything, and a failed computation leaves the document untouched:\n\n| Situation | Error |\n|---|---|\n| An id is not in the document | *\"Object … not found in the document.\"* |\n| An empty or null id list | *\"At least one object id is required.\"* |\n| Fewer than two solids for a union | *\"Union needs at least two solids.\"* |\n| The same object in both sets | *\"An object cannot be in both sets of a boolean operation.\"* |\n| The solids do not intersect, or are not closed | *\"Boolean computation failed. Check that the solids are closed and actually intersect.\"* |\n\nEach call opens its own undo record, so a boolean is already a single undo step on its own; wrapping several in a `Transaction` groups the whole run into one.","metadata":{"title":"Booleans","section":"Failures","url":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#failures","source":"https://www.rhinoartisan.com/docs/scripting/reference/booleans/#failures","collection":"scripting","hash":"b3f733c5b3add8fa8060e4b9c3b167b4","indexed_by":"docs-index"}},{"content":"Curves & Text\n\n```python\nfrom ArtisanPlugin.Scripting import RingCurveApi as ringcurve, TextOnCurveApi as text\nfrom ArtisanPlugin.Scripting import RasterToVectorApi as trace\n```\n\nAll dimensions are millimeters; angles are degrees. Creation methods return plain Rhino object Guids, so the results compose directly with `rhinoscriptsyntax` and serve as input to other Artisan tools.\n\nRing curve The parametric ring rail: closed, open, bypass or shaped.\n\nText on curve Flow text along an existing curve — outlines or solid letters.\n\nRaster to vector Trace a bitmap image into curves.","metadata":{"title":"Curves & Text","url":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/","source":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/","collection":"scripting","hash":"119daa306909f57bcba4ce86b0e09c96","indexed_by":"docs-index"}},{"content":"Curves & Text — Ring curve\n\n`RingCurveApi` creates the parametric ring rail curve — the foundation that curve shanks and gems-on-curve build on. Four variants, one per curve type in the ring-curve tool:\n\n```python\nringcurve.CreateClosed(fingerDiameter = 0, plane = Plane.WorldXY, profile = None)\nringcurve.CreateOpen(openingLength = 5, fingerDiameter = 0, plane = ..., profile = ...)\nringcurve.CreateBypass(openingLength = 14, angle = 0, offsetX = 2, offsetY = 2,\n                       tangent = 1, fingerDiameter = 0, plane = ..., profile = ...)\nringcurve.CreateShape(shapeType = \"ROUND\", diameter = 5, width = 6, height = 4,\n                      offset = 1, moveInZ = 2, openingLength = 14,\n                      fingerDiameter = 0, plane = ..., profile = ...)\n```\n\n| Variant | Shape |\n|---|---|\n| `CreateClosed` | Full circle at the finger size |\n| `CreateOpen` | Circle with a gap, for open/adjustable rings |\n| `CreateBypass` | Crossed-ends rail (the \"toi et moi\" style), with angle, X/Y offsets and tangent control |\n| `CreateShape` | Circle blended with a top shape: `shapeType` is `\"ROUND\"` (uses `diameter`) or `\"ELLIPSE\"` (uses `width` × `height`), plus offset, Z-lift and opening length |\n\nIn all of them, `fingerDiameter = 0` means \"use the document's configured finger size\", an omitted `plane` means `Plane.WorldXY`, and `profile` picks a named `RING_PROFILE` asset (default asset when omitted).\n\nAll four are licensed mutations and return the `Guid` of the new curve. Overriding `fingerDiameter` never changes the document's finger-size setting.","metadata":{"title":"Curves & Text","section":"Ring curve","url":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#ring-curve","source":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#ring-curve","collection":"scripting","hash":"99999c3355733631726cf96771a95ceb","indexed_by":"docs-index"}},{"content":"Curves & Text — Text on curve\n\n`TextOnCurveApi` flows text along an existing curve — the text-on-curve tool, headless:\n\n```python\nids = text.Create(curveId, \"Forever\", height = 1.5, thickness = 0.4, font = \"Bienchen\")\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId`, `text` | — | The curve to follow and what to write (required) |\n| `height` | `1.5` | Letter height, mm |\n| `thickness` | `0` | Extrusion depth; `0` = outline curves only, `> 0` = solid letters |\n| `spacing` | `0.5` | Letter spacing |\n| `font` | `\"Bienchen\"` | Any installed font name |\n| `rotation`, `moveZ` | `0` | Letter rotation (degrees) and lift above the curve (mm) |\n| `horizontalAlign` | `\"LEFT\"` | `LEFT`, `CENTER`, `RIGHT`, `JUSTIFY` |\n| `verticalAlign` | `\"CENTER\"` | `TOP`, `CENTER`, `BOTTOM` |\n| `flipHorizontal`, `flipVertical` | `false` | Mirroring |\n\nReturns the Guids of the created objects. Solid letters land on the primary metal layer (ready to boolean and print); outline curves land on the primary user layer. The output is plain geometry — it does not stay linked to the curve.\n\nA bad font name surfaces as *\"Text-on-curve computation failed…\"*, not as an argument error.","metadata":{"title":"Curves & Text","section":"Text on curve","url":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#text-on-curve","source":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#text-on-curve","collection":"scripting","hash":"0a7c5e976399bec5d095d7ed3723dce1","indexed_by":"docs-index"}},{"content":"Curves & Text — Raster to vector\n\n`RasterToVectorApi` traces a bitmap image into curves with the embedded Potrace engine — the raster-to-vector tool without the panel:\n\n```python\nids = trace.Create(path, threshold = 0.51, ignoreArea = 2,\n                   cornerThreshold = 1.0, tolerance = 0.2, targetWidth = 12)\n```\n\n| Parameter | Meaning |\n|---|---|\n| `threshold` | The black/white cut (0–1, exclusive): lower keeps more dark detail |\n| `ignoreArea` | Drops speckles up to that many pixels |\n| `cornerThreshold` | Controls sharp vs. round corners |\n| `tolerance` | The curve-optimization budget |\n| `targetWidth` | `> 0` scales the result so its total width is exactly that many model units — the easy way to fit a motif to, say, 12 mm. `0` keeps the tool's native sizing |\n\nReturns the Guids of the traced curves, placed on the world XY plane starting at the origin, on the primary user layer.\n\nTransparent PNGs are flattened onto white before tracing, so they behave the way you'd expect.","metadata":{"title":"Curves & Text","section":"Raster to vector","url":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#raster-to-vector","source":"https://www.rhinoartisan.com/docs/scripting/reference/curves-and-text/#raster-to-vector","collection":"scripting","hash":"a0c1a2dc1a2bb60a4bab99dff7a5114f","indexed_by":"docs-index"}},{"content":"Document\n\n```python\nfrom ArtisanPlugin.Scripting import DocumentApi as docapi\n```\n\nEverything that acts on the document as a whole: getting designs in, getting them out, and the global switches you see at the top of the Outliner. Deliberately dialog-free — anything that would prompt fails with a clear error instead, so the whole surface works headless.\n\nThe page follows the order of a headless run — open a design, save or export it, and the global parameters you change in between.\n\n```python\ndocapi.Open(r\"C:\\designs\\halo.3dm\")     # open a design...\ndocapi.SetMetal(\"GOLD_ROSE_18\")         # ...tweak it...\ndocapi.Save(r\"C:\\out\\halo-rose.3dm\")    # ...save a copy\ndocapi.Stl(r\"C:\\out\\halo.stl\")          # ...and a printable mesh\n```","metadata":{"title":"Document","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/","collection":"scripting","hash":"25b4c5d2651e1529c4da228bceca9331","indexed_by":"docs-index"}},{"content":"Document — Open\n\nGetting a document in front of you — and knowing what you are about to lose.\n\nOpen Open a 3dm, dialog-free.\n\nInspect The document's path and unsaved-changes state.\n\nNew A fresh document, from the default or your own template.\n\n```python\ndocapi.Open(r\"C:\\designs\\halo.3dm\")        # fails on unsaved changes...\ndocapi.Open(path, discardChanges = True)   # ...unless you discard explicitly\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | — | The 3dm to open |\n| `discardChanges` | `False` | Throw away unsaved changes instead of failing |\n\nOpening or creating a document invalidates every id and handle from the previous one — re-query everything after a switch.","metadata":{"title":"Document","section":"Open","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#open","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#open","collection":"scripting","hash":"61a8db98696630b4ba814eaccbf186f8","indexed_by":"docs-index"}},{"content":"Document — Inspect\n\nThe pre-flight checks before switching files — read-only:\n\n```python\ndocapi.GetPath()                     # full path, or \"\" for an unsaved document\ndocapi.IsModified()                  # unsaved changes?\n```\n\nNew\n```python\ndocapi.New()                         # default template; template = a .3dm path\n```","metadata":{"title":"Document","section":"Inspect","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#inspect","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#inspect","collection":"scripting","hash":"e40864486bfa21dc644f932554ad6068","indexed_by":"docs-index"}},{"content":"Document — Save & Export\n\nGetting the design back out — as a 3dm you keep working on, or as one of the three delivery formats.\n\nSave Save in place, or Save As to a new path.\n\nSTL Binary STL for 3D printing — everything visible or the selection.\n\nReport PDF A layout page to 300-dpi PDF, vector where possible.\n\nGLB The whole document to GLB, viewer-grade.\n\nThe exports return the full path written, append the right extension if missing, and create missing folders.","metadata":{"title":"Document","section":"Save & Export","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#save--export","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#save--export","collection":"scripting","hash":"0a390a332343584114c32f6a842b88b5","indexed_by":"docs-index"}},{"content":"Document — Save\n\n```python\ndocapi.Save()                        # needs an existing path\ndocapi.Save(r\"C:\\out\\copy.3dm\")      # Save As — the document adopts the path\n```\n\nSTL\n```python\ndocapi.Stl(r\"C:\\out\\ring.stl\")                       # everything visible\ndocapi.Stl(r\"C:\\out\\head.stl\", onlySelection = True) # just the selection\n```\n\nBinary STL for 3D printing, through Rhino's native exporter with its default meshing parameters.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | — | Destination STL |\n| `onlySelection` | `False` | `True` exports only the current selection instead of everything visible |","metadata":{"title":"Document","section":"Save","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#save","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#save","collection":"scripting","hash":"954e84eac5897d36485a6a55fc9a3620","indexed_by":"docs-index"}},{"content":"Document — Report PDF\n\n```python\ndocapi.ReportPdf(r\"C:\\out\\design-report.pdf\", pageName = \"Template\")\n```\n\nPrints a layout page to a 300-dpi PDF, vector where possible.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | — | Destination PDF |\n| `pageName` | the report layout | The layout page to print — by default the one the report tools produce (see `DraftingApi.CreateReport` on Drafting). Unknown page names fail listing the available layouts |","metadata":{"title":"Document","section":"Report PDF","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#report-pdf","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#report-pdf","collection":"scripting","hash":"94e8e7815fa0d571c6b2071aae65f315","indexed_by":"docs-index"}},{"content":"Document — GLB\n\n```python\ndocapi.Glb(r\"C:\\out\\design.glb\")\n```\n\nExports the whole document to GLB — the same conversion the Realtime Render viewer uses.\n\nThe gems list CSV lives on `DraftingApi.ExportGemsList`; the 16-bit relief heightmap TIFF on `ReliefApi.ExportHeightmap`.\n\nTracing a bitmap into curves lives on Curves & Text; importing named views lives on Views.","metadata":{"title":"Document","section":"GLB","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#glb","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#glb","collection":"scripting","hash":"8a03ee20f98f2ef65d1e4fc737e2549e","indexed_by":"docs-index"}},{"content":"Document — Global parameters\n\nThe document-wide settings — the same switches the Outliner shows at the top.\n\nDescribe A human-readable summary of the whole design.\n\nComputation mode Render display quality or production-accurate geometry.\n\nMetals Read and set the document's metal — or its three positions.\n\nRing size Region, size and diameter of the parametric ring.","metadata":{"title":"Document","section":"Global parameters","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#global-parameters","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#global-parameters","collection":"scripting","hash":"5cdc53e5487baab9b26068d54694400d","indexed_by":"docs-index"}},{"content":"Document — Describe\n\n```python\nfrom ArtisanPlugin.Scripting import SemanticsApi as semantics\nprint(semantics.DescribeDocument())\n```\n\nA human-readable summary of the active document (`SemanticsApi`) — design type, finger size, metals, gems and the parametric elements it contains. Built by the same semantics engine the plugin uses internally; the best first call to understand what is in front of you, and perfect answer material for \"what is this design?\".","metadata":{"title":"Document","section":"Describe","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#describe","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#describe","collection":"scripting","hash":"19c0d3a6eb7a4f1152831ff2e1e723b5","indexed_by":"docs-index"}},{"content":"Document — Computation mode\n\n```python\ndocapi.GetComputationMode()          # \"Render\" or \"Manufacturing\"\ndocapi.SetComputationMode(\"Manufacturing\")\n```\n\n`Render` = smooth display quality; `Manufacturing` = production-accurate geometry (the alias `\"Rendering\"` is accepted).\n\nChanging the mode regenerates every parametric object at the new quality — a long operation on heavy documents. Setting the mode it already has returns instantly.","metadata":{"title":"Document","section":"Computation mode","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#computation-mode","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#computation-mode","collection":"scripting","hash":"be16520887d8e0225026177fd8e085c5","indexed_by":"docs-index"}},{"content":"Document — Metals\n\n```python\ndocapi.GetMetals()                   # e.g. [\"GOLD_YELLOW_18\"] — 1, 2 or 3 entries\ndocapi.SetMetal(\"GOLD_ROSE_18\")               # whole document\ndocapi.SetMetal(\"PLATINUM\", position = 2)     # metal position 2 (multi-metal designs)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `position` | `0` | `0` sets the whole document; `1`–`3` target a metal position, turning the document into a multi-metal design like the Outliner's selectors do |\n\nMetal names come from `WeightApi.Metals()`; input is case-insensitive and tolerates dashes/spaces. Layer materials update immediately.","metadata":{"title":"Document","section":"Metals","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#metals","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#metals","collection":"scripting","hash":"4bbaaba9e1a3cafbc7518e27afe57fbf","indexed_by":"docs-index"}},{"content":"Document — Ring size\n\n```python\ndocapi.GetRingSize()               # → Region, Size, Diameter (mm), or None on non-ring designs\ndocapi.RingSizeRegions()           # \"USA\", \"EUROPE\", \"BRITISH\", ...\ndocapi.SetRingSize(\"EU\", \"54\")\ndocapi.SetRingSizeByDiameter(17.35)          # nearest catalog size, current region\n```\n\nRegion names accept the catalog ids and common short aliases (`US`, `EU`, `UK`, `JP`, …). Unknown regions and sizes fail listing the valid options.\n\nSetting a size updates the parametric ring geometry and refreshes every object — long on heavy documents, and only valid on ring designs.","metadata":{"title":"Document","section":"Ring size","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#ring-size","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#ring-size","collection":"scripting","hash":"8330b842b4cae9bfc70a887eb6659b27","indexed_by":"docs-index"}},{"content":"Document — Command panels\n\n```python\nfrom ArtisanPlugin.Scripting import PanelsApi as panels\n```\n\nArtisan's command panels (the side panel that `ArtisanBail`, `ArtisanCutters`… open, with its live preview) are interactive and can't be driven headless, so build with the typed facades instead. A script that runs a panel command through `RhinoApp.RunScript` can still see the panel and close it:\n\n| Method | Returns |\n|---|---|\n| `Active()` | The name of the open panel (`\"Bail\"`, `\"Cutter\"`, `\"Basket\"`…), or `None` |\n| `Close()` | Closes it without applying, like its X button: the preview is discarded and objects hidden while editing come back. Returns the closed panel's name, or `None` if no panel was open |\n\nThrough MCP, `run_command` warns when it leaves a panel open, and `close_panel` closes it. In the Python package, this is `ra.panels`.","metadata":{"title":"Document","section":"Command panels","url":"https://www.rhinoartisan.com/docs/scripting/reference/document/#command-panels","source":"https://www.rhinoartisan.com/docs/scripting/reference/document/#command-panels","collection":"scripting","hash":"ec7d19bca4a378e605a4fd5794bd6e05","indexed_by":"docs-index"}},{"content":"Drafting\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nEverything that turns a finished design into paperwork — the sheets, tables and annotations a workshop actually receives. Each has its own page.\n\nReports The auto A4 report, or your own template with tags.\n\nGems map The 2D stone chart: one colored circle per gem.\n\nGems list CSV The gems list, written as CSV.\n\nGems table The gems list drawn into the document, optionally by group.\n\nMetals table Estimated cast weights per metal, drawn as a table.\n\nBreakdown tables The four production-sheet cost tables.\n\nAuto-dimensions Dispatches by design type: ring set, or bounding box.\n\nRing dimensions Six dimensions in four groups, finger diameter included.\n\nBox dimensions Width, depth and height around the bounding box.\n\nBangle dimensions Width and thickness per section, plus the inner opening.","metadata":{"title":"Drafting","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/","collection":"scripting","hash":"dec997d814f5681a24bba85ab589bcdd","indexed_by":"docs-index"}},{"content":"Drafting — The three families\n\n| Family | Pages | What you get |\n|---|---|---|\n| Sheets | Reports | A layout page you then print with `DocumentApi.ReportPdf` |\n| Tables and charts | Gems map, Gems list CSV, Gems table, Metals table, Breakdown tables | Geometry and text drawn into the model — or, for the CSV, a file on disk |\n| Dimensions | Auto-dimensions, Ring, Box, Bangle | Dimension annotations placed on the design |","metadata":{"title":"Drafting","section":"The three families","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#the-three-families","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#the-three-families","collection":"scripting","hash":"5d624703224fa81121e7690688013f33","indexed_by":"docs-index"}},{"content":"Drafting — Finding the result afterwards\n\nMost of these return `void`, so the only way back to what they drew is the Rhino group they leave behind. The names are worth keeping to hand:\n\n| Page | Returns | Group left behind |\n|---|---|---|\n| Reports | `bool`, or the new layout page name | A layout page, e.g. `\"Report 1\"` |\n| Gems map | nothing | `GEMS_MAP` |\n| Gems list CSV | the written path | — writes a file, draws nothing |\n| Gems table | nothing | `GEMS_LIST`, or `GEMS_LIST_BY_SELECTION_GROUPS` |\n| Metals table | nothing | an unnamed group — nothing to search for |\n| Breakdown tables | nothing | `BREAKDOWN_METALS` — for every category, not one name per table |\n\nEach call adds another copy; nothing is replaced or deduplicated.","metadata":{"title":"Drafting","section":"Finding the result afterwards","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#finding-the-result-afterwards","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#finding-the-result-afterwards","collection":"scripting","hash":"278ee0a22b3c4a67f0350e734552d15d","indexed_by":"docs-index"}},{"content":"Drafting — Conventions\n\nMillimetres, and mutations belong inside a `Transaction` for one-step undo.\n\nThe house `0`-keeps-default rule does not hold across this page. Breakdown tables' `scale = 0` does mean the default (2.0), but Gems map's `scale` must be between `0.01` and `10` and throws on `0`, and Gems table and Metals table have no `scale` at all — their geometry is fixed, so resize the group afterwards.\n\nRing dimensions halves the current dimension style's length values and saves them to the document — cumulatively, on every call. Call it twice and the text is a quarter the size. Check the style before repeating it in a loop.","metadata":{"title":"Drafting","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/#conventions","collection":"scripting","hash":"b0eef6c177e34215929eb0ba865c012d","indexed_by":"docs-index"}},{"content":"Auto-dimensions\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe one-call version of the drafting job: everything in the document is meshed together at low resolution and annotated, so a bench sheet or a workshop print gets its measurements without a single pick. It is the ArtisanGenerateDimensions command run headless — it takes no arguments because the command takes no input.","metadata":{"title":"Auto-dimensions","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/","collection":"scripting","hash":"85107b37e9bf029b7a7faffb0a8d1580","indexed_by":"docs-index"}},{"content":"Auto-dimensions — Usage\n\n```python\nok = drafting.GenerateDimensions()\n```\n\nThere are no parameters. The offset between the geometry and the dimension lines is fixed at 2 mm, and the annotations are drawn with the document's current dimension style, on the current layer.\n\nWhat it draws\nThe method does not ask you what the design is: it reads the document's design type — the same value `SemanticsApi.DescribeDocument()` reports, see Document — and branches on it.\n\n| Design type | What you get |\n|---|---|\n| `RING` | The ring set: the finger diameter across the bore, the shank's thickness and width at the bottom, the width and the height at the top, and the shank section's extent in X |\n| `BRACELET`, `EARRING`, `NECKLACE`, `PENDANT`, `COMPONENT`, `UNSET` | Three linear dimensions of the global bounding box: width in X, depth in Y and height in Z, each drawn 2 mm clear of the box at its mid-height |\n\nEverything visible or hidden in the document is fed into the analysis mesh — `GenerateDimensions` has no selection and no selection fallback. If you want to dimension part of a design, use Box dimensions, which takes explicit object ids.","metadata":{"title":"Auto-dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#usage","collection":"scripting","hash":"d7b31ff973ea3d82b6e8791298c85961","indexed_by":"docs-index"}},{"content":"Auto-dimensions — Choosing between this and the specific methods\n\nCall `GenerateDimensions` when the design type is trustworthy and you want the house default with no decisions to make — a batch that opens a folder of ring files and stamps each one, for instance.\n\nReach for a specific method instead when you need control the generic entry point does not offer:\n\n- Ring dimensions — the same branch, but it also halves the dimension style so the annotations read on a small ring, and keeps the dimensions off the metal layer.\n- Box dimensions — bounding-box dimensions of chosen objects, with a settable offset and an optional box Brep.\n- Bangle dimensions — cross sections and inner spans, which the generic branch never produces: a bangle has design type `BRACELET`, so `GenerateDimensions` gives it a plain bounding box.","metadata":{"title":"Auto-dimensions","section":"Choosing between this and the specific methods","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#choosing-between-this-and-the-specific-methods","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#choosing-between-this-and-the-specific-methods","collection":"scripting","hash":"ee4d6527bc280628acd5f5ff01a481c6","indexed_by":"docs-index"}},{"content":"Auto-dimensions — The return value\n\n`GenerateDimensions` returns a `bool`: `True` when the command reported success, `False` when it failed. Three things make it fail:\n\n- The licence check did not pass.\n- The objects in the document could not be meshed at low resolution. The command reports this with a modal \"Unable to generate dimensions\" dialog before failing, which will block an unattended script.\n- The design type is `RING` but no parametric Artisan ring was found in the document. The finger diameter is read from the first Cathedral, Classic, Signet, curve-driven or Advanced ring object present; with none of those there is no finger size to annotate and the command gives up silently, with nothing added and no message.\n\nA `False` therefore means the call did nothing — never a partial result. When it returns `True`, one dimension may still be missing: any annotation whose computed span is degenerate is discarded rather than added, so a perfectly flat object yields fewer than three bounding-box dimensions.\n\nThe call mutates the document. Wrap it in a `Transaction` so the whole set of annotations undoes in one step.\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\n\nwith Transaction.Begin(\"Auto-dimensions\"):\n    if not drafting.GenerateDimensions():\n        print(\"Nothing was dimensioned.\")\n```","metadata":{"title":"Auto-dimensions","section":"The return value","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#the-return-value","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/auto-dimensions/#the-return-value","collection":"scripting","hash":"7aa73327ae9c1ab7523bae7867a39b77","indexed_by":"docs-index"}},{"content":"Bangle dimensions\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nWhat a bangle drawing has to state: the section of the band at the top, the bottom and each side — width and thickness at every one of them — and the size of the hole the wrist goes through. The objects you pass are meshed together at low resolution, sliced with the two world planes through the origin, and annotated. It is the ArtisanGenerateDimensionsFromBangle command with its selection prompt and its options turned into arguments.","metadata":{"title":"Bangle dimensions","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/","collection":"scripting","hash":"25ad914ee1cf57cf544f0f54e72cdf4a","indexed_by":"docs-index"}},{"content":"Bangle dimensions — Usage\n\n```python\ndrafting.GenerateDimensionsFromBangle(objectIds, offset = 2.0, addBox = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | The objects to dimension, the command's selection. At least one id is required; there is no fallback to the viewport selection |\n| `offset` | `2.0` | Gap in millimetres between the geometry and the dimension lines, the command's Offset option. Valid from 0 to 100 |\n| `addBox` | `False` | `True` also adds the global bounding box to the document as a Brep, the command's Box option |\n\n`offset` is a literal gap, not a sentinel: `0` puts the dimension lines flush against the geometry.\n\nThe bangle must be centred on the world origin, like the command expects. The four sections are found by cutting with the world YZ and XY planes and sorting the resulting curves into half-spaces, so an off-centre bangle puts sections on the wrong side and produces nonsense or nothing at all.","metadata":{"title":"Bangle dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#usage","collection":"scripting","hash":"d23943825652ccae88d21e20001354e0","indexed_by":"docs-index"}},{"content":"Bangle dimensions — What it draws\n\nThe mesh is cut twice: with the world YZ plane, which gives the sections at the top and the bottom of the band, and with the world XY plane, which gives the sections at the right and the left. Each of the four gets two dimensions, not one:\n\n| Section | Dimensions |\n|---|---|\n| Top | Its width in Y, and its thickness in Z |\n| Bottom | Its width in Y, and its thickness in Z |\n| Right | Its width in Y, and its thickness in X |\n| Left | Its width in Y, and its thickness in X |\n\nTwo further dimensions span the model:\n\n- Across X, drawn above the model, clear of the bounding box by twice the offset.\n- Across Z, drawn at the model's side, likewise clear by twice the offset.\n\nThese two are measured from the inner edges of the sections — the innermost X of the right section to the innermost X of the left, and the lowest Z of the top section to the highest Z of the bottom. They therefore report the inner opening, the aperture the wrist passes through, not the outside width and height of the piece. The old single-page reference called them \"the global spans\", which is wrong in both directions: they are not global, and they are internal. If you want the outside envelope, pass `addBox = True` and measure the Brep, or use Box dimensions.\n\nThat makes ten dimensions in total on a well-formed bangle. Each one is added only when it comes out geometrically valid: a section that lands entirely on one side of a cutting plane produces an empty bounding box, whose dimensions are silently dropped. A short result is a symptom of an off-centre or open bangle, not an error you will be told about.","metadata":{"title":"Bangle dimensions","section":"What it draws","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#what-it-draws","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#what-it-draws","collection":"scripting","hash":"a216e17ba99e05688c64f117f7fe39e1","indexed_by":"docs-index"}},{"content":"Bangle dimensions — What it draws\n\nEverything lands on the current layer, with the document's current dimension style — the style is left alone, unlike Ring dimensions. Note also that, unlike Box dimensions, no analysis mesh and no marker point are left behind: only the dimensions, plus the bounding-box Brep when you ask for it.","metadata":{"title":"Bangle dimensions","section":"What it draws","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#what-it-draws","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#what-it-draws","collection":"scripting","hash":"1df7a08ca77dbf2e8cc823d810c6b8c0","indexed_by":"docs-index"}},{"content":"Bangle dimensions — The return value\n\n`GenerateDimensionsFromBangle` returns nothing (`void`). To see what it produced, diff the document's object ids around the call:\n\n```python\nimport Rhino\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\n\ndoc = Rhino.RhinoDoc.ActiveDoc\nbefore = set(o.Id for o in doc.Objects)\n\nwith Transaction.Begin(\"Bangle dimensions\"):\n    drafting.GenerateDimensionsFromBangle(ids, offset = 2.0)\n\ncreated = [o for o in doc.Objects if o.Id not in before]\nprint(len(created), \"annotations\")     # ten on a well-formed, centred bangle\n```\n\nThe `Transaction` also gives the whole set a single undo step, which matters here more than usual: ten annotations are tedious to remove by hand.","metadata":{"title":"Bangle dimensions","section":"The return value","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#the-return-value","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#the-return-value","collection":"scripting","hash":"03a59f3c47df5664b632459767e14b8a","indexed_by":"docs-index"}},{"content":"Bangle dimensions — Validation\n\nFailures are exceptions, not a return code:\n\n| Condition | Error |\n|---|---|\n| No document open | `No active document.` |\n| `offset` below 0 or above 100 | `Offset must be between 0 and 100.` (an `ArgumentOutOfRangeException`) |\n| `objectIds` empty or `None` | `At least one object id is required.` |\n| The objects cannot be meshed at low resolution | `Unable to generate dimensions from the given objects.` |\n\nThere is no check that the objects are actually a bangle. Passing something else — a ring, a pendant, a lone sphere — throws nothing: it is cut with the same two planes and whatever sections happen to fall in each half-space get dimensioned, which is rarely what you want.","metadata":{"title":"Bangle dimensions","section":"Validation","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#validation","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/bangle-dimensions/#validation","collection":"scripting","hash":"a51084cc67437e8e95f095e67ce6912b","indexed_by":"docs-index"}},{"content":"Box dimensions\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe overall envelope of a piece, the three numbers a caster or a packer needs: how wide, how deep, how tall. The objects you pass are meshed together at low resolution, and three linear dimensions are drawn around the resulting global bounding box. It is the ArtisanGenerateDimensionsByBox command with its selection prompt and its two options turned into arguments.","metadata":{"title":"Box dimensions","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/","collection":"scripting","hash":"7ddd889a615a35d5aabc7dd325adcd9d","indexed_by":"docs-index"}},{"content":"Box dimensions — Usage\n\n```python\ndrafting.GenerateDimensionsByBox(objectIds, offset = 2.0, addBox = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | The objects to dimension, the command's selection. At least one id is required; there is no fallback to the viewport selection |\n| `offset` | `2.0` | Gap in millimetres between the geometry and the dimension lines, the command's Offset option. Valid from 0 to 100 |\n| `addBox` | `False` | `True` also adds the bounding box itself to the document as a Brep, the command's Box option |\n\n`offset` has no \"keep the default\" sentinel: `0` means a zero gap, with the dimension lines flush against the box.","metadata":{"title":"Box dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#usage","collection":"scripting","hash":"7cd733ec7733331b4605763995aef933","indexed_by":"docs-index"}},{"content":"Box dimensions — What it puts in the document\n\nThe three dimensions are placed against the bounding box of the analysis mesh:\n\n- Width in X, above the model — the dimension plane sits at the box's maximum Y and maximum Z, with the dimension line `offset` beyond it.\n- Depth in Y, at the model's right — the plane is rotated a quarter turn about Z and translated by `offset`.\n- Height in Z, at the model's front — measured in the YZ plane, so it is the model's real height, not a projected one.\n\nThree other objects are left behind, exactly as the command leaves them:\n\n- The low-resolution analysis mesh used for the measurement, added as an ordinary mesh object.\n- A marker point at the origin of the depth dimension's plane.\n- The bounding-box Brep, when `addBox = True`.\n\nDelete the mesh and the point afterwards if you only wanted the annotations. Everything goes on the current layer, with the document's current dimension style — unlike Ring dimensions, this method does not touch the style.\n\nEach dimension is added only if it comes out geometrically valid, so a degenerate span — a perfectly flat plate has no height — is silently dropped rather than raising. Fewer than three dimensions is a normal outcome, not an error.","metadata":{"title":"Box dimensions","section":"What it puts in the document","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#what-it-puts-in-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#what-it-puts-in-the-document","collection":"scripting","hash":"d2c1fff1aa660079254104be9ce2ae0b","indexed_by":"docs-index"}},{"content":"Box dimensions — The return value\n\n`GenerateDimensionsByBox` returns nothing (`void`). To find out what it produced, capture the document's object ids before and after and take the difference:\n\n```python\nimport Rhino\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\n\ndoc = Rhino.RhinoDoc.ActiveDoc\nbefore = set(o.Id for o in doc.Objects)\n\nwith Transaction.Begin(\"Box dimensions\"):\n    drafting.GenerateDimensionsByBox(ids, offset = 3.0, addBox = True)\n\ncreated = [o for o in doc.Objects if o.Id not in before]\n```\n\nThe `Transaction` is worth having anyway: it collapses the mesh, the point, the box and the dimensions into a single undo step.","metadata":{"title":"Box dimensions","section":"The return value","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#the-return-value","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#the-return-value","collection":"scripting","hash":"a40ddc4fa1b7628946555e5dd3cd4f91","indexed_by":"docs-index"}},{"content":"Box dimensions — Validation\n\nFailures are exceptions, not a `False`:\n\n| Condition | Error |\n|---|---|\n| No document open | `No active document.` |\n| `offset` below 0 or above 100 | `Offset must be between 0 and 100.` (an `ArgumentOutOfRangeException`) |\n| `objectIds` empty or `None` | `At least one object id is required.` |\n| The objects cannot be meshed at low resolution | `Unable to generate dimensions from the given objects.` |\n\nUnlike the command, nothing pops a dialog: the meshing failure the command reports in a message box comes back here as a plain exception, so the method is safe to run unattended.","metadata":{"title":"Box dimensions","section":"Validation","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#validation","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/box-dimensions/#validation","collection":"scripting","hash":"bcc0e4fd991b2bc812b1876ab1923adf","indexed_by":"docs-index"}},{"content":"Breakdown tables\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe four blocks a production sheet is assembled from: what metal the piece consumes, what stones go into it, what has to be done to it, and what bought-in parts it needs. Each is a view of the same breakdown — the costing object RhinoArtisan computes for the design against the active manufacturer — drawn as plain text into the model space at a point you choose. It is the ArtisanBreakdownMetals / ArtisanBreakdownGems / ArtisanBreakdownProcesses / ArtisanBreakdownExtras commands without their pick prompt, folded into one method because they differ only in which table they draw.","metadata":{"title":"Breakdown tables","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/","collection":"scripting","hash":"c156475d675e1f3e269f37787585d45c","indexed_by":"docs-index"}},{"content":"Breakdown tables — Usage\n\n```python\ndrafting.CreateBreakdownTable(\"METALS\", point, scale = 0)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `category` | - | `METALS`, `GEMS`, `PROCESSES` or `EXTRAS`. Trimmed and upper-cased, so `\"gems\"` is fine |\n| `point` | - | Insertion point: the first row starts here and the table grows downwards |\n| `scale` | `0` | Layout and text-height factor; `0` keeps the tool default, `2` |\n\n`scale` follows the house rule: `0` means \"the tool default\", which for this table is `2` — the same factor the commands use, and what the report templates draw their list markers at. It multiplies both the row spacing and the lettering, and it scales about `point`, so the table's top-left corner stays put as you change it. A negative value throws `Scale must be positive.`; there is no upper limit, so a large scale simply gives a large table.","metadata":{"title":"Breakdown tables","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#usage","collection":"scripting","hash":"02e828280df90af2ad9da8517ff222b2","indexed_by":"docs-index"}},{"content":"Breakdown tables — The four categories\n\n| `category` | What it draws |\n|---|---|\n| `METALS` | One block per metal in the breakdown, headed by the metal's name in bold, then four labelled rows: Net weight, Waste, Weight (net plus waste) and Wax, each in grams to two decimals. Blocks are 8 units apart |\n| `GEMS` | The stone list. Certified diamonds come first, in their own list under a bold Certified title; then the main table, with a header row (Setting, Shape, Num, Size mm, Sieve, Ct, Type) and one row per gem group: a colour swatch keyed to the stone's size, the setting type, shape, count, size, sieve code, carats, and the diamond type (natural or lab-grown) taken from the document's setting |\n| `PROCESSES` | One block per metal — Printing (the print size), Finishing (the finishing type) and Plating (`Rhodium` or `None`) — then a bold Setting section listing each setting type with its stone count, and, only when the breakdown has any, a bold Additional processes section listing them by name |\n| `EXTRAS` | The bought-in components, one name per row. Note that this table draws only the names — no title row, no prices |\n\nAnything else throws `Unknown category 'X'. Use METALS, GEMS, PROCESSES or EXTRAS.` — including `null` and the empty string, so there is no \"draw them all\" shorthand. Call it four times, at four points, to lay out a full sheet.","metadata":{"title":"Breakdown tables","section":"The four categories","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#the-four-categories","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#the-four-categories","collection":"scripting","hash":"a8931413396d021c9acbe113e6a47973","indexed_by":"docs-index"}},{"content":"Breakdown tables — Where the breakdown comes from\n\nThe tables never compute prices themselves; they render whatever breakdown the document currently holds. When none has been computed yet, or the one stored has no metal rows at all, the breakdown is recomputed first from the active manufacturer — silently, through the same engine `PricingApi.Calculate()` uses, where the commands would put a yes/no dialog on screen. The freshly computed breakdown is saved back into the document, so the next call finds it.\n\nThat test looks only at the metal rows. A design whose breakdown genuinely has no metals — an all-stone parcel, say — is recomputed on every call, which costs time but changes nothing.\n\nWhen the data behind a table is missing, the table comes out short rather than failing: with an empty gem list `GEMS` still draws its header row and nothing under it, `EXTRAS` and the additional-processes section draw nothing at all, and a manufacturer with no pricing rows for a metal simply yields zeros. If the numbers look wrong, fix the manufacturer file and recompute — the table is only a picture of it.","metadata":{"title":"Breakdown tables","section":"Where the breakdown comes from","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#where-the-breakdown-comes-from","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#where-the-breakdown-comes-from","collection":"scripting","hash":"5e17389a67e8489c0e5be952dc47fbd0","indexed_by":"docs-index"}},{"content":"Breakdown tables — What it returns and where the result lands\n\nThe method returns nothing. The result is the text objects added at `point`, on the active layer, in black, with a `doc.Views.Redraw()` at the end so they appear immediately.\n\nAll four tables are added to a group literally named `BREAKDOWN_METALS`, whatever the category — the group name is shared, not per-category. Each call adds its own new group under that same name, so select any text of a table and ungroup, or move by group, to handle one table at a time.\n\nIt throws when there is no active document (`No active document.`), when the licence is invalid, on an unknown category, and on a negative scale.\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\nfrom Rhino.Geometry import Point3d\n\nwith Transaction.Begin(\"Production sheet tables\"):\n    drafting.CreateBreakdownTable(\"METALS\",    Point3d(0, 0, 0))\n    drafting.CreateBreakdownTable(\"GEMS\",      Point3d(60, 0, 0))\n    drafting.CreateBreakdownTable(\"PROCESSES\", Point3d(0, -60, 0))\n    drafting.CreateBreakdownTable(\"EXTRAS\",    Point3d(60, -60, 0))\n```\n\nWrap the calls in a single `Transaction` so the whole sheet lands as one undo step. If what you actually want is a printable page rather than loose text in model space, use a report template instead: its `METAL_LIST`, `GEM_LIST`, `PROCESS_LIST` and `EXTRA_LIST` markers draw these same four tables in place — see Reports.","metadata":{"title":"Breakdown tables","section":"What it returns and where the result lands","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#what-it-returns-and-where-the-result-lands","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/breakdown-tables/#what-it-returns-and-where-the-result-lands","collection":"scripting","hash":"c64655398894c2a7c75a49e87843fe93","indexed_by":"docs-index"}},{"content":"Gems list CSV\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe stone list the buyer and the setter both need, as a file rather than as drawing: every distinct gem in the piece with its shape, dimensions, carat weight and how many of it there are. The tool walks the document's gems, groups identical stones and counts them, then writes the result as a semicolon-delimited CSV - the ArtisanGemsListToExcel command without its save-file dialog.","metadata":{"title":"Gems list CSV","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/","collection":"scripting","hash":"7c6411c5117e6a69256f33cd72a56bb8","indexed_by":"docs-index"}},{"content":"Gems list CSV — Usage\n\n```python\nwritten = drafting.ExportGemsList(path, onlySelection = False, useSystemDecimals = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | - | Destination file. `.csv` is appended when the extension is missing |\n| `onlySelection` | `False` | `True` = only the currently selected gems; `False` = every visible gem in the document |\n| `useSystemDecimals` | `False` | `False` = invariant formatting, decimal point (the command's \"Force Point\"); `True` = the system's decimal separator, e.g. a comma on a Spanish machine |\n\nReturns the full path actually written, as a `string` - use it rather than the path you passed in, since the tool normalises it.","metadata":{"title":"Gems list CSV","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#usage","collection":"scripting","hash":"ec81ac34b4ec320b574222a3b3cf4963","indexed_by":"docs-index"}},{"content":"Gems list CSV — The file\n\nOne header line followed by one line per distinct gem, separator `;`, no quoting:\n\n```\nShape;Size X;Size Y;Carats;Quantity;Total Carats\n```\n\n| Column | Contents |\n|---|---|\n| `Shape` | The gem shape, as the kernel names it |\n| `Size X`, `Size Y` | The stone's two dimensions in millimetres, up to three decimals |\n| `Carats` | Carat weight of a single stone, rounded to three decimals |\n| `Quantity` | How many identical stones were grouped into this row |\n| `Total Carats` | The rounded single-stone carats multiplied by `Quantity` |\n\n`Total Carats` is computed from the already rounded per-stone value, so it matches the printed `Carats` column exactly rather than the full-precision weight.\n\nIdentical stones are grouped and counted by the same rule the command uses; hidden gems are skipped unless you are exporting the selection.","metadata":{"title":"Gems list CSV","section":"The file","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#the-file","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#the-file","collection":"scripting","hash":"93e3a6fb26b6429081a3a50c53ca3a83","indexed_by":"docs-index"}},{"content":"Gems list CSV — Path handling\n\nThe path is resolved to an absolute one first, so a relative path lands wherever Rhino's working directory is - pass an absolute path if that matters. If the extension is not `.csv` (case-insensitively) then `.csv` is appended - `\"C:\\out\\gems\"` becomes `\"C:\\out\\gems.csv\"`, and `\"C:\\out\\gems.txt\"` becomes `\"C:\\out\\gems.txt.csv\"`. Missing folders in the path are created. An existing file is overwritten without warning.","metadata":{"title":"Gems list CSV","section":"Path handling","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#path-handling","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#path-handling","collection":"scripting","hash":"512247c8ee19e2bd57d20340cf784de3","indexed_by":"docs-index"}},{"content":"Gems list CSV — Errors\n\nThrows `InvalidOperationException` *\"No active document.\"* with no document open, and `ArgumentException` *\"A destination file path is required.\"* when `path` is null, empty or whitespace.\n\nWriting a file is not a document mutation, so no `Transaction` is needed here.","metadata":{"title":"Gems list CSV","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-list-csv/#errors","collection":"scripting","hash":"e08477e31d486f448a4ee8c40ce9007a","indexed_by":"docs-index"}},{"content":"Gems map\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe gems map is the stone chart the setter works from: every gem in the document flattened onto a 2D drawing as a coloured circle with its size written beside it, so the bench can see at a glance which stone goes where and in what size. The tool projects each gem's position, draws the circle, the hatch and the label, and leaves the lot in the document - the same drawing the ArtisanGemsMap command makes, without its pick prompt.","metadata":{"title":"Gems map","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-map/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-map/","collection":"scripting","hash":"82f2c70452e3b08f642a1c4a7f7a5680","indexed_by":"docs-index"}},{"content":"Gems map — Usage\n\n```python\ndrafting.CreateGemsMap(point, scale = 2, spherical = False, expandOverlapping = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `point` | - | `Point3d` the map is centred on (the command's pick) |\n| `scale` | `2` | Drawing scale factor; valid range 0.01 to 10 |\n| `spherical` | `False` | `False` = planar projection; `True` = spherical, for stones wrapped around a curved surface |\n| `expandOverlapping` | `False` | `True` pushes overlapping circles apart so every label stays readable |\n\nNote that `scale` here does not follow the usual \"`0` keeps the tool default\" convention: `0` is out of range and throws. Pass the command default `2` explicitly, or any value between 0.01 and 10.\n\nReturns nothing (`void`). The result is the geometry it added to the active document: curves, texts and hatches, all placed in a Rhino group named `GEMS_MAP`. That group name is how you find the map afterwards - select it, move it, or delete it as a unit before drawing a fresh one, since each call adds another map rather than replacing the previous one. The views are redrawn on the way out.\n\nWith no gems in the document it draws nothing and says so on the command line, exactly like the command - it does not throw.\n\nOut-of-range scale throws `ArgumentOutOfRangeException`: *\"Scale must be between 0.01 and 10.\"*\n\nThe map is document geometry, so wrap the call in a `Transaction` when you want a one-step undo alongside the rest of your script.","metadata":{"title":"Gems map","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-map/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-map/#usage","collection":"scripting","hash":"1108b28dbae699028b299b077cc508c4","indexed_by":"docs-index"}},{"content":"Gems table\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe same stone list as the CSV export, but drawn into the model so it prints alongside the views on a production sheet: one row per distinct gem with shape, size, carats, quantity, total carats and compound. The tool collects the gems, groups identical stones, and lays the rows out as plain text objects - the ArtisanGemsList command family, headless.","metadata":{"title":"Gems table","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/","collection":"scripting","hash":"f165e2e29df0e01744a5cad8a3f144f3","indexed_by":"docs-index"}},{"content":"Gems table — Usage\n\n```python\ndrafting.CreateGemsTable(point, onlySelection = False, groupBySelection = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `point` | - | `Point3d` the table is drawn from: the first row's left edge, rows running downwards |\n| `onlySelection` | `False` | `True` = only the currently selected gems (ArtisanGemsListBySelection); `False` = every visible gem in the document (ArtisanGemsList) |\n| `groupBySelection` | `False` | `True` = the ArtisanGemsListBySelectionGroups variant: the selected gems are bucketed by their Rhino group and drawn as one sub-table per group, each headed by the group's name in capitals, plus an \"Ungrouped\" section for selected gems belonging to no group. Implies `onlySelection` |","metadata":{"title":"Gems table","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#usage","collection":"scripting","hash":"1507666d94c76366527c1be3f09d1115","indexed_by":"docs-index"}},{"content":"Gems table — Placement and size\n\n`point` is applied as a plain translation of a table laid out from the world origin, so it is the top-left of the block: the first row sits at `point`, and each following row is 1.5 model units lower. Columns are at fixed offsets from `point` in X - shape at 0, size at 12, carats right-aligned at 29, quantity centred at 33, total carats right-aligned at 42, compound at 46 - so the block is roughly 46 units wide. In a millimetre document that is millimetres.\n\nThere is no scale parameter on this method, unlike breakdown tables: row spacing, column offsets and text height are fixed, the text height coming from the document's default annotation style. Scale the resulting group afterwards if you need the table bigger. Every text is drawn in black, with the object colour set explicitly rather than inherited from the layer.\n\nIn the grouped variant, the sub-tables run one after another down the same column, separated by one blank 1.5-unit row, each preceded by its group-name header row; the \"Ungrouped\" section comes last.","metadata":{"title":"Gems table","section":"Placement and size","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#placement-and-size","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#placement-and-size","collection":"scripting","hash":"6b8e63be78dbd55169ba9ea226d54169","indexed_by":"docs-index"}},{"content":"Gems table — What you get back\n\nReturns nothing (`void`). The result is the text objects added to the active document, collected into a Rhino group named `GEMS_LIST` - or `GEMS_LIST_BY_SELECTION_GROUPS` for the grouped variant. That is how you find, move or delete the table afterwards; each call adds a fresh one rather than updating the last. The views are redrawn on the way out.","metadata":{"title":"Gems table","section":"What you get back","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#what-you-get-back","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#what-you-get-back","collection":"scripting","hash":"342054797eb0a1554cf36d61eab5a062","indexed_by":"docs-index"}},{"content":"Gems table — Errors\n\nWith no document open it throws `InvalidOperationException` *\"No active document.\"*\n\nWith no visible gems in the document it draws nothing at all - like the command, that is not an error. The selection variants, though, throw `ArgumentException` *\"No gems in the current selection.\"* when the selection holds no gems, mirroring the commands' cancel.\n\nThe table is document geometry: wrap the call in a `Transaction` for one-step undo.","metadata":{"title":"Gems table","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/gems-table/#errors","collection":"scripting","hash":"043a384e588a2593d6b58116a69ba974","indexed_by":"docs-index"}},{"content":"Metals table\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe weight table a caster reads before quoting: the same piece weighs one thing in 18K yellow and quite another in platinum, so the sheet lists the estimated cast weight of the design in each metal you care about, plus what is left of it once the piece has been polished. It is the ArtisanMetalsList / ArtisanMetalsListBySelection commands without their checklist dialog and pick prompt: the tool measures the volume of the objects once, then multiplies that single volume by each metal's density.","metadata":{"title":"Metals table","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/","collection":"scripting","hash":"0eb5441ddcf43dbdb3873cefcd2dfbc7","indexed_by":"docs-index"}},{"content":"Metals table — Usage\n\n```python\ndrafting.CreateMetalsTable(point, [\"GOLD_YELLOW_18\", \"PLATINUM\", \"SILVER\"],\n                           includeWax = True, onlySelection = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `point` | - | Insertion point; the header row sits on it and the table grows downwards |\n| `metals` | - | `Metal` enum names to list, case-insensitive. Rows always follow the checklist order, whatever order you pass |\n| `includeWax` | `False` | `True` appends the wax row, at the configured wax density |\n| `onlySelection` | `False` | `True` measures only the current selection (`ArtisanMetalsListBySelection`); `False` measures every non-hidden object in the document |\n\nThere is no `scale` parameter here: the rows are 1.5 model units apart and the texts take the document's current annotation style. To draw the table larger, scale the resulting texts afterwards, or use the breakdown tables, which do take a scale factor.","metadata":{"title":"Metals table","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#usage","collection":"scripting","hash":"30c93d83d2053b71cda0cd701d971c9a","indexed_by":"docs-index"}},{"content":"Metals table — The metals it accepts\n\n`metals` is a subset of the command's checklist, and nothing else is accepted:\n\n```\nGOLD_24\nGOLD_YELLOW_22   GOLD_YELLOW_18   GOLD_YELLOW_14   GOLD_YELLOW_10   GOLD_YELLOW_9\nGOLD_WHITE_18    GOLD_WHITE_14    GOLD_WHITE_10    GOLD_WHITE_9\nGOLD_ROSE_18     GOLD_ROSE_14     GOLD_ROSE_10     GOLD_ROSE_9\nGOLD_GREEN_18    GOLD_GREEN_14    GOLD_GREEN_10    GOLD_GREEN_9\nGOLD_CHOCOLATE   PLATINUM         SILVER           PALLADIUM\n```\n\nThese are the metals you ask for, not the metals the document carries: the table is a what-if list, so the design's own metal assignment plays no part in which rows appear. Anything outside the list throws `Unknown metal 'X'. Valid values: GOLD_24, GOLD_YELLOW_22, ...`, and asking for nothing at all — an empty list, or only blank names, with `includeWax = False` — throws `At least one metal (or the wax row) is required.`","metadata":{"title":"Metals table","section":"The metals it accepts","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#the-metals-it-accepts","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#the-metals-it-accepts","collection":"scripting","hash":"345f2f0dfa4291042da4b4e67b11b65c","indexed_by":"docs-index"}},{"content":"Metals table — How the weights are estimated\n\nThe tool sums the volume of the measured objects, skipping anything that is a gem or diamond. Breps, extrusions (both through their Brep form), meshes and SubDs (meshed via `ToBrep`) contribute; curves, points, text and everything else contribute nothing. Volumes are taken as absolute values, so an inside-out solid still adds rather than subtracts.\n\nThat single volume then becomes a weight per metal, in grams, at density in g/cm³ over a volume in mm³:\n\n| Column | Contents |\n|---|---|\n| Name | The translated metal name, left-aligned at the insertion point |\n| Weight | `volume x density / 1000`, formatted `0.00 g`, right-aligned 20 units in |\n| Processed (-5%) | The same weight with the configured processed-weight percentage removed, right-aligned 34 units in |\n\nThe header row reads `Weight` and `Processed (-N%)`, with the actual configured percentage — 5% unless you have changed it in Options. Densities come from RhinoArtisan's table, or from your Custom Metal List when one overrides that metal. The wax row uses the configured wax density (0.97 by default) with the carat-style divisor the wax estimate has always used, and deliberately has no Processed value, so its third column is left blank.\n\nEvery text is added to the active layer with an explicit black object colour, and all of them join one new, unnamed group — unlike the gems and breakdown tables, there is no group name to search for afterwards. Select one text and press `Ctrl+Shift+G`, or select the group in the ungrouped state, to move or delete the table as a unit.","metadata":{"title":"Metals table","section":"How the weights are estimated","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#how-the-weights-are-estimated","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#how-the-weights-are-estimated","collection":"scripting","hash":"aeb4af9d0eddfbb70aac9d2ae6289dcb","indexed_by":"docs-index"}},{"content":"Metals table — What it returns and when it throws\n\nThe method returns nothing. The result is the texts left in the document at `point`, and a `doc.Views.Redraw()` at the end so they appear immediately.\n\nIt throws when there is no active document (`No active document.`), when the licence is invalid, on an unknown metal or an empty request as described above, and when there is nothing to measure: `Nothing is selected.` with `onlySelection = True`, `There are no objects in the document.` otherwise.\n\nMissing *data* is not an error, only missing *objects*. A document holding nothing but gems passes the object check, contributes zero volume and draws a full table of `0.00 g` rows — a sign that the tool found no metal geometry, not that the settings are wrong.\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\nfrom Rhino.Geometry import Point3d\n\nwith Transaction.Begin(\"Metals table\"):\n    drafting.CreateMetalsTable(Point3d(60, 0, 0),\n                               [\"GOLD_YELLOW_18\", \"GOLD_WHITE_18\", \"PLATINUM\"],\n                               includeWax = True)\n```\n\nThe table is a document mutation like any other: wrap it in a `Transaction` so the whole table lands as one undo step.","metadata":{"title":"Metals table","section":"What it returns and when it throws","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#what-it-returns-and-when-it-throws","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/metals-table/#what-it-returns-and-when-it-throws","collection":"scripting","hash":"0a02e606ac3e439abbb52d968f4cbb45","indexed_by":"docs-index"}},{"content":"Reports\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nA report is the sheet that leaves the CAD room: a layout page carrying the views of the piece, the title block the workshop and the client read, and - when the template asks for it - the metal, gem, process and extras tables and the gems map. There are two paths to one, and both end in a Rhino layout page you print to PDF with `DocumentApi.ReportPdf`. The automatic route builds the standard A4 sheet with no input at all; the template route imports a layout you drew yourself and fills its tags.","metadata":{"title":"Reports","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/","collection":"scripting","hash":"6fea0d3e98ab29cd33a475c379de5865","indexed_by":"docs-index"}},{"content":"Reports — The automatic A4 report\n\n```python\nok = drafting.CreateReport()                     # -> bool\n```\n\nTakes no arguments. Builds the standard A4 report page for the current design - logo, four detail views (top, perspective, front, side), and a title block with the design name, metal and weight, finger size, notes and date - exactly the sheet the ArtisanReport command produces from the ribbon.\n\nIt is implemented by running the command itself, so the output stays identical to the interactive one and picks up future improvements automatically. It returns `True` when the command reports success and `False` otherwise; it does not return the page, so find the result among the document's layout pages after the call.","metadata":{"title":"Reports","section":"The automatic A4 report","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#the-automatic-a4-report","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#the-automatic-a4-report","collection":"scripting","hash":"a83ffe31f75e47ebe4cfbde2b94ca579","indexed_by":"docs-index"}},{"content":"Reports — Listing the templates\n\n```python\nnames = drafting.ReportTemplates()               # -> IReadOnlyList[str]\n```\n\nReturns the report template names available to `CreateReportFromTemplate`: the `*.3dm` files in the configured report-templates folder, without their extension, in the order the folder yields them. The list is read-only and purely informational - no scripting call adds a template, you save one from the Report panel.\n\nThe first entry is the panel's default selection, and it is what `CreateReportFromTemplate` uses when you pass no `template`.","metadata":{"title":"Reports","section":"Listing the templates","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#listing-the-templates","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#listing-the-templates","collection":"scripting","hash":"91ffe05f23f3f77f200cf9bf2f267262","indexed_by":"docs-index"}},{"content":"Reports — Template-based reports\n\n```python\npage = drafting.CreateReportFromTemplate(\n    template = None,\n    style = None, clientId = None, po = None,\n    cadDesigner = None, description = None,\n    customFields = None,\n    sphericalGemsMap = False)                    # -> str, e.g. \"Report 1\"\n```\n\nThe Report panel's Create button, headless: it imports the template's layout into the document as the next `Report N` page, zooms every detail view onto the model, and replaces the template's tags with the document's data.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `template` | `None` | A name from `ReportTemplates()`, matched case-insensitively and trimmed. `None` or blank = the first template, the panel's default selection |\n| `style` | `None` | Title-block style / reference. `None` keeps the value the document already carries |\n| `clientId` | `None` | Title-block client id. `None` keeps the document's value |\n| `po` | `None` | Title-block purchase order. `None` keeps the document's value |\n| `cadDesigner` | `None` | Title-block CAD designer. `None` keeps the document's value |\n| `description` | `None` | Title-block description. `None` keeps the document's value |\n| `customFields` | `None` | A `{field name: value}` mapping feeding the `[MY_FIELD]` style tags; merged over the custom fields the document already has |\n| `sphericalGemsMap` | `False` | `True` draws the `GEM_MAP` marker with the spherical projection instead of the planar one |\n\n`None` means *leave alone*, not *clear*: only the fields you actually pass are written. Pass an empty string to blank a field.","metadata":{"title":"Reports","section":"Template-based reports","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#template-based-reports","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#template-based-reports","collection":"scripting","hash":"d525cb7b653b30426961d3c5f75798a7","indexed_by":"docs-index"}},{"content":"Reports — The tag system\n\nA template is an ordinary 3dm layout whose texts carry tags. At create time each tag is substituted with the document's data:\n\n| Tag | Filled with |\n|---|---|\n| `[CLIENT_ID]`, `[PO]`, `[STYLE]`, `[CAD_DESIGNER]`, `[DESCRIPTION]` | The title-block fields above |\n| The metal tags | The document's metals |\n| `[PRODUCT_SIZE]` | The finger / product size |\n| `[MY_FIELD]` | Your `customFields` entries - the tag is the dictionary key wrapped in brackets, so `customFields = {\"BATCH\": \"0421\"}` fills every `[BATCH]` in the template |\n| `METAL_LIST`, `GEM_LIST`, `PROCESS_LIST`, `EXTRA_LIST` | The corresponding breakdown table, drawn where the marker sits |\n| `GEM_MAP` | The gems map, drawn where the marker sits, planar or spherical per `sphericalGemsMap` |\n\nCustom fields are the extension point: anything the standard title block does not cover, you add as a `[MY_FIELD]` text in the template and feed by name.\n\nThe list markers read the cost breakdown. When no breakdown has been computed yet, it is recomputed silently before the tags are filled - the panel would ask first, the API does not.","metadata":{"title":"Reports","section":"The tag system","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#the-tag-system","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#the-tag-system","collection":"scripting","hash":"7adb5e21bebecf0a8f971384c8f54a25","indexed_by":"docs-index"}},{"content":"Reports — What it returns and leaves behind\n\nThe return value is the name of the new layout page as a `string`, e.g. `\"Report 1\"` - pages are numbered sequentially, so a second call on the same document gives `\"Report 2\"`. Feed it straight to the PDF printer:\n\n```python\nfrom ArtisanPlugin.Scripting import DocumentApi as docapi\n\npage = drafting.CreateReportFromTemplate(\"Workshop A4\", clientId = \"ACME\", po = \"PO-1187\")\ndocapi.ReportPdf(r\"C:\\out\\report.pdf\", pageName = page)\n```\n\nBesides the layout page, the call persists the title-block fields into the document: whatever you pass in `style`, `clientId`, `po`, `cadDesigner`, `description` and `customFields` is merged into the document's saved report info and saved there, so the Report panel shows it afterwards and later reports reuse it.","metadata":{"title":"Reports","section":"What it returns and leaves behind","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#what-it-returns-and-leaves-behind","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#what-it-returns-and-leaves-behind","collection":"scripting","hash":"81e6b3f2cc1277186e16d9bed107425a","indexed_by":"docs-index"}},{"content":"Reports — Errors\n\nWith no templates in the folder it throws `InvalidOperationException`: *\"No report templates available. Save one from the Report panel first.\"*\n\nWith a name that matches no file it throws `ArgumentException`: *\"Unknown report template 'X'. Templates: ...\"*, listing the available names.\n\nBoth calls mutate the document; wrap them in a `Transaction` if you want the page, its filled tags and the saved fields to undo in one step.","metadata":{"title":"Reports","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/reports/#errors","collection":"scripting","hash":"61798a77e41fab07c1767c3474e7875a","indexed_by":"docs-index"}},{"content":"Ring dimensions\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting\n```\n\nThe measurements a bench worker asks for on a ring drawing: how wide the finger hole is, how thick and how wide the shank is under the finger, how tall and how wide the design sits above it, and how broad the band is seen from above. It is the ArtisanGenerateDimensionsFromRing command run headless — the command takes no input, so neither does this method.","metadata":{"title":"Ring dimensions","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/","collection":"scripting","hash":"83482d6b8f0ef6a214c04255efc41dd5","indexed_by":"docs-index"}},{"content":"Ring dimensions — Usage\n\n```python\nok = drafting.GenerateDimensionsFromRing()\n```\n\nThere are no parameters. The gap between the geometry and the dimension lines is fixed at 2 mm, and the ring is expected in the standard Artisan orientation: the finger hole centred on the world origin, the design pointing up the Z axis.\n\nWhat it draws\nEvery object in the document — not a selection — is meshed together at low resolution, and six linear dimensions are placed on it:\n\n| Annotation | Measures |\n|---|---|\n| Finger size | The full finger diameter across the bore, taken from the parametric ring's own finger size, not from the mesh |\n| Bottom (2) | The shank's thickness in Z below the finger hole, and its width in Y at that height, both from the section through the world YZ plane |\n| Top (2) | The width in Y at finger-radius height, and the height from the finger radius up to the top of the model |\n| Size | The shank section's extent in X on the positive-X side, from the section through the world XY plane |\n\nThe old single-page reference described this as \"bottom, top and size annotations\". That is three of the four groups: the finger-diameter dimension is the fourth, and the bottom and top groups are two dimensions each rather than one.","metadata":{"title":"Ring dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#usage","collection":"scripting","hash":"c23ccd1081c8661ace5130c4e13e1ae0","indexed_by":"docs-index"}},{"content":"Ring dimensions — The dimension style and the layer\n\nTwo side effects distinguish this method from the generic Auto-dimensions:\n\n- The current dimension style is halved and saved back to the document — text height, arrow size and the rest of its length values are scaled by 0.5 so the annotations read at ring scale. The change persists, and it is not idempotent: calling the method twice halves the style twice, three times halves it again. If a script dimensions several rings in a session, reset the style between runs or expect the text to shrink each time.\n- The annotations avoid the metal layer. Attributes are built from the document defaults, and if the current layer's name contains `Metal` the dimensions are diverted to the layer named `Default` instead. On any other current layer they land there, exactly as the generic method's do.\n\nThe analysis mesh is also nudged by 0.001 mm on each axis before it is measured, so a face lying exactly on a section plane still produces a section.","metadata":{"title":"Ring dimensions","section":"The dimension style and the layer","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#the-dimension-style-and-the-layer","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#the-dimension-style-and-the-layer","collection":"scripting","hash":"e69e47f831237ec491a41cfc56af14f9","indexed_by":"docs-index"}},{"content":"Ring dimensions — It is not ring-only\n\nDespite the name, this method runs the same design-type branch the generic entry point does. If the document's design type is not `RING`, it draws the three bounding-box dimensions — width in X, depth in Y, height in Z — instead of the ring set, after having halved the dimension style. Set the design type before calling it, or use Box dimensions if a bounding box is what you actually want.","metadata":{"title":"Ring dimensions","section":"It is not ring-only","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#it-is-not-ring-only","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#it-is-not-ring-only","collection":"scripting","hash":"2bade49bf4a3a475b0176d70e802a339","indexed_by":"docs-index"}},{"content":"Ring dimensions — The return value\n\nThe method returns a `bool`: `True` when the command reported success, `False` when it failed. It fails when:\n\n- The licence check did not pass.\n- The document's objects could not be meshed at low resolution. The command shows a modal \"Unable to generate dimensions\" dialog first, which will block an unattended script.\n- The design type is `RING` but no parametric ring is present. The finger diameter is read from the first Cathedral, Classic, Signet, curve-driven or Advanced ring object found in the document; a ring modelled as plain breps carries no finger size, so the command returns failure with nothing added and no message on the command line. `DocumentApi`'s ring size reads the same parametric value — check it first if you are unsure.\n\nNote that the dimension-style change happens *before* those last two checks, so a `False` can still leave the style halved.\n\nWrap the call in a `Transaction` so all six annotations undo together.\n\n```python\nfrom ArtisanPlugin.Scripting import DraftingApi as drafting, Transaction\n\nwith Transaction.Begin(\"Ring dimensions\"):\n    if not drafting.GenerateDimensionsFromRing():\n        print(\"No parametric ring to dimension.\")\n```","metadata":{"title":"Ring dimensions","section":"The return value","url":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#the-return-value","source":"https://www.rhinoartisan.com/docs/scripting/reference/drafting/ring-dimensions/#the-return-value","collection":"scripting","hash":"7c7ee7edebacdba4e3da66e5ef8b8a12","indexed_by":"docs-index"}},{"content":"Elements\n\n```python\nfrom ArtisanPlugin.Scripting import ElementsApi as elements\n```\n\nAn element is a named preset that a panel saves with its *Save as element* button: a bezel called \"Chunky\", a basket called \"Client A\", or one of the factory presets such as `BA001` (baskets) and `BL001` (bails). Scripts can use elements in four ways:\n\n1. Build from one. Most creators take an `element=` argument.\n2. Apply one to an object that already exists, with `SetElement` on its handle.\n3. Save an object as a new element.\n4. Organize the library: rename, duplicate, mark favorites, delete, and export or import bundles.\n\nElements belong to the user's library, not to the document. Saving, renaming or deleting one changes that library and does not touch the 3dm file.","metadata":{"title":"Elements","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/","collection":"scripting","hash":"b7e1db10d3076d03945061c8555868cb","indexed_by":"docs-index"}},{"content":"Elements — Browsing the library\n\n| Method | Returns |\n|---|---|\n| `Types()` | The element types the library can hold: `Basket`, `Bail`, `Bezel`, `Classic`, `Halo`, `Peghead`, `SmartProfile`… |\n| `List(type)` | The saved elements of one type, each with `Id`, `Name`, `Type` and `Favorite` |\n| `Count(type)` | How many elements of that type are saved |\n| `Find(type, name)` | One element by name (case-insensitive). If the name doesn't match, the error lists every available name, so a script or an assistant can correct itself |\n| `GetParametersJson(type, name)` | The stored parameters, as JSON. Use it to inspect a preset; creators take the preset by name |\n\n```python\nfrom ArtisanPlugin.Scripting import ElementsApi as elements\n\nfor e in elements.List(\"Basket\"):\n    print((\"* \" if e.Favorite else \"  \") + e.Name)\n```","metadata":{"title":"Elements","section":"Browsing the library","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#browsing-the-library","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#browsing-the-library","collection":"scripting","hash":"c9ecf34c1c282c275ec8c230230956fe","indexed_by":"docs-index"}},{"content":"Elements — Build from a preset\n\nThe creators below accept `element` as their last argument:\n\n| Family | Creators |\n|---|---|\n| Shanks | `ClassicApi`, `CathedralApi`, `GraduatedApi`, `BypassApi`, `EternityApi`, `SplitShankApi`, `SignetRingApi`, `AdvancedCathedralApi`, `AdvancedRingApi`, `ClassRingApi`, `PaveShankBuilderApi`, `TwoRowsShankBuilderApi`, `MatchingShankBuilderApi`, `WeddingBuilderApi` (wedding band), `RingCurveApi` |\n| Gemsets | `BasketApi`, `AdvancedBasketApi`, `BezelApi`, `AdvancedBezelApi`, `HaloApi`, `ClusterApi`, `PegheadApi`, `TrilogyApi` |\n| Components | `BailApi`, `BangleApi`, `BeadApi`, `CharmApi`, `NamedPendantApi`, `SmartProfileApi` |\n\nThe preset replaces the creator's starting model, including your saved defaults. The creator then re-applies the call's own context (the mother gem, the ring size, the curve or the mother rings), and any argument you pass explicitly still overrides the preset:\n\n```python\nfrom ArtisanPlugin.Scripting import BasketApi as basket, Transaction\n\nwith Transaction.Begin(\"Basket from a preset\"):\n    b = basket.Create([gemId], element = \"Client A\", prongDiameter = 0.9)[0]\n```\n\nWhen you omit `element`, the creator behaves as it always did. Types without an `element` argument cannot be built from a preset: Huggie, Link, Trellis, Wedding Rings, Advanced Signet Ring and the legacy types.","metadata":{"title":"Elements","section":"Build from a preset","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#build-from-a-preset","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#build-from-a-preset","collection":"scripting","hash":"7ab26305841befe376e42b7866c8be99","indexed_by":"docs-index"}},{"content":"Elements — Apply a preset to an existing object\n\n25 handles have `SetElement(name)`: every shank and gemset handle that can be built from a preset, plus `IAdvancedSignetRing`, `ITrilogy`, `ISmartProfile` and `ISmartComponent` (bails, bangles…). The preset's parameters replace the object's current ones. The object keeps what belongs to it, such as its gem, every finger-size copy, its mother rings or its curve, and regenerates in place with the same id.\n\n```python\nfrom ArtisanPlugin.Scripting import HaloApi as halo, Transaction\n\nwith Transaction.Begin(\"Apply the Chunky halo\"):\n    for h in halo.Selected():\n        h.SetElement(\"Chunky\")\n```\n\nA trilogy picks the element type from its own style and keeps its gems. A named pendant keeps its text.","metadata":{"title":"Elements","section":"Apply a preset to an existing object","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#apply-a-preset-to-an-existing-object","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#apply-a-preset-to-an-existing-object","collection":"scripting","hash":"247096c591c342c7454540a69fd86f1c","indexed_by":"docs-index"}},{"content":"Elements — Save an object as a new element\n\n```python\ninfo = elements.SaveFromObject(objectId, \"Client B\")   # -> ElementInfo\n```\n\nThis is the panels' *Save as element* button. `objectId` can be the object itself or any member of a parametric group, so a bail, basket or halo can be saved from any of its pieces, and smart components without a typed handle can be saved too. The name must be new within its type. No preview image is stored.","metadata":{"title":"Elements","section":"Save an object as a new element","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#save-an-object-as-a-new-element","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#save-an-object-as-a-new-element","collection":"scripting","hash":"0163316a1749f932e381ebcb9390772e","indexed_by":"docs-index"}},{"content":"Elements — Organizing the library\n\nEach method picks the element by `type` and `name`, where `name` can also be `\"id: \"`. Names stay unique within a type.\n\n| Method | Does |\n|---|---|\n| `Rename(type, name, newName)` | Renames it |\n| `Duplicate(type, name, newName = None)` | Copies it. An empty `newName` gives `\" (Copy)\"`. The copy shares the original's preview |\n| `SetFavorite(type, name, favorite = True)` | Marks or unmarks it as a favorite. Favorites list first |\n| `Delete(type, name)` | Deletes it permanently |\n| `ExportBundle(type, name, filePath)` | Writes a `.zip` bundle with the parameters and preview, to share the element or move it to another machine. Returns the path |\n| `ImportBundle(filePath)` | Reads a bundle (from `ExportBundle` or the panels) into the library. Returns the imported element |\n\n`Delete` is permanent. Like the panel's delete, it does not go through a trash, and a `Transaction` does not undo it. Objects already built from the element are not affected.","metadata":{"title":"Elements","section":"Organizing the library","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#organizing-the-library","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#organizing-the-library","collection":"scripting","hash":"57841c0ac50e440db936cb848904ed47","indexed_by":"docs-index"}},{"content":"Elements — From the MCP\n\nAI assistants have the same features through MCP:\n\n- `list_elements` browses the library.\n- `element` is an argument of about 25 `create_*`/`add_*` tools.\n- `edit_object {\"element\": name}` applies a preset.\n- `save_element` stores an object as a new element.\n- `manage_elements` renames, duplicates, sets favorites, deletes, exports and imports.\n\nSee the tool reference.\n\nIn the Python package, this page corresponds to `ra.elements`.","metadata":{"title":"Elements","section":"From the MCP","url":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#from-the-mcp","source":"https://www.rhinoartisan.com/docs/scripting/reference/elements/#from-the-mcp","collection":"scripting","hash":"b3f45d3a408deac1a0043348d1da7e45","indexed_by":"docs-index"}},{"content":"File Search\n\n```python\nfrom ArtisanPlugin.Scripting import FileSearchApi as files\n```\n\nInstant search (`FileSearchApi`) over your indexed design files — the file-search tool's index, in RAM:\n\n```python\nhits = files.Search(\"solitaire oval\", max = 50)\nfiles.Count()            # files in the index\nfiles.Reindex()          # background rebuild; Reindex(full = True) forces a clean re-scan\n```\n\nMultiple words must all match, in any order; results rank exact-name, starts-with, contains. An empty query returns the most recently modified files.\n\nThis is the fastest way to start a headless flow: find the design, then open it and work on it.","metadata":{"title":"File Search","url":"https://www.rhinoartisan.com/docs/scripting/reference/file-search/","source":"https://www.rhinoartisan.com/docs/scripting/reference/file-search/","collection":"scripting","hash":"9dbd6ecd7565ca41aeb8dbbcaada856a","indexed_by":"docs-index"}},{"content":"Gems\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem, GemToolsApi as gemtools, Transaction\n```\n\nStones as first-class scriptable objects: create them, query them, mutate them through live handles — and group the whole script into one clean undo step. Each part has its own page.\n\nCreate Discover the valid shapes and materials, then place a stone.\n\nQueries Find stones by id, layer, material or selection — and collisions.\n\nThe gem handle A live view of one gem: read it, resize it, move it.\n\nGem tools The ribbon's gem utilities, headless.\n\nToi et Moi Two stones straddling the ring top.\n\nTransaction Group every mutation into one undo step.","metadata":{"title":"Gems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/","collection":"scripting","hash":"109abcb7eccd9bc592a3faeb53545b85","indexed_by":"docs-index"}},{"content":"Gems — Facades and handles\n\nGems are where the API's two shapes meet, and the distinction runs through the whole reference:\n\n- `GemApi` is a *facade* — a static entry point that discovers valid values, queries the document and creates stones.\n- `IGem` is a *handle* — a live view of one stone in the document, carrying its properties and its mutations. See The gem handle, or the full interface under Handles.\n\n`Create`, `Find`, `All` and friends all hand you handles, not raw Guids.","metadata":{"title":"Gems","section":"Facades and handles","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#facades-and-handles","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#facades-and-handles","collection":"scripting","hash":"4978bd5139d3b9378c38a63d80287eac","indexed_by":"docs-index"}},{"content":"Gems — Conventions\n\nMillimetres and carats. Shape and material strings come from `Shapes()` and `Materials()` — call them rather than guessing; parsing is case-insensitive and tolerates dashes and spaces.\n\nRead-only queries need nothing; every mutation belongs inside a `Transaction` so the whole script lands as one undo step.\n\nSettings built around a stone — bezels, pegheads, halos, and the rest — live under Gemsets. Subtracting the seats from the metal at the end is Booleans.","metadata":{"title":"Gems","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#conventions","collection":"scripting","hash":"a079eaa75b74dc702f50b743cde17afa","indexed_by":"docs-index"}},{"content":"Gems — Not scriptable yet\n\n| Tool | Why |\n|---|---|\n| Three Stones / Trilogy | The trilogy composer (three stones with their settings) is UI-only — no scripting surface yet |\n| Trilogy bezel set | Same: panel-only for now |\n\nTo build a three-stone composition from a script today, compose it yourself: create the three gems on their planes, then wrap each in its setting.","metadata":{"title":"Gems","section":"Not scriptable yet","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#not-scriptable-yet","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/#not-scriptable-yet","collection":"scripting","hash":"4eff9f93036adda1e169d7712f3ea366","indexed_by":"docs-index"}},{"content":"Create\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem\n```\n\n`Create` is how a script puts a stone into the document. You give it a cut, a compound, a carat weight and a plane; it builds the same proportioned, faceted gem the ribbon's QuickGems places by hand, and hands you a handle to it.\n\nShapes and materials are named by string, so the honest way to write a script is to ask the API which strings exist before you use one.","metadata":{"title":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/","collection":"scripting","hash":"54f04bdce5b1af4601044f64997aed63","indexed_by":"docs-index"}},{"content":"Create — Discovery\n\n```python\ngem.Shapes()      # -> [\"ROUND\", \"PRINCESS\", \"MARQUISE\", \"EMERALD\", ...]\ngem.Materials()   # -> [\"DIAMOND\", \"RUBY\", \"SAPPHIRE\", ...]\n```\n\nBoth are read-only, need no `Transaction` and are not gated on the licence — an unlicensed user can still inspect what the plugin supports. `Shapes()` returns the names of the `GemShape` enumeration and `Materials()` the names of `GemCompound`, which are exactly the sets `Create` parses against. Call them and pick from the result rather than guessing a cut name; the list is the source of truth and it grows with the plugin.\n\nThe discovery-then-create loop is the whole idiom:\n\n```python\nshapes = gem.Shapes()\nif \"PEAR\" in shapes:\n    g = gem.Create(\"PEAR\", \"Diamond\", 0.75, Plane.WorldXY)\n```\n\nOr, to build one stone of every cut on a row:\n\n```python\nfrom Rhino.Geometry import Plane, Point3d\nfrom ArtisanPlugin.Scripting import Transaction\n\nwith Transaction.Begin(\"Shape sampler\"):\n    for i, shape in enumerate(gem.Shapes()):\n        plane = Plane(Point3d(i * 8.0, 0, 0), Plane.WorldXY.ZAxis)\n        gem.Create(shape, \"Diamond\", 0.50, plane)\n```","metadata":{"title":"Create","section":"Discovery","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#discovery","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#discovery","collection":"scripting","hash":"a5757206b71a2418d23041bf958c1d9a","indexed_by":"docs-index"}},{"content":"Create — Usage\n\n```python\ng = gem.Create(shape, material, caratWeight, plane)   # -> an IGem handle\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `shape` | — | A cut name from `Shapes()`, e.g. `\"ROUND\"`, `\"PRINCESS\"`, `\"MARQUISE\"`, `\"EMERALD\"` |\n| `material` | — | A compound name from `Materials()`, e.g. `\"Diamond\"`, `\"Ruby\"`, `\"Sapphire\"` |\n| `caratWeight` | — | Carats; must be greater than 0. Drives the stone's millimetre size through the proportion tables |\n| `plane` | — | A `Rhino.Geometry.Plane` giving both position and orientation. `Plane.WorldXY` means \"at the origin, table up\" |\n\nThere are no optional arguments: all four are required, and `plane` is a full plane rather than a point, so the stone arrives already oriented.","metadata":{"title":"Create","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#usage","collection":"scripting","hash":"76f51d762ee3d94f8ccd54652c94195b","indexed_by":"docs-index"}},{"content":"Create — How the strings are parsed\n\nBoth `shape` and `material` go through the same normalisation before they are matched against the enumeration: the string is trimmed, then every dash and every space becomes an underscore, and the comparison itself is case-insensitive. So `\"rose gold\"`, `\"rose-gold\"`, `\"Rose_Gold\"` and `\"ROSE_GOLD\"` all resolve to the same compound, and `\"round\"` is as good as `\"ROUND\"`. This is the same convention `SetMaterial` uses on the handle, so the two surfaces stay consistent. What normalisation does *not* do is guess: an unknown name is an error, never a silent fallback to diamond.","metadata":{"title":"Create","section":"How the strings are parsed","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#how-the-strings-are-parsed","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#how-the-strings-are-parsed","collection":"scripting","hash":"8f5c2f0633186b91cedd383c0bc67654","indexed_by":"docs-index"}},{"content":"Create — What it returns\n\nAn `IGem` handle, not a Guid. The handle is a live view of the stone — read `Shape`, `Material`, `CaratWeight`, `SizeX`/`SizeY`/`SizeZ`, `Position`, `Plane` and `LayerName` from it, and mutate the stone through `Move`, `Rotate`, `SetCaratWeight`, `Copy`, `Delete` and the rest. It re-resolves the object from the document on every access rather than caching it, so it stays correct as the document changes. See the gem handle for the full surface. The Guid is still there if you need it, as `g.Id`.","metadata":{"title":"Create","section":"What it returns","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#what-it-returns","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#what-it-returns","collection":"scripting","hash":"a3cc3d6010790ca7b73572c41c9cc5ff","indexed_by":"docs-index"}},{"content":"Create — Where the stone lands\n\nThe new gem is added to the active document as a proper Artisan gemstone object, its gemstone material is applied, and it is placed on the primary gems layer — not on the current layer, and not on whatever layer the script was working with. (`Copy()` on the handle behaves differently: a copy stays on the source gem's layer.) The result is indistinguishable from a stone the user placed through the ribbon, and downstream tools — settings, cutters, reports, collision checks — treat it as such.\n\n`caratWeight` is not a label attached to the stone: it is the input to the same proportion table QuickGems uses, which turns carats plus cut plus compound into the X, Y and Z millimetre dimensions the mesh is generated at. Change the carats later with `SetCaratWeight` and the stone is rebuilt at the new proportions, keeping its plane, layer and material.","metadata":{"title":"Create","section":"Where the stone lands","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#where-the-stone-lands","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#where-the-stone-lands","collection":"scripting","hash":"fd2e76dc9a0981dd61e7eff1aef00224","indexed_by":"docs-index"}},{"content":"Create — Errors\n\n`Create` mutates the document, so it requires a valid licence: it raises `ScriptingNotLicensedException` before doing anything otherwise. Beyond that it validates every argument and throws rather than approximating:\n\n- no open document — *\"No active document.\"*\n- an unrecognised cut — *\"Unknown gem shape 'X'.\"*\n- an unrecognised compound — *\"Unknown gem material 'X'.\"*\n- a zero or negative weight — *\"Carat weight must be > 0.\"*\n\nBecause `Create` writes to the document, wrap runs of them in a `Transaction` so the whole script collapses into one undo step.","metadata":{"title":"Create","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/create/#errors","collection":"scripting","hash":"e6b1264a2c5f609364a18434b89f5447","indexed_by":"docs-index"}},{"content":"Gem tools\n\n```python\nfrom ArtisanPlugin.Scripting import GemToolsApi as gemtools, Transaction\n```\n\nThe gem utility commands of the ribbon - the ones that are not gem creators - exposed as twelve headless methods. All lengths are millimetres in a mm document. Every method that writes to the document checks the licence first and ends with a viewport redraw; wrap those in a `Transaction` so the whole script undoes in one step. `Centers` is the only read-only method here and needs no transaction.","metadata":{"title":"Gem tools","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/","collection":"scripting","hash":"a3397f0440803b3007053c2daafdeb9b","indexed_by":"docs-index"}},{"content":"Gem tools — Usage\n\n```python\nids = [g.Id for g in gem.Selected()]\n\npts = gemtools.Centers(ids)                       # read-only\n\nwith Transaction.Begin(\"Prong guides and tags\"):\n    gemtools.CenterBetweenGems(ids)\n    gemtools.AddTags(ids)\n```\n\nHow gemIds resolves\nThe rule is not uniform, and it is worth getting right.\n\n1. If you pass ids, each one is validated: a non-gem id throws `ArgumentException` naming it - *Object … is not an Artisan diamond or gemstone.* Duplicates are dropped, and the selection is never consulted.\n2. If `gemIds` is `None` or empty, the gems currently selected in the viewport are used.\n3. Only three methods - `CenterBetweenGems`, `ColorBySize` and `AddTags` - additionally fall back to every gem in the document when the selection contains none, matching the commands that accept Enter with nothing selected. `Centers`, `AddCenterPoints`, `CurveFromGems`, `ExtractGemCurves`, `OffsetGemCurves`, `RotateGems` and `AlignGems` do not: with nothing selected they throw *No gems to work on: select (or pass) at least one Artisan diamond or gemstone.*\n\n`CopyByGems` uses its own rules (see below), and `RecoverGems` takes no ids at all - it always scans the whole document.","metadata":{"title":"Gem tools","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#usage","collection":"scripting","hash":"bffba45caf60f0e89628de424d1c3463","indexed_by":"docs-index"}},{"content":"Gem tools — Centers\n\n```python\ngemtools.Centers(gemIds = None)   # -> list of Point3d\n```\n\nThe centre of each gem - its plane origin, which sits on the girdle. Read-only: nothing is added to the document, no licence is needed, no transaction required. The points come back in the same order as `gemIds`, or in selection order when it is `None`. Gems whose plane cannot be read are skipped, so the result can be shorter than the input.\n\nSelection fallback only; no document-wide fallback.","metadata":{"title":"Gem tools","section":"Centers","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#centers","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#centers","collection":"scripting","hash":"eef73d450d5a37419652fbea3adf7ac6","indexed_by":"docs-index"}},{"content":"Gem tools — AddCenterPoints\n\n```python\ngemtools.AddCenterPoints(gemIds = None)   # -> list of Guid\n```\n\n`ArtisanGemsCenter`, headless: adds a point object at the centre of each gem - the anchors you snap prongs, cutters or a rail curve to. Returns the ids of the created points. Mutates the document.\n\nSelection fallback only.\n\nCenterBetweenGems\n```python\ngemtools.CenterBetweenGems(gemIds = None)   # -> list of Guid\n```\n\n`ArtisanCenterBetweenGems`, headless: for every triple of mutually adjacent stones it fits the circle tangent to the three girdle circles and adds it - the classic shared-prong guide. Adjacency is a cheap distance test (centres closer than the sum of the two diameters), and clearly scalene triples are rejected unless the stones are large enough to still touch a common prong. Duplicate results within 0.001 mm are collapsed, and stacked gems sharing a plane count once.\n\nAll the circles created in one call are put in a single group, so one click picks up the whole guide set. Returns the ids of the created circles - possibly empty, when no triple qualifies. Mutates the document.\n\nFalls back to the selection, then to every gem in the document.","metadata":{"title":"Gem tools","section":"AddCenterPoints","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#addcenterpoints","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#addcenterpoints","collection":"scripting","hash":"bb11e1fc6eecb38f936001b7d882e025","indexed_by":"docs-index"}},{"content":"Gem tools — CurveFromGems\n\n```python\ngemtools.CurveFromGems(gemIds = None)   # -> Guid\n```\n\n`ArtisanCurveFromGems`, headless: interpolates a degree-3 curve through the gem centres and adds it to the document. Returns the id of the single created curve. Mutates the document.\n\nThe curve follows the LIST ORDER of `gemIds` - exactly as the pick order does in the command. The order is the shape of the curve. Sort the ids the way the curve should flow, or you will get a zig-zag through the pavé.\n\nConsecutive coincident centres (stacked duplicates) are skipped so the interpolation does not fail. At least two distinct centres are required, otherwise *At least two gems with distinct centres are required to create a curve.* If the interpolation itself fails you get *It is not possible to create a curve through those gem centers.*\n\nSelection fallback only.","metadata":{"title":"Gem tools","section":"CurveFromGems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#curvefromgems","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#curvefromgems","collection":"scripting","hash":"577536ec726d6ba9a1f0aa1658d28276","indexed_by":"docs-index"}},{"content":"Gem tools — ExtractGemCurves\n\n```python\ngemtools.ExtractGemCurves(gemIds = None)   # -> list of Guid\n```\n\n`ArtisanGemsCurve`, headless: duplicates the girdle curve of each gem as a plain document curve - the profile you sweep, loft or cut against. Works on all five Artisan gem object types. Returns the ids of the created curves; gems whose curve cannot be read are skipped. Mutates the document.\n\nSelection fallback only.","metadata":{"title":"Gem tools","section":"ExtractGemCurves","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#extractgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#extractgemcurves","collection":"scripting","hash":"b1779c02b43a16853b31bd44611dc43e","indexed_by":"docs-index"}},{"content":"Gem tools — OffsetGemCurves\n\n```python\ngemtools.OffsetGemCurves(gemIds = None, distance = 1.0)   # -> list of Guid\n```\n\n`ArtisanGemOffset`, headless: offsets each gem's girdle curve outward by `distance` mm and adds the result as a parametric gem-offset object. The offset direction is normalised against the gem's own plane, so the girdle curve's own direction does not matter.\n\nEach curve is added with a history record pointing at the gem-offset command, exactly as the ribbon button does, so the offset curve follows its gem when the gem is moved, rotated or resized. If the plugin's gem-offset command is not available in the session, the call fails with *The gem-offset command is not available in this Rhino session.*\n\nA `distance` smaller than the document's absolute tolerance adds the girdle curve unchanged - the same as answering 0 in the command. Gems whose offset fails (a self-intersecting result, or an offset that yields more than one curve) are skipped, as in the command. Returns the ids of the created curves. Mutates the document.\n\nSelection fallback only.","metadata":{"title":"Gem tools","section":"OffsetGemCurves","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#offsetgemcurves","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#offsetgemcurves","collection":"scripting","hash":"50abad237faa56a052c6c39024f2ed6e","indexed_by":"docs-index"}},{"content":"Gem tools — CopyByGems\n\n```python\ngemtools.CopyByGems(objectIds, targetGemIds,\n                    originGemId = Guid.Empty, scale = \"No\")   # -> list of Guid\n```\n\n`ArtisanCopyByGems`, headless: takes a prong, a cutter, a bezel - whatever you have modelled around one stone - and copies it onto every gem in `targetGemIds`, mapping from the origin gem's plane to each target gem's plane. The copies are made with `TransformWithHistory`, so they stay linked to the original just as the command's do, and the parametric engine is told to reconcile and invalidate the children of the target gems afterwards.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | The objects to copy. `None` or empty means the current selection (any objects, not only gems); if that is empty too: *Nothing to copy: select (or pass) at least one object.* |\n| `targetGemIds` | - | The gems to copy onto. No fallback: each id must be an Artisan diamond or gemstone, and at least one is required - *At least one target gem is required.* |\n| `originGemId` | `Guid.Empty` | The gem the objects were modelled around. `Guid.Empty` means they are modelled on the world XY plane - the command's \"Enter = CPlane\" answer |\n| `scale` | `\"No\"` | Case-insensitive: `\"No\"` copies as-is; `\"2D\"` scales X and Y by *targetGemSizeX / originGemSizeX*; `\"3D\"` scales X, Y and Z by that same factor. Anything else throws *Unknown scale mode 'xxx'. Valid values: No, 2D, 3D.* |\n\nWith `originGemId = Guid.Empty` the origin size is taken as 1, so `\"2D\"` and `\"3D\"` scale by the target's X size in millimetres - meaningful only if the objects were modelled around a 1 mm reference.\n\nReturns the ids of the created copies, targets times objects. Mutates the document.","metadata":{"title":"Gem tools","section":"CopyByGems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#copybygems","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#copybygems","collection":"scripting","hash":"4071d5ca3b6e1cb56981d0faf39e6435","indexed_by":"docs-index"}},{"content":"Gem tools — ColorBySize\n\n```python\ngemtools.ColorBySize(gemIds = None)   # -> int\n```\n\n`ArtisanGemsColorBySize`, headless: gives every gem a per-size display colour so that equal stones read at a glance across a pavé. Sizes are grouped by X dimension rounded to 1e-3 mm, so float noise does not split one size into two colours, and the palette is stable: colour 0 is always the smallest size. Returns the number of gems recoloured. Mutates the document (object colour set to *from object*).\n\nFalls back to the selection, then to every gem in the document.","metadata":{"title":"Gem tools","section":"ColorBySize","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#colorbysize","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#colorbysize","collection":"scripting","hash":"34af2ede94b0484394e36987a20361c2","indexed_by":"docs-index"}},{"content":"Gem tools — RotateGems\n\n```python\ngemtools.RotateGems(gemIds = None, angleDegrees = 90)   # -> int\n```\n\nThe document effect of the `ArtisanGemsOrientation` handles, and of `ArtisanRotateGemsLeft` / `Right`, headless: rotates each gem around its own plane normal, in place. Positive is counter-clockwise; each click of the orientation gumball is +90, which is the default. Pass a negative angle to rotate clockwise. Squares and baguettes in a channel are the usual case.\n\nReturns the number of gems rotated. Mutates the document.\n\nSelection fallback only.","metadata":{"title":"Gem tools","section":"RotateGems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#rotategems","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#rotategems","collection":"scripting","hash":"a6f7403821688f4d35adba61b2b9447c","indexed_by":"docs-index"}},{"content":"Gem tools — AddTags\n\n```python\ngemtools.AddTags(gemIds = None)   # -> list of Guid\n```\n\n`ArtisanGemTags`, headless: places a three-line text entity on the top face (table) of each gem - measures as `X x Y` in mm, then carat weight, then material with underscores turned into spaces. The text plane is lifted from the girdle to the table by measuring the gem's bounding box in its own plane, and the text height is scaled to the stone at 18% of its largest side, so tags stay legible on a 1 mm melee and on a 10 mm centre alike. The tags land on the primary user layer.\n\nReturns the ids of the created text entities. Mutates the document.\n\nFalls back to the selection, then to every gem in the document.","metadata":{"title":"Gem tools","section":"AddTags","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#addtags","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#addtags","collection":"scripting","hash":"2e79e67873fbbc1b73ecd69abd14526a","indexed_by":"docs-index"}},{"content":"Gem tools — RecoverGems\n\n```python\ngemtools.RecoverGems()   # -> int\n```\n\n`ArtisanGemsRecover`, headless, and the one method with no parameters at all: it always scans the whole document. Dumb gem geometry exported by Matrix, MatrixGold, RhinoGold or an older RhinoArtisan is recognised by its exact mesh or brep topology and replaced with a parametric Artisan gemstone of the measured shape and size - after which the stone answers to `GemApi` and to every tool on this page.\n\nThe underlying command runs without prompts, so it is invoked directly; the recovery is therefore byte-identical to the ribbon button and picks up new fingerprints automatically. Returns the number of gems recovered - 0 means nothing recognisable was found. Mutates the document.","metadata":{"title":"Gem tools","section":"RecoverGems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#recovergems","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#recovergems","collection":"scripting","hash":"cf5613c907a00521cfadbeba83beab7e","indexed_by":"docs-index"}},{"content":"Gem tools — AlignGems\n\n```python\ngemtools.AlignGems(targetIds, gemIds = None,\n                   flip = False, adaptToSurface = False, alignTop = False)   # -> int\n```\n\n`ArtisanAlignGems`, headless: drops each gem onto the target objects. A ray is shot from the gem's centre along its own axis, +Z first and then -Z, so a stone that already sits past the surface still lands on it, and the gem is translated to the hit point. The targets are meshed together as one high-resolution mesh, like the command.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `targetIds` | - | The surfaces, polysurfaces or meshes to land on. Required, no fallback: empty throws *At least one target object is required.*, a missing id throws *Target object … does not exist.*, and geometry that meshes to nothing throws *The target objects produced no surface to align on: pass surfaces, polysurfaces or meshes.* |\n| `gemIds` | `None` | The gems to move. Selection fallback only - no document-wide fallback |\n| `flip` | `False` | Turn the gem upside down at the landing point (the command's Flip toggle, No by default) |\n| `adaptToSurface` | `False` | Orient the gem's axis to the surface normal at the landing point (the command's Orientation toggle, Keep by default) |\n| `alignTop` | `False` | Sink the gem along its axis by its own height above the girdle, so the table sits on the surface instead of the girdle (the command's Alignment toggle, On Girdle by default) |\n\nThe height above the girdle is measured before any move, so `alignTop` sinks the stone by exactly the right amount whatever the earlier toggles did. Gems whose axis never hits the targets are skipped, as in the command. Positions change in place - the gems keep their Guids.\n\nReturns the number of gems aligned. Mutates the document.","metadata":{"title":"Gem tools","section":"AlignGems","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#aligngems","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#aligngems","collection":"scripting","hash":"b21ffb0e5cd58e3754a5e3e49249820d","indexed_by":"docs-index"}},{"content":"Gem tools — At a glance\n\n| Method | Returns | Writes | `gemIds` fallback |\n|---|---|---|---|\n| `Centers` | `Point3d` list | no | selection |\n| `AddCenterPoints` | `Guid` list | yes | selection |\n| `CenterBetweenGems` | `Guid` list | yes | selection, then all gems |\n| `CurveFromGems` | single `Guid` | yes | selection (list order matters) |\n| `ExtractGemCurves` | `Guid` list | yes | selection |\n| `OffsetGemCurves` | `Guid` list | yes | selection |\n| `CopyByGems` | `Guid` list | yes | targets required; objects fall back to selection |\n| `ColorBySize` | `int` count | yes | selection, then all gems |\n| `RotateGems` | `int` count | yes | selection |\n| `AddTags` | `Guid` list | yes | selection, then all gems |\n| `RecoverGems` | `int` count | yes | none - whole document |\n| `AlignGems` | `int` count | yes | targets required; gems fall back to selection |","metadata":{"title":"Gem tools","section":"At a glance","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#at-a-glance","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/gem-tools/#at-a-glance","collection":"scripting","hash":"49b5a0a9f47229bb49bb6059d634875d","indexed_by":"docs-index"}},{"content":"Queries\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem\n```\n\nBefore a script changes anything it usually has to find something: every stone in the piece, the ones the user just selected, the ones on the pavé layer, the ones that overlap. These are the methods that answer those questions.\n\nThey are all read-only. None of them touches the document, so none of them needs a `Transaction`, and none of them is gated on the licence — an unlicensed user can still count and inspect the stones in their own file. Every method that returns a list returns a real list, never `None`: an empty document, an unknown layer or a material nobody used simply gives you an empty list, so `for g in gem.ByLayer(...)` is always safe. The single exception is `Find`, which returns one gem or `None`.\n\nEvery gem comes back as an `IGem` handle — see the gem handle for what you can read and change through it.","metadata":{"title":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/","collection":"scripting","hash":"8718af034406c9897bed4fdcac3d2440","indexed_by":"docs-index"}},{"content":"Queries — All and Count\n\n```python\ngems = gem.All()     # -> list of IGem\nn    = gem.Count()   # -> int\n```\n\n`All()` walks every object in the active document and returns a handle for each one that is an Artisan gemstone. Order follows the document's own object order, which is roughly creation order, but do not rely on it as a stable sort — sort explicitly if order matters.\n\n`Count()` is exactly `len(All())`; it does the same walk, so if you need both the number and the stones, call `All()` once and take its length rather than calling both.\n\nOnly Artisan gemstones are counted. A mesh imported from elsewhere that merely looks like a stone is invisible to these queries until it has been recovered into a real gem.","metadata":{"title":"Queries","section":"All and Count","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#all-and-count","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#all-and-count","collection":"scripting","hash":"4977601b111041a118b523fb12517106","indexed_by":"docs-index"}},{"content":"Queries — Find\n\n```python\ng = gem.Find(id)   # -> IGem, or None\n```\n\nTakes a `System.Guid` and returns a handle to that gem. It returns `None` in two cases: nothing in the document has that id, or the object with that id exists but is not a gem. That makes `Find` the natural bridge from any API that hands you raw ids — `ToiEtMoiApi.Create`, the gemset facades, Rhino's own selection APIs — into the gem handle surface:\n\n```python\nfor id in ids:\n    g = gem.Find(id)\n    if g is not None:\n        g.SetMaterial(\"Ruby\")\n```\n\nNote that `Find` does not itself throw for a stale id — it just gives you `None`. A handle you already hold is stricter: once its gem has been deleted, using it raises *\"Gem … no longer exists in the document.\"*","metadata":{"title":"Queries","section":"Find","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#find","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#find","collection":"scripting","hash":"8b6b77b5b9fb1fda35da66634f6f8a04","indexed_by":"docs-index"}},{"content":"Queries — Selected\n\n```python\nsel = gem.Selected()   # -> list of IGem\n```\n\nThe gems currently selected in the viewport, in document order. Non-gem objects in the selection are ignored, so a selection of a shank, two cutters and three stones gives you three handles. Nothing selected — or a selection with no stones in it — gives an empty list, which is the usual cue for a script to fall back to `All()`:\n\n```python\ntargets = gem.Selected() or gem.All()\n```\n\nSelection is a viewport state, not a document mutation. Reading it costs nothing, and the matching `Select(on)` on the handle lets a script finish by highlighting what it produced.","metadata":{"title":"Queries","section":"Selected","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#selected","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#selected","collection":"scripting","hash":"8a0b812c00b83b5835f74177f5dd8e78","indexed_by":"docs-index"}},{"content":"Queries — ByLayer and ByMaterial\n\n```python\ngem.ByLayer(\"Gems::Pave\")     # -> list of IGem\ngem.ByMaterial(\"Ruby\")        # -> list of IGem\n```\n\n`ByLayer` matches on the layer's full path, not its short name: a layer nested under `Gems` is `\"Gems::Pave\"`, with Rhino's `::` separator. The lookup is exact — an unknown path, or a blank string, returns an empty list rather than throwing, so a script that queries a layer the document does not have simply does nothing.\n\n`ByMaterial` filters `All()` by the gem's compound name. The comparison is case-insensitive, so `\"ruby\"` and `\"RUBY\"` both work — but unlike `Create`, it performs no dash or space normalisation. The name must otherwise match the compound exactly as `Materials()` spells it, which matters for two-word compounds: pass the underscored form, not `\"rose gold\"`. A blank string returns an empty list.","metadata":{"title":"Queries","section":"ByLayer and ByMaterial","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#bylayer-and-bymaterial","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#bylayer-and-bymaterial","collection":"scripting","hash":"e7bd8b77bf5ad0617b119e88afd0bfb7","indexed_by":"docs-index"}},{"content":"Queries — Collisions\n\n```python\nfor a, b in gem.Collisions():\n    a.Select(True)\n    b.Select(True)\n```\n\n`Collisions()` returns every pair of gems whose meshes intersect. A pair is a two-element list of handles, `[gemA, gemB]`, and each unordered pair appears exactly once — you will never get both `[a, b]` and `[b, a]`, and a gem is never paired with itself. A stone that overlaps three neighbours therefore appears in three separate pairs. An empty result means no two stones in the document touch.\n\nThe test is the same one the gems-collision command uses, run over every Artisan gemstone in the document. For each candidate pair it first compares the two meshes' bounding boxes and skips the pair outright if those boxes do not overlap; only pairs that survive that cheap rejection go through Rhino's fast mesh-mesh intersection, and the pair is reported if that intersection produces any polylines at all. So it is a genuine mesh intersection test, not a bounding-box approximation and not a distance threshold: two stones whose girdles are a hair apart do not collide, and two that share any volume do.\n\nGems whose mesh geometry is missing or invalid are skipped rather than reported. Because it is purely a read, `Collisions()` is safe to call in a loop while tuning a layout, and needs neither transaction nor licence.","metadata":{"title":"Queries","section":"Collisions","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#collisions","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/queries/#collisions","collection":"scripting","hash":"ee4512f1d01a42eca89ca0fa92e444d7","indexed_by":"docs-index"}},{"content":"The gem handle\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\n```\n\nEverything `GemApi.Create`, `Find`, `All`, `Selected`, `ByLayer` and `ByMaterial` hand back is an `IGem`. A handle is not a copy of the stone: it holds nothing but the object's Guid and re-reads the document every time you touch it, so it always tells you the truth about the gem as it stands right now.","metadata":{"title":"The gem handle","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/","collection":"scripting","hash":"aa780980065ed13fa0d798727b25510c","indexed_by":"docs-index"}},{"content":"The gem handle — Usage\n\n```python\ng = gem.Selected()[0]\nprint(g.Shape, g.Material, g.CaratWeight, g.SizeX, g.LayerName)\n\nwith Transaction.Begin(\"Enlarge the centre stone\"):\n    g.SetCaratWeight(1.25)\n    g.Rotate(45)\n```\n\nRead-only properties\nNo licence check, no undo record, no transaction needed.\n\n| Member | Meaning |\n|---|---|\n| `Id` | The Rhino object Guid backing the handle |\n| `Shape` | Cut name, e.g. `ROUND`, `PRINCESS`, `MARQUISE` |\n| `Material` | Compound name, e.g. `Diamond`, `Ruby` |\n| `CaratWeight` | Weight in carats |\n| `SizeX` / `SizeY` / `SizeZ` | Dimensions in mm |\n| `Position` | Origin of the gem's plane, on the girdle |\n| `Plane` | The gem's full placement plane - origin and orientation |\n| `LayerName` | Full path of the layer the gem sits on |\n\n`Position` and `Plane` report the gem's *live* plane, kept in the object's user dictionary and updated on every transform. Only if that entry is missing do they fall back to the plane captured when the gem was created.","metadata":{"title":"The gem handle","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#usage","collection":"scripting","hash":"391dcb40d1e6d78a46631d40d7e9242b","indexed_by":"docs-index"}},{"content":"The gem handle — Mutations\n\nEach one calls `LicenseGate.RequireValid()` before touching the document and ends with a viewport redraw. All of them belong inside a `Transaction` if you want the script to undo as a single step.\n\n| Member | Meaning |\n|---|---|\n| `SetMaterial(materialName)` | Change the compound; the display material is reapplied |\n| `SetShape(shape)` | Change the cut (`\"OVAL\"`, `\"PEAR\"`…), keeping carat weight, material, plane and layer |\n| `SetCaratWeight(caratWeight)` | Resize by carat, keeping shape, material, plane and layer |\n| `SetSize(sizeX, sizeY, sizeZ)` | Resize to explicit mm dimensions |\n| `Scale(factor)` | Uniform scale of the current size (`factor > 0`) |\n| `Move(translation)` | Translate by a `Vector3d` |\n| `SetPlane(plane)` | Re-place the gem: move *and* orient so its plane coincides with `plane` |\n| `Rotate(degrees)` | Spin around the gem's own Z axis through its plane origin; positive is counter-clockwise |\n| `Flip()` | Turn upside down - 180 degrees around its own X axis, in place |\n| `Copy()` / `Copy(translation)` | Duplicate in place or displaced; returns the new gem's handle |\n| `Delete()` | Remove the gem from the document |\n\n`Select(on)` toggles the gem's selection in the viewport and redraws. It is *not* a document mutation: no undo record, no licence gate. Use it to highlight what a script produced.","metadata":{"title":"The gem handle","section":"Mutations","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#mutations","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#mutations","collection":"scripting","hash":"869a57abd6deca6c3bf0651d375bf288","indexed_by":"docs-index"}},{"content":"The gem handle — Handle semantics\n\nGuids are stable across every mutation but `Copy`. `Move`, `SetPlane`, `Rotate` and `Flip` transform the object in place with `deleteOriginal: true`, which preserves the Guid. `SetMaterial` only edits attributes. `SetShape` and the three resizers - `SetCaratWeight`, `SetSize` and `Scale` - regenerate the gem mesh at the new proportions and swap it in with `Replace` rather than add-and-delete, deliberately so the object keeps its Guid and its attributes (layer, material, name). A handle you took before a resize is still valid afterwards, and the settings built on the gem (prongs, bezel, basket, halo, cutters…) are rebuilt around the new cut or size. Never delete a gem and add a new one to change it: its settings would lose their mother. For \"a 1.5 ct oval\", call `SetShape(\"OVAL\")` then `SetCaratWeight(1.5)`. Only `Copy` produces a new object, and it hands you a fresh handle to it; the source handle is untouched.\n\nHandles are live, never cached. Neither the Rhino object nor the underlying gem is held on to: every property read and every mutation resolves the Guid against the active document first. Two handles to the same gem therefore always agree, and a handle picks up changes made by other scripts, by commands or by the user in between calls.\n\nTouching a deleted gem throws. Once the object is gone - or was never an Artisan gemstone - resolving fails with an `InvalidOperationException`:\n\n> Gem 4a1f… no longer exists in the document.\n\nThat applies to reads as much as to mutations, so a stale handle fails loudly rather than silently doing nothing. `Delete()` does not invalidate the variable in Python; it invalidates the object, and the next access raises.","metadata":{"title":"The gem handle","section":"Handle semantics","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#handle-semantics","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#handle-semantics","collection":"scripting","hash":"72b0a238bce56d2464b1d65f55ec556d","indexed_by":"docs-index"}},{"content":"The gem handle — Handle semantics\n\n`Copy` keeps the source's layer; `Create` does not. A copy is rebuilt through the same generator as a new gem, then explicitly moved onto the source gem's layer, so duplicating a stone that lives on a custom layer keeps it there. `GemApi.Create`, by contrast, always drops new gems on the primary gems layer. `Copy` also carries over shape, material, size and orientation, and reapplies the gemstone material.\n\nValidation happens before anything is written. Arguments are checked first, so a rejected call leaves the document untouched:\n\n| Call | Rejected when | Message |\n|---|---|---|\n| `SetMaterial(name)` | Empty or whitespace | *Material name is required.* |\n| `SetMaterial(name)` | Not a known compound | *Unknown gem material 'xxx'.* |\n| `SetShape(shape)` | Empty or not a known cut | *Unknown gem shape 'xxx'. Shapes: ROUND, PRINCESS, …* |\n| `SetCaratWeight(ct)` | `ct 0.* |\n| `SetSize(x, y, z)` | Any dimension ` 0.* |\n| `Scale(factor)` | `factor 0.* |\n| `SetPlane(plane)` | Plane is not valid | *Target plane is not valid.* |\n\nMaterial names are normalised before parsing: trimmed, with dashes and spaces turned into underscores, matched case-insensitively. `\"pink sapphire\"`, `\"Pink-Sapphire\"` and `\"PINK_SAPPHIRE\"` all reach the same compound. Use `GemApi.Materials()` when in doubt.\n\nTwo further failures come from the document rather than from your arguments: *No active document.* when there is no open `RhinoDoc`, and *Failed to replace gem … while resizing.* if the rebuild cannot be swapped in.\n\nThe complete interface, member by member, is on the IGem page.","metadata":{"title":"The gem handle","section":"Handle semantics","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#handle-semantics","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/the-gem-handle/#handle-semantics","collection":"scripting","hash":"52e06c0fc329ba2d1a3236e95c8f6611","indexed_by":"docs-index"}},{"content":"Toi et Moi\n\n```python\nfrom ArtisanPlugin.Scripting import ToiEtMoiApi as toietmoi\n```\n\nA Toi et Moi is a ring top carrying two independent stones rather than one centre: they sit either side of the finger's top, each leaning outwards, so the pair reads as two separate gems in conversation rather than a cluster. The classic versions mix cuts — pear with round, oval with emerald — and often mix compounds too.\n\nThis is the `ArtisanToiEtMoi` tool run headless: the same model, the same validation and the same builder the panel's preview and Accept use.","metadata":{"title":"Toi et Moi","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/","collection":"scripting","hash":"106b07da90d631718ed819c6dc719c90","indexed_by":"docs-index"}},{"content":"Toi et Moi — Usage\n\n```python\nids = toietmoi.Create(\"PEAR\", 0.75, \"ROUND\", 0.75)\n```\n\n```python\nids = toietmoi.Create(shapeA, caratsA, shapeB, caratsB,\n                      materialA, materialB,\n                      angleA, angleB,\n                      rotationYA, rotationYB,\n                      distance, fingerDiameter)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `shapeA` | — | Cut of the first stone, a `GemShape` name from `GemApi.Shapes()` |\n| `caratsA` | — | Carats of the first stone; must be greater than 0 |\n| `shapeB` | — | Cut of the second stone |\n| `caratsB` | — | Carats of the second stone; must be greater than 0 |\n| `materialA` | `\"Diamond\"` | Compound of the first stone, from `GemApi.Materials()` |\n| `materialB` | `\"Diamond\"` | Compound of the second stone |\n| `angleA` | `14` | Degrees the first stone is carried around the finger from the top |\n| `angleB` | `-14` | Same for the second stone — the negative mirrors it to the other side |\n| `rotationYA` | `20` | Degrees the first stone leans outwards |\n| `rotationYB` | `-20` | Same for the second stone, mirrored |\n| `distance` | `0` | Distance from the finger; `0` keeps the tool's own default for each stone |\n| `fingerDiameter` | `0` | Finger diameter in millimetres; `0` uses the document's finger size |\n\nOnly the four stone arguments are required. Left alone, the rest reproduce the tool's default placement exactly: the two stones are carried ±14° around the top of the finger and lean ±20° outwards, mirrored about the top, at the builder's default standoff. Passing `angleB` and `rotationYB` as positive values is how you break the mirror and build an asymmetric top.","metadata":{"title":"Toi et Moi","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#usage","collection":"scripting","hash":"a72ec2b86451d18385ab967bbc8ce2e1","indexed_by":"docs-index"}},{"content":"Toi et Moi — Usage\n\nThe shape and material strings are parsed the same way as elsewhere in the gem API — trimmed, dashes and spaces turned into underscores, matched case-insensitively — and each stone's carat weight drives its millimetre size through the usual proportion tables.\n\n`fingerDiameter` of `0` reads the finger size from the document settings; giving a positive value overrides it for this call only, and the circumference is recomputed from it. `distance` of `0` leaves each stone at the model's default distance rather than pushing it to the finger surface.","metadata":{"title":"Toi et Moi","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#usage","collection":"scripting","hash":"2a0bb3ad035627a5171975c53c67af93","indexed_by":"docs-index"}},{"content":"Toi et Moi — What it returns\n\nA list of `System.Guid` — the ids of the two gems, in A then B order. Not handles, and not the group. Feed them through `GemApi.Find` when you want to keep working on the stones:\n\n```python\nfrom ArtisanPlugin.Scripting import GemApi as gem, ToiEtMoiApi as toietmoi, Transaction\n\nwith Transaction.Begin(\"Toi et Moi\"):\n    ids = toietmoi.Create(\"PEAR\", 0.75, \"OVAL\", 0.70,\n                          materialA = \"Diamond\", materialB = \"Ruby\")\n    for id in ids:\n        g = gem.Find(id)\n        if g is not None:\n            g.Select(True)\n```\n\nAlongside the two stones the call bakes an editable group that also carries the finger reference circle, so the result stays a Toi et Moi you can pick up again in the panel rather than two loose stones. The ids of that group's other members are not returned.","metadata":{"title":"Toi et Moi","section":"What it returns","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#what-it-returns","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#what-it-returns","collection":"scripting","hash":"d1bcfc3f228f4e85a88883c5cc05ac05","indexed_by":"docs-index"}},{"content":"Toi et Moi — Errors\n\nThe call mutates the document, so it raises `ScriptingNotLicensedException` without a valid licence, and *\"No active document.\"* with no document open. Each stone is validated independently before anything is built: *\"Carats must be > 0.\"*, *\"Unknown gem shape 'X'.\"* or *\"Unknown gem material 'X'.\"*, with the failing argument named so you know which of the two stones is at fault. The assembled model is then validated as a whole, and if the builder somehow fails to produce both stones the call throws *\"Toi et Moi generation failed to create both gems.\"* rather than leaving half a ring top behind.","metadata":{"title":"Toi et Moi","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/toi-et-moi/#errors","collection":"scripting","hash":"099b76d7da06ad7d7de7a4c68bbfc22d","indexed_by":"docs-index"}},{"content":"Transaction\n\n```python\nfrom ArtisanPlugin.Scripting import Transaction\n```\n\nA script that moves forty stones should be one press of Ctrl+Z, not forty. `Transaction` is the undo primitive the rest of the scripting API is built on: it opens a Rhino undo record, everything done inside it collapses into that one entry, and closing it hands the user a single, named step in their history.\n\nThis matters more than it sounds. Without it, every `Create`, `Move`, `SetCaratWeight` and `Delete` lands as its own undo entry and fires its own redraw, so a bench jeweller who dislikes the result has to undo the script one operation at a time — through a history that no longer says anything about what happened.","metadata":{"title":"Transaction","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/","collection":"scripting","hash":"f424d306cd87d6822409903ea8da5ca8","indexed_by":"docs-index"}},{"content":"Transaction — Usage\n\n```python\nwith Transaction.Begin(\"Move all gems\"):\n    for g in gem.All():\n        g.Move(Vector3d(0, 0, 1))\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `description` | — | The name the undo step gets in Rhino's history. Write it for the user: *\"Halo on 6 stones\"*, not *\"script\"* |\n\n`Begin` returns a disposable scope. The undo record opens when it is created and closes when it is disposed.","metadata":{"title":"Transaction","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#usage","collection":"scripting","hash":"824fede8fb265c4e8cceda28481082b9","indexed_by":"docs-index"}},{"content":"Transaction — Always use the with form\n\nPython's `with` block is not a nicety here. It guarantees the scope is disposed — and therefore the undo record closed — on every exit path, including an exception thrown halfway through the script. That is the case that matters: a leaked undo record is not a tidy-history problem, it corrupts the document's undo stack for the rest of the session, and the user has to restart Rhino to get it back. Scripts fail — a gem is missing, a plane is invalid, a licence check trips — and the `with` form is what makes those failures harmless.\n\nKeep the whole run of mutations inside one block rather than opening a transaction per operation; nesting or reopening per call defeats the point.","metadata":{"title":"Transaction","section":"Always use the with form","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#always-use-the-with-form","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#always-use-the-with-form","collection":"scripting","hash":"cb8214d5260aa4476e33227687ba85b0","indexed_by":"docs-index"}},{"content":"Transaction — What it groups\n\nEverything the document records while the scope is open. That means Artisan calls — `GemApi.Create`, the handle mutations, the gemset facades, `ToiEtMoiApi.Create` — and plain Rhino calls alike, `rhinoscriptsyntax` and `RhinoDoc` operations included. It is Rhino's own undo record, not an Artisan-private mechanism, so a script that mixes the two APIs still undoes as one step:\n\n```python\nimport rhinoscriptsyntax as rs\nfrom ArtisanPlugin.Scripting import GemApi as gem, Transaction\nfrom Rhino.Geometry import Plane\n\nwith Transaction.Begin(\"Stone and marker\"):\n    g = gem.Create(\"ROUND\", \"Diamond\", 0.50, Plane.WorldXY)\n    rs.AddTextDot(\"centre\", g.Position)\n```","metadata":{"title":"Transaction","section":"What it groups","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#what-it-groups","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#what-it-groups","collection":"scripting","hash":"9c8750c05c5e112dfb8bd59c704d4edc","indexed_by":"docs-index"}},{"content":"Transaction — When you do not need one\n\nRead-only scripts need no transaction at all. Nothing in `GemApi.All`, `Find`, `Count`, `Selected`, `ByLayer`, `ByMaterial`, `Collisions`, `Shapes` or `Materials` changes the document, none of them writes an undo entry, and `Select(on)` on a handle only toggles viewport selection. A script that reports, measures or checks for collisions can skip `Transaction` entirely.\n\nThe rule is simply: if the script changes the document, wrap it; if it only reads, do not bother.","metadata":{"title":"Transaction","section":"When you do not need one","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#when-you-do-not-need-one","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#when-you-do-not-need-one","collection":"scripting","hash":"ee111d783b4d5072a3e47c8993e00adb","indexed_by":"docs-index"}},{"content":"Transaction — Errors\n\n`Begin` calls the licence check before it opens anything, so an unlicensed session raises `ScriptingNotLicensedException` at the `with` statement rather than at the first mutation inside it. With no document open the scope is still created and still valid to use — it just has no undo record to manage. Disposal is idempotent: leaving the block twice, or disposing a scope by hand and then letting the block end, closes the record exactly once.","metadata":{"title":"Transaction","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/gems/transaction/#errors","collection":"scripting","hash":"4442f84224b7ec5256ed61e00d835a10","indexed_by":"docs-index"}},{"content":"Gemsets\n\nEvery setting in the Diamonds ribbon, headless. Each has its own page: what its facade can create, and what its handle can edit afterwards.\n\nBezel A metal rim wrapped around the mother gem.\n\nAdvanced bezel The advanced variant of the bezel tool.\n\nPeghead The pronged head; negative counts rotate the prongs.\n\nBasket Prongs and rails — one basket per gem.\n\nAdvanced basket Baskets with prong modes: ROUND, CUSTOM, OFFSET, DOUBLE, CLAW, TRIPLE.\n\nHalo A ring of small stones around the mother gem.\n\nHidden halo The halo under the head, on its channel profile.\n\nCluster The cluster setting, with its prongs and rail.\n\nTulip The tulip setting — 4 or 6 prongs.\n\nMartini The martini setting, with optional side gems.\n\nTrellis The trellis setting: crossing prongs and rail.\n\nCabochon A domed, unfaceted stone — creates its own stone.\n\nPearl A pearl with optional calotte cap and wire post.\n\nCutters The drilling/cutting solids gem seats are built from.\n\nGems on curve Identical gems distributed along a curve.\n\nGems by network Gems distributed over a network of curves.\n\nChannel A channel setting along an open or closed curve.\n\nPave on surface Fill a surface with diamonds automatically.\n\nMicro setting The pavé infrastructure: cutters, V-cutters, channel, row prongs.","metadata":{"title":"Gemsets","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/","collection":"scripting","hash":"b673796939b18361ceed6f4f1a3f4984","indexed_by":"docs-index"}},{"content":"Gemsets — Conventions\n\nEverything follows the house rules: millimetres, `0` keeps the tool default (or your saved defaults), profiles resolve by asset name, and mutations belong inside a `Transaction`.\n\nUnless a page says otherwise, each setting is built around a mother gem and stays its parametric child.","metadata":{"title":"Gemsets","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#conventions","collection":"scripting","hash":"a500200a5a7367f20136b964df561400","indexed_by":"docs-index"}},{"content":"Gemsets — Prong modes and claws\n\nEvery setting with prongs takes the same `prongMode`, at creation and on its handle (`ProngMode` / `SetProngMode`; `prong_mode` in Python and over MCP):\n\n| Value | Prongs |\n|---|---|\n| `ROUND` | The plain round prong, the default. `DEFAULT` and `CIRCLE` are read as `ROUND` |\n| `CUSTOM` | A profile section: pass a `CLOSED_PROFILE` asset (a profile alone asks for `CUSTOM`) |\n| `CLAW` | Claw tips |\n\n| Setting | Modes |\n|---|---|\n| Basket, Martini, Halo (the mother gem's prongs) | `ROUND`, `CUSTOM`, `CLAW` |\n| Advanced basket | Also `OFFSET`, `DOUBLE` and `TRIPLE`, on every prong. `ProngMode` reads `MIXED` when the panel's per-prong editor left them different |\n| Tulip, Trellis | `ROUND`, `CLAW` |\n| Trilogies | `CreateHalo` and `CreateEastWest` like their settings; `CreateIndividual` and `CreateTrellis` `ROUND` or `CLAW` |\n\nClaw tips are built in Render mode only: in Production mode the prongs come out without them (the Outliner's Rendering/Manufacturing selector, `DocumentApi.SetComputationMode`).\n\nThe claw of the martini, advanced basket, tulip and trellis shares four values, with the same meaning on all four:\n\n| Value | Meaning |\n|---|---|\n| `ClawCapDistance` | mm the apex is pulled in toward the gem centre |\n| `ClawCapHeight` | mm the apex moves up (+) or down (-) |\n| `ClawTipWidth` | Apex thickness as a fraction of the prong: 0 a sharp point, 1 the full tube |\n| `ClawTipSmoothness` | Body-to-tip blend, 0 to 1 |","metadata":{"title":"Gemsets","section":"Prong modes and claws","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#prong-modes-and-claws","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#prong-modes-and-claws","collection":"scripting","hash":"b212922466f1740ab0ec1083bee04025","indexed_by":"docs-index"}},{"content":"Gemsets — Prong modes and claws\n\nOn the tulip the cap distance and height scale with the stone, and `ClawTipLength` sets how long the tip is. The trellis panel shows the four values as adjustments from 0; scripts read and write the claw actually built. The basket and the halo keep their classic claw under their own `Claw*` values: the basket in its `Prong` section (`ClawGemInside`, `ClawHeight`, `ClawTension`, `ClawOnCurve`), the halo on its handle (`ClawGemInside`, `ClawTipDistance`, `ClawTipHeight`, `ClawTipWidth`, `ClawTension`). A new halo set to `CLAW` starts from the tool's claw values.\n\n```python\nfrom ArtisanPlugin.Scripting import MartiniApi as martini, HaloApi as halo, GemApi as gem, Transaction\n\nstones = gem.Selected()\nwith Transaction.Begin(\"Claw settings\"):\n    m = martini.Create(stones[0].Id, prongMode = \"CLAW\")\n    h = halo.Create(stones[1].Id, prongMode = \"CLAW\")\n    m.SetClawTipWidth(0.2)\n    h.SetClawTension(70)\n```","metadata":{"title":"Gemsets","section":"Prong modes and claws","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#prong-modes-and-claws","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#prong-modes-and-claws","collection":"scripting","hash":"2eafd6e1bc87c21cd0954db9221a773f","indexed_by":"docs-index"}},{"content":"Gemsets — The three families\n\nThe settings split into three groups, and the difference decides what you pass in and what you get back.\n\n| Family | Pages | Built around |\n|---|---|---|\n| Single-gem settings | Bezel, Advanced bezel, Peghead, Basket, Advanced basket, Halo, Hidden halo, Cluster, Tulip, Martini, Trellis | An existing mother gem — `ForGem(gemId)` finds them back |\n| Standalone stone creators | Cabochon, Pearl | Nothing — they create their own stone at a point |\n| Many stones at once | Gems on curve, Gems by network, Channel, Pave on surface, Micro setting | A curve, a surface or a run of small gems |\n\nCutters sit slightly apart: they are the drilling solids a seat is built from, one per gem, and you subtract them from the metal yourself.","metadata":{"title":"Gemsets","section":"The three families","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#the-three-families","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#the-three-families","collection":"scripting","hash":"44354d8862b17e9f7783515554b5cd30","indexed_by":"docs-index"}},{"content":"Gemsets — What each one can do\n\nAlmost every setting can be built from scratch. What differs is how much of it you can still change afterwards: some handles regenerate the object through setters, others are read-only once created — run the tool in the UI to get a variant the script cannot reach.\n\n| Setting | Facade | Create | Edit |\n|---|---|---|---|\n| Bezel | `BezelApi` | yes | full |\n| Advanced bezel | `AdvancedBezelApi` | yes | read-only |\n| Peghead | `PegheadApi` | yes | full |\n| Basket | `BasketApi` | yes, one per gem | prongs only |\n| Advanced basket | `AdvancedBasketApi` | yes, one per gem | prongs and rails |\n| Halo | `HaloApi` | yes | stone size and spacing |\n| Hidden halo | `HiddenHaloApi` | yes | stone size and spacing |\n| Cluster | `ClusterApi` | yes | read-only |\n| Tulip | `TulipApi` | yes | pipe and height |\n| Martini | `MartiniApi` | yes | prong height, side gems |\n| Trellis | `TrellisGemsetApi` | yes | read-only |\n| Cabochon | `CabochonApi` | yes, standalone stone | read-only |\n| Pearl | `PearlApi` | yes, standalone stone | read-only |\n| Cutters | `CutterApi` | yes, one per gem | read-only |\n| Gems on curve | `GemsOnCurveApi` | yes | read-only |\n| Gems by network | `GemsByNetworkApi` | - | read-only |\n| Channel | `ChannelApi` | yes, returns ids | no handle |\n| Pave on surface | `PaveApi` | yes, returns gem ids | no handle |\n| Micro setting | `MicroSettingApi` | yes, returns ids | read-only |\n\nGems by network is the one setting with no `Create`: build the network in Rhino, then read, move and delete it from a script.","metadata":{"title":"Gemsets","section":"What each one can do","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#what-each-one-can-do","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#what-each-one-can-do","collection":"scripting","hash":"1ff0805431926d27e46039dc87252c72","indexed_by":"docs-index"}},{"content":"Gemsets — The shared surface\n\nEvery setting facade shares the same query surface — `All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, plus `ForGem(gemId)` on single-gem settings and `ForCurve(curveId)` on curve-driven ones.\n\nHandles share a structural base (`Id`, `MotherGemId`, `ObjectType`, `LayerName`, `Position`, `Move`, `Delete`); settings that wrap one gem also expose that gem's `GemShape`, `GemMaterial` and `GemCaratWeight`.\n\nOn multi-gem objects (eternities, shanks, micro-settings) `MotherGemId` is empty by design; for curve-driven settings the parent is `CurveId`.\n\n```python\nfrom ArtisanPlugin.Scripting import BezelApi as bezel\n\nfor b in bezel.All():\n    print(b.Id, b.GemShape, b.GemCaratWeight)\n```\n\nRing bodies have their own section: Shanks covers every ring body — creation where available, parametric setters and queries, one page per shank.","metadata":{"title":"Gemsets","section":"The shared surface","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#the-shared-surface","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/#the-shared-surface","collection":"scripting","hash":"f284ba83ef7743205286c160376fbfe6","indexed_by":"docs-index"}},{"content":"Advanced basket\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBasketApi as advbasket\n```\n\nAn advanced basket is the open cage of claws and rails that sits under a stone, but built as a free layout rather than a fixed pattern: it stores one entry per prong and per rail, each with its own position, section and dimensions, so a basket can mix claw types or hang its rails at any depth. The tool builds it as the ArtisanAdvancedBasket panel does, and this facade lays the prongs and rails out evenly, the way the panel's presets do.\n\nEach basket is built under a mother gem and stays its parametric child.","metadata":{"title":"Advanced basket","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/","collection":"scripting","hash":"ee9b4546c1d27fef9edbe596ac114ffc","indexed_by":"docs-index"}},{"content":"Advanced basket — Create\n\n```python\nbaskets = advbasket.Create(gemIds = None, prongs = 4, prongMode = \"ROUND\",\n                           prongDiameter = 1.5, prongHeight = 4,\n                           rails = None, railWidth = 1.5,\n                           profile = None)              # -> [IAdvancedBasket]\n```\n\n`Create` takes a list of gems and returns one `IAdvancedBasket` handle per gem, in input order - not a single handle. Each gem gets its own group and its own serialised copy of the model, so the mother gem stored in each basket is the right one.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemIds` | `None` | The mother gems. `None` or empty = the gems currently selected in the document; throws if that leaves nothing |\n| `prongs` | `4` | Prong count, laid out evenly around the gem. `0` keeps the saved layout, or falls back to the tool's `4` preset (prongs at the diagonals) when there is none. Negative is rejected |\n| `prongMode` | `\"ROUND\"` | Prong type, applied to every prong: `ROUND`, `CUSTOM`, `OFFSET`, `DOUBLE` (the 2-2 presets), `CLAW` or `TRIPLE` (3-3); `DEFAULT` and `CIRCLE` also mean `ROUND` - see Prong modes and claws |\n| `prongDiameter` | `1.5` | Sets the top and bottom prong diameters together, mm |\n| `prongHeight` | `4` | Prong height, mm |\n| `rails` | `None` | `None` keeps the saved rails (a fresh basket has none); `0` = no rails, `1` = one rail 1 mm under the girdle, `2` adds a second at 3.66 mm, and further rails keep that 2.66 mm spacing. Negative is rejected |\n| `railWidth` | `1.5` | Rail width, applied to every rail, mm |\n| `profile` | `None` | Resolves a `CLOSED_PROFILE` asset by name for the prongs; it also switches them to `CUSTOM` mode unless `prongMode` says otherwise. `None` keeps each mode's built-in section |","metadata":{"title":"Advanced basket","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#create","collection":"scripting","hash":"e8ca3ee1e2a172556852f73bfc75a5db","indexed_by":"docs-index"}},{"content":"Advanced basket — Create\n\nMillimetres throughout, and `0`/`None` keeps the tool default - or the user's saved defaults for the advanced basket, when they have stored any. Prong positions are the tool's preset fractions around the gem curve, so 4 prongs land on the diagonals and 6 sit rotated with a pair on the Y axis.\n\nEvery part of each basket is baked into its own group, put on the metal material, with the parameters and the mother gem stored in the group's user data. Any id in the list that is not really a gem throws, and a basket that fails to compute throws with the kernel's message.","metadata":{"title":"Advanced basket","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#create","collection":"scripting","hash":"0e8ff3a31845fcbb0eb9d16297d6ea90","indexed_by":"docs-index"}},{"content":"Advanced basket — Edit\n\n`Create`, `Find` and `All` return an `IAdvancedBasket` handle. Each setter regenerates the object in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetProngCount(n)` | Rebuilds the prong set evenly spaced, cloning the first existing prong's settings; must be >= 1 |\n| `SetProngDiameter(mm)` | Top and bottom diameters of every prong at once - must be > 0 |\n| `SetProngHeight(mm)` | Height of every prong - must be > 0 |\n| `SetRailCount(n)` | Rebuilds the rail set at the preset depths, cloning the first existing rail's settings; `0` removes them, negative is rejected |\n| `SetProngMode(mode)` | Every prong: `ROUND`, `CUSTOM`, `CLAW`, `OFFSET`, `DOUBLE` or `TRIPLE` |\n| `SetClawCapDistance` / `SetClawCapHeight` / `SetClawTipWidth` / `SetClawTipSmoothness` | The claw tips of every prong - see Prong modes and claws |\n\nFor reading, the handle reports `ProngCount`, `RailCount` and `ProngMode` (`MIXED` when the prongs differ), plus `ProngHeight`, `ProngDiameter` and the four claw values - the per-prong values of the first prong, since each entry carries its own, and `0` when there are none. It also reports `GemShape`, `GemMaterial`, `GemCaratWeight` and the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBasketApi as advbasket, Transaction\n\nwith Transaction.Begin(\"Advanced baskets under the selection\"):\n    for b in advbasket.Create(prongMode = \"DOUBLE\", rails = 2):\n        b.SetProngHeight(3.6)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Advanced basket","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#edit","collection":"scripting","hash":"42cdd869ddcc3a22277f46959730716d","indexed_by":"docs-index"}},{"content":"Advanced basket — Every prong and rail value, by path\n\nEverything the panel's per-prong and per-rail editors hold is reachable by path: `ParametersJson` shows the model, `GetParameter(path)` reads one value and `SetParameter(path, value)` writes one, as text. Paths ignore case and underscores (`Prongs[0].Inclination` or `prongs[0].inclination`), and `[*]` sets the value on every prong or rail. Enum fields, such as a prong's `Mode`, take their number; use `SetProngMode` for the mode.\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBasketApi as advbasket, Transaction\n\nb = advbasket.Selected()[0]\nwith Transaction.Begin(\"Prong bow and rail\"):\n    b.SetParameter(\"prongs[*].inclination\", \"12\")    # every prong\n    b.SetParameter(\"prongs[0].gem_inside\", \"0.2\")    # just the first one\n    b.SetParameter(\"rails[1].width\", \"1.2\")\nprint(b.GetParameter(\"Prongs[3].Inclination\"))       # 12\n```\n\nOver MCP, `edit_object` takes the same paths as keys: `{\"object_id\": \"…\", \"prongs[*].inclination\": 12}`.\n\nSome values only matter in certain modes or on certain stones:\n\n| Value | Used by |\n|---|---|\n| `Angle` (the panel's \"Separation\") | `DOUBLE` and `TRIPLE` prongs |\n| `MiddleGemInside` (the panel's \"Exterior gem inside\") | `TRIPLE` prongs |\n| `Tangent` | Stones that aren't round, with `CUSTOM`, `OFFSET` or `CLAW` prongs, or `DOUBLE` / `TRIPLE` with `BottomToCenter` off |\n| `Rails[i].FilletRadius` | Rounds the corners of the rail's path, so it shows on cuts with corners (princess, baguette, marquise tips, heart, trillion), not on a round or oval stone |","metadata":{"title":"Advanced basket","section":"Every prong and rail value, by path","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#every-prong-and-rail-value-by-path","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#every-prong-and-rail-value-by-path","collection":"scripting","hash":"0d954baf600bade09f384b7a9807f9c6","indexed_by":"docs-index"}},{"content":"Advanced basket — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Advanced basket","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-basket/#queries","collection":"scripting","hash":"22e9e06657b0985b27125b546f8d201e","indexed_by":"docs-index"}},{"content":"Advanced bezel\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBezelApi as advbezel\n```\n\nThe advanced bezel is the same collar of metal around a stone, but its wall cross-section is a freely editable point profile rather than a swept profile asset - so the outside can be flared, stepped or tapered instead of following a fixed section. Cutters and airgaps are configured as the tool's defaults set them.\n\nIt is built around a mother gem and stays its parametric child: `gemId` must already be a gem in the active document.","metadata":{"title":"Advanced bezel","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/","collection":"scripting","hash":"ff24a6892f6e16265650a2e5077ce3e7","indexed_by":"docs-index"}},{"content":"Advanced bezel — Create\n\n```python\nb = advbezel.Create(gemId, height = 3.8, width = 1.5,\n                    girdleHeight = 0.3, girdleWidth = 1.5,\n                    gemInside = 0, profile = None)              # -> IAdvancedBezel\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it wraps - throws if the object is not a gem |\n| `height` | `3.8` | Wall height, mm |\n| `width` | `1.5` | Wall width (metal thickness), mm |\n| `girdleHeight` | `0.3` | Height of the girdle step, mm |\n| `girdleWidth` | `1.5` | Width of the girdle step, mm |\n| `gemInside` | `0` | How deep the stone sits inside the collar, mm |\n| `profile` | `None` | `BEZEL_PROFILE` asset by name - see `AssetsApi.List(\"BEZEL_PROFILE\")` |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the advanced bezel, when they have stored any. Passing an explicit `profile` deliberately skips those saved defaults, since saved defaults replace the whole model and would otherwise overwrite the profile you asked for. Without a saved profile the wall uses the 6-point default section.\n\n`Create` throws `ArgumentException` if `gemId` is not a gem, and `InvalidOperationException` when the kernel cannot build the geometry with the given parameters (it reports keys such as `INVALID_HEIGHT` or `INVALID_GIRDLE_WIDTH`).","metadata":{"title":"Advanced bezel","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#create","collection":"scripting","hash":"7054489f9cb9dad9ce6dc7ef455a2552","indexed_by":"docs-index"}},{"content":"Advanced bezel — Edit\n\nRead-only after creation. The parametric engine has no regenerate step for advanced bezels, so `IAdvancedBezel` exposes no setters - to change one, `Delete()` it and `Create` a new one.\n\nWhat the handle reads back:\n\n| Member | Meaning |\n|---|---|\n| `Height`, `Width` | Wall height and width, mm |\n| `GirdleHeight`, `GirdleWidth` | The girdle step, mm |\n| `GemInside` | Seat depth of the stone, mm |\n| `GemShape`, `GemMaterial`, `GemCaratWeight` | The mother stone |\n| `Id`, `MotherGemId`, `LayerName`, `Position` | Shared parametric-object properties |\n| `Move(vector)`, `Delete()` | The only mutations - wrap them in a `Transaction` |\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedBezelApi as advbezel, Transaction\n\nold = advbezel.Selected()[0]\ngemId = old.MotherGemId\nwith Transaction.Begin(\"Rebuild advanced bezel\"):\n    old.Delete()\n    advbezel.Create(gemId, height = 4.2)\n```","metadata":{"title":"Advanced bezel","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#edit","collection":"scripting","hash":"0264a63a7317f89edf73fcc0b4d3321b","indexed_by":"docs-index"}},{"content":"Advanced bezel — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Advanced bezel","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/advanced-bezel/#queries","collection":"scripting","hash":"b18218defc698c6521391dc23770655a","indexed_by":"docs-index"}},{"content":"Basket\n\n```python\nfrom ArtisanPlugin.Scripting import BasketApi as basket\n```\n\nA basket is the open cage of prongs and rails that sits under a stone: the claws rise past the girdle, the upper rail closes the seat and the base rail ties the prongs together at the bottom - the airy alternative to a solid head. The tool builds it as the ArtisanBasket panel does, baking each basket as its own group carrying the parameters and the mother gem.\n\nEach basket is built under a mother gem and stays its parametric child.","metadata":{"title":"Basket","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/","collection":"scripting","hash":"9f329dc493f207d6a0119d0b827c3eaa","indexed_by":"docs-index"}},{"content":"Basket — Create\n\n```python\nbaskets = basket.Create(gemIds = None, prongs = 4, prongDiameter = 1.5,\n                        prongHeight = 4, prongHeightOverGirdle = 0.3,\n                        gemInside = 0.35, upperRail = None, baseRail = None,\n                        support = \"NONE\")                       # -> [IBasket]\n```\n\n`Create` takes a list of gems and returns one `IBasket` handle per gem, in input order - not a single handle. Each gem gets its own group and its own serialised copy of the model.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemIds` | `None` | The mother gems. `None` or empty = the gems currently selected in the document; throws if that leaves nothing |\n| `prongs` | `4` (rotated) | Prong count; `0` keeps the default. Negative counts give the rotated variant |\n| `prongDiameter` | `1.5` | Sets the top, girdle and bottom prong diameters together, mm |\n| `prongHeight` | `4` | Prong height, mm |\n| `prongHeightOverGirdle` | `0.3` | How high the claw rises above the girdle, mm |\n| `gemInside` | `0.35` | How deep the stone sits inside the basket, mm |\n| `upperRail` | `None` | `None` keeps the default (enabled); `True`/`False` forces it |\n| `baseRail` | `None` | `None` keeps the default (enabled); `True`/`False` forces it |\n| `support` | `\"NONE\"` | Prong support: `NONE`, `SINGLE` or `DOUBLE` - any other value is rejected |\n| `prongMode` | `None` -> `ROUND` | `ROUND`, `CUSTOM` (the `prongProfile` section; a profile alone implies it, and the section starts turned 90 degrees unless `prongRotation` says otherwise) or `CLAW` - see Prong modes and claws |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the basket, when they have stored any. Prong and both rails start from the default `CLOSED_PROFILE` asset.","metadata":{"title":"Basket","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#create","collection":"scripting","hash":"90ddd6d8098f20a1f61e5f31ca380fd2","indexed_by":"docs-index"}},{"content":"Basket — Create\n\nEvery part of each basket is baked into its own group, put on the metal material, with the parameters and the mother gem stored in the group's user data. Any gem in the list that is not really a gem throws, and a basket that fails to compute throws with the kernel's message.","metadata":{"title":"Basket","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#create","collection":"scripting","hash":"41107dbbafa781b25d6a784260cdf8cb","indexed_by":"docs-index"}},{"content":"Basket — Rails\n\nBoth rails (`UpperRail` and `BaseRail` on the handle, both `IBasketRail`) have two section modes:\n\n- `DEFAULT`: an elliptical section sized by `Width` and `Height`.\n- `CUSTOM`: the rail's `CLOSED_PROFILE` asset.\n\nA rail profile only shapes the section in `CUSTOM` mode. Giving one therefore switches the rail to `CUSTOM`, whether you pass `upperRailProfile` / `baseRailProfile` to `Create` or call `SetProfile` on the rail. `SetMode(\"DEFAULT\")` goes back to the ellipse.\n\n```python\nfrom ArtisanPlugin.Scripting import AssetsApi as assets, BasketApi as basket, Transaction\n\nrailProfile = assets.List(\"CLOSED_PROFILE\")[0].Name      # pick one from your library\n\nwith Transaction.Begin(\"Custom upper rail\"):\n    b = basket.Create([gemId], upperRailProfile = railProfile)[0]\n    print(b.UpperRail.Mode)            # CUSTOM\n    b.BaseRail.SetWidth(0.9)\n```\n\nThrough MCP, pass `upper_rail_profile` / `base_rail_profile` to `add_basket_setting`. `edit_object {\"upper_rail\": {\"mode\": \"DEFAULT\"}}` goes back to the ellipse.\n\n`Create` also takes `element=` to start from a saved Basket element (the factory `BA001`… included), and the handle's `SetElement(name)` applies one to an existing basket, keeping its gem. The Python reference lists every `Create` argument and rail setter.","metadata":{"title":"Basket","section":"Rails","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#rails","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#rails","collection":"scripting","hash":"06619610f3dc584018383b69bb18e7e3","indexed_by":"docs-index"}},{"content":"Basket — Edit\n\n`Create`, `Find` and `All` return an `IBasket` handle. Each setter regenerates the basket in place - the group keeps its id so the handle stays valid, while its member objects are rebuilt:\n\n| Setter | What it changes |\n|---|---|\n| `SetProngCount(n)` | Prong count; `0` is rejected, negatives give the rotated variant |\n| `SetProngDiameter(mm)` | Top, girdle and bottom diameters at once - must be > 0 |\n| `SetProngHeight(mm)` | Prong height - must be > 0 |\n| `SetProngMode(mode)` | `ROUND`, `CUSTOM` or `CLAW`; the claw values live in the `Prong` section - see Prong modes and claws |\n\nFor reading, the handle reports `ProngCount` (always positive, the rotation sign is dropped), `ProngHeight`, `ProngDiameterTop`, `ProngDiameterGirdle`, `ProngDiameterBottom` and `ProngMode`, plus `GemShape`, `GemMaterial`, `GemCaratWeight` and the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`.\n\n```python\nfrom ArtisanPlugin.Scripting import BasketApi as basket, Transaction\n\nwith Transaction.Begin(\"Baskets under the selection\"):\n    for b in basket.Create(prongDiameter = 1.1, support = \"SINGLE\"):\n        b.SetProngHeight(3.6)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Basket","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#edit","collection":"scripting","hash":"cbed4d0afc5a7a59b51a399324f79ea5","indexed_by":"docs-index"}},{"content":"Basket — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ByGemMaterial(name)`, `ForGem(gemId)`.","metadata":{"title":"Basket","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/basket/#queries","collection":"scripting","hash":"e9365f3e3bbb59ff35668cd951378c81","indexed_by":"docs-index"}},{"content":"Bezel\n\n```python\nfrom ArtisanPlugin.Scripting import BezelApi as bezel\n```\n\nA bezel is the continuous metal collar that surrounds a stone and holds it by folding a rim over its girdle - the oldest and most protective way to set a gem. The tool sweeps a `BEZEL_PROFILE` section around the stone's outline and lands the wall against the girdle, exactly as the ArtisanBezel panel does.\n\nEvery bezel is built around a mother gem and stays its parametric child: `gemId` must already be a gem in the active document, and the bezel keeps that link for the rest of its life.","metadata":{"title":"Bezel","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/","collection":"scripting","hash":"4f694626305e82f0506c9a177aea4485","indexed_by":"docs-index"}},{"content":"Bezel — Create\n\n```python\nb = bezel.Create(gemId, height = 3.8, width = 1.5,\n                 girdleHeight = 0.3, girdleWidth = 1.5,\n                 gemInside = 0, profile = None)                 # -> IBezel\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it wraps - throws if the object is not a gem |\n| `height` | `3.8` | Wall height, mm |\n| `width` | `1.5` | Wall width (metal thickness), mm |\n| `girdleHeight` | `0.3` | Height of the girdle step, mm |\n| `girdleWidth` | `1.5` | Width of the girdle step, mm |\n| `gemInside` | `0` | How deep the stone sits inside the collar, mm |\n| `profile` | `None` | `BEZEL_PROFILE` asset by name - see `AssetsApi.List(\"BEZEL_PROFILE\")` |\n\nAll dimensions are millimetres, and `0` keeps the tool default for that parameter, so you only pass what you actually want to change. The two closing profiles come from the default `CLOSED_PROFILE` asset, as in the panel.\n\n`Create` throws if `gemId` is not a gem, if the geometry fails to compute, or if the licence is invalid.","metadata":{"title":"Bezel","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#create","collection":"scripting","hash":"8a57309096fe75fe40beac2481bf427e","indexed_by":"docs-index"}},{"content":"Bezel — Edit\n\n`Create`, `Find` and `All` return an `IBezel` handle. Each setter regenerates the object in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetHeight(mm)` | Wall height - must be > 0 |\n| `SetWidth(mm)` | Wall width - must be > 0 |\n| `SetGirdleHeight(mm)` | Height of the girdle step - must be > 0 |\n| `SetGirdleWidth(mm)` | Width of the girdle step - must be > 0 |\n| `SetGemInside(mm)` | Seat depth of the stone; accepts any value, including negatives |\n\nThe handle also reports `GemShape`, `GemMaterial` and `GemCaratWeight` for the mother stone, plus the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`.\n\n```python\nfrom ArtisanPlugin.Scripting import BezelApi as bezel, Transaction\n\nb = bezel.Selected()[0]\nwith Transaction.Begin(\"Taller bezel\"):\n    b.SetHeight(4.2)\n    b.SetWidth(1.2)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Bezel","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#edit","collection":"scripting","hash":"bac52fedc369edfa67acf65ba5e8d954","indexed_by":"docs-index"}},{"content":"Bezel — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Bezel","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/bezel/#queries","collection":"scripting","hash":"92045d930e3533d22510b712d8ed963f","indexed_by":"docs-index"}},{"content":"Cabochon\n\n```python\nfrom ArtisanPlugin.Scripting import CabochonApi as cabochon\n```\n\nA cabochon is a stone cut with a smooth domed top and no facets - the traditional cut for opal, turquoise, moonstone and star sapphire, and for any material whose colour or chatoyancy matters more than its sparkle. The tool builds the dome from a shape outline, a cut type and a girdle step, exactly as the ArtisanCabochon panel does.\n\nUnlike the bezel, peghead or basket, `CabochonApi` is not wrapped around a mother gem: it is a standalone stone creator. It makes its own stone at the point you give it, so there is no `gemId` argument, no `ForGem` query, and `MotherGemId` on the handle is always empty.","metadata":{"title":"Cabochon","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/","collection":"scripting","hash":"dec82825662d4632d4e2be82c8ddfe6b","indexed_by":"docs-index"}},{"content":"Cabochon — Create\n\n```python\nc = cabochon.Create(x = 0, y = 0, z = 0, shape = None, type = None,\n                    angle = 0, girdleHeight = 0, plane = None)        # -> ICabochon\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `x` | `0` -> tool default `4` | Stone width, mm |\n| `y` | `0` -> tool default `8` | Stone length, mm |\n| `z` | `0` -> tool default `2` | Dome height, mm |\n| `shape` | `None` -> `Round` | Outline: `Round`, `Oval`, `Rectangular`, `Heart`, `Pear`, `Marquise`, `Diamond` |\n| `type` | `None` -> `Cabochon` | Cut: `Cabochon`, `FlatTopSingleBevel`, `FlatTopDoubleBevel`, `BuffTopSingleBevel`, `BuffTopDoubleBevel` |\n| `angle` | `0` -> tool default `15` | Bevel angle, degrees |\n| `girdleHeight` | `0` -> tool default `1` | Height of the straight girdle band below the dome, mm |\n| `plane` | omitted -> world XY | The plane the stone is built on, as in the panel's \"add on plane\" |\n\nAll dimensions are millimetres, and `0` keeps the tool default for that parameter - or the user's saved cabochon defaults when they have any, since `Create` starts from the same model the ArtisanCabochon command does. `shape` and `type` are matched case-insensitively.\n\nThe stone is baked as a single cabochon object, gets the cabochon material and lands on the last gems layer, just like the panel's add button. There are no metal children.\n\n`Create` throws `ArgumentException` for an unknown `shape` or `type` name, and `InvalidOperationException` when the geometry fails to compute or the licence is invalid.","metadata":{"title":"Cabochon","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#create","collection":"scripting","hash":"ec0d62bafe3a0e3dc14583de7f9348e4","indexed_by":"docs-index"}},{"content":"Cabochon — Edit\n\nThe cabochon is read-only after creation: the parametric engine has no regenerate step for cabochons, so `ICabochon` carries no setters. To change a dimension, create a new cabochon and `Delete()` the old one.\n\nWhat the handle exposes for reading:\n\n| Member | Meaning |\n|---|---|\n| `Shape` | The `CabochonShape` name it was built with |\n| `CutType` | The `CabochonType` name |\n| `SizeX`, `SizeY`, `SizeZ` | Width, length and dome height, mm |\n| `GirdleHeight` | Girdle band height, mm |\n\nPlus the shared `Id`, `MotherGemId` (always empty), `ObjectType`, `LayerName`, `Position`, `Move(vector)` and `Delete()`. Those two mutations belong inside a `Transaction` so the edit lands as one undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import CabochonApi as cabochon, Transaction\nfrom Rhino.Geometry import Vector3d\n\nc = cabochon.Create(x = 6, y = 10, z = 3, shape = \"Oval\", type = \"BuffTopSingleBevel\")\nwith Transaction.Begin(\"Shift cabochon\"):\n    c.Move(Vector3d(0, 0, 1.5))\n```","metadata":{"title":"Cabochon","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#edit","collection":"scripting","hash":"e612f21b92b9a54f662f260c56d72c4e","indexed_by":"docs-index"}},{"content":"Cabochon — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.\n\nThere is no `ForGem` - a cabochon has no mother gem.","metadata":{"title":"Cabochon","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cabochon/#queries","collection":"scripting","hash":"855a8a0fb3e97252f25f8d400b307752","indexed_by":"docs-index"}},{"content":"Channel\n\n```python\nfrom ArtisanPlugin.Scripting import ChannelApi as channel\n```\n\nA channel setting is a groove cut between two metal walls, with a run of stones seated shoulder to shoulder inside it and no prongs between them - the classic way to line a band or a shoulder with small gems. The tool sweeps a `CHANNEL_PROFILE` section along an existing curve, packs the run of gems into the groove and bakes both together, exactly as the ArtisanChannel panel does.\n\nThis is a curve-driven, multi-gem setting: there is no mother gem. The parent of the whole run is `curveId`, which the group keeps as its link back to the rail.","metadata":{"title":"Channel","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/","collection":"scripting","hash":"ec4f06c9c82dc6c5e01c106723ef06e2","indexed_by":"docs-index"}},{"content":"Channel — Create\n\n```python\nids = channel.Create(curveId, gemSize = 0, width = 0, height = 0,\n                     minDistance = 0, orientationIds = None,\n                     profile = None)                          # -> object ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | - | The rail the channel runs along - throws if the object is not a curve |\n| `gemSize` | `0` (tool default `1.8`) | Size of each stone in the run, mm |\n| `width` | `0` (tool default `3`) | Channel width, mm |\n| `height` | `0` (tool default `2`) | Channel height, mm |\n| `minDistance` | `0` (tool default `0.1`) | Minimum gap between consecutive stones, mm |\n| `orientationIds` | `None` | Surfaces, breps or meshes used to orient the channel onto the underlying body |\n| `profile` | `None` | `CHANNEL_PROFILE` asset by name - see `AssetsApi.List(\"CHANNEL_PROFILE\")` |\n\nAll dimensions are millimetres, and `0` keeps the tool default for that parameter (or the user's saved channel defaults), so you only pass what you actually mean to change. When `profile` is omitted the tool starts from the \"domed rectangle\" profile (asset `014`) where it is available, and falls back to the type default otherwise.\n\nThe run mode follows the rail automatically, as it does in the panel: an open curve runs the channel as a single segment between the two ends, a closed curve carries it all the way around. Pass `orientationIds` when the channel has to sit on a body - the objects are meshed together and used to orient the sweep.\n\nIf the setting is configured with scalloped prongs and cutters are not being booleaned away, the prong cutters are baked into the same group as the rest.\n\n`Create` throws if `curveId` is not a curve, if the geometry fails to compute with the given parameters, or if the licence is invalid.","metadata":{"title":"Channel","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/#create","collection":"scripting","hash":"807d2f164624e4bf5f095126840825e8","indexed_by":"docs-index"}},{"content":"Channel — Edit\n\nThere is no `IChannel` handle. `Create` returns a plain list of Rhino object ids - the channel metal first, then the gems, then any scalloped-prong cutters - all added to a single Rhino group tagged as a `Channel`, with the parameters and the parent `curveId` stored on the group.\n\nThat means you can move, transform or delete the ids like any other Rhino geometry, but you cannot re-drive the channel parametrically from a script. To change a dimension, delete the run and call `Create` again with the new values. Grouping is preserved, so selecting one member in Rhino selects the whole channel.\n\n```python\nfrom ArtisanPlugin.Scripting import ChannelApi as channel, Transaction\n\nwith Transaction.Begin(\"Channel on the shoulder\"):\n    ids = channel.Create(railId, gemSize = 1.6, width = 2.6, height = 1.8)\n```\n\nMutations belong inside a `Transaction` so the whole build lands as one undo step.","metadata":{"title":"Channel","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/channel/#edit","collection":"scripting","hash":"1b5a06d9adaf88db84212300d6b8f179","indexed_by":"docs-index"}},{"content":"Cluster\n\n```python\nfrom ArtisanPlugin.Scripting import ClusterApi as cluster\n```\n\nA cluster surrounds the centre stone with a ring of small stones held individually by prongs on a rail, rather than sunk into a channel - the older, more open cousin of the halo, where metal shows between the stones. The tool builds it as the ArtisanCluster panel does: the rail is laid out around the gem, the small stones spaced along it, and internal, external and central prongs raised to hold them.\n\nEach cluster is built around a mother gem and stays its parametric child - the group stores the computed parameters and the mother's id in its user data.","metadata":{"title":"Cluster","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/","collection":"scripting","hash":"9c7d6396d54129e79557743191451a2c","indexed_by":"docs-index"}},{"content":"Cluster — Create\n\n```python\nc = cluster.Create(gemId, stoneSize = 1.6, stoneDistance = 0.2,\n                   distanceToGem = 1.0, prongNumber = 4,\n                   prongDiameter = 0.8, railDiameter = 1.0)   # -> ICluster\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it surrounds; must be a gem in the active document |\n| `stoneSize` | `1.6` | Diameter of each cluster stone, mm |\n| `stoneDistance` | `0.2` | Minimum gap between neighbouring cluster stones, mm |\n| `distanceToGem` | `1.0` | Distance from the mother gem to the cluster stones, mm |\n| `prongNumber` | `4` | Prongs per stone: `3`, `4` or `5` - any other value is rejected |\n| `prongDiameter` | `0.8` | Applied to the internal, external and central prongs alike, mm |\n| `railDiameter` | `1.0` | Diameter of the rail the stones sit on, mm |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the cluster, when they have stored any.\n\n`ClusterApi` validates the mother shape. Clusters are only available for ROUND, CUSHION, EMERALD, OVAL, RADIANT and ASSCHER gems - the kernel picks the matching shape variant internally - and anything else throws, as does an id that is not a gem at all.\n\nEverything is baked into a single group: the small stones as diamonds-without-ref on the secondary gems layer, the metal breps as parametric brep objects on the metal layer, with the post-compute parameters and the mother gem in the group's user data. A cluster that fails to compute throws with the kernel's message.","metadata":{"title":"Cluster","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#create","collection":"scripting","hash":"9567b26d9ff7b39333e1a3cfa742799c","indexed_by":"docs-index"}},{"content":"Cluster — Edit\n\nA cluster is read-only after creation. `ICluster` exposes no setters, so the geometry is fixed by the arguments passed to `Create` - to change a cluster, delete it and build a new one.\n\nWhat the handle exposes for reading:\n\n| Member | Meaning |\n|---|---|\n| `ClusterStoneCount` | How many small stones the cluster ended up with |\n| `ClusterStoneSize` | Computed diameter of those stones, mm |\n| `ClusterStoneWeight` | Carat weight of a single cluster stone |\n| `ClusterTotalWeight` | Carat weight of all the cluster stones together |\n| `GemShape`, `GemMaterial`, `GemCaratWeight` | The mother gem |\n\nPlus the shared `Id`, `MotherGemId`, `ObjectType`, `LayerName`, `Position`, and the two mutations every parametric object has, `Move()` and `Delete()` - both of which belong inside a `Transaction`.\n\n```python\nfrom ArtisanPlugin.Scripting import ClusterApi as cluster, Transaction\n\nwith Transaction.Begin(\"Cluster\"):\n    c = cluster.Create(gemId, stoneSize = 1.4, prongNumber = 3)\n\nprint(c.ClusterStoneCount, c.ClusterTotalWeight)\n```","metadata":{"title":"Cluster","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#edit","collection":"scripting","hash":"9b7dc2b24a17e96199ed9668a8f08ae7","indexed_by":"docs-index"}},{"content":"Cluster — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Cluster","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cluster/#queries","collection":"scripting","hash":"b11926df4c59ea3fcd0690efddbe36f1","indexed_by":"docs-index"}},{"content":"Cutters\n\n```python\nfrom ArtisanPlugin.Scripting import CutterApi as cutter\n```\n\nA cutter is the solid that opens the seat: the cone, the bearing and the drill hole a stone needs in order to sit in metal. You do not print the cutter - you build one per gem, then subtract them all from the piece with `BooleanApi.Difference` (see Gems) as the final \"make it solid\" step.\n\nCutters are built for a mother gem and stay linked to it. Unlike the other settings, `Create` works on a *list* of gems - or on the current selection - and returns one handle per gem, in input order.\n\nSizes and heights are percentages of the gem size, not millimetres. That is the tool's own convention and it applies to every `size*` and `height*` argument. The single exception is `gemInside`, which is millimetres added to the gem outline (negative shrinks it).","metadata":{"title":"Cutters","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/","collection":"scripting","hash":"a2e2d9ced6b8610cf5a64f6abce2344e","indexed_by":"docs-index"}},{"content":"Cutters — Create\n\n```python\ncutters = cutter.Create(gemIds = None, sizeTop = 0, sizeBottom = 0, sizeDrill = 0,\n                        heightTop = 0, heightCrown = 0, heightGirdle = 0,\n                        heightPavilion = 0, heightDrill = -1,\n                        gemInside = None, drillType = -1,\n                        fitToGem = False, clearance = None)      # -> [ICutter]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemIds` | `None` | The gems to cut. `None` or empty uses the gems currently selected |\n| `sizeTop` | `0` -> `40` | Width of the cutter at the top, % of gem size |\n| `sizeBottom` | `0` -> `40` | Width at the bottom, % of gem size |\n| `sizeDrill` | `0` -> `40` | Width of the drill body, % of gem size |\n| `heightTop` | `0` -> `100` | Height above the table, % of gem height |\n| `heightCrown` | `0` -> `34` | Crown section height, % of gem height |\n| `heightGirdle` | `0` -> `3` | Girdle band, above and below the girdle outline, % of gem height |\n| `heightPavilion` | `0` -> `71` | Depth of the pavilion cone tip below the girdle, % of gem height |\n| `heightDrill` | `-1` -> `200` | Drill body height, %. See below |\n| `gemInside` | unset | Millimetres added to the gem outline; negative shrinks it |\n| `drillType` | `-1` -> saved default | `0` gem shape, `1` round, `2` square, `3` hexagon |\n| `fitToGem` | `False` | `True` computes `gemInside`, `heightGirdle` and `heightPavilion` gem by gem, so the cutter encloses the real stone. See Fit to gem |\n| `clearance` | unset -> `0.05` | With `fitToGem`: the gap between the stone and the cutter, mm |","metadata":{"title":"Cutters","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#create","collection":"scripting","hash":"6fa5bb00eb7fd3feaae5f4ee03e9040f","indexed_by":"docs-index"}},{"content":"Cutters — Create\n\n`0` keeps the tool default, or your saved Cutter defaults when you have some - except for `heightDrill`, which uses `-1` as \"keep the default\" because `0` is meaningful there: `heightDrill = 0` disables the drill body entirely. `drillType` follows the same pattern with `-1`, and any value above `3` raises.\n\nPassing no gems and having nothing selected raises; so does any id in `gemIds` that is not a gem. Each cutter gets its own copy of the parameter model with its own gem baked in, all the new cutters land on the primary object layer, and they are added to a single new group so you can grab them in one go.\n\n```python\nfrom ArtisanPlugin.Scripting import CutterApi as cutter, BooleanApi as boolean, Transaction\n\nwith Transaction.Begin(\"Cut the seats\"):\n    cutters = cutter.Create(gemIds, sizeDrill = 55, drillType = 1)\n    boolean.Difference([shankId], [c.Id for c in cutters])\n```","metadata":{"title":"Cutters","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#create","collection":"scripting","hash":"ee501070448f525d466f27f777fdbc36","indexed_by":"docs-index"}},{"content":"Cutters — Fit to gem\n\nThe panel and `CutterApi` build the same geometry. The size arguments scale the gem outline, and the pavilion is a straight cone from the girdle band to a single point `heightPavilion` % below it. On a round brilliant that cone follows the stone. On fancy cuts (cushion, oval, pear…) the real pavilion is convex, so the cone can sit inside the stone just below the girdle.\n\n`fitToGem = True` solves this for every gem. It measures the gem's real mesh and computes the three values that make the cutter enclose the girdle and pavilion with `clearance` mm:\n\n- `gemInside` grows until the girdle zone clears the outline.\n- `heightGirdle` extends the band down to the lowest point that still hugs the outline. It never goes below the value you gave.\n- `heightPavilion` deepens the cone until every pavilion vertex, and the culet, is covered.\n\nThe crown, top and drill are design choices, so they stay as given. The panel's Fit to gem button does the same, and gives the same values.\n\n```python\nfrom ArtisanPlugin.Scripting import CutterApi as cutter, Transaction\n\nwith Transaction.Begin(\"Cutters for the fancy cuts\"):\n    cutters = cutter.Create(gemIds, fitToGem = True, clearance = 0.08)\n```","metadata":{"title":"Cutters","section":"Fit to gem","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#fit-to-gem","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#fit-to-gem","collection":"scripting","hash":"61d76b1cb8a9292c46084566127e5ee7","indexed_by":"docs-index"}},{"content":"Cutters — Edit\n\n`Create`, `Find` and `All` return an `ICutter` handle. Its setters regenerate the cutter in place, keeping the same id. Unlike `Create`, they take literal values, so `0` is a real zero:\n\n| Member | Meaning |\n|---|---|\n| `SizeTop` / `SizeBottom` / `SizeDrill` | The three widths, % of gem size. Setters: `SetSizeTop`, `SetSizeBottom`, `SetSizeDrill` |\n| `HeightTop` / `HeightCrown` / `HeightGirdle` / `HeightPavilion` / `HeightDrill` | The section heights, %. Setters: `SetHeightTop`… `SetHeightDrill` (`0` = no drill body) |\n| `GemInside` | Millimetres added to the gem outline. Setter: `SetGemInside` (signed) |\n| `DrillType` | `0` gem shape, `1` round, `2` square, `3` hexagon. Setter: `SetDrillType` |\n| `FitToGem(clearance = None)` | Refits `GemInside`, `HeightGirdle` and `HeightPavilion` to this cutter's gem, with a default clearance of 0.05 mm |\n| `GemShape` / `GemMaterial` / `GemCaratWeight` | The gem this cutter was built for |\n| `Id` / `MotherGemId` / `ObjectType` / `LayerName` / `Position` | The structural surface |\n\n`Move(vector)` and `Delete()` are available too. Wrap mutations in a `Transaction`.\n\n```python\nfrom ArtisanPlugin.Scripting import CutterApi as cutter, Transaction\n\nwith Transaction.Begin(\"Refit the selected cutters\"):\n    for c in cutter.Selected():\n        c.FitToGem(0.05)\n        print(c.GemShape, c.GemInside, c.HeightPavilion)\n```\n\nThrough MCP, `create_cutters` takes `fit_to_gem` and `clearance`, and `edit_object {\"fit_to_gem\": true}` refits an existing cutter.","metadata":{"title":"Cutters","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#edit","collection":"scripting","hash":"db53d95bce55d957109b7869ec091f4d","indexed_by":"docs-index"}},{"content":"Cutters — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Cutters","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/cutters/#queries","collection":"scripting","hash":"b41b767f8b4a33d5b58d5e3211230ccb","indexed_by":"docs-index"}},{"content":"Gems by network\n\n```python\nfrom ArtisanPlugin.Scripting import GemsByNetworkApi as gemsbynetwork\n```\n\nWhere gems on curve runs a single line of stones along one curve, gems by network fills a whole network of intersecting curves - the fan of stones across a cluster top, a lattice of pavé between rails - sizing the stones so they meet at the nodes. It is the Gems by Network tool, run from a script.","metadata":{"title":"Gems by network","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/","collection":"scripting","hash":"61f3a1ef6c28ee3085af1af50d5d2eed","indexed_by":"docs-index"}},{"content":"Gems by network — Create\n\n```python\ngemsbynetwork.Create(curveIds=None, gemSize=0, minDistance=0, moveInZ=NaN, fitToEnd=None)\n```\n\n| Parameter | Meaning |\n|---|---|\n| `curveIds` | The curves of the network (any Rhino curves). `None` or empty uses the current selection |\n| `gemSize` | Stone diameter, mm |\n| `minDistance` | Minimum metal between stones, mm |\n| `moveInZ` | Raises (or, negative, lowers) the stones off the curves, mm |\n| `fitToEnd` | `True` stretches each run so a stone lands on each curve end |\n\nMillimetres. `0` - or leaving an argument out - keeps the default: your saved Gems on Network defaults when there are any, otherwise the tool's (`gemSize` 1.0, `minDistance` 0.1, `moveInZ` 0, so the stones sit on the curves).\n\n`Create` returns the ids of the gems it baked:\n\n```python\nfrom ArtisanPlugin.Scripting import GemsByNetworkApi as gemsbynetwork, Transaction\n\nwith Transaction.Begin(\"Network pave\"):\n    ids = gemsbynetwork.Create(curve_ids, gemSize=1.2, minDistance=0.15)\nprint(len(ids), \"stones\")\n```","metadata":{"title":"Gems by network","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/#create","collection":"scripting","hash":"5c45cd8db50da66a73813f45769dfa29","indexed_by":"docs-index"}},{"content":"Gems by network — After creation\n\nGems by network is not a parametric type. The stones are baked as loose gems in a plain group: there is no handle to list, find or regenerate, and `ArtisanEdit` doesn't reopen the layout. To change the stones, edit them one by one like any other gem with `GemApi` - its handles take size, material, position and the rest - or delete the group and run `Create` again with new values.\n\nOver MCP, the same tool is `gems_on_network`.","metadata":{"title":"Gems by network","section":"After creation","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/#after-creation","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-by-network/#after-creation","collection":"scripting","hash":"5036591fc6975b61e6a53d5f84d50b42","indexed_by":"docs-index"}},{"content":"Gems on curve\n\n```python\nfrom ArtisanPlugin.Scripting import GemsOnCurveApi as gemsoncurve\n```\n\nA row of identical stones running along a line - the eternity band, the pavé line down a shoulder, the graduated run around a bezel - is laid out by spacing gems along a curve rather than placing them one by one. The tool walks an existing curve, fits as many stones of the given size and gap as will go, and can build the shared prongs and the seat cutters at the same time, exactly as the ArtisanGemsOnCurve panel does.\n\nThe parent here is a curve, not a gem. `curveId` must already be a curve in the active document, and the row keeps that link for the rest of its life - which is why the facade has `ForCurve(curveId)` where the single-gem settings have `ForGem(gemId)`, and why the handle exposes `CurveId`. On a multi-gem object like this one, `MotherGemId` is empty by design.","metadata":{"title":"Gems on curve","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/","collection":"scripting","hash":"24fd9a88a6e4b4a6332ad8141ccd959b","indexed_by":"docs-index"}},{"content":"Gems on curve — Create\n\n```python\nrow = gemsoncurve.Create(curveId, gemSize = 0, distance = 0,\n                         gemShape = None, gemMaterial = None,\n                         prongs = False, cutters = False,\n                         orientationIds = None)                   # -> IGemsOnCurve\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveId` | - | The parent curve - throws if the object is not a curve |\n| `gemSize` | `0` -> tool default `1.5` | Diameter of each stone, mm |\n| `distance` | `0` -> tool default `0.2` | Gap between consecutive stones, mm |\n| `gemShape` | `None` -> `ROUND` | Gem shape name, from the `GemApi` vocabulary |\n| `gemMaterial` | `None` -> `Diamond` | Gem material name, from the `GemApi` vocabulary |\n| `prongs` | `False` | Also build the shared prongs between the stones |\n| `cutters` | `False` | Also bake one cutter per gem, into a separate \"Cutters\" group |\n| `orientationIds` | `None` | Surfaces or breps to orient the stones onto |\n\nAll dimensions are millimetres, and `0` keeps the tool default - or the user's saved gems-by-curve defaults - for that parameter. `gemShape` and `gemMaterial` are matched case-insensitively, and hyphens or spaces are normalised to underscores, so `\"half moon\"`, `\"HALF-MOON\"` and `\"HALF_MOON\"` all resolve to the same shape; an unknown name throws `ArgumentException`.\n\nEverything is baked into one group carrying the row's parameters: the stones on the secondary gems layer, the prongs (when asked for) with the metal material in the same group, and the cutters (when asked for) in their own group on the primary object layer.","metadata":{"title":"Gems on curve","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#create","collection":"scripting","hash":"77dac28e8eb8d6e27f9add4c79bdd540","indexed_by":"docs-index"}},{"content":"Gems on curve — Create\n\n`Create` throws `ArgumentException` if `curveId` is not a curve or a vocabulary name is unknown, and `InvalidOperationException` if the geometry fails or no gems fit on that curve with the size and distance you gave - a short curve with large stones is the usual cause.","metadata":{"title":"Gems on curve","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#create","collection":"scripting","hash":"aac29dd628c223d0dc26482d476cdfa3","indexed_by":"docs-index"}},{"content":"Gems on curve — Edit\n\nThe row is read-only after creation: `IGemsOnCurve` carries no setters. To change the spacing or the stone, create a new row and `Delete()` the old one.\n\nWhat the handle exposes for reading:\n\n| Member | Meaning |\n|---|---|\n| `CurveId` | The parent curve the row was distributed along |\n| `StoneCount` | How many stones actually fitted |\n| `GemShape` | Shape of the repeated gem template |\n| `GemMaterial` | Material of the repeated gem template |\n| `GemCaratWeight` | Carat weight of a single stone in the row |\n\nPlus the shared `Id`, `MotherGemId` (empty - the parent is the curve), `ObjectType`, `LayerName`, `Position`, `Move(vector)` and `Delete()`. Those two mutations belong inside a `Transaction` so the edit lands as one undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import GemsOnCurveApi as gemsoncurve\n\nrow = gemsoncurve.Create(curveId, gemSize = 1.2, distance = 0.15,\n                         gemShape = \"ROUND\", prongs = True, cutters = True)\nprint(row.StoneCount, row.GemCaratWeight)\n```","metadata":{"title":"Gems on curve","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#edit","collection":"scripting","hash":"4ca33f0355b8dd8739b7606ea1d0d463","indexed_by":"docs-index"}},{"content":"Gems on curve — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForCurve(curveId)`.\n\n`ForCurve` returns every row built on that curve - there can be more than one.","metadata":{"title":"Gems on curve","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/gems-on-curve/#queries","collection":"scripting","hash":"954568ac95a89c5559f8bfdef5b31060","indexed_by":"docs-index"}},{"content":"Halo\n\n```python\nfrom ArtisanPlugin.Scripting import HaloApi as halo\n```\n\nA halo is the ring of small stones that frames the centre stone, sitting in a channel that follows the outline of the gem so the piece reads larger and brighter than the centre alone. The tool builds it as the ArtisanHalo panel does: it walks the mother gem's outline, spaces the small stones around it and raises the channel and prongs that hold them.\n\nEach halo is built around a mother gem and stays its parametric child - the group stores the computed parameters and the mother's id in its user data.","metadata":{"title":"Halo","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/","collection":"scripting","hash":"b888380c28bedca589c25631994f880f","indexed_by":"docs-index"}},{"content":"Halo — Create\n\n```python\nh = halo.Create(gemId, stoneSize = 1.2, stoneDistance = 0.2,\n                distanceToGem = 1.2, channelWidth = 1.5, channelHeight = 1.5,\n                prongType = \"NONE\", profile = None)          # -> IHalo\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it surrounds; must be a gem in the active document |\n| `stoneSize` | `1.2` | Diameter of each halo stone, mm |\n| `stoneDistance` | `0.2` | Minimum gap between neighbouring halo stones, mm |\n| `distanceToGem` | `1.2` | Distance from the mother gem to the halo channel, mm |\n| `channelWidth` | `1.5` | Width of the channel carrying the stones, mm |\n| `channelHeight` | `1.5` | Height of that channel, mm |\n| `prongType` | `\"NONE\"` | How the halo stones are held: `NONE`, `SHARED` or `SCALLOPED` - any other value is rejected |\n| `profile` | `None` | Resolves a `CHANNEL_PROFILE` asset by name; omitted = the default profile |\n| `prongMode` | `None` | The mother gem's prongs: `ROUND`, `CUSTOM` (the `prongProfile` section; a profile alone implies it) or `CLAW` - see Prong modes and claws |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the halo, when they have stored any. Passing an explicit `profile` skips the saved defaults entirely, because those defaults replace the whole model.\n\n`HaloApi` validates the mother shape. Halos are only available for ROUND, CUSHION, EMERALD, OVAL, RADIANT, ASSCHER and PEAR gems; anything else throws, as does an id that is not a gem at all.","metadata":{"title":"Halo","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#create","collection":"scripting","hash":"163c4cfae144c74b766aa07e64071a6e","indexed_by":"docs-index"}},{"content":"Halo — Create\n\nEverything is baked into a single group: the small stones as diamonds-without-ref on the secondary gems layer, the metal breps on the metal layer, with the post-compute parameters and the mother gem in the group's user data. A halo that fails to compute throws with the kernel's message.","metadata":{"title":"Halo","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#create","collection":"scripting","hash":"9baff67c4e98b98d1af337a69d44dcc2","indexed_by":"docs-index"}},{"content":"Halo — Edit\n\n`Create`, `Find` and `All` return an `IHalo` handle. Each setter regenerates the object in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetStoneSize(mm)` | Diameter of the halo stones - must be > 0 |\n| `SetStoneDistance(mm)` | Minimum gap between halo stones - must be > 0 |\n| `SetProngMode(mode)` | The mother gem's prongs: `ROUND`, `CUSTOM` or `CLAW`, with their claw values (`SetClawGemInside`, `SetClawTension`...) - see Prong modes and claws |\n\nFor reading, the handle reports `HaloStoneCount`, `HaloStoneSize`, `HaloStoneWeight` and `HaloTotalWeight`, `ProngMode` and the claw values, plus `GemShape`, `GemMaterial`, `GemCaratWeight` and the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`.\n\n```python\nfrom ArtisanPlugin.Scripting import HaloApi as halo, Transaction\n\nh = halo.Selected()[0]\nwith Transaction.Begin(\"Bigger halo stones\"):\n    h.SetStoneSize(1.4)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Halo","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#edit","collection":"scripting","hash":"758ad2e0e04fb5294e446812bac703f8","indexed_by":"docs-index"}},{"content":"Halo — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Halo","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/halo/#queries","collection":"scripting","hash":"54f1c65bff6a07a798ef9ed4450dd7cc","indexed_by":"docs-index"}},{"content":"Hidden halo\n\n```python\nfrom ArtisanPlugin.Scripting import HiddenHaloApi as hidden\n```\n\nA hidden halo is the ring of small stones tucked under the centre stone, set into a rail that faces outward so the sparkle only shows from the side profile - invisible from above, which is the whole point of the style. The tool builds it as the ArtisanHiddenHalo panel does: a parametric rail under the girdle, the small stones spaced along it, and the channel and prongs that hold them.\n\nEach hidden halo is built under a mother gem and stays its parametric child. Unlike the ordinary halo, the rail does not follow the gem's outline: its shape is chosen with `railShape`, which is why any centre-gem shape is accepted.","metadata":{"title":"Hidden halo","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/","collection":"scripting","hash":"14452bb5a9b7b82eed88bd7f2502f5a2","indexed_by":"docs-index"}},{"content":"Hidden halo — Create\n\n```python\nh = hidden.Create(gemId, stoneSize = 0.9, stoneDistance = 0.10,\n                  channelWidth = 1.1, channelHeight = 1.0,\n                  railShape = \"CIRCLE\", prongType = \"NONE\",\n                  profile = None)                            # -> IHiddenHalo\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it sits under; must be a gem in the active document |\n| `stoneSize` | `0.9` | Diameter of each hidden-halo stone, mm |\n| `stoneDistance` | `0.10` | Minimum gap between neighbouring stones, mm |\n| `channelWidth` | `1.1` | Width of the channel carrying the stones, mm |\n| `channelHeight` | `1.0` | Height of that channel, mm |\n| `railShape` | `\"CIRCLE\"` | `CIRCLE`, `SQUARE` (opens at 5.50 x 5.50) or `OVAL` (5.50 x 8.70) - any other value is rejected |\n| `prongType` | `\"NONE\"` | `NONE`, `SHARED` or `SCALLOPED` - any other value is rejected |\n| `profile` | `None` | Resolves a `CHANNEL_PROFILE` asset by name; omitted = the tool's `014` channel profile, falling back to the type default |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the hidden halo, when they have stored any. Passing an explicit `profile` skips the saved defaults entirely, because those defaults replace the whole model.\n\nEvery centre-gem shape is accepted - the shape check is there for symmetry with the other halo tools, but the rail is parametric rather than traced from the gem, so no shape is rejected. An id that is not a gem still throws.","metadata":{"title":"Hidden halo","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#create","collection":"scripting","hash":"ad15d5d2f10d184316e1d0543fca56fc","indexed_by":"docs-index"}},{"content":"Hidden halo — Create\n\nEverything is baked into a single group: the metal breps as parametric brep objects on the metal layer, the small stones as diamonds-without-ref on the secondary gems layer, with the parameters and the mother gem in the group's user data. A hidden halo that fails to compute throws with the kernel's message.","metadata":{"title":"Hidden halo","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#create","collection":"scripting","hash":"97a0f2fb88a7ffa79e0fc633d966a101","indexed_by":"docs-index"}},{"content":"Hidden halo — Edit\n\n`Create`, `Find` and `All` return an `IHiddenHalo` handle. Each setter regenerates the object in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetStoneSize(mm)` | Diameter of the hidden-halo stones - must be > 0 |\n| `SetStoneDistance(mm)` | Minimum gap between those stones - must be > 0 |\n\nFor reading, the handle reports `RailShape`, `StoneCount`, `StoneSize`, `StoneWeight` and `TotalStoneWeight`, plus `GemShape`, `GemMaterial`, `GemCaratWeight` and the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`. The rail shape is read-only once built - pick it at `Create`.\n\n```python\nfrom ArtisanPlugin.Scripting import HiddenHaloApi as hidden, Transaction\n\nh = hidden.Selected()[0]\nwith Transaction.Begin(\"Finer hidden halo\"):\n    h.SetStoneSize(0.8)\n    h.SetStoneDistance(0.08)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Hidden halo","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#edit","collection":"scripting","hash":"67f72d4df80409d7433360ffa79ab670","indexed_by":"docs-index"}},{"content":"Hidden halo — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Hidden halo","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/hidden-halo/#queries","collection":"scripting","hash":"c0bf55735175bc81858b20dbd624af9a","indexed_by":"docs-index"}},{"content":"Martini\n\n```python\nfrom ArtisanPlugin.Scripting import MartiniApi as martini\n```\n\nThe martini setting: four prongs that taper down from the girdle and meet in a point below the stone, so the head reads as a cone - the classic stud and solitaire mount that keeps as little metal as possible under the gem. RhinoArtisan adds an optional upper rail wrapping the girdle and two lateral side gems, and bakes the result as the `ArtisanMartini` tool does.\n\nA martini is built around a mother gem and stays its parametric child.","metadata":{"title":"Martini","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/","collection":"scripting","hash":"6760a6fc4763d9cc63c631a4c5ab0190","indexed_by":"docs-index"}},{"content":"Martini — Create\n\n```python\nm = martini.Create(gemId, prongHeight = 0, prongDiameterTop = 0,\n                   prongDiameterBottom = 0, upperRail = None,\n                   sideGems = None, sideGemSize = 0)                 # -> IMartini\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem |\n| `prongHeight` | `0` -> `5.40` | Height of the prongs, mm |\n| `prongDiameterTop` | `0` -> `1.30` | Prong diameter at the girdle, mm |\n| `prongDiameterBottom` | `0` -> `1.30` | Prong diameter where the prongs meet, mm |\n| `upperRail` | `None` -> enabled | The rail running under the girdle |\n| `sideGems` | `None` -> enabled | The two lateral side stones |\n| `sideGemSize` | `0` -> `1.40` | Size of those side stones, mm |\n| `prongMode` | `None` -> `ROUND` | `ROUND`, `CUSTOM` (the `prongProfileName` section; a profile alone implies it) or `CLAW` - see Prong modes and claws |\n\nMillimetres throughout; `0` (or `None` on the booleans) keeps the tool default, or your saved Martini defaults when you have some.\n\nNot every stone qualifies. `Create` rejects `TRIANGLE` and `COFFIN` gems - every other shape is martini-friendly. A `gemId` that is not a gem is rejected too.\n\nAs in the panel, the prongs' face-tangent behaviour is seeded from the gem's symmetry, the upper rail keeps a circular cross-section unless its mode is custom (height locked to width), and the side-gem drill cutter is always applied. The metal is baked as IIBrep objects; the two side gems go onto the secondary gems layer.","metadata":{"title":"Martini","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#create","collection":"scripting","hash":"26cf526b2fcd7e818839f4b67d7e5a63","indexed_by":"docs-index"}},{"content":"Martini — Edit\n\n`Create`, `Find` and `All` return an `IMartini` handle. Among its setters - each regenerates the martini in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetProngHeight(h)` | Prong height in mm. Must be `> 0` |\n| `SetSideGemSize(s)` | Size of the lateral side gems in mm. Must be `> 0` |\n| `SetProngMode(mode)` | `ROUND`, `CUSTOM` or `CLAW` |\n| `SetClawCapDistance` / `SetClawCapHeight` / `SetClawTipWidth` / `SetClawTipSmoothness` | The claw tips - see Prong modes and claws |\n\nIt also reads `ProngHeight`, `ProngDiameterTop`, `ProngDiameterBottom`, `ProngMode`, the four claw values, `UpperRailEnabled`, `SideGemsEnabled`, `SideGemSize`, the gem properties `GemShape`, `GemMaterial` and `GemCaratWeight`, and the structural `Id`, `MotherGemId`, `LayerName`, `Position`, `Move(vector)` and `Delete()`. The `IMartini` page lists every setter, the rail and the side gems included.\n\n```python\nfrom ArtisanPlugin.Scripting import MartiniApi as martini, Transaction\n\nm = martini.Selected()[0]\nwith Transaction.Begin(\"Lower martini\"):\n    m.SetProngHeight(4.8)\n    m.SetSideGemSize(1.2)\n```","metadata":{"title":"Martini","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#edit","collection":"scripting","hash":"a57719d83e65f889704e01bdc2fdc104","indexed_by":"docs-index"}},{"content":"Martini — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Martini","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/martini/#queries","collection":"scripting","hash":"4c82ddd1b3a3b0f6c99fb8ceb930dcf3","indexed_by":"docs-index"}},{"content":"Micro setting\n\n```python\nfrom ArtisanPlugin.Scripting import MicroSettingApi as micro\n```\n\nMicro setting is the metalwork that makes a run of small stones sit properly: a seat cut under each stone, a V-groove between them, optionally a channel wall along the run and prongs raised over the row. It does not create the gems - you place those first, then this tool builds the infrastructure around them, exactly as the ArtisanMicroSetting panel does.\n\nThis is a multi-gem object driven by a run of existing stones, so `MotherGemId` is empty by design; the parent stones are kept on the group as `motherGems`.","metadata":{"title":"Micro setting","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/","collection":"scripting","hash":"15481f33421b9338cc425cd0c95a88c6","indexed_by":"docs-index"}},{"content":"Micro setting — Create\n\n```python\nids = micro.Create(gemIds = None, cutters = None, vCutters = None,\n                   channel = None, rowProngs = None)          # -> object ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemIds` | `None` | The run of gems to set; `None` or empty uses the current selection. At least one is required, and every id must be a gem |\n| `cutters` | `None` (tool default on) | Seat cutter under each stone |\n| `vCutters` | `None` (tool default on) | V-cutters between the stones |\n| `channel` | `None` (tool default off) | Channel wall along the run |\n| `rowProngs` | `None` (tool default off) | Prongs raised over the row |\n\nThe four flags are nullable on purpose: pass `True` or `False` to force an element on or off, or leave them `None` to keep the tool's behaviour - or the user's saved micro-setting defaults where they exist. Every numeric parameter of the setting stays at its tool default; there is no way to override those from the script API.\n\n`Create` returns the ids of every object baked - cutters, V-cutters, the channel brep and the row prongs - each kind in its own Rhino sub-group, with the whole lot collected under one master `MicroSetting` group carrying the parameters and the parent gems.\n\n`Create` throws if no gems are given or selected, if any id is not a gem, if the computation fails with the given parameters, or if nothing at all was produced - which normally means every element was disabled.\n\n```python\nfrom ArtisanPlugin.Scripting import MicroSettingApi as micro, Transaction\n\nwith Transaction.Begin(\"Micro set the row\"):\n    ids = micro.Create(rowGemIds, channel = True, rowProngs = True)\n```\n\nMutations belong inside a `Transaction` so the whole build lands as one undo step.","metadata":{"title":"Micro setting","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#create","collection":"scripting","hash":"bd794fd0196cc0a480be71a0e03f26c3","indexed_by":"docs-index"}},{"content":"Micro setting — Edit\n\nThe `IMicroSetting` handle is query-only - it has no setters. Once a micro setting exists you can read how it was configured and where it sits, but changing it means deleting it and calling `Create` again with different flags.\n\n| Property | Meaning |\n|---|---|\n| `ChannelEnabled` | Whether the setting carries a channel wall |\n| `RowProngsEnabled` | Whether the setting carries row prongs |\n| `CuttersCount` | `1` when the setting has a cutters block, `0` otherwise |\n| `VCuttersCount` | `1` when the setting has a V-cutters block, `0` otherwise |\n\n`CuttersCount` and `VCuttersCount` report the presence of the model's single cutters block, not the number of cutter solids in the document - the model holds one block that drives the whole run.\n\nOn top of these the handle carries the shared `Id`, `ObjectType` (`\"MicroSetting\"`), `MotherGemId` (always empty here), `LayerName`, `Position`, plus `Move()` and `Delete()`.","metadata":{"title":"Micro setting","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#edit","collection":"scripting","hash":"f91ed8e5c6e87014da19f3feb3136234","indexed_by":"docs-index"}},{"content":"Micro setting — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.\n\nThese resolve micro-setting custom objects in the active document and return `IMicroSetting` handles for them.","metadata":{"title":"Micro setting","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/micro-setting/#queries","collection":"scripting","hash":"5f65dd22ef53f057ffef6dccd9c82319","indexed_by":"docs-index"}},{"content":"Pave on surface\n\n```python\nfrom ArtisanPlugin.Scripting import PaveApi as pave\n```\n\nPavé is a field of small stones set close together so the metal all but disappears under them. Rather than placing each stone by hand, this tool takes any surface, brep or mesh, meshes it at high resolution and packs diamonds across it automatically, optionally adding the prongs that hold them and the cutters that seat them - the headless form of the ArtisanPaveOnCurve tool.\n\n`OnSurface` is the only method on this facade.","metadata":{"title":"Pave on surface","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/","collection":"scripting","hash":"298a430f1d97eaabd3610dc123a6e62c","indexed_by":"docs-index"}},{"content":"Pave on surface — Create\n\n```python\nids = pave.OnSurface(surfaceIds, gemDiameter = 0, prongDiameter = 0,\n                     distanceToBorder = 0, prongs = True, cutters = False,\n                     variableSize = None, fillMode = None,\n                     startPoint = None)                        # -> gem ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `surfaceIds` | - | One or more surfaces, breps or meshes to pave - throws if empty or unmeshable |\n| `gemDiameter` | `0` (tool default `1.3`) | Stone diameter, mm |\n| `prongDiameter` | `0` (tool default `0.8`) | Prong diameter, mm |\n| `distanceToBorder` | `0` (tool default `0.1`) | Margin kept clear at the edge of the surface, mm |\n| `prongs` | `True` | Build the prongs between the stones |\n| `cutters` | `False` | Build a seat cutter under each stone |\n| `variableSize` | `None` | Let stones shrink towards `0.9` mm to fill the awkward areas; `None` keeps the tool default |\n| `fillMode` | `None` | `\"FROM_BORDER\"` (default) or `\"FROM_CENTER\"` |\n| `startPoint` | unset | Seed point for `FROM_CENTER`; ignored otherwise |\n\nAll dimensions are millimetres, and `0` keeps the tool default for that parameter, so you only pass what you actually mean to change.\n\nFill modes. `FROM_BORDER` starts the packing at the edges of the surface and works inwards - the usual choice, and what you get if you pass nothing. `FROM_CENTER` grows the field outwards from a seed, and requires `startPoint`: pass a point on or near the surface and it is pulled to the closest point on the mesh before packing starts. Omitting it throws. The mode string is matched loosely, so `\"FROM_CENTER\"`, `\"from center\"` and `\"CENTER\"` all work; anything else throws.","metadata":{"title":"Pave on surface","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/#create","collection":"scripting","hash":"6ccbb580e860071b8e723c046a081bd6","indexed_by":"docs-index"}},{"content":"Pave on surface — Edit\n\nThere is no pavé handle. `OnSurface` returns the ids of the created gems only - unlisted gemstones on the secondary gems layer, collected in one Rhino group. Prongs and cutters are baked too, each into its own group, but their ids are not returned; pick them up from the document if you need them.\n\nThis is a multi-gem, surface-driven object: `MotherGemId` does not apply, and the gems come back as ordinary gem objects you can query, move or delete individually. To change the packing, delete the field and call `OnSurface` again.\n\n```python\nfrom ArtisanPlugin.Scripting import PaveApi as pave, Transaction\n\nwith Transaction.Begin(\"Pave the dome\"):\n    gems = pave.OnSurface([domeId], gemDiameter = 1.1,\n                          variableSize = True, cutters = True)\n```\n\nMutations belong inside a `Transaction` so the whole field lands as one undo step.\n\n`OnSurface` throws if no valid object is passed, if the objects cannot be meshed, if the computation fails, or if the packing produces no gems at all - which usually means the surface is too small for the requested `gemDiameter`.","metadata":{"title":"Pave on surface","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pave-on-surface/#edit","collection":"scripting","hash":"32f37c5fe179b1e8dafbe1b27e00a2f7","indexed_by":"docs-index"}},{"content":"Pearl\n\n```python\nfrom ArtisanPlugin.Scripting import PearlApi as pearl\n```\n\nA pearl is set differently from a faceted stone: it is drilled rather than gripped, so it sits on a calotte - the little metal cup that hides the drill hole - and is threaded onto a wire post glued into the hole. That trio is the whole of a classic pearl stud earring, and the tool builds all three at once, exactly as the ArtisanPearl panel's Accept does.\n\nUnlike the bezel, peghead or basket, `PearlApi` is not wrapped around a mother gem: it is a standalone stone creator. It makes its own sphere on the plane you give it, so there is no `gemId` argument, no `ForGem` query, and `MotherGemId` on the handle is always empty.","metadata":{"title":"Pearl","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/","collection":"scripting","hash":"0081f9bb7166ce7a890186eafe246471","indexed_by":"docs-index"}},{"content":"Pearl — Create\n\n```python\np = pearl.Create(diameter = 0, calotte = None, calotteAngle = 0, calotteThickness = 0,\n                 wire = None, wireDiameter = 0, wireLength = 0, plane = None)   # -> IPearl\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `diameter` | `0` -> tool default `6` | Pearl sphere diameter, mm |\n| `calotte` | `None` -> keep the tool default (enabled) | Whether to bake the metal cup |\n| `calotteAngle` | `0` -> tool default `35` | How far the cup wraps up the pearl, degrees |\n| `calotteThickness` | `0` -> tool default `1` | Metal thickness of the cup, mm - must exceed 0.2 |\n| `wire` | `None` -> keep the tool default (enabled) | Whether to bake the post |\n| `wireDiameter` | `0` -> tool default `1` | Post diameter, mm |\n| `wireLength` | `0` -> tool default `8` | Post length, mm |\n| `plane` | omitted -> world XY | The plane the pearl is built on |\n\nAll dimensions are millimetres, and `0` keeps the tool default for that parameter - or the user's saved pearl defaults when they have any, since `Create` starts from the same model the ArtisanPearl command does.","metadata":{"title":"Pearl","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#create","collection":"scripting","hash":"97eb5a43a6a2a1f194d6491fb815a15a","indexed_by":"docs-index"}},{"content":"Pearl — None versus False on calotte and wire\n\nThese two are nullable booleans, and the three states are genuinely different:\n\n| Value | Effect |\n|---|---|\n| `None` (omitted) | Leave the flag as the tool - or the user's saved defaults - has it. Out of the box that means enabled, so a bare `pearl.Create()` gives you a pearl *with* a calotte and a wire |\n| `False` | Explicitly disable that part - the child is not computed and not baked |\n| `True` | Explicitly enable it, even if the saved defaults had it off |\n\nSo `None` is not \"off\": omitting `calotte` keeps the calotte. Pass `False` when you want a bare pearl.","metadata":{"title":"Pearl","section":"None versus False on calotte and wire","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#none-versus-false-on-calotte-and-wire","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#none-versus-false-on-calotte-and-wire","collection":"scripting","hash":"3c9898990f2cfb9ee9a78395c27f685a","indexed_by":"docs-index"}},{"content":"Pearl — What gets baked\n\nThe pearl itself goes on the last gems layer with the pearl material. Each enabled child is then baked as its own object - a pearl-calotte object and a pearl-wire object - on the metal layer with the metal material, and linked back to the pearl so the handle can find them. A child that fails to compute is simply not added, so always check `HasCalotte` / `HasWire` rather than assuming.\n\n`Create` throws `InvalidOperationException` when the geometry fails to compute - a calotte thickness of 0.2 mm or less is the usual cause - or when the licence is invalid.","metadata":{"title":"Pearl","section":"What gets baked","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#what-gets-baked","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#what-gets-baked","collection":"scripting","hash":"95e072641b2579d73148dce0c5cebfe5","indexed_by":"docs-index"}},{"content":"Pearl — Edit\n\nThe pearl is read-only after creation: the parametric engine has no regenerate step for pearls, so `IPearl` carries no setters. To change a dimension, create a new pearl and `Delete()` the old one.\n\nWhat the handle exposes for reading:\n\n| Member | Meaning |\n|---|---|\n| `Diameter` | Pearl sphere diameter, mm |\n| `HasCalotte` | A calotte child was baked with this pearl |\n| `HasWire` | A wire child was baked with this pearl |\n| `CalotteId` | Guid of the calotte object, empty when there is none |\n| `WireId` | Guid of the wire object, empty when there is none |\n\nPlus the shared `Id`, `MotherGemId` (always empty), `ObjectType`, `LayerName`, `Position`, `Move(vector)` and `Delete()`. Those two mutations belong inside a `Transaction` so the edit lands as one undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import PearlApi as pearl\n\np = pearl.Create(diameter = 8, calotte = True, calotteThickness = 0.8, wire = False)\nprint(p.Diameter, p.HasCalotte, p.HasWire)     # 8.0 True False\n```\n\n`Move()` and `Delete()` act on the pearl object; use `CalotteId` and `WireId` if you need to reach the metal children directly.","metadata":{"title":"Pearl","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#edit","collection":"scripting","hash":"b9e6baa28b17f8ebcee399f422c79743","indexed_by":"docs-index"}},{"content":"Pearl — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.\n\nThere is no `ForGem` - a pearl has no mother gem.","metadata":{"title":"Pearl","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/pearl/#queries","collection":"scripting","hash":"785c11a2ab5184ad524d6162b0c73468","indexed_by":"docs-index"}},{"content":"Peghead\n\n```python\nfrom ArtisanPlugin.Scripting import PegheadApi as peghead\n```\n\nA peghead is the prong head that grips a stone from above and carries it on a peg - the small claw crown you solder or set into a shank, a pendant or an earring. The tool sweeps a `PEGHEAD_PROFILE` section along each prong, seats the claws on the girdle and closes the head under the pavilion, exactly as the ArtisanPeghead panel does.\n\nIt is built around a mother gem and stays its parametric child: `gemId` must already be a gem in the active document.","metadata":{"title":"Peghead","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/","collection":"scripting","hash":"af74f462f0b59e90c88a6bf1fe262c58","indexed_by":"docs-index"}},{"content":"Peghead — Create\n\n```python\np = peghead.Create(gemId, prongs = 4, height = 5, thickness = 1,\n                   girdleWidth = 0.8, overGirdleHeight = 1,\n                   gemInside = 0, profile = None)               # -> IPeghead\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem it holds - throws if the object is not a gem |\n| `prongs` | `4` | Number of prongs; `0` keeps the default. Negative counts give the rotated variant (`-4` = 4 prongs turned 45 degrees) |\n| `height` | `5` | Total head height, mm |\n| `thickness` | `1` | Prong thickness, mm |\n| `girdleWidth` | `0.8` | How far the claw bites over the girdle, mm |\n| `overGirdleHeight` | `1` | How high the claw rises above the girdle, mm |\n| `gemInside` | `0` | How deep the stone sits inside the head, mm - accepts negatives |\n| `profile` | `None` | `PEGHEAD_PROFILE` asset by name - see `AssetsApi.List(\"PEGHEAD_PROFILE\")` |\n\nMillimetres throughout, and `0` keeps the tool default - or the user's saved defaults for the peghead, when they have stored any. Passing an explicit `profile` skips those saved defaults, since they replace the whole model, profile included.\n\nThe baked head goes onto the metal layer and gets the current metal material, like the tool's Accept. `Create` throws if `gemId` is not a gem or if the geometry fails to compute.","metadata":{"title":"Peghead","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#create","collection":"scripting","hash":"df4466c093ce4871e90e783355cf9d56","indexed_by":"docs-index"}},{"content":"Peghead — Edit\n\n`Create`, `Find` and `All` return an `IPeghead` handle. Each setter regenerates the object in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetProngs(n)` | Prong count; `0` is rejected, negatives give the rotated variant |\n| `SetHeight(mm)` | Total head height - must be > 0 |\n| `SetThickness(mm)` | Prong thickness - must be > 0 |\n| `SetGirdleWidth(mm)` | Bite over the girdle - must be > 0 |\n| `SetOverGirdleHeight(mm)` | Claw height above the girdle - must be > 0 |\n| `SetGemInside(mm)` | Seat depth of the stone; accepts any value, including negatives |\n\nThe handle also reports `GemShape`, `GemMaterial` and `GemCaratWeight` for the mother stone, plus the shared `Id`, `MotherGemId`, `LayerName`, `Position`, `Move()` and `Delete()`.\n\n```python\nfrom ArtisanPlugin.Scripting import PegheadApi as peghead, Transaction\n\np = peghead.Selected()[0]\nwith Transaction.Begin(\"Six rotated prongs\"):\n    p.SetProngs(-6)\n    p.SetThickness(0.9)\n```\n\nMutations belong inside a `Transaction` so the whole edit lands as one undo step.","metadata":{"title":"Peghead","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#edit","collection":"scripting","hash":"7083872555ee4695161d348cc378d5cd","indexed_by":"docs-index"}},{"content":"Peghead — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Peghead","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/peghead/#queries","collection":"scripting","hash":"20d9dbaf161da271f8df9d6b99a378bd","indexed_by":"docs-index"}},{"content":"Trellis\n\n```python\nfrom ArtisanPlugin.Scripting import TrellisGemsetApi as trellis\n```\n\nThe trellis gemset: four prongs that leave the gem girdle and cross past each other on their way down to the ring, so the head reads as a woven basket seen from the side rather than four straight claws. RhinoArtisan builds the prongs between the girdle and a ring curve, adds an optional upper rail wrapping the stone, and bakes the metal as the `ArtisanTrellisGemset` tool does.\n\nA trellis gemset is built around a mother gem and stays its parametric child.","metadata":{"title":"Trellis","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/","collection":"scripting","hash":"d727804970a648ad81e13e34e23b425f","indexed_by":"docs-index"}},{"content":"Trellis — Create\n\n```python\nt = trellis.Create(gemId, prongsDiameter = 0, openingAngle = 0,\n                   curveVerticalSeparation = 0, railWidth = 0, railHeight = 0,\n                   rotate90 = False, ringCurveId = None)          # -> ITrellisGemset\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem |\n| `prongsDiameter` | `0` -> `1.05` | Diameter of the crossing prongs, mm |\n| `openingAngle` | `0` -> `52` | How wide the prongs splay as they descend, degrees |\n| `curveVerticalSeparation` | `0` -> `5.6` | Gap between the girdle plane and the top of the auto-generated ring curve, mm |\n| `railWidth` | `0` -> `1.5` | Upper rail width, mm |\n| `railHeight` | `0` -> `1.2` | Upper rail height, mm |\n| `rotate90` | `False` | Rotates the whole gemset 90 degrees about the gem's table normal. `False` keeps the model's own value |\n| `prongMode` | `None` -> `ROUND` | The top of every prong: `ROUND` or `CLAW` - see Prong modes and claws |\n| `ringCurveId` | `Guid.Empty` | An existing document curve the prongs land on. Empty generates the default circle under the gem |\n\nMillimetres and degrees; `0` keeps the tool default, or your saved Trellis defaults when you have some. The upper rail's external X/Y are always re-seeded from *this* gem, so the rail wraps this girdle no matter what the saved defaults held.\n\nNot every stone qualifies. `Create` rejects pointed and irregular outlines: `PEAR`, `HEART`, `TRILLION`, `TRIANGLE`, `CALF`, `COFFIN` and `BAGUETTE`.","metadata":{"title":"Trellis","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#create","collection":"scripting","hash":"f0579b3051c9c7a8dd21e652f2908f2c","indexed_by":"docs-index"}},{"content":"Trellis — Create\n\nIf you pass a `ringCurveId` it must be a valid curve entirely below the gem girdle plane - the construction assumes the prongs descend onto it - otherwise creation raises. Leave it empty and the tool builds the panel's own curve: a circle at the document's finger-size radius, in the gem's vertical plane, whose top sits `curveVerticalSeparation` below the girdle, oriented to the shank axis (turned to world Y when `rotate90` is set).","metadata":{"title":"Trellis","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#create","collection":"scripting","hash":"a82fe3f575f337696a9caa61c95bb819","indexed_by":"docs-index"}},{"content":"Trellis — Edit\n\n`Create`, `Find` and `All` return an `ITrellisGemset` handle. Its setters regenerate the trellis in place, keeping its Guid: the prong mode and the claw (see Prong modes and claws), the bottom profile, the prong diameter and opening angle, the rail and more - the handle page lists them all. Among what it reads:\n\n| Member | Meaning |\n|---|---|\n| `ProngsDiameter` | Diameter of the crossing prongs, mm |\n| `OpeningAngle` | Splay of the prongs, degrees |\n| `CurveVerticalSeparation` | Girdle-to-ring-curve gap, mm - only meaningful when no curve was picked |\n| `UpperRailEnabled` | Whether the rail under the girdle is on |\n| `ProngMode` | `ROUND` or `CLAW`, the top of every prong |\n| `RingCurveId` | Guid of the curve it was built on, or empty when the default curve was generated |\n| `GemShape` / `GemMaterial` / `GemCaratWeight` | Resolved live from the mother gem in the document, not from stored parameters |\n| `Id` / `MotherGemId` / `ObjectType` / `LayerName` / `Position` | The structural surface |\n| `Move(vector)` / `Delete()` | Translate or remove the whole group - both belong inside a `Transaction` |\n\n```python\nfrom ArtisanPlugin.Scripting import TrellisGemsetApi as trellis\n\nfor t in trellis.All():\n    print(t.GemShape, t.ProngsDiameter, t.OpeningAngle, t.UpperRailEnabled)\n```","metadata":{"title":"Trellis","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#edit","collection":"scripting","hash":"597c07e9263ccef879a5cb2e6e1c79d7","indexed_by":"docs-index"}},{"content":"Trellis — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Trellis","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/trellis/#queries","collection":"scripting","hash":"d3649c2c5a01efa7d804ae864c2718b6","indexed_by":"docs-index"}},{"content":"Tulip\n\n```python\nfrom ArtisanPlugin.Scripting import TulipApi as tulip\n```\n\nThe tulip head: four or six petal-shaped prongs that rise from under the girdle and fold over the stone, so the setting reads as an opening flower rather than a bare claw. RhinoArtisan builds it as SubD petals - the `ArtisanTulip` tool, headless - and bakes them as plain SubD objects with the metal material.\n\nA tulip is built around a mother gem and stays its parametric child: the group records the gem's Guid, and the petals are regenerated from it on every edit.","metadata":{"title":"Tulip","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/","collection":"scripting","hash":"4cfab896dffdc7699798ee9ccc788aa2","indexed_by":"docs-index"}},{"content":"Tulip — Create\n\n```python\nt = tulip.Create(gemId, prongCount = 0, pipeDiameter = 0, height = 0,\n                 bulgeWidth = 0, mode = None, ornament = None)        # -> ITulip\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemId` | - | The mother gem. Any gem shape works |\n| `prongCount` | `0` -> `4` | Number of petals. Only `4` or `6` are accepted |\n| `pipeDiameter` | `0` -> `1.15` | Petal pipe diameter, mm |\n| `height` | `0` -> `1.7` | Vertical scale factor of the whole setting - not millimetres |\n| `bulgeWidth` | `0` -> `1.5` | Multiplier on the reference tangential bow of the petals |\n| `prongMode` | `None` -> `ROUND` | `ROUND` or `CLAW` (`mode` is its older name) - see Prong modes and claws |\n| `ornament` | `None` -> `NONE` | `NONE`, `UNION` or `LEAF` |\n\n`0` (or `None`) keeps the tool default, or your saved Tulip defaults when you have some - the same starting model the panel opens with. Passing a `prongCount` other than 4 or 6, an unknown `mode`, or an unknown `ornament` raises straight away; a `gemId` that is not a gem is rejected too.\n\nOn an asymmetric stone - oval, marquise, anything where the X and Y sizes differ by more than 0.01 mm - the ornament placement defaults to the X axis with per-axis leaf editing, exactly as the panel does. Symmetric stones keep a single shared set of leaves.","metadata":{"title":"Tulip","section":"Create","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#create","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#create","collection":"scripting","hash":"365dabc7402bdbcc3873cf3c7353e190","indexed_by":"docs-index"}},{"content":"Tulip — Edit\n\n`Create`, `Find` and `All` return an `ITulip` handle. Among its setters - each regenerates the tulip in place, keeping its Guid and undo intact:\n\n| Setter | What it changes |\n|---|---|\n| `SetPipeDiameter(d)` | Petal pipe diameter in mm. Must be `> 0` |\n| `SetHeight(h)` | Vertical scale factor of the setting, not mm. Must be `> 0` |\n| `SetProngMode(mode)` | `ROUND` or `CLAW` |\n| `SetClawCapDistance` / `SetClawCapHeight` / `SetClawTipWidth` / `SetClawTipSmoothness` / `SetClawTipLength` | The claw tips - see Prong modes and claws |\n\nIt also reads `ProngCount`, `PipeDiameter`, `Height`, `ProngMode` (`Mode` is its older name), the claw values, `Ornament`, plus the gem properties `GemShape`, `GemMaterial` and `GemCaratWeight` and the structural `Id`, `MotherGemId`, `LayerName`, `Position`, `Move(vector)` and `Delete()`. The `ITulip` page lists every setter, the prong count and the ornament included.\n\n```python\nfrom ArtisanPlugin.Scripting import TulipApi as tulip, Transaction\n\nt = tulip.Selected()[0]\nwith Transaction.Begin(\"Taller tulip\"):\n    t.SetPipeDiameter(1.3)\n    t.SetHeight(2.0)\n```","metadata":{"title":"Tulip","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#edit","collection":"scripting","hash":"2bd44634ca6dec12be7357087ee17aa9","indexed_by":"docs-index"}},{"content":"Tulip — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`, `ForGem(gemId)`.","metadata":{"title":"Tulip","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/gemsets/tulip/#queries","collection":"scripting","hash":"9504f63160195c6a6e6dd5311753872f","indexed_by":"docs-index"}},{"content":"Integrations\n\n```python\nfrom ArtisanPlugin.Scripting import NivodaApi as nivoda\n```\n\nA bridge beyond the document: certified-diamond sourcing. (Searching your own design library is File Search; the natural-language summary of the design itself lives on Document.)\n\nNivoda Certified-diamond search with your saved filter.","metadata":{"title":"Integrations","url":"https://www.rhinoartisan.com/docs/scripting/reference/integrations/","source":"https://www.rhinoartisan.com/docs/scripting/reference/integrations/","collection":"scripting","hash":"a9ec56462d2abbe32af07c4a995bfc4d","indexed_by":"docs-index"}},{"content":"Integrations — Nivoda\n\nCertified-diamond search (`NivodaApi`) through your configured Nivoda integration, using your saved filter (colors, clarity, cut, availability):\n\n```python\nstones = nivoda.Search(\"ROUND\", 1.0, labGrown = False)\nfor s in stones:\n    print(s.Price / 100.0, s.NivodaDiamond.Certificate.Color)   # Price is in cents\nnivoda.ClearCache()      # results are cached ~30 minutes; force a live query\n```\n\nEach result carries price, discount, availability, image/video URLs and the full certificate (lab, cut, clarity, color, polish, symmetry, measurements).\n\nRequires Nivoda credentials in Options → Integrations; the error tells you if they're missing. Network call — the document is never touched.","metadata":{"title":"Integrations","section":"Nivoda","url":"https://www.rhinoartisan.com/docs/scripting/reference/integrations/#nivoda","source":"https://www.rhinoartisan.com/docs/scripting/reference/integrations/#nivoda","collection":"scripting","hash":"d5f887f2f122b7b650e07569ef0ee000","indexed_by":"docs-index"}},{"content":"Manufacturing\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing, MeshApi as mesh\n```\n\nThe road from a finished design to a printable, castable file — in the order a production run actually happens. Each step has its own page.\n\nPrepare\nRepair Automatic mesh repair toward a watertight print.\n\nVerify The printability quick-check, per object.\n\nIdentify Emboss an identifier on the piece.","metadata":{"title":"Manufacturing","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/","collection":"scripting","hash":"1bae86a58fee171e4e35296e7cebcafd","indexed_by":"docs-index"}},{"content":"Manufacturing — Sprue\n\nThe feed system for casting. Eleven layouts, from a single feed to full trees:\n\nSingle One feed onto one point.\n\nInner tree A trunk through the rings, feeding inward.\n\nInner branches Branches feeding the inside faces.\n\nExternal tree A trunk beside the pieces, feeding outward faces.\n\nExternal frames Frames around the pieces from outside.\n\nTree The classic casting tree.\n\nCluster tree A tree of clustered levels.\n\nCurve A sprue swept along your own curve.\n\nHelix Copies wound up a helical feed.\n\nSpiral Copies laid along a flat spiral.\n\nMultiple copies An array of copies, each with its feed.","metadata":{"title":"Manufacturing","section":"Sprue","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/#sprue","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/#sprue","collection":"scripting","hash":"617c54a5e496d1b1e590c2b1c11a1fc7","indexed_by":"docs-index"}},{"content":"Manufacturing — Produce\n\nSize run The same ring in every size, ready to cast.\n\nDecimator Lighter meshes, by target or by tolerance.\n\nConventions\nMillimetres, `0` keeps the tool default (or your saved defaults), and every one of these mutates the document — wrap the run in a `Transaction` for one-step undo. Exporting the result as STL is `DocumentApi.Stl`.","metadata":{"title":"Manufacturing","section":"Produce","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/#produce","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/#produce","collection":"scripting","hash":"4a9a5fba6330b56f6c5ea47e74f9ad97","indexed_by":"docs-index"}},{"content":"Decimator\n\n```python\nfrom ArtisanPlugin.Scripting import MeshApi as mesh\n```\n\nRepaired and scanned meshes are heavy — millions of faces that slow down slicers, viewers and file transfers. Two reducers, with opposite priorities: `Decimate` hits a face count and lets the shape suffer; `DecimateToTolerance` guarantees the shape stays within a deviation budget and takes whatever face count falls out. For final delivery of jewellery geometry, the tolerance-driven one is usually the right tool.\n\nBoth replace each mesh in place, keeping its Guid, so wrap the calls in a `Transaction`. In both, `objectIds = None` (or empty) means the current selection, and non-mesh objects are skipped silently.","metadata":{"title":"Decimator","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/","collection":"scripting","hash":"bda0240bc3bc7aa03bfc1148d46ea97e","indexed_by":"docs-index"}},{"content":"Decimator — Decimate\n\nRhino's quadric edge-collapse reduction (the ArtisanMeshDecimate command, headless). Distortion is allowed: the reducer prioritises hitting the target face count over shape fidelity, so heavy percentages give a faceted low-poly look.\n\n```python\nr = mesh.Decimate(objectIds = None, percentage = 50)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` = current selection | Meshes to decimate |\n| `percentage` | `50` | Faces to remove, 1–99. `percentage = 80` keeps 20% of the faces |\n\nThe target is floored at 4 faces, so a tiny mesh never collapses to nothing. A mesh whose reduction fails is skipped and simply not counted.\n\nReturns a `DecimateResult` with the totals, so the script can report \"N meshes: X faces → Y faces\":\n\n| Field | Type | Meaning |\n|---|---|---|\n| `MeshesDecimated` | `int` | Meshes actually replaced |\n| `FacesBefore` | `int` | Total faces across those meshes, before |\n| `FacesAfter` | `int` | Total faces after |\n\nValidation that throws:\n\n- Out-of-range percentage: `\"Percentage must be between 1 and 99.\"`\n- No meshes at all: `\"Nothing to decimate: select (or pass) at least one mesh.\"`","metadata":{"title":"Decimator","section":"Decimate","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimate","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimate","collection":"scripting","hash":"2c70c874c21af0da40a9dfb58b483354","indexed_by":"docs-index"}},{"content":"Decimator — DecimateToTolerance\n\nReduces each mesh as much as a deviation budget allows (the ArtisanMeshDecimateTolerance command, headless): the mesh is taken to the heaviest reduction whose result still stays within `toleranceMm` of the original surface. The shape is guaranteed; the face count is whatever falls out.\n\n```python\nr = mesh.DecimateToTolerance(objectIds = None, toleranceMm = 0)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` = current selection | Meshes to decimate |\n| `toleranceMm` | `0` = `0.05` | Maximum deviation from the original surface, in millimetres, regardless of the document's units. Valid range 0.001–100 |\n\nA mesh that cannot lose even one percent within the tolerance is left untouched and counted in `MeshesUnchanged` — the call never makes a mesh worse than the budget just to shrink it.\n\nReturns a `DecimateToleranceResult`:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `MeshesDecimated` | `int` | Meshes replaced |\n| `MeshesUnchanged` | `int` | Meshes left untouched because nothing fit the budget |\n| `TrianglesBefore` | `int` | Total triangles before, across the decimated meshes |\n| `TrianglesAfter` | `int` | Total triangles after |\n| `MaxDeviationMm` | `float` | Largest deviation across every decimated mesh (mm) — always ≤ `toleranceMm` |\n\nThe counts are in triangles, not faces: the reducer triangulates quads first, so a quad mesh's face count is not comparable with the result's.\n\nValidation that throws:\n\n- Out-of-range tolerance: `\"Tolerance must be between 0.001 and 100 mm.\"`\n- No meshes at all: `\"Nothing to decimate: select (or pass) at least one mesh.\"`\n\n```python\nfrom ArtisanPlugin.Scripting import MeshApi as mesh, Transaction","metadata":{"title":"Decimator","section":"DecimateToTolerance","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimatetotolerance","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimatetotolerance","collection":"scripting","hash":"53f7079c7d489279aaa84cf92580837b","indexed_by":"docs-index"}},{"content":"Decimator — DecimateToTolerance\n\nwith Transaction.Begin(\"Decimate for delivery\"):\n    r = mesh.DecimateToTolerance(toleranceMm = 0.05)\n    print(f\"{r.MeshesDecimated} meshes: {r.TrianglesBefore} -> {r.TrianglesAfter} triangles, \"\n          f\"max deviation {r.MaxDeviationMm:.3f} mm ({r.MeshesUnchanged} unchanged)\")\n```","metadata":{"title":"Decimator","section":"DecimateToTolerance","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimatetotolerance","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/decimator/#decimatetotolerance","collection":"scripting","hash":"046e0bfa6e1df0b2f8d5d228f87f1db7","indexed_by":"docs-index"}},{"content":"Identify\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nWhen several designs go into one casting flask, each ring needs its reference engraved so the pieces can be told apart after burnout. `AddIdentifier` is the ArtisanIdentifier tool run headless: a pipe between two points on the mesh carrying the engraved reference text. The two points play the role of the tool's two interactive picks — both should lie on or near the mesh.","metadata":{"title":"Identify","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/","collection":"scripting","hash":"69ca47de0880bc107960d9f0b535d882","indexed_by":"docs-index"}},{"content":"Identify — Usage\n\n```python\ntagged = manufacturing.AddIdentifier(meshId, point1, point2, text = \"REF-001\",\n                                     diameter = 0, thickness = 0,\n                                     fontSize = 0, overlapping = 0)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | — | The closed ring mesh |\n| `point1`, `point2` | — | The two ends of the tag, on/near the mesh (the tool's two picks) |\n| `text` | `None` = saved default | The engraved reference |\n| `diameter` | `0` = `1.5` | Pipe diameter (mm) |\n| `thickness` | `0` = `1.5` | Tag thickness (mm) |\n| `fontSize` | `0` = `2` | Engraving size (mm) |\n| `overlapping` | `0` = `0.15` | How far the tag sinks into the ring (mm) |\n\n`0` keeps the tool default or your saved Identifier defaults, whichever apply — the call starts from the saved defaults when they exist, then applies your explicit overrides. An empty or whitespace `text` likewise keeps the saved text.","metadata":{"title":"Identify","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/#usage","collection":"scripting","hash":"8e1ca18222b62cd9e558c71d9e845613","indexed_by":"docs-index"}},{"content":"Identify — The result\n\nReturns the `Guid` of a new mesh — the ring with the tag merged in — added to the last user layer. The original mesh is left untouched in the document, same as the tool: delete it yourself if you only want the tagged copy. The call adds an object, so it belongs inside a `Transaction`.\n\nValidation that throws:\n\n- `meshId` is not a mesh: `\"Object {meshId} is not a mesh.\"`\n- The computation fails: `\"Identifier computation failed. Check that both points lie on the mesh.\"`\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing, Transaction\nfrom Rhino.Geometry import Point3d\n\nwith Transaction.Begin(\"Identifier\"):\n    tagged = manufacturing.AddIdentifier(ringId,\n                                         Point3d(-3, 0, -8), Point3d(3, 0, -8),\n                                         text = \"REF-001\")\n```","metadata":{"title":"Identify","section":"The result","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/#the-result","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/identify/#the-result","collection":"scripting","hash":"c421f597c5a6ed837ccb9e30ff7193f9","indexed_by":"docs-index"}},{"content":"Repair\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nA design straight off the modelling stage is rarely printable: open surfaces, flipped normals, overlapping solids. `AutomaticRepair` is the ArtisanAutomaticRepair tool run headless — it closes gaps, fixes normals and produces one watertight mesh ready for the printer. Rhino 8 or higher only (it uses ShrinkWrap).","metadata":{"title":"Repair","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/","collection":"scripting","hash":"77412f065f260ef4882c7ac45af14a8d","indexed_by":"docs-index"}},{"content":"Repair — Usage\n\n```python\nr = manufacturing.AutomaticRepair(objectIds = None, precision = 0, deleteOriginal = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` = current selection | Objects to repair — solids, surfaces or meshes. Gems are skipped automatically, like the tool |\n| `precision` | `0` = the tool's configured default (typically `0.025`) | Repair precision in mm. Smaller = more faithful and slower |\n| `deleteOriginal` | `False` | `True` removes the source objects after the repair |\n\nThe call starts from your saved Automatic Repair defaults when they exist, exactly like the command; a `precision` greater than `0` overrides the saved value.\n\nLong operation — Rhino stays busy while it computes. Expect it to take a while on dense geometry.","metadata":{"title":"Repair","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/#usage","collection":"scripting","hash":"fe580da7a37e99a224648edffbe9b4b2","indexed_by":"docs-index"}},{"content":"Repair — The result\n\nThe repaired mesh is added to the document on the last user layer with the wax colour from your settings, same as the tool's Accept button. The source objects stay in place unless `deleteOriginal = True`. Because the call adds (and possibly deletes) objects, wrap it in a `Transaction` so the whole repair undoes in one step.\n\n`AutomaticRepair` returns a `RepairResult`:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `MeshId` | `Guid` | The repaired mesh added to the document |\n| `IsClosed` | `bool` | `True` = watertight, printable |\n| `Shells` | `int` | Number of separate shells in the result |\n| `NakedEdges` | `int` | Remaining open edges — `0` is what you want |\n\nDon't assume success means printable: check `IsClosed` (or run Verify) before sending the mesh downstream.\n\nValidation that throws:\n\n- Rhino older than 8: `\"Automatic Repair requires Rhino 8 or higher.\"`\n- Nothing usable after the gem filter: `\"Nothing to repair: select (or pass) at least one non-gem solid, surface or mesh.\"` — a selection made only of gems fails, it is not silently ignored.\n- The computation fails: `\"This geometry could not be repaired. Try a different precision.\"`\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing, Transaction\n\nwith Transaction.Begin(\"Automatic repair\"):\n    r = manufacturing.AutomaticRepair(deleteOriginal = True)\n    print(f\"Closed: {r.IsClosed}, shells: {r.Shells}, naked edges: {r.NakedEdges}\")\n```","metadata":{"title":"Repair","section":"The result","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/#the-result","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/repair/#the-result","collection":"scripting","hash":"017a60ce6025ed10c8b4473c2eb7dbb4","indexed_by":"docs-index"}},{"content":"Size run\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nA design is modelled at one finger size, but production casts a run of them. `ResizeRing` is the ArtisanResizer tool run headless: it takes a closed ring mesh and produces one resized copy per target inner diameter, organised exactly like the tool's Layers mode so each size is ready to isolate and export.","metadata":{"title":"Size run","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/","collection":"scripting","hash":"c4a3bb7e4897a9991a81eb8ef25d683f","indexed_by":"docs-index"}},{"content":"Size run — Usage\n\n```python\nsizes = manufacturing.ResizeRing(meshId, fromDiameter, toDiameters, names = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | — | The closed ring mesh to resize |\n| `fromDiameter` | — (required) | The ring's current inner diameter in mm; `0` = the document's finger size |\n| `toDiameters` | — | Target inner diameters in mm, e.g. `[16.5, 17.35, 18.2]`. Each must be `> 0` |\n| `names` | `None` | Optional labels, parallel to `toDiameters`; the default label is the diameter formatted (`\"17.35\"`). Blank entries also fall back to the diameter |\n\nLong operation — one boolean pipeline per size. Expect Rhino to stay busy on long size runs.","metadata":{"title":"Size run","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/#usage","collection":"scripting","hash":"435f7a9da885ef77d51ed9a5bef5582b","indexed_by":"docs-index"}},{"content":"Size run — What it creates\n\nFor each target diameter the call adds a resized copy of the ring; the original mesh is left untouched where it stands. Every copy gets:\n\n- a child layer under a \"Resizer\" parent layer (both in the tool's purple), named with the tool's ring reference followed by the size label;\n- its own group, named `Resizer {label}`;\n- a position in a row: copy *i* is translated along +Y by *i* × the tool's ring distance, so the sizes line up beside the original.\n\nBecause it adds meshes, layers and groups, the call belongs inside a `Transaction`.\n\nReturns one `ResizedRing` per size, in the order you asked for them:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Name` | `str` | The size label — also the child layer suffix and the group name |\n| `Diameter` | `float` | The target inner diameter (mm) |\n| `RingId` | `Guid` | The resized ring mesh |\n\nValidation that throws:\n\n- `meshId` is not a mesh: `\"Object {meshId} is not a mesh.\"`\n- No targets: `\"At least one target diameter is required.\"`\n- A non-positive target: `\"Diameters must be > 0.\"`\n- A size fails to compute: `\"Resize to Ø{diameter} mm failed. The mesh must be a closed ring.\"` — sizes computed before the failure are already in the document.\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing, Transaction\n\nwith Transaction.Begin(\"Size run\"):\n    sizes = manufacturing.ResizeRing(ringId, 0,             # 0 = the document's finger size\n                                     [16.5, 17.35, 18.2],\n                                     names = [\"S\", \"M\", \"L\"])\n    for s in sizes:\n        print(f\"{s.Name}: Ø{s.Diameter} mm -> {s.RingId}\")\n```","metadata":{"title":"Size run","section":"What it creates","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/#what-it-creates","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/size-run/#what-it-creates","collection":"scripting","hash":"ca21cd680e655f2fff799857674e6efd","indexed_by":"docs-index"}},{"content":"Sprue cluster tree\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe cluster tree is the high-density alternative to the radial tree: a cylindrical cage woven from two crossed families of helical wires, forming rhombic cells, with an anchor node at every crossing. Casters use it to pack many small pieces — charms, findings, light rings — onto one flask, each held by a short wire connector. This is the `ArtisanSprueClusterTree` tool run headless.","metadata":{"title":"Sprue cluster tree","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/","collection":"scripting","hash":"f597cfdc9d8c5cc287497895fff25652","indexed_by":"docs-index"}},{"content":"Sprue cluster tree — Usage\n\n```python\nids = manufacturing.SprueClusterTree(meshIds = None, basePoint = Point3d.Origin,\n                                     copiesPerMesh = 0, diameter = 0,\n                                     height = 0, cellsAround = 0,\n                                     rows = 0, wireDiameter = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshIds` | current selection | The model meshes to distribute; `None` or empty uses whatever is selected |\n| `basePoint` | world origin | Where the base sits |\n| `copiesPerMesh` | `0` = automatic | Copies of each mesh; `0` fills the free nodes, the tool's automatic mode |\n| `diameter` | `65` | Cylinder diameter, mm |\n| `height` | `90` | Cylinder height, mm |\n| `cellsAround` | `8` | Rhombic cells around the circumference |\n| `rows` | `7` | Rows of cells up the cylinder |\n| `wireDiameter` | `3` | Helix wire diameter, mm |\n\nNumeric parameters follow the `0`-keeps-default convention, but like the radial tree this tool has no saved defaults — `0` always means the factory default. `copiesPerMesh = 0` is a meaningful zero: automatic fill.\n\nCopies are placed on the crossing nodes in round-robin, each anchored by the bottom-centre of its bounding box (the tool's default pick) and held by a mini-connector of diameter 1 mm and length 6 mm — those two are fixed, not parameters.\n\nIt returns an `IReadOnlyList ` — the ids of all the meshes added: grid, base, connectors and every model copy, in bake order, not grouped. The first object routes through the layer service to the last user layer and the rest follow it; the structure takes the wax preview colour and the model copies keep their own model colour. The source meshes are only read, never modified. This is a long operation.","metadata":{"title":"Sprue cluster tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/#usage","collection":"scripting","hash":"e46e5608ad21fec2bf8601588aa49382","indexed_by":"docs-index"}},{"content":"Sprue cluster tree — Usage\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If nothing resolves to a mesh it raises *\"No meshes to work with: select (or pass) at least one mesh.\"*; if the cage cannot be built it raises *\"Sprue cluster tree computation failed.\"*, or *\"Sprue cluster tree computation failed with the given parameters (…).\"* when the kernel rejects the numbers, and nothing is added. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue cluster tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-cluster-tree/#usage","collection":"scripting","hash":"2c5027bc7cad89d142aaff7307b2477d","indexed_by":"docs-index"}},{"content":"Sprue curve\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe perimeter-frame sprue surrounds the piece with a closed pipe running round its silhouette, tapered connectors reaching in from the frame to the piece, and a horizontal injection post on the front — the layout used for flat or delicate pieces where a single feed would distort the casting, and the standard feed system for vulcanised mould injection. This is the `ArtisanSprueCurve` tool run headless.","metadata":{"title":"Sprue curve","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/","collection":"scripting","hash":"d309ca11cec45e4d3a29b57e86cf14ab","indexed_by":"docs-index"}},{"content":"Sprue curve — Usage\n\n```python\nids = manufacturing.SprueCurve(meshId, curveId = Guid.Empty,\n                               offset = 0, smooth = -1, width = 0, height = 0,\n                               connectionCount = 0, connectionDiameter = 0,\n                               symmetry = None)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | required | The piece mesh |\n| `curveId` | automatic silhouette | Optional closed perimeter curve; `Guid.Empty` or omitted builds the frame from the piece's silhouette |\n| `offset` | `2` | How far the automatic silhouette is pushed outwards, mm |\n| `smooth` | `-1` = default (`8`) | Smoothing iterations on the silhouette; `0` is a real value (no smoothing), so the sentinel is `-1` |\n| `width` | `1` | Frame section width, mm |\n| `height` | `1` | Frame section height, mm |\n| `connectionCount` | `4` | Number of connectors from the frame to the piece |\n| `connectionDiameter` | `0.3` | Connector diameter at the piece, mm |\n| `symmetry` | `\"None\"` | Connector layout symmetry: `\"None\"`, `\"X\"`, `\"Y\"` or `\"Quad\"`, case-insensitive |\n\nThe other numeric parameters follow the `0`-keeps-default convention; this tool has no saved defaults, so `0` always means the factory default. The injection post is not parameterised — it keeps the tool defaults (external diameter 3 mm, length 5 mm). Connectors are seeded equidistant along the frame, exactly the tool's initial layout before any manual edit.\n\nIt returns an `IReadOnlyList ` — the ids of the meshes added: frame, injection post and connectors, baked to the last user layer with the wax preview colour, same as the tool's Accept. The piece mesh (and the perimeter curve, if given) are only read, never modified.","metadata":{"title":"Sprue curve","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/#usage","collection":"scripting","hash":"ee823315ec94e72129c9d0db06a895c6","indexed_by":"docs-index"}},{"content":"Sprue curve — Usage\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If `meshId` does not resolve to a mesh it raises *\"Object {id} is not a mesh.\"*; a `curveId` that is not a curve raises *\"Object {id} is not a curve.\"*; an unrecognised `symmetry` raises *\"Unknown symmetry '…'.\"*; if the automatic silhouette cannot be traced it raises *\"Could not build the silhouette perimeter. Pass a perimeter curve instead.\"*; and if the frame cannot be built it raises *\"Sprue curve computation failed. Check the perimeter is a closed curve around the piece.\"*, or *\"Sprue curve computation failed with the given parameters (…).\"* when the kernel rejects the numbers. Nothing is added on failure. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue curve","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-curve/#usage","collection":"scripting","hash":"aa47054cea0c9537a39056c2ee666695","indexed_by":"docs-index"}},{"content":"Sprue external frames\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe external frame is the sprue for elongated work laid flat in a row - chains, bracelets, tennis-style links: a rounded-rectangle runner surrounds the pieces and pairs of thin stubs reach inward from the long sides (plus, optionally, one from each short end) to feed them. The frame doubles as a handling rail: the whole row stays rigid through investing and comes out of the flask as one piece. This is the `ArtisanSprueExternalFrames` tool, headless.","metadata":{"title":"Sprue external frames","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/","collection":"scripting","hash":"8477b9b99baf5088e58e3b32581d1146","indexed_by":"docs-index"}},{"content":"Sprue external frames — Usage\n\n```python\nids = manufacturing.SprueExternalFrames(meshIds = None, margin = 0,\n                                        cornerRadius = 0, frameDiameter = 0,\n                                        connectorCount = 0,\n                                        connectorSeparation = 0,\n                                        connectorLength = 0,\n                                        endConnectors = True)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshIds` | selection | The pieces the frame is built around; `None` or empty = the current selection |\n| `margin` | `3` | Gap between the pieces' combined bounding box and the frame, mm |\n| `cornerRadius` | `3` | Radius of the frame's rounded corners, mm |\n| `frameDiameter` | `2` | Diameter of the frame wire, mm |\n| `connectorCount` | per object | Number of stub pairs along the long sides; `0` = one pair per given object, what the tool seeds on selection |\n| `connectorSeparation` | `5` | Separation between the two stubs of a pair, mm |\n| `connectorLength` | `4` | Length of each stub, mm |\n| `endConnectors` | `True` | `True` also adds the two short-side stubs (the tool's default) |\n\nThe numeric parameters follow the house `0`-keeps-default convention, with one twist: `connectorCount = 0` is not a fixed tool number but *one stub pair per object found*, recomputed from what you pass or select. There is no `-1` sentinel. Note this tool does not read saved panel defaults - `0` always means the factory values above.\n\nThe frame is built around the combined world bounding box of the pieces, grown by `margin` - the same box the tool's selector shows - so the objects need not be meshes: anything with a valid bounding box counts, and objects that cannot be found or have no valid box are silently skipped.","metadata":{"title":"Sprue external frames","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/#usage","collection":"scripting","hash":"8159a1400fbf07d85226958eec5b3feb","indexed_by":"docs-index"}},{"content":"Sprue external frames — Usage\n\n`SprueExternalFrames` returns the ids of the frame meshes it adds, baked to the last user layer with the wax colour, like the tool's Accept; the pieces themselves are left untouched. This is a licensed mutation and needs an active document - it throws *\"No active document.\"* otherwise. When nothing usable is passed or selected, it raises `ArgumentException` *\"Nothing to frame: select (or pass) at least one object.\"*. When the geometry cannot be built, the call raises `InvalidOperationException` *\"Sprue computation failed. Check that the pieces span a valid box.\"* (or *\"Sprue external frames computation failed with the given parameters.\"* with the underlying detail when the kernel rejects the numbers) and nothing is added. Wrap the call in a `Transaction` so the whole frame undoes in one step.","metadata":{"title":"Sprue external frames","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-frames/#usage","collection":"scripting","hash":"e1fb00d56585031e43c9762b2d23de63","indexed_by":"docs-index"}},{"content":"Sprue external tree\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nAn external tree feeds the piece from outside: a tapered trunk stands next to the mesh - not through it - and branches reach across from the trunk to the outer surface, one per contact point. It suits pieces with no convenient bore to feed through, or where you want the metal entering thick outer sections directly. This is the `ArtisanSprueExternalTree` tool, headless - its two interactive picks become explicit arguments; the tool itself seeds the trunk beside the mesh (bounding-box Max.X + 5, centre Y, Z = 0), a sensible starting point for `trunkBasePoint`.","metadata":{"title":"Sprue external tree","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/","collection":"scripting","hash":"7ea39dd1a9e7b1c5ac27517e9e0f98e6","indexed_by":"docs-index"}},{"content":"Sprue external tree — Usage\n\n```python\nids = manufacturing.SprueExternalTree(meshId, trunkBasePoint, contactPoints,\n                                      height = 0, topDiameter = 0,\n                                      bottomDiameter = 0,\n                                      branchTrunkDiameter = 0,\n                                      branchContactDiameter = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | required | The closed mesh to sprue - a mesh, or a SubD (meshed at default density) |\n| `trunkBasePoint` | required | Where the trunk stands, outside the mesh |\n| `contactPoints` | required | Points on the mesh where the branches attach - at least one |\n| `height` | `20` | Height of the trunk, mm |\n| `topDiameter` | `3` | Diameter at the top of the trunk, mm |\n| `bottomDiameter` | `5` | Diameter at the base of the trunk, mm (the taper) |\n| `branchTrunkDiameter` | `2` | Diameter of each branch where it leaves the trunk, mm |\n| `branchContactDiameter` | `0.8` | Diameter of each branch where it meets the mesh, mm |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default, or my saved defaults\" - when you have saved defaults for this tool in the panel, those are the starting point rather than the factory numbers. There is no `-1` sentinel and none of the numbers has a meaningful zero.","metadata":{"title":"Sprue external tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/#usage","collection":"scripting","hash":"c601587baa776606e959d20934c86e05","indexed_by":"docs-index"}},{"content":"Sprue external tree — Usage\n\n`SprueExternalTree` returns the ids of the sprue meshes it adds, baked to the last user layer with the wax colour, like the tool's Accept; the source mesh is left untouched. This is a licensed mutation and needs an active document - it throws *\"No active document.\"* otherwise. Passing something that is neither mesh nor SubD raises `ArgumentException` *\"Object {id} is not a mesh.\"*; an empty `contactPoints` raises *\"At least one contact point on the mesh is required.\"*. When the geometry cannot be built, the call raises `InvalidOperationException` *\"Sprue computation failed. Check that the contact points lie on the mesh and the trunk base point is beside it.\"* (or *\"Sprue external tree computation failed with the given parameters.\"* with the underlying detail when the kernel rejects the numbers) and nothing is added. Wrap the call in a `Transaction` so the whole sprue undoes in one step.","metadata":{"title":"Sprue external tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-external-tree/#usage","collection":"scripting","hash":"fd2dddb48ad898dec79853ff9db3d584","indexed_by":"docs-index"}},{"content":"Sprue helix\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe helix tree is how casters print a whole chain's worth of links in one flask: a conical base, a vertical trunk, and a helical feed wire climbing around it with copies of the link hung along the wire on short connectors. One tree, one investment, dozens of identical links. This is the `ArtisanSprueHelix` tool, headless.","metadata":{"title":"Sprue helix","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/","collection":"scripting","hash":"b6f4ec94b6a2f15b9a24ac9ede332ff0","indexed_by":"docs-index"}},{"content":"Sprue helix — Usage\n\n```python\nids = manufacturing.SprueHelix(linkMeshId, basePoint = (0,0,0), copies = 0,\n                               wireDiameter = 0, trunkDiameter = 0,\n                               connectorLength = 0, connectorDiameter = 0,\n                               clearanceMargin = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `linkMeshId` | required | The chain link to multiply - a mesh, or a SubD (meshed at default density) |\n| `basePoint` | `(0,0,0)` | Where the tree stands on the plate; the origin is the tool's starting position |\n| `copies` | `125` | How many copies of the link to hang along the wire |\n| `wireDiameter` | `3` | Diameter of the helical feed wire, mm |\n| `trunkDiameter` | `10` | Diameter of the central trunk, mm |\n| `connectorLength` | `3.25` | Length of the short connector between wire and link, mm |\n| `connectorDiameter` | `1.5` | Diameter of that connector, mm |\n| `clearanceMargin` | `0` | Extra clearance added between neighbouring copies, mm |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default\". For `clearanceMargin` the default *is* `0` - no extra clearance - so there is nothing to distinguish; a positive value simply pushes the copies further apart. There is no `-1` sentinel.\n\nYou do not set the helix's turns, diameter or trunk length: like the tool's Generate button, the layout is auto-sized so the requested copies fit without collisions, with one support arm added per turn. The link is chained along its longest bounding-box axis, the same orientation the tool picks initially. This is a long operation - the auto-sizing searches for a collision-free layout - so expect Rhino to stay busy for larger trees.","metadata":{"title":"Sprue helix","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/#usage","collection":"scripting","hash":"824b3a86e65897c869509ae2236426f4","indexed_by":"docs-index"}},{"content":"Sprue helix — Usage\n\n`SprueHelix` returns the ids of all the meshes it adds: the tree itself plus one mesh per copy. Everything is baked to the last user layer with the wax colour, exactly like the tool's Accept; the source link object is left untouched in the document. This is a licensed mutation and needs an active document - it throws *\"No active document.\"* otherwise. A `linkMeshId` that is neither a mesh nor a SubD raises `ArgumentException` *\"Object {id} is not a mesh.\"*. When the requested copies cannot be laid out, the call raises `InvalidOperationException` carrying the layout search's own problem description; a geometry failure raises *\"Sprue helix computation failed with the given parameters.\"* (with the underlying detail appended in brackets when there is one) and nothing is added. Wrap the call in a `Transaction` so the whole tree undoes in one step.","metadata":{"title":"Sprue helix","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-helix/#usage","collection":"scripting","hash":"d371edc05f0898e131ee425affeb6100","indexed_by":"docs-index"}},{"content":"Sprue inner branches\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nAn inner-branches sprue feeds a ring from the inside: a central post rises through the finger hole and thin branches reach out from it to the inner wall, one per contact point. Feeding from the inside keeps the sprue marks off the visible outer surface, so clean-up after casting stays on the bore where a polishing mandrel reaches anyway. This is the `ArtisanSprueInnerBranches` tool, headless - its two interactive picks become explicit arguments.","metadata":{"title":"Sprue inner branches","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/","collection":"scripting","hash":"5f0740e8e7da7e54fd5a9327982cb55e","indexed_by":"docs-index"}},{"content":"Sprue inner branches — Usage\n\n```python\nids = manufacturing.SprueInnerBranches(meshId, basePoint, contactPoints,\n                                       height = 0, topDiameter = 0,\n                                       branchContactDiameter = 0,\n                                       symmetry = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | required | The closed mesh to sprue - a mesh only, not a SubD |\n| `basePoint` | required | Where the central post stands; the tool seeds it under the mesh centre at Z = 0 |\n| `contactPoints` | required | Points on the mesh where the branches attach - at least one |\n| `height` | mesh centre | Height of the central post, mm; `0` = the mesh bounding-box centre height, what the tool seeds on selection |\n| `topDiameter` | `3` | Diameter at the top of the post, mm |\n| `branchContactDiameter` | `0.8` | Diameter of each branch where it meets the mesh, mm |\n| `symmetry` | `0` | `0` = none, `1` = vertical mirror (X), `2` = horizontal mirror (Y), `3` = quad - the tool's Symmetry combo, which multiplies each contact point |\n\nThe numeric parameters follow the house `0`-keeps-default convention, with one twist: `height = 0` does not mean a fixed tool number but *the mesh's own bounding-box centre height*, recomputed per mesh - and when you have saved defaults for this tool in the panel, the diameters start from those rather than the factory values. `symmetry = 0` is a meaningful zero (no symmetry, the default), not a keep-default sentinel. There is no `-1` sentinel.","metadata":{"title":"Sprue inner branches","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/#usage","collection":"scripting","hash":"4ff9e9b520b90b9dff74a7f575e4ac91","indexed_by":"docs-index"}},{"content":"Sprue inner branches — Usage\n\n`SprueInnerBranches` returns the ids of the sprue meshes it adds, baked to the last user layer with the wax colour, like the tool's Accept; the ring mesh itself is left untouched. This is a licensed mutation and needs an active document - it throws *\"No active document.\"* otherwise. Passing a non-mesh raises `ArgumentException` *\"Object {id} is not a mesh.\"*; an empty `contactPoints` raises *\"At least one contact point on the mesh is required.\"*; a `symmetry` outside 0-3 raises *\"Symmetry must be 0 (none), 1 (vertical), 2 (horizontal) or 3 (quad).\"*. When the geometry cannot be built, the call raises `InvalidOperationException` *\"Sprue computation failed. Check that the contact points lie on the mesh.\"* (or *\"Sprue inner branches computation failed with the given parameters.\"* with the underlying detail when the kernel rejects the numbers) and nothing is added. Wrap the call in a `Transaction` so the whole sprue undoes in one step.","metadata":{"title":"Sprue inner branches","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-branches/#usage","collection":"scripting","hash":"2fb40676ce91f440b6fe4769338a1312","indexed_by":"docs-index"}},{"content":"Sprue inner tree\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe inner tree feeds a ring from the inside: a vertical trunk stands under the band and short branches reach up from it to several contact points on the shank, so the metal enters through the hidden inner face and the visible surfaces stay clean. This is the `ArtisanSprueInnerTree` tool run headless — its two interactive picks become the `basePoint` and `contactPoints` arguments.","metadata":{"title":"Sprue inner tree","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-tree/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-tree/","collection":"scripting","hash":"26bb8db076d6ce21555016f4b17b210f","indexed_by":"docs-index"}},{"content":"Sprue inner tree — Usage\n\n```python\nids = manufacturing.SprueInnerTree(meshId, basePoint, contactPoints,\n                                   height = 0, topDiameter = 0,\n                                   bottomDiameter = 0,\n                                   branchContactDiameter = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | required | The closed ring mesh |\n| `basePoint` | required | Where the trunk starts — below/inside the ring |\n| `contactPoints` | required | Points on the mesh the branches reach; at least one |\n| `height` | `10` | Trunk height, mm |\n| `topDiameter` | `3` | Trunk diameter at the top, mm |\n| `bottomDiameter` | `5` | Trunk diameter at the base, mm |\n| `branchContactDiameter` | `0.8` | Branch diameter where it touches the ring, mm |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default, or my saved inner-tree defaults\". There is no `-1` sentinel.\n\nIt returns an `IReadOnlyList ` — the ids of the sprue meshes added (trunk and branches). Each one goes to the last user layer, the same destination as the tool's Accept. The ring mesh itself is only read, never modified.\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If `meshId` does not resolve to a mesh it raises *\"Object {id} is not a mesh.\"*; an empty `contactPoints` raises *\"At least one contact point on the mesh is required.\"*; and if the geometry cannot be built it raises *\"Sprue computation failed. Check that the contact points lie on the mesh and the base point is below/inside the ring.\"* and nothing is added. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue inner tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-inner-tree/#usage","collection":"scripting","hash":"01ed48b316243c103b01d60bb12c942a","indexed_by":"docs-index"}},{"content":"Sprue multiple copies\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThis is the hand-sprued runner: a tapered trunk laid alongside the piece (or a row of pieces) with one curved branch from the trunk to each chosen contact point — the layout a caster draws by hand when a design needs metal fed at several specific spots. It is the `ArtisanSprueMultipleCopies` tool run headless: the tool's three interactive picks become `trunkStart`, `trunkEnd` and `contactPoints`.","metadata":{"title":"Sprue multiple copies","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/","collection":"scripting","hash":"3685b09efc0578298b6a92f7417be254","indexed_by":"docs-index"}},{"content":"Sprue multiple copies — Usage\n\n```python\nids = manufacturing.SprueMultipleCopies(meshIds, trunkStart, trunkEnd, contactPoints,\n                                        topDiameter = 0, bottomDiameter = 0,\n                                        branchTrunkDiameter = 0,\n                                        branchContactDiameter = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshIds` | current selection | The piece mesh(es), merged into one working mesh like the tool's selector; `None` or empty uses whatever is selected |\n| `trunkStart` | required | Bottom end of the trunk |\n| `trunkEnd` | required | Top end of the trunk |\n| `contactPoints` | required | Points on the mesh the branches reach; at least one |\n| `topDiameter` | `1.3` | Trunk diameter at the top, mm |\n| `bottomDiameter` | `2.3` | Trunk diameter at the bottom, mm |\n| `branchTrunkDiameter` | `1.2` | Branch diameter where it leaves the trunk, mm |\n| `branchContactDiameter` | `0.8` | Branch diameter where it touches the piece, mm |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default, or my saved multiple-copies defaults\". There is no `-1` sentinel.\n\nWhere the tool asks you to pick a matching point on the trunk for every contact, this method projects each contact onto the trunk line instead — each branch leaves the trunk at the contact's closest point on it, the natural headless equivalent.\n\nIt returns an `IReadOnlyList ` — the ids of the meshes added: the trunk plus one mesh per branch, baked to the last user layer with the wax preview colour, same as the tool's Accept. The source meshes are only read, never modified.","metadata":{"title":"Sprue multiple copies","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/#usage","collection":"scripting","hash":"5ecd7fd93a0acf93d28f28992c264fe8","indexed_by":"docs-index"}},{"content":"Sprue multiple copies — Usage\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If nothing resolves to a mesh it raises *\"No meshes to work with: select (or pass) at least one mesh.\"*; an empty `contactPoints` raises *\"At least one contact point on the mesh is required.\"*; and if the geometry cannot be built it raises *\"Sprue computation failed. Check that the contact points lie on the mesh.\"*, or *\"Sprue computation failed with the given parameters (…).\"* when the kernel rejects the numbers. Nothing is added on failure. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue multiple copies","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-multiple-copies/#usage","collection":"scripting","hash":"f8608501057fd00e270703962322b25b","indexed_by":"docs-index"}},{"content":"Sprue single\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe single sprue is the simplest feed: one short tapered post attached to the piece at the point where the molten metal will enter — the connector a caster solders between a small piece and the wax tree. This is the `ArtisanSprueSingle` tool run headless: the tool's pick-point-on-mesh prompt becomes the `point` argument.","metadata":{"title":"Sprue single","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-single/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-single/","collection":"scripting","hash":"d83a41ef87bae7a1ceb115fb70cdf8d4","indexed_by":"docs-index"}},{"content":"Sprue single — Usage\n\n```python\nid = manufacturing.SprueSingle(meshId, point, height = 0,\n                               topX = 0, topY = 0, bottomX = 0, bottomY = 0,\n                               insideRing = 0)      # -> Guid\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshId` | required | The piece mesh; the sprue attaches to it |\n| `point` | required | Where the sprue meets the piece — it should lie on the mesh |\n| `height` | `2` | Length of the post, mm |\n| `topX`, `topY` | `1.5` × `1.5` | Section at the top (free) end, mm |\n| `bottomX`, `bottomY` | `1.5` × `1.5` | Section at the bottom (contact) end, mm |\n| `insideRing` | `0.2` | How far the post sinks into the piece for a clean weld, mm |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default, or my saved sprue-single defaults\". None of these numbers has a meaningful zero and there is no `-1` sentinel.\n\n`SprueSingle` returns a single `Guid` — the id of one sprue mesh. Unlike the other sprue methods, the mesh is added as-is: it lands on the document's current layer with no colour override, exactly what the tool's Accept does. The source mesh is only read (the method works on a duplicate), never modified.\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If `meshId` does not resolve to a mesh it raises *\"Object {id} is not a mesh.\"*, and if the geometry cannot be built it raises *\"Sprue computation failed. Check that the point lies on the mesh.\"* and nothing is added. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue single","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-single/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-single/#usage","collection":"scripting","hash":"e0a9e912df00399e6bfbd20eafa34453","indexed_by":"docs-index"}},{"content":"Sprue spiral\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe spiral is the flat cousin of the helix tree: the same chain-printing idea, but the feed wire is coiled flat, standing on legs above the plate, and each link hangs from a single vertical connector below the wire. It keeps the whole batch low and shallow - useful when the flask or the printer's build height is the constraint. This is the `ArtisanSprueSpiral` tool, headless.","metadata":{"title":"Sprue spiral","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/","collection":"scripting","hash":"e1b7e30fa28d393e5310ba0fddae86f5","indexed_by":"docs-index"}},{"content":"Sprue spiral — Usage\n\n```python\nids = manufacturing.SprueSpiral(linkMeshId, basePoint = (0,0,0), copies = 0,\n                                maxDiameter = 0, wireDiameter = 0,\n                                connectorLength = 0, clearanceMargin = 0,\n                                showBase = False)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `linkMeshId` | required | The chain link to multiply - a mesh, or a SubD (meshed at default density) |\n| `basePoint` | `(0,0,0)` | Centre of the spiral on the plate; the origin is the tool's starting position |\n| `copies` | `60` | How many copies of the link to hang from the wire |\n| `maxDiameter` | `100` | The largest diameter the spiral may grow to, mm |\n| `wireDiameter` | `3` | Diameter of the spiral feed wire, mm |\n| `connectorLength` | `3.25` | Length of the vertical connector between wire and link, mm |\n| `clearanceMargin` | `0` | Extra clearance added between neighbouring copies, mm |\n| `showBase` | `False` | `True` adds the honeycomb base plate under the legs (off by default, like the tool) |\n\nEvery numeric parameter follows the house `0`-keeps-default convention: `0` means \"use the tool's default\". For `clearanceMargin` the default *is* `0`, so a positive value simply spaces the copies out further. There is no `-1` sentinel.","metadata":{"title":"Sprue spiral","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/#usage","collection":"scripting","hash":"8189f7f1f6c3d4eeeff1612b179c11d6","indexed_by":"docs-index"}},{"content":"Sprue spiral — Usage\n\nAs with the helix, you do not set the turns, the turn spacing or the inner eye: like the tool's Generate button, the layout is auto-sized so the requested copies fit within `maxDiameter`, with the link hung from its Y axis - the tool's starting orientation. This is a long operation; the auto-sizing searches for a collision-free layout. A layout can be feasible yet carry a warning - typically that fewer copies than requested fit cleanly - in which case the call still succeeds and the warning is printed to the Rhino command line, prefixed `Sprue Spiral:`, exactly as the tool surfaces it.\n\n`SprueSpiral` returns the ids of all the meshes it adds: the spiral itself plus one mesh per copy. Everything is baked to the last user layer with the wax colour, like the tool's Accept; the source link object is left untouched. This is a licensed mutation and needs an active document - it throws *\"No active document.\"* otherwise. A `linkMeshId` that is neither a mesh nor a SubD raises `ArgumentException` *\"Object {id} is not a mesh.\"*. When no layout is feasible, the call raises `InvalidOperationException` carrying the layout search's own problem description; a geometry failure raises *\"Sprue spiral computation failed with the given parameters.\"* (with the underlying detail appended in brackets when there is one) and nothing is added. Wrap the call in a `Transaction` so the whole spiral undoes in one step.","metadata":{"title":"Sprue spiral","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-spiral/#usage","collection":"scripting","hash":"204d7fedee063cf5d7aa04d18a8b9171","indexed_by":"docs-index"}},{"content":"Sprue tree\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nThe radial tree is the classic production casting setup: a rubber-base disc, a conical central trunk, and rings of angled branches around it — the wax \"Christmas tree\" a foundry invests and burns out to cast dozens of pieces in one pour. This is the `ArtisanSprueTree` tool run headless: it builds the tree and hangs a copy of each given mesh from the branches.","metadata":{"title":"Sprue tree","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/","collection":"scripting","hash":"e3454f261c70ec5187c7b470eda1438e","indexed_by":"docs-index"}},{"content":"Sprue tree — Usage\n\n```python\nids = manufacturing.SprueTree(meshIds = None, basePoint = Point3d.Origin,\n                              copiesPerMesh = 0, height = 0,\n                              bottomDiameter = 0, topDiameter = 0,\n                              floors = 0, piecesPerFloor = 0,\n                              branchDiameter = 0)      # -> [ids]\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `meshIds` | current selection | The model meshes to distribute; `None` or empty uses whatever is selected |\n| `basePoint` | world origin | Where the base disc sits |\n| `copiesPerMesh` | `0` = automatic | Copies of each mesh; `0` fills the free branches, the tool's automatic mode |\n| `height` | `150` | Trunk height, mm |\n| `bottomDiameter` | `10` | Trunk diameter at the base, mm |\n| `topDiameter` | `10` | Trunk diameter at the top, mm |\n| `floors` | `7` | Number of branch floors up the trunk |\n| `piecesPerFloor` | `8` | Branches per floor |\n| `branchDiameter` | `1.5` | Branch (connector) diameter, mm |\n\nNumeric parameters follow the `0`-keeps-default convention, but note this tool has no saved defaults — `0` always means the tool's factory default, never your settings. `copiesPerMesh = 0` is a meaningful zero: it switches to automatic fill rather than keeping a default count.\n\nCopies are distributed over the branches in round-robin and each hangs from its branch by the bottom-centre of its bounding box (the tool's default anchor), with the default branch length 8.5 mm at 15°.","metadata":{"title":"Sprue tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/#usage","collection":"scripting","hash":"da8086b8d95c68e4a53c1a6e86f724a8","indexed_by":"docs-index"}},{"content":"Sprue tree — Usage\n\nIt returns an `IReadOnlyList ` — the ids of all the meshes added: base, trunk, connectors and every model copy, in bake order. They are not grouped. The first object routes through the layer service to the last user layer and the rest follow it; the structure takes the wax preview colour and the model copies keep their own model colour. The source meshes are only read (copies are duplicates), never modified. This is a long operation — one collision-tested placement per copy.\n\nIt needs a valid licence and fails with *\"No active document.\"* when there is none. If nothing resolves to a mesh it raises *\"No meshes to work with: select (or pass) at least one mesh.\"*; if the tree cannot be built it raises *\"Sprue tree computation failed.\"*, or *\"Sprue tree computation failed with the given parameters (…).\"* when the kernel rejects the numbers, and nothing is added. Wrap the call in a `Transaction` to get one-step undo.","metadata":{"title":"Sprue tree","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/sprue-tree/#usage","collection":"scripting","hash":"75c98b12c725fd5c237723c9900fc829","indexed_by":"docs-index"}},{"content":"Verify\n\n```python\nfrom ArtisanPlugin.Scripting import ManufacturingApi as manufacturing\n```\n\nBefore a mesh goes to the printer or the caster it must be valid, watertight and manifold. `QuickCheck` is the ArtisanQuickCheck tool run headless: it checks each mesh and, like the tool, recolours it green when printable and red when not, so the verdict is visible in the viewport as well as in the returned data.","metadata":{"title":"Verify","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/verify/","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/verify/","collection":"scripting","hash":"8bee3e8b11f6947a8d6010011e1970d1","indexed_by":"docs-index"}},{"content":"Verify — Usage\n\n```python\nchecks = manufacturing.QuickCheck(objectIds = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` = current selection | Meshes to check. Non-mesh objects are skipped silently |\n\nReturns one `MeshCheckResult` per checked mesh:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Id` | `Guid` | The checked mesh |\n| `IsValid` | `bool` | The mesh data is valid |\n| `IsClosed` | `bool` | Watertight — no naked edges |\n| `IsManifold` | `bool` | Manifold and consistently oriented |\n| `Printable` | `bool` | `IsValid and IsClosed and IsManifold` — the same green/red verdict the tool paints |\n\nThe geometry itself is never touched, but the call is not a pure read: it changes each checked mesh's object colour (green or red) and commits that attribute change to the document. Wrap it in a `Transaction` if you want the recolouring to undo as one step.\n\nThe only validation that throws is the missing document: `\"No active document.\"` An empty selection simply returns an empty list.\n\n```python\nchecks = manufacturing.QuickCheck()\nfor c in checks:\n    if not c.Printable:\n        print(f\"{c.Id}: valid={c.IsValid} closed={c.IsClosed} manifold={c.IsManifold}\")\n```","metadata":{"title":"Verify","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/verify/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/manufacturing/verify/#usage","collection":"scripting","hash":"e3f4d36845160c9340533d60fb4dc6bd","indexed_by":"docs-index"}},{"content":"Pricing\n\n```python\nfrom ArtisanPlugin.Scripting import PricingApi as pricing\n```\n\nThe Breakdown engine, headless: what a design costs — metals, gems, processes and extras — computed from the same cost settings the panel uses. Each part has its own page.\n\nCalculate The design's totals, in one call.\n\nLine detail Every line item behind the total.\n\nCost settings Read and change the settings tree behind the numbers.","metadata":{"title":"Pricing","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/","collection":"scripting","hash":"ba85ee25f3dd4488684271b9570263ef","indexed_by":"docs-index"}},{"content":"Pricing — The shape of the engine\n\nCalculate gives you the totals; Line detail the same computation with every line item exposed. Both price the active document against the current cost settings — metal prices, labour, margins — so the same design prices differently under different settings, exactly as in the panel.\n\nCertified diamonds are the one external input: with `quoteCertified` on (the default) the engine quotes tagged certified stones through the Nivoda integration instead of the local gem table.","metadata":{"title":"Pricing","section":"The shape of the engine","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/#the-shape-of-the-engine","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/#the-shape-of-the-engine","collection":"scripting","hash":"58bfdb979fb26f037f09ba2fb5ea4b2d","indexed_by":"docs-index"}},{"content":"Pricing — Conventions\n\nPrices come back in the manufacturer's configured currency. The calculations touch no geometry and need no `Transaction` — though they do refresh the cached breakdown the panel displays. Changing a cost setting is the real mutation, and a global one: it persists to the manufacturer's settings file, affecting every document priced with it, outside the undo stack.","metadata":{"title":"Pricing","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/#conventions","collection":"scripting","hash":"8a5f0f5e6438ff859ee0121331a7d078","indexed_by":"docs-index"}},{"content":"Calculate\n\n```python\nfrom ArtisanPlugin.Scripting import PricingApi as pricing\n```\n\n`Calculate` answers \"what does this piece cost?\" without opening a panel. It runs the same Breakdown engine the Breakdown panel uses — the same `BreakdownService` compute path — against the current document and the active manufacturer and market, and returns the grand total plus one number per cost category: metal, certified diamonds, gems, processes and extras. Because it is the same engine, the number a script reports and the number the panel shows can never diverge.","metadata":{"title":"Calculate","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/","collection":"scripting","hash":"aaff0eec63c5802026a8481637d6a5b8","indexed_by":"docs-index"}},{"content":"Calculate — Usage\n\n```python\nresult = pricing.Calculate()                     # -> a PriceResult\noffline = pricing.Calculate(quoteCertified=False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `quoteCertified` | `True` | `True` fetches live Nivoda quotes for every certified diamond, exactly like the panel. `False` skips the quotes: fast and fully offline, but those stones price as 0 |","metadata":{"title":"Calculate","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#usage","collection":"scripting","hash":"a4abef13233a231d0e1da7aafe65f479","indexed_by":"docs-index"}},{"content":"Calculate — The quoteCertified flag\n\nA *certified diamond* is any diamond at or above the active manufacturer's `CertificateFromCt` threshold — those stones are not priced from the manufacturer's size and sieve tables but from a live market quote. With `quoteCertified=True` (the default) each of them is quoted against the Nivoda service using your saved Nivoda filter, which means a network round trip per calculation and a total that matches the panel. With `False` there is no network traffic at all; the certified stones still count in the piece but contribute 0 to `Diamonds` and to `Total`, so the result is a floor, not a quote. Use `False` in tight loops (parametric sweeps, batch reports) and one final `True` call for the real number.","metadata":{"title":"Calculate","section":"The quoteCertified flag","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#the-quotecertified-flag","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#the-quotecertified-flag","collection":"scripting","hash":"0e71cf6281466b5bc9a12859b3040176","indexed_by":"docs-index"}},{"content":"Calculate — What it returns\n\nA `PriceResult`. All monetary fields are plain `double` values in the active manufacturer's currency — the `Currency` field tells you which one; nothing is converted.\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Currency` | str | The manufacturer's currency code, e.g. `\"EUR\"`. Empty if the manufacturer declares none |\n| `Total` | float | The grand total — the sum of the five categories below |\n| `Metal` | float | Metal cost: weight plus waste at the market's spot price |\n| `Diamonds` | float | Certified diamonds total. 0 for the unquoted stones when `quoteCertified=False` |\n| `Gems` | float | Gemstones total, priced from the manufacturer's per-size and per-sieve tables |\n| `Processes` | float | Labour and processes: printing, cast-finish-polish, finishing, rhodium, setting labour and additional processes |\n| `Extras` | float | Extra components (findings, chains, boxes…) |\n| `TotalFormatted` | str | `Total` already rendered with the currency symbol, e.g. `\"1,234.00 €\"`. `str(result)` returns the same string |\n\nNeed the individual lines behind these totals — per metal, per stone, per process? Use `CalculateDetailed`, which runs the identical computation and returns everything itemised.","metadata":{"title":"Calculate","section":"What it returns","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#what-it-returns","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#what-it-returns","collection":"scripting","hash":"f9e5b20f3726a75d7677b5b112051bae","indexed_by":"docs-index"}},{"content":"Calculate — Side effects and errors\n\n`Calculate` never touches geometry, layers or settings, and it needs no `Transaction` — but it is not a pure read either: it recomputes and replaces the document's cached breakdown, the same one the Breakdown panel displays. Call `ShowPanel` afterwards and the panel shows exactly what you just computed.\n\nIt throws rather than returning a guess:\n\n- no open document — *\"No active document.\"*\n- the engine could not produce a breakdown (typically no active manufacturer or an empty document) — *\"Pricing could not be computed for this document.\"*","metadata":{"title":"Calculate","section":"Side effects and errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#side-effects-and-errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/calculate/#side-effects-and-errors","collection":"scripting","hash":"40176bc6f5ec0cf6287a960e3a2a1e4a","indexed_by":"docs-index"}},{"content":"Cost settings\n\n```python\nfrom ArtisanPlugin.Scripting import PricingApi as pricing\n```\n\nEverything the Breakdown engine charges comes from the active manufacturer: `Markets` (the Gold, Silver, Platinum and Palladium spot prices), `Metals`, `Diamonds` (the per-size and per-sieve price tables and the `CertificateFromCt` threshold), `Printing`, `Cfp` (cast-finish-polish), `AdditionalProcesses`, `GemSetting` (labour per setting type) and `Timing`. It persists as `Manufacturer.json` in the pricing folder. These three methods let a script read that tree, change one value in it, and show the resulting breakdown in the panel — the scripted equivalent of updating this morning's gold fix before quoting.","metadata":{"title":"Cost settings","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/","collection":"scripting","hash":"8133267cd2c2b80400900071d6b4d7ec","indexed_by":"docs-index"}},{"content":"Cost settings — GetSettingsJson\n\n```python\npricing.GetSettingsJson()                             # the whole manufacturer\npricing.GetSettingsJson(\"Markets\")                    # just the spot prices\npricing.GetSettingsJson(\"Diamonds.CertificateFromCt\") # a single value\npricing.GetSettingsJson(\"Cfp.Items[2]\")               # one row of a table\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | `None` | A path into the settings tree, or `None` (or blank) for the entire manufacturer |\n\nReturns the node at `path` serialised as indented JSON (a Python string — parse it with `json.loads` if you want a dict). Purely a read: nothing is computed, cached or written, no `Transaction`, no licence gate.","metadata":{"title":"Cost settings","section":"GetSettingsJson","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#getsettingsjson","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#getsettingsjson","collection":"scripting","hash":"efc8c22f2e6b621940f38aa8265fd285","indexed_by":"docs-index"}},{"content":"Cost settings — Path syntax\n\n- Segments are separated by dots: `Diamonds.CertificateFromCt`.\n- Names are case-insensitive (`markets.gold` works) and match the C# property names you see in the JSON output; surrounding whitespace in a segment is trimmed.\n- List items are indexed with `[n]`, zero-based, appended to the list's name: `Cfp.Items[2]`, and you can keep walking past it: `Cfp.Items[2].Price`.\n\nThe honest workflow is discovery first: dump a level with `GetSettingsJson`, read the property names off the JSON, then build the path from what you saw. A wrong name is an error, and a helpful one — it lists what actually exists at that level: *\"'Golde' not found under 'Markets'. Available: Gold, Silver, Platinum, Palladium…\"*. Other failures: *\"No active manufacturer.\"* when there is none, *\"Invalid list index in 'Items[x]'.\"* for a malformed index, *\"'Items' has 3 item(s); index 5 is out of range.\"*, *\"'Items' is not a list.\"* when you index a non-list, and *\"'X' is empty at 'path'.\"* when an intermediate node is null.","metadata":{"title":"Cost settings","section":"Path syntax","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#path-syntax","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#path-syntax","collection":"scripting","hash":"8f112472a08d7534296b83cd82809b06","indexed_by":"docs-index"}},{"content":"Cost settings — SetSetting\n\n```python\npricing.SetSetting(\"Markets.Gold\", \"68.5\")\npricing.SetSetting(\"Diamonds.CertificateFromCt\", \"0.30\")\nresult = pricing.Calculate()   # prices with the new values\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | — | The path of one value, same syntax as `GetSettingsJson` |\n| `value` | — | The new value as a string; converted to the target's type |\n\nUpdates exactly one value and persists the manufacturer: the change is applied as the active pricing and written back to `Manufacturer.json` in the pricing folder. That makes it a global, persistent change — it affects every document priced against this manufacturer from now on, not just the open one — and it survives closing Rhino. It is not part of the document's undo stack and needs no `Transaction`; to roll it back, set the old value again (read it first with `GetSettingsJson`). The next `Calculate()` prices with the new value.\n\n`value` is always passed as a string and converted with invariant culture to whatever type the target property has:\n\n- numbers — `\"68.5\"`, `\"0.30\"` (decimal point, not comma)\n- booleans — `\"true\"` / `\"false\"`\n- strings — passed through as-is\n- enums — the enum member's name, case-insensitive\n\nA string that does not convert throws *\"'abc' cannot be converted to Double for 'Markets.Gold'.\"*.","metadata":{"title":"Cost settings","section":"SetSetting","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#setsetting","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#setsetting","collection":"scripting","hash":"077cb565e69540ebead33d78a417de8f","indexed_by":"docs-index"}},{"content":"Cost settings — SetSetting\n\nThe path must land on a single writable value, not a container. Pointing at a whole list item throws *\"'Items[2]' is a whole list item — set one of its values instead (e.g. Items[2].Price).\"*; a read-only leaf throws *\"'X' is not a settable value at 'path'.\"*; an empty path throws *\"A settings path is required, e.g. Markets.Gold.\"*. All the navigation errors from `GetSettingsJson` apply too, plus *\"No active manufacturer.\"*. Because it writes, `SetSetting` is licence-gated: it raises `ScriptingNotLicensedException` before touching anything.","metadata":{"title":"Cost settings","section":"SetSetting","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#setsetting","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#setsetting","collection":"scripting","hash":"4a2158c47605343159ea13d1528b7e2a","indexed_by":"docs-index"}},{"content":"Cost settings — ShowPanel\n\n```python\npricing.Calculate()\npricing.ShowPanel()\n```\n\nOpens the Breakdown panel — the interactive price-details view in the Rhino UI. It takes no parameters, returns nothing and computes nothing; it simply shows whatever breakdown the document currently holds. In a scripting context its job is visual inspection: after a `Calculate()` or `CalculateDetailed()` the panel displays the freshly computed totals, so a script can change a cost, recompute, and put the itemised result in front of the user without them touching the ribbon. It must run on the UI thread (Flow Studio's Apply does; ordinary editor scripts do too).","metadata":{"title":"Cost settings","section":"ShowPanel","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#showpanel","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/cost-settings/#showpanel","collection":"scripting","hash":"4d84ef682b704b50f2eba4cc765f3b2f","indexed_by":"docs-index"}},{"content":"Line detail\n\n```python\nfrom ArtisanPlugin.Scripting import PricingApi as pricing\n```\n\n`CalculateDetailed` runs the same Breakdown computation as `Calculate` but returns the panel's full line-level detail: one line per metal (weight, waste, price per gram), per certified diamond (dealer, certificate, quote), per gem group (count, carats, sieve, price per carat, setting type), per process and per extra component. It is the payload to script quotes, cost reports and spreadsheets from.","metadata":{"title":"Line detail","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/","collection":"scripting","hash":"51d941c0caa7079d74a9cc0922f54723","indexed_by":"docs-index"}},{"content":"Line detail — Usage\n\n```python\nd = pricing.CalculateDetailed()                     # -> a PriceBreakdownDetails\noffline = pricing.CalculateDetailed(quoteCertified=False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `quoteCertified` | `True` | `True` fetches live Nivoda quotes for the certified diamonds (network); `False` skips them — offline, but those stones price as 0 and their line's `Quoted` flag is `False`. Same semantics as `Calculate` |","metadata":{"title":"Line detail","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#usage","collection":"scripting","hash":"8185dc32f4deaa7d4cf6d98b5dcb6bdd","indexed_by":"docs-index"}},{"content":"Line detail — What it returns\n\nA `PriceBreakdownDetails`. Every cost is a `double` in the active manufacturer's currency (`Currency` says which); weights are grams, stone sizes are millimetres, stone weights are carats.\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Currency` | str | The manufacturer's currency code |\n| `Total` | float | The grand total across all categories |\n| `TotalFormatted` | str | `Total` with the currency symbol, e.g. `\"1,234.00 €\"`. `str(d)` returns the same |\n| `MetalTotal` | float | Total metal cost |\n| `Metals` | list | One `PriceMetalLine` per metal in the piece |\n| `DiamondsTotal` | float | Certified diamonds total |\n| `DiamondsCarats` | float | Total carats of certified diamonds |\n| `DiamondsCount` | int | Number of certified diamonds |\n| `Diamonds` | list | One `PriceDiamondLine` per certified diamond |\n| `GemsTotal` | float | Gemstones total |\n| `GemsCarats` | float | Total carats of table-priced gems |\n| `GemsCount` | int | Number of table-priced gems |\n| `Gems` | list | One `PriceGemLine` per gem group |\n| `ProcessesTotal` | float | All labour and processes |\n| `ProcessesMetalCost` | float | The metal-process part: printing, cast-finish-polish, finishing, rhodium |\n| `ProcessesSettingCost` | float | The setting-labour part |\n| `ProcessesAdditionalCost` | float | The additional-processes part |\n| `MetalProcesses` | list | One `PriceMetalProcessLine` per metal |\n| `SettingProcesses` | list | One `PriceSettingProcessLine` per setting type |\n| `AdditionalProcesses` | list | `PriceNamedCost` items — name and cost |\n| `ExtrasTotal` | float | Extra components total |\n| `Extras` | list | `PriceNamedCost` items — name and cost |","metadata":{"title":"Line detail","section":"What it returns","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#what-it-returns","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#what-it-returns","collection":"scripting","hash":"c1536ca398c0542a76d09ecf4ff7f976","indexed_by":"docs-index"}},{"content":"Line detail — The line shapes\n\n`PriceMetalLine` — one per metal:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Metal` | str | Metal name, e.g. `\"Gold 18K Yellow\"` |\n| `PricePerGram` | float | The market's price per gram |\n| `WeightGrams` | float | The modelled weight, grams |\n| `Waste` | float | The waste allowance added on top |\n| `TotalWeightGrams` | float | Weight plus waste — what is actually charged |\n| `Cost` | float | `TotalWeightGrams × PricePerGram` |\n\n`PriceDiamondLine` — one per certified diamond:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Dealer` | str | The quoting dealer |\n| `CertificateId` | str | The stone's certificate reference |\n| `Shape` | str | Cut name, e.g. `\"ROUND\"` |\n| `Carats` | float | The stone's carat weight |\n| `LabGrown` | bool | `True` for a lab-grown stone |\n| `Price` | float | The quoted price; 0 when unquoted |\n| `Quoted` | bool | `False` when there is no live Nivoda quote — offline, `quoteCertified=False`, or no match. The stone still counts in `DiamondsCarats`/`DiamondsCount` but prices as 0 |\n\nAlways check `Quoted` before presenting a total as final: a `False` anywhere means the grand total is understated.\n\n`PriceGemLine` — one per group of identical table-priced gems:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Shape` | str | Cut name |\n| `SizeMm` | float | Stone size, millimetres |\n| `Count` | int | Stones in the group |\n| `Carats` | float | Total carats of the group |\n| `PricePerCarat` | float | From the manufacturer's price tables |\n| `Sieve` | str | The sieve designation the table matched |\n| `SettingType` | str | How the stones are set, e.g. `\"Prong\"` |\n| `Cost` | float | The group's total |\n\n`PriceMetalProcessLine` — one per metal:","metadata":{"title":"Line detail","section":"The line shapes","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#the-line-shapes","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#the-line-shapes","collection":"scripting","hash":"f8733bd9b52c9bfb1c575cbbd834823d","indexed_by":"docs-index"}},{"content":"Line detail — The line shapes\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Metal` | str | Metal name |\n| `PrintingCost` | float | 3D-printing cost |\n| `PrintingSize` | str | The print size band applied |\n| `CastFinishPolishCost` | float | Cast-finish-polish cost |\n| `FinishingCost` | float | Finishing cost |\n| `RhodiumCost` | float | Rhodium plating cost |\n\n`PriceSettingProcessLine` — one per setting type: `SettingType` (str), `Count` (int, stones set), `Cost` (float, labour total).\n\n`PriceNamedCost` — used by `AdditionalProcesses` and `Extras`: `Name` (str) and `Cost` (float).","metadata":{"title":"Line detail","section":"The line shapes","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#the-line-shapes","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#the-line-shapes","collection":"scripting","hash":"6d775d72173189db6dfce7108c7b4e6c","indexed_by":"docs-index"}},{"content":"Line detail — Side effects and errors\n\nLike `Calculate`, it never modifies geometry or settings and needs no `Transaction`, but it does recompute and replace the document's cached breakdown — the one the Breakdown panel shows. It throws:\n\n- no open document — *\"No active document.\"*\n- the engine could not produce a breakdown — *\"Pricing could not be computed for this document.\"*","metadata":{"title":"Line detail","section":"Side effects and errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#side-effects-and-errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/pricing/line-detail/#side-effects-and-errors","collection":"scripting","hash":"4d04c31a995974f1c097128c5b77f3fe","indexed_by":"docs-index"}},{"content":"Realtime Render\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nRealtime Render is a separate window hosting a web-based viewer: Artisan exports the document to it as a GLB and the page renders it with its own camera, its own material catalogue and its own lighting. Driving it from a script is how you get a presentable image — or a full set of product shots, or a turntable video — without setting up a raytraced render.\n\nThe window Open the viewer and push document updates into it.\n\nCamera Presets, explicit placement and zoom extents.\n\nMaterials By layer or by part, plus live fine-tuning.\n\nScene & effects Background, environment, lights and post-effects.\n\nCapture One screenshot, or the 8 standard views in one call.\n\nVideo Record the viewer to an MP4, timed or manual.","metadata":{"title":"Realtime Render","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/","collection":"scripting","hash":"f3bf4a756cd6cabc42b558961afbb4ff","indexed_by":"docs-index"}},{"content":"Realtime Render — The three rules\n\nEverything in this facade follows from three facts about the window.\n\nIt is not the Rhino viewport. Every call here talks to the Realtime Render window, never to Rhino's views — to stage the Rhino camera use `rhinoscriptsyntax` or Views. And nothing here modifies the Rhino document, so nothing here needs a `Transaction`: materials, scene options and camera moves restyle the viewer's private copy of the model, and the next export puts the document's truth back.\n\nIt is not live-linked. The window shows the model as of the last export. `UpdateRender` is what pushes document changes across, and it is asynchronous — it returns when the export is queued, not when the viewer has swapped the model in.\n\nIt must be open. Every call throws *\"The Realtime Render window is not open. Call RealtimeRenderApi.ShowRealtimeRender() first.\"* when it is not. The working sequence is always `ShowRealtimeRender` → `UpdateRender` → scene/camera/materials → capture.","metadata":{"title":"Realtime Render","section":"The three rules","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#the-three-rules","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#the-three-rules","collection":"scripting","hash":"528e47d203654989850bcc23d482f6a0","indexed_by":"docs-index"}},{"content":"Realtime Render — The thirty-second product shot\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n\nrtr.ShowRealtimeRender()\nrtr.UpdateRender()\n\nrtr.SetMaterialByLayer(\"Metal 01\", \"ROSE_GOLD\")\nrtr.SetMaterialByLayer(\"Gems 01\", \"DIAMOND\")\nrtr.SetViewerEnvironment(\"studio\", 1.2)\nrtr.SetViewerBackground(\"#1a1a2e\", \"#0b0b14\")\n\nrtr.SetViewerCameraPreset(\"three-quarter\")\nprint(rtr.ViewerScreenshot(r\"C:\\out\\hero.png\"))\n```","metadata":{"title":"Realtime Render","section":"The thirty-second product shot","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#the-thirty-second-product-shot","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#the-thirty-second-product-shot","collection":"scripting","hash":"245ac6f88023b5619bca171f3bcdc6b6","indexed_by":"docs-index"}},{"content":"Realtime Render — Which calls wait, which fire and forget\n\nOnly the calls that need an answer wait for the page: `GetViewerItems`, `SetMaterialByLayer`, `ViewerScreenshot` and `CaptureViews` — those are the ones that can time out. The rest (camera moves, scene options, `SetViewerMaterial`, `EditViewerMaterial`, video start/stop) queue JavaScript into the window and return immediately; anything that goes wrong inside the page afterwards is invisible to your script. Each page notes which side of the line its calls sit on.","metadata":{"title":"Realtime Render","section":"Which calls wait, which fire and forget","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#which-calls-wait-which-fire-and-forget","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/#which-calls-wait-which-fire-and-forget","collection":"scripting","hash":"023ec60477723ffefb158112d8b056c4","indexed_by":"docs-index"}},{"content":"Camera\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nThree ways to place the viewer's camera - none of them touches Rhino's viewports. All three fire and forget: they queue the move into the page and return immediately.\n\nCamera presets\n```python\nrtr.SetViewerCameraPreset(\"three-quarter\")     # -> None\n```\n\nMoves the viewer camera to a named preset and frames the model automatically. Valid ids, exactly as the viewer ships them:\n\n`front`, `back`, `left`, `right`, `top`, `bottom`, `three-quarter`, `three-quarter-left`, `detail`, `dramatic-low`.\n\nThe name you pass is trimmed, lower-cased and has underscores turned into hyphens, so `\"Three_Quarter\"` and `\"three-quarter\"` are the same preset. Anything else throws *\"Unknown camera preset '<name>'. Valid: front, back, left, right, top, bottom, three-quarter, three-quarter-left, detail, dramatic-low.\"* - and that validation happens before the window is touched, so a typo fails the same way whether or not the viewer is open.","metadata":{"title":"Camera","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/","collection":"scripting","hash":"aeea9d29de411c1408802212a614c99e","indexed_by":"docs-index"}},{"content":"Camera — Explicit camera\n\n```python\nfrom Rhino.Geometry import Point3d\nrtr.SetViewerCamera(Point3d(40, -60, 30), Point3d(0, 0, 5))   # -> None\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `position` | required | Camera eye point, `Point3d` |\n| `target` | required | Point the camera looks at, `Point3d` |\n\nBoth points are in viewer/GLB coordinates, which are the same coordinates as the Rhino model, in millimetres. There is no field-of-view or roll argument: the viewer keeps its own lens settings.\n\nUnlike the presets, this does not reframe - the view is exactly what those two points give you, so a target far from the geometry leaves the piece off-screen.","metadata":{"title":"Camera","section":"Explicit camera","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/#explicit-camera","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/#explicit-camera","collection":"scripting","hash":"49871359b8c42ea569d74110b9cd9f21","indexed_by":"docs-index"}},{"content":"Camera — Zoom extents\n\n```python\nrtr.ViewerZoomExtents()            # -> None\n```\n\nFrames the whole model in the viewer, keeping the current direction. Useful after an `UpdateRender` that changed the size of the piece, or after a `SetViewerCamera` that overshot.\n\nTurntables\nThe camera also spins on its own: set `autoRotate` through Scene & effects and the viewer orbits the piece continuously - which, combined with Video, is the whole recipe for a turntable clip.","metadata":{"title":"Camera","section":"Zoom extents","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/#zoom-extents","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/camera/#zoom-extents","collection":"scripting","hash":"aeaee500bd1bd0aad5631f319b01bf5f","indexed_by":"docs-index"}},{"content":"Capture\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nTwo ways to get pixels out of the viewer: one frame exactly as shown, or a full orbit of standard views for a product sheet. Both wait for the page, so both can time out - and both capture whatever the viewer is showing, so set materials and scene first and give it a beat after `UpdateRender`.","metadata":{"title":"Capture","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/","collection":"scripting","hash":"8bbd8123cd6360def6fc1f321de827ac","indexed_by":"docs-index"}},{"content":"Capture — Screenshot\n\n```python\npath = rtr.ViewerScreenshot(r\"C:\\out\\hero\")     # -> \"C:\\out\\hero.png\"\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | Destination file; `.png` is appended when the extension is anything else |\n\nSaves a PNG of the current viewer frame and returns the full path actually written, which is what you should use afterwards rather than the string you passed. Path handling, in order: the path is resolved to an absolute path (a relative one resolves against Rhino's working directory, not your script's folder), `.png` is appended unless the extension already is `.png`, and the containing directory is created if it does not exist. An empty or whitespace path throws *\"A destination file path is required.\"*\n\nThe frame captured is at the window's current size. When the page returns nothing - typically a viewer that has not finished loading - you get *\"The viewer did not return a screenshot.\"* Waits up to 15 seconds, then throws *\"The viewer did not respond in time.\"*","metadata":{"title":"Capture","section":"Screenshot","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/#screenshot","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/#screenshot","collection":"scripting","hash":"4a4e95286e71deb541eef1565d70be67","indexed_by":"docs-index"}},{"content":"Capture — The 8 standard views\n\n```python\npaths = rtr.CaptureViews(r\"C:\\out\\ring-01\", width=1600, height=1600)\nprint(paths)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `folder` | required | Destination folder, created if missing |\n| `width` | `0` (window size) | Capture width in px |\n| `height` | `0` (window size) | Capture height in px |\n\nOne call, eight PNGs: `front`, `right`, `back`, `left`, `three-quarter-right`, `three-quarter-left`, `top`, `bottom` - the viewer orbits the piece, shoots each angle, and restores your camera afterwards. Returns the paths written, one per line.\n\nThis is the slow call of the facade: expect a few seconds (more at large sizes), and it waits up to 2 minutes before throwing *\"The viewer did not finish capturing in time.\"* A page-side failure surfaces as *\"The viewer capture failed: …\"* with the page's own error text.\n\nThe natural use is the product sheet:\n\n```python\nrtr.ShowRealtimeRender()\nrtr.UpdateRender()\nrtr.SetMaterialByLayer(\"Metal 01\", \"WHITE_GOLD\")\nrtr.SetMaterialByLayer(\"Gems 01\", \"DIAMOND\")\n\nfor sku, metal in [(\"R-1001-Y\", \"YELLOW_GOLD\"), (\"R-1001-W\", \"WHITE_GOLD\"), (\"R-1001-R\", \"ROSE_GOLD\")]:\n    rtr.SetMaterialByLayer(\"Metal 01\", metal)\n    rtr.CaptureViews(r\"C:\\out\\%s\" % sku, width=1600, height=1600)\n```","metadata":{"title":"Capture","section":"The 8 standard views","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/#the-8-standard-views","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/capture/#the-8-standard-views","collection":"scripting","hash":"541ee10c0d10168afba4c53aba9c06a8","indexed_by":"docs-index"}},{"content":"Materials\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nThe viewer carries its own material catalogue - metals, gems, pearls, enamels, ceramics - and applies them to parts, where a part is one mesh of the exported model. Because the exporter joins each Rhino layer into one part named after the layer, the natural way to restyle a piece is by layer name, and `SetMaterialByLayer` is the call to reach for first.\n\nViewer-only, all of it: the Rhino document is never modified and no material table entry changes. Assignments made here are persisted the same way a click in the viewer is, so they survive `UpdateRender`'s model reload and reopening the window. To change the document use Design/Render materials or the Studio scene.","metadata":{"title":"Materials","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/","collection":"scripting","hash":"cf5d731bbb712abc972cc62666ffcd79","indexed_by":"docs-index"}},{"content":"Materials — The catalogue names\n\n`materialName` is a viewer catalogue id, upper-cased for you. The families:\n\n- Metals: `YELLOW_GOLD`, `WHITE_GOLD`, `ROSE_GOLD` (each with `_LIGHT`/`_DARK` variants), `GREEN_GOLD`, `GOLD_2N`…`GOLD_6N`, `SILVER`, `PLATINUM`, `TITANIUM` - and every one takes a finish suffix: `_BRUSHED`, `_FLORENTINE`, `_HAMMERED`, `_ROUGH`, `_SANDBLAST`.\n- Gems: `DIAMOND` (plus `_BLACK`, `_CHAMPAGNE`, `_COGNAC_01`, fancy colors...), `RUBY`, `SAPPHIRE` (many colors), `EMERALD`, `MORGANITE`, `AQUAMARINE`, `TOPAZ_*`, `TOURMALINE_*`, `TANZANITE`, `AMETHYST`, `CITRINE`, `PERIDOT`, garnets, `ALEXANDRITE` and more.\n- Others: `PEARL` (12 variants), `ENAMEL_*_TRANSLUCENT` / `ENAMEL_*_OPAQUE`, `CERAMIC_*`, `LEATHER_*`.\n\nAn unknown name is not an error - the page falls back silently, so a misspelled material just looks grey. Spell from this list.","metadata":{"title":"Materials","section":"The catalogue names","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#the-catalogue-names","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#the-catalogue-names","collection":"scripting","hash":"47471f466ef52eaaca1cc299a74c31e3","indexed_by":"docs-index"}},{"content":"Materials — Restyle a whole layer\n\n```python\ncount = rtr.SetMaterialByLayer(\"Metal 01\", \"ROSE_GOLD\")     # -> parts changed\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `layerName` | required | The Rhino layer, matched against the viewer's parts |\n| `materialName` | required | A catalogue name from the list above |\n\nThe layer matches case-insensitively and treats spaces and underscores as equal, so `\"METAL_01\"`, `\"metal 01\"` and `\"Metal 01\"` all hit the same layer. Returns how many parts changed.\n\nThis is the one material call that waits and validates: when nothing matches it throws *\"No viewer part matches layer '<name>'. Available: …\"* listing every layer the viewer actually has - so a script (or an AI agent) can read the error and correct itself. It gives the page 5 seconds and then throws *\"The viewer did not respond in time.\"*","metadata":{"title":"Materials","section":"Restyle a whole layer","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#restyle-a-whole-layer","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#restyle-a-whole-layer","collection":"scripting","hash":"ae07e33008f56ce8651ba72234b33409","indexed_by":"docs-index"}},{"content":"Materials — List the viewer's parts\n\n```python\nimport json\n\nraw = rtr.GetViewerItems()                 # -> str, never None\nitems = json.loads(json.loads(raw))        # -> [{\"uuid\": ..., \"layer\": ..., \"material\": ..., ...}]\n```\n\nReturns the viewer's parts as JSON: an array of objects carrying at least a `uuid`, a `layer` and a `material`. You only need it when addressing single parts - `SetMaterialByLayer` looks the layer up for you.\n\nTwo things about the string. It is JSON produced by `JSON.stringify` inside the page and then JSON-encoded again on the way out of WebView2, so in Python it takes two `json.loads` passes to reach the array. And it never returns `None`: when the page has not finished loading you get the literal string `\"[]\"`. Waits up to 5 seconds, then throws *\"The viewer did not respond in time.\"*","metadata":{"title":"Materials","section":"List the viewer's parts","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#list-the-viewers-parts","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#list-the-viewers-parts","collection":"scripting","hash":"6c74d82b47c3dcd763954e07a31eca39","indexed_by":"docs-index"}},{"content":"Materials — Set a single part's material\n\n```python\nrtr.SetViewerMaterial(part_uuid, \"YELLOW_GOLD\")     # -> None\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `partUuid` | required | A `uuid` from `GetViewerItems()` |\n| `materialName` | required | A catalogue name |\n\nThe by-uuid variant, for when two parts share a layer look you want to break up. Fire and forget: an unknown uuid or material name simply does nothing, with no error. An empty `partUuid` throws *\"Part uuid is required (see GetViewerItems()).\"*","metadata":{"title":"Materials","section":"Set a single part's material","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#set-a-single-parts-material","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#set-a-single-parts-material","collection":"scripting","hash":"4b9fb4bacb5838365b482ace4c8e3b0c","indexed_by":"docs-index"}},{"content":"Materials — Fine-tune a material live\n\n```python\nrtr.EditViewerMaterial(\"YELLOW_GOLD\", color=\"#f5c518\", roughness=0.35)   # -> None\nrtr.EditViewerMaterial(\"DIAMOND\", ior=2.42, opacity=0.95)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `materialName` | required | The catalogue material to edit |\n| `color` | `None` | CSS color (`\"#b76e79\"`, `\"white\"`) |\n| `roughness` | `-1` (untouched) | `0`–`1`, metals |\n| `ior` | `-1` (untouched) | index of refraction, gems, ~`1.4`–`2.4` |\n| `opacity` | `-1` (untouched) | `0`–`1` |\n\nEdits the material everywhere it is currently applied - it mutates the shared catalogue entry, not one part. Pass only what you want changed; passing nothing throws *\"Pass at least one property to edit (color, roughness, ior, opacity).\"*\n\nThe edit is ephemeral: re-applying the material from the catalogue (including via `SetMaterialByLayer`) resets it to stock. Order matters - assign materials first, fine-tune second.","metadata":{"title":"Materials","section":"Fine-tune a material live","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#fine-tune-a-material-live","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/materials/#fine-tune-a-material-live","collection":"scripting","hash":"eefcd3482efca5be51c11bed8003527f","indexed_by":"docs-index"}},{"content":"Scene & effects\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nThe viewer's look - background, lighting, and a full post-processing stack - is one big options object, and this page is the scripted way into it. Two curated calls cover the common moves; the generic `SetViewerOption` reaches everything else. All of them fire and forget, and none of them touches the Rhino document.","metadata":{"title":"Scene & effects","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/","collection":"scripting","hash":"e62db3f444190eda7ab05e003d42c9af","indexed_by":"docs-index"}},{"content":"Scene & effects — Background\n\n```python\nrtr.SetViewerBackground(\"#1a1a2e\", \"#0b0b14\")   # -> None  (top, bottom)\nrtr.SetViewerBackground(\"white\")                # -> None  (top only)\n```\n\nSets the background gradient. Colors are CSS colors - hex or named. Pass one or both ends; passing neither throws *\"Pass at least one color.\"*","metadata":{"title":"Scene & effects","section":"Background","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#background","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#background","collection":"scripting","hash":"59ecf44df299fab76251eb76591723ea","indexed_by":"docs-index"}},{"content":"Scene & effects — Lighting environment\n\n```python\nrtr.SetViewerEnvironment(\"studio\", 1.2)                          # preset + intensity\nrtr.SetViewerEnvironment(\"https://cdn.example.com/loft.hdr\")     # custom HDRI\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `presetOrUrl` | required | A preset name, or an HDR/EXR url |\n| `intensity` | `0` (untouched) | Environment intensity; `1` is neutral |\n\nThe presets, exactly as the viewer ships them: `studio`, `sunset`, `dawn`, `night`, `warehouse`, `forest`, `apartment`, `city`, `park`, `lobby`. Anything that is not one of those and does not look like a url (starts with `http`, or ends in `.hdr`/`.exr`) throws listing the valid names. `intensity` is only written when greater than `0`.","metadata":{"title":"Scene & effects","section":"Lighting environment","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#lighting-environment","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#lighting-environment","collection":"scripting","hash":"ca710c9ae8f292d4601d0378cbc8d49d","indexed_by":"docs-index"}},{"content":"Scene & effects — Any option: SetViewerOption\n\n```python\nrtr.SetViewerOption(\"effectComposerBloomEnabled\", \"true\")     # -> None\nrtr.SetViewerOption(\"effectComposerBloomIntensity\", \"0.6\")\nrtr.SetViewerOption(\"autoRotate\", \"true\")\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | The option key |\n| `value` | required | Parsed as bool, number or string, in that order |\n\n`\"true\"`/`\"false\"` become booleans, anything numeric becomes a number, everything else stays a string (`\"#ffffff\"`). The option groups worth knowing:\n\n| Group | Keys |\n|---|---|\n| Bevel | `bevelEnabled`, `bevelRadius`, `bevelStrength`, `bevelEdgeAmplify` |\n| Contact shadow | `jewelryShadowEnabled`, `…Darkness`, `…Blur`, `…Scale`, `…Falloff`, `…Color`, `…LightX/Y/Z` |\n| Ambient occlusion | `effectComposerN8aoEnabled`, `…Radius`, `…Intensity` |\n| Depth of field | `effectComposerDepthOfFieldEnabled`, `…FocusDistance`, `…FocalLength`, `…BokehScale`, `…Autofocus` |\n| Bloom | `effectComposerBloomEnabled`, `…Intensity`, `…LuminanceThreshold`, `…Radius` |\n| Vignette | `effectComposerVignetteEnabled`, `…Offset`, `…Darkness` |\n| Color grading | `effectComposerBrightnessContrast*`, `effectComposerHueSaturation*` |\n| Caustics | `causticsEnabled`, `causticsIntensity`, `causticsColor`, `causticsIor` |\n| Studio lights | `keyLightEnabled/Intensity/Color`, `fillLight*`, `rimLight*` |\n| Misc | `autoRotate`, `autoRotateSpeed`, `toneMappingExposure`, `environmentBlur` |\n\nAn unknown key is not an error - the page just stores it and nothing changes. Spell carefully.","metadata":{"title":"Scene & effects","section":"Any option: SetViewerOption","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#any-option-setvieweroption","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#any-option-setvieweroption","collection":"scripting","hash":"ae77afcb740652b32c089a1c72469d73","indexed_by":"docs-index"}},{"content":"Scene & effects — A batch of options: SetViewerOptions\n\n```python\nrtr.SetViewerOptions(\"\"\"{\n  \"effectComposerBloomEnabled\": true,\n  \"effectComposerBloomIntensity\": 0.6,\n  \"effectComposerVignetteEnabled\": true,\n  \"jewelryShadowEnabled\": true\n}\"\"\")                                          # -> None\n```\n\nApplies several options in one round trip. The argument is a JSON object of keys to values; anything else throws *\"optionsJson must be a JSON object of option keys to values.\"*, and an empty object throws *\"optionsJson has no options.\"* Values here are real JSON types, so no string-parsing rules apply.","metadata":{"title":"Scene & effects","section":"A batch of options: SetViewerOptions","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#a-batch-of-options-setvieweroptions","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/scene/#a-batch-of-options-setvieweroptions","collection":"scripting","hash":"6b83f738f16d099f20ae8a66ac22100a","indexed_by":"docs-index"}},{"content":"Video\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nThe viewer records itself: what you see is what gets encoded, camera moves and auto-rotation included. Recording is inherently asynchronous - the file appears when the recording ends, not when the call returns - and that shapes both calls on this page.","metadata":{"title":"Video","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/","collection":"scripting","hash":"44b0732b1530162ad70b2973f51fbc33","indexed_by":"docs-index"}},{"content":"Video — Start recording\n\n```python\npath = rtr.StartVideoRecording(r\"C:\\out\\turntable.mp4\", seconds=8)   # -> the path armed\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | Destination file; `.mp4` is appended when there is no extension |\n| `seconds` | `0` | `> 0`: stop and save automatically after that long. `0`: record until `StopVideoRecording()` |\n| `width` / `height` | `0` (window size) | Video size in px - pass both or neither |\n| `frameRate` | `0` (viewer default, 30) | Frames per second |\n\nReturns the full path armed, and the recording starts immediately. `seconds` outside `0`–`3600` throws. The containing directory is created if missing.\n\nHow the file lands: the viewer delivers a finished recording as a browser download, and the window quietly reroutes the next download to your path - no download bar, no Downloads folder. That reroute is one-shot and armed per `StartVideoRecording` call, so start recordings one at a time and let each finish.\n\nThe codec is the viewer's choice: h264 MP4 where the OS supports it (Windows does), WebM otherwise - keeping the default `.mp4` extension is right in practice.","metadata":{"title":"Video","section":"Start recording","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/#start-recording","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/#start-recording","collection":"scripting","hash":"3e929060c8568e955b23e38d3df510b3","indexed_by":"docs-index"}},{"content":"Video — Stop recording\n\n```python\nrtr.StopVideoRecording()          # -> None\n```\n\nEnds a manual recording (`seconds=0`) and triggers the save to the armed path. Saving is asynchronous: give it a moment before reading the file. Calling it when nothing is recording does nothing.\n\nThe turntable, one call\n```python\npath = rtr.RecordTurntable(r\"C:\\out\\turntable.mp4\", seconds=12)   # -> the path armed\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | Destination file; `.mp4` is appended when there is no extension |\n| `seconds` | `8` | Recording length, `1`–`3600` |\n| `width` / `height` / `frameRate` | `0` | As in `StartVideoRecording` |\n\nThe 360 in one call: auto-rotation on, `seconds` of video recorded to `path`, and the rotation scheduled back off inside the page when the recording ends — so your script needs no sleeps and the camera is not left spinning. Like every recording, the file appears when the recording finishes, not when the call returns.\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n\nrtr.ShowRealtimeRender()\nrtr.UpdateRender()\nrtr.SetMaterialByLayer(\"Metal 01\", \"YELLOW_GOLD\")\nrtr.SetViewerCameraPreset(\"three-quarter\")\nrtr.RecordTurntable(r\"C:\\out\\turntable.mp4\", seconds=12)\n```\n\nThe manual recipe — `SetViewerOption(\"autoRotate\", \"true\")`, a timed `StartVideoRecording`, and turning the rotation off yourself — still works when you want camera moves of your own during the take.\n\nFor a photoreal (and much slower) turntable through Rhino's raytracer, see Studio turntables instead.","metadata":{"title":"Video","section":"Stop recording","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/#stop-recording","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/video/#stop-recording","collection":"scripting","hash":"5684ccfc1b9cce65b56ce544924e6e9a","indexed_by":"docs-index"}},{"content":"The window\n\n```python\nfrom ArtisanPlugin.Scripting import RealtimeRenderApi as rtr\n```\n\nTwo calls own the window's lifecycle: one opens it, one feeds it. Everything else in this section assumes both have run.\n\nShow the viewer\n```python\nok = rtr.ShowRealtimeRender()      # -> True when the window opened or was activated\n```\n\nOpens the Realtime Render window, or activates it when it is already open - the `ArtisanRealtimeRender` command, which is hidden from the command list, so this is the only scriptable way in. Returns the command's own success flag as a `bool`.\n\nRequires a valid licence. The window carries its own local HTTP server, and the page needs a moment to load; the calls in the rest of this section fail cleanly if you get ahead of it, so retry rather than assume.","metadata":{"title":"The window","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/","collection":"scripting","hash":"0611849fdc3435b5343624f867be15aa","indexed_by":"docs-index"}},{"content":"The window — Push the document into the viewer\n\n```python\nrtr.UpdateRender()                 # -> None\n```\n\nRe-exports the current document to the viewer - the `ArtisanRenderUpdate` command. The export runs in the background, so this returns as soon as the export is queued, not when the viewer has finished swapping the model in. Requires a valid licence.\n\nCall it after any geometry or material change you want to see. The window is not live: without an `UpdateRender` the viewer keeps showing the model from the previous export.\n\nIf the viewer's HTTP server is not running you get *\"The Realtime Render window is not open. Call RealtimeRenderApi.ShowRealtimeRender() first.\"* - the underlying command only logged that condition, which a script would never see.","metadata":{"title":"The window","section":"Push the document into the viewer","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/#push-the-document-into-the-viewer","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/#push-the-document-into-the-viewer","collection":"scripting","hash":"48cb7e6de8f3d620ff9a4fc6e8eea1a6","indexed_by":"docs-index"}},{"content":"The window — What the export looks like from the viewer's side\n\nThe exporter joins all of a layer's meshes into one part named after the Rhino layer. That single fact is why Materials can address parts by layer name, and why the viewer's part list mirrors your layer structure rather than your object list. Hidden and locked layers are skipped.\n\nAn export also resets whatever the viewer was showing: materials assigned in the viewer and camera framing survive as the page re-applies its saved state, but give it a beat before capturing.","metadata":{"title":"The window","section":"What the export looks like from the viewer's side","url":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/#what-the-export-looks-like-from-the-viewers-side","source":"https://www.rhinoartisan.com/docs/scripting/reference/realtime-render/viewer/#what-the-export-looks-like-from-the-viewers-side","collection":"scripting","hash":"644773f2cd104ff4704272c4eb33a66c","indexed_by":"docs-index"}},{"content":"Relief\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nA relief is a 2.5D height field — a flat area given depth, the way an engraved crest or a cameo sits proud of its background. Artisan builds it as a stack of ordered operations evaluated onto a grid, which you can either produce in one call or assemble step by step. Each part has its own page.\n\nFrom image A relief from a grayscale height map, in one call.\n\nFrom curves Closed curves filled with a height profile — the puffed relief.\n\nFrom geometry Project document geometry top-down into a relief.\n\nProject stack What a project is, its queries, and how to start one.\n\nOperations The seven Add* operations that build the stack — brushes included.\n\nEdit the stack Toggle, re-combine, reorder, remove, clear.\n\nBake & export Mesh into the document, or a 16-bit TIFF for CAM.","metadata":{"title":"Relief","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/","collection":"scripting","hash":"67c7ea2311dab81e08535ace34e2b736","indexed_by":"docs-index"}},{"content":"Relief — Two routes to a relief\n\n| Route | Pages | When |\n|---|---|---|\n| One shot | From image, From curves, From geometry | You know the whole relief up front — set it up and produce it in a single call |\n| Step by step | Project stack → Operations → Edit the stack → Bake | You are composing several layers, or want to reorder and re-combine before committing |\n\nThe step-by-step route is the same machine underneath: the one-shot creators set up a project and run it for you.","metadata":{"title":"Relief","section":"Two routes to a relief","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#two-routes-to-a-relief","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#two-routes-to-a-relief","collection":"scripting","hash":"03efe0dd6ca4086313d537672cb17c2c","indexed_by":"docs-index"}},{"content":"Relief — Operation ids are not object ids\n\nThe `Add*` operations return the id of an operation inside the project, not a document object. Every method on Edit the stack takes exactly that id. Only Bake puts geometry in the document.\n\nConventions\nMillimetres, and mutations belong inside a `Transaction` for one-step undo. Profile names come from `ProfileNames()` — see The project stack.","metadata":{"title":"Relief","section":"Operation ids are not object ids","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#operation-ids-are-not-object-ids","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#operation-ids-are-not-object-ids","collection":"scripting","hash":"6f6fb28a4da02a25104defb8a0918699","indexed_by":"docs-index"}},{"content":"Relief — Not scriptable yet\n\nOnly the purely interactive layer remains UI-only: painting with the mouse, the live preview gizmos and the graphical profile editor. The brush operations themselves ARE scriptable — Sculpt and Smooth dab programmatically from a list of points.\n\n`SetupProject`'s `0` means \"the panel default\", not \"keep what is saved\": calling `SetupProject()` on an existing 20 × 20 project resets it to 50 × 50. Pass the values you want to keep, or only call it when you mean to reconfigure.","metadata":{"title":"Relief","section":"Not scriptable yet","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#not-scriptable-yet","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/#not-scriptable-yet","collection":"scripting","hash":"bad57dde09f297eaed3ae0bbd5443665","indexed_by":"docs-index"}},{"content":"Bake and export\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nThe stack is only a recipe until it is evaluated. Two ways out: a mesh in the document, ready to be cast or joined to a shank, or a greyscale height map for a milling machine. Both recompute the saved project at full resolution — the preview resolution cap the panel uses to stay interactive is never applied headless, so expect the call to take real time at 1024 nodes and above.\n\nBoth require a saved relief project. Without one they throw `This document has no relief project; create one with SetupProject/Add* or the ArtisanRelief command.`, and with an empty stack, `The relief project has no operations; add at least one.`","metadata":{"title":"Bake and export","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/","collection":"scripting","hash":"5da4a56e90802c0240f0269169ae21fa","indexed_by":"docs-index"}},{"content":"Bake and export — Bake\n\n```python\nmesh_id = relief.Bake()\n```\n\nTakes no parameters. It recomputes the project and adds the result to the document as a plain Rhino mesh — an open relief surface when the project's `OutputType` is `\"Mesh\"`, a closed solid capped `CapDistance` millimetres below the workbench plane when it is `\"Thickness\"`. This is the panel's Accept, headless. The returned `Guid` is a genuine document object id, unlike the operation ids the `Add*` calls return.\n\nThe project is not consumed. It stays in the document exactly as it was, still editable and still bakeable: change a height, re-bake, and you get a *second* mesh — the first one is not replaced or deleted. Nor is the mesh linked back to the project; it is an ordinary mesh from that point on, and survives `ClearProject()`. If you are iterating, delete the previous mesh yourself.\n\nThe call opens its own undo record named `\"Relief\"`, which is a no-op inside a scripting `Transaction` — wrap it in one when the bake is part of a longer edit so the whole thing undoes in one step. The views are redrawn on success.\n\nErrors, all raised before or instead of adding anything to the document:","metadata":{"title":"Bake and export","section":"Bake","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#bake","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#bake","collection":"scripting","hash":"08a93296d7221f77d7e5a212fbc8787c","indexed_by":"docs-index"}},{"content":"Bake and export — Bake\n\n| Message | Cause |\n|---|---|\n| `These relief operations could not be computed (missing curves, objects or files): .` | An enabled operation references a deleted curve or object, a curve that is no longer closed, or a missing image/texture file. The kernel would silently skip it; headless that would bake a quietly wrong relief, so it is surfaced instead. Disable the operation or repair the reference — `Operations()` flags them as `MissingReferences` |\n| `Relief computation failed with the given parameters (…).` | The height field could not be evaluated |\n| `Relief meshing failed (…).` | The field was computed but the mesh could not be built from it |\n| `The relief has nothing to build; enable at least one operation.` | Every operation in the stack is disabled |\n| `Rhino rejected the relief mesh.` | The mesh was built but the document refused it |","metadata":{"title":"Bake and export","section":"Bake","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#bake","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#bake","collection":"scripting","hash":"6d746d0358f9ac6a8606a2a38b8b2acb","indexed_by":"docs-index"}},{"content":"Bake and export — Export heightmap\n\n```python\nrelief.ExportHeightmap(filePath)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `filePath` | — | Path of the TIFF to write; it should end in `.tif` or `.tiff` |\n\nReturns nothing. It recomputes the project the same way `Bake` does and writes the height field straight to disk as a 16-bit greyscale TIFF, black at the lowest point and white at the highest — the depth CNC and CAM pipelines expect, and the reason a relief exported this way keeps far more Z detail than an 8-bit PNG could carry. Nothing is added to the document and the project is left untouched.\n\nThe path is normalised through the full path of the current process working directory before the folder is checked, so a relative path is resolved rather than rejected — but the *folder* must already exist: a missing one throws `Folder not found: `, with the absolute path it resolved to. Pass an absolute path when you want certainty about where the file lands. A blank path throws `Pass the path of the TIFF file to write.` The extension is not enforced; the file is written as TIFF whatever you name it. An existing file at that path is overwritten.\n\nBeyond the shared errors above, `The relief project has nothing to export.` means the recompute produced no height field at all.\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief, Transaction\n\nwith Transaction.Begin(\"Signet relief\"):\n    mesh_id = relief.Bake()\n\nrelief.ExportHeightmap(r\"C:\\out\\signet.tif\")   # writes a file, changes nothing\n```","metadata":{"title":"Bake and export","section":"Export heightmap","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#export-heightmap","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/bake-and-export/#export-heightmap","collection":"scripting","hash":"94643630c7899c8d981b710db22d8f30","indexed_by":"docs-index"}},{"content":"Create from curves\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nA 2.5D relief is a height field: a flat rectangular grid laid on a plane, where every node is pushed up (or down) by some amount and the result is meshed. This entry point starts from closed curves - a monogram, a leaf, a coat of arms drawn flat - and fills them with a cross-section profile so they swell out of the plane. It is the classic puffed relief, and the same operation the panel calls a profile layer.","metadata":{"title":"Create from curves","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/","collection":"scripting","hash":"e5a057e6de4b0f598782a0c0613d5859","indexed_by":"docs-index"}},{"content":"Create from curves — Usage\n\n```python\nid = relief.CreateFromCurves(curveIds, height = 0, profile = None,\n                             startingHeight = 0, fixedProfileWidth = 0, feather = 0,\n                             worldWidth = 0, worldHeight = 0, resolution = 0,\n                             workbench = None, solid = True, capDistance = 0,\n                             deleteBase = False)                  # -> the baked mesh's id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveIds` | - | Closed curves to fill; at least one is required |\n| `height` | `0` (means `1.0`) | Peak height of the profile, mm. Negative engraves instead of raising |\n| `profile` | `None` (means `\"Round\"`) | Cross-section by name - `Round`, `Smooth`, `Chamfer`, `Plateau`, or any of your saved profiles; see `ProfileNames()` |\n| `startingHeight` | `0` | Z offset where the profile takes off, mm. A real `0`, not a default |\n| `fixedProfileWidth` | `0` | `0` inflates: the profile peaks at the deepest point inside the curve set. Any value `> 0` makes the profile span exactly that width, mm, in from the curve edge |\n| `feather` | `0` | Edge blend distance, mm. A real `0`, meaning a hard edge |\n| `worldWidth` | `0` | Workbench width, mm - see below |\n| `worldHeight` | `0` | Workbench height, mm - see below |\n| `resolution` | `0` (means `512`) | Grid nodes along the larger side, 64-4096 |\n| `workbench` | `None` | The `Plane` the relief sits on; the grid is centred on its origin |\n| `solid` | `True` | `True` bakes a closed solid, `False` an open relief mesh |\n| `capDistance` | `0` (means `1.0`) | Solid thickness below the base plane, mm - ignored when `solid = False` |\n| `deleteBase` | `False` | `True` trims away grid cells no operation touched |","metadata":{"title":"Create from curves","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#usage","collection":"scripting","hash":"330e57366ba6d3f40ba7d012ff792dc6","indexed_by":"docs-index"}},{"content":"Create from curves — Usage\n\nThe call returns the `Guid` of a plain Rhino mesh - the baked relief, added to the document on the current layer with no group, no parametric tag and nothing to re-drive it from. It is added inside an undo record named \"Relief\", which collapses into the surrounding `Transaction` when you have one, and the views are redrawn before the id comes back. The source curves are left where they are.\n\n`height` is the one to watch: `0` means the 1.0 mm default, so there is no way to ask for a flat fill. `startingHeight`, `fixedProfileWidth` and `feather` are the opposite - their `0` is a genuine value, and `fixedProfileWidth = 0` specifically selects inflate mode rather than \"use the default width\". Everything is in model units (mm in a standard Artisan document).","metadata":{"title":"Create from curves","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#usage","collection":"scripting","hash":"a538d6d7662da7159662b6b762b81691","indexed_by":"docs-index"}},{"content":"Create from curves — The workbench\n\nThe workbench is the plane and the rectangle of grid the relief is computed on, and here it is fitted to the curves you passed.\n\nWith `workbench` left as `None`, the plane keeps world XY axes but its origin moves to the centre of the curves in X and Y and to their lowest Z, so the whole profile rises above the plane - flat curves drawn on a raised construction plane still work. Any of `worldWidth` / `worldHeight` left at `0` is then fitted: the curve bounding-box corners are remapped into plane space and the side is taken as twice the largest absolute local coordinate, plus 10% margin. Each side is fitted independently, so passing only `worldWidth` fits the height and honours your width.\n\nPass an explicit `workbench` and it is used exactly as given - it is never re-centred - but the size fit stays symmetric about that plane's origin, so an off-centre plane produces a much larger grid than you might expect. If the curves somehow yield no valid bounds, the sides fall back to 50 x 50 mm.","metadata":{"title":"Create from curves","section":"The workbench","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#the-workbench","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#the-workbench","collection":"scripting","hash":"bbfa7bb38e410032d5c3bd5bd8c4c287","indexed_by":"docs-index"}},{"content":"Create from curves — Errors\n\nAn empty or `None` `curveIds` throws `Pass at least one closed curve.` Every id must resolve to a curve in the active document and be closed: `Object is not a curve in this document.` or `Curve is not closed; relief regions need closed curves.`\n\nA negative `fixedProfileWidth` throws `fixedProfileWidth cannot be negative.`, and an unrecognised profile name throws `Unknown relief profile ' '. Use one of: ...` listing everything `ProfileNames()` returns. Names match case-insensitively.\n\nWorkbench settings are validated before anything is computed: `Workbench size cannot be negative.`, `Resolution must be between 64 and 4096 (0 = default 512).`, `capDistance cannot be negative.`\n\nThen the relief is computed at full resolution and meshed. If the kernel rejects the parameters you get `Relief computation failed with the given parameters (...)`; if the meshing stage fails, `Relief meshing failed (...)`; if the result is empty, `The relief has nothing to build; enable at least one operation.` The call also needs an active document and a valid licence.","metadata":{"title":"Create from curves","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#errors","collection":"scripting","hash":"35cec0066955cd9c11fd8e7315972bb6","indexed_by":"docs-index"}},{"content":"Create from curves — One shot versus the project stack\n\nThis is a one-shot creator: it builds a throwaway single-operation project, bakes it and hands you the mesh. The document's saved relief project is not read, not written and not disturbed, so the ArtisanRelief panel will show whatever it showed before.\n\nWhen you need more than one layer - a puffed monogram with an image or a 3D texture merged over it, or several profile passes with different combine modes - or you want the user to keep refining the result in the panel afterwards, use the step-by-step route instead: `SetupProject`, then `AddProfile` and friends, then `Bake`. See the project stack.\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief, Transaction\n\nwith Transaction.Begin(\"Puffed monogram\"):\n    mesh_id = relief.CreateFromCurves(letter_ids, height = 1.2, profile = \"Smooth\",\n                                      feather = 0.15, solid = False)\n```","metadata":{"title":"Create from curves","section":"One shot versus the project stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#one-shot-versus-the-project-stack","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-curves/#one-shot-versus-the-project-stack","collection":"scripting","hash":"5a7f5a4e16542b4abc80810afc16f27b","indexed_by":"docs-index"}},{"content":"Create from geometry\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nA 2.5D relief is a height field: a flat rectangular grid laid on a plane, where every node is pushed up (or down) by some amount and the result is meshed. This entry point starts from geometry already in the document - meshes, breps, extrusions or SubDs - projected straight down onto the workbench, so the height of each object above the plane becomes the relief. It is how a modelled ornament gets flattened into something a mill or a wax printer can take as a plaque.","metadata":{"title":"Create from geometry","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/","collection":"scripting","hash":"d4663ec107a60b61b87a15c1f0a9ad2f","indexed_by":"docs-index"}},{"content":"Create from geometry — Usage\n\n```python\nid = relief.CreateFromGeometry(objectIds, feather = 0,\n                               worldWidth = 0, worldHeight = 0, resolution = 0,\n                               workbench = None, solid = True, capDistance = 0,\n                               deleteBase = False)                # -> the baked mesh's id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Meshes, breps, extrusions or SubDs to project; at least one is required |\n| `feather` | `0` | Edge blend distance, mm. A real `0`, meaning a hard edge |\n| `worldWidth` | `0` | Workbench width, mm - see below |\n| `worldHeight` | `0` | Workbench height, mm - see below |\n| `resolution` | `0` (means `512`) | Grid nodes along the larger side, 64-4096 |\n| `workbench` | `None` | The `Plane` the relief sits on; the grid is centred on its origin |\n| `solid` | `True` | `True` bakes a closed solid, `False` an open relief mesh |\n| `capDistance` | `0` (means `1.0`) | Solid thickness below the base plane, mm - ignored when `solid = False` |\n| `deleteBase` | `False` | `True` trims away grid cells no operation touched |\n\nThere is no `height` here: the projection takes its heights from the objects themselves, and `feather` is the only shaping parameter. Anything an object hides beneath itself - undercuts, hollows, back faces - is lost, which is what makes the result 2.5D.","metadata":{"title":"Create from geometry","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#usage","collection":"scripting","hash":"20d9b7ed7cdcba2dbde0d121e1593460","indexed_by":"docs-index"}},{"content":"Create from geometry — Usage\n\nThe call returns the `Guid` of a plain Rhino mesh - the baked relief, added to the document on the current layer with no group, no parametric tag and nothing to re-drive it from. It is added inside an undo record named \"Relief\", which collapses into the surrounding `Transaction` when you have one, and the views are redrawn before the id comes back. The source objects are left untouched; delete them yourself if the relief is meant to replace them. Everything is in model units (mm in a standard Artisan document).","metadata":{"title":"Create from geometry","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#usage","collection":"scripting","hash":"e64a8027e8c046d93632a8ea563508a4","indexed_by":"docs-index"}},{"content":"Create from geometry — The workbench\n\nThe workbench is the plane and the rectangle of grid the relief is computed on, and here it is fitted to the bounding boxes of the objects you passed.\n\nWith `workbench` left as `None`, the plane keeps world XY axes but its origin moves to the centre of the objects in X and Y and to their lowest Z - so the plane sits right under the geometry and the whole projected height is positive. Any of `worldWidth` / `worldHeight` left at `0` is then fitted: the bounding-box corners are remapped into plane space and the side is taken as twice the largest absolute local coordinate, plus 10% margin. Each side is fitted independently, so passing only `worldWidth` fits the height and honours your width.\n\nPass an explicit `workbench` and it is used exactly as given - it is never re-centred - but the size fit stays symmetric about that plane's origin, so an off-centre plane produces a much larger grid than you might expect. If the objects yield no valid bounds, the sides fall back to 50 x 50 mm. The plane's direction is what decides the projection, so a tilted or reversed `workbench` is how you relieve something from an angle other than straight down the world Z.","metadata":{"title":"Create from geometry","section":"The workbench","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#the-workbench","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#the-workbench","collection":"scripting","hash":"56b5a37c401299c4b1b19bc0713942a6","indexed_by":"docs-index"}},{"content":"Create from geometry — Errors\n\nAn empty or `None` `objectIds` throws `Pass at least one mesh, brep, extrusion or SubD.` Every id must resolve in the active document - `Object was not found in this document.` - and must be a mesh, a SubD, or something with a brep form: `Object is not a mesh, brep, extrusion or SubD.` Curves, points and annotations are rejected here.\n\nWorkbench settings are validated before anything is computed: `Workbench size cannot be negative.`, `Resolution must be between 64 and 4096 (0 = default 512).`, `capDistance cannot be negative.`\n\nThen the relief is computed at full resolution and meshed. If the kernel rejects the parameters you get `Relief computation failed with the given parameters (...)`; if the meshing stage fails, `Relief meshing failed (...)`; if the result is empty, `The relief has nothing to build; enable at least one operation.` The call also needs an active document and a valid licence.","metadata":{"title":"Create from geometry","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#errors","collection":"scripting","hash":"0b0437552a2bdaf173739a4adf357c17","indexed_by":"docs-index"}},{"content":"Create from geometry — One shot versus the project stack\n\nThis is a one-shot creator: it builds a throwaway single-operation project, bakes it and hands you the mesh. The document's saved relief project is not read, not written and not disturbed, so the ArtisanRelief panel will show whatever it showed before.\n\nWhen you need more than one layer - a projected ornament with a texture or an image merged over it, or subtracted from a puffed base - or you want the user to keep refining the result in the panel afterwards, use the step-by-step route instead: `SetupProject`, then `AddGeometry` and friends, then `Bake`. See the project stack.\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief, Transaction\n\nwith Transaction.Begin(\"Flatten ornament\"):\n    mesh_id = relief.CreateFromGeometry(ornament_ids, feather = 0.2,\n                                        resolution = 1024, capDistance = 1.5)\n```","metadata":{"title":"Create from geometry","section":"One shot versus the project stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#one-shot-versus-the-project-stack","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-geometry/#one-shot-versus-the-project-stack","collection":"scripting","hash":"edd183e756924d8dc6b7b5318c4299ec","indexed_by":"docs-index"}},{"content":"Create from image\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nA 2.5D relief is a height field: a flat rectangular grid laid on a plane, where every node is pushed up (or down) by some amount and the result is meshed - the engraved plaque, the puffed monogram, the textured signet face. This entry point starts from a grayscale image: pixel brightness becomes height, white highest, and the picture is either fitted to the whole workbench or clipped into a set of closed curves.","metadata":{"title":"Create from image","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/","collection":"scripting","hash":"438a64f49b5a23eec1818e55bd55bd37","indexed_by":"docs-index"}},{"content":"Create from image — Usage\n\n```python\nid = relief.CreateFromImage(imagePath, height = 0, invert = False, scale = 0,\n                            regionCurveIds = None,\n                            worldWidth = 0, worldHeight = 0, resolution = 0,\n                            workbench = None, solid = True, capDistance = 0,\n                            deleteBase = False)                  # -> the baked mesh's id\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `imagePath` | - | PNG, JPG, BMP or TIFF file on disk; pixel brightness maps to height |\n| `height` | `0` (means `1.0`) | Height at pure white, mm. Negative engraves instead of raising |\n| `invert` | `False` | `True` maps black to the highest point |\n| `scale` | `0` (means `1.0`) | Multiplier over the fitted image size |\n| `regionCurveIds` | `None` | Closed planar curves: the image fits their bounds and is clipped to their interior. Omitted, the image is centred on the workbench keeping its aspect ratio |\n| `worldWidth` | `0` | Workbench width, mm - see below |\n| `worldHeight` | `0` | Workbench height, mm - see below |\n| `resolution` | `0` (means `512`) | Grid nodes along the larger side, 64-4096 |\n| `workbench` | `None` | The `Plane` the relief sits on; the grid is centred on its origin |\n| `solid` | `True` | `True` bakes a closed solid, `False` an open relief mesh |\n| `capDistance` | `0` (means `1.0`) | Solid thickness below the base plane, mm - ignored when `solid = False` |\n| `deleteBase` | `False` | `True` trims away grid cells no operation touched |","metadata":{"title":"Create from image","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#usage","collection":"scripting","hash":"5eca7a7066de6d463d98b65e273483c1","indexed_by":"docs-index"}},{"content":"Create from image — Usage\n\nThe call returns the `Guid` of a plain Rhino mesh - the baked relief, added to the document on the current layer with no group, no parametric tag and nothing to re-drive it from. It is added inside an undo record named \"Relief\", which collapses into the surrounding `Transaction` when you have one, and the views are redrawn before the id comes back.\n\nNote that `height = 0` and `scale = 0` are defaults, not values: you cannot ask for a zero-height image this way. Everything is in model units (mm in a standard Artisan document).","metadata":{"title":"Create from image","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#usage","collection":"scripting","hash":"6bc684af37151ebda154b554b4ff6f0a","indexed_by":"docs-index"}},{"content":"Create from image — The workbench\n\nThe workbench is the plane and the rectangle of grid the relief is computed on. The resolution of the fit depends on whether you passed region curves, because those are the only inputs this creator can measure.\n\nWith `regionCurveIds`, and `workbench` left as `None`, the plane keeps world XY axes but its origin moves to the centre of the curves in X and Y and to their lowest Z, so all the height sits above the plane. Any of `worldWidth` / `worldHeight` left at `0` is then fitted: the curve corners are remapped into plane space and the side is taken as twice the largest absolute local coordinate, plus 10% margin. Each side is fitted independently, so passing only `worldWidth` fits the height and honours your width.\n\nWithout region curves there is nothing to measure. The plane falls back to plain world XY at the origin, and `worldWidth` / `worldHeight` left at `0` fall back to 50 x 50 mm. Pass an explicit `workbench` and it is used exactly as given - it is never re-centred - but the size fit stays symmetric about that plane's origin, so an off-centre plane produces a much larger grid than you might expect.","metadata":{"title":"Create from image","section":"The workbench","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#the-workbench","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#the-workbench","collection":"scripting","hash":"c7f206cab1b420825892b4bb93524fb0","indexed_by":"docs-index"}},{"content":"Create from image — Errors\n\nThe image is checked first: a blank path or a file that is not on disk throws `Image file not found: `. Region curves must resolve in the active document and be closed - `Object is not a curve in this document.` or `Curve is not closed; relief regions need closed curves.`\n\nWorkbench settings are validated before anything is computed: `Workbench size cannot be negative.`, `Resolution must be between 64 and 4096 (0 = default 512).`, `capDistance cannot be negative.`\n\nThen the relief is computed at full resolution and meshed. If the kernel rejects the parameters you get `Relief computation failed with the given parameters (...)`; if the meshing stage fails, `Relief meshing failed (...)`; if the result is empty, `The relief has nothing to build; enable at least one operation.` The call also needs an active document and a valid licence.","metadata":{"title":"Create from image","section":"Errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#errors","collection":"scripting","hash":"18c4b9d5f231e68f1934b2368ca4a598","indexed_by":"docs-index"}},{"content":"Create from image — One shot versus the project stack\n\nThis is a one-shot creator: it builds a throwaway single-operation project, bakes it and hands you the mesh. The document's saved relief project is not read, not written and not disturbed, so the ArtisanRelief panel will show whatever it showed before.\n\nWhen you need more than one layer - an image over a puffed profile, a texture subtracted from it - or you want the user to keep refining the result in the panel afterwards, use the step-by-step route instead: `SetupProject`, then `AddImage` and friends, then `Bake`. See the project stack.\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief, Transaction\n\nwith Transaction.Begin(\"Engraved plaque\"):\n    mesh_id = relief.CreateFromImage(r\"C:\\art\\crest.png\", height = 0.6,\n                                     regionCurveIds = [outline_id],\n                                     resolution = 1024, capDistance = 0.8)\n```","metadata":{"title":"Create from image","section":"One shot versus the project stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#one-shot-versus-the-project-stack","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/create-from-image/#one-shot-versus-the-project-stack","collection":"scripting","hash":"cdc5178cbaf480ce1ffa88ad02cf90d0","indexed_by":"docs-index"}},{"content":"Editing the stack\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nOnce a relief project exists, its stack can be reworked without rebuilding it: mute a layer to compare two versions of a signet face, drop a texture below the dome it was meant to modulate, or throw the whole recipe away and start again. Every one of these calls edits the document's saved project and writes it straight back, so run them inside a `Transaction` for one-step undo.\n\nAll four operation-level methods take the operation id — the `Guid` returned by an `Add*` call or read from `Operations()[i].Id`. It is not a document object id. An id that is not in the stack throws `No relief operation with id ; see ReliefApi.Operations().`, and every one of them throws `This document has no relief project; create one with SetupProject/Add* or the ArtisanRelief command.` when there is no project at all.","metadata":{"title":"Editing the stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/","collection":"scripting","hash":"af216bdb6f50d078d85f42df3d0a1b42","indexed_by":"docs-index"}},{"content":"Editing the stack — Enable or disable an operation\n\n```python\nrelief.SetOperationEnabled(operationId, enabled)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `operationId` | — | The operation id |\n| `enabled` | — | `False` mutes the layer, `True` restores it |\n\nReturns nothing. This is the panel's eye toggle: a disabled operation stays in the stack, keeps its index and its combine mode, and is skipped when the height field is evaluated — so it neither contributes to the bake nor fails it if its references have gone missing.","metadata":{"title":"Editing the stack","section":"Enable or disable an operation","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#enable-or-disable-an-operation","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#enable-or-disable-an-operation","collection":"scripting","hash":"09e0b54df1ff2514d694e8e68e6380e8","indexed_by":"docs-index"}},{"content":"Editing the stack — Change how an operation merges\n\n```python\nrelief.SetOperationCombine(operationId, combine)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `operationId` | — | The operation id |\n| `combine` | — | `\"Add\"`, `\"Subtract\"`, `\"ZMax\"`, `\"ZMin\"`, `\"Absolute\"` or `\"Multiply\"` — case-insensitive; unknown names throw listing the vocabulary |\n\nReturns nothing. The mode describes how this layer merges into whatever the operations below it have already built, so the same mode on the same layer gives a different result at a different index. The full vocabulary is on The project stack.","metadata":{"title":"Editing the stack","section":"Change how an operation merges","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#change-how-an-operation-merges","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#change-how-an-operation-merges","collection":"scripting","hash":"91e0a53835645f398d1491135764e0a7","indexed_by":"docs-index"}},{"content":"Editing the stack — Reorder an operation\n\n```python\nrelief.MoveOperation(operationId, newIndex)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `operationId` | — | The operation id |\n| `newIndex` | — | The target position; `0` is applied first |\n\nReturns nothing. The operation is lifted out of the stack and re-inserted at `newIndex`, so the indices of everything between shift by one — read `Operations()` again rather than assuming the other positions held.\n\n`newIndex` is validated against the stack before the operation id is looked up: outside `0 … OperationCount - 1` it throws `newIndex must be between 0 and .`, so a bad index is reported even when the id is also wrong.","metadata":{"title":"Editing the stack","section":"Reorder an operation","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#reorder-an-operation","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#reorder-an-operation","collection":"scripting","hash":"22cd8af8eeaa909b72f1c6b971b2533f","indexed_by":"docs-index"}},{"content":"Editing the stack — Remove an operation\n\n```python\nrelief.RemoveOperation(operationId)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `operationId` | — | The operation id |\n\nReturns nothing. The layer is dropped and everything above it shifts down one index; the id is gone for good. Removing the last remaining operation leaves the project with an empty stack — the project itself survives, workbench settings included, ready for the next `Add*`. Deleting the saved project entirely is `ClearProject`.","metadata":{"title":"Editing the stack","section":"Remove an operation","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#remove-an-operation","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#remove-an-operation","collection":"scripting","hash":"1a9e75d840235f93b35a31d7d46f80ae","indexed_by":"docs-index"}},{"content":"Editing the stack — Clear the project\n\n```python\nrelief.ClearProject()\n```\n\nTakes no parameters and returns nothing. It deletes the document's saved relief project outright — settings, workbench and every operation, including the sculpt and smooth layers painted in the panel. There is nothing to confirm and no error when the document had no project.\n\nMeshes already produced by `Bake()` are ordinary Rhino meshes with no link back to the project, so they are left exactly where they are.","metadata":{"title":"Editing the stack","section":"Clear the project","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#clear-the-project","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/editing-the-stack/#clear-the-project","collection":"scripting","hash":"15f603c9b5cbfe6fb0a9ec9f8a8364ed","indexed_by":"docs-index"}},{"content":"Operations\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nSeven kinds of layer can be appended to the document's relief project — the puffed curve fill of a signet crest, a flat engraved border, a scanned monogram, a knurled texture over a band, a modelled ornament flattened top-down — plus the two brushes, dabbed programmatically. Each call only records the layer; the height field is not evaluated until you bake or export.\n\n**Every `Add*` method returns an operation id, not a document object id.** The `Guid` identifies the layer inside the relief project — it is not a Rhino object, will not appear in `doc.Objects`, and cannot be selected, transformed or deleted with Rhino calls. It is exactly the handle the five methods on Editing the stack take, and the same value `Operations()` reports as `Id`. The only `Guid` these APIs return that *is* a document object is the mesh from `Bake()`.\n\nAll five share two trailing parameters:\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `combine` | `\"Add\"` | How this layer merges into what the operations below already built. The full vocabulary is on The project stack |\n| `name` | `None` | The label on the panel's card. `None` auto-names it `\"Profile 3\"`, `\"Image 4\"`… from the stack position |\n\nIf the document has no relief project yet, the first `Add*` call creates one auto-fitted to that operation's own inputs (world XY centred under them, +10% margin, 512 nodes, closed solid, 1 mm cap). To control the workbench yourself, call `SetupProject` before adding — its settings persist and every `Add*` builds on them. Lengths are in millimetres. Mutations belong inside a `Transaction`.","metadata":{"title":"Operations","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/","collection":"scripting","hash":"a777b7ca792e524339148a420ba00c92","indexed_by":"docs-index"}},{"content":"Operations — Add a curve profile\n\n```python\nop_id = relief.AddProfile(curveIds, height = 0, profile = None, startingHeight = 0,\n                          fixedProfileWidth = 0, feather = 0,\n                          combine = \"Add\", name = None)\n```\n\nThe classic puffed relief: closed curves filled with a cross-section profile.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveIds` | — | Closed curves to fill; at least one |\n| `height` | `0` → `1.0` | Peak height in millimetres. Negative engraves |\n| `profile` | `None` → `\"Round\"` | Cross-section name from `ProfileNames()` — `Round`, `Smooth`, `Chamfer`, `Plateau`, or one of your saved profiles |\n| `startingHeight` | `0` | Z offset at which the profile takes off. `0` is a real value here, not a sentinel |\n| `fixedProfileWidth` | `0` | `0` selects inflate mode: the profile peaks at the deepest point of the curve set. `> 0` spans exactly that width in millimetres inwards from the curve edge |\n| `feather` | `0` | Edge blend distance in millimetres; `0` is a hard edge, not a default |\n\nReturns the operation id. Throws `Pass at least one closed curve.` for an empty list, `Object is not a curve in this document.`, `Curve is not closed; relief regions need closed curves.`, and `fixedProfileWidth cannot be negative.`","metadata":{"title":"Operations","section":"Add a curve profile","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-curve-profile","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-curve-profile","collection":"scripting","hash":"daa408bb843111dc5d1acf62c15d314e","indexed_by":"docs-index"}},{"content":"Operations — Add a flat extrusion\n\n```python\nop_id = relief.AddExtrude(curveIds, height = 0, feather = 0,\n                          combine = \"Add\", name = None)\n```\n\nClosed curves raised to a constant height — a flat pad, or with a negative height a flat-bottomed engraving.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `curveIds` | — | Closed curves to raise; at least one |\n| `height` | `0` → `1.0` | Constant height in millimetres. Negative engraves |\n| `feather` | `0` | Edge blend distance in millimetres; `0` is a hard edge |\n\nReturns the operation id. Same curve validation and error strings as `AddProfile`.","metadata":{"title":"Operations","section":"Add a flat extrusion","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-flat-extrusion","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-flat-extrusion","collection":"scripting","hash":"aac606422d326f93211c28d2c439a35f","indexed_by":"docs-index"}},{"content":"Operations — Add an image height map\n\n```python\nop_id = relief.AddImage(imagePath, height = 0, invert = False, scale = 0,\n                        clipCurveIds = None, combine = \"Add\",\n                        name = None)\n```\n\nA greyscale image read as a height map: white is the highest point.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `imagePath` | — | PNG, JPG, BMP or TIFF file; pixel brightness maps to height |\n| `height` | `0` → `1.0` | Height at pure white, in millimetres. Negative engraves |\n| `invert` | `False` | `True` maps black to the highest point |\n| `scale` | `0` → `1.0` | Multiplier over the fitted image size |\n| `clipCurveIds` | `None` | Optional closed curves: the image fits their bounds and is clipped to their interior. Omitted, the image is centred on the workbench keeping its aspect ratio |\n\nReturns the operation id. The file is checked immediately — a missing or blank path throws `Image file not found: `. Note that the path is *referenced*, not copied into the document: move or rename the file later and `Operations()` reports `MissingReferences = True` and the bake fails.","metadata":{"title":"Operations","section":"Add an image height map","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-an-image-height-map","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-an-image-height-map","collection":"scripting","hash":"c3e93ad6fbd317633aaf954aa158f330","indexed_by":"docs-index"}},{"content":"Operations — Add a 3D texture\n\n```python\nop_id = relief.AddTexture(textureName, height = 0, tilesU = 0, tilesV = 0,\n                          invert = False, clipCurveIds = None,\n                          combine = \"Add\", name = None)\n```\n\nA tiled pattern from the Textures3D library — knurls, hammering, basket weaves. Combined with `Multiply` it modulates a relief already built underneath rather than adding to it.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `textureName` | — | A filename inside the Textures3D library, e.g. `\"KNURL01.jpg\"`; the available set is the one the Texture3D smart component offers |\n| `height` | `0` → `0.5` | Height at pure white, in millimetres. Note the default differs from the other operations |\n| `tilesU` | `0` → `4` | Repetitions across the workbench, or across the clip-curve bounds |\n| `tilesV` | `0` → `4` | Repetitions the other way |\n| `invert` | `False` | `True` maps black to the highest point |\n| `clipCurveIds` | `None` | Optional closed curves to clip the texture to |\n\nReturns the operation id. Throws `Pass a texture filename from the Textures3D library.` for a blank name and `Texture ' ' was not found in the Textures3D library.` when the library has no such file — a full path is not accepted, only the library filename.","metadata":{"title":"Operations","section":"Add a 3D texture","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-3d-texture","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-3d-texture","collection":"scripting","hash":"d7e60a8234f7b94cc1f9f950e24957a2","indexed_by":"docs-index"}},{"content":"Operations — Add projected geometry\n\n```python\nop_id = relief.AddGeometry(objectIds, feather = 0,\n                           combine = \"Add\", name = None)\n```\n\nExisting document geometry flattened into the relief: each object is projected top-down onto the workbench and its height above the plane becomes the height field.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Meshes, breps, extrusions or SubDs; at least one |\n| `feather` | `0` | Edge blend distance in millimetres; `0` is a hard edge |\n\nReturns the operation id. Throws `Pass at least one mesh, brep, extrusion or SubD.` for an empty list, `Object was not found in this document.`, and `Object is not a mesh, brep, extrusion or SubD.` for anything with no brep form. Like image paths, the object ids are references: delete the source objects and the operation is flagged and fails the bake.","metadata":{"title":"Operations","section":"Add projected geometry","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-projected-geometry","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-projected-geometry","collection":"scripting","hash":"b0e5b90e95bc2740308874a2ec5d506a","indexed_by":"docs-index"}},{"content":"Operations — Add a sculpt\n\n```python\nop_id = relief.AddSculpt(points, radius = 0, height = 0,\n                         combine = \"Add\", name = None)\n```\n\nThe panel's Sculpt brush, headless: one smooth dab per point, each raising the field by up to `height` at its centre. Dabs on the same spot accumulate, like brush passes — and the operation is the same brush layer the panel paints, so it stays editable, reorderable and even re-paintable in the panel afterwards.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `points` | — | World points to dab; at least one valid point. They are projected onto the workbench plane |\n| `radius` | `0` → `2.0` | Dab radius in millimetres, with a smooth falloff to the edge |\n| `height` | `0` → `0.5` | Signed height per dab, mm. Negative carves |\n| `combine` | `\"Add\"` | How the layer merges into the stack |\n\nReturns the operation id. Throws `Pass at least one valid point.` and `radius cannot be negative.`\n\nTo \"stroke\" along a path, sample a curve and pass the samples:\n\n```python\npts = [curve.PointAt(t) for t in curve.DivideByCount(60, True)]\nrelief.AddSculpt(pts, radius = 1.2, height = 0.3, name = \"Freehand vein\")\n```","metadata":{"title":"Operations","section":"Add a sculpt","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-sculpt","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-sculpt","collection":"scripting","hash":"56e74d29592ee56a7959189415945ecd","indexed_by":"docs-index"}},{"content":"Operations — Add a smooth\n\n```python\nop_id = relief.AddSmooth(points, radius = 0, strength = 0,\n                         blurRadius = 0, name = None)\n```\n\nThe panel's Smooth brush, headless: the dabs paint a 0–1 mask, and at compute time everything below this operation in the stack is blurred where the mask says so. It is in-place by nature — it filters the accumulated field instead of contributing a layer — so it has no `combine` mode, and its position in the stack decides what gets smoothed.\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `points` | — | World points to dab; at least one valid point |\n| `radius` | `0` → `2.0` | Dab radius in millimetres |\n| `strength` | `0` → `1.0` | Mask strength per dab, `0`–`1`; `1` is full smoothing at the centre |\n| `blurRadius` | `0` → `1.0` | Blur kernel radius in millimetres |\n\nReturns the operation id. Throws `Pass at least one valid point.`, `radius cannot be negative.`, `strength must be between 0 and 1.` and `blurRadius cannot be negative.`","metadata":{"title":"Operations","section":"Add a smooth","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-smooth","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#add-a-smooth","collection":"scripting","hash":"2d4ee13ee6bf00646c5ca84d90a12487","indexed_by":"docs-index"}},{"content":"Operations — The one-shot alternative\n\nFor a relief made of a single layer, the creators bake in one call on a transient project and leave the document's saved project untouched: Create from image, Create from curves, Create from geometry.","metadata":{"title":"Operations","section":"The one-shot alternative","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#the-one-shot-alternative","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/operations/#the-one-shot-alternative","collection":"scripting","hash":"0b1ca789958ae2717155ab0a9d1535a3","indexed_by":"docs-index"}},{"content":"The project stack\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief\n```\n\nA relief project is the recipe a signet face, a textured band or an engraved plaque is built from: a rectangular workbench plane, a sampling grid over it, and an ordered stack of operations that each raise or lower the height field. The project lives in the document (it is written into the .3dm), which is the same project the ArtisanRelief panel edits — so a script can rough out four layers and hand them to the bench for refinement, or pick up what the panel left behind.\n\nWhile the ArtisanRelief panel is open it holds its own copy of the project and writes it back on close, overwriting anything a script changed. Close the panel before scripting the project stack.\n\nIf you only need a single-operation relief meshed in one call, the one-shot creators — Create from image, Create from curves and Create from geometry — work on a transient project and leave the document's saved one untouched.","metadata":{"title":"The project stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/","collection":"scripting","hash":"08545aafcc34a47cf5720af947961877","indexed_by":"docs-index"}},{"content":"The project stack — The stack model\n\nThe project holds a list of operations. They are evaluated in order, index 0 first, each one writing into the height field the operations below it have already built. Every operation carries a `combine` mode saying how its own layer merges into that accumulated height, and an `Enabled` flag; disabled operations are skipped. Nothing is computed while you build the stack — the field is only evaluated when you bake or export.\n\nBecause each mode applies over the running result, order changes the outcome. A `Multiply` texture placed above a domed profile modulates that dome; the same texture placed below it multiplies a flat zero field and disappears.","metadata":{"title":"The project stack","section":"The stack model","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#the-stack-model","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#the-stack-model","collection":"scripting","hash":"6a8c8b40045fe687dd5bd3153fdc7ff6","indexed_by":"docs-index"}},{"content":"The project stack — Combine modes\n\nCombine modes are plain strings — case-insensitive, no kernel import needed; omitting `combine` means `\"Add\"`:\n\n| Mode | Effect on the accumulated height | Typical use |\n|---|---|---|\n| `Add` | `heights += layer` (the default) | Stack a motif onto a base |\n| `Subtract` | `heights -= layer` | Engrave a shape out of what is below |\n| `ZMax` | Union Highest: keeps whichever is taller | Merge two domes without their overlap doubling |\n| `ZMin` | Union Lowest: keeps whichever is lower | Clip the relief down to a lower shape |\n| `Absolute` | No merge — the layer's values are placed as-is inside its own mask, substituting what is underneath | Punch a flat plateau or an exact stamped depth |\n| `Multiply` | `heights *= layer`, the layer acting as a scale factor | Modulate an existing relief with a texture |","metadata":{"title":"The project stack","section":"Combine modes","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#combine-modes","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#combine-modes","collection":"scripting","hash":"50926845086db905888c27e450cc329f","indexed_by":"docs-index"}},{"content":"The project stack — Reading the project\n\n```python\ninfo = relief.GetProject()\nops  = relief.Operations()\nnames = relief.ProfileNames()\n```\n\nAll three are read-only and take no arguments. None of them throws when the document has no project.\n\n`GetProject()` returns a `ReliefProjectInfo`:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Exists` | `bool` | `False` — with every other field left at zero — when the document has no saved relief project |\n| `WorldWidth` | `double` | Workbench width in millimetres |\n| `WorldHeight` | `double` | Workbench height in millimetres |\n| `Resolution` | `int` | Grid nodes along the larger side |\n| `OutputType` | `str` | `\"Mesh\"` (open relief) or `\"Thickness\"` (closed solid) |\n| `CapDistance` | `double` | Solid thickness below the base plane, in millimetres |\n| `DeleteBase` | `bool` | `True` when grid cells no operation touched are trimmed away |\n| `OperationCount` | `int` | Number of operations in the stack, enabled or not |\n\n`Operations()` returns the stack in apply order as a read-only list of `ReliefOperationInfo` — an empty list when there is no project:\n\n| Field | Type | Meaning |\n|---|---|---|\n| `Id` | `Guid` | The operation id, the handle every editing call takes. See Editing the stack |\n| `Index` | `int` | Position in the stack; `0` is applied first |\n| `Type` | `str` | `\"profile\"`, `\"extrude\"`, `\"image\"`, `\"texture\"`, `\"geometry\"`, `\"sculpt\"` or `\"smooth\"` |\n| `Name` | `str` | The label on the panel's card |\n| `Enabled` | `bool` | `False` operations are skipped when the field is evaluated |\n| `CombineMode` | `str` | The mode name, e.g. `\"Multiply\"` |\n| `MissingReferences` | `bool` | `True` when a referenced curve or object no longer resolves, is no longer closed, or a referenced image/texture file is gone |","metadata":{"title":"The project stack","section":"Reading the project","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#reading-the-project","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#reading-the-project","collection":"scripting","hash":"dcd23b5f2aac9815cdac0d9260d2c04e","indexed_by":"docs-index"}},{"content":"The project stack — Reading the project\n\n`ProfileNames()` returns the names the `profile` parameter of a profile operation accepts: the four built-in presets — Round, Smooth, Chamfer, Plateau — followed by the profiles saved in the user's own profile library. Matching is case-insensitive; an unrecognised name throws `Unknown relief profile '...'. Use one of: ...`, listing the whole set.\n\nThe `\"sculpt\"` and `\"smooth\"` types are created with the panel's brushes or with `AddSculpt` / `AddSmooth`, and can be toggled, reordered and removed like any other operation.","metadata":{"title":"The project stack","section":"Reading the project","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#reading-the-project","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#reading-the-project","collection":"scripting","hash":"b14b3da033b7366cac8c9addccf8e810","indexed_by":"docs-index"}},{"content":"The project stack — Usage\n\n```python\nrelief.SetupProject(worldWidth = 0, worldHeight = 0, resolution = 0,\n                    workbench = None, solid = True, capDistance = 0,\n                    deleteBase = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `worldWidth` | `0` → `50` | Workbench width in millimetres |\n| `worldHeight` | `0` → `50` | Workbench height in millimetres |\n| `resolution` | `0` → `512` | Grid nodes along the larger side; must be `0` or between `64` and `4096` |\n| `workbench` | `None` → world XY | The `Plane` the relief sits on; the grid is centred on its origin. `None` leaves the project's current plane untouched when one already exists |\n| `solid` | `True` | `True` bakes a closed solid (`OutputType` `\"Thickness\"`), `False` an open mesh |\n| `capDistance` | `0` → `1.0` | Solid thickness below the base plane, in millimetres |\n| `deleteBase` | `False` | `True` trims away grid cells no operation touched |\n\nReturns nothing. It creates the document's relief project if there is none, or reconfigures the settings of the existing one keeping its operation stack, and saves the result back into the document. Mutations belong inside a `Transaction` for one-step undo.\n\n`0` here means *the panel default*, not *leave what is saved*. Calling `relief.SetupProject()` on a project already set to 20 × 20 at 1024 nodes resets it to 50 × 50 at 512 — pass the values you want to keep. `workbench` is the one exception: `None` genuinely leaves the saved plane alone.\n\nValidation throws `ArgumentException` before anything is written: `Workbench size cannot be negative.`, `Resolution must be between 64 and 4096 (0 = default 512).` and `capDistance cannot be negative.`","metadata":{"title":"The project stack","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#usage","collection":"scripting","hash":"0f0174e0fc5d0cf65aaa6772e826b811","indexed_by":"docs-index"}},{"content":"The project stack — Usage\n\nThe natural order works: call `SetupProject` first to configure the workbench, then add operations — an empty project persists its settings, and every later `Add*` builds on them instead of auto-fitting its own. (Only when there is no project at all does the first `Add*` auto-fit one to its inputs.) `ClearProject` deletes the saved project entirely.","metadata":{"title":"The project stack","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#usage","collection":"scripting","hash":"694feb1007dfef10ecfdf82e638ccd97","indexed_by":"docs-index"}},{"content":"The project stack — Building a stack\n\n```python\nfrom ArtisanPlugin.Scripting import ReliefApi as relief, Transaction\n\nwith Transaction.Begin(\"Signet relief\"):\n    dome  = relief.AddProfile([crest_curve], height = 1.2, profile = \"Smooth\")\n    grain = relief.AddTexture(\"KNURL01.jpg\", height = 0.15, tilesU = 8, tilesV = 8,\n                              combine = \"Multiply\", name = \"Grain\")\n\n    # now that the stack is non-empty, the workbench sticks\n    relief.SetupProject(worldWidth = 20, worldHeight = 20, resolution = 1024,\n                        solid = True, capDistance = 1.5)\n\n    mesh_id = relief.Bake()\n```\n\nThe five `Add*` calls are documented in Operations; each returns the operation id you feed to Editing the stack.","metadata":{"title":"The project stack","section":"Building a stack","url":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#building-a-stack","source":"https://www.rhinoartisan.com/docs/scripting/reference/relief/project-stack/#building-a-stack","collection":"scripting","hash":"a5afb4f46eb1c8f112fadd1dcceb3b84","indexed_by":"docs-index"}},{"content":"Render\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render, RenderStudioApi as studio\n```\n\nDocument-side rendering: everything on these pages changes the Rhino document or drives Rhino's own renderer. The live web viewer is a separate surface with its own facade — see Realtime Render.\n\nStaging Earring pairs and lay-flat-on-the-ground.\n\nDesign materials Back to the viewport design look, document-wide.\n\nRender materials Photoreal materials on every visible object.\n\nBatch render Render every 3dm in a folder, image next to each file.\n\nStudio catalogs Discover environments, material families and materials.\n\nStudio scene Apply an environment and studio materials.\n\nStudio stills One photoreal image, at your resolution and sample count.\n\nStudio turntables A full rotation, frame by frame.","metadata":{"title":"Render","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/","collection":"scripting","hash":"c29b5da2cc342b3339cd8e8710adb03f","indexed_by":"docs-index"}},{"content":"Render — Which surface do you want?\n\n| | Realtime Render | Render Studio (this section) |\n|---|---|---|\n| What it is | An external live viewer window you drive interactively | An offline photoreal renderer |\n| Output | Screenshots, multi-view sets and video of the live window | Rendered image files and turntable MP4s |\n| Touches the document | Never | Yes — materials, render settings |\n| Use it for | Quick looks, client previews, material try-ons, product shots | Final imagery |\n\nBatch render is separate again: it walks a folder of `.3dm` files and renders each one unattended.","metadata":{"title":"Render","section":"Which surface do you want?","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/#which-surface-do-you-want","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/#which-surface-do-you-want","collection":"scripting","hash":"239611f1d0575afa1eeaa4315c80cbb2","indexed_by":"docs-index"}},{"content":"Render — Materials come in two sets\n\nDesign materials and Render materials are two halves of one switch — the flat working look you model in, and the photoreal look you render. Flip to render materials before rendering, and back afterwards if you want the viewport readable again.\n\nRender Studio's materials are a third, separate catalog — see Studio catalogs for how to discover the exact names it accepts.\n\nThe switch is not symmetric. Applying render materials also changes the document's render settings — it forces the document sample count and, on Rhino 8+, installs the 2Shapes environment — and applying design materials does not put any of that back. The `int` both return counts the objects *enumerated*, not the objects changed.","metadata":{"title":"Render","section":"Materials come in two sets","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/#materials-come-in-two-sets","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/#materials-come-in-two-sets","collection":"scripting","hash":"a420a9b593995c1e07a6a959d3cb2c19","indexed_by":"docs-index"}},{"content":"Render — Conventions\n\n`0` keeps the tool default for Render Studio resolutions and sample counts — but not across the rest of this facade: batch render's `width`/`height` must be a real size, and the staging helpers take literal millimetres and degrees. Everything on these pages changes object materials, adds geometry or writes render settings, so it mutates the document — wrap it in a `Transaction` when you want one-step undo.\n\nBatch render replaces the active document for each file it processes and clears the modified flag, so unsaved work in the open document is silently discarded and never restored. Save before running it; a `Transaction` will not protect you.","metadata":{"title":"Render","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/#conventions","collection":"scripting","hash":"5a47a45f4d3adae9f3b6d91f84ada114","indexed_by":"docs-index"}},{"content":"Apply design materials\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render\n```\n\nThe design materials are the flat, fast viewport look you model in: plain metal and plain stone colours that redraw instantly and let you read the geometry. You switch to them whenever you go back to working on the piece, and switch away with Apply render materials when you want a photoreal image. The two calls are the two halves of one switch — same enumeration, same attributes touched, different catalogue on the other end.","metadata":{"title":"Apply design materials","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/","collection":"scripting","hash":"b788201953b1ed2126c550b5686d8037","indexed_by":"docs-index"}},{"content":"Apply design materials — Usage\n\n```python\nn = render.ApplyDesignMaterials()      # -> how many visible objects were visited\n```\n\nNo arguments, and no selection is taken: this is global, exactly like the ArtisanApplyDesignMaterials command. It enumerates every visible object of every type in the active document (hidden objects are excluded; locked ones are not) and walks the list once.\n\nGems, diamonds, gemstones without a reference, and certified and non-certified diamonds get the document-table gem material matching their compound. Pearls and cabochons get the pearl material — the same one used on the render side, since there is only one pearl material. Breps, extrusions, meshes and SubDs get the document's Metal 1 material, unconditionally: on this side of the switch the `Metal 02` and `Metal 03` layers are deliberately ignored, so a three-metal design collapses to one colour in the viewport and only separates again under render materials. Everything else in the enumeration — curves, annotations, points — is visited and left alone.\n\nFor each object it touches it sets the attribute material source to *material from object* and assigns the material index, then redraws the views at the end.","metadata":{"title":"Apply design materials","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/#usage","collection":"scripting","hash":"195808a0ac4a9cfa50ac9e953faa69a1","indexed_by":"docs-index"}},{"content":"Apply design materials — What the return value counts\n\nThe `int` is the number of visible objects enumerated, not the number actually re-materialised, and not a count of materials or layers. Curves and annotations are in that total, as are gems whose gem object could not be read. Treat it as \"the size of the sweep\", not as a change count.\n\nMutation and errors\nThis writes object attributes in the document, so it needs a `Transaction` if you want the whole sweep to collapse into a single undo step:\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render, Transaction\n\nwith Transaction.Begin(\"Design materials\"):\n    render.ApplyDesignMaterials()\n```\n\nIt is a licensed call. With no document open it raises *\"No active document.\"*; with a document that has no objects at all it raises *\"There are no objects in the document.\"* before anything is assigned.\n\nUnlike its counterpart, this call changes nothing outside the objects: render sampling and the render environment are left exactly as they are, so switching back to design materials does not undo the render settings that Apply render materials put in place.","metadata":{"title":"Apply design materials","section":"What the return value counts","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/#what-the-return-value-counts","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-design-materials/#what-the-return-value-counts","collection":"scripting","hash":"18d1fefb19af60c68298a4840edc08a0","indexed_by":"docs-index"}},{"content":"Apply render materials\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render\n```\n\nThe render materials are the photoreal ones: real metals and real gem shaders from the render catalogue, meant for a raytraced image rather than for modelling. You call this just before rendering, and go back with Apply design materials when you return to working on the piece. The two calls are the two halves of one switch — same enumeration, same attributes touched, different catalogue on the other end.","metadata":{"title":"Apply render materials","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/","collection":"scripting","hash":"14f41cc45c1429066ff0e25f351d28d2","indexed_by":"docs-index"}},{"content":"Apply render materials — Usage\n\n```python\nn = render.ApplyRenderMaterials()      # -> how many visible objects were visited\n```\n\nNo arguments, and no selection is taken: this is global, exactly like the ArtisanApplyRenderMaterials command. It enumerates every visible object of every type in the active document (hidden objects are excluded) and walks the list once.\n\nGems, diamonds, gemstones without a reference, and certified and non-certified diamonds get the `RenderMaterial` from the render catalogue matching their compound; when the catalogue has no entry for that compound the object is left as it is. Pearls and cabochons get the ordinary design pearl material — the command uses the same pearl on both sides of the switch, so pearls look identical either way.\n\nBreps, extrusions, meshes and SubDs are metal, and here — unlike on the design side — the layer decides which metal:\n\n| Object's layer name | Metal used |\n|---|---|\n| `Metal 02` | the document's metal 2 |\n| `Metal 03` | the document's metal 3 |\n| anything else | the document's metal 1 |\n\nThe name match is exact. A layer called `Metal 2`, or a sub-layer of `Metal 02`, falls into the last row and gets metal 1. This is the reason a two-tone piece reads as one colour in the viewport and correctly as two in the render.","metadata":{"title":"Apply render materials","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#usage","collection":"scripting","hash":"4cc3ae00bb247089cdbd963ae29c6608","indexed_by":"docs-index"}},{"content":"Apply render materials — Document-wide side effects\n\nBeyond object attributes, this call also changes the document's render settings, exactly as the command does:\n\n- render sampling is forced on and set to 25 samples (`UseDocumentSamples` and `Samples` in the render settings user dictionary);\n- on Rhino 8 and later, when there is no reflection environment set for rendering, or the active one is the stock \"Studio\" environment, the default 2Shapes environment is installed in its place. An environment you chose yourself is left alone.\n\nNeither of these is reverted by Apply design materials; once raised, the sampling stays raised.","metadata":{"title":"Apply render materials","section":"Document-wide side effects","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#document-wide-side-effects","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#document-wide-side-effects","collection":"scripting","hash":"cb8b1c876e6ac920b9f2fbaf0e2148b7","indexed_by":"docs-index"}},{"content":"Apply render materials — What the return value counts\n\nThe `int` is the number of visible objects enumerated, not the number actually re-materialised, and not a count of materials created. Curves, annotations and any object whose material could not be resolved in the catalogue are all in that total. Treat it as \"the size of the sweep\", not as a change count.","metadata":{"title":"Apply render materials","section":"What the return value counts","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#what-the-return-value-counts","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#what-the-return-value-counts","collection":"scripting","hash":"ace6191f935a723bb11c55a3460421ab","indexed_by":"docs-index"}},{"content":"Apply render materials — Mutation and errors\n\nThis writes object attributes and render settings in the document, so wrap it in a `Transaction` for one-step undo:\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render, Transaction\n\nwith Transaction.Begin(\"Render materials\"):\n    render.ApplyRenderMaterials()\n```\n\nIt is a licensed call. With no document open it raises *\"No active document.\"*; with a document that has no objects at all it raises *\"There are no objects in the document.\"* — note that the render sampling and the environment are set before the object enumeration runs, so that error still leaves those settings changed.","metadata":{"title":"Apply render materials","section":"Mutation and errors","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#mutation-and-errors","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/apply-render-materials/#mutation-and-errors","collection":"scripting","hash":"4021d79c80a8268ffed1c415b30e3b62","indexed_by":"docs-index"}},{"content":"Batch render\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render\n```\n\nPoint it at a folder of finished designs and it renders each one with whatever render engine is currently active, leaving the image beside the `.3dm` it came from. This is the unattended version of the ArtisanBatchRendering command: no options dialog, no folder picker, no progress window, and per-file failures come back in the result instead of stopping the run.","metadata":{"title":"Batch render","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/","collection":"scripting","hash":"5139adfde61399c824955ef993df58dc","indexed_by":"docs-index"}},{"content":"Batch render — Usage\n\n```python\nresult = render.BatchRender(\n    folder,                        # the folder to scan (required)\n    includeSubfolders = False,     # recurse into sub-folders\n    extension = \".jpg\",            # \".jpg\" or \".png\" only; jpg is the dialog default\n    customResolution = False,      # False: each file uses its own saved render size\n    width = 1920,                  # only used when customResolution is True\n    height = 1080)                 # only used when customResolution is True\n\nprint(result.Processed, len(result.Failed), len(result.OutputFiles))\n```","metadata":{"title":"Batch render","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#usage","collection":"scripting","hash":"92933f77d8753c79b842d8bbe1ed5b02","indexed_by":"docs-index"}},{"content":"Batch render — Parameters\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `folder` | — | Required. Resolved to a full path; must exist. |\n| `includeSubfolders` | `False` | `False` scans the top directory only; `True` recurses through every sub-folder. |\n| `extension` | `\".jpg\"` | The image format. Case-insensitive, and a leading dot is added if you leave it off, so `\"PNG\"` is accepted. Only these two formats exist. |\n| `customResolution` | `False` | `True` renders every file at `width` × `height`; `False` renders each file at its own saved render settings. |\n| `width` | `1920` | Pixels. Only read when `customResolution` is `True`. |\n| `height` | `1080` | Pixels. Only read when `customResolution` is `True`. |\n\nNote that the usual house convention does not apply here: `0` is not a \"keep the default\" value for `width` or `height`. When `customResolution` is `True` both sides must be between 16 and 20000 pixels or the call throws; when it is `False` both are ignored entirely, whatever you pass. There is no `-1` sentinel anywhere in this call.","metadata":{"title":"Batch render","section":"Parameters","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#parameters","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#parameters","collection":"scripting","hash":"e146aa001d87f6c0bfb1eba30f42994c","indexed_by":"docs-index"}},{"content":"Batch render — Which files are picked up\n\nThe scan looks for `*.3dm` and then filters the results by real extension, so Rhino's `.3dmbak` backups are excluded rather than swept in by the legacy wildcard behaviour on Windows. Files are processed in case-insensitive alphabetical order by full path.\n\nWhere the images go, and how they are named\nEach image is written next to its `.3dm`, with the same base name and the chosen extension — `C:\\jobs\\ring-A.3dm` produces `C:\\jobs\\ring-A.jpg`. There is no separate output folder and no naming template, so with `includeSubfolders = True` the images end up spread through the same tree as the models. An existing image of the same name is overwritten.","metadata":{"title":"Batch render","section":"Which files are picked up","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#which-files-are-picked-up","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#which-files-are-picked-up","collection":"scripting","hash":"c81b7cf46af77fee9a2d9e8ed2681595","indexed_by":"docs-index"}},{"content":"Batch render — The result\n\n`BatchRender` returns a `BatchRenderResult`:\n\n| Field | Type | Contents |\n|---|---|---|\n| `Processed` | `int` | How many `.3dm` files were opened and attempted. With no exception thrown, this equals the number of files found. |\n| `Failed` | list of `str` | The file names (not full paths) whose image was not produced. |\n| `OutputFiles` | list of `str` | The full paths of the images actually written. |\n\n`Processed` equals `len(Failed) + len(OutputFiles)`. A file counts as a success only when the image exists on disk *and* its last-write time is newer than before the render — return codes from the render commands are not trusted, because they are unreliable across engines. A stale image left over from an earlier run therefore counts as a failure, which is what you want.","metadata":{"title":"Batch render","section":"The result","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#the-result","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#the-result","collection":"scripting","hash":"f39a01b7e10607bd2a00c99166f50ce8","indexed_by":"docs-index"}},{"content":"Batch render — Partial failure does not throw\n\nA file that fails to open, fails to render or produces no image is caught, added to `Failed`, and the batch carries on. Nothing about a bad file aborts the run, so always inspect `Failed` rather than relying on the absence of an exception:\n\n```python\nresult = render.BatchRender(r\"C:\\jobs\\week-42\", includeSubfolders=True, extension=\".png\")\nfor name in result.Failed:\n    print(\"no image produced for\", name)\n```\n\nThe validation errors, by contrast, all throw before any file is opened: *\"A folder is required.\"*, *\"Folder not found: …\"*, *\"Extension must be \\\".jpg\\\" or \\\".png\\\".\"*, *\"Resolution must be between 16 and 20000 pixels per side.\"*, and *\"No .3dm files found in the folder.\"*. It is also a licensed call.","metadata":{"title":"Batch render","section":"Partial failure does not throw","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#partial-failure-does-not-throw","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#partial-failure-does-not-throw","collection":"scripting","hash":"837385730a696daa2a7f04378323fd80","indexed_by":"docs-index"}},{"content":"Batch render — It replaces the active document — save first\n\nThis is the one call in the render facade that does not merely mutate the open document; it changes which document is open, so a `Transaction` is meaningless here and nothing about the run is undoable.\n\n- Each file is opened with `_-Open`, replacing whatever was open.\n- Before every open the current document's modified flag is cleared, so Rhino never prompts to save — which means unsaved changes in the open document are silently discarded.\n- The original document is not restored at the end. The last file rendered stays active when the call returns, exactly as the command behaves.\n\nSave your work before calling this, and re-open your own file afterwards if you need it.","metadata":{"title":"Batch render","section":"It replaces the active document — save first","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#it-replaces-the-active-document--save-first","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/batch-render/#it-replaces-the-active-document--save-first","collection":"scripting","hash":"63030998ff13d11e08b0fa5654dc3c56","indexed_by":"docs-index"}},{"content":"Staging\n\n```python\nfrom ArtisanPlugin.Scripting import RenderApi as render, Transaction\n```\n\nTwo helpers for arranging a piece before you photograph it: making the second half of a pair, and laying a piece flat so it sits on the ground plane instead of floating at whatever angle it was modelled. Unlike the Realtime Render viewer calls, both of these modify the Rhino document - they add or move real objects - so both need a valid licence and both belong inside a `Transaction` if you want one-step undo.\n\nNeither follows the house `0`-keeps-default convention: every number here is used literally, so `distance = 0` really does mean zero millimetres of offset. Both take `objectIds = None` to mean \"the current selection\", and both fail with *\"Nothing selected: select (or pass) at least one object.\"* when there is neither a list nor a selection, *\"No active document.\"* when no document is open, and *\"The given objects have no valid geometry.\"* when the ids resolve to nothing measurable.","metadata":{"title":"Staging","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/","collection":"scripting","hash":"b6ca117c90d6d25f1f2aa9197b681f66","indexed_by":"docs-index"}},{"content":"Staging — Create a pair\n\n```python\nwith Transaction.Begin(\"Pair\"):\n    new_ids = render.CreatePair(objectIds = None, distance = 20, angle = -20, mirror = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` | Ids to duplicate; `None` or empty = the current selection |\n| `distance` | `20` | Millimetres the copy is moved along the world X axis |\n| `angle` | `-20` | Degrees the copy is rotated about the world Z axis |\n| `mirror` | `False` | Mirror the copy as well - for asymmetric designs such as earrings |\n\nThe `ArtisanPair` command, headless. The \"pair\" is the classic earring presentation: one piece as modelled and a second one beside it, turned slightly so the render reads as two objects rather than one duplicated twice. The originals are left exactly where they are - the new objects are copies, and the returned list holds the ids of those copies, in the same order as the input, skipping any object Rhino declined to duplicate.\n\nThe transform is built once for the whole selection, from the union bounding box of every input object: the copy is rotated `angle` degrees about the Z axis through that box's centre, then translated `distance` millimetres along X. With `mirror = True` a mirror across the world YZ plane through the same centre is applied first, so the copy comes out as a true left/right counterpart before it is rotated and moved - which is what you want for an asymmetric design and what you do not want for a symmetric one, where it makes no visible difference.\n\nNegative numbers are fine and are the normal way to place the copy on the other side: `distance = -20` puts it left instead of right. The defaults match the command's own (20 mm, -20 degrees, no mirror). The views are redrawn before the call returns.","metadata":{"title":"Staging","section":"Create a pair","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#create-a-pair","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#create-a-pair","collection":"scripting","hash":"6cb0572589d10d4dde6d426e99407243","indexed_by":"docs-index"}},{"content":"Staging — Lie on the ground\n\n```python\nwith Transaction.Begin(\"Lie on ground\"):\n    render.LieOnGround(objectIds = None, aroundX = True, keepOriginal = False)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` | Ids to lay flat; `None` or empty = the current selection |\n| `aroundX` | `True` | Rotate about the world X axis; `False` rotates about world Y |\n| `keepOriginal` | `False` | `False` moves the objects themselves; `True` leaves the originals in place and flattens a copy |\n\nThe `ArtisanLyingOnTheGround` command, headless - the one you run before a flat-lay render. Returns nothing: with `keepOriginal = False` it transforms the given objects in place, and with `keepOriginal = True` it leaves them alone and adds a rotated duplicate instead (that is the command's DeleteOriginal toggle, inverted). Either way the new ids are not reported back, so when you need them, note the document's object list before and after.\n\nIt only rotates. All the objects share a single rotation about the world X (or Y) axis through the world origin - not through the piece's own centre - and nothing is translated afterwards, so a piece modelled far from the origin swings a long way across the document, and a piece that ends up flat is not pushed down to touch Z = 0. Expect to move it yourself afterwards if the resting height matters.","metadata":{"title":"Staging","section":"Lie on the ground","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#lie-on-the-ground","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#lie-on-the-ground","collection":"scripting","hash":"576e684968fcf32b4ff971b906e50e8a","indexed_by":"docs-index"}},{"content":"Staging — Lie on the ground\n\nThe orientation is found by search, not by analysis: candidate angles from 0 to 180 degrees in 0.5-degree steps, each applied to a duplicate of every input geometry, keeping the angle whose combined bounding box has the smallest Z height - the flattest presentation. Two orientations are equally flat, 180 degrees apart, so the winner is compared against its complementary and the one whose average bounding-box bottom sits higher is chosen; that is the face-down orientation, the same one the command picks. Ties go to the lower angle, since only a strictly smaller height replaces the current best.\n\nThat is 360 candidate rotations, each duplicating and re-boxing every selected geometry. On a handful of breps it is instant; on dense meshes or a large selection it is the slow part of your script, and it scales with the number of objects rather than the number of steps you can change - the step size is fixed.","metadata":{"title":"Staging","section":"Lie on the ground","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#lie-on-the-ground","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#lie-on-the-ground","collection":"scripting","hash":"7c7031ae181cbc919fedc3ef8ec46543","indexed_by":"docs-index"}},{"content":"Staging — Composing the two\n\nPairing then flattening is the usual staging order, since `CreatePair` returns the ids you want to lay flat alongside the originals:\n\n```python\nimport Rhino\nfrom ArtisanPlugin.Scripting import RenderApi as render, Transaction\n\ndoc = Rhino.RhinoDoc.ActiveDoc\noriginals = [o.Id for o in doc.Objects.GetSelectedObjects(False, False)]\n\nwith Transaction.Begin(\"Stage for render\"):\n    copies = render.CreatePair(originals, distance = 22, angle = -15, mirror = True)\n    render.LieOnGround(list(originals) + list(copies))\n```","metadata":{"title":"Staging","section":"Composing the two","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#composing-the-two","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/staging/#composing-the-two","collection":"scripting","hash":"de9b77c2c3f81c55cfa0571f5760a245","indexed_by":"docs-index"}},{"content":"Render Studio catalogs\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio\n```\n\nRender Studio is the ArtisanRenderAndAnimation panel: a scene environment, the studio material library, and a raytraced render pipeline that goes through Rhino's current renderer (Cycles unless the user changed it). It renders the Rhino document itself, so what comes out is what the renderer sees. That is a different thing from the Realtime Render viewer, which is a separate web window with its own scene, its own camera and its own materials, and which never touches the document.\n\nThese three methods are the entry point to everything else on this side of the API. `ApplyEnvironment` and `ApplyMaterial` take names, not ids, and the only place those names exist is on disk — environments are `.renv` files in ` \\Render\\Environments`, materials are `.rmtl` files in ` \\Render\\Materials\\ `. The name is the file name without its extension. Rather than hard-coding a string that may not be installed on the next machine, list first and apply from the list.","metadata":{"title":"Render Studio catalogs","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/","collection":"scripting","hash":"cc5402184b365f81b7491b740da7e4c7","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — Usage\n\n```python\nnames    = studio.ListEnvironments()          # -> environment names, A-Z\nfamilies = studio.ListMaterialFamilies()      # -> \"Gems\", \"Grounds\", \"Metals\", \"Misc\", ...\nmetals   = studio.ListMaterials(\"Metals\")     # -> material names inside one family, A-Z\n```\n\nAll three are read-only: they read the folders and return, they do not touch the document, they need no `Transaction`, and unlike the rest of `RenderStudioApi` they do not run the licence check.","metadata":{"title":"Render Studio catalogs","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#usage","collection":"scripting","hash":"e90a1f8a94fc3af8753f794263e4e4fd","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — Discover, then apply\n\nThe round trip these lists exist for:\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio, Transaction\n\nenv = next(n for n in studio.ListEnvironments() if \"Studio\" in n)\ngold = next(n for n in studio.ListMaterials(\"Metals\") if \"Yellow\" in n)\n\nwith Transaction.Begin(\"Stage the scene\"):\n    studio.ApplyEnvironment(env)\n    studio.ApplyMaterial(\"Metals\", gold, objectIds)\n```\n\nEvery string that comes out of a list is guaranteed to be accepted by `ApplyEnvironment` and `ApplyMaterial` verbatim.","metadata":{"title":"Render Studio catalogs","section":"Discover, then apply","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#discover-then-apply","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#discover-then-apply","collection":"scripting","hash":"c062bafd8a927130b223799508bdfcf2","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — ListEnvironments\n\n```python\nnames = studio.ListEnvironments()\n```\n\nThe environment tiles in the panel's Environment tab — every `.renv` file in the user's Environments folder, file extension stripped, sorted alphabetically with a case-insensitive comparison. Returns an `IReadOnlyList `, which arrives in Python as a normal read-only sequence.\n\nIf the folder is missing or unset, the method returns an empty list; it does not throw. An empty result therefore means \"nothing installed\", not \"something went wrong\".","metadata":{"title":"Render Studio catalogs","section":"ListEnvironments","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listenvironments","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listenvironments","collection":"scripting","hash":"8373c7ddae481f034bb699fbfdd6845f","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — ListMaterialFamilies\n\n```python\nfamilies = studio.ListMaterialFamilies()\n```\n\nOne entry per sub-folder of the Materials folder, sorted the same way. On a stock installation that is Metals, Gems, Grounds and Misc — the panel's four material tabs. Because a family is just a folder, a custom folder dropped in beside them shows up here and works everywhere a family name is accepted.\n\nSame empty-list-not-an-exception behaviour as `ListEnvironments` when the Materials folder is missing.","metadata":{"title":"Render Studio catalogs","section":"ListMaterialFamilies","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listmaterialfamilies","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listmaterialfamilies","collection":"scripting","hash":"d2de72453975250cf01fcc43fc15dcc3","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — ListMaterials\n\n```python\nnames = studio.ListMaterials(family)          # family is required\n```\n\nThe `.rmtl` files inside one family, extension stripped, sorted alphabetically. This is the one catalog method that throws, because it has to resolve the family first:\n\n- `family` null, empty or whitespace →\n`ArgumentException(\"A material family is required (see ListMaterialFamilies()).\")`\n- `family` not found →\n`ArgumentException(\"No material family named 'X'. Available: Gems, Grounds, Metals, Misc.\")` — the message lists what is actually installed, or `(none installed)` when the Materials folder holds no families at all.\n\nA family that exists but holds no `.rmtl` files returns an empty list.","metadata":{"title":"Render Studio catalogs","section":"ListMaterials","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listmaterials","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#listmaterials","collection":"scripting","hash":"cc19e9a04db32c90811a435f9a1b9cdc","indexed_by":"docs-index"}},{"content":"Render Studio catalogs — How names are matched\n\nEverywhere a name or a family is accepted, the same rules apply, and they are looser than the strings the lists hand back:\n\n| | Behaviour |\n|---|---|\n| Case | Ignored. `\"metals\"`, `\"Metals\"` and `\"METALS\"` all resolve to the same folder; the same holds for environment and material names. |\n| Leading and trailing whitespace | Trimmed from the argument before matching. `\" Yellow Gold \"` finds `Yellow Gold`. |\n| Internal whitespace | Significant. `\"YellowGold\"` does not find `Yellow Gold`. |\n| Partial names | Not supported. Matching is whole-name equality, never a prefix or a substring — do the filtering yourself, as in the example above. |\n| Unknown name | Throws `ArgumentException`, with the available names listed in the message. |\n\nThe family name is also canonicalised on the way through: `ApplyMaterial(\"metals\", ...)` resolves the folder and then works with the folder's real name, `Metals`, so error messages and the material's internal tag always read the same regardless of how you spelled the argument.\n\nNothing here is cached. Each call re-reads the folder, so a material dropped into the library mid-session is picked up by the next call without a restart.","metadata":{"title":"Render Studio catalogs","section":"How names are matched","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#how-names-are-matched","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-catalogs/#how-names-are-matched","collection":"scripting","hash":"f778ff02d2dc965776b4af612e341dbb","indexed_by":"docs-index"}},{"content":"Render Studio scene\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio\n```\n\nThe two methods behind clicking a tile in the ArtisanRenderAndAnimation panel: one sets the scene environment that lights and reflects the piece, the other drops a studio material onto objects. Both write to the Rhino document, which is what separates them from the Realtime Render viewer — the viewer's `SetViewerMaterial` restyles a private copy of the scene inside the render window and leaves the document alone, whereas these two change the real thing and show up in the viewport, in a save, and in undo.\n\nBoth require a valid licence and an active document, and both take names from the catalogs.","metadata":{"title":"Render Studio scene","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/","collection":"scripting","hash":"1cc7fb0933146fb345e2c6be4c732b3b","indexed_by":"docs-index"}},{"content":"Render Studio scene — Usage\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio, Transaction\n\nwith Transaction.Begin(\"Stage the scene\"):\n    studio.ApplyEnvironment()                              # the studio default setup\n    studio.ApplyEnvironment(\"Jewelry Studio\")              # a named .renv\n    studio.ApplyMaterial(\"Metals\", \"Yellow Gold 18k\")      # onto the current selection\n    studio.ApplyMaterial(\"Metals\", \"Platinum\", objectIds)  # onto specific objects\n    studio.ApplyMaterial(\"Grounds\", \"White Matte\")         # onto the ground plane\n```\n\nBoth return `void`. Both mutate the document, so wrap them in a `Transaction` if you want the staging to undo in one step.","metadata":{"title":"Render Studio scene","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#usage","collection":"scripting","hash":"92d72516dc276a3e9ce8175f4a728378","indexed_by":"docs-index"}},{"content":"Render Studio scene — ApplyEnvironment\n\n```python\nstudio.ApplyEnvironment(name = None)\n```\n\nApplies a scene environment as both the lighting environment and the reflection/refraction environment — exactly what clicking an Environment tile does. `name` is one of the strings from `ListEnvironments()`; matching ignores case and trims the argument.\n\n`name = None` — and equally an empty or whitespace-only string — does not mean \"leave the environment as it is\". It means *the studio's default setup*: the 2Shapes environment for lighting, the diamond refraction environment, and a white ground plane. This is the state the panel puts the scene into before any render, so calling it with no argument is the reliable way to get a scene back to a known-good starting point rather than a no-op.\n\nAn unrecognised name throws before anything is changed:\n\n```\nArgumentException: No environment named 'Foo'. Available: 2Shapes, Jewelry Studio, Softbox.\n```\n\nThe available list is the same one `ListEnvironments()` returns, or `(none installed)` when the Environments folder is empty. With no active document you get `InvalidOperationException(\"No active document.\")`.","metadata":{"title":"Render Studio scene","section":"ApplyEnvironment","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#applyenvironment","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#applyenvironment","collection":"scripting","hash":"b30a238ffb96d3b33cf117c59834a50a","indexed_by":"docs-index"}},{"content":"Render Studio scene — ApplyMaterial\n\n```python\nstudio.ApplyMaterial(family, name, objectIds = None)\n```\n\n`family` and `name` are both required and both come from the catalogs. What the call targets depends on the family.\n\nGrounds targets the ground plane\nIf the resolved family is Grounds (case-insensitively), the material goes onto the render ground plane, not onto geometry: the background style is switched to *Environment*, the ground plane is enabled and taken out of shadow-only mode, and the material is assigned to it. `objectIds` is ignored entirely for this family — nothing needs to be selected, and passing ids does not skin them.\n\nThe ground-plane assignment is compiled for Rhino 8 and 9 only. Under Rhino 7 the background style still flips to *Environment*, and the material is still loaded into the document, but the ground plane itself is left as it was.","metadata":{"title":"Render Studio scene","section":"ApplyMaterial","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#applymaterial","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#applymaterial","collection":"scripting","hash":"bacf1f53d3bcb515ec425f7ea9df5ee8","indexed_by":"docs-index"}},{"content":"Render Studio scene — Every other family skins objects\n\nFor Metals, Gems, Misc and any custom family, the material is assigned to the objects you name, with `MaterialSource` set to *material from object*. It then propagates to every member of every group those objects belong to — the same behaviour as the panel, where dropping a metal on a ring shank re-skins the whole ring. If that is not what you want, ungroup first; there is no flag to switch it off.\n\n`objectIds = None` — and an empty sequence — falls back to the current selection in the document, not to the whole document. If nothing is passed and nothing is selected, the call throws:\n\n```\nArgumentException: Nothing selected: select (or pass) at least one object to receive the material.\n```","metadata":{"title":"Render Studio scene","section":"Every other family skins objects","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#every-other-family-skins-objects","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#every-other-family-skins-objects","collection":"scripting","hash":"613bc543ccf15eff764039048b11cf8c","indexed_by":"docs-index"}},{"content":"Render Studio scene — Validation order\n\nEverything that can be checked is checked before the document is touched, so a bad call leaves the scene exactly as it was: the licence, the active document, the family folder, an empty `name`, the material file, and finally the target list. The messages follow the catalog pattern —\n\n```\nArgumentException: A material name is required (see ListMaterials()).\nArgumentException: No material named 'Foo' in family 'Metals'. Available: Platinum, Yellow Gold 18k.\nInvalidOperationException: The material file could not be loaded: C:\\...\\Platinum.rmtl\n```\n\nThe one check that happens *inside* the loop is the object id lookup: `ArgumentException(\"No object with id {guid}.\")`. Because it fires per object, a list where the fifth id is stale leaves the first four already skinned — another reason to keep the call inside a `Transaction`.","metadata":{"title":"Render Studio scene","section":"Validation order","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#validation-order","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#validation-order","collection":"scripting","hash":"eecfd05df8f4cfebb3ded064d14db81a","indexed_by":"docs-index"}},{"content":"Render Studio scene — Side effects worth knowing\n\n- The lighting is repaired first. If the document has no lighting environment, or is still on Rhino's stock `Studio` one, the studio default environment is applied before the material lands — the same guard the panel runs. A script that calls `ApplyMaterial` without ever calling `ApplyEnvironment` therefore still ends up with studio lighting.\n- The material is loaded once per document. Each material carries a tag in its Notes field built from the family and the name (`METALS-YELLOW_GOLD_18K`); later calls find it by that tag and reuse the existing `RenderMaterial` instead of adding a duplicate. Renaming or clearing that Notes tag by hand will cause a second copy to be added on the next call.\n- The views are redrawn at the end, so the change is visible immediately.","metadata":{"title":"Render Studio scene","section":"Side effects worth knowing","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#side-effects-worth-knowing","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-scene/#side-effects-worth-knowing","collection":"scripting","hash":"9e5e718808e28bd3de1328422707669f","indexed_by":"docs-index"}},{"content":"Render Studio stills\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio\n```\n\nOne raytraced image, taken the way the ArtisanRenderAndAnimation panel's Render button takes it: the document render settings are written, Rhino's current renderer runs — Cycles unless the user changed it — and the result is saved from the render window to the path you gave. It renders the Rhino document through the real renderer, which is why it is slow and why it looks like the panel's output; the Realtime Render viewer and its `ViewerScreenshot` are a different, much faster path with a different look.","metadata":{"title":"Render Studio stills","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/","collection":"scripting","hash":"c00c191ebbc6a322c979b4e68249b421","indexed_by":"docs-index"}},{"content":"Render Studio stills — Usage\n\n```python\npath = studio.RenderStill(r\"C:\\out\\ring.png\")\npath = studio.RenderStill(r\"C:\\out\\ring.png\", width = 2000, height = 1500, samples = 1200)\n```\n\nReturns the full path actually written, which is worth capturing rather than reusing your own string — the path is normalised on the way in.\n\nParameters\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | Destination file. Resolved to a full path; `\".png\"` is appended when it has no extension at all; the containing folder is created if missing. |\n| `width` | `0` | Image width in pixels. `0` keeps the tool default, 800. |\n| `height` | `0` | Image height in pixels. `0` keeps the tool default, 600. |\n| `samples` | `0` | Cycles passes. `0` keeps the tool default, 500. |\n\nThere is no `-1` sentinel here, and no \"use the viewport size\" mode: any value at or below zero — including a negative — is treated as \"keep the default\". To render at the viewport's own size you have to read it yourself and pass the numbers.\n\n`samples` is written as the document-samples override that Cycles reads. If the current renderer is something other than Cycles, the size still applies but the sample count is meaningless to it.","metadata":{"title":"Render Studio stills","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#usage","collection":"scripting","hash":"da50cc824353c8fa61e79f4239a1e1c2","indexed_by":"docs-index"}},{"content":"Render Studio stills — Where the file goes\n\nWherever `path` points. There is no output folder of the studio's own, and no automatic naming — you name the file. Two details of the normalisation matter to a script:\n\n- Relative paths resolve against Rhino's working directory, not against the script's folder. Always pass an absolute path.\n- The extension you give decides the format, because the save goes through Rhino's own `SaveRenderWindowAs`. `.png`, `.jpg` and `.tif` all work; the default `.png` is only substituted when there is no extension at all. A path ending in a bare version number such as `ring.v2` will be read as having the extension `.v2` and will not gain a `.png`.\n- An existing file at that path is overwritten.","metadata":{"title":"Render Studio stills","section":"Where the file goes","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#where-the-file-goes","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#where-the-file-goes","collection":"scripting","hash":"6e1cb9ecc8216b36bb9753c4d87b8f68","indexed_by":"docs-index"}},{"content":"Render Studio stills — What it changes, and how long it blocks\n\n`RenderStill` renders; it does not add, remove or modify geometry, so there is nothing to undo in the usual sense and no `Transaction` is required. It is not, however, entirely read-only: the document render settings are written on every call — the fixed output size is turned on, the image size is set, and the Cycles document-samples override is set to your `samples`. Those settings persist in the document after the call and will be saved with it.\n\nThe call blocks until the render is finished and the file is on disk. At the defaults that is seconds; at 2000×1500 and a high sample count expect minutes, during which Rhino is busy. There is no progress callback and no asynchronous variant.\n\nThe render window is left open afterwards, exactly as the panel leaves it. A script that renders several stills in a row will keep reusing it; close it with `_-CloseRenderWindow` if you want it out of the way at the end.","metadata":{"title":"Render Studio stills","section":"What it changes, and how long it blocks","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#what-it-changes-and-how-long-it-blocks","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#what-it-changes-and-how-long-it-blocks","collection":"scripting","hash":"0b0223a688e6c5f311c5f2e44eeb53c9","indexed_by":"docs-index"}},{"content":"Render Studio stills — Failures\n\n```\nInvalidOperationException: No active document.\nArgumentException:         A destination file path is required.\nInvalidOperationException: The render was cancelled or failed.\nInvalidOperationException: The render image could not be saved.\n```\n\nThe third is what you get when the user hits Escape or closes the render window mid-render — an unattended script should treat it as \"no image was produced\". The licence check runs first and throws before any of these.\n\n```python\nimport rhinoscriptsyntax as rs\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio\n\nstudio.ApplyEnvironment()                      # known-good studio lighting\nfor view in (\"Perspective\", \"Top\"):\n    rs.CurrentView(view)\n    print(studio.RenderStill(r\"C:\\out\\ring-\" + view + \".png\", 1600, 1200, 800))\n```","metadata":{"title":"Render Studio stills","section":"Failures","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#failures","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-stills/#failures","collection":"scripting","hash":"6edee605177c7e46c964b55cc58ee4b2","indexed_by":"docs-index"}},{"content":"Render Studio turntables\n\n```python\nfrom ArtisanPlugin.Scripting import RenderStudioApi as studio\n```\n\nThe panel's Turntable mode, headless: the camera orbits the current target on a horizontal circle, one frame is rendered per step, and the bundled ffmpeg assembles the frames into an MP4. Like stills it goes through Rhino's real renderer, so it is the slow, photoreal route — for a fast, non-raytraced turntable, the Realtime Render viewer records one in seconds.","metadata":{"title":"Render Studio turntables","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/","collection":"scripting","hash":"abffa3a5addbffe7bace062091f3fb6e","indexed_by":"docs-index"}},{"content":"Render Studio turntables — Usage\n\n```python\npath = studio.RenderTurntable(r\"C:\\out\\ring.mp4\")\n\npath = studio.RenderTurntable(\n    r\"C:\\out\\ring.mp4\",\n    seconds = 8, framesPerSecond = 24,\n    width = 1280, height = 720,\n    samples = 300,\n    raytraced = True)\n```\n\nReturns the full path of the video written.\n\nParameters\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | required | Destination video. Resolved to a full path; `\".mp4\"` is appended when it has no extension; the containing folder is created. |\n| `seconds` | `0` | Duration. `0` keeps the tool default, 5. |\n| `framesPerSecond` | `0` | Frame rate, used both for the frame count and for the ffmpeg output. `0` keeps the tool default, 12. |\n| `width` | `0` | Frame width in pixels. `0` keeps the tool default, 800. |\n| `height` | `0` | Frame height in pixels. `0` keeps the tool default, 600. |\n| `samples` | `0` | Cycles passes per frame — or capture passes when `raytraced` is `False`. `0` keeps the tool default, 500. |\n| `raytraced` | `True` | `True` renders every frame with the current renderer (the panel's Cycles mode). `False` captures the viewport in its current display mode instead: far faster, far lower quality. |\n\nNo `-1` sentinels: every numeric parameter treats any value at or below zero as \"keep the default\", negatives included.\n\nFrame count is `seconds × framesPerSecond + 1` — the extra frame closes the loop back onto the starting position. At the defaults that is 5 × 12 + 1 = 61 frames. Since each frame is a full render, the cost grows with the product of duration and frame rate: an 8-second 24 fps turntable is 193 raytraced frames, not 61.","metadata":{"title":"Render Studio turntables","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#usage","collection":"scripting","hash":"98445078a66b8588e056ccb3e35f4ad6","indexed_by":"docs-index"}},{"content":"Render Studio turntables — The orbit\n\nThe circle is built from the active view when the call starts:\n\n- Its centre is the camera target in X and Y, at the camera's own Z height — so the camera keeps its elevation and its distance for the whole orbit.\n- Its radius is the distance from that centre to the camera position, and its seam is moved onto the camera position, so frame 1 is the view you are looking at. Frame the shot in the viewport first; there is no camera argument.\n- The camera is stepped around the circle and the views redrawn between frames. The last step lands back on the seam, so the camera finishes where it started.\n\nIf the camera sits directly above its target there is no circle to build:\n\n```\nInvalidOperationException: The camera is directly above its target: no orbit circle exists. Use a perspective view.\n```\n\nThat is what a top view gives you — use a perspective view.","metadata":{"title":"Render Studio turntables","section":"The orbit","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#the-orbit","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#the-orbit","collection":"scripting","hash":"45f6b9c79d54cb9f00c51b4f4211140e","indexed_by":"docs-index"}},{"content":"Render Studio turntables — What is written where\n\nTwo things land on disk, both next to `path`:\n\n- The video, at `path`, assembled with libx264 at `framesPerSecond` and overwriting any existing file.\n- The frames, in a folder named `FRAMES_ ` beside the video — where the video name is the file name without extension with spaces replaced by underscores, and ` ` is a random 8-character lowercase-alphanumeric string generated per call. So `C:\\out\\my ring.mp4` produces something like `C:\\out\\FRAMES_my_ring7k2p9dq4\\`.\n\nInside it the frames are JPEGs named `frame- -00000001.jpg`, numbered from 1 and zero-padded to eight digits, sharing the same token as the folder.\n\nThe random token means runs never collide and frames are never overwritten; it also means the frames are never cleaned up. Every call leaves its full frame sequence behind, so a script that renders many turntables will accumulate them — delete the folder yourself once you have the video.","metadata":{"title":"Render Studio turntables","section":"What is written where","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#what-is-written-where","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#what-is-written-where","collection":"scripting","hash":"3aee85fd234731779b3169f5da103734","indexed_by":"docs-index"}},{"content":"Render Studio turntables — What it changes, and how long it blocks\n\nGeometry is untouched, so no `Transaction` is needed. Two pieces of state do change and stay changed: the document render settings (fixed output size, image size, and the Cycles document-samples override, exactly as stills write them) and the active viewport camera, which is driven around the circle. The camera does come to rest where it began.\n\nThe call blocks until the MP4 exists. In raytraced mode that means one full render per frame with the render window opened and closed each time — expect minutes to hours, and plan for it: 61 frames at even ten seconds each is ten minutes. `raytraced = False` drops to a viewport capture per frame and is the mode to use for previews and for checking the framing before committing to a long run.","metadata":{"title":"Render Studio turntables","section":"What it changes, and how long it blocks","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#what-it-changes-and-how-long-it-blocks","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#what-it-changes-and-how-long-it-blocks","collection":"scripting","hash":"01e3d300f8d86206ad778917f723fa23","indexed_by":"docs-index"}},{"content":"Render Studio turntables — Failures\n\n```\nInvalidOperationException: No active document.\nInvalidOperationException: No active view.\nArgumentException:         A destination file path is required.\nInvalidOperationException: The camera is directly above its target: no orbit circle exists. Use a perspective view.\nInvalidOperationException: The render was cancelled at frame 17 of 61.\nInvalidOperationException: ffmpeg could not assemble the video (exit code 1). Frames kept in: C:\\out\\FRAMES_...\n```\n\nA cancelled frame aborts the whole run and names the frame it stopped on; the frames already rendered stay in their folder, and the camera is left wherever the orbit had reached.\n\nffmpeg itself is copied out of the RhinoArtisan installation into the user's Render folder the first time a turntable is rendered. If it is missing from both places:\n\n```\nInvalidOperationException: ffmpeg.exe is not installed (missing from both the user Render folder and the installation). Reinstall RhinoArtisan.\n```\n\nNote that ffmpeg failing still leaves you every frame — the message tells you the folder, and the sequence can be assembled by hand.","metadata":{"title":"Render Studio turntables","section":"Failures","url":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#failures","source":"https://www.rhinoartisan.com/docs/scripting/reference/render/studio-turntables/#failures","collection":"scripting","hash":"8e58601405e5e1f74828ccc8dec9b119","indexed_by":"docs-index"}},{"content":"Shanks\n\nThe ring bodies. Each has its own page: what its facade can create, and what its handle can edit afterwards.\n\nClassic The comfort-fit band, with an optional row of stones.\n\nCathedral Arms rising toward the setting.\n\nAdvanced cathedral A cathedral shaped by editable stations along the arm.\n\nEternity Band plus stones all around, standalone.\n\nBypass Two arms that cross past each other.\n\nSplit shank A band that opens into two arms toward the setting.\n\nGraduated Stones stepping down from the centre stone to the band.\n\nPave shank A band carrying longitudinal rows of stones.\n\nTwo rows Two parallel rows of stones, one on each face.\n\nMatching shank A band fitted against an existing ring.\n\nSignet A flat face carried on a band - classic and advanced.\n\nWedding His-and-hers sets and single bands.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/","collection":"scripting","hash":"a8b832fcf1c83469d55f1f0f9cc33974","indexed_by":"docs-index"}},{"content":"Shanks — Conventions\n\nEverything follows the house rules: millimetres, `0` keeps the tool default (or your saved defaults), `fingerDiameter = 0` uses the document's configured ring size, `profile` picks a `RING_PROFILE` asset by name, and mutations belong inside a `Transaction`.\n\nWhat each one can do\nThree shanks can be built from scratch. The rest are query + edit: run their command in the UI once, then script every variant from the handle it leaves behind.\n\n| Shank | Facade | Create | Edit |\n|---|---|---|---|\n| Classic | `ClassicApi` | yes | full |\n| Cathedral | `CathedralApi` | yes | full |\n| Eternity | `EternityApi` | yes | full |\n| Advanced cathedral | `AdvancedCathedralApi` | - | full |\n| Bypass | `BypassApi` | - | full |\n| Split shank | `SplitShankApi` | - | full |\n| Graduated | `GraduatedApi` | - | full |\n| Pave shank | `PaveShankApi` | - | full |\n| Two rows | `TwoRowsShankApi` | - | full |\n| Matching shank | `MatchingShankApi` | - | full |\n| Signet | `SignetRingApi` | - | full |\n| Advanced signet | `AdvancedSignetRingApi` | - | full |\n| Wedding set | `WeddingApi` | - | full |\n| Wedding band | `WeddingBandApi` | - | full |","metadata":{"title":"Shanks","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#conventions","collection":"scripting","hash":"4826989d44f0db535e2e09f0abc9b569","indexed_by":"docs-index"}},{"content":"Shanks — The shared surface\n\nEvery shank handle builds on `IParametricObject`:\n\n| Member | Meaning |\n|---|---|\n| `Id` | The object's Guid - stable across parametric edits |\n| `ObjectType` | `\"Classic\"`, `\"Cathedral\"`, `\"Bypass\"`, ... |\n| `LayerName` | Full layer path |\n| `Position` | The shank's placement point |\n| `RingSizeLabel` / `RingSizeRegion` / `RingDiameterMm` | The ring size, e.g. `\"54\"` / `\"EUROPE\"` / `17.2` |\n| `Move(vector)` / `Delete()` | Translate, or remove the whole group |\n\n`MotherGemId` is empty by design - shanks are multi-gem objects, not children of one stone.\n\nEvery facade shares the same query surface - `All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.\n\n```python\nfrom ArtisanPlugin.Scripting import CathedralApi as cathedral\n\nfor s in cathedral.All():\n    print(s.RingSizeLabel, s.RingSizeRegion, s.RingDiameterMm)\n```","metadata":{"title":"Shanks","section":"The shared surface","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#the-shared-surface","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#the-shared-surface","collection":"scripting","hash":"4d97e91079db1302553b47523bb2fa97","indexed_by":"docs-index"}},{"content":"Shanks — Not scriptable yet\n\n| Tool | Why |\n|---|---|\n| Ring by sections | The advanced ring driven by arbitrary section curves - no scripting surface |\n| Class ring | No scripting surface |\n| Ring extrude | No scripting surface |\n| Scoop ring | The tool bakes plain Breps and stores no parameters, so there is nothing to re-edit - not even in the UI |\n\nCurve-based shanks are a different route: build the rail with `RingCurveApi`, then sweep it or run gems-on-curve and channel settings along it. Engraving text around a band is `EngravingApi`.","metadata":{"title":"Shanks","section":"Not scriptable yet","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#not-scriptable-yet","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/#not-scriptable-yet","collection":"scripting","hash":"417c06505d09a917fbf5f0ac1f04bb57","indexed_by":"docs-index"}},{"content":"Advanced cathedral\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedCathedralApi as advcathedral\n```\n\nLike the cathedral, but the band's cross-section is defined by editable stations along the arm instead of one fixed profile - each station sets its own width, height and profile asset.\n\nCreate\nNo `Create` yet. Run ArtisanAdvancedCathedralShank in the UI once, then script every variant from the handle.","metadata":{"title":"Advanced cathedral","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/","collection":"scripting","hash":"af05179573e56d059d02f50db791fee6","indexed_by":"docs-index"}},{"content":"Advanced cathedral — Edit\n\nThe `IAdvancedCathedral` handle has three sections; each setter regenerates the shank in place, re-baking gems, prongs and cutters:\n\n| Section | What it edits |\n|---|---|\n| `Shank` | The station list (replace all, or edit one), shared profile, arm height/opening, tip inclination and rounding, tangent point, and the whole bridge |\n| `Gems` | The pave row - the same section the classic cathedral uses |\n| `GemGradient` | How stone size and prongs vary along the run: gradient points, start/middle/end sizes, prong growth and spacing |\n\n```python\nfrom ArtisanPlugin.Scripting import AdvancedCathedralApi as advcathedral, Transaction\n\nshank = advcathedral.Selected()[0]\nwith Transaction.Begin(\"Wider arm tip\"):\n    shank.Shank.SetStation(0, position = 0.0, width = 2.0, height = 1.4)\n    shank.GemGradient.SetGemSizes(1.2, 2.0, 1.8)\n```\n\nEvery station needs a profile asset or the shank fails to regenerate. `SetStations` reuses the current profile for any station you leave without one.","metadata":{"title":"Advanced cathedral","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/#edit","collection":"scripting","hash":"7bf9f13fd14057c2f61589c471749766","indexed_by":"docs-index"}},{"content":"Advanced cathedral — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Advanced cathedral","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/advanced-cathedral/#queries","collection":"scripting","hash":"972297a31a482f3c136d6ae3816fa903","indexed_by":"docs-index"}},{"content":"Bypass\n\n```python\nfrom ArtisanPlugin.Scripting import BypassApi as bypass\n```\n\nThe bypass shank: two arms that cross past each other instead of meeting.\n\nCreate\nNo `Create` yet. Run ArtisanBypass in the UI once, then script every variant from the handle.\n\nEdit\nThe `IBypass` handle has two sections; each setter regenerates the shank in place, re-baking gems and prongs:\n\n| Section | What it edits |\n|---|---|\n| `Shank` | The band - either by the top/bottom gradient or by a list of stations; arm angle/width/height, tip rotation, how far the arms pass each other and where that displacement starts, plus the bridge |\n| `Gems` | The gems row along each arm: shape, size, arc from the tip, spacing, channel, a stone-size gradient, prongs (growth, minimum diameter, end count, spacing) and drills |\n\n```python\nfrom ArtisanPlugin.Scripting import BypassApi as bypass, Transaction\n\nring = bypass.Selected()[0]\nwith Transaction.Begin(\"Wider crossing, graded stones\"):\n    ring.Shank.SetDisplacement(3.0)\n    ring.Gems.SetGradient(True)\n    ring.Gems.SetGemSizeGradient(1.2, 1.5, 1.8)\n```","metadata":{"title":"Bypass","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/bypass/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/bypass/","collection":"scripting","hash":"1e82ed039edab74a189fc64b657ea9f9","indexed_by":"docs-index"}},{"content":"Bypass — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Bypass","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/bypass/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/bypass/#queries","collection":"scripting","hash":"c54f6d122fc1c1ea4989fb8d37e9d8b3","indexed_by":"docs-index"}},{"content":"Cathedral\n\n```python\nfrom ArtisanPlugin.Scripting import CathedralApi as cathedral\n```\n\nThe cathedral shank - arms rising toward the setting, the classic body under halo and solitaire designs.\n\nCreate\n```python\nshank = cathedral.Create(topWidth = 2.5, topHeight = 1.9,\n                         bottomWidth = 3.5, bottomHeight = 1.8,\n                         armWidth = 4.5, armHeight = 3.5,\n                         withGems = False, gemSize = 1.3, gemsAngle = 180,\n                         fingerDiameter = 0, profile = None)          # -> ICathedral\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `topWidth` x `topHeight` | `2.5 x 1.9` | Band section at the top |\n| `bottomWidth` x `bottomHeight` | `3.5 x 1.8` | Band section at the bottom |\n| `armWidth` / `armHeight` | `4.5` / `3.5` | The opening between the rising arms and how high they climb over the finger circle |\n| `withGems` | `False` | Adds the pave row along the top - one run per arm |\n| `gemSize` | `1.3` | Stone size of the pave row, mm |\n| `gemsAngle` | `180` | Degrees of the shank covered by the row |\n| `fingerDiameter` | `0` | `0` = the document's configured ring size |\n| `profile` | `None` | `RING_PROFILE` asset by name |\n\nThe pave rows are baked as child objects of the shank, like the tool's Accept.","metadata":{"title":"Cathedral","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/","collection":"scripting","hash":"5152344ce6d7ff5a9ab53df0531d27b5","indexed_by":"docs-index"}},{"content":"Cathedral — Edit\n\nThe `ICathedral` handle has two sections; each setter regenerates the shank in place:\n\n| Section | What it edits |\n|---|---|\n| `Shank` | Profile asset, top and bottom band sections, arm angle/width/height/tangent, cap distance, and the whole bridge |\n| `Gems` | The pave row: shape, size, arc, spacing, channel, prongs, drills, scalloped proportions |\n\n`SetTopWidth` / `SetTopHeight` / `SetBottomWidth` / `SetBottomHeight` are shortcuts for the band sections.\n\n```python\nshank.Shank.SetArmHeight(4.0)      # regenerates the cathedral\nshank.Gems.SetProngType(\"SCALLOPED\")\n```","metadata":{"title":"Cathedral","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/#edit","collection":"scripting","hash":"88b5dee3241f80cab7c80fd323bda647","indexed_by":"docs-index"}},{"content":"Cathedral — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Cathedral","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/cathedral/#queries","collection":"scripting","hash":"971a739beea78c9f0bef4e70ea66b0ee","indexed_by":"docs-index"}},{"content":"Classic\n\n```python\nfrom ArtisanPlugin.Scripting import ClassicApi as classic\n```\n\nThe comfort-fit band - the scriptable ring body for most designs.\n\nCreate\n```python\nring = classic.Create(width = 3, height = 2, fingerDiameter = 0,\n                      withGems = False, gemSize = 1.2, gemsAngle = 180,\n                      profile = None, plane = Plane.WorldXY)          # -> IClassic\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `width` | `3` | Band width |\n| `height` | `2` | Band height |\n| `fingerDiameter` | `0` | `0` = the document's configured ring size |\n| `withGems` | `False` | Adds a row of stones around the top of the band |\n| `gemSize` | `1.2` | Stone size of the row, mm |\n| `gemsAngle` | `180` | Degrees of the shank covered by the row |\n| `profile` | `None` | `RING_PROFILE` asset by name |\n| `plane` | `Plane.WorldXY` | Placement plane |\n\nThe gems and their prongs are baked as child objects of the shank.","metadata":{"title":"Classic","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/","collection":"scripting","hash":"4704ac66a0b4a8beeb0ee675637950e8","indexed_by":"docs-index"}},{"content":"Classic — Edit\n\n`Create`, `Find` and `All` return an `IClassic` handle. Its six sections cover the whole tool; each setter regenerates the shank in place, keeping its Guid and undo intact:\n\n| Section | What it edits |\n|---|---|\n| `TopProfile` / `MidProfile` / `BottomProfile` | The three band sections: profile asset, closing type, width/height, thickness, comfort, rotation, displacement, orientation |\n| `ExternalProfile` | The profile carved on the outside face |\n| `Advanced` | The opening at the bottom: none, cut or strangle |\n| `Gems` | The gems row: shape, size, arc, spacing, channel, prongs, drills |\n\n`SetWidth` / `SetHeight` are shortcuts for the top profile.\n\n```python\nfrom ArtisanPlugin.Scripting import ClassicApi as classic, Transaction\n\nring = classic.Selected()[0]\nwith Transaction.Begin(\"Slimmer band with a gem row\"):\n    ring.TopProfile.SetWidth(2.2)\n    ring.Gems.SetEnabled(True)\n    ring.Gems.SetAngle(200)\n```","metadata":{"title":"Classic","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/#edit","collection":"scripting","hash":"017e91661f76b4419be5d7d39aa7ff42","indexed_by":"docs-index"}},{"content":"Classic — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Classic","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/classic/#queries","collection":"scripting","hash":"84dbbe6a638acf2193b24934b4059c92","indexed_by":"docs-index"}},{"content":"Eternity\n\n```python\nfrom ArtisanPlugin.Scripting import EternityApi as eternity\n```\n\nA full eternity ring - band plus stones all around, standalone (no mother gem or curve needed).\n\nCreate\n```python\net = eternity.Create(gemSize = 2, gemShape = \"ROUND\",\n                     shankWidth = 2.25, shankHeight = 1.5,\n                     fingerDiameter = 0, profile = None)              # -> IEternity\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `gemSize` | `2` | Stone size, mm |\n| `gemShape` | `\"ROUND\"` | Stone shape |\n| `shankWidth` x `shankHeight` | `2.25 x 1.5` | Band section |\n| `fingerDiameter` | `0` | `0` = the document's configured ring size |\n| `profile` | `None` | `RING_PROFILE` asset by name |","metadata":{"title":"Eternity","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/","collection":"scripting","hash":"7c0aea1aff528576f848e8b57f381ee2","indexed_by":"docs-index"}},{"content":"Eternity — Edit\n\nThe `IEternity` handle has four sections; each setter regenerates the ring in place, re-baking its stones:\n\n| Section | What it edits |\n|---|---|\n| `Gems` | Shape, material, carat, explicit sizes, distribution (full, half, three-quarters, 5/7/9 stones), orientation, spacing |\n| `Prongs` | Distribution (shared or individual), straight or curved mode, distances, diameters, height over girdle |\n| `Bezels` | Rail mode and shape, profile shape, and the two rails with their own section and thread |\n| `Shank` | The caps plus the upper and lower band halves, each with profile asset, closing type and section |\n\n```python\nfrom ArtisanPlugin.Scripting import EternityApi as eternity, Transaction\n\nring = eternity.All()[0]\nwith Transaction.Begin(\"Half eternity in emerald cut\"):\n    ring.Gems.SetShape(\"EMERALD\")\n    ring.Gems.SetDistribution(\"HALF\")\n    ring.Prongs.SetMode(\"CURVED\")\n```","metadata":{"title":"Eternity","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/#edit","collection":"scripting","hash":"9cdc7360888946dda4597108d6da75d2","indexed_by":"docs-index"}},{"content":"Eternity — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Eternity","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/eternity/#queries","collection":"scripting","hash":"19a3bc0181cfb474c0836250d86096dd","indexed_by":"docs-index"}},{"content":"Graduated\n\n```python\nfrom ArtisanPlugin.Scripting import GraduatedApi as graduated\n```\n\nA band whose section grows toward the centre stone, carrying a run of stones that shrink along the way - with prongs that taper to match.\n\nCreate\nNo `Create` yet. Run ArtisanGraduated in the UI once, then script every variant from the handle.","metadata":{"title":"Graduated","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/","collection":"scripting","hash":"abac02992b24f2c69b522fd6de263c97","indexed_by":"docs-index"}},{"content":"Graduated — Edit\n\nThe `IGraduated` handle has two sections; each setter regenerates the shank in place, re-baking stones, prongs and the under-bezel rail:\n\n| Section | What it edits |\n|---|---|\n| `Shank` | The two profiles the section morphs between (`TopProfile` and `BottomProfile`, each with profile asset, closing type and dimensions), plus cut bumping and opening margin |\n| `Gems` | The run: stone count per side, start and end sizes, spacing, centre stone size, lift; the tapering prongs (heights, diameters, separations, over-girdle - each as a start/end pair); the under-bezel rail; and drills |\n\nMost prong and stone sizes come as start/end pairs - start is nearest the centre stone, end nearest the band - and are set in one call:\n\n```python\nfrom ArtisanPlugin.Scripting import GraduatedApi as graduated, Transaction\n\nring = graduated.Selected()[0]\nwith Transaction.Begin(\"Five stones per side, steeper taper\"):\n    ring.Gems.SetNumberOfStones(5)\n    ring.Gems.SetSizes(2.8, 1.3)              # centre-side, band-side\n    ring.Gems.SetProngDiameters(0.80, 0.60)\n```","metadata":{"title":"Graduated","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/#edit","collection":"scripting","hash":"72b8742c4610aae09f542b126b11b658","indexed_by":"docs-index"}},{"content":"Graduated — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Graduated","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/graduated/#queries","collection":"scripting","hash":"9ea0cf1e5afe0fdb5ed73d84197bad28","indexed_by":"docs-index"}},{"content":"Matching shank\n\n```python\nfrom ArtisanPlugin.Scripting import MatchingShankApi as matching\n```\n\nA band shaped to sit against an existing ring (the \"mother\"), so the pair stacks without a gap.\n\nCreate\nNo `Create` yet - fitting needs a mother ring picked in the document. Run ArtisanMatchingShank in the UI once, then script every variant from the handle.","metadata":{"title":"Matching shank","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/","collection":"scripting","hash":"43079ec15a76197e9b06cc22d56d21ad","indexed_by":"docs-index"}},{"content":"Matching shank — Edit\n\nThe `IMatchingShank` handle is flat plus a gems section; each setter regenerates the shank in place, re-baking gems and prongs (and both bands when `BothSides` is on):\n\n| Group | What it edits |\n|---|---|\n| The fit | `Clearance`, `Distance` (negative presses into the mother), `TopDistance`, `NumberOfPoints`, `FlipSide`, `BothSides`, and per-section `SectionDeltas` |\n| The band | Profile asset, top and bottom sections, interior type (solid or comfort) and comfort depth |\n| `Gems` | The row: distribution (full, side, top) with its angles, size, spacing, channel top and bottom, a stone-size gradient, prongs (top/bottom diameters, growth, end count) and drills |\n\nRead-only outputs: `MotherRingIds`, `RingCurveId`, `CurveFromRingSize`, `SectionContactOffsets` (what the last computation measured).\n\n```python\nfrom ArtisanPlugin.Scripting import MatchingShankApi as matching, Transaction\n\nshank = matching.Selected()[0]\nwith Transaction.Begin(\"Tighter fit, stones on the sides\"):\n    shank.SetClearance(0.15)\n    shank.Gems.SetEnabled(True)\n    shank.Gems.SetDistribution(\"SIDE\")\n    shank.Gems.SetSideAngles(30, 150)\n```","metadata":{"title":"Matching shank","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/#edit","collection":"scripting","hash":"cecb5e7d343d5ba016d3cdb476121190","indexed_by":"docs-index"}},{"content":"Matching shank — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`. Plus `ForRing(ringId)` - the matching shanks fitted against a given ring.","metadata":{"title":"Matching shank","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/matching/#queries","collection":"scripting","hash":"b19742961bbd4fa0ed72005a3f3d2341","indexed_by":"docs-index"}},{"content":"Pave shank\n\n```python\nfrom ArtisanPlugin.Scripting import PaveShankApi as pave\n```\n\nA band carrying one or more longitudinal rows of stones - each row a line of equal stones at its own lateral offset, running between two angles along the band.\n\nCreate\nNo `Create` yet. Run ArtisanPaveShank in the UI once, then script every variant from the handle.","metadata":{"title":"Pave shank","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/","collection":"scripting","hash":"1219bed84372e7e9b1f12ad31b7c81ea","indexed_by":"docs-index"}},{"content":"Pave shank — Edit\n\nThe `IPaveShank` handle exposes the band and the rail; each setter regenerates the shank in place, re-baking stones and prongs:\n\n| Section | What it edits |\n|---|---|\n| `TopProfile` | The band section - the same classic profile model: asset, closing type, width/height, thickness, comfort, rotation, orientation |\n| `Advanced` | The opening at the bottom: none, cut or strangle |\n| `Rail` | The rows (replace the whole list, or edit one by index), the prong definitions, and the global prong height and diameter |\n| `CuttersEnabled` | Whether the gem cutters are subtracted from the band |\n\n```python\nfrom ArtisanPlugin.Scripting import PaveShankApi as pave, Transaction\n\nring = pave.Selected()[0]\nwith Transaction.Begin(\"Tighter centre row\"):\n    ring.Rail.SetRow(0, gemSize = 1.1, offset = 0.0, spacing = 0.15,\n                     startAngle = 20, endAngle = 160)\n    ring.Rail.SetProngDiameter(0.6)\n```\n\nEach row reports `GemSize`, `Offset`, `Spacing`, `StartAngle`, `EndAngle` and `Mirror`; each prong reports its `RowIndex`, position, `Diameter`, `Height` and flags.\n\nThe pave shank's row model is still evolving in the tool. The scripting surface follows the current `Rows` model - the legacy fixed-layout fields it replaced are not exposed.","metadata":{"title":"Pave shank","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/#edit","collection":"scripting","hash":"50201fb5644012e798bb7aa52417162c","indexed_by":"docs-index"}},{"content":"Pave shank — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Pave shank","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/pave/#queries","collection":"scripting","hash":"9400c06d91a03546bf63b21802691918","indexed_by":"docs-index"}},{"content":"Signet\n\n```python\nfrom ArtisanPlugin.Scripting import SignetRingApi as signet, AdvancedSignetRingApi as advsignet\n```\n\nA signet ring: a flat face carried on a band. Two variants - the classic one, and an advanced one that adds a lateral profile and a wedge cut.\n\nCreate\nNeither has a `Create` yet. Run ArtisanSignetRing or ArtisanAdvancedSignetRing in the UI once, then script every variant from the handle.","metadata":{"title":"Signet","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/","collection":"scripting","hash":"d0287e021bbd9d65d4134f8798d01454","indexed_by":"docs-index"}},{"content":"Signet — Edit\n\nBoth handles share the same `Face` section, because both rings store the same face model:\n\n| Member of `Face` | What it edits |\n|---|---|\n| Face | Profile asset, width, height, height over the finger, rotation, tangent, shape mode (circle or custom) |\n| Band | Bottom and middle sections, set in one call each |\n| Recess | Whether the back of the face is hollowed, plus thickness and inner height |\n\n```python\nfrom ArtisanPlugin.Scripting import SignetRingApi as signet, Transaction\n\nring = signet.Selected()[0]\nwith Transaction.Begin(\"Bigger oval face, hollowed\"):\n    ring.Face.SetWidth(11.0)\n    ring.Face.SetHeight(9.0)\n    ring.Face.SetRecess(True)\n```\n\nSee `ISignetRing` for the full member list.","metadata":{"title":"Signet","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#edit","collection":"scripting","hash":"d9818c4d5a66b2018918fa0ae69d0afc","indexed_by":"docs-index"}},{"content":"Signet — Advanced signet\n\n`IAdvancedSignetRing` adds two members on top of the same `Face`:\n\n| Member | Meaning |\n|---|---|\n| `LateralProfileName` / `SetLateralProfile(assetName)` | The `RING_SIDE_CURVE` asset that shapes the sides |\n| `BottomCutAngle` / `SetBottomCutAngle(degrees)` | Total opening of the wedge cut at the bottom of the band; `0` = no cut |","metadata":{"title":"Signet","section":"Advanced signet","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#advanced-signet","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#advanced-signet","collection":"scripting","hash":"198ae4a5d84b3a9ddf755fc41fd20eec","indexed_by":"docs-index"}},{"content":"Signet — Queries\n\nBoth facades: `All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Signet","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/signet/#queries","collection":"scripting","hash":"6b2855898398b065456a7958c0776a49","indexed_by":"docs-index"}},{"content":"Split shank\n\n```python\nfrom ArtisanPlugin.Scripting import SplitShankApi as split\n```\n\nA cathedral-style band that opens into two arms toward the setting. The band is swept along a parametric rail through three profile sections.\n\nCreate\nNo `Create` yet. Run ArtisanSplitShank in the UI once, then script every variant from the handle.","metadata":{"title":"Split shank","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/","collection":"scripting","hash":"24ce369a42fe548442eee06b679389c9","indexed_by":"docs-index"}},{"content":"Split shank — Edit\n\nThe `ISplitShank` handle has two sections plus the swept profiles; each setter regenerates the shank in place:\n\n| Section | What it edits |\n|---|---|\n| `Curve` | The rail: arm height and angle, outward bulge, tangency, where the split starts, how wide the arms separate, lateral displacement and inclination |\n| `Sections` | The three swept profiles, in rail order (bottom, side, top). Read the list, then edit one with `SetSection(index, ...)` or toggle it with `SetSectionEnabled(index, enabled)` |\n| `Gems` | The pave run along the arms: a top-to-bottom size gradient, spacing per zone, channel shape and clearance, prongs, drills, V-cutters |\n\n```python\nfrom ArtisanPlugin.Scripting import SplitShankApi as split, Transaction\n\nring = split.Selected()[0]\nwith Transaction.Begin(\"Taller arms, wider split\"):\n    ring.Curve.SetArmHeight(4.5)\n    ring.Curve.SetSplitWidth(8.4)\n    ring.SetSection(1, position = 0.5, width = 2.8, height = 1.9)\n```","metadata":{"title":"Split shank","section":"Edit","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/#edit","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/#edit","collection":"scripting","hash":"713240dcf80bfb48a467a4f81d7e775f","indexed_by":"docs-index"}},{"content":"Split shank — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Split shank","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/split/#queries","collection":"scripting","hash":"3ae7c2a5e6037408681d7c4ff01f1a01","indexed_by":"docs-index"}},{"content":"Two rows\n\n```python\nfrom ArtisanPlugin.Scripting import TwoRowsShankApi as tworows\n```\n\nA classic band with a channel carved on each face, carrying two parallel rows of stones.\n\nCreate\nNo `Create` yet. Run ArtisanTwoRowsShank in the UI once, then script every variant from the handle.\n\nEdit\nThe band is a full classic shank, so `ITwoRowsShank` exposes the classic sections plus the two-rows specifics. Each setter regenerates the shank in place, re-baking stones, prongs and cutters:\n\n| Section | What it edits |\n|---|---|\n| `TopProfile` / `MidProfile` / `BottomProfile` / `ExternalProfile` / `Advanced` | The band - the same sections as Classic |\n| `Rail` | The channel: layout (full, side angle, top angle) with its angles, width and offset, fit tolerance, rotation, rail mode (double or single), cut orientation, central wall, outer border, row spacing and end margin |\n| `Gems` | The stones on the rails - the same options as a classic gems row |\n| `GemsEnabled` / `CuttersEnabled` | Master toggles |\n\n```python\nfrom ArtisanPlugin.Scripting import TwoRowsShankApi as tworows, Transaction\n\nring = tworows.Selected()[0]\nwith Transaction.Begin(\"Single wide channel, stones only on top\"):\n    ring.Rail.SetRailMode(\"SINGLE\")\n    ring.Rail.SetLayoutMode(\"TOP_ANGLE\")\n    ring.Rail.SetTopAngle(90)\n```","metadata":{"title":"Two rows","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/two-rows/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/two-rows/","collection":"scripting","hash":"2169db0d9e980ff4ed6211f19366df29","indexed_by":"docs-index"}},{"content":"Two rows — Queries\n\n`All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Two rows","section":"Queries","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/two-rows/#queries","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/two-rows/#queries","collection":"scripting","hash":"dd87638f21a99f00446ca5edb941cd56","indexed_by":"docs-index"}},{"content":"Wedding\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingApi as wedding, WeddingBandApi as band\n```\n\nWedding rings come in two shapes: a set of two rings baked together as one group, and a single band. Both store the same per-ring model, so they share one section.\n\nCreate\nNeither has a `Create` yet. Run ArtisanWeddingRing or ArtisanWeddingBand in the UI once, then script every variant from the handle.","metadata":{"title":"Wedding","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/","collection":"scripting","hash":"18312463432d04fc848ae63ab899b23b","indexed_by":"docs-index"}},{"content":"Wedding — Edit - the set\n\n`IWedding` exposes `FirstRing` and `SecondRing`, each a full ring. Editing either regenerates the whole set in place, re-baking both bands, their stones and prongs.\n\n| Member of a ring | What it edits |\n|---|---|\n| `Metal` / `SetMetal(metal)` | e.g. `\"GOLD_ROSE_18\"`, `\"PLATINUM\"` |\n| `Profile` | Profile asset, width and height of the band |\n| `Gems` | Enabled, shape (round or princess), distribution (full, half, one quarter, custom) and its count, spacing, channel, prongs (none, shared or channel) and drills |\n\n```python\nfrom ArtisanPlugin.Scripting import WeddingApi as wedding, Transaction\n\npair = wedding.All()[0]\nwith Transaction.Begin(\"Hers in rose gold with a half row\"):\n    pair.SecondRing.SetMetal(\"GOLD_ROSE_18\")\n    pair.SecondRing.Gems.SetEnabled(True)\n    pair.SecondRing.Gems.SetDistribution(\"Half\")\n```","metadata":{"title":"Wedding","section":"Edit - the set","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/#edit---the-set","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/#edit---the-set","collection":"scripting","hash":"9bafcf3095865becd228050798be6120","indexed_by":"docs-index"}},{"content":"Wedding — Wedding band\n\n`IWeddingBand` is the one-ring counterpart: a single `Ring` member with exactly the same surface.\n\n```python\nb = band.All()[0]\nwith Transaction.Begin(\"Wider band, no stones\"):\n    b.Ring.Profile.SetWidth(4.0)\n    b.Ring.Gems.SetEnabled(False)\n```\n\nQueries\nBoth facades: `All()`, `Find(id)`, `Count()`, `Selected()`, `ByLayer(name)`.","metadata":{"title":"Wedding","section":"Wedding band","url":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/#wedding-band","source":"https://www.rhinoartisan.com/docs/scripting/reference/shanks/wedding/#wedding-band","collection":"scripting","hash":"4f3a814a1a76ad0db5d95f03dad2fdd8","indexed_by":"docs-index"}},{"content":"Transform\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nThe operations that take geometry you already have and move, resize or reshape it. Each has its own page.\n\nScale by weight Scale so the piece weighs exactly N grams in a metal.\n\nScale to dimensions Make the bounding box measure exactly X × Y × Z mm.\n\nCopy on objects Copies draped onto a target surface, one per point.\n\nMove on objects Move the selection onto a target surface, reoriented to it.\n\nMove by normal Push each object along a surface's local normal.\n\nMirror quad Three history-linked copies filling the four quadrants.\n\nMirror opposite One copy on the opposite side, keeping its handedness.\n\nBend Curve a flat motif — e.g. around the finger.\n\nTwist Rope-like shanks, twisted wires, spiral motifs.\n\nTaper Grow or shrink the section linearly along an axis.","metadata":{"title":"Transform","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/","collection":"scripting","hash":"9ad815f5226c29a639c33f9a6ff421b7","indexed_by":"docs-index"}},{"content":"Transform — The three families\n\n| Family | Pages | What they do |\n|---|---|---|\n| Scaling | Scale by weight, Scale to dimensions | Resize the whole set to hit an exact target — grams, or millimetres |\n| Placement | Copy on objects, Move on objects, Move by normal, Mirror quad, Mirror opposite | Move or duplicate geometry relative to a surface or a plane |\n| Deformations | Bend, Twist, Taper | Rhino space-morphs that reshape the geometry itself |","metadata":{"title":"Transform","section":"The three families","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#the-three-families","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#the-three-families","collection":"scripting","hash":"3eeb1f3f01790622a3bc8ed7727f41db","indexed_by":"docs-index"}},{"content":"Transform — Conventions\n\nMillimetres and degrees throughout, and mutations belong inside a `Transaction` for one-step undo.\n\nEvery one of these takes an object list where `None` or an empty list falls back to the current viewport selection — and raises when that is empty too — *\"Nothing selected…\"* on the scaling and placement methods, *\"Nothing to deform…\"* on the deformations. Explicit ids are validated individually and de-duplicated.\n\nWhere a method takes a `plane`, `None` resolves to the active viewport's construction plane, falling back to world XY when running headless.\n\n`0` does not mean \"tool default\" everywhere here, unlike the component facades. On Scale to dimensions a `0` axis means \"leave that axis alone\", and Move by normal's `distance` is a real length. Each page states what its own zero means.","metadata":{"title":"Transform","section":"Conventions","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#conventions","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#conventions","collection":"scripting","hash":"cc066737a3fe5536c178c4c81347fa5b","indexed_by":"docs-index"}},{"content":"Transform — What each one returns\n\nThese facades hand back plain values — there are no handles and no query methods. What comes back differs by method, and so does whether your originals survive.\n\n| Page | Returns | Sources |\n|---|---|---|\n| Scale by weight | The scale `factor` applied, as a number | Scaled in place, or copied with `keepOriginal` |\n| Scale to dimensions | Object ids | Scaled in place, or copied with `keepOriginal` |\n| Copy on objects | The new copies' ids | Untouched |\n| Move on objects | Count of objects moved | Moved in place |\n| Move by normal | Count of objects moved | Moved in place |\n| Mirror quad | The new copies' ids | Untouched |\n| Mirror opposite | The new copy's id | Untouched |\n| Bend · Twist · Taper | The new deformed objects' ids — never the ids you passed | Deleted, unless `keepOriginal` |\n\nThe counts returned by the two move operations can be lower than the number of ids you passed: objects with no geometry, or whose closest-point projection fails, are skipped silently rather than raising.","metadata":{"title":"Transform","section":"What each one returns","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#what-each-one-returns","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/#what-each-one-returns","collection":"scripting","hash":"105849ac6632479d01d4178c7be88e30","indexed_by":"docs-index"}},{"content":"Bend\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nBends objects around the centre of their common bounding box, exactly like the Bend panel. The jewellery move it exists for: take a flat band or a flat pattern and curve it so it follows the finger before you flow it or boolean it into the shank - bend on the default `\"XY\"` plane with equal `xPos` and `xNeg`, using the amount that matches the finger diameter (`DocumentApi.GetRingSize().Diameter`). The four distances are the four gumball handles of the panel: each one pulls its side of the bounding box off the bend plane, and the geometry follows as a space morph.","metadata":{"title":"Bend","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/","collection":"scripting","hash":"2ff47d8ad742a1b3008d5659ef65840e","indexed_by":"docs-index"}},{"content":"Bend — Usage\n\n```python\nids = transform.Bend(objectIds, xPos = 0, xNeg = 0, yPos = 0, yNeg = 0,\n                     plane = None, rigidIds = None, keepOriginal = False)   # -> new object ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Objects to bend; `None`/empty = the current selection |\n| `xPos` | `0` | Millimetres the bounding box's +X side is pushed along the bend plane's normal |\n| `xNeg` | `0` | Same for the -X side |\n| `yPos` | `0` | Same for the +Y side |\n| `yNeg` | `0` | Same for the -Y side |\n| `plane` | `None` = `\"XY\"` | Bend plane, case-insensitive: `\"XY\"` (pushes along world +Z), `\"ZX\"` (along world +Y), `\"YZ\"` (along world +X) |\n| `rigidIds` | `None` | Objects that must not distort - gems, heads - carried along rigidly |\n| `keepOriginal` | `False` | `True` leaves the originals in the document |\n\nPositive values lift the side towards the plane normal, negative bend it the other way, `0` leaves that side straight. Pass the same value to a pair (`xPos = xNeg`) for a symmetric bend - that is all the panel's Symmetrical and Quad modes do. One `BendSpaceMorph` is built per non-zero distance, hinged at the bounding-box centre with its handle at the corresponding box face, and the morphs are applied in order: `xPos`, `xNeg`, `yPos`, `yNeg`. Note that the hinge points themselves are always the box's X extremes for `xPos`/`xNeg` and its Y extremes for `yPos`/`yNeg`; `plane` only chooses which way the handle is pushed.","metadata":{"title":"Bend","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#usage","collection":"scripting","hash":"79104cd1bb42586eb8e9b77bc69b3fd9","indexed_by":"docs-index"}},{"content":"Bend — Usage\n\nAll four at `0` throws `ArgumentException(\"Nothing to bend: all four distances are 0.\")`. An unknown plane name throws `Unknown bend plane 'X'. Use XY, ZX or YZ.` If the bend cannot be computed you get an `InvalidOperationException` reading `Bend computation failed.`, or `Bend computation failed: ` when the kernel rejected the inputs. Lengths are millimetres throughout.","metadata":{"title":"Bend","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#usage","collection":"scripting","hash":"901c7e63cb8b4f567ea05ad984d1ed38","indexed_by":"docs-index"}},{"content":"Bend — What you get back, and what is left in the document\n\nThe return value is an `IReadOnlyList[Guid]`: the bent objects first, in the order you passed them, then the rigid ones. Nothing is deformed in place. Every object is baked as a new object carrying the original's attributes - layer, colour, material, groups - and the originals are then deleted, unless `keepOriginal = True`, in which case both the originals and the bent copies stay. Objects whose ids no longer resolve are skipped silently rather than throwing.\n\n`rigidIds` objects do not bend. Each is copied and repositioned with a plane-to-plane transform: a frame at its bounding-box centre is pushed through the same morph, and the object is moved and rotated onto the result. That frame is built from `Plane.WorldXY` whatever the bend plane is - the panel does this too, and the facade replicates it deliberately. Rigid ids that are not in the document throw `Rigid object not found in the document.`\n\nAn empty or `None` `objectIds` falls back to the objects currently selected in the viewport. If that is empty too you get `ArgumentException(\"Nothing to deform: select (or pass) at least one object.\")`, and any id you do pass that is not in the document throws `Object not found in the document.`","metadata":{"title":"Bend","section":"What you get back, and what is left in the document","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#what-you-get-back-and-what-is-left-in-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#what-you-get-back-and-what-is-left-in-the-document","collection":"scripting","hash":"c3b1e3f57a998a342093e55ae43b6ce3","indexed_by":"docs-index"}},{"content":"Bend — Space morph, so: what survives\n\nThis is a Rhino space morph, not a transform. Control points are moved, so the result is only as faithful as the object's structure allows: a Brep stays a Brep and a curve stays a curve, but analytic faces come back as free-form surfaces, and geometry with few control points bends coarsely - refine the input if the bend looks flat-sided. Extrusions cannot be morphed and are converted to Breps first, so an extrusion you bend comes back as a Brep with a new id. Circles are not rebuilt here (unlike Twist), so a plain four-point rational circle barely deforms; convert it to a denser NURBS curve yourself first. Meshes morph vertex by vertex, at whatever density they already have. Document tolerance settings are not consulted: the morph is applied directly by the tool with its own settings, and nothing about it is exposed to the script.\n\nThe whole operation - bake, rigid placement, delete - runs inside a single Rhino undo record named \"Artisan Bend\" and ends with a viewport redraw, so one Ctrl+Z undoes it. Wrap it in a `Transaction` when you want it grouped with other mutations as one step.","metadata":{"title":"Bend","section":"Space morph, so: what survives","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#space-morph-so-what-survives","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/bend/#space-morph-so-what-survives","collection":"scripting","hash":"9ee4b60beb5a7e13721859e2e3939ec2","indexed_by":"docs-index"}},{"content":"Copy on objects\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nScattering a motif - a bead, a leaf, a small setting - over the curved surface of a ring or a bangle, with each copy sitting flat on the metal instead of floating at the original orientation. This is the ArtisanCopyOnObjects command headless: each point in `points` stands in for one click of the command, which otherwise loops until you press Enter.","metadata":{"title":"Copy on objects","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/","collection":"scripting","hash":"410e51690a47e19c1774a08685dc839f","indexed_by":"docs-index"}},{"content":"Copy on objects — Usage\n\n```python\nids = transform.CopyOnObjects(objectIds, targetIds, points)   # -> ids of the copies created\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | The motif to copy; `None` or empty falls back to the current viewport selection |\n| `targetIds` | - | The objects to place on - surfaces, polysurfaces or meshes. No selection fallback: at least one is required |\n| `points` | - | One placement per point, at least one. Points are pulled onto the target surface first |\n\nNothing is moved and nothing is deleted: the source objects stay exactly where they are, and the method only creates copies. The return value is an `IReadOnlyList ` of the created copies, in point-major order - all the objects for the first point, then all for the second, and so on - so the list length is normally *points × objects*. The copies are plain: no history, no parametric link back to the motif or the targets, matching what the command records.","metadata":{"title":"Copy on objects","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#usage","collection":"scripting","hash":"c1530dfa18a7e2366a78c18185805330","indexed_by":"docs-index"}},{"content":"Copy on objects — How the frame is derived\n\nThe targets are meshed together at render quality into one base mesh, and every point you pass is pulled onto that mesh, reproducing the command's cursor constraint - so approximate points are fine, but a point that cannot be pulled onto the mesh is silently skipped rather than raising.\n\nEach object is then framed individually. Its bounding-box centre is projected onto the base mesh, and the mesh point plus the face normal there define the origin plane. The same offset the object holds relative to the selection centre is applied at the picked point, that result is projected onto the mesh again, and its point and normal define the destination plane. The object is mapped from one plane to the other.\n\nTwo consequences follow. A group of objects keeps its arrangement, because every object is offset from the shared selection centre. And each copy reorients to the local surface normal where it lands, so a motif crossing a curved band follows the curvature. The origin frame is taken from the base mesh too, which means the motif is assumed to be sitting on or near the target surface already; a motif floating far away is framed by whatever part of the mesh happens to be nearest to it.\n\nObjects whose placement transform cannot be built - no geometry, or a projection that fails - are quietly skipped, so a short return list is normal rather than an error.","metadata":{"title":"Copy on objects","section":"How the frame is derived","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#how-the-frame-is-derived","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#how-the-frame-is-derived","collection":"scripting","hash":"ec58e5315ce3f45a4144ba6255d90f84","indexed_by":"docs-index"}},{"content":"Copy on objects — Validation\n\n`points` empty or `None` throws `At least one placement point is required.` Ids in `objectIds` are checked one by one: a missing one throws `Object does not exist.`, an empty resolved list throws `Nothing selected: select (or pass) at least one object.`, and a selection with no usable geometry throws `The objects have no valid geometry to place.`\n\nOn the target side, an empty `targetIds` throws `At least one target object is required.`, a missing id throws `Target object does not exist.`, and targets that mesh to nothing - curves, points, open geometry that yields no faces - throw `The target objects produced no surface to place on: pass surfaces, polysurfaces or meshes.`\n\nThe call mutates the document and ends with a viewport redraw. Wrap it in a `Transaction` so a run of placements undoes in one step.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\nfrom Rhino.Geometry import Point3d\n\npoints = [Point3d(0, 8, 2), Point3d(3, 8, 2), Point3d(-3, 8, 2)]\nwith Transaction.Begin(\"Scatter motif\"):\n    ids = transform.CopyOnObjects(motifIds, [shankId], points)\n```","metadata":{"title":"Copy on objects","section":"Validation","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#validation","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/copy-on-objects/#validation","collection":"scripting","hash":"360454c34793495a099e355f379b9b23","indexed_by":"docs-index"}},{"content":"Mirror opposite\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nPlaces a second copy of a detail across the piece: the stone on the other shoulder of a ring, the matching side of a bypass shank, the opposite claw of a pair. It is not the mirror you would get from Rhino's `Mirror` — the copy comes out the *same* way round as the original, which is what you want for a part that has to be manufacturable on both sides rather than a left-hand and a right-hand version.","metadata":{"title":"Mirror opposite","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/","collection":"scripting","hash":"2aa2dce63be9212552e981ec19e12c8b","indexed_by":"docs-index"}},{"content":"Mirror opposite — Usage\n\n```python\nids = transform.MirrorOpposite(objectIds = None, plane = None)   # -> the new copies\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` | Objects to copy. `None` or an empty list uses the current selection |\n| `plane` | `None` | The frame whose origin and Z axis define the opposite side. `None` uses the active viewport's construction plane, or world XY when the session has no view |\n\nTwo reflections are built from the frame — one across the plane spanned by its Z and X axes, one across the plane spanned by its Y and Z axes — and composed into a single transform. Composing two reflections whose planes meet along the frame's Z axis gives a rotation of 180° about that Z axis, through the plane's origin. That is what \"keeping its handedness\" means concretely: the determinant is positive, so the geometry is rotated, not reflected. Text stays readable, threads keep their direction, and a right-hand part stays a right-hand part. Its X and Y coordinates in the plane's frame are negated while its height above the plane is unchanged.","metadata":{"title":"Mirror opposite","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/#usage","collection":"scripting","hash":"48d76fef76e2ff59aefd4cacfc037ce1","indexed_by":"docs-index"}},{"content":"Mirror opposite — What is created\n\nExactly one copy per object, added to the document with Rhino's `TransformWithHistory`, so the copy is history-linked and follows edits to the original (with Record History and Update Children on). The source objects are not modified, moved or deleted.\n\nReturns an `IReadOnlyList `: the ids of the copies, one per object, in input order. An object whose copy fails contributes no id, so the list can be shorter than the input — check its length rather than assuming a one-to-one match.\n\nIds you pass explicitly must exist — a missing one raises `Object {id} does not exist.` naming it, and duplicates are collapsed. With no ids and nothing selected it raises `Nothing selected: select (or pass) at least one object.`. A `plane` that is not valid geometry raises `The mirror plane is not valid.`.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\n\nwith Transaction.Begin(\"Copy to the other shoulder\"):\n    ids = transform.MirrorOpposite([shoulderId])\n```","metadata":{"title":"Mirror opposite","section":"What is created","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/#what-is-created","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-opposite/#what-is-created","collection":"scripting","hash":"a5f7a46b1936ef93e7b4dd17ed8ce604","indexed_by":"docs-index"}},{"content":"Mirror quad\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nModel one quarter of a symmetric piece and let the other three appear: a claw, a scroll or a pavé field drawn in one quadrant is reflected left–right, front–back and diagonally, so a four-way symmetric head or a cross-shaped motif stays coherent while you keep editing the single original.","metadata":{"title":"Mirror quad","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/","collection":"scripting","hash":"45d7ec758d7b4961b4462ba8254991da","indexed_by":"docs-index"}},{"content":"Mirror quad — Usage\n\n```python\nids = transform.MirrorQuad(objectIds = None, plane = None)   # -> the new copies\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | `None` | Objects to mirror. `None` or an empty list uses the current selection |\n| `plane` | `None` | The symmetry frame. `None` uses the active viewport's construction plane, or world XY when the session has no view |\n\nThe two mirror planes are built from the frame you give: one through its origin spanned by the Z and X axes (normal = Y), one spanned by the Y and Z axes (normal = X). Both are vertical with respect to the plane — they are not the plane itself, which is never used as a mirror. So the original and its copies are laid out around the plane's origin, in the four quadrants of its XY grid, all at the same height.","metadata":{"title":"Mirror quad","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/#usage","collection":"scripting","hash":"c58ce6f0fbfc968da84bf8ff6218bf46","indexed_by":"docs-index"}},{"content":"Mirror quad — What is created\n\nThree copies per object, added to the document; the source objects are not modified, moved or deleted. The first copy is the reflection across the ZX plane, the second across the YZ plane, and the third is the second mirror applied to the *first copy* — the diagonal quadrant. Each is made with Rhino's `TransformWithHistory`, so history is genuinely recorded: with Record History and Update Children on, editing the original updates its copies. Note the chain — the diagonal copy is a child of the first copy, not of the original, so it follows the original one hop removed.\n\nReturns an `IReadOnlyList `: the ids of the copies, three per object, in that order (first mirror, second mirror, diagonal), object by object. The count is nominally `3 × len(objectIds)` but not guaranteed: if a copy fails Rhino returns an empty id and it is left out, and if the *first* copy fails the diagonal is skipped too, so an object can contribute one or two ids. Count the returned list rather than assuming three.\n\nIds you pass explicitly must exist — a missing one raises `Object {id} does not exist.` naming it, and duplicates are collapsed. With no ids and nothing selected it raises `Nothing selected: select (or pass) at least one object.`. A `plane` that is not valid geometry raises `The mirror plane is not valid.`.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\n\nwith Transaction.Begin(\"Mirror the quarter head\"):\n    ids = transform.MirrorQuad([clawId])\n    print(len(ids), \"copies\")\n```","metadata":{"title":"Mirror quad","section":"What is created","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/#what-is-created","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/mirror-quad/#what-is-created","collection":"scripting","hash":"538b51a1729768383c492cfa515e5c0a","indexed_by":"docs-index"}},{"content":"Move by normal\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nLifts or sinks objects off a surface along that surface's own normal: raising a pavé field a tenth of a millimetre above the dome it sits on, dropping cutters into the metal, or backing a set of motifs away from a shank before a boolean. Each object is measured separately, so a row of stones following a curved surface each moves along the normal under its own centre rather than along one shared direction.","metadata":{"title":"Move by normal","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/","collection":"scripting","hash":"13fdd92b6e48317840089b69dd28218e","indexed_by":"docs-index"}},{"content":"Move by normal — Usage\n\n```python\nmoved = transform.MoveByNormal(objectIds, surfaceId, distance = 1.0)   # -> how many objects moved\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Objects to move. `None` or an empty list uses the current selection |\n| `surfaceId` | — | The reference surface: a surface, or a polysurface/extrusion with exactly one face |\n| `distance` | `1.0` | Millimetres along the normal; negative moves against it |\n\nFor each object, the centre of its world-axis bounding box is pulled onto the surface, the surface normal is evaluated there and unitised, and the object is translated by that unit normal times `distance`. Objects are moved in place: the ids you passed keep pointing at the same objects, nothing is copied and nothing is created. The return value is an `int` — the number of objects that were actually transformed, which can be lower than the number of ids if an object has no geometry or if the closest-point evaluation on the surface fails. Those objects are skipped silently rather than raising.\n\n`distance` is a plain length, not a defaulting sentinel: `0` is a legal no-op, and negative values are the normal way to move inwards.\n\nIds you pass explicitly must exist — a missing one raises `Object {id} does not exist.` naming it. Duplicate ids are collapsed. If the list is null or empty the facade falls back to the objects selected in the viewport, and if nothing is selected either it raises `Nothing selected: select (or pass) at least one object.`. An unknown `surfaceId` raises `Surface {id} does not exist.`; a mesh, a curve or a multi-face polysurface raises `Object {id} is not a surface (single-face polysurfaces count as one).`.\n\nLike every mutation in the API, wrap it in a `Transaction` so the move undoes in one step.","metadata":{"title":"Move by normal","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/#usage","collection":"scripting","hash":"4cd9ff6bca777ea4765d25ad5e1f5361","indexed_by":"docs-index"}},{"content":"Move by normal — Usage\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\n\nwith Transaction.Begin(\"Lift the pave\"):\n    transform.MoveByNormal(gemIds, domeId, 0.15)\n```","metadata":{"title":"Move by normal","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-by-normal/#usage","collection":"scripting","hash":"3e25af62831c3c7d40790ca80e692227","indexed_by":"docs-index"}},{"content":"Move on objects\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nThe same gesture as Copy on objects, without leaving anything behind: take a motif that is already modelled and sit it down on the band, reoriented to the metal at that spot. This is the ArtisanMoveOnObjects command headless, and it accepts a single destination point rather than a list.","metadata":{"title":"Move on objects","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/","collection":"scripting","hash":"971b6da6b96c921d90375a0ab782452f","indexed_by":"docs-index"}},{"content":"Move on objects — Usage\n\n```python\nmoved = transform.MoveOnObjects(objectIds, targetIds, point)   # -> how many objects were moved\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Objects to move; `None` or empty falls back to the current viewport selection |\n| `targetIds` | - | The objects to place on - surfaces, polysurfaces or meshes. No selection fallback: at least one is required |\n| `point` | - | The single destination, pulled onto the target surface before use |\n\nThe return value is an `int`: the number of objects that were actually transformed. It is not a list of ids, because there are no new ids - the objects are moved in place, keeping their Guids, layers and attributes. Nothing is copied and nothing is deleted. A count lower than the number of objects you passed means some were skipped, which happens silently when an object has no geometry or its frame cannot be projected onto the target mesh.\n\nThe placement maths is identical to `CopyOnObjects`: the targets are meshed at render quality into one base mesh, `point` is pulled onto it, and each object is framed from the mesh point and face normal nearest its own bounding-box centre, then mapped to the corresponding frame around the picked point. The selection therefore keeps its internal arrangement while each object reorients to the local normal where it lands.","metadata":{"title":"Move on objects","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/#usage","collection":"scripting","hash":"98c2880f08eab1ffbe693569faa271d4","indexed_by":"docs-index"}},{"content":"Move on objects — Usage\n\nIds in `objectIds` are validated individually - `Object does not exist.` for a stale Guid, `Nothing selected: select (or pass) at least one object.` when nothing resolves, and `The objects have no valid geometry to place.` when the selection has no measurable bounding box. Target failures throw `At least one target object is required.`, `Target object does not exist.` or `The target objects produced no surface to place on: pass surfaces, polysurfaces or meshes.`\n\nUnlike `CopyOnObjects`, where an unprojectable point is skipped and the run continues, here a `point` that cannot be pulled onto the base mesh throws `The point cannot be pulled onto the target objects.`\n\nThe call mutates the document and ends with a viewport redraw; use a `Transaction` to keep it in one undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\nfrom Rhino.Geometry import Point3d\n\nwith Transaction.Begin(\"Seat motif on shank\"):\n    moved = transform.MoveOnObjects(motifIds, [shankId], Point3d(0, 8, 2))\n```","metadata":{"title":"Move on objects","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/move-on-objects/#usage","collection":"scripting","hash":"9879d17b583adfb5b78fb7c9314c655c","indexed_by":"docs-index"}},{"content":"Scale by weight\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nEvery quote starts from the cast weight, so the usual request is not \"make it 5% smaller\" but \"make it come out at 4 grams in 18k yellow\". This is the ArtisanScaleByWeight tool running headless: it measures the volume of the objects, works out the uniform factor that makes that volume weigh `targetGrams` at the density of `metal`, and applies it. The scale is uniform on the three axes and the objects are scaled as one set.","metadata":{"title":"Scale by weight","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/","collection":"scripting","hash":"1af73f81549b811a153af2cd03ac1540","indexed_by":"docs-index"}},{"content":"Scale by weight — Usage\n\n```python\nfactor = transform.ScaleByWeight(objectIds, targetGrams,\n                                 metal = None, keepOriginal = False)   # -> the factor applied\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Objects to scale; `None` or empty falls back to the current viewport selection |\n| `targetGrams` | - | Target cast weight in grams, must be > 0 |\n| `metal` | `None` | Metal name; `None`/empty uses the document's primary metal (Metal 01) |\n| `keepOriginal` | `False` | `True` scales a copy and leaves the original untouched |\n\nThe return value is a `double`: the uniform scale factor that was applied, read off the transform's diagonal. `1.0` means the objects already weighed the target; `0.8` means everything came down to 80% of its former size. It is not a weight and not a list of ids - if you scale a copy, the new ids are not returned, so find them through the selection or by diffing the document.\n\nBy default the objects are scaled in place: the same ids survive, with the same layers and attributes. With `keepOriginal = True` the originals stay where they are and the scaled result is a set of fresh copies. The tool's own toggle is *Delete Original*, and `keepOriginal` is simply its inverse.\n\nMetal names are the values of `WeightApi.Metals()` - see Weights for the list. Hyphens and spaces are normalised to underscores and matching is case-insensitive, so `\"18k yellow gold\"` and `\"18K_Yellow_Gold\"` resolve alike. An unrecognised name throws `Unknown metal ' '.` - note that, unlike `WeightApi`, this method does not append the valid names to the message.","metadata":{"title":"Scale by weight","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/#usage","collection":"scripting","hash":"406d5c898c77e90a7dcf3053cdd847b3","indexed_by":"docs-index"}},{"content":"Scale by weight — Usage\n\nVolume is what drives the calculation, so the objects must be closed solids or meshes. Open surfaces contribute nothing and the computation fails with `Scale-by-weight computation failed. The objects must be closed solids or meshes.` A non-positive `targetGrams` throws `Target weight must be > 0 grams.`, and an empty resolved list throws `Nothing to scale: select (or pass) at least one object.` Unlike the other placement methods, ids you pass here are not checked for existence up front: a stale Guid is simply skipped by Rhino rather than named in an error.\n\nThe call mutates the document, so wrap it in a `Transaction` when it belongs to a larger edit and you want one undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\n\nwith Transaction.Begin(\"Scale to 4 g\"):\n    factor = transform.ScaleByWeight(ids, 4.0, \"18K_Yellow_Gold\")\n```","metadata":{"title":"Scale by weight","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-by-weight/#usage","collection":"scripting","hash":"22bf8af814bdcc81a658cff2fcfb31f8","indexed_by":"docs-index"}},{"content":"Scale to dimensions\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nThe everyday sizing request - \"make this motif 20 mm wide\", \"bring the pendant down to 30 mm tall\" - stated as a measurement rather than a factor. This is the ArtisanScaleByDimensions panel headless: the objects are measured as one set, using the common world-axis bounding box, and scaled about that box's centre until it measures the sizes you asked for.","metadata":{"title":"Scale to dimensions","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/","collection":"scripting","hash":"2cd2aa3c8124d58c8472cfefc3072f23","indexed_by":"docs-index"}},{"content":"Scale to dimensions — Usage\n\n```python\nids = transform.ScaleToDimensions(objectIds, sizeX = 0, sizeY = 0, sizeZ = 0,\n                                  keepAspect = True, keepOriginal = False)   # -> resulting ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | - | Objects to scale; `None` or empty falls back to the current viewport selection |\n| `sizeX` | `0` | Target bounding-box width in mm; `0` leaves that axis undriven |\n| `sizeY` | `0` | Target bounding-box depth in mm; `0` leaves that axis undriven |\n| `sizeZ` | `0` | Target bounding-box height in mm; `0` leaves that axis undriven |\n| `keepAspect` | `True` | Uniform scale on all three axes, driven by exactly one target size |\n| `keepOriginal` | `False` | `True` scales a copy and leaves the original untouched |\n\nHere `0` does not mean \"tool default\" - it means leave that axis alone. At least one size must be given, otherwise `Give at least one target size (in mm).` A negative size throws `Target sizes must be positive (0 = keep that axis).`\n\nWith `keepAspect = True` (the panel's own default) exactly one of the three sizes may be given: the factor derived from that axis is applied uniformly to all three, so proportions are preserved. Passing two or three sizes with `keepAspect` on throws `With keepAspect only one axis can be driven: give a single target size, or disable keepAspect.` Turn `keepAspect` off and each given axis scales independently, distorting the geometry - which is exactly what you want for a flattened band or a stretched plate, and rarely what you want otherwise.","metadata":{"title":"Scale to dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/#usage","collection":"scripting","hash":"02eabdc366a0415978be8a499590bfb2","indexed_by":"docs-index"}},{"content":"Scale to dimensions — Usage\n\nThe return value is an `IReadOnlyList `. With `keepOriginal = False` (the default) the objects are scaled in place and the list is the same ids you passed - useful for chaining, but not new geometry. With `keepOriginal = True` the originals are left untouched and the list holds the ids of the newly created, scaled copies. There is no handle and no query method: what you get back is the id list, nothing more.\n\nAn axis with zero extent cannot be driven - dividing by it would be a division by zero, and the panel simply disables that field. Driving a flat axis throws `The selection is flat on (zero extent): that axis cannot be driven.` There is one asymmetry worth knowing: with `keepAspect = True` the uniform factor is derived through the X extent, so a selection that is flat on X throws `The selection is flat on X: keepAspect cannot derive a uniform factor. Disable keepAspect.` even when the size you gave was on Y or Z.\n\nIds you pass are validated one by one before anything happens: a Guid that is not in the document throws `Object does not exist.` An empty resolved list (nothing passed, nothing selected) throws `Nothing selected: select (or pass) at least one object.` If the kernel cannot build the transform you get `Scale-by-dimensions computation failed.`, with the kernel's own key in brackets when it supplies one.\n\nThe call mutates the document and ends with a viewport redraw; wrap it in a `Transaction` to fold it into a single undo step.\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform, Transaction\n\nwith Transaction.Begin(\"Motif to 20 mm wide\"):\n    ids = transform.ScaleToDimensions(motifIds, sizeX = 20)\n```","metadata":{"title":"Scale to dimensions","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/scale-to-dimensions/#usage","collection":"scripting","hash":"a079999efdca936d1bf31ecefc825b31","indexed_by":"docs-index"}},{"content":"Taper\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nTapers objects along an axis through their common bounding box, exactly like the Taper panel: the section is left alone at the near end and widened or narrowed by `deltaMm` at the far end, with everything in between interpolated linearly. This is the tapered-shank move - a band that thins towards the bottom, a motif coned towards its tip - and, with a break position, the taper can be made to start partway along instead of at the very end.","metadata":{"title":"Taper","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/","collection":"scripting","hash":"28cde9b9daa1d23a2df2b31263803503","indexed_by":"docs-index"}},{"content":"Taper — Usage\n\n```python\nids = transform.Taper(objectIds, deltaMm, direction = None, mode = None,\n                      breakOne = 0, breakTwo = 0, flat = False, infinite = False,\n                      rigidIds = None, keepOriginal = False)    # -> new object ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Objects to taper; `None`/empty = the current selection |\n| `deltaMm` | — (required) | Change of the half-width at the far end, in mm: positive widens, negative narrows. Must be non-zero |\n| `direction` | `None` = `\"ZTop\"` | Axis through the bounding box: `ZTop`, `ZBottom`, `YTop`, `YBottom`, `XTop`, `XBottom`. Case-insensitive; the named end is the one that changes size |\n| `mode` | `None` = `\"Uniform\"` | `Uniform` (whole axis), `OneBreak` (only from `breakOne` to the far end), `TwoBreaks` (only between the two breaks) |\n| `breakOne` | `0` | Normalised 0-1 position along the axis; `0` = the tool default, 0.5 |\n| `breakTwo` | `0` | Normalised 0-1 position along the axis; `0` = the tool default, 0.75 |\n| `flat` | `False` | `True` tapers only in the gumball plane's X - a one-directional squeeze instead of a cone |\n| `infinite` | `False` | `True` carries the taper on beyond the ends of the axis instead of clamping there |\n| `rigidIds` | `None` | Objects that must not distort - gems, heads - carried along rigidly |\n| `keepOriginal` | `False` | `True` leaves the originals in the document |","metadata":{"title":"Taper","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#usage","collection":"scripting","hash":"f95f45e53e154eac582e0bf9bae4bad9","indexed_by":"docs-index"}},{"content":"Taper — Usage\n\nEverything is millimetres; there are no ratios and no `-1` sentinel anywhere in this signature. `deltaMm` is an absolute half-width change, added to a reference half-width taken as half the bounding box's X extent, so `deltaMm = -0.5` on a 3 mm-wide band brings the far end to roughly 2 mm. Zero is rejected outright: `ArgumentException(\"Nothing to taper: the delta is 0 mm.\")`. The breaks, by contrast, do follow the house `0` rule - `0` means \"keep the tool default\" (0.5 and 0.75) - and are only read in `OneBreak` and `TwoBreaks` mode; in `TwoBreaks` they are sorted, so their order does not matter. A break outside 0-1 throws `ArgumentOutOfRangeException` with `Break positions are normalized: 0 = tool default, otherwise between 0 and 1 along the axis.` An unknown `direction` or `mode` throws naming the valid values, e.g. `Unknown mode 'half'. Use one of: Uniform, OneBreak, TwoBreaks.` A failed computation raises `InvalidOperationException(\"Taper computation failed.\")`, or `Taper computation failed: `.","metadata":{"title":"Taper","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#usage","collection":"scripting","hash":"f6ec8fd5aa160b77d2c17d60c4f4a425","indexed_by":"docs-index"}},{"content":"Taper — What you get back, and what is left in the document\n\nThe return value is an `IReadOnlyList[Guid]`: the tapered objects first, in the order you passed them, then the rigid ones. Nothing is deformed in place. Each object is baked as a new object with the original's attributes - layer, colour, material, groups - and the originals are then deleted, unless `keepOriginal = True`, in which case originals and tapered copies both remain. Ids that no longer resolve are skipped silently.\n\n`rigidIds` objects do not taper. Each is copied and repositioned with a plane-to-plane transform: a frame at its bounding-box centre is pushed through the same morph, and the object is moved and rotated onto the result - so gems and heads ride the tapered metal at full size. The frame follows the taper axis (`WorldXY` for the Z directions, `WorldZX` for Y, `WorldYZ` for X, flipped for the `Bottom` variants). One quirk, replicated from the panel on purpose: a rigid object that is an extrusion is fully morphed instead of moved rigidly. Convert such objects to Breps beforehand if they must stay rigid. Rigid ids not in the document throw `Rigid object not found in the document.`\n\nAn empty or `None` `objectIds` falls back to the objects currently selected in the viewport. If that is empty too you get `ArgumentException(\"Nothing to deform: select (or pass) at least one object.\")`, and any id you pass that is not in the document throws `Object not found in the document.`","metadata":{"title":"Taper","section":"What you get back, and what is left in the document","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#what-you-get-back-and-what-is-left-in-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#what-you-get-back-and-what-is-left-in-the-document","collection":"scripting","hash":"f178e0495ea9437352eee35b2ae56a71","indexed_by":"docs-index"}},{"content":"Taper — Space morph, so: what survives\n\nThis is a Rhino space morph, not a transform. Control points are moved, so a Brep stays a Brep and a curve stays a curve, but analytic faces come back as free-form surfaces, and a shape with few control points tapers coarsely. Extrusions are converted to Breps before morphing, so an extrusion you taper comes back as a Brep with a new id. Circles are not rebuilt here (unlike Twist), so a four-point rational circle will barely change section - convert it to a denser NURBS curve first if you are tapering curves. Meshes morph vertex by vertex at their existing density. Document tolerance settings are not consulted; the morph is applied by the tool with its own settings and none of them are exposed to the script.\n\nThe whole operation runs inside a single Rhino undo record named \"Artisan Taper\" and ends with a viewport redraw, so one Ctrl+Z undoes it. Wrap it in a `Transaction` when you want it grouped with other mutations as one step.","metadata":{"title":"Taper","section":"Space morph, so: what survives","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#space-morph-so-what-survives","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/taper/#space-morph-so-what-survives","collection":"scripting","hash":"bb9193d608bfbdc0871ea61e0351547d","indexed_by":"docs-index"}},{"content":"Twist\n\n```python\nfrom ArtisanPlugin.Scripting import TransformApi as transform\n```\n\nTwists objects around an axis through their common bounding box, exactly like the Twist panel: one end stays put, the other rotates by `angleDegrees`, and everything in between turns proportionally. This is the rope-shank tool - twisted wires, corded bands, spiral motifs - and it is also how you put a slow quarter-turn into a flat motif before flowing it onto a shank. The rotation can be limited to part of the axis with the break positions, so the twist starts partway up instead of at the very bottom.","metadata":{"title":"Twist","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/","collection":"scripting","hash":"c18b29ff51ed49ec1d7f8624f8b915b5","indexed_by":"docs-index"}},{"content":"Twist — Usage\n\n```python\nids = transform.Twist(objectIds, angleDegrees, direction = None, mode = None,\n                      breakOne = 0, breakTwo = 0,\n                      rigidIds = None, keepOriginal = False)    # -> new object ids\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `objectIds` | — | Objects to twist; `None`/empty = the current selection |\n| `angleDegrees` | — (required) | Total twist in degrees; must be non-zero, sign gives the direction |\n| `direction` | `None` = `\"ZTop\"` | Axis through the bounding box: `ZTop`, `ZBottom`, `YTop`, `YBottom`, `XTop`, `XBottom`. Case-insensitive; the named end is the one that rotates |\n| `mode` | `None` = `\"Uniform\"` | `Uniform` (whole axis), `OneBreak` (only from `breakOne` to the far end), `TwoBreaks` (only between the two breaks) |\n| `breakOne` | `0` | Normalised 0-1 position along the axis; `0` = the tool default, 0.5 |\n| `breakTwo` | `0` | Normalised 0-1 position along the axis; `0` = the tool default, 0.75 |\n| `rigidIds` | `None` | Objects that must not distort - gems, heads - carried along rigidly |\n| `keepOriginal` | `False` | `True` leaves the originals in the document |","metadata":{"title":"Twist","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#usage","collection":"scripting","hash":"301787bd0a20feb3f626bdf8d83e5eef","indexed_by":"docs-index"}},{"content":"Twist — Usage\n\nAngles are degrees, lengths millimetres. Note the two different meanings of `0` here, and that neither uses a `-1` sentinel: `angleDegrees = 0` is rejected outright with `ArgumentException(\"Nothing to twist: the angle is 0 degrees.\")`, while `breakOne`/`breakTwo` follow the house rule where `0` means \"keep the tool default\" (0.5 and 0.75 respectively). A break outside 0-1 throws `ArgumentOutOfRangeException` with `Break positions are normalized: 0 = tool default, otherwise between 0 and 1 along the axis.` Breaks are only read in `OneBreak` and `TwoBreaks` mode, and in `TwoBreaks` they are sorted, so their order does not matter. An unknown `direction` or `mode` throws naming the valid values, e.g. `Unknown direction 'up'. Use one of: ZTop, ZBottom, YTop, YBottom, XTop, XBottom.` A failed computation raises `InvalidOperationException(\"Twist computation failed.\")`, or `Twist computation failed: `.","metadata":{"title":"Twist","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#usage","collection":"scripting","hash":"23138dec9e8a2d3f0e29561b2752fb38","indexed_by":"docs-index"}},{"content":"Twist — What you get back, and what is left in the document\n\nThe return value is an `IReadOnlyList[Guid]`: the twisted objects first, in the order you passed them, then the rigid ones. Nothing is deformed in place. Each object is baked as a new object with the original's attributes - layer, colour, material, groups - and the originals are then deleted, unless `keepOriginal = True`, in which case originals and twisted copies both remain. Ids that no longer resolve are skipped silently.\n\n`rigidIds` objects do not twist. Each is copied and repositioned with a plane-to-plane transform: a frame at its bounding-box centre is pushed through the same morph, and the object is moved and rotated onto the result - so a gem ends up sitting correctly on the twisted metal without its facets shearing. The frame follows the twist axis (`WorldXY` for the Z directions, `WorldZX` for Y, `WorldYZ` for X). One quirk, replicated from the panel on purpose: a rigid object that is an extrusion is fully morphed instead of moved rigidly. Convert such objects to Breps beforehand if you need them to stay rigid. Rigid ids not in the document throw `Rigid object not found in the document.`\n\nAn empty or `None` `objectIds` falls back to the objects currently selected in the viewport. If that is empty too you get `ArgumentException(\"Nothing to deform: select (or pass) at least one object.\")`, and any id you pass that is not in the document throws `Object not found in the document.`","metadata":{"title":"Twist","section":"What you get back, and what is left in the document","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#what-you-get-back-and-what-is-left-in-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#what-you-get-back-and-what-is-left-in-the-document","collection":"scripting","hash":"9aea11b0c4ec974355950663d6fc461e","indexed_by":"docs-index"}},{"content":"Twist — Space morph, so: what survives\n\nThis is a Rhino space morph, not a transform. Control points are moved, so a Brep stays a Brep and a curve stays a curve, but analytic faces come back as free-form surfaces, and a shape with few control points twists coarsely - a straight-sided box will shear rather than curve. Refine the input where the twist has to look smooth. Extrusions are converted to Breps before morphing, so an extrusion you twist comes back as a Brep with a new id. Circles get special treatment: a four-point rational circle cannot twist at all, so any curve that reads as a circle is rebuilt to a 10-point degree-3 NURBS curve first, exactly as the command does - the returned curve is that rebuilt one, not a circle. Meshes morph vertex by vertex at their existing density. Document tolerance settings are not consulted; the morph is applied by the tool with its own settings and none of them are exposed to the script.\n\nThe whole operation runs inside a single Rhino undo record named \"Artisan Twist\" and ends with a viewport redraw, so one Ctrl+Z undoes it. Wrap it in a `Transaction` when you want it grouped with other mutations as one step.","metadata":{"title":"Twist","section":"Space morph, so: what survives","url":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#space-morph-so-what-survives","source":"https://www.rhinoartisan.com/docs/scripting/reference/transform/twist/#space-morph-so-what-survives","collection":"scripting","hash":"4c0acd284fa8320d18c0bc6fcacf7fe6","indexed_by":"docs-index"}},{"content":"Views\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\nThe viewport side of the API: aim the camera, restore a saved angle, switch the display mode and capture a frame. Mostly this is what you drive before a screenshot. Each has its own page.\n\nDescribe The viewports, named views and display modes available.\n\nSet camera Place the camera: location, target and lens.\n\nNamed views Restore, save, and import the standard angles.\n\nDisplay mode Wireframe, Shaded, Rendered, Raytraced, Arctic…\n\nZoom extents Frame the visible geometry.\n\nCapture The viewport frame to PNG, at any resolution.","metadata":{"title":"Views","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/","collection":"scripting","hash":"4f139629650cc3d97073a95d8bf1cbb2","indexed_by":"docs-index"}},{"content":"Views — The viewport argument\n\nEvery method here takes a `viewport` argument defaulting to `None`, meaning Rhino's active view. Pass a name to target a specific one — Describe tells you which names exist. Matching is case-insensitive and trimmed, and covers standard model viewports only: layout and page viewports are excluded and cannot be addressed. An unknown name throws, listing the real ones.","metadata":{"title":"Views","section":"The viewport argument","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/#the-viewport-argument","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/#the-viewport-argument","collection":"scripting","hash":"5db8d3dad511416fb380d4ac6983fbd8","indexed_by":"docs-index"}},{"content":"Views — Views are mostly not the document\n\nWith two exceptions these change what you *see*, not what the document *contains*, so they need no `Transaction`:\n\n| Page | Changes | Licensed |\n|---|---|---|\n| Describe | Nothing — read-only | no |\n| Set camera · Display mode · Zoom extents | The viewport only | no |\n| Named views | Restoring is view-only, but saving and importing write the document's named-view table | saving and importing |\n| Capture | Writes an image file to disk | yes |\n\nTwo traps worth knowing before you script a screenshot run. Set camera always forces perspective projection, so aiming `Top` or `Front` converts them. And Capture is always PNG with `.png` *appended*, so `front.jpg` becomes `front.jpg.png` — and a custom size needs both `width` and `height` above zero, otherwise it silently falls back to the on-screen size.\n\nFor photoreal output this is the wrong facade — Render drives the Realtime Render viewer and Render Studio. `Capture` is the raw viewport frame, display mode and all.","metadata":{"title":"Views","section":"Views are mostly not the document","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/#views-are-mostly-not-the-document","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/#views-are-mostly-not-the-document","collection":"scripting","hash":"c5bc7b519058c1b6c24684ab580b559b","indexed_by":"docs-index"}},{"content":"Capture\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\n`Capture` writes what a viewport is drawing to an image file, at whatever resolution you ask for rather than the on-screen size. It is the last step of a batch render: open a design, set the display mode, restore an angle, capture; repeat for every angle and every file.","metadata":{"title":"Capture","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/","collection":"scripting","hash":"918fd965948329f3db762bc2598b1f3e","indexed_by":"docs-index"}},{"content":"Capture — Usage\n\n```python\npath = view.Capture(path, width = 0, height = 0, viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | - | Destination file. Relative paths are resolved against the process working directory |\n| `width` | `0` -> the viewport's on-screen width | Output width in pixels |\n| `height` | `0` -> the viewport's on-screen height | Output height in pixels |\n| `viewport` | `None` | Viewport to capture; `None` means the active one |\n\nReturns the full path written, as a `string` - always absolute, and always with the extension the file actually got, so log or collect that value rather than the string you passed in.","metadata":{"title":"Capture","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#usage","collection":"scripting","hash":"f7a3bf3db0dcf72d4afcfc434630c45d","indexed_by":"docs-index"}},{"content":"Capture — Size\n\nThe custom size applies only when both `width` and `height` are greater than zero. If either is `0` - or negative - the pair is discarded and the capture falls back to the viewport's current client rectangle, that is, its on-screen pixel size. There is no \"set the width and let the height follow\": passing `width = 1920, height = 0` silently gives you the on-screen size, not a 1920-wide image. Work out both numbers yourself, and note that a size with a different aspect ratio from the viewport changes what fits in frame, not just the pixel count.","metadata":{"title":"Capture","section":"Size","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#size","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#size","collection":"scripting","hash":"ddf1e1fc2b37402d651427611f982edc","indexed_by":"docs-index"}},{"content":"Capture — Path and format\n\nThe format is always PNG - it is not inferred from the extension. What the extension controls is only the file name: the path is made absolute, and if it does not already end in `.png` (case-insensitively) then `.png` is appended, not substituted. So `\"front\"` becomes `front.png`, but `\"front.jpg\"` becomes `front.jpg.png` and still contains PNG data. Give it a `.png` path, or none at all.\n\nMissing folders in the destination are created for you, so a batch loop can write straight into `out/2026-08/rings/` without preparing the tree. An existing file at the path is overwritten without warning.","metadata":{"title":"Capture","section":"Path and format","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#path-and-format","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#path-and-format","collection":"scripting","hash":"32d17b6b1a1211d544aea551f3f7384f","indexed_by":"docs-index"}},{"content":"Capture — What it changes, and what it needs\n\nReturns a `string`; it changes nothing in the document - no geometry, no settings, and the file is not marked modified - so it needs no `Transaction`. It does not move the camera or change the display mode either: it records the viewport exactly as it stands, which is why the calls that set up the shot must come first.\n\nIt does require a valid licence: unlike the camera moves, writing a file out of RhinoArtisan is gated like the other exports, and the gate is checked before the path is even examined.\n\nErrors: `ArgumentException` with `\"A destination file path is required.\"` for an empty or whitespace path; the usual viewport resolution failures - `InvalidOperationException` `\"No active document.\"`, `InvalidOperationException` `\"No active view.\"`, or `ArgumentException` `\"Unknown viewport 'Persp'. Viewports: Perspective, Top, Front, Right.\"`; and `InvalidOperationException` with `\"Rhino could not capture the viewport.\"` when Rhino returns no bitmap. Filesystem problems - an unwritable folder, a locked file - surface as the ordinary .NET IO exceptions.\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n\nview.SetDisplayMode(\"Rendered\", viewport = \"Perspective\")\nfor angle in (\"Hero\", \"Side\", \"Detail\"):\n    view.RestoreNamedView(angle, viewport = \"Perspective\")\n    written = view.Capture(r\"C:\\out\\ring-%s\" % angle, 1920, 1080, viewport = \"Perspective\")\n    print(\"wrote\", written)   # C:\\out\\ring-Hero.png\n```","metadata":{"title":"Capture","section":"What it changes, and what it needs","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#what-it-changes-and-what-it-needs","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/capture/#what-it-changes-and-what-it-needs","collection":"scripting","hash":"90c4126c3030b49f16fd1b0b4a1e50fc","indexed_by":"docs-index"}},{"content":"Describe\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\n`Describe` prints the three vocabularies every other method on this facade takes as strings: the open viewports, the named views saved in the document, and the display modes Rhino has installed. In a headless or batch run you cannot see the Rhino window, so this is how you find out what `viewport = \"Top\"`, `RestoreNamedView(\"Hero\")` or `SetDisplayMode(\"Arctic\")` are allowed to say on this machine and this document.","metadata":{"title":"Describe","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/describe/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/describe/","collection":"scripting","hash":"fb1fa68ead6a8c2688cf113922744fcc","indexed_by":"docs-index"}},{"content":"Describe — Usage\n\n```python\nprint(view.Describe())\n```\n\nIt takes no parameters.\n\nIt returns a `string` - three lines, in this order, joined by newlines:\n\n```\nViewports: Perspective (active), Top, Front, Right\nNamed views: Hero, Side, Detail\nDisplay modes: Wireframe, Shaded, Rendered, Ghosted, X-Ray, Technical, Artistic, Pen, Arctic, Raytraced\n```\n\nEach list is comma-separated. The viewport that is currently active carries the suffix `\" (active)\"` - that is the one every other method drives when you leave `viewport` at `null`. When the document has no named views the second line reads `Named views: (none)`; the other two lines are never empty in a running Rhino. Parse it by splitting on newlines and then on `\", \"`, but treat it as a human-readable report first: it exists so a batch log shows what the script was working with.\n\nTwo things are deliberately absent. Layout (page) viewports are excluded - the list comes from Rhino's standard model views only - so a layout detail cannot be named as a `viewport` anywhere in this facade. And display-mode names are the English names, regardless of the language the Rhino UI is running in; that is what `SetDisplayMode` matches against.\n\n`Describe` is read-only. It changes nothing in the document and nothing in the view, so it needs no `Transaction` and no licence: it is the one method here you can call freely to probe the environment. It is also the only method that does not throw when there is no document open - it returns an empty string instead, which is a useful check before a batch loop starts.","metadata":{"title":"Describe","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/describe/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/describe/#usage","collection":"scripting","hash":"faa5f04458a86275ea8d4b877f34ca20","indexed_by":"docs-index"}},{"content":"Display mode\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\n`SetDisplayMode` switches what a viewport draws: wireframe for a quick geometry check, `Rendered` for a presentable capture, `Raytraced` when you want Cycles to do the work. In a batch run it is the step between pointing the camera and capturing the frame - the same document captured in `Shaded` and in `Rendered` gives you a technical image and a sales image from one pass.","metadata":{"title":"Display mode","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/","collection":"scripting","hash":"e8e37267d9021dd32f0da99569a32289","indexed_by":"docs-index"}},{"content":"Display mode — Usage\n\n```python\nview.SetDisplayMode(mode, viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `mode` | - | Display mode name, in English (see below) |\n| `viewport` | `None` | Viewport to switch; `None` means the active one |\n\nThe accepted vocabulary\nThe accepted names are exactly the English names of the display modes installed in this Rhino, which is what the third line of `Describe()` prints. On a stock Rhino that includes `Wireframe`, `Shaded`, `Rendered`, `Ghosted`, `X-Ray`, `Technical`, `Artistic`, `Pen`, `Arctic` and `Raytraced`, but the list is not fixed: custom modes the user or a plugin has added are equally valid, and a mode someone deleted is not. Read `Describe()` rather than hard-coding the list if your script has to run on machines you do not control.\n\nMatching is case-insensitive and the name is trimmed, so `\"rendered\"`, `\"Rendered\"` and `\" Rendered \"` all work. It is not fuzzy beyond that: the English name must match in full, so the localised name shown in a Spanish or German Rhino UI will not be found.\n\nAn empty or whitespace `mode` throws `ArgumentException` with `\"A display mode name is required.\"`. Anything else that does not match throws `ArgumentException`, and the message enumerates the real modes so a failing batch log tells you what to use instead:\n\n```\nUnknown display mode 'Render'. Modes: Wireframe, Shaded, Rendered, Ghosted, X-Ray, Technical, Artistic, Pen, Arctic, Raytraced.\n```","metadata":{"title":"Display mode","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/#usage","collection":"scripting","hash":"0d34d8b2cab152d00476a28b2048fabf","indexed_by":"docs-index"}},{"content":"Display mode — What it changes\n\nReturns `void`. It sets the viewport's display mode and redraws. This is a view change only - no object, layer or setting in the document is touched, the document is not marked modified, so no `Transaction` is required and no licence is checked.\n\nOne practical caution: `Raytraced` starts an asynchronous Cycles render that refines over time. The call returns as soon as the mode is set, not when the image has converged, so a `Capture` fired immediately afterwards will record a noisy early pass. For clean raytraced output, give it time to settle before capturing, or use the Realtime Render facade instead - see Render.","metadata":{"title":"Display mode","section":"What it changes","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/#what-it-changes","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/display-mode/#what-it-changes","collection":"scripting","hash":"13e0e93a0eaaaf84741e947bf46b5b1b","indexed_by":"docs-index"}},{"content":"Named views\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\nA named view is a camera angle stored inside the 3dm. These three methods are how a batch run reuses angles instead of recomputing them: save the angle once, restore it by name on every document, and - for documents that were never authored with your angles - import them from a template file first.\n\nUnlike the rest of this facade, two of the three write into the document. `RestoreNamedView` only moves a camera; `SaveNamedView` and `ImportNamedViews` add entries to the document's named-view table, which marks the file modified and means the change is only kept if the document is saved afterwards.\n\nAll three resolve the target viewport the same way as everything else here: `viewport = None` (or an empty/whitespace string) means the active view; a name is matched against the standard model viewports case-insensitively and trimmed; layout (page) viewports are not addressable. An unknown name throws `ArgumentException` - `\"Unknown viewport 'Persp'. Viewports: Perspective, Top, Front, Right.\"` - and with no document open you get `InvalidOperationException` `\"No active document.\"`, or `\"No active view.\"` when nothing is active. `ImportNamedViews` has no `viewport` parameter at all: it works on the document's table, not on a camera.","metadata":{"title":"Named views","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/","collection":"scripting","hash":"3e05273d98c56b5b215945daf2f58d59","indexed_by":"docs-index"}},{"content":"Named views — RestoreNamedView\n\n```python\nview.RestoreNamedView(name, viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `name` | - | Name of a named view saved in the document, as listed by `Describe()` |\n| `viewport` | `None` | Viewport to restore it onto; `None` means the active one |\n\nReturns `void`. It moves the given viewport's camera to the saved angle and redraws. No document mutation - the named view is read, not changed, so no `Transaction` is needed and no licence is checked.\n\nAn empty or whitespace `name` throws `ArgumentException` with `\"A named view name is required.\"`. A name that is not in the document throws `ArgumentException` listing the real ones:\n\n```\nUnknown named view 'hero shot'. Named views: Hero, Side, Detail.\n```\n\nIf the document has none at all the message ends `Named views: (none).` Note that, unlike viewport names, this lookup is Rhino's own name search - take the spelling straight from `Describe()`.","metadata":{"title":"Named views","section":"RestoreNamedView","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#restorenamedview","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#restorenamedview","collection":"scripting","hash":"748ff73a88f01b83dd82b46631051c0f","indexed_by":"docs-index"}},{"content":"Named views — SaveNamedView\n\n```python\nview.SaveNamedView(name, viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `name` | - | Name to store the angle under; an existing view of the same name is overwritten |\n| `viewport` | `None` | Viewport whose current camera is saved; `None` means the active one |\n\nReturns `void`. This one does change the document: it adds (or replaces) an entry in the named-view table. Wrap it in a `Transaction` when you want it to land as a single, clearly labelled undo step alongside the rest of your edits, and remember the angle is only persisted once the 3dm is saved. It requires a valid licence - the gate is checked before anything else happens.\n\nAn empty or whitespace `name` throws `ArgumentException` with `\"A name is required.\"`. If Rhino refuses the entry you get `InvalidOperationException` - `\"Rhino could not save the named view 'Hero'.\"`\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view, Transaction\n\nview.SetCamera(location, target, lensMm = 50, viewport = \"Perspective\")\nwith Transaction.Begin(\"Save hero angle\"):\n    view.SaveNamedView(\"Hero\", viewport = \"Perspective\")\n```","metadata":{"title":"Named views","section":"SaveNamedView","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#savenamedview","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#savenamedview","collection":"scripting","hash":"f18e09ed0a3d2a335661acd25f69258c","indexed_by":"docs-index"}},{"content":"Named views — ImportNamedViews\n\n```python\nview.ImportNamedViews(path)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `path` | - | Path to a 3dm file whose named views you want copied in. Relative paths are resolved against the process working directory |\n\nReturns `IReadOnlyList ` - the names actually imported, in file order. A view whose name already exists in the active document is skipped, so the returned list is what changed, not what the template contained; an empty list means every angle was already there. The document's own view always wins - importing never overwrites.\n\nThis changes the document (new entries in the named-view table), so it belongs inside a `Transaction` if you are grouping undo steps, and it needs a valid licence. It touches no camera and redraws nothing: after importing you still have to call `RestoreNamedView` to actually look through one of them.\n\nIt throws `ArgumentException` with `\"A 3dm file path is required.\"` for an empty path, `ArgumentException` with `\"File not found: C:\\templates\\angles.3dm\"` (the resolved absolute path) when the file is missing, and `InvalidOperationException` with `\"Rhino could not read C:\\templates\\angles.3dm.\"` when the file exists but is not a readable 3dm.\n\nThe batch recipe this exists for:\n\n```python\nnames = view.ImportNamedViews(r\"C:\\templates\\render-angles.3dm\")\nprint(\"imported:\", \", \".join(names))\n\nfor angle in (\"Hero\", \"Side\", \"Detail\"):\n    view.RestoreNamedView(angle)\n    view.Capture(r\"C:\\out\\%s.png\" % angle, 1920, 1080)\n```","metadata":{"title":"Named views","section":"ImportNamedViews","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#importnamedviews","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/named-views/#importnamedviews","collection":"scripting","hash":"145ad20239260888f0a95330fb6cdf74","indexed_by":"docs-index"}},{"content":"Set camera\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\n`SetCamera` points a Rhino viewport where you want it: camera at `location`, looking at `target`, in perspective projection. It is the primitive behind every scripted product shot - when you need a repeatable three-quarter angle on a ring rather than whatever the user last left on screen, you set the two points yourself and capture.","metadata":{"title":"Set camera","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/","collection":"scripting","hash":"b7286cc28bd95b4314d603503dd751a7","indexed_by":"docs-index"}},{"content":"Set camera — Usage\n\n```python\nview.SetCamera(location, target, lensMm = 0, viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `location` | - | Camera position, a `Point3d` in document units (mm) |\n| `target` | - | The point the camera looks at, a `Point3d` in mm |\n| `lensMm` | `0` -> keep the viewport's current lens | 35mm-equivalent focal length. `50` is a natural product shot; `85`-`100` flattens the piece like a macro lens |\n| `viewport` | `None` | Name of the viewport to drive; `None` means the active one |\n\nPer the house convention, `0` for `lensMm` means \"leave the lens alone\", not \"zero millimetres\" - the call reuses the viewport's existing `Camera35mmLensLength`.\n\nThe call always switches the viewport to perspective projection, whether or not you pass a lens. Aiming a parallel view such as `Top` or `Front` with `SetCamera` therefore converts it to a perspective view, and it stays that way until something restores it - a named view, or the user. If you want the standard parallel views left intact, drive a dedicated viewport instead, or restore a named view rather than setting the camera by hand.\n\nReturns `void`. It changes the view only: the camera, its target and its projection. No object is created, moved or deleted, the document is not marked modified, and it needs no `Transaction` - camera moves are not undoable document edits. No licence check either; this is one of the free methods on the facade. The views are redrawn once at the end.","metadata":{"title":"Set camera","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/#usage","collection":"scripting","hash":"153459c8e413f992a7f7776f998cd52f","indexed_by":"docs-index"}},{"content":"Set camera — Which viewport does None hit?\n\nLeave `viewport` at `None` - or pass an empty or whitespace-only string, which is treated the same - and the call resolves to Rhino's active view, the one `Describe()` marks with `\" (active)\"`. If there is no document open it throws `InvalidOperationException` with `\"No active document.\"`, and if a document is open but no view is active, `InvalidOperationException` with `\"No active view.\"`.\n\nPass a name and it is matched against the standard model viewports, case-insensitively and with surrounding whitespace trimmed, so `\"top\"`, `\"Top\"` and `\" Top \"` all find `Top`. Layout (page) viewports are not in the list and cannot be addressed. A name that matches nothing throws `ArgumentException`, and the message lists what was available:\n\n```\nUnknown viewport 'Persp'. Viewports: Perspective, Top, Front, Right.\n```\n\nThat resolution rule is identical for every method on this facade.","metadata":{"title":"Set camera","section":"Which viewport does None hit?","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/#which-viewport-does-none-hit","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/set-camera/#which-viewport-does-none-hit","collection":"scripting","hash":"78e2cdff5653d1dfe66bf5fbd14a03da","indexed_by":"docs-index"}},{"content":"Zoom extents\n\n```python\nfrom ArtisanPlugin.Scripting import ViewApi as view\n```\n\n`ZoomExtents` pulls the camera back until everything visible fits in the viewport - the scripted equivalent of Rhino's Zoom Extents. In a batch run it is the honest way to frame a document whose contents you do not know in advance: you cannot pick sensible camera distances for an unseen ring, but you can restore an angle, zoom to extents and capture.","metadata":{"title":"Zoom extents","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/","collection":"scripting","hash":"11ee6fe348fc1f6e198ec05a97815aa3","indexed_by":"docs-index"}},{"content":"Zoom extents — Usage\n\n```python\nview.ZoomExtents(viewport = None)\n```\n\n| Parameter | Default | Meaning |\n|---|---|---|\n| `viewport` | `None` | Viewport to zoom; `None` means the active one |\n\nIt frames the visible geometry only: objects on hidden layers, hidden objects and anything the current display mode does not draw are excluded, so turning layers off before zooming is a legitimate way to frame a subset. The camera direction and the lens are untouched - only the distance and the frustum change - so calling it after `SetCamera` or `RestoreNamedView` keeps your angle and just fixes the framing.\n\nReturns `void`. It changes the view only: nothing is added to or altered in the document, the file is not marked modified, no `Transaction` is needed and no licence is checked. The views are redrawn once at the end.","metadata":{"title":"Zoom extents","section":"Usage","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/#usage","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/#usage","collection":"scripting","hash":"95155a9847a8f4c6772d59580d891eac","indexed_by":"docs-index"}},{"content":"Zoom extents — Which viewport does None hit?\n\nThe same rule as everywhere on this facade. `None`, or an empty or whitespace-only string, resolves to Rhino's active view - the one `Describe()` tags with `\" (active)\"`. A name is matched against the standard model viewports, case-insensitively and trimmed; layout (page) viewports are not in the list and cannot be addressed. An unknown name throws `ArgumentException` listing the real ones:\n\n```\nUnknown viewport 'Perspective 2'. Viewports: Perspective, Top, Front, Right.\n```\n\nWith no document open it throws `InvalidOperationException` with `\"No active document.\"`, and with a document but nothing active, `InvalidOperationException` with `\"No active view.\"`","metadata":{"title":"Zoom extents","section":"Which viewport does None hit?","url":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/#which-viewport-does-none-hit","source":"https://www.rhinoartisan.com/docs/scripting/reference/views/zoom-extents/#which-viewport-does-none-hit","collection":"scripting","hash":"25acbabf2bd2b9a6cdc5a832d9dc7327","indexed_by":"docs-index"}},{"content":"Component reference\n\nArtisan for Grasshopper installs 244 components across 6 ribbon tabs. Each one is documented with the exact ports it exposes, read straight from the plugin.\n\n- Artisan — Assets, exporters, manufacturing and the utilities that hold a definition together. _(49 components)_\n- Gems — Create individual stones by carat, size or shape, and read their properties. _(24 components)_\n- Gemset — Settings that place and hold stones — bezels, baskets, halos, prongs and rails. _(46 components)_\n- Shanks — Ring bodies: classic, cathedral, eternity, signet, bypass and the rest. _(71 components)_\n- Accessories — Bails, beads, charms, milgrain and rope details. _(10 components)_\n- Readers — Unpack a parameter dictionary back into its individual values. _(44 components)_","metadata":{"title":"Component reference","url":"https://www.rhinoartisan.com/docs/grasshopper/components/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/","collection":"grasshopper","hash":"feddd287b354f5e993cb04024dddd038","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| OpenRouter | `OpenRouter` | Artisan › AI | Send a prompt to OpenRouter API and get a response |\n| Bezel Airgap Profile by Name | `BezelAirgapProfile` | Artisan › Assets | Gets a bezel airgap profile Asset by name (HEART, SQUARE, ROUNDED_SQUARE) |\n| Bezel Cutter Profile by Name | `BezelCutProfile` | Artisan › Assets | Gets a bezel cutter profile Asset by name (ROUNDED, SQUARE, SHARP) |\n| Bezel Profile by Name | `BezelProfile` | Artisan › Assets | Gets a bezel profile Asset by name (CONCAVE, STRAIGHT, CONVEX) |\n| Halo Profile by Name | `HaloProfileName` | Artisan › Assets | Gets a halo profile Asset by name (SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS) |\n| Peghead Profile by Name | `PegheadProfile` | Artisan › Assets | Gets a peghead profile Asset by name (STRAIGHT, CONCAVE, CONVEX) |\n| Ring External Profile by Name | `ExtProfileName` | Artisan › Assets | Gets an external profile Asset by name (SQUARE_DOOM_SIDES, CUTTED_OVAL, OVAL_FLATTENED_TOP, OVAL_FLATTENED_BOTTOM) |\n| Ring Profile by Name | `RingProfileName` | Artisan › Assets | Gets a ring profile Asset by name (HALF_ROUND, OVAL, RECTANGLE, ROUNDED_TRAPEZOID, DONUT) |\n| Asset Selector | `Assets` | Artisan › Assets | Select an Asset from a dialog or by ID |\n| Default Value Bool | `DefaultBool` | Artisan › Default Values | Outputs Bool when it has data; otherwise outputs Default Bool. |\n| Default Value Double | `DefaultDouble` | Artisan › Default Values | Outputs Double when it has data; otherwise outputs Default Double. |\n| Default Value Int | `DefaultInt` | Artisan › Default Values | Outputs Value when it has data; otherwise outputs Default Value. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"09caf66bbefc680811527db569920d1c","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Default Value String | `DefaultString` | Artisan › Default Values | Outputs String when it has data; otherwise outputs Default String. |\n| Export Info | `Export Info` | Artisan › Exporters | Exports product info as JSON (name, descriptions, style_id, default_sku). |\n| Export UI Files | `Exporter UI` | Artisan › Exporters | Saves JSON for UI |\n| SKU Equals | `SKU Equals` | Artisan › Exporters | Extracts a single variant from a SKU Bundle by index. |\n| SKU Super Generator | `SKU Super Generator` | Artisan › Exporters | Generate all SKU combinations from fixed Metal/Gem inputs and dynamic panels (value,sku,name triples). |\n| Exporter 3DM Files | `Exporter 3DM` | Artisan › Exporters | Export jewelry geometry to 3DM and GLB with layer organization |\n| Exporter GLB Base64 | `Exporter GLB64` | Artisan › Exporters | Export jewelry geometry to a GLB Base64 string (no disk write) |\n| Exporter GLB Files | `Exporter GLB` | Artisan › Exporters | Export jewelry geometry to 3DM and GLB with layer organization |\n| Exporter Manufacturing STL | `Export STL` | Artisan › Exporters | Export manufacturing geometry to STL |\n| Exporter STL Base64 | `Exporter STL64` | Artisan › Exporters | Export manufacturing geometry to an STL Base64 string (no disk write) |\n| Semantic Export | `Semantic` | Artisan › Exporters | Semantic file export. Add extra Semantic inputs via Zoom (+/-). |\n| Taxonomy Exporter | `Taxonomy Exporter` | Artisan › Exporters | Combines global, center_stone, gemset, shank and eternity taxonomies into a single JSON. |\n| Technical Chart | `Technical Chart` | Artisan › Exporters | Calculates gem count/carats and metal volume/weight from MetalInfo and GemInfo inputs |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"0e7b78c34672df4aebdce386e33f66c8","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Technical Chart 64 | `Tech Chart 64` | Artisan › Exporters | Calculates gem count/carats and metal volume/weight; outputs JSON only (no disk write) |\n| Sprue External Tree | `Sprue External Tree` | Artisan › Manufacturing | Creates an external sprue tree from a base point and contact points |\n| Sprue Inner Branch | `Sprue Inner Branch` | Artisan › Manufacturing | Creates an inner sprue branch from a base point and contact points |\n| Sprue Inner Tree | `Sprue Inner Tree` | Artisan › Manufacturing | Creates an inner sprue tree from a base point and contact points |\n| Sprue Single | `Sprue Single` | Artisan › Manufacturing | Creates a single sprue from a base point and parameters |\n| Semantic From Gems | `Gems Semantic` | Artisan › Semantic | Generates a semantic text description from a list of gems, grouping by shape, compound and size |\n| Dictionary Query | `Dict Query` | Artisan › Utils | Retrieve a value from a Dictionary using a key |\n| Halo Channel Profile by Name | `HaloChProfile` | Artisan › Utils | Gets a halo channel profile Asset by name (SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS) |\n| SKU Combiner | `SKU Combiner` | Artisan › Utils | Combine geometric SKU list with material/gem options into all possible combinations. |\n| Selector | `Selector` | Artisan › Utils | Create a Selector object from parameters and a panel of items (value,sku,name). |\n| Selector Hub | `Selector Hub` | Artisan › Utils | Combine multiple Selectors into one JSON output. |\n| Selector Types | `Selector Types` | Artisan › Utils | Predefined list of selector types. |\n| Counter | `Counter` | Artisan › Utils | Counts ticks using a timer-like behaviour |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"3dff0493726880aed79cef05e83658c6","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| GH Path | `GH Path` | Artisan › Utils | Resolve export folder path. If input is null/empty, returns the .gh definition folder. |\n| Plane Translate | `PlnTrans` | Artisan › Utils | Translates a plane along its local axes |\n| Progress Bar | `Progress` | Artisan › Utils | Displays progress as a percentage |\n| Resolve GH File Name | `GHFileName` | Artisan › Utils | Resolve the current Grasshopper definition file name. If input is null/empty, returns the .gh definition file name. |\n| RhinoArtisan Settings | `Settings` | Artisan › Utils | Control global settings for RhinoArtisan plugin |\n| String In List | `StrInList` | Artisan › Utils | Checks if a string exists in a list of strings |\n| Computation Mode | `Computation Mode` | Artisan › Value List | Predefined list of computation modes (Render / Manufacturing). |\n| Design Type | `Design Type` | Artisan › Value List | Predefined list of design types. |\n| Gem Compound | `Compound` | Artisan › Value List | Predefined list of gem compounds. |\n| Gem Setting Type | `Setting` | Artisan › Value List | Predefined list of gem setting types. |\n| Sub-Design Type | `Sub-Design Type` | Artisan › Value List | Predefined list of sub-design types. |\n| Center Stone | `CenterStone` | Gems › Gems | Creates a gem from CenterStone Reader outputs. Uses carat if provided, otherwise XYZ dimensions. |\n| Center Stone for Solitaire Rings | `CenterStone Solitaire` | Gems › Gems | Creates a center stone for a solitaire ring. Instead of a plane, takes a ring Diameter and a Distance: the gem plane is the XY plane moved up in Z by (Diameter / 2) + Distance, with the gem resting on that surface. |\n| Gem | `Gem` | Gems › Gems | Creates a gem by Width |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"057a4f7dc74a66179b374db996266191","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Gem by Carat | `Gem Ct` | Gems › Gems | Creates a gem by weight (carat) |\n| Gem by Carat for Solitaire Rings | `Gem Ct Solitaire` | Gems › Gems | Creates a gem by weight (carat) placed on a solitaire ring: the base XY plane is moved up in Z by (Diameter / 2) + Distance |\n| Gem by XYZ | `Gem XYZ` | Gems › Gems | Creates a gem by Width (X), Height (Y) and Depth (Z) |\n| Three Stones | `ThreeStones` | Gems › Gems | Creates a three-stones set: one center stone plus two symmetric side stones placed around a ring diameter. Same placement as the ArtisanThreeStones command. |\n| Toi et Moi | `ToiEtMoi` | Gems › Gems | Creates a Toi et Moi pair: two independent stones straddling the top of a ring diameter, one leaning to each side. Same placement as the ArtisanToiEtMoi command. |\n| Gem Info | `Gem Info` | Gems › Gems | Extracts gem information and outputs it as JSON with setting type and compound. |\n| Metal Info | `Metal Info` | Gems › Gems | Extracts metal geometry information and outputs it as JSON with material. |\n| Cutter | `Cutter` | Gems › Cutter | Creates a Cutter object from a Gem and parameters |\n| Cutter - Parameters | `Cutter Params` | Gems › Cutter | Define the parameters for a cutter |\n| Gems on Curve | `GemsOnCrv` | Gems › Gems By Curve | Places gems along a curve with optional prongs and cutters |\n| Gems on Curve - Cutter Params | `GemOnCrv Cutter` | Gems › Gems By Curve | Define cutter parameters for the Gems on Curve component |\n| Gems on Curve - Gem Params | `GemOnCrv Gems` | Gems › Gems By Curve | Define gem parameters for the Gems on Curve component |\n| Gems on Curve - Prong Params | `GemOnCrv Prongs` | Gems › Gems By Curve | Define prong parameters for the Gems on Curve component |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"56d6adb7bdc7f34dd7fa05fabd3d0970","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Gems by Network | `GemsByNet` | Gems › Gems By Network | Places gems across a network of curves with automatic gradient sizing |\n| Gems on 2 Curves | `GemsOn2Crv` | Gems › Gems On 2 Curves | Places gems between two curves using a spine or tangency algorithm |\n| Gems on 2 Curves - Params | `Gem2Crv Params` | Gems › Gems On 2 Curves | Define parameters for the Gems on 2 Curves component |\n| MicroSetting | `MicroSetting` | Gems › Micro Setting | Applies micro-setting cutters, V-cutters, channel and row prongs to a list of gems |\n| MicroSetting - Channel | `MS Channel` | Gems › Micro Setting | Define channel parameters for the MicroSetting component |\n| MicroSetting - Cutters | `MS Cutters` | Gems › Micro Setting | Define cutter parameters for the MicroSetting component |\n| MicroSetting - Row Prongs | `MS RowProngs` | Gems › Micro Setting | Define row prong parameters for the MicroSetting component |\n| MicroSetting - V-Cutters | `MS VCutters` | Gems › Micro Setting | Define V-cutter parameters for the MicroSetting component |\n| Advanced Basket | `AdvancedBasket` | Gemset › Advanced Basket | Creates an advanced basket (per-prong and per-rail control) from a GemObject |\n| Advanced Basket - Prong Claw Parameters | `AB Prong Claw` | Gemset › Advanced Basket | Define the claw tip parameters used by a CLAW mode prong |\n| Advanced Basket - Prong Offset Parameters | `AB Prong Offset` | Gemset › Advanced Basket | Define the V-shaped cross-section parameters used by an OFFSET mode prong (top and bottom sections) |\n| Advanced Basket - Prong Parameters | `AB Prong` | Gemset › Advanced Basket | Define ONE prong of an advanced basket. Wire several of these into the Prong Params list input of the Advanced Basket component. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"5c1b9639b18812d9323552aea3e8c01d","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Advanced Basket - Rail Parameters | `AB Rail` | Gemset › Advanced Basket | Define ONE rail of an advanced basket. Wire several of these into the Rail Params list input of the Advanced Basket component. |\n| Advanced Bezel | `AdvancedBezel` | Gemset › Advanced Bezel | Creates an advanced bezel (free wall profile) from a GemObject |\n| Advanced Bezel - Airgap Parameters | `AB Airgaps` | Gemset › Advanced Bezel | Define the airgap parameters for an advanced bezel |\n| Advanced Bezel - Cutter Parameters | `AB Cutters` | Gemset › Advanced Bezel | Define the cutter parameters for an advanced bezel |\n| Advanced Bezel - Parameters | `AB Params` | Gemset › Advanced Bezel | Define the basic parameters for an advanced bezel. The wall profile point list is only editable through the main component's JSON input. |\n| Basket | `Basket` | Gemset › Basket | Creates a basket from a GemObject |\n| Basket - Base Rail Parameters | `Basket Base Rail` | Gemset › Basket | Define the base rail parameters for a basket |\n| Basket - Prong Parameters | `Basket Prongs` | Gemset › Basket | Define the prong parameters for a basket |\n| Basket - Upper Rail Parameters | `Basket Upper Rail` | Gemset › Basket | Define the upper rail parameters for a basket |\n| Bezel | `Bezel` | Gemset › Bezel | Creates a bezel from a GemObject |\n| Bezel - Airgap Parameters | `Bezel Airgaps` | Gemset › Bezel | Define the airgap parameters for a bezel |\n| Bezel - Cutter Parameters | `Bezel Cutters` | Gemset › Bezel | Define the cutter parameters for a bezel |\n| Bezel - Parameters | `Bezel - Params` | Gemset › Bezel | Define the basic parameters for a bezel |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"aca6ab2a35a3e3cb803bc477181f3faa","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Channel | `Channel` | Gemset › Channel | Creates a channel setting (metal band with a gem groove) swept along a curve |\n| Channel - Gems Parameters | `Channel Gems` | Gemset › Channel | Define the gem row and setting parameters for a channel (shared prongs / scalloped) |\n| Channel - Section Parameters | `Channel Section` | Gemset › Channel | Define the metal cross-section parameters for a channel |\n| Cluster | `Cluster` | Gemset › Cluster | Creates a cluster from a GemObject |\n| Cluster - Gems Parameters | `Cluster Gems` | Gemset › Cluster | Define the gem parameters for a cluster |\n| Cluster - Main Gem Rail Parameters | `Cluster Main Gem Rail` | Gemset › Cluster | Define the main gem rail parameters for a cluster |\n| Cluster - Prongs Parameters | `Cluster Prongs` | Gemset › Cluster | Define the prong parameters for a cluster |\n| Halo | `Halo` | Gemset › Halo | Creates a halo from a GemObject |\n| Halo - Channel Parameters | `Halo Channel` | Gemset › Halo | Define the channel parameters for a halo |\n| Halo - Gems Parameters | `Halo Gems` | Gemset › Halo | Define the gem parameters for a halo |\n| Halo - Prongs Parameters | `Halo Prongs` | Gemset › Halo | Define the prong parameters for a halo |\n| Martini | `Martini` | Gemset › Martini | Creates a martini gemset from a GemObject |\n| Martini - Prong Parameters | `Martini Prongs` | Gemset › Martini | Define the prong parameters for a martini |\n| Martini - Side Bezel Parameters | `Martini Side Bezel` | Gemset › Martini | Define the side bezel parameters for a martini |\n| Martini - Upper Rail Parameters | `Martini Upper Rail` | Gemset › Martini | Define the upper rail parameters for a martini |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"459d8eb80a76cfa9fdb049b83514c022","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Peghead | `Peghead` | Gemset › Peghead | Creates a peghead from a GemObject |\n| Peghead - Parameters | `Peghead Params` | Gemset › Peghead | Define the parameters for a peghead |\n| Tapered Baguettes on Curves | `TaperedBaguettes` | Gemset › Tapered Baguettes | Places tapered baguette gems spanning between two rail curves, top edge on the first curve |\n| Tapered Baguettes - Params | `TaperedBag Params` | Gemset › Tapered Baguettes | Define parameters for the Tapered Baguettes on Curves component |\n| Trellis | `Trellis` | Gemset › Trellis | Creates a trellis gemset from a GemObject |\n| Trellis - Prongs Parameters | `Trellis Prongs` | Gemset › Trellis | Define the prong parameters for a trellis gemset |\n| Trellis - Upper Rail Parameters | `Trellis Upper Rail` | Gemset › Trellis | Define the upper rail parameters for a trellis gemset |\n| Trilogy Trellis | `TrilogyTrellis` | Gemset › Trilogy Trellis | Creates a trellis-style gemset over a three stones set (center gem + two side gems, as output by the Three Stones component) |\n| Trilogy Trellis - Cross Prongs Parameters | `TT Cross Prongs` | Gemset › Trilogy Trellis | Define the cross prong parameters for a trilogy trellis (the 4 blend prongs that cross over the center stone to the opposite side gem) |\n| Trilogy Trellis - Shank Prongs Parameters | `TT Shank Prongs` | Gemset › Trilogy Trellis | Define the shank prong parameters for a trilogy trellis (the 4 prongs that descend from the side gems to the ring curve) |\n| Trilogy Trellis - Upper Rail Parameters | `TT Upper Rail` | Gemset › Trilogy Trellis | Define the under-girdle rail parameters for a trilogy trellis. Wire to Upper Rail (center + sides) or to Side Rail (sides only). |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"9dc799722755de64a6e278592da3f43d","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Tulip | `Tulip` | Gemset › Tulip | Creates a tulip gemset from a GemObject |\n| Tulip - Ornament Parameters | `Tulip Ornament` | Gemset › Tulip | Define the ornament (union / leaf) parameters for a tulip |\n| Tulip - Prong Parameters | `Tulip Prongs` | Gemset › Tulip | Define the prong (petal) parameters for a tulip |\n| Advanced Cathedral | `Adv Cathedral` | Shanks › Advanced Cathedral | Creates an advanced cathedral shank with optional parameters |\n| Advanced Cathedral - Gems Params | `Adv Cathedral Gems Params` | Shanks › Advanced Cathedral | Parameters for Advanced Cathedral Gems |\n| Advanced Cathedral - Shank Params | `Adv Cathedral Shank Params` | Shanks › Advanced Cathedral | Parameters for the Advanced Cathedral shank |\n| Advanced | `Shank - Advanced` | Shanks › Advanced Ring | Creates a shank defined by multiple profiles along a curve |\n| Advanced - Gems Parameters | `Advanced Gems` | Shanks › Advanced Ring | Parameters for gems in RingBySection |\n| Advanced - Global Parameters | `Advanced Global` | Shanks › Advanced Ring | Global parameters for RingBySection |\n| Advanced - Profile Parameters | `Advanced Profile` | Shanks › Advanced Ring | Parameters for a profile section of RingBySection |\n| Bypass | `Bypass` | Shanks › Bypass | Creates a bypass (crossover) shank with optional parameters |\n| Bypass - Gems Params | `Bypass Gems Params` | Shanks › Bypass | Parameters for Bypass Gems |\n| Bypass - Shank Params | `Bypass - Shank Params` | Shanks › Bypass | Parameters for Bypass Shank |\n| Cathedral | `Cathedral` | Shanks › Cathedral | Creates a cathedral shank with optional parameters |\n| Cathedral - Gems Params | `Cathedral Gems Params` | Shanks › Cathedral | Parameters for Cathedral Gems |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"62d8bf42b55ed1a602ddad19808e5281","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Cathedral - Shank Params | `Cathedral - Shank Params` | Shanks › Cathedral | Parameters for Cathedral Shank |\n| Class Ring | `ClassRing` | Shanks › Class Ring | Creates a class ring (signet-style shank with a stone seat) with optional parameters |\n| Class Ring - Gem Params | `Class Ring - Gem Params` | Shanks › Class Ring | Gem parameters for Class Ring |\n| Class Ring - Shank Params | `Class Ring - Shank Params` | Shanks › Class Ring | Shank parameters for Class Ring |\n| Class Ring - Top Side Params | `Class Ring - Top Side Params` | Shanks › Class Ring | Top side parameters for Class Ring |\n| Classic | `Classic` | Shanks › Classic | Creates a classic ring with optional parameters |\n| Classic - Advanced Parameters | `Classic - Advanced` | Shanks › Classic | Define advanced parameters for a Classic ring |\n| Classic - External Profile | `Classic - External` | Shanks › Classic | Define external profile parameters for a Classic ring |\n| Classic - Gems Parameters | `Classic - Gems` | Shanks › Classic | Define gem-related parameters for a Classic ring |\n| Classic - Profile | `Classic - Profile` | Shanks › Classic | Define a ClassicProfile for a Classic Ring |\n| Classic - Profile With Enable | `Classic - Profile With Enable` | Shanks › Classic | Define a ClassicProfile for a Classic Ring with an enable toggle |\n| Engraving | `Engraving` | Shanks › Engraving | Creates an engraved text ring flowing text along an implicit ring curve built from a finger diameter |\n| Engraving - Text Parameters | `Engraving Text` | Shanks › Engraving | Define the text parameters for an engraved ring |\n| Eternity | `Eternity` | Shanks › Eternity | Creates an eternity ring with configurable gems, prongs, bezels and shank parameters |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"460e54e98f39dd69afb94cae4d98b3a0","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Eternity - Bezels Parameters | `EternityBezels` | Shanks › Eternity | Defines bezel rail and profile parameters for Eternity rings |\n| Eternity - Gems Parameters | `Eternity - Gems Parameters` | Shanks › Eternity | Define gem-related parameters for an Eternity ring |\n| Eternity - Prongs Parameters | `Eternity - Prongs Parameters` | Shanks › Eternity | Defines prong parameters for Eternity rings |\n| Eternity - Shank Lower | `Eternity - Shank Lower` | Shanks › Eternity | Defines parameters for the *lower* part of the Eternity shank |\n| Eternity - Shank Upper | `Eternity - Shank Upper` | Shanks › Eternity | Defines parameters for the *upper* part of the Eternity shank |\n| Matching Shank | `MatchingShank` | Shanks › Matching Shank | Creates a matching band fitted against an existing ring or gemset |\n| Matching Shank - Fit Params | `Matching Shank - Fit Params` | Shanks › Matching Shank | Fit parameters for Matching Shank: how the band seats against the mother ring |\n| Matching Shank - Gems Params | `Matching Shank Gems Params` | Shanks › Matching Shank | Gems parameters for Matching Shank |\n| Matching Shank - Shank Params | `Matching Shank - Shank Params` | Shanks › Matching Shank | Shank parameters for Matching Shank |\n| Pave Shank | `PaveShank` | Shanks › Pave Shank | Creates a pave shank: a band with longitudinal rows of stones, optional cutters and prongs |\n| Pave Shank - Band Params | `PaveShank - Band Params` | Shanks › Pave Shank | Band parameters for Pave Shank: top profile and opening |\n| Pave Shank - Cutters Params | `PaveShank - Cutters Params` | Shanks › Pave Shank | Cutter parameters for Pave Shank (one cutter solid per gem, subtracted from the band) |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"c40ccd56d1d4ac2e5fb0686c30db8c15","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Pave Shank - Row Params | `PaveShank - Row Params` | Shanks › Pave Shank | One longitudinal gem row for Pave Shank. Wire several into the Rows list input, one per row |\n| Ring Curve | `RingCurve` | Shanks › Ring Curve | Create a base curve for shanks using FingerSize, Parameters, and Profile |\n| Ring Curve - Parameters | `Ring Curve Params` | Shanks › Ring Curve | Parameters for RingCurve (Type, Bypass, Shape, etc.) |\n| Ring Cylinder | `RingCyl` | Shanks › Ring Cut | Creates a cylinder from a ring diameter and extrusion height |\n| Ring Sizes - British | `British` | Shanks › Ring Sizes | Predefined list of ring size systems. |\n| Ring Sizes - China | `China` | Shanks › Ring Sizes | Predefined list of Chinese ring sizes. |\n| Ring Sizes - Europe | `Europe` | Shanks › Ring Sizes | Predefined list of European ring sizes. |\n| Ring Sizes - USA | `USA` | Shanks › Ring Sizes | Predefined list of USA ring sizes. |\n| Ring Sizes - Australia | `Australia` | Shanks › Ring Sizes | Predefined list of ring size systems. |\n| Ring Sizes - Brazil | `Brazil` | Shanks › Ring Sizes | Predefined list of Brazilian ring sizes. |\n| Ring Sizes - Canada | `Canada` | Shanks › Ring Sizes | Predefined list of Canadian ring sizes. |\n| Ring Sizes - France | `France` | Shanks › Ring Sizes | Ring sizes for France system |\n| Ring Sizes - Germany | `Germany` | Shanks › Ring Sizes | Predefined list of ring size system: Germany. |\n| Ring Sizes - India | `India` | Shanks › Ring Sizes | Predefined list of Indian ring sizes. |\n| Ring Sizes - India Extended | `India Extended` | Shanks › Ring Sizes | Predefined list of extended Indian ring sizes. |\n| Ring Sizes - Israel | `Israel` | Shanks › Ring Sizes | Predefined list of Israeli ring sizes. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"53f0ab1fbb8dc01073523aa5f0492c8c","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Ring Sizes - Italy | `Italy` | Shanks › Ring Sizes | Predefined list of ring size system: Italy. |\n| Ring Sizes - Japan | `Japan` | Shanks › Ring Sizes | Predefined list of ring size system: Japan. |\n| Ring Sizes - Russia | `Russia` | Shanks › Ring Sizes | Predefined list of ring size system: Russia. |\n| Ring Sizes - South America | `South America` | Shanks › Ring Sizes | Predefined list of South American ring sizes. |\n| Ring Sizes - Spain | `Spain` | Shanks › Ring Sizes | Predefined list of ring size system: Spain. |\n| Ring Sizes - Switzerland | `Switzerland` | Shanks › Ring Sizes | Predefined list of ring size system: Switzerland. |\n| Ring Sizes - Türkiye | `Türkiye` | Shanks › Ring Sizes | Predefined list of Turkish ring sizes. |\n| Signet | `Signet` | Shanks › Signet | Description |\n| Two Rows Shank | `TwoRowsShank` | Shanks › Two Rows Shank | Creates a two-rows knife pave shank with optional parameters |\n| Two Rows Shank - Cutters Params | `TwoRows - Cutters Params` | Shanks › Two Rows Shank | Gem drill-cutter parameters for a Two Rows Shank (percentages of the gem size unless noted) |\n| Two Rows Shank - Gems Params | `TwoRows - Gems Params` | Shanks › Two Rows Shank | Gem parameters for a Two Rows Shank |\n| Two Rows Shank - Prongs Params | `TwoRows - Prongs Params` | Shanks › Two Rows Shank | Prong parameters for a Two Rows Shank |\n| Two Rows Shank - Rail Params | `TwoRows - Rail Params` | Shanks › Two Rows Shank | Rail / channel parameters for a Two Rows Shank |\n| Wedding | `Wedding` | Shanks › Wedding | Creates a pair of wedding rings with optional parameters |\n| Wedding Band | `Wedding Band` | Shanks › Wedding | Creates a single wedding band with optional parameters |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"db7a19a794b841938687ff92984d18fb","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Wedding - Gems | `Wedding - Gems` | Shanks › Wedding | Define gem-related parameters for a Wedding Ring |\n| Wedding - Profile | `Wedding - Profile` | Shanks › Wedding | Define a profile for a Wedding Ring |\n| Bail | `Bail` | Accessories › Bail | Creates a Bail accessory |\n| Bail Parameters | `Bail Params` | Accessories › Bail | Define parameters for a Bail accessory |\n| Bead | `Bead` | Accessories › Bead | Creates a Bead accessory |\n| Bead Parameters | `Bead Params` | Accessories › Bead | Define parameters for a Bead accessory |\n| Charm | `Charm` | Accessories › Charm | Creates a Charm accessory |\n| Charm Parameters | `Charm Params` | Accessories › Charm | Define parameters for a Charm accessory |\n| Milgrain | `Milgrain` | Accessories › Milgrain | Creates a Milgrain accessory along a curve |\n| Milgrain Parameters | `Milgrain Params` | Accessories › Milgrain | Define parameters for a Milgrain accessory |\n| Rope | `Rope` | Accessories › Rope | Creates a Rope accessory |\n| Rope Parameters | `Rope Params` | Accessories › Rope | Define parameters for a Rope accessory |\n| Bezel Airgap Reader | `BezelAirgapReader` | Readers › Gemsets | Reads a Bezel airgap dictionary and outputs its standard values. |\n| Bezel Cutter Reader | `BezelCutterReader` | Readers › Gemsets | Reads a Bezel cutter dictionary and outputs its standard values. |\n| Bezel Params Reader | `BezelParamsReader` | Readers › Gemsets | Reads a Bezel dictionary and outputs its standard values. |\n| Cluster Gems Reader | `ClusterGemsReader` | Readers › Gemsets | Reads a Cluster gems dictionary and outputs its standard values. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"672fcd191a2713c5fb813068cf331551","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Cluster Main Gem Rail Reader | `ClusterMainGemRailReader` | Readers › Gemsets | Reads a Cluster main gem rail dictionary and outputs its standard values. |\n| Cluster Prongs Reader | `ClusterProngsReader` | Readers › Gemsets | Reads a Cluster prongs dictionary and outputs its standard values. |\n| Peghead Reader | `PegheadReader` | Readers › Gemsets | Reads a Peghead dictionary and outputs its standard values. |\n| Basket Base Rail Reader | `BasketBaseRailReader` | Readers › Gemsets | Reads a Basket base rail dictionary and outputs its standard values. |\n| Basket Prong Reader | `BasketProngReader` | Readers › Gemsets | Reads a Basket prong dictionary and outputs its standard values. |\n| Basket Upper Rail Reader | `BasketUpperRailReader` | Readers › Gemsets | Reads a Basket upper rail dictionary and outputs its standard values. |\n| Martini Prong Reader | `MartiniProngReader` | Readers › Gemsets | Reads a Martini prong dictionary and outputs its standard values. |\n| Martini Side Bezel Reader | `MartiniSideBezelReader` | Readers › Gemsets | Reads a Martini side bezel dictionary and outputs its standard values. |\n| Martini Upper Rail Reader | `MartiniUpperRailReader` | Readers › Gemsets | Reads a Martini upper rail dictionary and outputs its standard values. |\n| Trellis Prongs Reader | `TrellisProngsReader` | Readers › Gemsets | Reads a Trellis prongs dictionary and outputs its standard values. |\n| Trellis Upper Rail Reader | `TrellisUpperRailReader` | Readers › Gemsets | Reads a Trellis upper rail dictionary and outputs its standard values. |\n| Tulip Ornament Reader | `TulipOrnamentReader` | Readers › Gemsets | Reads a Tulip ornament dictionary and outputs its standard values. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"375c7556d22e0f25990be947fc30a782","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Tulip Prong Reader | `TulipProngReader` | Readers › Gemsets | Reads a Tulip prong dictionary and outputs its standard values. |\n| Halo Channel Reader | `HaloChannelReader` | Readers › Gemsets | Reads a Halo channel dictionary and outputs its standard values. |\n| Halo Gems Reader | `HaloGemsReader` | Readers › Gemsets | Reads a Halo gems dictionary and outputs its standard values. |\n| Halo Prongs Reader | `HaloProngsReader` | Readers › Gemsets | Reads a Halo prongs dictionary and outputs its standard values. |\n| Halo Reader | `HaloReader` | Readers › Gemsets | Reads a Halo dictionary and outputs its standard values. |\n| Trellis Reader | `TrellisReader` | Readers › Gemsets | Reads a Trellis dictionary and outputs its standard values. |\n| Tulip Reader | `TulipReader` | Readers › Gemsets | Reads a Tulip dictionary and outputs its standard values. |\n| Center Stone Reader | `CenterStoneReader` | Readers › Global | Reads the 'center_stone' section from a JSON and outputs standard values. |\n| Computation Mode | `Mode` | Readers › Global | Splits a RENDER / MANUFACTURING string into Render and Manufacturing booleans. Defaults to Render when no input is provided. |\n| Eternity Reader | `EternityReader` | Readers › Global | Reads the 'eternity' section from a JSON and outputs sub-dictionaries (gems, prongs, bezels, shank upper/lower) ready to connect to the Eternity readers. |\n| Gemset Reader | `GemsetReader` | Readers › Global | Reads the 'gemset' section from a JSON and outputs style, material, and grouped dictionaries for bezel, halo, trellis, tulip, and basket. |\n| Global Reader | `GlobalReader` | Readers › Global | Reads the 'global' section from a JSON and outputs standard values. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"b29a6600f07a67d719c5e443a23f8dfd","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Shank Reader | `ShankReader` | Readers › Global | Reads the 'shank' section from a JSON and outputs style, material, diameter, classic and cathedral dictionaries. |\n| Advanced Cathedral Gems Reader | `AdvCathedralGemsReader` | Readers › Shanks | Reads an Advanced Cathedral gems dictionary and outputs its standard values. |\n| Advanced Cathedral Shank Reader | `AdvCathedralShankReader` | Readers › Shanks | Reads an Advanced Cathedral shank dictionary and outputs its standard values. |\n| Cathedral Gems Reader | `CathedralGems` | Readers › Shanks | Reads cathedral gems parameters from a Cathedral dictionary. |\n| Cathedral Shank Reader | `Cathedral Shank Reader` | Readers › Shanks | Reads cathedral shank parameters from a Cathedral dictionary. |\n| Eternity Bezels Reader | `Eternity Bezels Reader` | Readers › Shanks | Reads eternity bezels parameters from an Eternity JSON dictionary. |\n| Eternity Gems Reader | `Eternity Gems Reader` | Readers › Shanks | Reads eternity gems parameters from an Eternity JSON dictionary. |\n| Eternity Prongs Reader | `Eternity Prongs Reader` | Readers › Shanks | Reads eternity prongs parameters from an Eternity JSON dictionary. |\n| Eternity Shank Lower Reader | `Eternity Shank Lower Reader` | Readers › Shanks | Reads eternity lower shank parameters from an Eternity JSON dictionary. |\n| Eternity Shank Upper Reader | `Eternity Shank Upper Reader` | Readers › Shanks | Reads eternity upper shank parameters from an Eternity JSON dictionary. |\n| Classic Adv Reader | `ClassicAdv` | Readers › Shanks | Reads classic advanced parameters from a Classic dictionary. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"7e375eced1fdcde05ffd1aaec087d8bc","indexed_by":"docs-index"}},{"content":"Component reference — All components\n\n| Component | Nickname | Tab | Description |\n|---|---|---|---|\n| Classic Bottom Reader | `ClassicBottom` | Readers › Shanks | Reads classic bottom profile parameters from a Classic dictionary. |\n| Classic External Reader | `ClassicExternal` | Readers › Shanks | Reads classic external profile parameters from a Classic dictionary. |\n| Classic Gems Reader | `ClassicGems` | Readers › Shanks | Reads classic gems parameters from a Classic dictionary. |\n| Classic Mid Reader | `ClassicMid` | Readers › Shanks | Reads classic mid profile parameters from a Classic dictionary. |\n| Classic Top Reader | `ClassicTop` | Readers › Shanks | Reads classic top profile parameters from a Classic dictionary. |","metadata":{"title":"Component reference","section":"All components","url":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","source":"https://www.rhinoartisan.com/docs/grasshopper/components/#all-components","collection":"grasshopper","hash":"506b376a318915919ecd33fdc6023234","indexed_by":"docs-index"}},{"content":"Accessories\n\nBails, beads, charms, milgrain and rope details.\n\n10 components in 5 groups.\n\n- Bail — 2 components: Bail, Bail Parameters.\n- Bead — 2 components: Bead, Bead Parameters.\n- Charm — 2 components: Charm, Charm Parameters.\n- Milgrain — 2 components: Milgrain, Milgrain Parameters.\n- Rope — 2 components: Rope, Rope Parameters.","metadata":{"title":"Accessories","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/","collection":"grasshopper","hash":"6d4cba9381ded7ee71989cb086520283","indexed_by":"docs-index"}},{"content":"Bail\n\n2 components in Accessories › Bail.\n\nBail\nCreates a Bail accessory\n\nNickname: `Bail` · Tab: Accessories › Bail\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `P` | Plane | item | `Plane.WorldXY` | Base plane for the bail |\n| Bail Params _(optional)_ | `Params` | Generic | item | — | Bail parameters as dictionary |\n| Bail JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Bail |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the bail |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Semantic | `Semantic` | Text | item | Semantic text description of the bail |","metadata":{"title":"Bail","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bail/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bail/","collection":"grasshopper","hash":"5a575d31bbd2ce2e6b1429b5e7446f46","indexed_by":"docs-index"}},{"content":"Bail — Bail Parameters\n\nDefine parameters for a Bail accessory\n\nNickname: `Bail Params` · Tab: Accessories › Bail\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Diameter Top _(optional)_ | `DTop` | Number | item | `1.0` | Top diameter of the bail |\n| Diameter Bottom _(optional)_ | `DBot` | Number | item | `1.0` | Bottom diameter of the bail |\n| Distance _(optional)_ | `Dist` | Number | item | `2.0` | Distance between bail loops |\n| Torus Enable _(optional)_ | `TorusE` | Boolean | item | `false` | Enable torus |\n| Torus Thickness _(optional)_ | `TorusThk` | Number | item | `0.3` | Thickness of torus |\n| Torus Diameter _(optional)_ | `TorusDia` | Number | item | `1.5` | Diameter of torus |\n| Torus Overlap _(optional)_ | `TorusOvl` | Number | item | `0.1` | Overlapping distance of torus |\n| Torus Rotation _(optional)_ | `TorusRot` | Number | item | `0.0` | Rotation of torus |\n| Starting On Top _(optional)_ | `STop` | Number | item | `0.0` | Starting point on top |\n| Starting On Bottom _(optional)_ | `SBot` | Number | item | `0.0` | Starting point on bottom |\n| Curve Tension _(optional)_ | `Tens` | Number | item | `0.5` | Curve tension of the bail |\n| Top Profile _(optional)_ | `Profile` | Text | item | `DEFAULT` | Bail profile type |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bail Params | `Params` | Generic | item | Parameters for Bail component |","metadata":{"title":"Bail","section":"Bail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bail/#bail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bail/#bail-parameters","collection":"grasshopper","hash":"918af9bf5f7056a394ca5fb1f7c52d1e","indexed_by":"docs-index"}},{"content":"Bead\n\n2 components in Accessories › Bead.\n\nBead\nCreates a Bead accessory\n\nNickname: `Bead` · Tab: Accessories › Bead\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `P` | Plane | item | `Plane.WorldXY` | Base plane for the bead |\n| Bead Params _(optional)_ | `Params` | Generic | item | — | Bead parameters as dictionary |\n| Bead JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Bead |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the bead |\n| SubDs | `SubDs` | SubD | list | SubD parts of the bead |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Semantic | `Semantic` | Text | item | Semantic text description of the bead |","metadata":{"title":"Bead","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bead/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bead/","collection":"grasshopper","hash":"c7d80a6f1d24b30fcef20d162be3687d","indexed_by":"docs-index"}},{"content":"Bead — Bead Parameters\n\nDefine parameters for a Bead accessory\n\nNickname: `Bead Params` · Tab: Accessories › Bead\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | `SQUARE` | Profile type (e.g. SQUARE, ROUND) |\n| Width _(optional)_ | `Width` | Number | item | `10.0` | Width of bead |\n| Length _(optional)_ | `Length` | Number | item | `10.0` | Length of bead |\n| Height _(optional)_ | `Height` | Number | item | `10.0` | Height of bead |\n| Wall Distance _(optional)_ | `WallDist` | Number | item | `2.5` | Wall distance of bead |\n| Hole Diameter _(optional)_ | `HoleDia` | Number | item | `3.0` | Hole diameter of bead |\n| Radius _(optional)_ | `Radius` | Number | item | `0.8` | Fillet radius of bead |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bead Params | `Params` | Generic | item | Parameters for Bead component |","metadata":{"title":"Bead","section":"Bead Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bead/#bead-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/bead/#bead-parameters","collection":"grasshopper","hash":"f2cc246003fab57374410f5d4dc60ed4","indexed_by":"docs-index"}},{"content":"Charm\n\n2 components in Accessories › Charm.\n\nCharm\nCreates a Charm accessory\n\nNickname: `Charm` · Tab: Accessories › Charm\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `P` | Plane | item | `Plane.WorldXY` | Base plane for the charm |\n| Charm Params _(optional)_ | `Params` | Generic | item | — | Charm parameters as dictionary |\n| Charm JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Charm |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the charm |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Semantic | `Semantic` | Text | item | Semantic text description of the charm |","metadata":{"title":"Charm","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/charm/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/charm/","collection":"grasshopper","hash":"63b4429a9df65d4113e030d92aff4e54","indexed_by":"docs-index"}},{"content":"Charm — Charm Parameters\n\nDefine parameters for a Charm accessory\n\nNickname: `Charm Params` · Tab: Accessories › Charm\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Charm Curve _(optional)_ | `Curve` | Generic | item | — | Curve asset for the charm |\n| Width _(optional)_ | `Width` | Number | item | `10.0` | Charm width |\n| Height _(optional)_ | `Height` | Number | item | `10.0` | Charm height |\n| Thickness _(optional)_ | `Thk` | Number | item | `2.0` | Charm thickness |\n| Top Thickness _(optional)_ | `TopThk` | Number | item | `1.0` | Top thickness |\n| Bottom Thickness _(optional)_ | `BotThk` | Number | item | `1.0` | Bottom thickness |\n| Finishing Type _(optional)_ | `Finish` | Text | item | `POLISHED` | Finishing type (e.g. POLISHED, MATTE) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Charm Params | `Params` | Generic | item | Parameters for Charm component |","metadata":{"title":"Charm","section":"Charm Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/charm/#charm-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/charm/#charm-parameters","collection":"grasshopper","hash":"216894b7ab3441341dc7112eee3b4b03","indexed_by":"docs-index"}},{"content":"Milgrain\n\n2 components in Accessories › Milgrain.\n\nMilgrain\nCreates a Milgrain accessory along a curve\n\nNickname: `Milgrain` · Tab: Accessories › Milgrain\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Curve | `C` | Curve | item | Base curve for the milgrain |\n| Milgrain Params _(optional)_ | `Params` | Generic | item | Milgrain parameters as dictionary |\n| Milgrain JSON _(optional)_ | `JSON` | Text | item | JSON representation of a Milgrain |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the milgrain |\n| Magnet Start | `Magnet Start` | Point | item | Start point of the curve |\n| Magnet End | `Magnet End` | Point | item | End point of the curve |","metadata":{"title":"Milgrain","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/milgrain/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/milgrain/","collection":"grasshopper","hash":"ade426f957486ce1609ffb5b944d599f","indexed_by":"docs-index"}},{"content":"Milgrain — Milgrain Parameters\n\nDefine parameters for a Milgrain accessory\n\nNickname: `Milgrain Params` · Tab: Accessories › Milgrain\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Diameter _(optional)_ | `Dia` | Number | item | `0.3` | Milgrain bead diameter |\n| Overlapping _(optional)_ | `Overlap` | Number | item | `0.1` | Overlap factor between beads |\n| Fit To End _(optional)_ | `FitEnd` | Boolean | item | `true` | Whether beads should fit exactly to curve ends |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Milgrain Params | `Params` | Generic | item | Parameters for Milgrain component |","metadata":{"title":"Milgrain","section":"Milgrain Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/milgrain/#milgrain-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/milgrain/#milgrain-parameters","collection":"grasshopper","hash":"5fec73d15b6c2b7dc77547136e08d7b7","indexed_by":"docs-index"}},{"content":"Rope\n\n2 components in Accessories › Rope.\n\nRope\nCreates a Rope accessory\n\nNickname: `Rope` · Tab: Accessories › Rope\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Curve | `Curve` | Curve | item | Base curve for the rope |\n| Rope Params _(optional)_ | `Params` | Generic | item | Rope parameters as dictionary |\n| Rope JSON _(optional)_ | `JSON` | Text | item | JSON representation of a Rope |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the charm |\n| Magnet Start | `Magnet Start` | Point | item | Start point of the rope |\n| Magnet End | `Magnet End` | Point | item | End point of the rope |\n| Semantic | `Semantic` | Text | item | Semantic text description of the rope |","metadata":{"title":"Rope","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/rope/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/rope/","collection":"grasshopper","hash":"2b6bf6722933c43b0d47858894418a0c","indexed_by":"docs-index"}},{"content":"Rope — Rope Parameters\n\nDefine parameters for a Rope accessory\n\nNickname: `Rope Params` · Tab: Accessories › Rope\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Threads _(optional)_ | `Threads` | Integer | item | `3` | Number of threads |\n| Diameter _(optional)_ | `Dia` | Number | item | `1.6` | Thread diameter |\n| Width _(optional)_ | `Width` | Number | item | `3.0` | Rope width |\n| Turns _(optional)_ | `Turns` | Integer | item | `5` | Number of turns |\n| Infinite _(optional)_ | `Infinite` | Boolean | item | `true` | Infinite rope |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Rope Params | `Params` | Generic | item | Parameters for Rope component |","metadata":{"title":"Rope","section":"Rope Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/rope/#rope-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/accessories/rope/#rope-parameters","collection":"grasshopper","hash":"fc00049d4c75dc145dd513abfbc87db8","indexed_by":"docs-index"}},{"content":"Artisan\n\nAssets, exporters, manufacturing and the utilities that hold a definition together.\n\n49 components in 8 groups.\n\n- AI — 1 component: OpenRouter.\n- Assets — 8 components: Bezel Airgap Profile by Name, Bezel Cutter Profile by Name, Bezel Profile by Name, Halo Profile by Name, Peghead Profile by Name, Ring External Profile by Name, Ring Profile by Name, Asset Selector.\n- Default Values — 4 components: Default Value Bool, Default Value Double, Default Value Int, Default Value String.\n- Exporters — 13 components: Export Info, Export UI Files, SKU Equals, SKU Super Generator, Exporter 3DM Files, Exporter GLB Base64, Exporter GLB Files, Exporter Manufacturing STL, Exporter STL Base64, Semantic Export, Taxonomy Exporter, Technical Chart, Technical Chart 64.\n- Manufacturing — 4 components: Sprue External Tree, Sprue Inner Branch, Sprue Inner Tree, Sprue Single.\n- Semantic — 1 component: Semantic From Gems.\n- Utils — 13 components: Dictionary Query, Halo Channel Profile by Name, SKU Combiner, Selector, Selector Hub, Selector Types, Counter, GH Path, Plane Translate, Progress Bar, Resolve GH File Name, RhinoArtisan Settings, String In List.\n- Value List — 5 components: Computation Mode, Design Type, Gem Compound, Gem Setting Type, Sub-Design Type.","metadata":{"title":"Artisan","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/","collection":"grasshopper","hash":"a02fee5e7d280c92babda407444dc332","indexed_by":"docs-index"}},{"content":"AI\n\n1 component in Artisan › AI.\n\nOpenRouter\nSend a prompt to OpenRouter API and get a response\n\nNickname: `OpenRouter` · Tab: Artisan › AI\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Send | `Send` | Boolean | item | `false` | Set to true to send the request |\n| API Key | `Key` | Text | item | — | OpenRouter API key |\n| Model _(optional)_ | `Model` | Text | item | `openai/gpt-4o` | Model identifier (e.g. openai/gpt-4o) |\n| System Prompt _(optional)_ | `System` | Text | item | `You are a helpful assistant.` | System prompt |\n| Message | `Message` | Text | item | — | User message to send |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Response | `Response` | Text | item | Model response text |\n| Raw JSON | `JSON` | Text | item | Full JSON response from OpenRouter |","metadata":{"title":"AI","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/ai/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/ai/","collection":"grasshopper","hash":"f5533cec25a76aa8543e6ffc92ba1b29","indexed_by":"docs-index"}},{"content":"Assets\n\n8 components in Artisan › Assets.\n\nBezel Airgap Profile by Name\nGets a bezel airgap profile Asset by name (HEART, SQUARE, ROUNDED_SQUARE)\n\nNickname: `BezelAirgapProfile` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `HEART` | Profile name: HEART, SQUARE, ROUNDED_SQUARE |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/","collection":"grasshopper","hash":"f094cbfed0809ff818b0e065d372c60f","indexed_by":"docs-index"}},{"content":"Assets — Bezel Cutter Profile by Name\n\nGets a bezel cutter profile Asset by name (ROUNDED, SQUARE, SHARP)\n\nNickname: `BezelCutProfile` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `ROUNDED` | Profile name: ROUNDED, SQUARE, SHARP |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Bezel Cutter Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#bezel-cutter-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#bezel-cutter-profile-by-name","collection":"grasshopper","hash":"f160f4888284933ae175d5eeb5f6d431","indexed_by":"docs-index"}},{"content":"Assets — Bezel Profile by Name\n\nGets a bezel profile Asset by name (CONCAVE, STRAIGHT, CONVEX)\n\nNickname: `BezelProfile` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `STRAIGHT` | Profile name: CONCAVE, STRAIGHT, CONVEX |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Bezel Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#bezel-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#bezel-profile-by-name","collection":"grasshopper","hash":"a59ad0f963e8c46964b6439d1185da27","indexed_by":"docs-index"}},{"content":"Assets — Halo Profile by Name\n\nGets a halo profile Asset by name (SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS)\n\nNickname: `HaloProfileName` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `SOFT_DOOM` | Profile name: SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Halo Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#halo-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#halo-profile-by-name","collection":"grasshopper","hash":"0c2281a9ec617471d55f0162d228c0a2","indexed_by":"docs-index"}},{"content":"Assets — Peghead Profile by Name\n\nGets a peghead profile Asset by name (STRAIGHT, CONCAVE, CONVEX)\n\nNickname: `PegheadProfile` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `STRAIGHT` | Profile name: STRAIGHT, CONCAVE, CONVEX |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Peghead Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#peghead-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#peghead-profile-by-name","collection":"grasshopper","hash":"ab219a9132aca6722ab0a0dcfd4633eb","indexed_by":"docs-index"}},{"content":"Assets — Ring External Profile by Name\n\nGets an external profile Asset by name (SQUARE_DOOM_SIDES, CUTTED_OVAL, OVAL_FLATTENED_TOP, OVAL_FLATTENED_BOTTOM)\n\nNickname: `ExtProfileName` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `SQUARE_DOOM_SIDES` | Profile name: SQUARE_DOOM_SIDES, CUTTED_OVAL, OVAL_FLATTENED_TOP, OVAL_FLATTENED_BOTTOM |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Ring External Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#ring-external-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#ring-external-profile-by-name","collection":"grasshopper","hash":"967c6e28e253c0f0027dd77eca1ad35d","indexed_by":"docs-index"}},{"content":"Assets — Ring Profile by Name\n\nGets a ring profile Asset by name (HALF_ROUND, OVAL, RECTANGLE, ROUNDED_TRAPEZOID, DONUT)\n\nNickname: `RingProfileName` · Tab: Artisan › Assets\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Profile` | Text | item | `HALF_ROUND` | Profile name: HALF_ROUND, OVAL, RECTANGLE, ROUNDED_TRAPEZOID, DONUT |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Assets","section":"Ring Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#ring-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#ring-profile-by-name","collection":"grasshopper","hash":"3c7829f10a4d71b44a96b3210da3155a","indexed_by":"docs-index"}},{"content":"Assets — Asset Selector\n\nSelect an Asset from a dialog or by ID\n\nNickname: `Assets` · Tab: Artisan › Assets · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset ID _(optional)_ | `ID` | Integer | item | Asset ID to select. If not connected, use dialog. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Selected Asset |","metadata":{"title":"Assets","section":"Asset Selector","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#asset-selector","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/assets/#asset-selector","collection":"grasshopper","hash":"425c507d36e9bb24e184b93ed586fabf","indexed_by":"docs-index"}},{"content":"Default Values\n\n4 components in Artisan › Default Values.\n\nDefault Value Bool\nOutputs Bool when it has data; otherwise outputs Default Bool.\n\nNickname: `DefaultBool` · Tab: Artisan › Default Values\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bool _(optional)_ | `Bool` | Boolean | item | The boolean. If it has data, it is passed through. |\n| Default Bool _(optional)_ | `Default Bool` | Boolean | item | Fallback boolean used when Bool has no data. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bool | `Bool` | Boolean | item | Bool if present, otherwise Default Bool. |","metadata":{"title":"Default Values","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/","collection":"grasshopper","hash":"76bce1c1cb44db3a08858b465fff0436","indexed_by":"docs-index"}},{"content":"Default Values — Default Value Double\n\nOutputs Double when it has data; otherwise outputs Default Double.\n\nNickname: `DefaultDouble` · Tab: Artisan › Default Values\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Double _(optional)_ | `Double` | Number | item | The number. If it has data, it is passed through. |\n| Default Double _(optional)_ | `Default Double` | Number | item | Fallback number used when Double has no data. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Double | `Double` | Number | item | Double if present, otherwise Default Double. |","metadata":{"title":"Default Values","section":"Default Value Double","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-double","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-double","collection":"grasshopper","hash":"f809417417a11c8d76c4763fced3c71b","indexed_by":"docs-index"}},{"content":"Default Values — Default Value Int\n\nOutputs Value when it has data; otherwise outputs Default Value.\n\nNickname: `DefaultInt` · Tab: Artisan › Default Values\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Int _(optional)_ | `Int` | Integer | item | The integer. If it has data, it is passed through. |\n| Default Int _(optional)_ | `Default Int` | Integer | item | Fallback integer used when Int has no data. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Int | `Int` | Integer | item | Int if present, otherwise Default Int. |","metadata":{"title":"Default Values","section":"Default Value Int","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-int","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-int","collection":"grasshopper","hash":"1b9cfaeea2a229c2eb4cf8d27fed47da","indexed_by":"docs-index"}},{"content":"Default Values — Default Value String\n\nOutputs String when it has data; otherwise outputs Default String.\n\nNickname: `DefaultString` · Tab: Artisan › Default Values\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| String _(optional)_ | `String` | Text | item | The text. If it has data, it is passed through. |\n| Default String _(optional)_ | `Default String` | Text | item | Fallback text used when String has no data. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| String | `String` | Text | item | String if present, otherwise Default String. |","metadata":{"title":"Default Values","section":"Default Value String","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-string","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/default-values/#default-value-string","collection":"grasshopper","hash":"996f08879024a302d320a19360555510","indexed_by":"docs-index"}},{"content":"Exporters\n\n13 components in Artisan › Exporters.\n\nExport Info\nExports product info as JSON (name, descriptions, style_id, default_sku).\n\nNickname: `Export Info` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Set to true to enable saving |\n| Name _(optional)_ | `Name` | Text | item | — | Product name |\n| Short Description _(optional)_ | `Short Desc` | Text | item | — | Short description of the product |\n| Description _(optional)_ | `Description` | Text | item | — | Full description of the product |\n| StyleID _(optional)_ | `StyleID` | Text | item | — | Style identifier. If empty, uses the Grasshopper filename. |\n| Default SKU _(optional)_ | `Default SKU` | Text | item | — | Default SKU for the product |\n| Path _(optional)_ | `Path` | Text | item | — | Directory path where the file will be saved |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | JSON content of the exported file |\n| Path | `Path` | Text | item | Path of the exported JSON file |","metadata":{"title":"Exporters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/","collection":"grasshopper","hash":"dc8ff2f8f7dc39ba6827f7a8f1d18e00","indexed_by":"docs-index"}},{"content":"Exporters — Export UI Files\n\nSaves JSON for UI\n\nNickname: `Exporter UI` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Set to true to enable saving |\n| StyleID _(optional)_ | `StyleID` | Text | item | — | Style identifier prefix. If empty, uses the Grasshopper filename. |\n| Path _(optional)_ | `Path` | Text | item | — | Directory path where the files will be saved |\n| Text_Selectors _(optional)_ | `Selectors` | Text | item | — | JSON content for selectors (optional) |\n| Page 1 _(optional)_ | `Page1` | Text | item | — | Page name |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | JSON content of the exported file |\n| Path | `Path` | Text | item | Path of the exported JSON file |","metadata":{"title":"Exporters","section":"Export UI Files","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#export-ui-files","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#export-ui-files","collection":"grasshopper","hash":"e4f3616a446fa09a0b46cbe6dbd2577e","indexed_by":"docs-index"}},{"content":"Exporters — SKU Equals\n\nExtracts a single variant from a SKU Bundle by index.\n\nNickname: `SKU Equals` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Bundle | `Bundle` | Generic | item | — | Bundle output from SKU Super Generator |\n| Index | `Index` | Integer | item | `0` | Variant index (0-based counter) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| SKU | `SKU` | Text | item | Sequential SKU at index (e.g. StyleID-000001) |\n| StyleID | `StyleID` | Text | item | Style identifier |\n| Geom Value | `Geom Val` | Text | list | Geometric values at index (split by '-') |\n| Geom SKU | `Geom SKU` | Text | item | Geometric SKU at index |\n| Geom SKU Long | `Geom SKU Long` | Text | item | StyleID-GeomSKU |\n| Variant Value | `Var Val` | Text | list | Variant values at index (split by '-') |\n| Variant SKU | `Var SKU` | Text | item | Variant SKU at index |\n| Index | `Idx` | Integer | item | Input variant index |\n| Geom Index | `Geom Idx` | Integer | item | Resolved geometric index from the variant SKU |","metadata":{"title":"Exporters","section":"SKU Equals","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-equals","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-equals","collection":"grasshopper","hash":"2f3a33cad643205a50c3530c1e262b28","indexed_by":"docs-index"}},{"content":"Exporters — SKU Super Generator\n\nGenerate all SKU combinations from fixed Metal/Gem inputs and dynamic panels (value,sku,name triples).\n\nNickname: `SKU Super Generator` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `true` | Enable or disable export |\n| StyleID _(optional)_ | `StyleID` | Text | item | — | Style identifier prefix. If empty, uses the Grasshopper filename. |\n| Path _(optional)_ | `Path` | Text | item | — | Directory path where the SKU JSON will be saved. If empty, uses the Grasshopper definition folder. |\n| Version | `Version` | Integer | item | `1` | Geometry version number |\n| Metal 1 _(optional)_ | `M1` | Text | list | — | Metal 1: Metal enum value (e.g. GOLD_YELLOW_18) or value,sku,name |\n| Metal 2 _(optional)_ | `M2` | Text | list | — | Metal 2: Metal enum value (e.g. GOLD_YELLOW_18) or value,sku,name |\n| Metal 3 _(optional)_ | `M3` | Text | list | — | Metal 3: Metal enum value (e.g. GOLD_YELLOW_18) or value,sku,name |\n| Gem 1 _(optional)_ | `G1` | Text | list | — | Gem 1 panel with lines: value,sku,name |\n| Gem 2 _(optional)_ | `G2` | Text | list | — | Gem 2 panel with lines: value,sku,name |\n| Gem 3 _(optional)_ | `G3` | Text | list | — | Gem 3 panel with lines: value,sku,name |\n| Overwrite | `Overwrite` | Boolean | item | `true` | Overwrite files if they already exist |\n| Panel 1 _(optional)_ | `P1` | Text | list | — | Panel with lines: value,sku,name |\n\nOutputs","metadata":{"title":"Exporters","section":"SKU Super Generator","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-super-generator","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-super-generator","collection":"grasshopper","hash":"845390f2bfd78adf91c63fe4ad4a4669","indexed_by":"docs-index"}},{"content":"Exporters — SKU Super Generator\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Geom Values | `Geom Val` | Text | list | Geometric Values (from dynamic panels only) |\n| Geom SKU | `Geom SKU` | Text | list | Geometric SKUs (from dynamic panels only) |\n| Max Geom | `Max Geom` | Integer | item | Total number of GeomSKUs generated |\n| Variant Values | `Var Val` | Text | list | Variant Values (Panels + Metals + Gems) |\n| Variant SKU | `Var SKU` | Text | list | Variant SKUs (Panels + Metals + Gems) |\n| Max Variants | `Max Variants` | Integer | item | Total number of Variant SKUs generated |\n| StyleID | `StyleID` | Text | item | Style identifier used |\n| SKU | `SKU` | Text | list | Sequential SKUs: StyleID-000001, StyleID-000002, ... |\n| Bundle | `Bundle` | Generic | item | All outputs packed as a dictionary for single-wire connection |\n| JSON | `JSON` | Text | item | JSON content of the SKU file |\n| File Path | `File` | Text | item | Path of the exported JSON file |","metadata":{"title":"Exporters","section":"SKU Super Generator","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-super-generator","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#sku-super-generator","collection":"grasshopper","hash":"6cc47d9ab041ccc683b30a92280e67b3","indexed_by":"docs-index"}},{"content":"Exporters — Exporter 3DM Files\n\nExport jewelry geometry to 3DM and GLB with layer organization\n\nNickname: `Exporter 3DM` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable or disable export |\n| Long Geometric SKU | `Long Geom. SKU` | Text | item | — | SKU string |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where files will be saved. If empty, uses the Grasshopper definition folder. |\n| Metal 01 _(optional)_ | `Metal 01` | Geometry | list | — | Metal geometry 01 |\n| Metal 02 _(optional)_ | `Metal 02` | Geometry | list | — | Metal geometry 02 |\n| Metal 03 _(optional)_ | `Metal 03` | Geometry | list | — | Metal geometry 03 |\n| Gem 01 _(optional)_ | `Gem 01` | Generic | list | — | Gem object 01 |\n| Gem 02 _(optional)_ | `Gem 02` | Generic | list | — | Gem object 02 |\n| Gem 03 _(optional)_ | `Gem 03` | Generic | list | — | Gem object 03 |\n| Overwrite | `Overwrite` | Boolean | item | `true` | Overwrite files if they already exist |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| File Paths | `Paths` | Text | list | Exported file paths |","metadata":{"title":"Exporters","section":"Exporter 3DM Files","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-3dm-files","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-3dm-files","collection":"grasshopper","hash":"9cbcb02338d2f063888f88313130e239","indexed_by":"docs-index"}},{"content":"Exporters — Exporter GLB Base64\n\nExport jewelry geometry to a GLB Base64 string (no disk write)\n\nNickname: `Exporter GLB64` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Metal 01 _(optional)_ | `Metal 01` | Geometry | list | Metal geometry 01 |\n| Metal 02 _(optional)_ | `Metal 02` | Geometry | list | Metal geometry 02 |\n| Metal 03 _(optional)_ | `Metal 03` | Geometry | list | Metal geometry 03 |\n| Gem 01 _(optional)_ | `Gem 01` | Generic | list | Gem object 01 |\n| Gem 02 _(optional)_ | `Gem 02` | Generic | list | Gem object 02 |\n| Gem 03 _(optional)_ | `Gem 03` | Generic | list | Gem object 03 |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Base64 | `Base64` | Text | item | GLB encoded as Base64 string |","metadata":{"title":"Exporters","section":"Exporter GLB Base64","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-glb-base64","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-glb-base64","collection":"grasshopper","hash":"6bf4bedb5fda9e7eb179cf4a533bc91b","indexed_by":"docs-index"}},{"content":"Exporters — Exporter GLB Files\n\nExport jewelry geometry to 3DM and GLB with layer organization\n\nNickname: `Exporter GLB` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable or disable export |\n| Long Geometric SKU | `Long Geom. SKU` | Text | item | — | SKU string |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where files will be saved. If empty, uses the Grasshopper definition folder. |\n| Metal 01 _(optional)_ | `Metal 01` | Geometry | list | — | Metal geometry 01 |\n| Metal 02 _(optional)_ | `Metal 02` | Geometry | list | — | Metal geometry 02 |\n| Metal 03 _(optional)_ | `Metal 03` | Geometry | list | — | Metal geometry 03 |\n| Gem 01 _(optional)_ | `Gem 01` | Generic | list | — | Gem object 01 |\n| Gem 02 _(optional)_ | `Gem 02` | Generic | list | — | Gem object 02 |\n| Gem 03 _(optional)_ | `Gem 03` | Generic | list | — | Gem object 03 |\n| Overwrite | `Overwrite` | Boolean | item | `true` | Overwrite files if they already exist |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| File Paths | `Paths` | Text | list | Exported file paths |","metadata":{"title":"Exporters","section":"Exporter GLB Files","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-glb-files","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-glb-files","collection":"grasshopper","hash":"066fe2ef69c42149385cd8c192007873","indexed_by":"docs-index"}},{"content":"Exporters — Exporter Manufacturing STL\n\nExport manufacturing geometry to STL\n\nNickname: `Export STL` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable or disable export |\n| Long Geometric SKU | `Long Geom. SKU` | Text | item | — | SKU string |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where files will be saved. If empty, uses the Grasshopper definition folder. |\n| Metal 01 _(optional)_ | `Metal 01` | Geometry | list | — | Metal geometry 01 |\n| Metal 02 _(optional)_ | `Metal 02` | Geometry | list | — | Metal geometry 02 |\n| Metal 03 _(optional)_ | `Metal 03` | Geometry | list | — | Metal geometry 03 |\n| Overwrite | `Overwrite` | Boolean | item | `true` | Overwrite files if they already exist |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| File Paths | `Paths` | Text | list | Exported STL file paths |","metadata":{"title":"Exporters","section":"Exporter Manufacturing STL","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-manufacturing-stl","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-manufacturing-stl","collection":"grasshopper","hash":"9e0265b9e40fdde8b3b9328589359392","indexed_by":"docs-index"}},{"content":"Exporters — Exporter STL Base64\n\nExport manufacturing geometry to an STL Base64 string (no disk write)\n\nNickname: `Exporter STL64` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Metal 01 _(optional)_ | `Metal 01` | Geometry | list | Metal geometry 01 |\n| Metal 02 _(optional)_ | `Metal 02` | Geometry | list | Metal geometry 02 |\n| Metal 03 _(optional)_ | `Metal 03` | Geometry | list | Metal geometry 03 |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Base64 | `Base64` | Text | item | STL encoded as Base64 string |","metadata":{"title":"Exporters","section":"Exporter STL Base64","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-stl-base64","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#exporter-stl-base64","collection":"grasshopper","hash":"903fdf9a88bb2e8b9ee2a6cc7de76815","indexed_by":"docs-index"}},{"content":"Exporters — Semantic Export\n\nSemantic file export. Add extra Semantic inputs via Zoom (+/-).\n\nNickname: `Semantic` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable or disable export |\n| SKU _(optional)_ | `SKU` | Text | item | — | SKU string |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where files will be saved. If empty, uses the Grasshopper definition folder. |\n| Design Type _(optional)_ | `Type` | Text | item | — | Design type (e.g. Ring, Bracelet, Earring...) |\n| Overwrite | `Overwrite` | Boolean | item | `false` | Overwrite files if they already exist |\n| Semantic 1 _(optional)_ | `S1` | Text | item | — | Semantic text fragment |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Semantic Text | `Semantic` | Text | item | Generated semantic text |\n| File Paths | `Paths` | Text | list | Exported file paths |","metadata":{"title":"Exporters","section":"Semantic Export","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#semantic-export","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#semantic-export","collection":"grasshopper","hash":"b1fbf00ca9b4c5cf695541777de73563","indexed_by":"docs-index"}},{"content":"Exporters — Taxonomy Exporter\n\nCombines global, center_stone, gemset, shank and eternity taxonomies into a single JSON.\n\nNickname: `Taxonomy Exporter` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Global _(optional)_ | `Global` | Generic | item | Global taxonomy dictionary |\n| Center Stone _(optional)_ | `Center Stone` | Generic | item | Center stone taxonomy dictionary |\n| Gemset _(optional)_ | `Gemset` | Generic | item | Gemset taxonomy dictionary |\n| Shank _(optional)_ | `Shank` | Generic | item | Shank taxonomy dictionary |\n| Eternity _(optional)_ | `Eternity` | Generic | item | Eternity taxonomy dictionary |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Combined taxonomy as JSON |","metadata":{"title":"Exporters","section":"Taxonomy Exporter","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#taxonomy-exporter","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#taxonomy-exporter","collection":"grasshopper","hash":"d82df95423b231f496f3e73d2374ae7d","indexed_by":"docs-index"}},{"content":"Exporters — Technical Chart\n\nCalculates gem count/carats and metal volume/weight from MetalInfo and GemInfo inputs\n\nNickname: `Technical Chart` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable or disable export |\n| SKU _(optional)_ | `SKU` | Text | item | — | SKU string, used as the filename for the exported .tech file |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where the .tech file will be saved. If empty, uses the Grasshopper definition folder. |\n| Design Type _(optional)_ | `DT` | Text | item | — | Design type from DesignTypeList component |\n| Metal 1 _(optional)_ | `M1` | Generic | item | — | MetalInfo object from Metal Info component |\n| Metal 2 _(optional)_ | `M2` | Generic | item | — | MetalInfo object from Metal Info component |\n| Metal 3 _(optional)_ | `M3` | Generic | item | — | MetalInfo object from Metal Info component |\n| Overwrite | `Overwrite` | Boolean | item | `false` | Overwrite files if they already exist |\n| GemInfo 1 _(optional)_ | `G1` | Generic | item | — | GemInfo object from Gem Info component |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Summary | `Summary` | Text | item | Human-readable breakdown summary |\n| Exported Path | `Exported` | Text | item | Path of the exported JSON file, or empty if not exported |\n| JSON | `JSON` | Text | item | JSON content of the breakdown |\n| Semantic | `Semantic` | Text | item | Semantic description of metals and gems for AI/search indexing |","metadata":{"title":"Exporters","section":"Technical Chart","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#technical-chart","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#technical-chart","collection":"grasshopper","hash":"50f5cf3961d5b9ba63fb6e7f4f2f9cbd","indexed_by":"docs-index"}},{"content":"Exporters — Technical Chart 64\n\nCalculates gem count/carats and metal volume/weight; outputs JSON only (no disk write)\n\nNickname: `Tech Chart 64` · Tab: Artisan › Exporters\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Design Type _(optional)_ | `DT` | Text | item | Design type from DesignTypeList component |\n| Metal 1 _(optional)_ | `M1` | Generic | item | MetalInfo object from Metal Info component |\n| Metal 2 _(optional)_ | `M2` | Generic | item | MetalInfo object from Metal Info component |\n| Metal 3 _(optional)_ | `M3` | Generic | item | MetalInfo object from Metal Info component |\n| GemInfo 1 _(optional)_ | `G1` | Generic | item | GemInfo object from Gem Info component |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | JSON content of the breakdown |","metadata":{"title":"Exporters","section":"Technical Chart 64","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#technical-chart-64","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/exporters/#technical-chart-64","collection":"grasshopper","hash":"bf1ac61173eac2b27a73ed7912ee8818","indexed_by":"docs-index"}},{"content":"Manufacturing\n\n4 components in Artisan › Manufacturing.\n\nSprue External Tree\nCreates an external sprue tree from a base point and contact points\n\nNickname: `Sprue External Tree` · Tab: Artisan › Manufacturing\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Enable this sprue tree |\n| Base Point _(optional)_ | `Pt1` | Point | item | `Point3d.Unset` | Base point for the sprue tree |\n| Contact Points | `Contacts` | Point | list | — | Contact points for branches |\n| Height _(optional)_ | `H` | Number | item | `20.0` | Tree height |\n| Top Diameter _(optional)_ | `Top` | Number | item | `3.0` | Top diameter |\n| Bottom Diameter _(optional)_ | `Bottom` | Number | item | `5.0` | Bottom diameter |\n| Branch Trunk Diameter _(optional)_ | `Trunk` | Number | item | `2.0` | Branch trunk diameter |\n| Branch Contact Diameter _(optional)_ | `Contact` | Number | item | `0.8` | Branch contact diameter |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Meshes | `Meshes` | Mesh | list | Resulting meshes |","metadata":{"title":"Manufacturing","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/","collection":"grasshopper","hash":"eb693e60145eef1e868f8386c183ea26","indexed_by":"docs-index"}},{"content":"Manufacturing — Sprue Inner Branch\n\nCreates an inner sprue branch from a base point and contact points\n\nNickname: `Sprue Inner Branch` · Tab: Artisan › Manufacturing\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Enable this sprue branch |\n| Base Point _(optional)_ | `Pt1` | Point | item | `Point3d.Unset` | Base point for the sprue branch |\n| Contact Points | `Contacts` | Point | list | — | Contact points for branches |\n| Centre Diameter _(optional)_ | `Centre Dia.` | Number | item | `3.0` | Centre diameter |\n| Contact Diameter _(optional)_ | `Contact Dia` | Number | item | `0.8` | Contact diameter |\n| Symmetry _(optional)_ | `Sym` | Text | item | `NONE` | Symmetry mode: NONE, X, Y, QUAD |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Meshes | `Meshes` | Mesh | list | Resulting meshes |","metadata":{"title":"Manufacturing","section":"Sprue Inner Branch","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-inner-branch","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-inner-branch","collection":"grasshopper","hash":"8a3f9010ff06ad549590eed60b7cee58","indexed_by":"docs-index"}},{"content":"Manufacturing — Sprue Inner Tree\n\nCreates an inner sprue tree from a base point and contact points\n\nNickname: `Sprue Inner Tree` · Tab: Artisan › Manufacturing\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Enable this sprue tree |\n| Base Point _(optional)_ | `Base Pt` | Point | item | `Point3d.Unset` | Base point for the sprue tree |\n| Contact Points | `Contact Pts` | Point | list | — | Contact points for branches |\n| Top Diameter _(optional)_ | `Top Dia.` | Number | item | `3.0` | Top diameter |\n| Bottom Diameter _(optional)_ | `Bottom Dia.` | Number | item | `5.0` | Bottom diameter |\n| Contact Diameter _(optional)_ | `Contact Dia.` | Number | item | `0.8` | Branch contact diameter |\n| Height _(optional)_ | `H` | Number | item | `10.0` | Tree height |\n| Symmetry _(optional)_ | `Sym` | Text | item | `NONE` | Symmetry mode: NONE, X, Y, QUAD |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Meshes | `Meshes` | Geometry | list | Resulting meshes |","metadata":{"title":"Manufacturing","section":"Sprue Inner Tree","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-inner-tree","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-inner-tree","collection":"grasshopper","hash":"15683b69770310bb160d1ec388b1cef2","indexed_by":"docs-index"}},{"content":"Manufacturing — Sprue Single\n\nCreates a single sprue from a base point and parameters\n\nNickname: `Sprue Single` · Tab: Artisan › Manufacturing\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Enable this sprue |\n| Base Point _(optional)_ | `Pt` | Point | item | `Point3d.Origin` | Base point for the sprue |\n| Height _(optional)_ | `H` | Number | item | `2.0` | Sprue height |\n| Top X _(optional)_ | `TopX` | Number | item | `1.5` | Top X size |\n| Top Y _(optional)_ | `TopY` | Number | item | `1.5` | Top Y size |\n| Bottom X _(optional)_ | `BottomX` | Number | item | `1.5` | Bottom X size |\n| Bottom Y _(optional)_ | `BottomY` | Number | item | `1.5` | Bottom Y size |\n| Inside Ring _(optional)_ | `Inside` | Number | item | `0.2` | Inside ring offset |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Sprue Mesh | `Mesh` | Mesh | item | Sprue mesh |","metadata":{"title":"Manufacturing","section":"Sprue Single","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-single","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/manufacturing/#sprue-single","collection":"grasshopper","hash":"101ee9f9fc1191b34d30f2c1c7b37fac","indexed_by":"docs-index"}},{"content":"Semantic\n\n1 component in Artisan › Semantic.\n\nSemantic From Gems\nGenerates a semantic text description from a list of gems, grouping by shape, compound and size\n\nNickname: `Gems Semantic` · Tab: Artisan › Semantic\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | List of gem objects |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Semantic | `Semantic` | Text | item | Semantic text description of the gems |","metadata":{"title":"Semantic","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/semantic/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/semantic/","collection":"grasshopper","hash":"3d2fd9cf57827fb4d6d7fd0215feb6ae","indexed_by":"docs-index"}},{"content":"Utils\n\n13 components in Artisan › Utils.\n\nDictionary Query\nRetrieve a value from a Dictionary using a key\n\nNickname: `Dict Query` · Tab: Artisan › Utils\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Dictionary | `Dict` | Generic | item | Dictionary to search |\n| Key _(optional)_ | `Key` | Text | item | Key to look for |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Value | `Value` | Generic | item | Value associated with the key |\n| Keys | `Keys` | Text | list | All available keys in the Dictionary |","metadata":{"title":"Utils","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/","collection":"grasshopper","hash":"4e4d94d113862e46742a251a08a39b3f","indexed_by":"docs-index"}},{"content":"Utils — Halo Channel Profile by Name\n\nGets a halo channel profile Asset by name (SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS)\n\nNickname: `HaloChProfile` · Tab: Artisan › Utils\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile Name | `Name` | Text | item | `SOFT_DOOM` | Profile name: SOFT_DOOM, DOMMED_RECTANGLE, FLAT_ROUNDED_CORNERS |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Asset | `A` | Generic | item | Profile Asset |","metadata":{"title":"Utils","section":"Halo Channel Profile by Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#halo-channel-profile-by-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#halo-channel-profile-by-name","collection":"grasshopper","hash":"104f2cb89568f037697c09ba08ae2bed","indexed_by":"docs-index"}},{"content":"Utils — SKU Combiner\n\nCombine geometric SKU list with material/gem options into all possible combinations.\n\nNickname: `SKU Combiner` · Tab: Artisan › Utils\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `false` | Enable saving JSON to disk |\n| Prefix | `Prefix` | Text | item | — | Style identifier prefix (e.g. RIN001) |\n| Path _(optional)_ | `Path` | Text | item | — | Folder path where the JSON file will be saved |\n| SKU Geometric | `SKU's Geometric` | Text | list | — | Geometric SKU list |\n| Geometry Version _(optional)_ | `Version` | Integer | item | `1` | Geometry version number |\n| Metal 01 | `M1` | Text | list | — | Lines: value,sku,name |\n| Metal 02 | `M2` | Text | list | — | Lines: value,sku,name |\n| Metal 03 | `M3` | Text | list | — | Lines: value,sku,name |\n| Gem 01 | `G1` | Text | list | — | Lines: value,sku,name |\n| Gem 02 | `G2` | Text | list | — | Lines: value,sku,name |\n| Gem 03 | `G3` | Text | list | — | Lines: value,sku,name |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| SKU | `SKU` | Text | list | Combinatorial SKUs |\n| Max | `Max` | Integer | item | Total number of SKUs generated |\n| JSON | `JSON` | Text | item | JSON array with all SKU combinations |\n| Exported Path | `Exported` | Text | item | Path of the exported JSON file, or empty if not exported |","metadata":{"title":"Utils","section":"SKU Combiner","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#sku-combiner","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#sku-combiner","collection":"grasshopper","hash":"1e863476e463c91fbd7ad4519f3e6513","indexed_by":"docs-index"}},{"content":"Utils — Selector\n\nCreate a Selector object from parameters and a panel of items (value,sku,name).\n\nNickname: `Selector` · Tab: Artisan › Utils\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| type | `Type` | Text | item | — | Selector type |\n| name | `Name` | Text | item | — | This is the name group on the configurator |\n| ui_index | `UI Position` | Integer | item | `-1` | Position in the UI |\n| page_index | `Page Index` | Integer | item | `0` | Page index |\n| Panel | `Panel` | Text | list | — | Panel with lines: value,sku,name |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Selector | `Sel` | Generic | item | Selector object |","metadata":{"title":"Utils","section":"Selector","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector","collection":"grasshopper","hash":"39480b4de5be00de7bb4be66b2c9b81b","indexed_by":"docs-index"}},{"content":"Utils — Selector Hub\n\nCombine multiple Selectors into one JSON output.\n\nNickname: `Selector Hub` · Tab: Artisan › Utils\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Selector 1 | `S1` | Generic | item | Selector object |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Combined Selectors JSON |","metadata":{"title":"Utils","section":"Selector Hub","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector-hub","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector-hub","collection":"grasshopper","hash":"4ac1cd35de640af3538f576d000379ba","indexed_by":"docs-index"}},{"content":"Utils — Selector Types\n\nPredefined list of selector types.\n\nNickname: `Selector Types` · Tab: Artisan › Utils · Value list — a dropdown you pick from, with no inputs\n\nValues\n\n| Label | Value |\n|---|---|\n| Gem Shape | `GEM_SHAPE` |\n| Gem Size | `GEM_SIZE_CT` |\n| Ring Size | `RING_SIZE` |\n| Metal 1 | `METAL_1` |\n| Metal 2 | `METAL_2` |\n| Metal 3 | `METAL_3` |\n| Gem Compound 1 | `GEM_1` |\n| Gem Compound 2 | `GEM_2` |\n| Gem Compound 3 | `GEM_3` |","metadata":{"title":"Utils","section":"Selector Types","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector-types","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#selector-types","collection":"grasshopper","hash":"5966d86a1fb61423b6a4960498337a14","indexed_by":"docs-index"}},{"content":"Utils — Counter\n\nCounts ticks using a timer-like behaviour\n\nNickname: `Counter` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Run | `Run` | Boolean | item | `false` | Start or stop the timer |\n| Reset | `Reset` | Boolean | item | `false` | Reset the counter |\n| Max | `Max` | Integer | item | `0` | Maximum count before stopping (0 = no limit) |\n| Interval | `I` | Integer | item | `1000` | Milliseconds between ticks |\n| Increment | `Increment` | Boolean | item | `false` | Connect a button: each press increments the counter by one |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Count | `Count` | Integer | item | Current tick count |","metadata":{"title":"Utils","section":"Counter","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#counter","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#counter","collection":"grasshopper","hash":"685c97d56b46a0c5d59ec771905a50eb","indexed_by":"docs-index"}},{"content":"Utils — GH Path\n\nResolve export folder path. If input is null/empty, returns the .gh definition folder.\n\nNickname: `GH Path` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Custom Path _(optional)_ | `Path` | Text | item | Custom export path. If empty, use Grasshopper definition folder. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Resolved Path | `Path` | Text | item | Final export path |","metadata":{"title":"Utils","section":"GH Path","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#gh-path","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#gh-path","collection":"grasshopper","hash":"2bb39c76a0d5207caf1dabf855dd52f7","indexed_by":"docs-index"}},{"content":"Utils — Plane Translate\n\nTranslates a plane along its local axes\n\nNickname: `PlnTrans` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `P` | Plane | item | `Plane.WorldXY` | Base plane to move |\n| X | `X` | Number | item | `0.0` | Translation along the plane's X axis |\n| Y | `Y` | Number | item | `0.0` | Translation along the plane's Y axis |\n| Z | `Z` | Number | item | `0.0` | Translation along the plane's Z axis |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Plane | `P` | Plane | item | Translated plane |","metadata":{"title":"Utils","section":"Plane Translate","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#plane-translate","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#plane-translate","collection":"grasshopper","hash":"6799c54ee002166182f7d1b4c095f034","indexed_by":"docs-index"}},{"content":"Utils — Progress Bar\n\nDisplays progress as a percentage\n\nNickname: `Progress` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Current | `Current` | Integer | item | `0` | Current index (0-based) |\n| Max | `Max` | Integer | item | `100` | Maximum index |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Percentage | `%` | Number | item | Progress percentage (0-100) |","metadata":{"title":"Utils","section":"Progress Bar","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#progress-bar","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#progress-bar","collection":"grasshopper","hash":"1242a9c72945c619b0230a6657b1baca","indexed_by":"docs-index"}},{"content":"Utils — Resolve GH File Name\n\nResolve the current Grasshopper definition file name. If input is null/empty, returns the .gh definition file name.\n\nNickname: `GHFileName` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Custom Name _(optional)_ | `Name` | Text | item | Custom file name. If empty, use Grasshopper definition file name. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Resolved Name | `Name` | Text | item | Final file name |","metadata":{"title":"Utils","section":"Resolve GH File Name","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#resolve-gh-file-name","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#resolve-gh-file-name","collection":"grasshopper","hash":"60633ae842eb105ffc8fc51c63ddbd02","indexed_by":"docs-index"}},{"content":"Utils — RhinoArtisan Settings\n\nControl global settings for RhinoArtisan plugin\n\nNickname: `Settings` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n_This component has no inputs._\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| License Type | `License` | Text | item | Current license type |","metadata":{"title":"Utils","section":"RhinoArtisan Settings","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#rhinoartisan-settings","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#rhinoartisan-settings","collection":"grasshopper","hash":"453562a90b3c7fb7c13ba9d2fe2968f4","indexed_by":"docs-index"}},{"content":"Utils — String In List\n\nChecks if a string exists in a list of strings\n\nNickname: `StrInList` · Tab: Artisan › Utils · In the tab's dropdown, not on the ribbon face\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Text _(optional)_ | `T` | Text | item | Text to search |\n| List _(optional)_ | `L` | Text | list | List of strings |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Exists | `Exists` | Boolean | item | True if text exists in list |","metadata":{"title":"Utils","section":"String In List","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#string-in-list","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/utils/#string-in-list","collection":"grasshopper","hash":"829564651f106f3c96a017d21fd4df02","indexed_by":"docs-index"}},{"content":"Value List\n\n5 components in Artisan › Value List.\n\nComputation Mode\nPredefined list of computation modes (Render / Manufacturing).\n\nNickname: `Computation Mode` · Tab: Artisan › Value List · Value list — a dropdown you pick from, with no inputs\n\nValues\n\n| Label | Value |\n|---|---|\n| Render | `RENDER` |\n| Manufacturing | `MANUFACTURING` |","metadata":{"title":"Value List","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/","collection":"grasshopper","hash":"6cb76c3a5af7e239d46ee3fd586b9a23","indexed_by":"docs-index"}},{"content":"Value List — Design Type\n\nPredefined list of design types.\n\nNickname: `Design Type` · Tab: Artisan › Value List · Value list — a dropdown you pick from, with no inputs\n\nValues\n\n| Label | Value |\n|---|---|\n| Bracelet | `BRACELET` |\n| Earring | `EARRING` |\n| Necklace | `NECKLACE` |\n| Pendant | `PENDANT` |\n| Ring | `RING` |\n| Other | `OTHER` |","metadata":{"title":"Value List","section":"Design Type","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#design-type","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#design-type","collection":"grasshopper","hash":"a494efa3028330faf599a3216054d7bb","indexed_by":"docs-index"}},{"content":"Value List — Gem Compound\n\nPredefined list of gem compounds.\n\nNickname: `Compound` · Tab: Artisan › Value List · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 36 values\n\n| Label | Value |\n|---|---|\n| Diamond | `DIAMOND` |\n| Ruby | `RUBY` |\n| Emerald | `EMERALD` |\n| Sapphire | `SAPPHIRE` |\n| Amethyst | `AMETHYST` |\n| Aquamarine | `AQUAMARINE` |\n| Morganite | `MORGANITE` |\n| Chalcedony | `CHALCEDONY` |\n| Citrine | `CITRINE` |\n| Citrine Yellow | `CITRINE_YELLOW` |\n| Citrine Orange Yellow | `CITRINE_ORANGE_YELLOW` |\n| Diamond Champagne | `DIAMOND_CHAMPAGNE` |\n| Peridot Yellow Green | `PERIDOT_YELLOW_GREEN` |\n| Peridot Green | `PERIDOT_GREEN` |\n| Emerald Yellow Green | `EMERALD_YELLOW_GREEN` |\n| Topaz Red | `TOPAZ_RED` |\n| Topaz Violet | `TOPAZ_VIOLET` |\n| Topaz Pink | `TOPAZ_PINK` |\n| Topaz Blue | `TOPAZ_BLUE` |\n| Topaz Green | `TOPAZ_GREEN` |\n| Topaz Brown | `TOPAZ_BROWN` |\n| Tourmaline Black | `TOURMALINE_BLACK` |\n| Tourmaline Pink | `TOURMALINE_PINK` |\n| Tourmaline Blue | `TOURMALINE_BLUE` |\n| Tourmaline Green | `TOURMALINE_GREEN` |\n| Tanzanite | `TANZANITE` |\n| Tanzanite Purple | `TANZANITE_PURPLE` |\n| Tanzanite Green | `TANZANITE_GREEN` |\n| Spessartite | `SPESSARTITE` |\n| Spessartite Blue | `SPESSARTITE_BLUE` |\n| Quartz | `QUARTZ` |\n| Quartz Rose | `QUARTZ_ROSE` |\n| Quartz Smoky Gray | `QUARTZ_SMOKY_GRAY` |\n| Quartz Smoky Brown | `QUARTZ_SMOKY_BROWN` |\n| Moissanite | `MOISSANITE` |\n| Peridot | `PERIDOT` |","metadata":{"title":"Value List","section":"Gem Compound","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#gem-compound","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#gem-compound","collection":"grasshopper","hash":"0d0c28b879e4c44f19678712e7097f0b","indexed_by":"docs-index"}},{"content":"Value List — Gem Setting Type\n\nPredefined list of gem setting types.\n\nNickname: `Setting` · Tab: Artisan › Value List · Value list — a dropdown you pick from, with no inputs\n\nValues\n\n| Label | Value |\n|---|---|\n| Prongs | `PRONGS` |\n| Pave | `PAVE` |\n| Channel | `CHANNEL` |\n| Flush | `FLUSH` |\n| Bezel | `BEZEL` |\n| Pressure | `PRESSURE` |\n| Wax | `WAX` |\n| Other | `OTHER` |","metadata":{"title":"Value List","section":"Gem Setting Type","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#gem-setting-type","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#gem-setting-type","collection":"grasshopper","hash":"66a18cea40d520e6e46dbb68dae97a03","indexed_by":"docs-index"}},{"content":"Value List — Sub-Design Type\n\nPredefined list of sub-design types.\n\nNickname: `Sub-Design Type` · Tab: Artisan › Value List · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 39 values\n\n| Label | Value |\n|---|---|\n| Bracelet Bangle | `Bracelet Bangle` |\n| Bracelet | `Bracelet` |\n| Bracelet Tennis | `Bracelet Tennis` |\n| Earring Cluster | `Earring Cluster` |\n| Earring Drop | `Earring Drop` |\n| Earring Fantasy | `Earring Fantasy` |\n| Earring Halo | `Earring Halo` |\n| Earring Hoop | `Earring Hoop` |\n| Earring Pave | `Earring Pave` |\n| Earring Stud | `Earring Stud` |\n| Eternity Band | `Eternity Band` |\n| Nameplate | `Nameplate` |\n| Necklace Fantasy | `Necklace Fantasy` |\n| Necklace Tennis | `Necklace Tennis` |\n| Pendant Circle | `Pendant Circle` |\n| Pendant Cluster | `Pendant Cluster` |\n| Pendant Cross | `Pendant Cross` |\n| Pendant Drop | `Pendant Drop` |\n| Pendant Fantasy | `Pendant Fantasy` |\n| Pendant Halo | `Pendant Halo` |\n| Pendant Heart | `Pendant Heart` |\n| Pendant Pave | `Pendant Pave` |\n| Pendant Solitaire | `Pendant Solitaire` |\n| Ring 3 Stones | `Ring 3 Stones` |\n| Ring 5 Stones | `Ring 5 Stones` |\n| Ring 7 Stones | `Ring 7 Stones` |\n| Ring Bezel | `Ring Bezel` |\n| Ring Cluster | `Ring Cluster` |\n| Ring Fantasy | `Ring Fantasy` |\n| Ring Halo | `Ring Halo` |\n| Ring Pave | `Ring Pave` |\n| Ring Solitaire | `Ring Solitaire` |\n| Ring Tension | `Ring Tension` |\n| Ring Trilogy | `Ring Trilogy` |\n| Ring Vintage | `Ring Vintage` |\n| Signet Ring | `Signet Ring` |\n| Wedding Band | `Wedding Band` |\n| Wedding Band Plain | `Wedding Band Plain` |\n| Wedding Band with diamonds | `Wedding Band with diamonds` |","metadata":{"title":"Value List","section":"Sub-Design Type","url":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#sub-design-type","source":"https://www.rhinoartisan.com/docs/grasshopper/components/artisan/value-list/#sub-design-type","collection":"grasshopper","hash":"db13356ca1192df90e053e13d2afb6ac","indexed_by":"docs-index"}},{"content":"Gems\n\nCreate individual stones by carat, size or shape, and read their properties.\n\n24 components in 6 groups.\n\n- Gems — 10 components: Center Stone, Center Stone for Solitaire Rings, Gem, Gem by Carat, Gem by Carat for Solitaire Rings, Gem by XYZ, Three Stones, Toi et Moi, Gem Info, Metal Info.\n- Cutter — 2 components: Cutter, Cutter - Parameters.\n- Gems By Curve — 4 components: Gems on Curve, Gems on Curve - Cutter Params, Gems on Curve - Gem Params, Gems on Curve - Prong Params.\n- Gems By Network — 1 component: Gems by Network.\n- Gems On 2 Curves — 2 components: Gems on 2 Curves, Gems on 2 Curves - Params.\n- Micro Setting — 5 components: MicroSetting, MicroSetting - Channel, MicroSetting - Cutters, MicroSetting - Row Prongs, MicroSetting - V-Cutters.","metadata":{"title":"Gems","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/","collection":"grasshopper","hash":"0d78f99c258f9a94ad5ed3ad7451fb99","indexed_by":"docs-index"}},{"content":"Cutter\n\n2 components in Gems › Cutter.\n\nCutter\nCreates a Cutter object from a Gem and parameters\n\nNickname: `Cutter` · Tab: Gems › Cutter\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Gem for the cutter |\n| Cutter Params _(optional)_ | `Params` | Generic | item | Cutter parameters dictionary |\n| Cutter JSON _(optional)_ | `JSON` | Text | item | JSON representation of a Cutter |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the bezel |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |","metadata":{"title":"Cutter","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/cutter/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/cutter/","collection":"grasshopper","hash":"94d740c54df6c44318aca2cddd637d80","indexed_by":"docs-index"}},{"content":"Cutter — Cutter - Parameters\n\nDefine the parameters for a cutter\n\nNickname: `Cutter Params` · Tab: Gems › Cutter\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Height Top | `HT` | Number | item | `100.0` | Height of the top |\n| Size Top | `ST` | Number | item | `40.0` | Size of the top |\n| Height Crown | `HC` | Number | item | `34.0` | Height of the crown |\n| Gem Inside | `GI` | Number | item | `0.0` | Gem inside percentage |\n| Height Girdle | `HG` | Number | item | `3.0` | Height of the girdle |\n| Size Drill | `SD` | Number | item | `40.0` | Size of the drill |\n| Height Pavilion | `HP` | Number | item | `71.0` | Height of the pavilion |\n| Size Bottom | `SB` | Number | item | `40.0` | Size of the bottom |\n| Height Drill | `HD` | Number | item | `200.0` | Height of the drill |\n| Drill Type | `DT` | Integer | item | `0` | Type of drill |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutter Parameters | `Cutter` | Generic | item | Cutter parameters |","metadata":{"title":"Cutter","section":"Cutter - Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/cutter/#cutter---parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/cutter/#cutter---parameters","collection":"grasshopper","hash":"66317adb8424884837b1d29e4e8100aa","indexed_by":"docs-index"}},{"content":"Gems By Curve\n\n4 components in Gems › Gems By Curve.\n\nGems on Curve\nPlaces gems along a curve with optional prongs and cutters\n\nNickname: `GemsOnCrv` · Tab: Gems › Gems By Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Curve | `Crv` | Curve | item | Base curve for gem placement |\n| Orientation Geometry _(optional)_ | `Geo` | Geometry | list | Geometry for gem orientation: Mesh, Brep or SubD (optional) |\n| Gem Params _(optional)_ | `Gems` | Generic | item | Gem parameters (from Gems on Curve - Gem Params) |\n| Prong Params _(optional)_ | `Prongs` | Generic | item | Prong parameters (from Gems on Curve - Prong Params) |\n| Cutter Params _(optional)_ | `Cutters` | Generic | item | Cutter parameters (from Gems on Curve - Cutter Params) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | Generic | list | Gem objects |\n| Gem Meshes | `Meshes` | Geometry | list | Gem meshes |\n| Prongs | `Prongs` | Brep | list | Prong geometry |\n| Cutters | `Cutters` | Brep | list | Cutter geometry |\n| Gem Count | `Count` | Integer | item | Number of gems placed |","metadata":{"title":"Gems By Curve","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/","collection":"grasshopper","hash":"e77825701b2704054bccc4236c7241b1","indexed_by":"docs-index"}},{"content":"Gems By Curve — Gems on Curve - Cutter Params\n\nDefine cutter parameters for the Gems on Curve component\n\nNickname: `GemOnCrv Cutter` · Tab: Gems › Gems By Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `false` | Enable cutters |\n| Height Top _(optional)_ | `HTop` | Number | item | `100.0` | Height of the top section (%) |\n| Size Top _(optional)_ | `STop` | Number | item | `40.0` | Size of the top section (%) |\n| Height Crown _(optional)_ | `HCrown` | Number | item | `34.0` | Height of the crown (%) |\n| Gem Inside _(optional)_ | `GemIn` | Number | item | `0.0` | Gem inside offset |\n| Height Girdle _(optional)_ | `HGirdle` | Number | item | `3.0` | Height of the girdle (%) |\n| Size Drill _(optional)_ | `SDrill` | Number | item | `40.0` | Size of the drill (%) |\n| Height Pavilion _(optional)_ | `HPav` | Number | item | `71.0` | Height of the pavilion (%) |\n| Size Bottom _(optional)_ | `SBot` | Number | item | `40.0` | Size of the bottom (%) |\n| Height Drill _(optional)_ | `HDrill` | Number | item | `200.0` | Height of the drill (%) |\n| Drill Type _(optional)_ | `DrillType` | Integer | item | `0` | Drill type (0 or 1) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutter Params | `Cutters` | Generic | item | Cutter parameters for Gems on Curve component |","metadata":{"title":"Gems By Curve","section":"Gems on Curve - Cutter Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---cutter-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---cutter-params","collection":"grasshopper","hash":"b9eb75bc70e672effbdf5bd0a050c356","indexed_by":"docs-index"}},{"content":"Gems By Curve — Gems on Curve - Gem Params\n\nDefine gem parameters for the Gems on Curve component\n\nNickname: `GemOnCrv Gems` · Tab: Gems › Gems By Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Size _(optional)_ | `Size` | Number | item | `1.5` | Gem size in mm |\n| Distance _(optional)_ | `Dist` | Number | item | `0.2` | Distance between gems |\n| Move By Z _(optional)_ | `Z` | Number | item | `0.0` | Offset along Z axis |\n| Rotation On Curve _(optional)_ | `Rot` | Number | item | `0.0` | Rotation angle on curve (degrees) |\n| Shape _(optional)_ | `Shape` | Generic | item | — | Gem shape (index or name, e.g. 0 or ROUND) |\n| Alignment Vertical _(optional)_ | `AlignV` | Text | item | `ON_GIRDLE` | Vertical alignment: ON_GIRDLE or TOP |\n| Starting Point _(optional)_ | `Start` | Text | item | `BOUNDARY` | Starting point: BOUNDARY or CENTER |\n| Gem Orientation _(optional)_ | `Orient` | Text | item | `NATURAL` | Gem orientation: NATURAL or UPSIDE_DOWN |\n| Flip Curve _(optional)_ | `Flip` | Boolean | item | `false` | Flip curve direction |\n| Gem Rotate 90 _(optional)_ | `Rot90` | Boolean | item | `false` | Rotate gem 90 degrees |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Params | `Gems` | Generic | item | Gem parameters for Gems on Curve component |","metadata":{"title":"Gems By Curve","section":"Gems on Curve - Gem Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---gem-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---gem-params","collection":"grasshopper","hash":"6df1930002922257ea5164a645a187c9","indexed_by":"docs-index"}},{"content":"Gems By Curve — Gems on Curve - Prong Params\n\nDefine prong parameters for the Gems on Curve component\n\nNickname: `GemOnCrv Prongs` · Tab: Gems › Gems By Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `false` | Enable prongs |\n| Prong Type _(optional)_ | `Type` | Text | item | `SHARED` | Prong type: SHARED or INDIVIDUAL |\n| Diameter _(optional)_ | `Dia` | Number | item | `0.5` | Prong diameter |\n| Distance Shared _(optional)_ | `DistShared` | Number | item | `0.8` | Distance between shared prongs |\n| Height Over Girdle _(optional)_ | `HOver` | Number | item | `0.2` | Height over girdle |\n| Height Under Girdle _(optional)_ | `HUnder` | Number | item | `0.5` | Height under girdle |\n| Extension Manufacturing _(optional)_ | `ExtMfg` | Number | item | `0.5` | Extension for manufacturing |\n| Prong End Mode _(optional)_ | `EndMode` | Text | item | `DOUBLE` | End mode: SINGLE or DOUBLE |\n| Gem Pos X _(optional)_ | `PosX` | Number | item | `0.4` | Individual prong X offset from gem |\n| Gem Pos Y _(optional)_ | `PosY` | Number | item | `0.4` | Individual prong Y offset from gem |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Params | `Prongs` | Generic | item | Prong parameters for Gems on Curve component |","metadata":{"title":"Gems By Curve","section":"Gems on Curve - Prong Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---prong-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-curve/#gems-on-curve---prong-params","collection":"grasshopper","hash":"fd176593fe43bef53c147f98c196f1db","indexed_by":"docs-index"}},{"content":"Gems By Network\n\n1 component in Gems › Gems By Network.\n\nGems by Network\nPlaces gems across a network of curves with automatic gradient sizing\n\nNickname: `GemsByNet` · Tab: Gems › Gems By Network\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Curves | `Crvs` | Curve | list | — | Network of curves for gem placement |\n| Orientation Geometry _(optional)_ | `Geo` | Geometry | list | — | Mesh, Brep or SubD for gem orientation (optional) |\n| Gem Size _(optional)_ | `Size` | Number | item | `1.0` | Base gem size |\n| Gem Distance _(optional)_ | `Dist` | Number | item | `0.1` | Minimum distance between gems |\n| Move In Z _(optional)_ | `Z` | Number | item | `0.0` | Offset gems along their normal |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | Generic | list | Gem objects |\n| Gem Meshes | `Meshes` | Geometry | list | Gem meshes |\n| Node Points | `Nodes` | Point | list | Network node points used for sizing |\n| Gem Count | `Count` | Integer | item | Number of gems placed |","metadata":{"title":"Gems By Network","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-network/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-by-network/","collection":"grasshopper","hash":"976d0e55f37928b37c96080d72efb572","indexed_by":"docs-index"}},{"content":"Gems On 2 Curves\n\n2 components in Gems › Gems On 2 Curves.\n\nGems on 2 Curves\nPlaces gems between two curves using a spine or tangency algorithm\n\nNickname: `GemsOn2Crv` · Tab: Gems › Gems On 2 Curves\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Curve 1 | `Crv1` | Curve | item | First guide curve |\n| Curve 2 | `Crv2` | Curve | item | Second guide curve |\n| Params _(optional)_ | `Params` | Generic | item | Parameters (from Gems on 2 Curves - Params) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | Generic | list | Gem objects |\n| Gem Meshes | `Meshes` | Geometry | list | Gem meshes |\n| Gem Count | `Count` | Integer | item | Number of gems placed |","metadata":{"title":"Gems On 2 Curves","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-on-2-curves/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-on-2-curves/","collection":"grasshopper","hash":"3bcc736e3ff7b1352180346c5ecb73f3","indexed_by":"docs-index"}},{"content":"Gems On 2 Curves — Gems on 2 Curves - Params\n\nDefine parameters for the Gems on 2 Curves component\n\nNickname: `Gem2Crv Params` · Tab: Gems › Gems On 2 Curves\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Distance _(optional)_ | `Dist` | Number | item | `0.2` | Minimum distance between gems |\n| Min Size _(optional)_ | `MinSize` | Number | item | `1.0` | Minimum gem size to include |\n| Move In Z _(optional)_ | `Z` | Number | item | `0.0` | Offset gems along their Z axis |\n| Alignment Vertical _(optional)_ | `AlignV` | Text | item | `TOP` | Vertical alignment: TOP or ON_GIRDLE |\n| Algorithm _(optional)_ | `Algo` | Text | item | `bySpine` | Algorithm: bySpine or byTangency |\n| Flip _(optional)_ | `Flip` | Boolean | item | `false` | Flip gem orientation |\n| Flip Curve 1 _(optional)_ | `Flip1` | Boolean | item | `false` | Flip direction of curve 1 |\n| Flip Curve 2 _(optional)_ | `Flip2` | Boolean | item | `false` | Flip direction of curve 2 |\n| Align On Top _(optional)_ | `AlignTop` | Boolean | item | `false` | Align gems on top of the spine |\n| Rebuild Curves _(optional)_ | `Rebuild` | Boolean | item | `true` | Rebuild input curves before computing |\n| T Seam _(optional)_ | `T` | Number | item | `0.0` | Seam parameter for closed curves |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Params | `Params` | Generic | item | Parameters for Gems on 2 Curves component |","metadata":{"title":"Gems On 2 Curves","section":"Gems on 2 Curves - Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-on-2-curves/#gems-on-2-curves---params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems-on-2-curves/#gems-on-2-curves---params","collection":"grasshopper","hash":"a76273dd5a4b5f3a69b7810bde32d0a1","indexed_by":"docs-index"}},{"content":"Gems\n\n10 components in Gems › Gems.\n\nCenter Stone\nCreates a gem from CenterStone Reader outputs. Uses carat if provided, otherwise XYZ dimensions.\n\nNickname: `CenterStone` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane |\n| Material _(optional)_ | `Material` | Text | item | — | Gem material (compound). Defaults to Diamond. |\n| Shape _(optional)_ | `Shape` | Text | item | — | Gem shape. Defaults to ROUND. |\n| Size (ct) _(optional)_ | `Size by Ct` | Number | item | — | Gem size by carats |\n| Size X _(optional)_ | `Size X` | Number | item | — | Gem size X |\n| Size Y _(optional)_ | `Size Y` | Number | item | — | Gem size Y |\n| Size Z _(optional)_ | `Size Z` | Number | item | — | Gem size Z |\n| Move in Z | `MoveZ` | Number | item | `0.0` | Move gem along the selected plane's Z axis by this distance |\n| Rotate 90 | `Rotate90` | Boolean | item | `false` | Rotate gem 90 degrees |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |\n| Taxonomy | `Taxonomy` | Generic | item | Center stone taxonomy with reader-compatible keys |","metadata":{"title":"Gems","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/","collection":"grasshopper","hash":"a618497a8266b5073fe86be2ad303411","indexed_by":"docs-index"}},{"content":"Gems — Center Stone for Solitaire Rings\n\nCreates a center stone for a solitaire ring. Instead of a plane, takes a ring Diameter and a Distance: the gem plane is the XY plane moved up in Z by (Diameter / 2) + Distance, with the gem resting on that surface.\n\nNickname: `CenterStone Solitaire` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Diameter | `Diameter` | Number | item | `16.92` | Ring diameter |\n| Distance | `Distance` | Number | item | `0.0` | Distance from the ring surface to the gem |\n| Material _(optional)_ | `Material` | Text | item | — | Gem material (compound). Defaults to Diamond. |\n| Shape _(optional)_ | `Shape` | Text | item | — | Gem shape. Defaults to ROUND. |\n| Size (ct) _(optional)_ | `Size by Ct` | Number | item | — | Gem size by carats |\n| Size X _(optional)_ | `Size X` | Number | item | — | Gem size X |\n| Size Y _(optional)_ | `Size Y` | Number | item | — | Gem size Y |\n| Size Z _(optional)_ | `Size Z` | Number | item | — | Gem size Z |\n| Move in Z | `MoveZ` | Number | item | `0.0` | Move gem along the plane's Z axis by this distance |\n| Rotate 90 | `Rotate90` | Boolean | item | `false` | Rotate gem 90 degrees |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a Reader Connector output (material, shape, carat, sizeX/Y/Z, moveInZ, rotate90). Individual inputs override. |\n\nOutputs","metadata":{"title":"Gems","section":"Center Stone for Solitaire Rings","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#center-stone-for-solitaire-rings","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#center-stone-for-solitaire-rings","collection":"grasshopper","hash":"08e3cbd3c8545c3b2f58a789cd69c099","indexed_by":"docs-index"}},{"content":"Gems — Center Stone for Solitaire Rings\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |\n| Taxonomy | `Taxonomy` | Generic | item | Center stone taxonomy with reader-compatible keys |","metadata":{"title":"Gems","section":"Center Stone for Solitaire Rings","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#center-stone-for-solitaire-rings","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#center-stone-for-solitaire-rings","collection":"grasshopper","hash":"346f6701a4457da9e9cfd2715a57a11c","indexed_by":"docs-index"}},{"content":"Gems — Gem\n\nCreates a gem by Width\n\nNickname: `Gem` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane for gem |\n| Shape _(optional)_ | `Shape` | Generic | item | — | GemShape (index or name, e.g. 0 or ROUND) |\n| Width | `Width` | Number | item | `5.0` | Width or diameter |\n| Compound _(optional)_ | `Compound` | Generic | item | — | GemCompound (index or name, e.g. 0 or Diamond) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |","metadata":{"title":"Gems","section":"Gem","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem","collection":"grasshopper","hash":"f2f61ee9681339ed7e143795d339db49","indexed_by":"docs-index"}},{"content":"Gems — Gem by Carat\n\nCreates a gem by weight (carat)\n\nNickname: `Gem Ct` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane |\n| Shape _(optional)_ | `Shape` | Generic | item | — | GemShape (index or name, e.g. 0 or ROUND) |\n| Carat | `Ct` | Number | item | `1.0` | Weight in carats |\n| Compound _(optional)_ | `Compound` | Generic | item | — | GemCompound (index or name, e.g. 0 or Diamond) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |","metadata":{"title":"Gems","section":"Gem by Carat","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-carat","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-carat","collection":"grasshopper","hash":"61f6e70b31e9c254f0e976f0ed767add","indexed_by":"docs-index"}},{"content":"Gems — Gem by Carat for Solitaire Rings\n\nCreates a gem by weight (carat) placed on a solitaire ring: the base XY plane is moved up in Z by (Diameter / 2) + Distance\n\nNickname: `Gem Ct Solitaire` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Diameter | `Diameter` | Number | item | `16.92` | Ring diameter |\n| Distance | `Distance` | Number | item | `0.0` | Distance from the ring surface to the gem plane |\n| Shape _(optional)_ | `Shape` | Generic | item | — | GemShape (index or name, e.g. 0 or ROUND) |\n| Carat | `Ct` | Number | item | `1.0` | Weight in carats |\n| Compound _(optional)_ | `Compound` | Generic | item | — | GemCompound (index or name, e.g. 0 or Diamond) |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a Reader Connector output (shape, carat, compound). Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |","metadata":{"title":"Gems","section":"Gem by Carat for Solitaire Rings","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-carat-for-solitaire-rings","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-carat-for-solitaire-rings","collection":"grasshopper","hash":"1319e43d1068242fcf28a2eb2bcf1f50","indexed_by":"docs-index"}},{"content":"Gems — Gem by XYZ\n\nCreates a gem by Width (X), Height (Y) and Depth (Z)\n\nNickname: `Gem XYZ` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane |\n| Shape | `Shape` | Integer | item | `0` | GemShape |\n| Width | `X` | Number | item | `1.0` | Width or diameter |\n| Height | `Y` | Number | item | `1.0` | Height |\n| Depth | `Z` | Number | item | `0.6` | Depth |\n| Compound _(optional)_ | `Compound` | Generic | item | — | GemCompound (index or name, e.g. 0 or Diamond) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | Full gem object |\n| Gem Mesh | `Mesh` | Mesh | item | Just a beautiful gem mesh |\n| Curve | `Crv` | Curve | item | Gem outline curve |\n| Dictionary | `Dict` | Generic | item | Gem values as dictionary |\n| Semantic | `Semantic` | Text | item | Semantic text description of the gem |","metadata":{"title":"Gems","section":"Gem by XYZ","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-xyz","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-by-xyz","collection":"grasshopper","hash":"8252dc6bee7e263147a2a94e98e0b99b","indexed_by":"docs-index"}},{"content":"Gems — Three Stones\n\nCreates a three-stones set: one center stone plus two symmetric side stones placed around a ring diameter. Same placement as the ArtisanThreeStones command.\n\nNickname: `ThreeStones` · Tab: Gems › Gems\n\nInputs","metadata":{"title":"Gems","section":"Three Stones","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","collection":"grasshopper","hash":"dbb4cb3b2e1bfc38cb5b70aba0693d7f","indexed_by":"docs-index"}},{"content":"Gems — Three Stones\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane. Y axis = finger axis, Z axis = top of the ring. |\n| Ring Diameter | `Ring Diameter` | Number | item | `17.0` | Finger circle diameter (mm) |\n| Center Material _(optional)_ | `C Material` | Text | item | — | Center gem material (compound). Defaults to Diamond. |\n| Center Shape _(optional)_ | `C Shape` | Text | item | — | Center gem shape. Defaults to ROUND. |\n| Center Size (ct) | `C Size Ct` | Number | item | `1.0` | Center gem size by carats |\n| Center Distance | `C Distance` | Number | item | `4.0` | Center gem distance above the finger circle (mm) |\n| Center Rotation | `C Rotation` | Number | item | `0.0` | Center gem rotation around its vertical axis (degrees) |\n| Side Material _(optional)_ | `S Material` | Text | item | — | Side gems material (compound). Defaults to Diamond. |\n| Side Shape _(optional)_ | `S Shape` | Text | item | — | Side gems shape. Defaults to ROUND. |\n| Side Size (ct) | `S Size Ct` | Number | item | `0.5` | Side gems size by carats |\n| Side Distance | `S Distance` | Number | item | `3.2` | Side gems distance above the finger circle (mm) |\n| Side Angle | `S Angle` | Number | item | `28.0` | Side gems position angle from the top of the ring, around the finger axis (degrees) |\n| Side Rotation | `S Rotation` | Number | item | `0.0` | Side gems rotation around each gem's vertical axis, mirrored on both sides (degrees) |\n| Side Rotation Y | `S Rotation Y` | Number | item | `25.0` | Side gems tilt around the finger axis at each gem's origin, mirrored on both sides (degrees) |\n\nOutputs","metadata":{"title":"Gems","section":"Three Stones","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","collection":"grasshopper","hash":"38e77b07825a3ed618c8722ecac27b34","indexed_by":"docs-index"}},{"content":"Gems — Three Stones\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | Gem objects: center, side A, side B |\n| Gem Meshes | `Meshes` | Mesh | list | Gem meshes: center, side A, side B |\n| Curves | `Crvs` | Curve | list | Gem outline curves: center, side A, side B |\n| Finger Circle | `Circle` | Curve | item | Finger reference circle |\n| Dictionaries | `Dicts` | Generic | list | Gem values as dictionaries: center, side A, side B |\n| Semantic | `Semantic` | Text | list | Semantic text description of each gem: center, side A, side B |\n| Taxonomy | `Taxonomy` | Generic | item | Three stones taxonomy with reader-compatible keys |","metadata":{"title":"Gems","section":"Three Stones","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#three-stones","collection":"grasshopper","hash":"1eb426a596e82b378c94557b586df135","indexed_by":"docs-index"}},{"content":"Gems — Toi et Moi\n\nCreates a Toi et Moi pair: two independent stones straddling the top of a ring diameter, one leaning to each side. Same placement as the ArtisanToiEtMoi command.\n\nNickname: `ToiEtMoi` · Tab: Gems › Gems\n\nInputs","metadata":{"title":"Gems","section":"Toi et Moi","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","collection":"grasshopper","hash":"3c613930e5c5eebb819e2dadf4231e22","indexed_by":"docs-index"}},{"content":"Gems — Toi et Moi\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Plane | `Plane` | Plane | item | `Plane.WorldXY` | Base plane. Y axis = finger axis, Z axis = top of the ring. |\n| Ring Diameter | `Ring Diameter` | Number | item | `17.35` | Finger circle diameter (mm) |\n| Stone A Material _(optional)_ | `A Material` | Text | item | — | Stone A material (compound). Defaults to Diamond. |\n| Stone A Shape _(optional)_ | `A Shape` | Text | item | — | Stone A shape. Defaults to ROUND. |\n| Stone A Size (ct) | `A Size Ct` | Number | item | `0.75` | Stone A size by carats |\n| Stone A Distance | `A Distance` | Number | item | `3.2` | Stone A distance above the finger circle (mm) |\n| Stone A Angle | `A Angle` | Number | item | `14.0` | Stone A position angle from the top of the ring, around the finger axis (degrees) |\n| Stone A Rotation | `A Rotation` | Number | item | `0.0` | Stone A rotation around its vertical axis (degrees) |\n| Stone A Rotation Y | `A Rotation Y` | Number | item | `20.0` | Stone A tilt around the finger axis at the gem's origin (degrees) |\n| Stone B Material _(optional)_ | `B Material` | Text | item | — | Stone B material (compound). Defaults to Diamond. |\n| Stone B Shape _(optional)_ | `B Shape` | Text | item | — | Stone B shape. Defaults to ROUND. |\n| Stone B Size (ct) | `B Size Ct` | Number | item | `0.75` | Stone B size by carats |\n| Stone B Distance | `B Distance` | Number | item | `3.2` | Stone B distance above the finger circle (mm) |\n| Stone B Angle | `B Angle` | Number | item | `-14.0` | Stone B position angle from the top of the ring, around the finger axis (degrees) |\n| Stone B Rotation | `B Rotation` | Number | item | `0.0` | Stone B rotation around its vertical axis (degrees) |","metadata":{"title":"Gems","section":"Toi et Moi","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","collection":"grasshopper","hash":"87cafa313f33e54f395260a6ca896967","indexed_by":"docs-index"}},{"content":"Gems — Toi et Moi\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Stone B Rotation Y | `B Rotation Y` | Number | item | `-20.0` | Stone B tilt around the finger axis at the gem's origin (degrees) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | Gem objects: stone A, stone B |\n| Gem Meshes | `Meshes` | Mesh | list | Gem meshes: stone A, stone B |\n| Curves | `Crvs` | Curve | list | Gem outline curves: stone A, stone B |\n| Finger Circle | `Circle` | Curve | item | Finger reference circle |\n| Dictionaries | `Dicts` | Generic | list | Gem values as dictionaries: stone A, stone B |\n| Semantic | `Semantic` | Text | list | Semantic text description of each gem: stone A, stone B |\n| Taxonomy | `Taxonomy` | Generic | item | Toi et Moi taxonomy with reader-compatible keys |","metadata":{"title":"Gems","section":"Toi et Moi","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#toi-et-moi","collection":"grasshopper","hash":"a01f13fb2d3401de3e99003f1ccaf2c1","indexed_by":"docs-index"}},{"content":"Gems — Gem Info\n\nExtracts gem information and outputs it as JSON with setting type and compound.\n\nNickname: `Gem Info` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | — | List of gem objects |\n| Setting Type _(optional)_ | `Setting` | Text | item | `PRONGS` | Gem setting type (e.g. PRONGS, PAVE, CHANNEL, FLUSH, BEZEL, PRESSURE, WAX, OTHER) |\n| Compound _(optional)_ | `Compound` | Text | item | `DIAMOND` | Gem compound (e.g. DIAMOND, RUBY, SAPPHIRE) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | JSON output with gem info |\n| GemInfo | `GemInfo` | Generic | item | Gem info as a dictionary object |","metadata":{"title":"Gems","section":"Gem Info","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-info","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#gem-info","collection":"grasshopper","hash":"28c8e84f2be967042f350f0c3bb8c146","indexed_by":"docs-index"}},{"content":"Gems — Metal Info\n\nExtracts metal geometry information and outputs it as JSON with material.\n\nNickname: `Metal Info` · Tab: Gems › Gems\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Geometry | `Geo` | Geometry | list | — | List of metal geometry |\n| Material _(optional)_ | `Material` | Text | item | `GOLD_YELLOW_18` | Metal material (e.g. GOLD_YELLOW_18, SILVER, PLATINUM) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | JSON output with metal info |\n| MetalInfo | `MetalInfo` | Generic | item | Metal info as a dictionary object |","metadata":{"title":"Gems","section":"Metal Info","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#metal-info","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/gems/#metal-info","collection":"grasshopper","hash":"e0ad6f18d9982c75b6eb0731a9ff21ab","indexed_by":"docs-index"}},{"content":"Micro Setting\n\n5 components in Gems › Micro Setting.\n\nMicroSetting\nApplies micro-setting cutters, V-cutters, channel and row prongs to a list of gems\n\nNickname: `MicroSetting` · Tab: Gems › Micro Setting\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | List of GemObjects (from any gem component) |\n| Cutters Params _(optional)_ | `Cutters` | Generic | item | Cutter parameters (from MicroSetting - Cutters) |\n| VCutters Params _(optional)_ | `VCutters` | Generic | item | V-Cutter parameters (from MicroSetting - V-Cutters) |\n| Channel Params _(optional)_ | `Channel` | Generic | item | Channel parameters (from MicroSetting - Channel) |\n| Row Prongs Params _(optional)_ | `RowProngs` | Generic | item | Row prong parameters (from MicroSetting - Row Prongs) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters | `Cutters` | Brep | list | Cutter Breps |\n| V-Cutters | `VCutters` | Brep | list | V-Cutter Breps |\n| Channel | `Channel` | Brep | item | Channel Brep |\n| Row Prongs | `Prongs` | Brep | list | Row prong Breps |","metadata":{"title":"Micro Setting","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/","collection":"grasshopper","hash":"793df09eba89af8209d165178de7777e","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - Channel\n\nDefine channel parameters for the MicroSetting component\n\nNickname: `MS Channel` · Tab: Gems › Micro Setting\n\nInputs","metadata":{"title":"Micro Setting","section":"MicroSetting - Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","collection":"grasshopper","hash":"79327b267856e07423d93a4c9f592d56","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - Channel\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `false` | Enable channel |\n| Shape _(optional)_ | `Shape` | Text | item | `UShape` | Channel shape: UShape, VShape, SquareShape, TrapezoidalShape, ChannelShape |\n| Start Width _(optional)_ | `SW` | Number | item | `2.0` | Start width |\n| Start Height _(optional)_ | `SH` | Number | item | `3.0` | Start height |\n| End Width _(optional)_ | `EW` | Number | item | `2.0` | End width |\n| End Height _(optional)_ | `EH` | Number | item | `3.0` | End height |\n| Start Over Girdle _(optional)_ | `SOG` | Number | item | `0.0` | Start over girdle offset |\n| End Over Girdle _(optional)_ | `EOG` | Number | item | `0.0` | End over girdle offset |\n| Start Extension _(optional)_ | `SExt` | Number | item | `0.0` | Start extension length |\n| End Extension _(optional)_ | `EExt` | Number | item | `0.0` | End extension length |\n| Start Bend _(optional)_ | `SBend` | Number | item | `0.0` | Start bend amount |\n| End Bend _(optional)_ | `EBend` | Number | item | `0.0` | End bend amount |\n| Shape Factor _(optional)_ | `SF` | Number | item | `1.0` | Shape factor |\n| Close _(optional)_ | `Close` | Boolean | item | `false` | Close the channel |\n| Precise _(optional)_ | `Precise` | Boolean | item | `false` | Use precise mode (one profile per gem) |\n| Flat Ends _(optional)_ | `FlatEnds` | Boolean | item | `false` | Use flat end caps |\n| Flip Start _(optional)_ | `FlipS` | Boolean | item | `false` | Flip start profile |\n| Flip End _(optional)_ | `FlipE` | Boolean | item | `false` | Flip end profile |\n| Flip Cap Start _(optional)_ | `FlipCS` | Boolean | item | `false` | Flip start cap |\n| Flip Cap End _(optional)_ | `FlipCE` | Boolean | item | `false` | Flip end cap |","metadata":{"title":"Micro Setting","section":"MicroSetting - Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","collection":"grasshopper","hash":"9912f067f69a3392e57bf813f3d203d4","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - Channel\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Keep _(optional)_ | `Keep` | Boolean | item | `true` | Keep channel in output |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Channel Params | `Channel` | Generic | item | Channel parameters for MicroSetting component |","metadata":{"title":"Micro Setting","section":"MicroSetting - Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---channel","collection":"grasshopper","hash":"c262ce24d4ac6b64221e02665b68d997","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - Cutters\n\nDefine cutter parameters for the MicroSetting component\n\nNickname: `MS Cutters` · Tab: Gems › Micro Setting\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `true` | Enable cutters |\n| Shape _(optional)_ | `Shape` | Text | item | `U_SHAPE` | Cutter shape: U_SHAPE, V_SHAPE, SQUARE_SHAPE, TRAPEZOIDAL_SHAPE, FRENCH_SETTING_SHAPE |\n| Start Width _(optional)_ | `SW` | Number | item | `1.0` | Start width |\n| Start Height _(optional)_ | `SH` | Number | item | `2.0` | Start height |\n| End Width _(optional)_ | `EW` | Number | item | `1.0` | End width |\n| End Height _(optional)_ | `EH` | Number | item | `2.0` | End height |\n| Length _(optional)_ | `Len` | Number | item | `5.0` | Cutter length |\n| Over Girdle _(optional)_ | `OG` | Number | item | `0.0` | Offset over girdle |\n| Over Girdle Middle _(optional)_ | `OGM` | Number | item | `0.0` | Offset over girdle at middle |\n| Shape Factor _(optional)_ | `SF` | Number | item | `1.0` | Shape factor |\n| Keep _(optional)_ | `Keep` | Boolean | item | `true` | Keep cutter in output |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Params | `Cutters` | Generic | item | Cutter parameters for MicroSetting component |","metadata":{"title":"Micro Setting","section":"MicroSetting - Cutters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---cutters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---cutters","collection":"grasshopper","hash":"da86fee5fca3325969e2eae8bb900fa5","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - Row Prongs\n\nDefine row prong parameters for the MicroSetting component\n\nNickname: `MS RowProngs` · Tab: Gems › Micro Setting\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `false` | Enable row prongs |\n| Diameter _(optional)_ | `Dia` | Number | item | `0.6` | Prong diameter |\n| Height Over Girdle _(optional)_ | `HOver` | Number | item | `0.6` | Height over girdle |\n| Height Under Girdle _(optional)_ | `HUnder` | Number | item | `1.0` | Height under girdle |\n| X Center Prongs _(optional)_ | `PosX` | Number | item | `0.0` | X offset of prong center from gem |\n| Y Center Prongs _(optional)_ | `PosY` | Number | item | `0.0` | Y offset of prong center from gem |\n| Allow Collisions _(optional)_ | `Collide` | Boolean | item | `false` | Allow prong collisions |\n| Close _(optional)_ | `Close` | Boolean | item | `false` | Close the prong row (loop) |\n| Smart Adapt _(optional)_ | `Smart` | Boolean | item | `false` | Adapt prong size to gem size variation |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Row Prongs Params | `RowProngs` | Generic | item | Row prong parameters for MicroSetting component |","metadata":{"title":"Micro Setting","section":"MicroSetting - Row Prongs","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---row-prongs","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---row-prongs","collection":"grasshopper","hash":"1312e9af895298f2c9cdfde4e949ff5c","indexed_by":"docs-index"}},{"content":"Micro Setting — MicroSetting - V-Cutters\n\nDefine V-cutter parameters for the MicroSetting component\n\nNickname: `MS VCutters` · Tab: Gems › Micro Setting\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `On` | Boolean | item | `false` | Enable V-cutters |\n| Start Width _(optional)_ | `SW` | Number | item | `0.5` | Start width |\n| Start Height _(optional)_ | `SH` | Number | item | `2.0` | Start height |\n| End Width _(optional)_ | `EW` | Number | item | `0.5` | End width |\n| End Height _(optional)_ | `EH` | Number | item | `2.0` | End height |\n| Length _(optional)_ | `Len` | Number | item | `3.0` | V-cutter length |\n| Over Girdle _(optional)_ | `OG` | Number | item | `1.0` | Offset over girdle |\n| Keep _(optional)_ | `Keep` | Boolean | item | `true` | Keep V-cutter in output |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| VCutters Params | `VCutters` | Generic | item | V-cutter parameters for MicroSetting component |","metadata":{"title":"Micro Setting","section":"MicroSetting - V-Cutters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---v-cutters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gems/micro-setting/#microsetting---v-cutters","collection":"grasshopper","hash":"48a6c659af4e60624b3a3818646383ca","indexed_by":"docs-index"}},{"content":"Gemset\n\nSettings that place and hold stones — bezels, baskets, halos, prongs and rails.\n\n46 components in 13 groups.\n\n- Advanced Basket — 5 components: Advanced Basket, Advanced Basket - Prong Claw Parameters, Advanced Basket - Prong Offset Parameters, Advanced Basket - Prong Parameters, Advanced Basket - Rail Parameters.\n- Advanced Bezel — 4 components: Advanced Bezel, Advanced Bezel - Airgap Parameters, Advanced Bezel - Cutter Parameters, Advanced Bezel - Parameters.\n- Basket — 4 components: Basket, Basket - Base Rail Parameters, Basket - Prong Parameters, Basket - Upper Rail Parameters.\n- Bezel — 4 components: Bezel, Bezel - Airgap Parameters, Bezel - Cutter Parameters, Bezel - Parameters.\n- Channel — 3 components: Channel, Channel - Gems Parameters, Channel - Section Parameters.\n- Cluster — 4 components: Cluster, Cluster - Gems Parameters, Cluster - Main Gem Rail Parameters, Cluster - Prongs Parameters.\n- Halo — 4 components: Halo, Halo - Channel Parameters, Halo - Gems Parameters, Halo - Prongs Parameters.\n- Martini — 4 components: Martini, Martini - Prong Parameters, Martini - Side Bezel Parameters, Martini - Upper Rail Parameters.\n- Peghead — 2 components: Peghead, Peghead - Parameters.\n- Tapered Baguettes — 2 components: Tapered Baguettes on Curves, Tapered Baguettes - Params.\n- Trellis — 3 components: Trellis, Trellis - Prongs Parameters, Trellis - Upper Rail Parameters.\n- Trilogy Trellis — 4 components: Trilogy Trellis, Trilogy Trellis - Cross Prongs Parameters, Trilogy Trellis - Shank Prongs Parameters, Trilogy Trellis - Upper Rail Parameters.\n- Tulip — 3 components: Tulip, Tulip - Ornament Parameters, Tulip - Prong Parameters.","metadata":{"title":"Gemset","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/","collection":"grasshopper","hash":"a61c0be784a807fed78c4fd9a5b90dc9","indexed_by":"docs-index"}},{"content":"Advanced Basket\n\n5 components in Gemset › Advanced Basket.","metadata":{"title":"Advanced Basket","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/","collection":"grasshopper","hash":"a1c00e4c31077ef4272abb5f9c29b436","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket\n\nCreates an advanced basket (per-prong and per-rail control) from a GemObject\n\nNickname: `AdvancedBasket` · Tab: Gemset › Advanced Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the advanced basket for |\n| Prong Params _(optional)_ | `Prongs` | Generic | list | — | One dictionary per prong (Advanced Basket - Prong Parameters). When wired, this list replaces the prong list coming from the JSON. |\n| Rail Params _(optional)_ | `Rails` | Generic | list | — | One dictionary per rail (Advanced Basket - Rail Parameters). When wired, this list replaces the rail list coming from the JSON. |\n| Advanced Basket JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of an AdvancedBasket. The full model, including the prong and rail lists and their custom profile assets, can be provided here. |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. The advanced basket geometry is currently mode-independent (the manufacturing extension is a per-prong parameter). |\n\nOutputs","metadata":{"title":"Advanced Basket","section":"Advanced Basket","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket","collection":"grasshopper","hash":"26d6d2d1280d624d337af020d5886aca","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the advanced basket |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Advanced basket taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Advanced Basket","section":"Advanced Basket","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket","collection":"grasshopper","hash":"bc61544fb8c74c3ba6dbe7d5b5284caa","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Prong Claw Parameters\n\nDefine the claw tip parameters used by a CLAW mode prong\n\nNickname: `AB Prong Claw` · Tab: Gemset › Advanced Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Claw Cap Distance | `Claw Cap Dist.` | Number | item | `1.35` | Pulls the claw apex toward the gem centre (radial) |\n| Claw Cap Height | `Claw Cap Height` | Number | item | `-0.85` | Raises/lowers the claw apex (plus/minus Z, range -5 to 5) |\n| Claw Tip Width | `Claw Tip Width` | Number | item | `0.15` | Apex thickness as a fraction of the tube (0 = sharp point, 1 = full) |\n| Claw Tip Smoothness | `Claw Tip Smooth.` | Number | item | `0.25` | Smooths the body-to-cap transition (0-1) |\n| Cap Claw Gem Inside | `Cap Claw Gem Inside` | Number | item | `0.8` | Legacy claw cap: radial dig into the gem |\n| Cap Claw Height | `Cap Claw Height` | Number | item | `0.0` | Legacy claw cap: cap height |\n| Cap Claw Tension | `Cap Claw Tension` | Number | item | `30.0` | Legacy claw cap: cap tension |\n| Cap Claw On Curve | `Cap Claw On Curve` | Integer | item | `20` | Legacy claw cap: percentage on curve |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Claw Parameters | `Claw` | Generic | item | Claw parameters for an advanced basket prong |","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Prong Claw Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-claw-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-claw-parameters","collection":"grasshopper","hash":"4e7f1e1c41bd30b0e5c15aeccb0e81cc","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Prong Offset Parameters\n\nDefine the V-shaped cross-section parameters used by an OFFSET mode prong (top and bottom sections)\n\nNickname: `AB Prong Offset` · Tab: Gemset › Advanced Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Thickness | `Thickness` | Number | item | `0.6` | Arm thickness of the top V profile |\n| Length | `Length` | Number | item | `2.0` | Arm length of the top V profile |\n| Angle | `Angle` | Number | item | `90.0` | Opening angle (degrees, 30-180) of the top V profile |\n| Fillet | `Fillet` | Number | item | `0.1` | Corner fillet radius of the top V profile |\n| Bottom Thickness | `Bottom Thickness` | Number | item | `0.6` | Arm thickness of the bottom V profile |\n| Bottom Length | `Bottom Length` | Number | item | `2.0` | Arm length of the bottom V profile |\n| Bottom Angle | `Bottom Angle` | Number | item | `90.0` | Opening angle (degrees, 30-180) of the bottom V profile |\n| Bottom Fillet | `Bottom Fillet` | Number | item | `0.1` | Corner fillet radius of the bottom V profile |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Offset Parameters | `Offset` | Generic | item | Offset (V) parameters for an advanced basket prong |","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Prong Offset Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-offset-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-offset-parameters","collection":"grasshopper","hash":"1a15820d5b7228abc2e53d585b18714e","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Prong Parameters\n\nDefine ONE prong of an advanced basket. Wire several of these into the Prong Params list input of the Advanced Basket component.\n\nNickname: `AB Prong` · Tab: Gemset › Advanced Basket\n\nInputs","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","collection":"grasshopper","hash":"c498d80ce6b6fc370dea33907ea12b51","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Prong Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Mode | `Mode` | Text | item | `ROUND` | Prong mode: ROUND, CUSTOM, OFFSET, DOUBLE, CLAW or TRIPLE |\n| Position | `Position` | Number | item | `0.0` | Normalized position (0-1) of the prong along the gem girdle curve |\n| Diameter | `Diameter` | Number | item | `1.5` | Prong diameter at the top |\n| Bottom Diameter | `Bottom Diameter` | Number | item | `1.5` | Prong diameter at the bottom |\n| Height | `Height` | Number | item | `4.0` | Prong height under the girdle |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial dig of the prong into the gem girdle |\n| Over Girdle | `Over Girdle` | Number | item | `-0.6` | How far the prong tip rises over the gem girdle |\n| Bottom Inside | `Bottom Inside` | Number | item | `0.5` | Bottom position factor 0-1: 0 = gem centre, 1 = straight under the top |\n| Bottom To Center | `Bottom To Center` | Boolean | item | `false` | ON: Bottom Inside can pull the prong bases toward the gem centre. OFF: bases stay straight under their tops (Double/Triple pairs stay parallel). |\n| Middle Gem Inside | `Middle Gem Inside` | Number | item | `0.0` | Triple mode: extra gem-inside offset for the exterior (middle) prong top |\n| Middle Bottom Inside | `Middle Bottom Inside` | Number | item | `0.5` | Triple mode: bottom inside factor of the exterior (middle) prong |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation of the prong cross-section (degrees) |\n| Straight | `Straight` | Boolean | item | `false` | Straight prong instead of the curved (belly) rail |\n| Inclination | `Inclination` | Number | item | `3.0` | Curved mode: belly outward bow in degrees (0 = no bow) |","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","collection":"grasshopper","hash":"849433cc1a6a58f6775df55e2a574175","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Prong Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Inclination Z | `Inclination Z` | Number | item | `0.0` | Curved mode: belly height along the chord as a 0-1 fraction (0 = belly low) |\n| Angle | `Angle` | Number | item | `2.0` | Double/Triple modes: pair separation (halfDiameter = Diameter / Angle) |\n| Tangent | `Tangent` | Boolean | item | `false` | ON: the prong faces the gem curve's outward normal instead of the radial direction |\n| Extension For Manufacturing | `Manuf. Ext.` | Number | item | `0.7` | Extra prong material added above the gem |\n| Profile _(optional)_ | `Profile` | Generic | item | — | Closed profile asset for CUSTOM mode |\n| Bottom Use Custom Profile | `Bottom Custom Profile` | Boolean | item | `false` | CUSTOM mode: also use the custom profile for the bottom section |\n| Offset Params _(optional)_ | `Offset` | Generic | item | — | Offset (V) parameters dictionary (Advanced Basket - Prong Offset Parameters). Merged into this prong. |\n| Claw Params _(optional)_ | `Claw` | Generic | item | — | Claw parameters dictionary (Advanced Basket - Prong Claw Parameters). Merged into this prong. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Parameters | `Prong` | Generic | item | Parameters of one advanced basket prong |","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---prong-parameters","collection":"grasshopper","hash":"ee9f99a91ba31a682d9ddb03b1339537","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Rail Parameters\n\nDefine ONE rail of an advanced basket. Wire several of these into the Rail Params list input of the Advanced Basket component.\n\nNickname: `AB Rail` · Tab: Gemset › Advanced Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Mode | `Mode` | Text | item | `ROUND` | Rail mode: ROUND or CUSTOM |\n| Position | `Position` | Number | item | `0.0` | Vertical position of the rail under the girdle |\n| Width | `Width` | Number | item | `1.5` | Rail profile width |\n| Height | `Height` | Number | item | `1.2` | Rail profile height |\n| Under Girdle | `Under Girdle` | Number | item | `1.0` | Distance of the rail under the gem girdle |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation of the rail profile (degrees) |\n| Bend Height | `Bend Height` | Number | item | `0.0` | Height of the rail bend |\n| Bend Rotation | `Bend Rotation` | Number | item | `0.0` | Rotation of the rail bend (degrees) |\n| Gem Size Percentage | `Gem Size %` | Number | item | `70.0` | Rail size as a percentage of the gem size |\n| Fillet Radius | `Fillet Radius` | Number | item | `0.001` | Fillet radius of the rail profile corners |\n| Offset Y | `Offset Y` | Number | item | `0.0` | Shifts the whole rail along the local Y axis (0 = centered on the gem) |\n| Creation Mode | `Creation Mode` | Text | item | `SWEEP` | Rail creation mode: SWEEP or REVOLVE |\n| Profile Position | `Profile Position` | Text | item | `FRONT` | Custom profile orientation: FRONT or SIDE |\n| Profile Mirror | `Profile Mirror` | Text | item | `NONE` | Custom profile mirroring: NONE or MIRROR |\n| Profile _(optional)_ | `Profile` | Generic | item | — | Closed profile asset for CUSTOM mode |\n\nOutputs","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---rail-parameters","collection":"grasshopper","hash":"2613fc0411a8da1bcc08b7964a342fd8","indexed_by":"docs-index"}},{"content":"Advanced Basket — Advanced Basket - Rail Parameters\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Rail Parameters | `Rail` | Generic | item | Parameters of one advanced basket rail |","metadata":{"title":"Advanced Basket","section":"Advanced Basket - Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-basket/#advanced-basket---rail-parameters","collection":"grasshopper","hash":"c23d797182eec197972b147b67e82bd8","indexed_by":"docs-index"}},{"content":"Advanced Bezel\n\n4 components in Gemset › Advanced Bezel.\n\nAdvanced Bezel\nCreates an advanced bezel (free wall profile) from a GemObject\n\nNickname: `AdvancedBezel` · Tab: Gemset › Advanced Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the advanced bezel for |\n| Bezel Params _(optional)_ | `Params` | Generic | item | — | Basic advanced bezel parameters |\n| Cutter Params _(optional)_ | `Cutters` | Generic | item | — | Cutter parameters for the advanced bezel |\n| Airgap Params _(optional)_ | `Airgaps` | Generic | item | — | Airgap parameters for the advanced bezel |\n| Advanced Bezel JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of an AdvancedBezel. The wall profile point list (ProfilePoints, relative DX/DY offsets with IsBreak flags) can only be edited through this input. |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the advanced bezel |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Advanced bezel taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Advanced Bezel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/","collection":"grasshopper","hash":"6cf354af36623dbe4f352109253b1c58","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Advanced Bezel - Airgap Parameters\n\nDefine the airgap parameters for an advanced bezel\n\nNickname: `AB Airgaps` · Tab: Gemset › Advanced Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable airgaps |\n| Profile _(optional)_ | `Profile` | Text | item | — | Airgap profile: HEART, SQUARE or ROUNDED_SQUARE. When omitted, the workspace default closed profile is used. |\n| Number | `Number` | Integer | item | `4` | Number of airgaps |\n| Width | `Width` | Number | item | `2.0` | Airgap width |\n| Height | `Height` | Number | item | `2.0` | Airgap height |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation |\n| Rotation V | `Rotation V` | Number | item | `0.0` | Vertical (conic) rotation |\n| Rotation Global | `Rotation Global` | Number | item | `45.0` | Global rotation around the gem axis |\n| Move In Vertical | `Move In Vertical` | Number | item | `-2.0` | Vertical offset of the airgaps |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Airgap Parameters | `Airgaps` | Generic | item | Advanced bezel airgap parameters |","metadata":{"title":"Advanced Bezel","section":"Advanced Bezel - Airgap Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---airgap-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---airgap-parameters","collection":"grasshopper","hash":"7faecdf2c44066f0827596a14059e64a","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Advanced Bezel - Cutter Parameters\n\nDefine the cutter parameters for an advanced bezel\n\nNickname: `AB Cutters` · Tab: Gemset › Advanced Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable cutters |\n| Profile _(optional)_ | `Profile` | Text | item | — | Cutter profile: ROUNDED, SQUARE or SHARP. When omitted, the workspace default closed profile is used. |\n| Number | `Number` | Integer | item | `4` | Number of cutters |\n| Width | `Width` | Number | item | `3.5` | Cutter width |\n| Height | `Height` | Number | item | `2.0` | Cutter height |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation |\n| Rotation V | `Rotation V` | Number | item | `10.0` | Vertical (conic) rotation |\n| Rotation Global | `Rotation Global` | Number | item | `0.0` | Global rotation around the gem axis |\n| Move In Vertical | `Move In Vertical` | Number | item | `0.0` | Vertical offset of the cutters |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutter Parameters | `Cutters` | Generic | item | Advanced bezel cutter parameters |","metadata":{"title":"Advanced Bezel","section":"Advanced Bezel - Cutter Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---cutter-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---cutter-parameters","collection":"grasshopper","hash":"91b64fc7eb19c277860797088f9a55bc","indexed_by":"docs-index"}},{"content":"Advanced Bezel — Advanced Bezel - Parameters\n\nDefine the basic parameters for an advanced bezel. The wall profile point list is only editable through the main component's JSON input.\n\nNickname: `AB Params` · Tab: Gemset › Advanced Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Height | `Height` | Number | item | `3.8` | Bezel height |\n| Width | `Width` | Number | item | `1.5` | Bezel width |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial dig of the bezel wall into the gem girdle |\n| Girdle Height | `Girdle Height` | Number | item | `0.3` | Girdle height |\n| Girdle Width | `Girdle Width` | Number | item | `1.5` | Girdle width |\n| Support | `Support` | Integer | item | `0` | Number of support bridges (0 = none) |\n| Support Width | `Support Width` | Number | item | `1.0` | Support bridge width |\n| Support Thickness | `Support Thickness` | Number | item | `1.0` | Support bridge thickness |\n| Fillet Radius | `Fillet Radius` | Number | item | `0.0` | Fillet radius applied to the sharp corners of the wall profile; 0 keeps them sharp |\n| Bezel Mode | `Bezel Mode` | Integer | item | `0` | Wall construction for the single-rail (rounded) gem shapes: 0 = Auto, 1 = Sweep, 2 = Rail revolve |\n| Revolve Axis X | `Revolve Axis X` | Number | item | `0.0` | X offset (gem-plane coordinates) of the Rail revolve axis point |\n| Revolve Axis Y | `Revolve Axis Y` | Number | item | `0.0` | Y offset (gem-plane coordinates) of the Rail revolve axis point |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bezel Parameters | `Params` | Generic | item | Advanced bezel basic parameters |","metadata":{"title":"Advanced Bezel","section":"Advanced Bezel - Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/advanced-bezel/#advanced-bezel---parameters","collection":"grasshopper","hash":"1fd266b76dfbbda9f5da5af853e49f8c","indexed_by":"docs-index"}},{"content":"Basket\n\n4 components in Gemset › Basket.\n\nBasket\nCreates a basket from a GemObject\n\nNickname: `Basket` · Tab: Gemset › Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the basket for |\n| Prong Params _(optional)_ | `Prongs` | Generic | item | — | Prong parameters for the basket |\n| Upper Rail Params _(optional)_ | `Upper Rail` | Generic | item | — | Upper rail parameters for the basket |\n| Base Rail Params _(optional)_ | `Base Rail` | Generic | item | — | Base rail parameters for the basket |\n| Basket JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Basket |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the basket |\n| SubDs | `SubDs` | SubD | list | SubD parts of the basket |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Basket taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the basket |","metadata":{"title":"Basket","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/","collection":"grasshopper","hash":"62f46c050afa6908b0c133e6de92509e","indexed_by":"docs-index"}},{"content":"Basket — Basket - Base Rail Parameters\n\nDefine the base rail parameters for a basket\n\nNickname: `Basket Base Rail` · Tab: Gemset › Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `true` | Enable base rail |\n| Profile | `Profile` | Text | item | `SQUARE` | Rail section profile: ROUND or SQUARE |\n| Height | `Height` | Number | item | `1.2` | Height of the base rail |\n| Width | `Width` | Number | item | `1.5` | Width of the base rail |\n| Diameter % | `Diameter %` | Number | item | `50.0` | Diameter percentage |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation angle |\n| Move in Z | `Move in Z` | Number | item | `0.0` | Vertical offset |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Base Rail Params | `Base Rail` | Generic | item | Base rail parameters for a basket |","metadata":{"title":"Basket","section":"Basket - Base Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---base-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---base-rail-parameters","collection":"grasshopper","hash":"edc1919e2247619e757f5e89cc3eaf18","indexed_by":"docs-index"}},{"content":"Basket — Basket - Prong Parameters\n\nDefine the prong parameters for a basket\n\nNickname: `Basket Prongs` · Tab: Gemset › Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Number | `Number` | Integer | item | `-4` | Number of prongs |\n| Profile | `Profile` | Text | item | `ROUND` | Prong section profile: ROUND, SQUARE, HEART or TRAPEZOID |\n| Diameter Top | `Diameter Top` | Number | item | `1.2` | Diameter at the top |\n| Diameter Girdle | `Diameter Girdle` | Number | item | `1.2` | Diameter at girdle |\n| Diameter Bottom | `Diameter Bottom` | Number | item | `1.2` | Diameter at the bottom |\n| Height | `Height` | Number | item | `4.0` | Height of prongs |\n| Height Over Girdle | `Height Over Girdle` | Number | item | `0.3` | Height over girdle |\n| Straight | `Straight` | Boolean | item | `false` | Straight prong? |\n| Cap Bump | `Cap Bump` | Number | item | `0.6` | Bump amount applied to the prong cap |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Parameters | `Prongs` | Generic | item | Prong parameters for a basket |","metadata":{"title":"Basket","section":"Basket - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---prong-parameters","collection":"grasshopper","hash":"b086fd71b0fc19f8e710dac62db9640f","indexed_by":"docs-index"}},{"content":"Basket — Basket - Upper Rail Parameters\n\nDefine the upper rail parameters for a basket\n\nNickname: `Basket Upper Rail` · Tab: Gemset › Basket\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | `true` | Enable upper rail |\n| Profile | `Profile` | Text | item | `SQUARE` | Rail section profile: ROUND or SQUARE |\n| Height | `Height` | Number | item | `1.2` | Height of the upper rail |\n| Width | `Width` | Number | item | `1.5` | Width of the upper rail |\n| Height Under Girdle | `Height Under Girdle` | Number | item | `1.0` | Height under girdle |\n| Diameter % | `Diameter %` | Number | item | `70.0` | Diameter percentage |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation angle |\n| Chamfer | `Chamfer` | Boolean | item | `false` | Chamfer enabled |\n| Chamfer Offset | `Chamfer Offset` | Number | item | `0.0` | Chamfer offset |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Upper Rail Params | `Upper Rail` | Generic | item | Upper rail parameters for a basket |","metadata":{"title":"Basket","section":"Basket - Upper Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---upper-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/basket/#basket---upper-rail-parameters","collection":"grasshopper","hash":"d30dcf3b3c4a901bc9052b88a7486a84","indexed_by":"docs-index"}},{"content":"Bezel\n\n4 components in Gemset › Bezel.\n\nBezel\nCreates a bezel from a GemObject\n\nNickname: `Bezel` · Tab: Gemset › Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the bezel for |\n| Bezel Params _(optional)_ | `Params` | Generic | item | — | Basic bezel parameters |\n| Cutter Params _(optional)_ | `Cutters` | Generic | item | — | Cutter parameters for the bezel |\n| Airgap Params _(optional)_ | `Airgaps` | Generic | item | — | Airgap parameters for the bezel |\n| Bezel JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Bezel |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the bezel |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Bezel taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the bezel |","metadata":{"title":"Bezel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/","collection":"grasshopper","hash":"27b9d2489c5ce0ced22d90d307b76270","indexed_by":"docs-index"}},{"content":"Bezel — Bezel - Airgap Parameters\n\nDefine the airgap parameters for a bezel\n\nNickname: `Bezel Airgaps` · Tab: Gemset › Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable airgaps |\n| Profile _(optional)_ | `Profile` | Text | item | — | Airgap profile: HEART, SQUARE or ROUNDED_SQUARE |\n| Number | `Number` | Integer | item | `4` | Number of airgaps |\n| Width | `Width` | Number | item | `2.0` | Airgap width |\n| Height | `Height` | Number | item | `2.0` | Airgap height |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation |\n| Rotation V | `RotationV` | Number | item | `0.0` | Vertical rotation |\n| Rotation Global | `RotationGlobal` | Number | item | `45.0` | Global rotation |\n| Move In Vertical | `MoveInVertical` | Number | item | `-2.0` | Move in vertical |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Airgap Parameters | `Airgaps` | Generic | item | Bezel airgap parameters |","metadata":{"title":"Bezel","section":"Bezel - Airgap Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---airgap-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---airgap-parameters","collection":"grasshopper","hash":"45482fd3eec74c05bbff5e80a27c0c1a","indexed_by":"docs-index"}},{"content":"Bezel — Bezel - Cutter Parameters\n\nDefine the cutter parameters for a bezel\n\nNickname: `Bezel Cutters` · Tab: Gemset › Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable cutters |\n| Profile _(optional)_ | `Profile` | Text | item | — | Cutter profile: ROUNDED, SQUARE or SHARP |\n| Number | `Number` | Integer | item | `4` | Number of cutters |\n| Width | `Width` | Number | item | `3.5` | Cutter width |\n| Height | `Height` | Number | item | `2.0` | Cutter height |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation |\n| Rotation V | `Rotation V` | Number | item | `10.0` | Vertical rotation |\n| Rotation Global | `Rotation Global` | Number | item | `0.0` | Global rotation |\n| Move In Vertical | `Move In Vertical` | Number | item | `0.0` | Move in vertical |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutter Parameters | `Cutters` | Generic | item | Bezel cutter parameters |","metadata":{"title":"Bezel","section":"Bezel - Cutter Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---cutter-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---cutter-parameters","collection":"grasshopper","hash":"cd3b63763107601f7027eaac3108c193","indexed_by":"docs-index"}},{"content":"Bezel — Bezel - Parameters\n\nDefine the basic parameters for a bezel\n\nNickname: `Bezel - Params` · Tab: Gemset › Bezel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | — | Bezel profile: CONCAVE, STRAIGHT or CONVEX |\n| Height | `Height` | Number | item | `3.8` | Bezel height |\n| Width | `Width` | Number | item | `1.5` | Bezel width |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Gem inside |\n| Girdle Height | `Girdle Height` | Number | item | `0.3` | Girdle height |\n| Girdle Width | `Girdle Width` | Number | item | `1.5` | Girdle width |\n| Support | `Support` | Integer | item | `0` | Support type |\n| Support Width | `Support Width` | Number | item | `1.0` | Support width |\n| Support Thickness | `Support Thickness` | Number | item | `1.0` | Support thickness |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bezel Parameters | `Params` | Generic | item | Bezel basic parameters |","metadata":{"title":"Bezel","section":"Bezel - Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/bezel/#bezel---parameters","collection":"grasshopper","hash":"8966dea86fb41bf9f5b9d91611d1f1d4","indexed_by":"docs-index"}},{"content":"Channel\n\n3 components in Gemset › Channel.","metadata":{"title":"Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/","collection":"grasshopper","hash":"fa36d9b7cef67c1fbd9c36311dba4f2f","indexed_by":"docs-index"}},{"content":"Channel — Channel\n\nCreates a channel setting (metal band with a gem groove) swept along a curve\n\nNickname: `Channel` · Tab: Gemset › Channel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Curve | `Curve` | Curve | item | — | Rail curve the channel is swept along |\n| Orientation Mesh _(optional)_ | `Orientation` | Mesh | item | — | Optional mesh that orients the section and the gems (its normal is up). If omitted, the curve plane normal is used. |\n| Section Params _(optional)_ | `Section` | Generic | item | — | Metal section parameters (from Channel - Section Parameters) |\n| Gems Params _(optional)_ | `Gems` | Generic | item | — | Gem row and setting parameters (from Channel - Gems Parameters) |\n| T0 _(optional)_ | `T0` | Number | item | — | Segment start (curve parameter). Wire T0 and T1 to switch to Segment mode. |\n| T1 _(optional)_ | `T1` | Number | item | — | Segment end (curve parameter). Wire T0 and T1 to switch to Segment mode. |\n| Margin _(optional)_ | `Margin` | Number | item | `0.0` | Gap (mm) between the end gem edge and the channel wall at each end (Segment only) |\n| Invert Segment _(optional)_ | `Invert Segment` | Boolean | item | `false` | Closed-curve Segment: pick the complementary (smaller) arc between T0 and T1 |\n| Flip Curve _(optional)_ | `Flip Curve` | Boolean | item | `false` | Reverse the curve direction: flips gem order and start point |\n| Channel JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a ChannelSetting |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Channel","section":"Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel","collection":"grasshopper","hash":"535102a3a71bc23dbc25fbf01d96e3f1","indexed_by":"docs-index"}},{"content":"Channel — Channel\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the channel (metal band + prongs) |\n| Gems | `Gems` | GemObject | list | Gem objects placed in the channel |\n| Cutters | `Cutters` | Brep | list | Scalloped cutter breps (when Boolean Cutters is off) |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Channel taxonomy dictionary (backend keys) |","metadata":{"title":"Channel","section":"Channel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel","collection":"grasshopper","hash":"822d9f6dbf962a8e70c50a3f922e3486","indexed_by":"docs-index"}},{"content":"Channel — Channel - Gems Parameters\n\nDefine the gem row and setting parameters for a channel (shared prongs / scalloped)\n\nNickname: `Channel Gems` · Tab: Gemset › Channel\n\nInputs","metadata":{"title":"Channel","section":"Channel - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","collection":"grasshopper","hash":"3a8aa66f3e2f236d02c23785357dd621","indexed_by":"docs-index"}},{"content":"Channel — Channel - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Shape | `Shape` | Text | item | `ROUND` | Gem shape: ROUND or PRINCESS |\n| Gem Size | `Gem Size` | Number | item | `1.8` | Gem size (mm) |\n| Min Distance | `Min Distance` | Number | item | `0.1` | Minimum distance between gems |\n| Vertical | `Vertical` | Number | item | `0.0` | Vertical offset of the gems (table seat) |\n| Force Even Number | `Force Even` | Boolean | item | `true` | Force an even number of gems |\n| Type Prong | `Type Prong` | Text | item | `NONE` | Setting type: NONE, SHARED or SCALLOPED |\n| Gem Inside | `Gem Inside` | Number | item | `0.05` | How much the prong digs into the gem |\n| Prong Height | `Prong Height` | Number | item | `0.3` | Prong height over the channel mouth |\n| Prong Distance | `Prong Distance` | Number | item | `-0.6` | Extra distance between the two prongs of a gap |\n| Automatic Prong Size | `Auto Prong Size` | Boolean | item | `false` | Size the prongs automatically from the gap |\n| Prong External Diameter | `Prong Ext. Dia.` | Number | item | `0.75` | External wall prong diameter |\n| Prong Internal Diameter | `Prong Int. Dia.` | Number | item | `0.75` | Internal wall prong diameter |\n| Prong End Mode | `Prong End Mode` | Text | item | `DOUBLE` | End prongs on open curves: SINGLE or DOUBLE |\n| Extension For Manufacturing | `Manuf. Ext.` | Number | item | `1.0` | Extra prong material added in Manufacturing mode |\n| Cutters Start Height | `Cut. Start Height` | Number | item | `2.0` | Scalloped cutter start height |\n| Cutters Start Width | `Cut. Start Width` | Number | item | `0.6` | Scalloped cutter start width |\n| Cutters End Height | `Cut. End Height` | Number | item | `2.0` | Scalloped cutter end height |","metadata":{"title":"Channel","section":"Channel - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","collection":"grasshopper","hash":"56eb36767f0fc53ed93db5436408f9ee","indexed_by":"docs-index"}},{"content":"Channel — Channel - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Cutters End Width | `Cut. End Width` | Number | item | `0.6` | Scalloped cutter end width |\n| Cutters Length | `Cut. Length` | Number | item | `5.0` | Scalloped cutter length |\n| Cutters Over Girdle | `Cut. Over Girdle` | Number | item | `0.0` | Scalloped cutter vertical move (over girdle) |\n| Cutters Over Girdle Middle | `Cut. Over Girdle Mid.` | Number | item | `0.0` | Scalloped cutter middle vertical move |\n| Cutters Shape | `Cut. Shape` | Text | item | `U_SHAPE` | Scalloped cutter shape: U_SHAPE or V_SHAPE |\n| Cutters Shape Factor | `Cut. Shape Factor` | Number | item | `1.0` | Scalloped cutter shape factor |\n| Boolean Cutters | `Boolean Cutters` | Boolean | item | `false` | Subtract the scalloped cutters from the metal |\n| V-Cutters Enable | `V-Cut. Enable` | Boolean | item | `true` | Enable the scalloped v-cutters |\n| V-Cutters Start Height | `V-Cut. Start Height` | Number | item | `2.0` | V-cutter start height |\n| V-Cutters Start Width | `V-Cut. Start Width` | Number | item | `0.5` | V-cutter start width |\n| V-Cutters End Height | `V-Cut. End Height` | Number | item | `2.0` | V-cutter end height |\n| V-Cutters End Width | `V-Cut. End Width` | Number | item | `0.5` | V-cutter end width |\n| V-Cutters Length | `V-Cut. Length` | Number | item | `3.0` | V-cutter length |\n| V-Cutters Over Girdle | `V-Cut. Over Girdle` | Number | item | `0.9` | V-cutter vertical move (over girdle) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Parameters | `Gems` | Generic | item | Channel gems parameters |","metadata":{"title":"Channel","section":"Channel - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---gems-parameters","collection":"grasshopper","hash":"1ceb04235ae8a1f7a2e4ad5a15889815","indexed_by":"docs-index"}},{"content":"Channel — Channel - Section Parameters\n\nDefine the metal cross-section parameters for a channel\n\nNickname: `Channel Section` · Tab: Gemset › Channel\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | — | CHANNEL_PROFILE asset name (or semantic). If omitted, the default profile is used. |\n| Width | `Width` | Number | item | `3.0` | Section width |\n| Height | `Height` | Number | item | `2.0` | Section height |\n| Position Z | `Position Z` | Number | item | `0.0` | Vertical shift of the section along its up direction |\n| Rotation | `Rotation` | Number | item | `0.0` | Twist of the section about the curve tangent (degrees) |\n| Fillet Factor | `Fillet Factor` | Number | item | `0.3` | Fillet factor |\n| Bright Cut | `Bright Cut` | Number | item | `0.0` | Bright cut (bevel) at the groove mouth |\n| Inner Width | `Inner Width` | Number | item | `1.8` | Groove (gem seat) width |\n| Inner Height | `Inner Height` | Number | item | `0.6` | Groove (gem seat) depth |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Section Parameters | `Section` | Generic | item | Channel section parameters |","metadata":{"title":"Channel","section":"Channel - Section Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---section-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/channel/#channel---section-parameters","collection":"grasshopper","hash":"7278d403d9ecf5a7c8178743e61a41c4","indexed_by":"docs-index"}},{"content":"Cluster\n\n4 components in Gemset › Cluster.\n\nCluster\nCreates a cluster from a GemObject\n\nNickname: `Cluster` · Tab: Gemset › Cluster\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the cluster for |\n| Gems Params _(optional)_ | `Gems` | Generic | item | — | Cluster gem parameters |\n| Prongs Params _(optional)_ | `Prongs` | Generic | item | — | Cluster prongs parameters |\n| Main Gem Rail Params _(optional)_ | `Main Gem Rail` | Generic | item | — | Cluster Main Gem Rail parameters |\n| Cluster JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Cluster |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the cluster |\n| Gems | `Gems` | GemObject | list | Gem objects |\n| Meshes | `Gems Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Cluster taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the cluster |","metadata":{"title":"Cluster","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/","collection":"grasshopper","hash":"05a300a3d82487c3646a2ac6b7e4baa6","indexed_by":"docs-index"}},{"content":"Cluster — Cluster - Gems Parameters\n\nDefine the gem parameters for a cluster\n\nNickname: `Cluster Gems` · Tab: Gemset › Cluster\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Size | `Gem Size` | Number | item | `1.6` | Gem size |\n| Min Distance | `Min Distance` | Number | item | `0.1` | Minimum distance between gems |\n| Distance To Gem | `Distance To Gem` | Number | item | `2.0` | Distance to central gem |\n| Z Position | `Z Position` | Number | item | `-0.5` | Z position of gems |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation |\n| Fillet Factor | `Fillet Factor` | Number | item | `0.3` | Fillet factor |\n| Upper Rail Diameter | `Upper Rail Diameter` | Number | item | `1.0` | Upper rail diameter |\n| Upper Rail Move In Z | `Upper Rail Move In Z` | Number | item | `-0.4` | Z offset for upper rail |\n| Upper Rail Thread Diameter | `Upper Rail Thread Diameter` | Number | item | `0.3` | Thread diameter upper rail |\n| Lower Rail Enable | `Lower Rail Enable` | Boolean | item | `false` | Enable lower rail |\n| Lower Rail Diameter | `Lower Rail Diameter` | Number | item | `1.0` | Lower rail diameter |\n| Lower Rail Move In Z | `Lower Rail Move In Z` | Number | item | `-0.8` | Z offset for lower rail |\n| Lower Rail Thread Diameter | `Lower Rail Thread Diameter` | Number | item | `0.3` | Thread diameter lower rail |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Parameters | `Gems` | Generic | item | Cluster gems parameters |","metadata":{"title":"Cluster","section":"Cluster - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---gems-parameters","collection":"grasshopper","hash":"e9d5de223fc0c3d55703aa36ed128620","indexed_by":"docs-index"}},{"content":"Cluster — Cluster - Main Gem Rail Parameters\n\nDefine the main gem rail parameters for a cluster\n\nNickname: `Cluster Main Gem Rail` · Tab: Gemset › Cluster\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable gem base |\n| Width | `Width` | Number | item | `4.0` | Base width |\n| Height | `Height` | Number | item | `4.0` | Base height |\n| Rotation | `Rotation` | Number | item | `1.0` | Base rotation |\n| Thread Diameter | `Thread Diameter` | Number | item | `1.1` | Thread diameter |\n| Move In Z | `Move In Z` | Number | item | `-4.0` | Z offset |\n| Rail Inside Gem % | `Rail Inside Gem %` | Number | item | `1.0` | Rail inside gem percentage |\n| Bend Height | `Bend Height` | Number | item | `0.0` | Bend height |\n| Bend Rotation | `Bend Rotation` | Number | item | `0.0` | Bend rotation |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| GemBase Parameters | `GemBase` | Generic | item | Cluster gem base parameters |","metadata":{"title":"Cluster","section":"Cluster - Main Gem Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---main-gem-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---main-gem-rail-parameters","collection":"grasshopper","hash":"9cf1a28774abd2a23e81b64f6e42dc10","indexed_by":"docs-index"}},{"content":"Cluster — Cluster - Prongs Parameters\n\nDefine the prong parameters for a cluster\n\nNickname: `Cluster Prongs` · Tab: Gemset › Cluster\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Number | `Number` | Integer | item | `4` | Number of prongs |\n| Prongs Type | `Prongs Type` | Text | item | `STRAIGHT` | Type of prongs |\n| Int Diameter | `Int Diameter` | Number | item | `0.8` | Internal prong diameter |\n| Int Distance | `Int Distance` | Number | item | `0.5` | Internal prong distance |\n| Int Height Over Girdle | `Int Height Over Girdle` | Number | item | `0.5` | Height over girdle |\n| Int Height Under Girdle | `Int Height Under Girdle` | Number | item | `0.5` | Height under girdle |\n| Int Move In Z | `Int Move In Z` | Number | item | `0.0` | Z offset |\n| Int Gems Extension | `Int Gems Extension` | Number | item | `0.5` | Extension for manufacturing |\n| Ext Diameter | `Ext Diameter` | Number | item | `0.8` | External prong diameter |\n| Ext Distance | `Ext Distance` | Number | item | `0.5` | External prong distance |\n| Ext Height Over Girdle | `Ext Height Over Girdle` | Number | item | `0.5` | Height over girdle |\n| Ext Move In Z | `Ext Move In Z` | Number | item | `0.0` | Z offset |\n| Ext Gems Extension | `Ext Gems Extension` | Number | item | `0.5` | Extension for manufacturing |\n| Central Diameter | `Central Diameter` | Number | item | `0.8` | Central prong diameter |\n| Central Gem Inside | `Central Gem Inside` | Number | item | `0.0` | Gem inside percentage |\n| Central Height Over Girdle | `Central Height Over Girdle` | Number | item | `0.5` | Height over girdle |\n| Central Move In Z | `Central Move In Z` | Number | item | `0.0` | Z offset |\n| Central Gems Extension | `Central Gems Extension` | Number | item | `0.5` | Extension for manufacturing |","metadata":{"title":"Cluster","section":"Cluster - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---prongs-parameters","collection":"grasshopper","hash":"6661a072363096c98e35d7647c3ec446","indexed_by":"docs-index"}},{"content":"Cluster — Cluster - Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Parameters | `Prongs` | Generic | item | Cluster prongs parameters |","metadata":{"title":"Cluster","section":"Cluster - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/cluster/#cluster---prongs-parameters","collection":"grasshopper","hash":"86642d5a7e9ac2e51b153b7656ead562","indexed_by":"docs-index"}},{"content":"Halo\n\n4 components in Gemset › Halo.\n\nHalo\nCreates a halo from a GemObject\n\nNickname: `Halo` · Tab: Gemset › Halo\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object for the halo |\n| Channel Params _(optional)_ | `Channel` | Generic | item | — | Channel parameters for the halo |\n| Gems Params _(optional)_ | `Gems` | Generic | item | — | Gem parameters for the halo |\n| Prongs Params _(optional)_ | `Prongs` | Generic | item | — | Prong parameters for the halo |\n| Halo JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Halo |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the halo |\n| Gems | `Gems` | GemObject | list | Gem objects |\n| Meshes | `Gems Meshes` | Geometry | list | Gem meshes |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | Bottom center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | Bottom center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | Bottom center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | Bottom center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Halo taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the halo |","metadata":{"title":"Halo","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/","collection":"grasshopper","hash":"92c84ce425db8b8d6fd2a166c56aebd2","indexed_by":"docs-index"}},{"content":"Halo — Halo - Channel Parameters\n\nDefine the channel parameters for a halo\n\nNickname: `Halo Channel` · Tab: Gemset › Halo\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | — | Channel profile: SOFT_DOOM, DOMMED_RECTANGLE or FLAT_ROUNDED_CORNERS |\n| Height | `Height` | Number | item | `1.5` | Channel height |\n| Width | `Width` | Number | item | `1.5` | Channel width |\n| Inner Height | `Inner Height` | Number | item | `0.6` | Inner channel height |\n| Inner Width | `Inner Width` | Number | item | `0.6` | Inner channel width |\n| Bright Cut | `Bright Cut` | Number | item | `0.1` | Bright cut value |\n| Distance To Gem | `Distance To Gem` | Number | item | `0.0` | Distance from channel to gem |\n| Rotation | `Rotation` | Number | item | `0.0` | Channel rotation (degrees) |\n| Position Z | `Position Z` | Number | item | `0.0` | Z position of channel |\n| Fillet Factor | `Fillet Factor` | Number | item | `0.3` | Fillet factor |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Channel Parameters | `Channel` | Generic | item | Halo channel parameters |","metadata":{"title":"Halo","section":"Halo - Channel Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---channel-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---channel-parameters","collection":"grasshopper","hash":"9ff4e37e69dd4ad08012f7610be1fc9c","indexed_by":"docs-index"}},{"content":"Halo — Halo - Gems Parameters\n\nDefine the gem parameters for a halo\n\nNickname: `Halo Gems` · Tab: Gemset › Halo\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Size | `Gem Size` | Number | item | `1.3` | Size of gems |\n| Min Distance | `Min Distance` | Number | item | `0.2` | Minimum distance between gems |\n| Vertical | `Vertical` | Number | item | `0.0` | Vertical offset of gems |\n| Gem Inside | `Gem Inside` | Number | item | `0.05` | Push gems inside channel |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | `1.0` | Extra extension for manufacturing |\n| Prong Height | `Prong Height` | Number | item | `1.4` | Height of prongs for gems |\n| Type Prong | `Type Prong` | Text | item | `SCALLOPED` | Type of prong |\n| Boolean Cutters | `Boolean Cutters` | Boolean | item | `true` | Apply cutters/vcutters as a boolean subtraction. |\n| Fillet Factor | `Fillet Factor` | Number | item | `0.3` | Fillet factor |\n| Enable Double Prong Setting | `Enable Double Prong Setting` | Boolean | item | `false` | Enable double prong setting |\n| Enable Scallop Remove Channel | `Enable Scallop Remove Channel` | Boolean | item | `false` | Enable scallop remove channel |\n| Width Gem | `Width Gem` | Number | item | `60.0` | Scalloped width gem |\n| Height Gem | `Height Gem` | Number | item | `60.0` | Scalloped height gem |\n| Rail Width | `Rail Width` | Number | item | `60.0` | Scalloped rail width |\n| Rail Height | `Rail Height` | Number | item | `80.0` | Scalloped rail height |\n| Width Prong | `Width Prong` | Number | item | `1.0` | Scalloped width prong |\n| Height Prong | `Height Prong` | Number | item | `1.0` | Scalloped height prong |\n| Automatic Prong Size | `Automatic Prong Size` | Boolean | item | `true` | Automatic prong size |","metadata":{"title":"Halo","section":"Halo - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","collection":"grasshopper","hash":"1b7466469c6b7415ab4d94003c41cadc","indexed_by":"docs-index"}},{"content":"Halo — Halo - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Prong External Diameter | `Prong External Diameter` | Number | item | `0.7` | Prong external diameter |\n| Prong Internal Diameter | `Prong Internal Diameter` | Number | item | `0.7` | Prong internal diameter |\n| Cutters Enable | `Cutters Enable` | Boolean | item | `true` | Enable cutters |\n| Cutters Keep | `Cutters Keep` | Boolean | item | `true` | Keep cutters |\n| Cutters Length | `Cutters Length` | Number | item | `5.0` | Cutters length |\n| Cutters Over Girdle | `Cutters Over Girdle` | Number | item | `0.0` | Cutters over girdle |\n| Cutters Over Girdle Middle | `Cutters Over Girdle Middle` | Number | item | `0.0` | Cutters over girdle middle |\n| Cutters Shape | `Cutters Shape` | Text | item | `U_SHAPE` | Cutters shape: U_SHAPE, V_SHAPE, SQUARE_SHAPE, TRAPEZOIDAL_SHAPE, FRENCH_SETTING_SHAPE |\n| Cutters Start Height | `Cutters Start Height` | Number | item | `2.0` | Cutters start height |\n| Cutters Start Width | `Cutters Start Width` | Number | item | `0.6` | Cutters start width |\n| Cutters End Height | `Cutters End Height` | Number | item | `2.0` | Cutters end height |\n| Cutters End Width | `Cutters End Width` | Number | item | `0.6` | Cutters end width |\n| Cutters Shape Factor | `Cutters Shape Factor` | Number | item | `1.0` | Cutters shape factor |\n| VCutters Enable | `VCutters Enable` | Boolean | item | `true` | Enable vcutters |\n| VCutters Keep | `VCutters Keep` | Boolean | item | `true` | Keep vcutters |\n| VCutters Start Height | `VCutters Start Height` | Number | item | `2.0` | VCutters start height |\n| VCutters Start Width | `VCutters Start Width` | Number | item | `0.5` | VCutters start width |","metadata":{"title":"Halo","section":"Halo - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","collection":"grasshopper","hash":"c64a2ef4160685b492c63c5677f4d145","indexed_by":"docs-index"}},{"content":"Halo — Halo - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| VCutters End Height | `VCutters End Height` | Number | item | `2.0` | VCutters end height |\n| VCutters End Width | `VCutters End Width` | Number | item | `0.5` | VCutters end width |\n| VCutters Length | `VCutters Length` | Number | item | `3.0` | VCutters length |\n| VCutters Over Girdle | `VCutters Over Girdle` | Number | item | `0.9` | VCutters over girdle |\n| Drill Enable | `Drill Enable` | Boolean | item | `false` | Enable drill |\n| Drill Type | `Drill Type` | Text | item | `NONE` | Drill type |\n| Drill Width | `Drill Width` | Number | item | `1.0` | Drill width |\n| Drill Height | `Drill Height` | Number | item | `1.0` | Drill height |\n| Connector | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Parameters | `Gems` | Generic | item | Halo gems parameters |","metadata":{"title":"Halo","section":"Halo - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---gems-parameters","collection":"grasshopper","hash":"897aa45f01a355e490f5fa24e94de844","indexed_by":"docs-index"}},{"content":"Halo — Halo - Prongs Parameters\n\nDefine the prong parameters for a halo\n\nNickname: `Halo Prongs` · Tab: Gemset › Halo\n\nInputs","metadata":{"title":"Halo","section":"Halo - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","collection":"grasshopper","hash":"709a0091086e001fd2d3853d6bd50004","indexed_by":"docs-index"}},{"content":"Halo — Halo - Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Number of Prongs | `Number of Prongs` | Integer | item | `-4` | Number of prongs |\n| Diameter | `Diameter` | Number | item | `1.0` | Diameter of prongs |\n| Height Over Girdle | `Height Over Girdle` | Number | item | `0.2` | Height of prongs over girdle |\n| Cap Bump | `Cap Bump` | Number | item | `0.5` | Bump amount applied to the prong cap |\n| Gem Inside | `Gem Inside` | Number | item | `0.4` | Gem inside distance |\n| Channel Inside | `Channel Inside` | Number | item | `0.5` | Channel inside distance |\n| Rotation | `Rotation` | Number | item | `0.0` | Rotation of prongs |\n| Extension for Manufacturing | `Extension for Manufacturing` | Number | item | `1.0` | Extra extension for manufacturing |\n| Move in Z | `Move in Z` | Number | item | `0.0` | Move prongs in Z |\n| Internal Diameter | `Internal Diameter` | Number | item | `0.2` | Internal diameter |\n| External Diameter | `External Diameter` | Number | item | `0.2` | External diameter |\n| Mode | `Mode` | Text | item | `CUSTOM` | Prong mode (enum) |\n| Cap Mode | `Cap Mode` | Text | item | `ROUND` | Cap mode (enum) |\n| Cap Claw Inside | `Cap Claw Inside` | Number | item | `0.0` | Cap claw inside |\n| Cap Claw Tip Height | `Cap Claw Tip Height` | Number | item | `0.0` | Cap claw tip height |\n| Cap Claw Tip Width | `Cap Claw Tip Width` | Number | item | `0.0` | Cap claw tip width |\n| Cap Claw Tip Distance | `Cap Claw Tip Distance` | Number | item | `0.0` | Cap claw tip distance |\n| Cap Claw Tension | `Cap Claw Tension` | Number | item | `0.0` | Cap claw tension |\n| Extend To Bridge | `Extend To Bridge` | Boolean | item | `true` | Whether prongs extend to bridge |","metadata":{"title":"Halo","section":"Halo - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","collection":"grasshopper","hash":"193139544ffa8ef130bd59d39ff538b6","indexed_by":"docs-index"}},{"content":"Halo — Halo - Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Height To Bridge | `Height To Bridge` | Number | item | `1.9964788434002383` | Height to bridge |\n| Bridge Straight | `Bridge Straight` | Boolean | item | `true` | Whether the bridge is straight |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Parameters | `Prongs` | Generic | item | Halo prongs parameters |","metadata":{"title":"Halo","section":"Halo - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/halo/#halo---prongs-parameters","collection":"grasshopper","hash":"09d6a7927946aa86d43c2e12e272a69a","indexed_by":"docs-index"}},{"content":"Martini\n\n4 components in Gemset › Martini.\n\nMartini\nCreates a martini gemset from a GemObject\n\nNickname: `Martini` · Tab: Gemset › Martini\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the martini for |\n| Prong Params _(optional)_ | `Prongs` | Generic | item | — | Prong parameters for the martini |\n| Upper Rail Params _(optional)_ | `Upper Rail` | Generic | item | — | Upper rail parameters for the martini |\n| Side Bezel Params _(optional)_ | `Side Bezel` | Generic | item | — | Side bezel parameters for the martini |\n| Martini JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Martini |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the martini |\n| Gems | `Gems` | GemObject | list | Side gem objects |\n| Meshes | `Gems Meshes` | Geometry | list | Side gem meshes |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Martini taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Martini","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/","collection":"grasshopper","hash":"2171a52cab1505ae3a0e74410d2850cd","indexed_by":"docs-index"}},{"content":"Martini — Martini - Prong Parameters\n\nDefine the prong parameters for a martini\n\nNickname: `Martini Prongs` · Tab: Gemset › Martini\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Diameter Top | `Diameter Top` | Number | item | Diameter at the top |\n| Diameter Bottom | `Diameter Bottom` | Number | item | Diameter at the bottom |\n| Height | `Height` | Number | item | Height of prongs |\n| Height Over Girdle | `Height Over Girdle` | Number | item | Height over girdle |\n| Gem Inside | `Gem Inside` | Number | item | Gem inside amount |\n| Girdle Depth | `Girdle Depth` | Number | item | Girdle depth (claw-mode knee only) |\n| Girdle Inside | `Girdle Inside` | Number | item | Girdle inside amount |\n| Girdle Z | `Girdle Z` | Number | item | Height of the prong bow (vertical position of the middle control point); 0 = midpoint |\n| Angle | `Angle` | Number | item | Angle |\n| Rotation | `Rotation` | Number | item | Rotation |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | Extension for manufacturing |\n| Mode | `Mode` | Text | item | Prong mode: DEFAULT (circle), CUSTOM (profile asset) or CLAW |\n| Claw Cap Distance | `Claw Cap Distance` | Number | item | Claw cap distance |\n| Claw Cap Height | `Claw Cap Height` | Number | item | Claw cap height |\n| Claw Tip Width | `Claw Tip Width` | Number | item | Claw tip width |\n| Claw Tip Smoothness | `Claw Tip Smoothness` | Number | item | Claw tip smoothness |\n| Face Tangent | `Face Tangent` | Boolean | item | Face tangent? |\n| Birth Separation | `Birth Separation` | Number | item | Birth separation |\n| Connector | `Connector` | Generic | item | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs","metadata":{"title":"Martini","section":"Martini - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---prong-parameters","collection":"grasshopper","hash":"39dc390270d7aac0653e4246569617e9","indexed_by":"docs-index"}},{"content":"Martini — Martini - Prong Parameters\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Parameters | `Prongs` | Generic | item | Prong parameters for a martini |","metadata":{"title":"Martini","section":"Martini - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---prong-parameters","collection":"grasshopper","hash":"17a43d7e30aea8cc97ae373578b1cb94","indexed_by":"docs-index"}},{"content":"Martini — Martini - Side Bezel Parameters\n\nDefine the side bezel parameters for a martini\n\nNickname: `Martini Side Bezel` · Tab: Gemset › Martini\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable the side bezel |\n| Gem Size | `Gem Size` | Number | item | Gem size |\n| Width | `Width` | Number | item | Width of the side bezel |\n| Over Girdle | `Over Girdle` | Number | item | Over girdle amount |\n| Distance | `Distance` | Number | item | Distance |\n| Move In Z | `Move In Z` | Number | item | Move in Z |\n| Fillet Edge | `Fillet Edge` | Number | item | Fillet edge amount |\n| Scallop Cutter Enable | `Scallop Cutter Enable` | Boolean | item | Enable the scallop cutter |\n| Scallop Cutter Apply Boolean | `Scallop Cutter Apply Boolean` | Boolean | item | Apply the scallop cutter boolean |\n| Connector | `Connector` | Generic | item | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Side Bezel Parameters | `Side Bezel` | Generic | item | Side bezel parameters for a martini |","metadata":{"title":"Martini","section":"Martini - Side Bezel Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---side-bezel-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---side-bezel-parameters","collection":"grasshopper","hash":"b2724cf312a619c93e339647303018df","indexed_by":"docs-index"}},{"content":"Martini — Martini - Upper Rail Parameters\n\nDefine the upper rail parameters for a martini\n\nNickname: `Martini Upper Rail` · Tab: Gemset › Martini\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable upper rail |\n| Height | `Height` | Number | item | Height of the upper rail |\n| Width | `Width` | Number | item | Width of the upper rail |\n| Height Under Girdle | `Height Under Girdle` | Number | item | Height under girdle |\n| Diameter Percentage | `Diameter Percentage` | Number | item | Rail centerline as a percentage of the gem size (like Basket) |\n| Rotation | `Rotation` | Number | item | Rotation angle |\n| Chamfer | `Chamfer` | Boolean | item | Chamfer enabled |\n| Chamfer Offset | `Chamfer Offset` | Number | item | Chamfer offset |\n| External Y | `External Y` | Number | item | External Y |\n| Offset Y | `Offset Y` | Number | item | Offset Y |\n| Connector | `Connector` | Generic | item | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Upper Rail Parameters | `Upper Rail` | Generic | item | Upper rail parameters for a martini |","metadata":{"title":"Martini","section":"Martini - Upper Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---upper-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/martini/#martini---upper-rail-parameters","collection":"grasshopper","hash":"67cfa3ce87608892b0118f779f9ac64d","indexed_by":"docs-index"}},{"content":"Peghead\n\n2 components in Gemset › Peghead.\n\nPeghead\nCreates a peghead from a GemObject\n\nNickname: `Peghead` · Tab: Gemset › Peghead\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the peghead for |\n| Peghead Params _(optional)_ | `Peghead` | Generic | item | — | Parameters for the peghead |\n| Peghead JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Peghead |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the peghead |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Peghead taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the peghead |","metadata":{"title":"Peghead","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/peghead/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/peghead/","collection":"grasshopper","hash":"2d289f15aaf804be6ae5ce94a5c6bf73","indexed_by":"docs-index"}},{"content":"Peghead — Peghead - Parameters\n\nDefine the parameters for a peghead\n\nNickname: `Peghead Params` · Tab: Gemset › Peghead\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `true` | Enable peghead |\n| Profile _(optional)_ | `Profile` | Text | item | — | Peghead profile: STRAIGHT, CONCAVE or CONVEX |\n| Number of Prongs | `Number of Prongs` | Integer | item | `-4` | Number of prongs |\n| Height | `Height` | Number | item | `5.0` | Peghead height |\n| Width | `Width` | Number | item | `3.0` | Peghead width |\n| Thickness | `Thickness` | Number | item | `1.0` | Peghead thickness |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Gem inside percentage |\n| Girdle Width | `Girdle Width` | Number | item | `0.8` | Girdle width |\n| Over Girdle Height | `Over Girdle Height` | Number | item | `1.0` | Height over girdle |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Peghead Parameters | `Peghead` | Generic | item | Peghead parameters |","metadata":{"title":"Peghead","section":"Peghead - Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/peghead/#peghead---parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/peghead/#peghead---parameters","collection":"grasshopper","hash":"777bdef0099216f2327c9ae12787a6a8","indexed_by":"docs-index"}},{"content":"Tapered Baguettes\n\n2 components in Gemset › Tapered Baguettes.\n\nTapered Baguettes on Curves\nPlaces tapered baguette gems spanning between two rail curves, top edge on the first curve\n\nNickname: `TaperedBaguettes` · Tab: Gemset › Tapered Baguettes\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Curve 1 | `Crv1` | Curve | item | — | Top rail curve (carries the top-width edge) |\n| Curve 2 | `Crv2` | Curve | item | — | Bottom rail curve the baguettes span to |\n| Positions _(optional)_ | `Pos` | Number | list | — | Normalized parameters (0-1) along Curve 1 where baguettes are placed. Overrides Count when wired. |\n| Count _(optional)_ | `Count` | Integer | item | `5` | Number of evenly spaced baguettes along Curve 1 (used when Positions is not wired) |\n| Params _(optional)_ | `Params` | Generic | item | — | Parameters (from Tapered Baguettes - Params) |\n| Baguette JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a TaperedBaguette used as prototype |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Meshes | `Meshes` | Mesh | list | Tapered baguette gem meshes |\n| Planes | `Planes` | Plane | list | Placement frame of each baguette (origin at span midpoint, Y along the span, Z towards the crown) |\n| Gem Count | `Count` | Integer | item | Number of baguettes placed |\n| Taxonomy | `Taxonomy` | Generic | item | Tapered baguettes taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Tapered Baguettes","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/","collection":"grasshopper","hash":"2cdc7255fb96d5552f5653552807a88e","indexed_by":"docs-index"}},{"content":"Tapered Baguettes — Tapered Baguettes - Params\n\nDefine parameters for the Tapered Baguettes on Curves component\n\nNickname: `TaperedBag Params` · Tab: Gemset › Tapered Baguettes\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Top Width _(optional)_ | `TopW` | Number | item | `1.75` | Width of the edge on the top rail |\n| Bottom Width _(optional)_ | `BotW` | Number | item | `1.25` | Width of the edge on the bottom rail |\n| Length _(optional)_ | `Len` | Number | item | `2.25` | Reference length. Each gem is stretched to its rail span; table height and culet length scale by span/length. |\n| Depth Percentage _(optional)_ | `Depth%` | Integer | item | `64` | Total depth as a percentage of the top width (recomputes crown, girdle and pavilion depths) |\n| Girdle Depth _(optional)_ | `Girdle` | Number | item | `0.05775` | Explicit girdle depth (overrides the percentage split) |\n| Crown Depth _(optional)_ | `Crown` | Number | item | `0.45` | Explicit crown depth (overrides the percentage split) |\n| Pavilion Depth _(optional)_ | `Pavilion` | Number | item | `0.71` | Explicit pavilion depth (overrides the percentage split) |\n| Table Width _(optional)_ | `TableW` | Number | item | `1.0` | Width of the table facet |\n| Table Height _(optional)_ | `TableH` | Number | item | `1.75` | Height (length direction) of the table facet, scaled with the span |\n| Pavilion Scale _(optional)_ | `PavScale` | Number | item | `0.75` | Scale of the pavilion mid outline relative to the girdle |\n| Culet Length _(optional)_ | `Culet` | Number | item | `0.7` | Length of the culet line, scaled with the span |\n| Compound _(optional)_ | `Compound` | Text | item | `Diamond` | Gem compound (e.g. Diamond) |\n\nOutputs","metadata":{"title":"Tapered Baguettes","section":"Tapered Baguettes - Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/#tapered-baguettes---params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/#tapered-baguettes---params","collection":"grasshopper","hash":"afee35d7d1ae54f2b3ed3917fcb6574b","indexed_by":"docs-index"}},{"content":"Tapered Baguettes — Tapered Baguettes - Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Params | `Params` | Generic | item | Parameters for the Tapered Baguettes on Curves component |","metadata":{"title":"Tapered Baguettes","section":"Tapered Baguettes - Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/#tapered-baguettes---params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tapered-baguettes/#tapered-baguettes---params","collection":"grasshopper","hash":"3366166a40a30c397c3148298c526f17","indexed_by":"docs-index"}},{"content":"Trellis\n\n3 components in Gemset › Trellis.","metadata":{"title":"Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/","collection":"grasshopper","hash":"4057d5c09c9bb5980836ec0708142ecc","indexed_by":"docs-index"}},{"content":"Trellis — Trellis\n\nCreates a trellis gemset from a GemObject\n\nNickname: `Trellis` · Tab: Gemset › Trellis\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the trellis for |\n| Prongs Params _(optional)_ | `Prongs` | Generic | item | — | Prong parameters for the trellis |\n| Upper Rail Params _(optional)_ | `Upper Rail` | Generic | item | — | Upper rail parameters for the trellis |\n| Ring Curve _(optional)_ | `Ring Curve` | Curve | item | — | Optional ring curve. If omitted, a default circle is built from the Diameter. |\n| Diameter _(optional)_ | `Diameter` | Number | item | `17.35` | Ring (finger) diameter used to build the default ring curve when none is supplied |\n| Curve Vertical Separation _(optional)_ | `Curve Vert. Sep.` | Number | item | `5.60` | Vertical gap between the gem girdle and the top of the default ring curve |\n| Rotate 90 _(optional)_ | `Rotate 90` | Boolean | item | `false` | Rotate the whole gemset 90 degrees around the gem table normal |\n| Trellis JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a TrellisGemset |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n| Rail Diameter _(optional)_ | `Rail Diameter` | Number | item | `5.20` | Legacy upper rail diameter (moved here from the Upper Rail params) |\n\nOutputs","metadata":{"title":"Trellis","section":"Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis","collection":"grasshopper","hash":"8e820ebb951750af2a6aba488b9a753e","indexed_by":"docs-index"}},{"content":"Trellis — Trellis\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the trellis |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Trellis taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Trellis","section":"Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis","collection":"grasshopper","hash":"4152e983d25d1101a910f286a7e88628","indexed_by":"docs-index"}},{"content":"Trellis — Trellis - Prongs Parameters\n\nDefine the prong parameters for a trellis gemset\n\nNickname: `Trellis Prongs` · Tab: Gemset › Trellis\n\nInputs","metadata":{"title":"Trellis","section":"Trellis - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","collection":"grasshopper","hash":"5e0d663bbfe7b5576e2d7c2d09b6fac4","indexed_by":"docs-index"}},{"content":"Trellis — Trellis - Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Prongs Diameter | `Prongs Diameter` | Number | item | `1.05` | Prong tube diameter |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial offset of the prong top from the girdle |\n| Over Girdle | `Over Girdle` | Number | item | `0.0` | Prong height over the girdle |\n| Bend Inside | `Bend Inside` | Number | item | `0.30` | How far the prong bends inward |\n| Bulge Start 1 | `Bulge Start 1` | Number | item | `1.60` | First bulge start |\n| Bulge End 1 | `Bulge End 1` | Number | item | `2.70` | First bulge end |\n| Bulge Start 2 | `Bulge Start 2` | Number | item | `1.55` | Second bulge start |\n| Bulge End 2 | `Bulge End 2` | Number | item | `2.70` | Second bulge end |\n| Birth Separation Y | `Birth Separation Y` | Number | item | `-0.05` | Y separation at the prong birth |\n| Opening Angle | `Opening Angle` | Number | item | `52.0` | Opening angle of the trellis (deg) |\n| Middle Offset 1 | `Middle Offset 1` | Number | item | `-0.40` | First middle control offset |\n| Middle Offset 2 | `Middle Offset 2` | Number | item | `-2.25` | Second middle control offset |\n| Top Vertical | `Top Vertical` | Number | item | `0.0` | Vertical offset of the prong top |\n| Mode | `Mode` | Text | item | `CIRCLE` | Prong mode: CIRCLE or CLAW |\n| Bottom Profile | `Bottom Profile` | Text | item | `CIRCLE` | Bottom section profile: CIRCLE or SQUARE |\n| Bottom Width | `Bottom Width` | Number | item | `1.05` | Bottom section width (Square profile) |\n| Bottom Height | `Bottom Height` | Number | item | `1.05` | Bottom section height (Square profile) |\n| Ring Separation Y | `Ring Separation Y` | Number | item | `0.0` | Symmetric Y separation of the prong landing points |","metadata":{"title":"Trellis","section":"Trellis - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","collection":"grasshopper","hash":"eb7a921e1c0fc1eb632ad2564ed84528","indexed_by":"docs-index"}},{"content":"Trellis — Trellis - Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Face Tangent | `Face Tangent` | Boolean | item | `false` | Prong faces the girdle tangent (ON) or the gem centre (OFF) |\n| Claw Cap Distance | `Claw Cap Distance` | Number | item | `0.0` | Claw: apex toward the gem centre |\n| Claw Cap Height | `Claw Cap Height` | Number | item | `0.0` | Claw: apex along the gem axis |\n| Claw Tip Width | `Claw Tip Width` | Number | item | `0.0` | Claw: apex thickness fraction |\n| Claw Tip Smoothness | `Claw Tip Smoothness` | Number | item | `0.0` | Claw: body to cap transition smoothness |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | `0.50` | Extra prong material above the gem (Manufacturing only) |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Parameters | `Prongs` | Generic | item | Prong parameters for a trellis gemset |","metadata":{"title":"Trellis","section":"Trellis - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---prongs-parameters","collection":"grasshopper","hash":"59ea376e0241f7053c92d75e2895b8f3","indexed_by":"docs-index"}},{"content":"Trellis — Trellis - Upper Rail Parameters\n\nDefine the upper rail parameters for a trellis gemset\n\nNickname: `Trellis Upper Rail` · Tab: Gemset › Trellis\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `true` | Enable the upper rail |\n| Mode | `Mode` | Text | item | `CIRCLE` | Rail mode: CIRCLE or CUSTOM |\n| Width | `Width` | Number | item | `1.50` | Rail width |\n| Height | `Height` | Number | item | `1.20` | Rail height |\n| Height Under Girdle | `Height Under Girdle` | Number | item | `1.45` | Rail height under the girdle |\n| External X | `External X` | Number | item | `7.50` | Outer X dimension of the rail (mm) |\n| External Y | `External Y` | Number | item | `0.0` | Outer Y dimension (0 = uniform with X) |\n| Offset Y | `Offset Y` | Number | item | `0.0` | Shift the rail centerline along Y |\n| Rotation | `Rotation` | Number | item | `0.0` | Rail rotation |\n| Chamfer | `Chamfer` | Boolean | item | `false` | Apply a chamfer to the rail |\n| Chamfer Offset | `Chamfer Offset` | Number | item | `0.0` | Chamfer offset |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Upper Rail Parameters | `Upper Rail` | Generic | item | Upper rail parameters for a trellis gemset |","metadata":{"title":"Trellis","section":"Trellis - Upper Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---upper-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trellis/#trellis---upper-rail-parameters","collection":"grasshopper","hash":"e652f32efcad12cc1a85a4213684c647","indexed_by":"docs-index"}},{"content":"Trilogy Trellis\n\n4 components in Gemset › Trilogy Trellis.","metadata":{"title":"Trilogy Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/","collection":"grasshopper","hash":"73ff92da049f8c6553e27df7f851a1d5","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis\n\nCreates a trellis-style gemset over a three stones set (center gem + two side gems, as output by the Three Stones component)\n\nNickname: `TrilogyTrellis` · Tab: Gemset › Trilogy Trellis\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gems | `Gems` | GemObject | list | — | The three gems of the set: center, side A, side B (the Three Stones component outputs them in this order) |\n| Shank Prongs Params _(optional)_ | `Shank Prongs` | Generic | item | — | Shank prong parameters for the trilogy trellis |\n| Cross Prongs Params _(optional)_ | `Cross Prongs` | Generic | item | — | Cross prong parameters for the trilogy trellis |\n| Upper Rail Params _(optional)_ | `Upper Rail` | Generic | item | — | Under-girdle rail parameters (center rail, and the side rails too unless Side Rail Params is wired) |\n| Side Rail Params _(optional)_ | `Side Rail` | Generic | item | — | Separate parameters for the side rails. Wiring this enables side rail edition. |\n| Ring Curve _(optional)_ | `Ring Curve` | Curve | item | — | Optional ring curve. If omitted, a default circle is built from the Diameter. |\n| Diameter _(optional)_ | `Diameter` | Number | item | `17.35` | Ring (finger) diameter used to build the default ring curve when none is supplied |\n| Curve Vertical Separation _(optional)_ | `Curve Vert. Sep.` | Number | item | `5.60` | Vertical gap between the center girdle plane and the top of the default ring curve |\n| Trilogy Trellis JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a TrilogyTrellis |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis","collection":"grasshopper","hash":"0a49d16aa9a6539af21feb56e3152c85","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the trilogy trellis |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Trilogy trellis taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis","collection":"grasshopper","hash":"c519a22d6107eb9586daf2491c3f4020","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Cross Prongs Parameters\n\nDefine the cross prong parameters for a trilogy trellis (the 4 blend prongs that cross over the center stone to the opposite side gem)\n\nNickname: `TT Cross Prongs` · Tab: Gemset › Trilogy Trellis\n\nInputs","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Cross Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","collection":"grasshopper","hash":"4636b8c651a66e6763b4ec39539d94f1","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Cross Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Prongs Diameter | `Diameter` | Number | item | `1.05` | Prong tube diameter |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial dig into the center gem girdle at the stub |\n| Over Girdle | `Over Girdle` | Number | item | `0.0` | Height of the grip tip above the center gem girdle |\n| Top Vertical | `Top Vertical` | Number | item | `-0.25` | Length of the straight vertical stub below the tip before the blend starts |\n| Bulge Start | `Bulge Start` | Number | item | `0.50` | Tangent strength leaving the center stub |\n| Bulge End | `Bulge End` | Number | item | `2.30` | Tangent strength arriving onto the side gem's outer prong axis |\n| Side Gem Inside | `Side Gem Inside` | Number | item | `0.0` | Radial dig into the side gem girdle at the outer corner |\n| Side Over Girdle | `Side Over Girdle` | Number | item | `0.0` | Height of the grip tip above the side gem girdle |\n| Tip Length | `Tip Length` | Number | item | `0.85` | Straight run of the outer prong below the side gem girdle |\n| Middle Inside 1 | `Mid Inside 1` | Number | item | `0.70` | Horizontal offset of the blend's middle control point, crossing family 1 |\n| Middle Inside 2 | `Mid Inside 2` | Number | item | `0.0` | Horizontal offset of the blend's middle control point, crossing family 2 |\n| Middle Height 1 | `Mid Height 1` | Number | item | `0.0` | Vertical offset of the middle control point, crossing family 1 |\n| Middle Height 2 | `Mid Height 2` | Number | item | `0.0` | Vertical offset of the middle control point, crossing family 2 |\n| Middle Position 1 | `Mid Position 1` | Number | item | `0.50` | Position of the middle control point along the blend (0-1), crossing family 1 |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Cross Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","collection":"grasshopper","hash":"97f7cdac49ef0950bf8f86e8024185fc","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Cross Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Middle Position 2 | `Mid Position 2` | Number | item | `0.50` | Position of the middle control point along the blend (0-1), crossing family 2 |\n| Extension For Manufacturing | `Manuf. Ext.` | Number | item | `0.50` | Extra prong material added at both grip tips in Manufacturing mode |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cross Prongs Parameters | `Cross Prongs` | Generic | item | Cross prong parameters for a trilogy trellis |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Cross Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---cross-prongs-parameters","collection":"grasshopper","hash":"17732cfdbfbca76e8b3b8ae19ee2d0b8","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Shank Prongs Parameters\n\nDefine the shank prong parameters for a trilogy trellis (the 4 prongs that descend from the side gems to the ring curve)\n\nNickname: `TT Shank Prongs` · Tab: Gemset › Trilogy Trellis\n\nInputs","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Shank Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","collection":"grasshopper","hash":"cab284f0fc6cb2eac515c7736287e647","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Shank Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Prongs Diameter | `Diameter` | Number | item | `1.05` | Prong tube diameter |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial dig of the prong into the side gem girdle |\n| Over Girdle | `Over Girdle` | Number | item | `0.30` | How far the prong grip tip rises above the side gem girdle |\n| Top Vertical | `Top Vertical` | Number | item | `0.0` | Straight vertical run below the tip before the bezier starts |\n| Bulge Start | `Bulge Start` | Number | item | `1.60` | Tangent strength at the gem-side start of the bezier |\n| Bulge End | `Bulge End` | Number | item | `2.70` | Tangent strength where the prong lands on the ring |\n| Opening Angle | `Opening Angle` | Number | item | `70.0` | Angle (degrees) from the top of the ring where the prong lands |\n| Middle Offset | `Middle Offset` | Number | item | `0.0` | Radial offset of the bezier's middle control point |\n| Cross Height | `Cross Height` | Number | item | `0.0` | Raises/lowers the bezier's middle control point without moving the ends |\n| Ring Separation Y | `Ring Sep. Y` | Number | item | `0.0` | Symmetric Y separation of the landing points on the ring |\n| Prong Mode | `Mode` | Text | item | `CIRCLE` | Top profile: CIRCLE or CLAW |\n| Bottom Profile | `Bottom Profile` | Text | item | `CIRCLE` | Bottom profile: CIRCLE, SQUARE or CUSTOM |\n| Bottom Width | `Bottom Width` | Number | item | `1.05` | Radial width of the rectangular bottom section (Square only) |\n| Bottom Height | `Bottom Height` | Number | item | `1.05` | Height of the rectangular bottom section (Square only) |\n| Profile Start | `Profile Start` | Number | item | `0.40` | Custom profile only: where along the prong the circle-to-profile morph begins (0-1) |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Shank Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","collection":"grasshopper","hash":"03c29592b243a4d75434c2a4e9f43413","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Shank Prongs Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Claw Cap Distance | `Claw Cap Dist.` | Number | item | `0.0` | Pulls the claw apex toward the gem centre (Claw only) |\n| Claw Cap Height | `Claw Cap Height` | Number | item | `0.0` | Raises/lowers the claw apex along its gem's axis (Claw only) |\n| Claw Tip Width | `Claw Tip Width` | Number | item | `0.0` | Apex thickness as a fraction of the tube (Claw only) |\n| Claw Tip Smoothness | `Claw Tip Smooth.` | Number | item | `0.0` | Smooths the body-to-cap transition (Claw only) |\n| Extension For Manufacturing | `Manuf. Ext.` | Number | item | `0.50` | Extra prong material added above the gem in Manufacturing mode |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Prongs Parameters | `Shank Prongs` | Generic | item | Shank prong parameters for a trilogy trellis |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Shank Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---shank-prongs-parameters","collection":"grasshopper","hash":"654d5792ed5287a5bfcabccf3d5e1614","indexed_by":"docs-index"}},{"content":"Trilogy Trellis — Trilogy Trellis - Upper Rail Parameters\n\nDefine the under-girdle rail parameters for a trilogy trellis. Wire to Upper Rail (center + sides) or to Side Rail (sides only).\n\nNickname: `TT Upper Rail` · Tab: Gemset › Trilogy Trellis\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable Center | `Enable Center` | Boolean | item | `true` | Build the center gem's rail |\n| Enable Sides | `Enable Sides` | Boolean | item | `true` | Build the side gems' rails |\n| Width | `Width` | Number | item | `1.00` | Rail section width |\n| Height | `Height` | Number | item | `0.90` | Rail section height |\n| Height Under Girdle | `H. Under Girdle` | Number | item | `1.45` | Drop of the rail below the gem girdle |\n| Rotation | `Rotation` | Number | item | `0.0` | Twists the cross-section around the rail tangent (degrees) |\n| Chamfer | `Chamfer` | Boolean | item | `false` | Boolean-subtract each gem's crown cutter from its own rail |\n| Chamfer Offset | `Chamfer Offset` | Number | item | `0.0` | Chamfer cutter offset |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Upper Rail Parameters | `Upper Rail` | Generic | item | Under-girdle rail parameters for a trilogy trellis |","metadata":{"title":"Trilogy Trellis","section":"Trilogy Trellis - Upper Rail Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---upper-rail-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/trilogy-trellis/#trilogy-trellis---upper-rail-parameters","collection":"grasshopper","hash":"3ed0a9b29188cc49928fdded05922c6f","indexed_by":"docs-index"}},{"content":"Tulip\n\n3 components in Gemset › Tulip.\n\nTulip\nCreates a tulip gemset from a GemObject\n\nNickname: `Tulip` · Tab: Gemset › Tulip\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem | `Gem` | GemObject | item | — | Gem object to create the tulip for |\n| Prong Params _(optional)_ | `Prongs` | Generic | item | — | Prong (petal) parameters for the tulip |\n| Ornament Params _(optional)_ | `Ornament` | Generic | item | — | Ornament parameters for the tulip |\n| Tulip JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Tulip |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Brep parts of the tulip |\n| SubDs | `SubDs` | SubD | list | SubD parts of the tulip |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Tulip taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Tulip","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/","collection":"grasshopper","hash":"d618511f60ccd3360bb720e5f3626e7e","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Ornament Parameters\n\nDefine the ornament (union / leaf) parameters for a tulip\n\nNickname: `Tulip Ornament` · Tab: Gemset › Tulip\n\nInputs","metadata":{"title":"Tulip","section":"Tulip - Ornament Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","collection":"grasshopper","hash":"5e0ae59fe20abaa5950e99d4516306ff","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Ornament Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Type | `Type` | Text | item | `NONE` | Ornament type: NONE, UNION or LEAF |\n| Placement | `Placement` | Text | item | `BOTH` | Which gaps receive the ornament: AXISY, AXISX or BOTH |\n| Diameter | `Diameter` | Number | item | `0.75` | Ornament tube diameter (mm) |\n| Attach Param | `Attach Param` | Number | item | `0.46` | 0 base..1 tip: where the curvature sits |\n| Arch Height | `Arch Height` | Number | item | `0.6` | Union: how high the arch bows over the centre |\n| Tip Inside | `Tip Inside` | Number | item | `0.0` | Union: apex radial vs girdle (0 touches, + inward) |\n| Length | `Length` | Number | item | `2.4` | Leaf: reach / vertical extent of the loop (mm) |\n| Top Bottom Width | `Top Bottom Width` | Number | item | `0.4` | Leaf: lateral width of the flat top & bottom (mm) |\n| Opening | `Opening` | Number | item | `1.15` | Leaf: lateral width at the middle (mm) |\n| Top Gem Inside | `Top Gem Inside` | Number | item | `0.35` | Leaf: top depth inward from the girdle |\n| Middle Inside | `Middle Inside` | Number | item | `0.9` | Leaf: middle depth inward from the girdle (bow) |\n| Bottom Gem Inside | `Bottom Gem Inside` | Number | item | `0.9` | Leaf: bottom distance outward from the gem centre |\n| Curvature Position | `Curvature Position` | Number | item | `0.48` | Leaf: 0 bottom..1 top where the bow sits |\n| Smooth | `Smooth` | Number | item | `0.05` | Leaf: corner roundness (0 sharp..1 round) |\n| Move In Z | `Move In Z` | Number | item | `0.0` | Vertical shift of the whole ornament (mm) |\n| Top Z | `Top Z` | Number | item | `-0.55` | Extra vertical offset of the top tip (mm) |\n| Bottom Z | `Bottom Z` | Number | item | `0.25` | Extra vertical offset of the bottom tip (mm) |","metadata":{"title":"Tulip","section":"Tulip - Ornament Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","collection":"grasshopper","hash":"d407e8c38f06cf92b3d5e3ea07815df7","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Ornament Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Leaf Per Axis | `Leaf Per Axis` | Boolean | item | `false` | Use the separate Y leaf shape for the Y-axis gaps |\n| Leaf Y Length | `Leaf Y Length` | Number | item | `0.5` | Y leaf: vertical extent (mm) |\n| Leaf Y Top Bottom Width | `Leaf Y Top Bottom Width` | Number | item | `0.3` | Y leaf: flat top & bottom width (mm) |\n| Leaf Y Opening | `Leaf Y Opening` | Number | item | `1.15` | Y leaf: middle width (mm) |\n| Leaf Y Top Gem Inside | `Leaf Y Top Gem Inside` | Number | item | `-1.0` | Y leaf: top depth |\n| Leaf Y Middle Inside | `Leaf Y Middle Inside` | Number | item | `0.05` | Y leaf: middle depth |\n| Leaf Y Bottom Gem Inside | `Leaf Y Bottom Gem Inside` | Number | item | `1.35` | Y leaf: bottom depth |\n| Leaf Y Curvature Position | `Leaf Y Curvature Position` | Number | item | `0.7` | Y leaf: 0 bottom..1 top where the bow sits |\n| Leaf Y Smooth | `Leaf Y Smooth` | Number | item | `0.05` | Y leaf: corner roundness |\n| Leaf Y Move In Z | `Leaf Y Move In Z` | Number | item | `0.1` | Y leaf: vertical shift (mm) |\n| Leaf Y Top Z | `Leaf Y Top Z` | Number | item | `0.0` | Y leaf: top tip vertical offset (mm) |\n| Leaf Y Bottom Z | `Leaf Y Bottom Z` | Number | item | `-0.5` | Y leaf: bottom tip vertical offset (mm) |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Ornament Parameters | `Ornament` | Generic | item | Ornament parameters for a tulip |","metadata":{"title":"Tulip","section":"Tulip - Ornament Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---ornament-parameters","collection":"grasshopper","hash":"b4096c1fd9e0b73e77f1a0c6ac5ccd00","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Prong Parameters\n\nDefine the prong (petal) parameters for a tulip\n\nNickname: `Tulip Prongs` · Tab: Gemset › Tulip\n\nInputs","metadata":{"title":"Tulip","section":"Tulip - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","collection":"grasshopper","hash":"904a0dbecf3950e665f604e3a69cf8b4","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Prong Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Number | `Number` | Integer | item | `4` | Number of petal pairs (snaps to 4 or 6) |\n| Pipe Diameter | `Pipe Diameter` | Number | item | `1.0` | SubD pipe section diameter |\n| Depth Bulge | `Depth Bulge` | Number | item | `1.0` | Bulge width: multiplier on the reference tangential bow |\n| Height | `Height` | Number | item | `1.1` | Vertical scale factor of the whole setting |\n| Gem Inside | `Gem Inside` | Number | item | `0.0` | Radial offset from the stone curve |\n| Bulge Inside | `Bulge Inside` | Number | item | `-0.17` | Smooth radial bulge (+in / -out) |\n| Bulge Position | `Bulge Position` | Number | item | `0.5` | Height fraction where the bulge belly is centred (0..1) |\n| Bulge Spread | `Bulge Spread` | Number | item | `0.22` | How far the bulge reaches up/down from its centre |\n| Bulge Close Bottom | `Bulge Close Bottom` | Number | item | `0.0` | Height fraction over which the bulge closes at the bottom |\n| Bulge Close Top | `Bulge Close Top` | Number | item | `0.01` | Height fraction over which the bulge closes at the top |\n| Move In Z | `Move In Z` | Number | item | `0.0` | Vertical offset of the whole setting |\n| Mode | `Mode` | Text | item | `ROUND` | Prong tip mode: ROUND or CLAW |\n| Tip Cap | `Tip Cap` | Number | item | `1.0` | Claw: extension length of the claw tip |\n| Cap Distance To Center | `Cap Distance To Center` | Number | item | `0.4` | Claw: move the claw tip toward the stone centre |\n| Cap Height | `Cap Height` | Number | item | `-0.5` | Claw: move the claw tip up / down |\n| Tip Smoothness | `Tip Smoothness` | Number | item | `0.0` | Claw: blend smoothness |\n| Tip Width | `Tip Width` | Number | item | `0.3` | Claw: width remaining at the very tip |","metadata":{"title":"Tulip","section":"Tulip - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","collection":"grasshopper","hash":"1bb7e9fcf46922e8f188d227967776fb","indexed_by":"docs-index"}},{"content":"Tulip — Tulip - Prong Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | `0.7` | Extension for manufacturing |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Parameters | `Prongs` | Generic | item | Prong parameters for a tulip |","metadata":{"title":"Tulip","section":"Tulip - Prong Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/gemset/tulip/#tulip---prong-parameters","collection":"grasshopper","hash":"0960933f8e0c66d13377d9b2ad9d471f","indexed_by":"docs-index"}},{"content":"Readers\n\nUnpack a parameter dictionary back into its individual values.\n\n44 components in 3 groups.\n\n- Gemsets — 23 components: Bezel Airgap Reader, Bezel Cutter Reader, Bezel Params Reader, Cluster Gems Reader, Cluster Main Gem Rail Reader, Cluster Prongs Reader, Peghead Reader, Basket Base Rail Reader, Basket Prong Reader, Basket Upper Rail Reader, Martini Prong Reader, Martini Side Bezel Reader, Martini Upper Rail Reader, Trellis Prongs Reader, Trellis Upper Rail Reader, Tulip Ornament Reader, Tulip Prong Reader, Halo Channel Reader, Halo Gems Reader, Halo Prongs Reader, Halo Reader, Trellis Reader, Tulip Reader.\n- Global — 6 components: Center Stone Reader, Computation Mode, Eternity Reader, Gemset Reader, Global Reader, Shank Reader.\n- Shanks — 15 components: Advanced Cathedral Gems Reader, Advanced Cathedral Shank Reader, Cathedral Gems Reader, Cathedral Shank Reader, Eternity Bezels Reader, Eternity Gems Reader, Eternity Prongs Reader, Eternity Shank Lower Reader, Eternity Shank Upper Reader, Classic Adv Reader, Classic Bottom Reader, Classic External Reader, Classic Gems Reader, Classic Mid Reader, Classic Top Reader.","metadata":{"title":"Readers","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/","collection":"grasshopper","hash":"70da23e3176c9b2ca2ac5db2415b0276","indexed_by":"docs-index"}},{"content":"Gemsets\n\n23 components in Readers › Gemsets.\n\nBezel Airgap Reader\nReads a Bezel airgap dictionary and outputs its standard values.\n\nNickname: `BezelAirgapReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bezel Dictionary | `BezelDict` | Generic | item | Dictionary with bezel parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable airgaps. |\n| Profile | `Profile` | Text | item | Airgap profile. |\n| Number | `Number` | Integer | item | Number of airgaps. |\n| Width | `Width` | Number | item | Airgap width. |\n| Height | `Height` | Number | item | Airgap height. |\n| Rotation | `Rotation` | Number | item | Rotation. |\n| Rotation V | `RotationV` | Number | item | Vertical rotation. |\n| Rotation Global | `RotationGlobal` | Number | item | Global rotation. |\n| Move In Vertical | `MoveInVertical` | Number | item | Move in vertical. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/","collection":"grasshopper","hash":"ae37d912c10ac12669b6b9bd67f8487b","indexed_by":"docs-index"}},{"content":"Gemsets — Bezel Cutter Reader\n\nReads a Bezel cutter dictionary and outputs its standard values.\n\nNickname: `BezelCutterReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bezel Dictionary | `BezelDict` | Generic | item | Dictionary with bezel parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable cutters. |\n| Profile | `Profile` | Text | item | Cutter profile. |\n| Number | `Number` | Integer | item | Number of cutters. |\n| Width | `Width` | Number | item | Cutter width. |\n| Height | `Height` | Number | item | Cutter height. |\n| Rotation | `Rotation` | Number | item | Rotation. |\n| Rotation V | `Rotation V` | Number | item | Vertical rotation. |\n| Rotation Global | `Rotation Global` | Number | item | Global rotation. |\n| Move In Vertical | `Move In Vertical` | Number | item | Move in vertical. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Bezel Cutter Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#bezel-cutter-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#bezel-cutter-reader","collection":"grasshopper","hash":"0b722f087f4a72b786999f74b024adbc","indexed_by":"docs-index"}},{"content":"Gemsets — Bezel Params Reader\n\nReads a Bezel dictionary and outputs its standard values.\n\nNickname: `BezelParamsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bezel Dictionary | `BezelDict` | Generic | item | Dictionary with bezel parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Text | item | Bezel profile. |\n| Height | `Height` | Number | item | Bezel height. |\n| Width | `Width` | Number | item | Bezel width. |\n| Gem Inside | `Gem Inside` | Number | item | Gem inside. |\n| Girdle Height | `Girdle Height` | Number | item | Girdle height. |\n| Girdle Width | `Girdle Width` | Number | item | Girdle width. |\n| Support | `Support` | Integer | item | Support type. |\n| Support Width | `Support Width` | Number | item | Support width. |\n| Support Thickness | `Support Thickness` | Number | item | Support thickness. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Bezel Params Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#bezel-params-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#bezel-params-reader","collection":"grasshopper","hash":"fb2d0ea890c440a44b20975d6d9bce3c","indexed_by":"docs-index"}},{"content":"Gemsets — Cluster Gems Reader\n\nReads a Cluster gems dictionary and outputs its standard values.\n\nNickname: `ClusterGemsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cluster Dictionary | `ClusterDict` | Generic | item | Dictionary with cluster parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Size | `Gem Size` | Number | item | Gem size. |\n| Min Distance | `Min Distance` | Number | item | Minimum distance between gems. |\n| Distance To Gem | `Distance To Gem` | Number | item | Distance to central gem. |\n| Z Position | `Z Position` | Number | item | Z position of gems. |\n| Rotation | `Rotation` | Number | item | Rotation. |\n| Fillet Factor | `Fillet Factor` | Number | item | Fillet factor. |\n| Upper Rail Diameter | `Upper Rail Diameter` | Number | item | Upper rail diameter. |\n| Upper Rail Move In Z | `Upper Rail Move In Z` | Number | item | Z offset for upper rail. |\n| Upper Rail Thread Diameter | `Upper Rail Thread Diameter` | Number | item | Thread diameter upper rail. |\n| Lower Rail Enable | `Lower Rail Enable` | Boolean | item | Enable lower rail. |\n| Lower Rail Diameter | `Lower Rail Diameter` | Number | item | Lower rail diameter. |\n| Lower Rail Move In Z | `Lower Rail Move In Z` | Number | item | Z offset for lower rail. |\n| Lower Rail Thread Diameter | `Lower Rail Thread Diameter` | Number | item | Thread diameter lower rail. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Cluster Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-gems-reader","collection":"grasshopper","hash":"d5c4b48061b65d58352913834e5f5ac0","indexed_by":"docs-index"}},{"content":"Gemsets — Cluster Main Gem Rail Reader\n\nReads a Cluster main gem rail dictionary and outputs its standard values.\n\nNickname: `ClusterMainGemRailReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cluster Dictionary | `ClusterDict` | Generic | item | Dictionary with cluster parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable gem base. |\n| Width | `Width` | Number | item | Base width. |\n| Height | `Height` | Number | item | Base height. |\n| Rotation | `Rotation` | Number | item | Base rotation. |\n| Thread Diameter | `Thread Diameter` | Number | item | Thread diameter. |\n| Move In Z | `Move In Z` | Number | item | Z offset. |\n| Rail Inside Gem % | `Rail Inside Gem %` | Number | item | Rail inside gem percentage. |\n| Bend Height | `Bend Height` | Number | item | Bend height. |\n| Bend Rotation | `Bend Rotation` | Number | item | Bend rotation. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Cluster Main Gem Rail Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-main-gem-rail-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-main-gem-rail-reader","collection":"grasshopper","hash":"565db4b2d5ac95b4391fff71a2377a79","indexed_by":"docs-index"}},{"content":"Gemsets — Cluster Prongs Reader\n\nReads a Cluster prongs dictionary and outputs its standard values.\n\nNickname: `ClusterProngsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cluster Dictionary | `ClusterDict` | Generic | item | Dictionary with cluster parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Cluster Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-prongs-reader","collection":"grasshopper","hash":"599a195b2fbe62a4332cbc428a53ffca","indexed_by":"docs-index"}},{"content":"Gemsets — Cluster Prongs Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Number | `Number` | Integer | item | Number of prongs. |\n| Prongs Type | `Prongs Type` | Text | item | Type of prongs. |\n| Int Diameter | `Int Diameter` | Number | item | Internal prong diameter. |\n| Int Distance | `Int Distance` | Number | item | Internal prong distance. |\n| Int Height Over Girdle | `Int Height Over Girdle` | Number | item | Height over girdle. |\n| Int Height Under Girdle | `Int Height Under Girdle` | Number | item | Height under girdle. |\n| Int Move In Z | `Int Move In Z` | Number | item | Z offset. |\n| Int Gems Extension | `Int Gems Extension` | Number | item | Extension for manufacturing. |\n| Ext Diameter | `Ext Diameter` | Number | item | External prong diameter. |\n| Ext Distance | `Ext Distance` | Number | item | External prong distance. |\n| Ext Height Over Girdle | `Ext Height Over Girdle` | Number | item | Height over girdle. |\n| Ext Move In Z | `Ext Move In Z` | Number | item | Z offset. |\n| Ext Gems Extension | `Ext Gems Extension` | Number | item | Extension for manufacturing. |\n| Central Diameter | `Central Diameter` | Number | item | Central prong diameter. |\n| Central Gem Inside | `Central Gem Inside` | Number | item | Gem inside percentage. |\n| Central Height Over Girdle | `Central Height Over Girdle` | Number | item | Height over girdle. |\n| Central Move In Z | `Central Move In Z` | Number | item | Z offset. |\n| Central Gems Extension | `Central Gems Extension` | Number | item | Extension for manufacturing. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Cluster Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#cluster-prongs-reader","collection":"grasshopper","hash":"78fc4155d485abc52f4b25d7fd37a1db","indexed_by":"docs-index"}},{"content":"Gemsets — Peghead Reader\n\nReads a Peghead dictionary and outputs its standard values.\n\nNickname: `PegheadReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Peghead Dictionary | `PegheadDict` | Generic | item | Dictionary with peghead parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable peghead. |\n| Profile | `Profile` | Text | item | Peghead profile. |\n| Number of Prongs | `Number of Prongs` | Integer | item | Number of prongs. |\n| Height | `Height` | Number | item | Peghead height. |\n| Width | `Width` | Number | item | Peghead width. |\n| Thickness | `Thickness` | Number | item | Peghead thickness. |\n| Gem Inside | `Gem Inside` | Number | item | Gem inside percentage. |\n| Girdle Width | `Girdle Width` | Number | item | Girdle width. |\n| Over Girdle Height | `Over Girdle Height` | Number | item | Height over girdle. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Peghead Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#peghead-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#peghead-reader","collection":"grasshopper","hash":"21db0ce0f7f43650c4492756b1bec649","indexed_by":"docs-index"}},{"content":"Gemsets — Basket Base Rail Reader\n\nReads a Basket base rail dictionary and outputs its standard values.\n\nNickname: `BasketBaseRailReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Basket Dictionary | `BasketDict` | Generic | item | Dictionary with basket parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | Enable base rail. |\n| Profile | `Profile` | Text | item | Rail section profile: ROUND or SQUARE. |\n| Height | `Height` | Number | item | Height of the base rail. |\n| Width | `Width` | Number | item | Width of the base rail. |\n| Diameter % | `Diameter %` | Number | item | Diameter percentage. |\n| Rotation | `Rotation` | Number | item | Rotation angle. |\n| Move in Z | `Move in Z` | Number | item | Vertical offset. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Basket Base Rail Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-base-rail-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-base-rail-reader","collection":"grasshopper","hash":"735d33d884ebe28356927f4d461fba25","indexed_by":"docs-index"}},{"content":"Gemsets — Basket Prong Reader\n\nReads a Basket prong dictionary and outputs its standard values.\n\nNickname: `BasketProngReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Basket Dictionary | `BasketDict` | Generic | item | Dictionary with basket parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Number | `Number` | Integer | item | Number of prongs. |\n| Profile | `Profile` | Text | item | Prong section profile: ROUND, SQUARE, HEART or TRAPEZOID. |\n| Diameter Top | `Diameter Top` | Number | item | Diameter at the top. |\n| Diameter Girdle | `Diameter Girdle` | Number | item | Diameter at girdle. |\n| Diameter Bottom | `Diameter Bottom` | Number | item | Diameter at the bottom. |\n| Height | `Height` | Number | item | Height of prongs. |\n| Height Over Girdle | `Height Over Girdle` | Number | item | Height over girdle. |\n| Straight | `Straight` | Boolean | item | Straight prong? |\n| Cap Bump | `Cap Bump` | Number | item | Bump amount applied to the prong cap. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Basket Prong Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-prong-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-prong-reader","collection":"grasshopper","hash":"ad3462bbbaca7e73006f49dbc93da655","indexed_by":"docs-index"}},{"content":"Gemsets — Basket Upper Rail Reader\n\nReads a Basket upper rail dictionary and outputs its standard values.\n\nNickname: `BasketUpperRailReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Basket Dictionary | `BasketDict` | Generic | item | Dictionary with basket parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | Enable upper rail. |\n| Profile | `Profile` | Text | item | Rail section profile: ROUND or SQUARE. |\n| Height | `Height` | Number | item | Height of the upper rail. |\n| Width | `Width` | Number | item | Width of the upper rail. |\n| Height Under Girdle | `Height Under Girdle` | Number | item | Height under girdle. |\n| Diameter % | `Diameter %` | Number | item | Diameter percentage. |\n| Rotation | `Rotation` | Number | item | Rotation angle. |\n| Chamfer | `Chamfer` | Boolean | item | Chamfer enabled. |\n| Chamfer Offset | `Chamfer Offset` | Number | item | Chamfer offset. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Basket Upper Rail Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-upper-rail-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#basket-upper-rail-reader","collection":"grasshopper","hash":"836f80c70258b6c7b644a5becf86a53c","indexed_by":"docs-index"}},{"content":"Gemsets — Martini Prong Reader\n\nReads a Martini prong dictionary and outputs its standard values.\n\nNickname: `MartiniProngReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Martini Dictionary | `MartiniDict` | Generic | item | Dictionary with martini parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Martini Prong Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-prong-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-prong-reader","collection":"grasshopper","hash":"c5ed99db4c7e61d608d016196d519515","indexed_by":"docs-index"}},{"content":"Gemsets — Martini Prong Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Diameter Top | `Diameter Top` | Number | item | Diameter at the top. |\n| Diameter Bottom | `Diameter Bottom` | Number | item | Diameter at the bottom. |\n| Height | `Height` | Number | item | Height of prongs. |\n| Height Over Girdle | `Height Over Girdle` | Number | item | Height over girdle. |\n| Gem Inside | `Gem Inside` | Number | item | Gem inside amount. |\n| Girdle Depth | `Girdle Depth` | Number | item | Girdle depth. |\n| Girdle Inside | `Girdle Inside` | Number | item | Girdle inside amount. |\n| Angle | `Angle` | Number | item | Angle of prongs. |\n| Rotation | `Rotation` | Number | item | Rotation of prongs. |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | Extension for manufacturing. |\n| Claw Cap Distance | `Claw Cap Distance` | Number | item | Claw cap distance. |\n| Claw Cap Height | `Claw Cap Height` | Number | item | Claw cap height. |\n| Claw Tip Width | `Claw Tip Width` | Number | item | Claw tip width. |\n| Claw Tip Smoothness | `Claw Tip Smoothness` | Number | item | Claw tip smoothness. |\n| Face Tangent | `Face Tangent` | Boolean | item | Face tangent? |\n| Birth Separation | `Birth Separation` | Number | item | Birth separation. |\n| Girdle Z | `Girdle Z` | Number | item | Height of the prong bow. |\n| Mode | `Mode` | Text | item | Prong mode: DEFAULT, CUSTOM or CLAW. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Martini Prong Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-prong-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-prong-reader","collection":"grasshopper","hash":"ec2731aa28009e495f454aa07dc26570","indexed_by":"docs-index"}},{"content":"Gemsets — Martini Side Bezel Reader\n\nReads a Martini side bezel dictionary and outputs its standard values.\n\nNickname: `MartiniSideBezelReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Martini Dictionary | `MartiniDict` | Generic | item | Dictionary with martini parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable. |\n| Gem Size | `Gem Size` | Number | item | Gem size. |\n| Width | `Width` | Number | item | Width. |\n| Over Girdle | `Over Girdle` | Number | item | Over girdle. |\n| Distance | `Distance` | Number | item | Distance. |\n| Move In Z | `Move In Z` | Number | item | Move in Z. |\n| Fillet Edge | `Fillet Edge` | Number | item | Fillet edge. |\n| Scallop Cutter Enable | `Scallop Cutter Enable` | Boolean | item | Scallop cutter enable. |\n| Scallop Cutter Apply Boolean | `Scallop Cutter Apply Boolean` | Boolean | item | Scallop cutter apply boolean. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Martini Side Bezel Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-side-bezel-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-side-bezel-reader","collection":"grasshopper","hash":"0571b3291d1eec95e291087a091a3bf7","indexed_by":"docs-index"}},{"content":"Gemsets — Martini Upper Rail Reader\n\nReads a Martini upper rail dictionary and outputs its standard values.\n\nNickname: `MartiniUpperRailReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Martini Dictionary | `MartiniDict` | Generic | item | Dictionary with martini parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Enable upper rail. |\n| Height | `Height` | Number | item | Height of the upper rail. |\n| Width | `Width` | Number | item | Width of the upper rail. |\n| Height Under Girdle | `Height Under Girdle` | Number | item | Height under girdle. |\n| Diameter Percentage | `Diameter Percentage` | Number | item | Diameter percentage. |\n| Rotation | `Rotation` | Number | item | Rotation angle. |\n| Chamfer | `Chamfer` | Boolean | item | Chamfer enabled. |\n| Chamfer Offset | `Chamfer Offset` | Number | item | Chamfer offset. |\n| External Y | `External Y` | Number | item | External Y. |\n| Offset Y | `Offset Y` | Number | item | Offset Y. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Martini Upper Rail Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-upper-rail-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#martini-upper-rail-reader","collection":"grasshopper","hash":"8c5a4c540522947105fb6178d8fc46fa","indexed_by":"docs-index"}},{"content":"Gemsets — Trellis Prongs Reader\n\nReads a Trellis prongs dictionary and outputs its standard values.\n\nNickname: `TrellisProngsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Trellis Dictionary | `TrellisDict` | Generic | item | Dictionary with trellis parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Trellis Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","collection":"grasshopper","hash":"f317e37593bab1eee4734da550f5115f","indexed_by":"docs-index"}},{"content":"Gemsets — Trellis Prongs Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Diameter | `Prongs Diameter` | Number | item | Prong tube diameter. |\n| Gem Inside | `Gem Inside` | Number | item | Radial offset of the prong top. |\n| Over Girdle | `Over Girdle` | Number | item | Prong height over the girdle. |\n| Bend Inside | `Bend Inside` | Number | item | How far the prong bends inward. |\n| Bulge Start 1 | `Bulge Start 1` | Number | item | First bulge start. |\n| Bulge End 1 | `Bulge End 1` | Number | item | First bulge end. |\n| Bulge Start 2 | `Bulge Start 2` | Number | item | Second bulge start. |\n| Bulge End 2 | `Bulge End 2` | Number | item | Second bulge end. |\n| Birth Separation Y | `Birth Separation Y` | Number | item | Y separation at the prong birth. |\n| Opening Angle | `Opening Angle` | Number | item | Opening angle of the trellis. |\n| Middle Offset 1 | `Middle Offset 1` | Number | item | First middle control offset. |\n| Middle Offset 2 | `Middle Offset 2` | Number | item | Second middle control offset. |\n| Top Vertical | `Top Vertical` | Number | item | Vertical offset of the prong top. |\n| Mode | `Mode` | Text | item | Prong mode. |\n| Bottom Profile | `Bottom Profile` | Text | item | Bottom section profile. |\n| Bottom Width | `Bottom Width` | Number | item | Bottom section width. |\n| Bottom Height | `Bottom Height` | Number | item | Bottom section height. |\n| Ring Separation Y | `Ring Separation Y` | Number | item | Symmetric Y separation of the prong landing points. |\n| Face Tangent | `Face Tangent` | Boolean | item | Prong faces the girdle tangent. |\n| Claw Cap Distance | `Claw Cap Distance` | Number | item | Claw apex toward the gem centre. |\n| Claw Cap Height | `Claw Cap Height` | Number | item | Claw apex along the gem axis. |","metadata":{"title":"Gemsets","section":"Trellis Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","collection":"grasshopper","hash":"c7ad7b689e5d5f471a8bc9381900ef15","indexed_by":"docs-index"}},{"content":"Gemsets — Trellis Prongs Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Claw Tip Width | `Claw Tip Width` | Number | item | Claw apex thickness fraction. |\n| Claw Tip Smoothness | `Claw Tip Smoothness` | Number | item | Claw body to cap transition smoothness. |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | Extra prong material above the gem. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Trellis Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-prongs-reader","collection":"grasshopper","hash":"607233abe977dc7e3034ec3a55d8db25","indexed_by":"docs-index"}},{"content":"Gemsets — Trellis Upper Rail Reader\n\nReads a Trellis upper rail dictionary and outputs its standard values.\n\nNickname: `TrellisUpperRailReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Trellis Dictionary | `TrellisDict` | Generic | item | Dictionary with trellis parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Upper rail enabled. |\n| Mode | `Mode` | Text | item | Rail mode. |\n| Width | `Width` | Number | item | Rail width. |\n| Height | `Height` | Number | item | Rail height. |\n| Height Under Girdle | `Height Under Girdle` | Number | item | Rail height under the girdle. |\n| External X | `External X` | Number | item | Outer X dimension of the rail. |\n| External Y | `External Y` | Number | item | Outer Y dimension. |\n| Offset Y | `Offset Y` | Number | item | Rail centerline Y shift. |\n| Rotation | `Rotation` | Number | item | Rail rotation. |\n| Chamfer | `Chamfer` | Boolean | item | Chamfer applied. |\n| Chamfer Offset | `Chamfer Offset` | Number | item | Chamfer offset. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Trellis Upper Rail Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-upper-rail-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-upper-rail-reader","collection":"grasshopper","hash":"e4a9e94e906ce9bc00b146daff1b6535","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Ornament Reader\n\nReads a Tulip ornament dictionary and outputs its standard values.\n\nNickname: `TulipOrnamentReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Tulip Dictionary | `TulipDict` | Generic | item | Dictionary with tulip parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Tulip Ornament Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","collection":"grasshopper","hash":"31f91e970d7e2a0dd10f941b7ac336ce","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Ornament Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Type | `Type` | Text | item | Ornament type. |\n| Placement | `Placement` | Text | item | Ornament placement. |\n| Diameter | `Diameter` | Number | item | Ornament tube diameter. |\n| Attach Param | `Attach Param` | Number | item | Where the curvature sits. |\n| Arch Height | `Arch Height` | Number | item | Union arch height. |\n| Tip Inside | `Tip Inside` | Number | item | Union apex radial vs girdle. |\n| Length | `Length` | Number | item | Leaf reach / vertical extent. |\n| Top Bottom Width | `Top Bottom Width` | Number | item | Leaf flat top & bottom width. |\n| Opening | `Opening` | Number | item | Leaf middle width. |\n| Top Gem Inside | `Top Gem Inside` | Number | item | Leaf top depth. |\n| Middle Inside | `Middle Inside` | Number | item | Leaf middle depth. |\n| Bottom Gem Inside | `Bottom Gem Inside` | Number | item | Leaf bottom depth. |\n| Curvature Position | `Curvature Position` | Number | item | Leaf bow position. |\n| Smooth | `Smooth` | Number | item | Leaf corner roundness. |\n| Move In Z | `Move In Z` | Number | item | Vertical shift of the ornament. |\n| Top Z | `Top Z` | Number | item | Top tip vertical offset. |\n| Bottom Z | `Bottom Z` | Number | item | Bottom tip vertical offset. |\n| Leaf Per Axis | `Leaf Per Axis` | Boolean | item | Use the separate Y leaf shape. |\n| Leaf Y Length | `Leaf Y Length` | Number | item | Y leaf vertical extent. |\n| Leaf Y Top Bottom Width | `Leaf Y Top Bottom Width` | Number | item | Y leaf flat top & bottom width. |\n| Leaf Y Opening | `Leaf Y Opening` | Number | item | Y leaf middle width. |\n| Leaf Y Top Gem Inside | `Leaf Y Top Gem Inside` | Number | item | Y leaf top depth. |","metadata":{"title":"Gemsets","section":"Tulip Ornament Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","collection":"grasshopper","hash":"1f95b6c181868851321f8059eaf1de2c","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Ornament Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Leaf Y Middle Inside | `Leaf Y Middle Inside` | Number | item | Y leaf middle depth. |\n| Leaf Y Bottom Gem Inside | `Leaf Y Bottom Gem Inside` | Number | item | Y leaf bottom depth. |\n| Leaf Y Curvature Position | `Leaf Y Curvature Position` | Number | item | Y leaf bow position. |\n| Leaf Y Smooth | `Leaf Y Smooth` | Number | item | Y leaf corner roundness. |\n| Leaf Y Move In Z | `Leaf Y Move In Z` | Number | item | Y leaf vertical shift. |\n| Leaf Y Top Z | `Leaf Y Top Z` | Number | item | Y leaf top tip vertical offset. |\n| Leaf Y Bottom Z | `Leaf Y Bottom Z` | Number | item | Y leaf bottom tip vertical offset. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Tulip Ornament Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-ornament-reader","collection":"grasshopper","hash":"a2d0a7386edc1b54281c03cdf2219c93","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Prong Reader\n\nReads a Tulip prong dictionary and outputs its standard values.\n\nNickname: `TulipProngReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Tulip Dictionary | `TulipDict` | Generic | item | Dictionary with tulip parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Tulip Prong Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-prong-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-prong-reader","collection":"grasshopper","hash":"299cfa701a803f3fb8ca2383dcf7de92","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Prong Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Number | `Number` | Integer | item | Number of petal pairs. |\n| Pipe Diameter | `Pipe Diameter` | Number | item | SubD pipe section diameter. |\n| Depth Bulge | `Depth Bulge` | Number | item | Bulge width. |\n| Height | `Height` | Number | item | Vertical scale factor. |\n| Gem Inside | `Gem Inside` | Number | item | Radial offset from the stone curve. |\n| Bulge Inside | `Bulge Inside` | Number | item | Smooth radial bulge. |\n| Bulge Position | `Bulge Position` | Number | item | Height fraction of the bulge belly. |\n| Bulge Spread | `Bulge Spread` | Number | item | Bulge reach up/down. |\n| Bulge Close Bottom | `Bulge Close Bottom` | Number | item | Bulge close at bottom. |\n| Bulge Close Top | `Bulge Close Top` | Number | item | Bulge close at top. |\n| Move In Z | `Move In Z` | Number | item | Vertical offset of the setting. |\n| Mode | `Mode` | Text | item | Prong tip mode. |\n| Tip Cap | `Tip Cap` | Number | item | Claw tip extension length. |\n| Cap Distance To Center | `Cap Distance To Center` | Number | item | Claw tip toward centre. |\n| Cap Height | `Cap Height` | Number | item | Claw tip up/down. |\n| Tip Smoothness | `Tip Smoothness` | Number | item | Claw blend smoothness. |\n| Tip Width | `Tip Width` | Number | item | Claw tip width. |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | Extension for manufacturing. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Tulip Prong Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-prong-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-prong-reader","collection":"grasshopper","hash":"5091e7477340ede8802b2fac9ba8a5ab","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Channel Reader\n\nReads a Halo channel dictionary and outputs its standard values.\n\nNickname: `HaloChannelReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Halo Dictionary | `HaloDict` | Generic | item | Dictionary with halo parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Text | item | Channel profile. |\n| Height | `Height` | Number | item | Channel height. |\n| Width | `Width` | Number | item | Channel width. |\n| Inner Height | `Inner Height` | Number | item | Inner channel height. |\n| Inner Width | `Inner Width` | Number | item | Inner channel width. |\n| Bright Cut | `Bright Cut` | Number | item | Bright cut value. |\n| Distance To Gem | `Distance To Gem` | Number | item | Distance from channel to gem. |\n| Rotation | `Rotation` | Number | item | Channel rotation (degrees). |\n| Position Z | `Position Z` | Number | item | Z position of channel. |\n| Fillet Factor | `Fillet Factor` | Number | item | Fillet factor. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Halo Channel Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-channel-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-channel-reader","collection":"grasshopper","hash":"36b21c74e0d8caaf71134f609e56e2b9","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Gems Reader\n\nReads a Halo gems dictionary and outputs its standard values.\n\nNickname: `HaloGemsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Halo Dictionary | `HaloDict` | Generic | item | Dictionary with halo parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Halo Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","collection":"grasshopper","hash":"17adee7bdb2b554d945155f88635c784","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Size | `Gem Size` | Number | item | Size of gems. |\n| Min Distance | `Min Distance` | Number | item | Minimum distance between gems. |\n| Vertical | `Vertical` | Number | item | Vertical offset of gems. |\n| Gem Inside | `Gem Inside` | Number | item | Push gems inside channel. |\n| Extension For Manufacturing | `Extension For Manufacturing` | Number | item | Extra extension for manufacturing. |\n| Prong Height | `Prong Height` | Number | item | Height of prongs for gems. |\n| Type Prong | `Type Prong` | Text | item | Type of prong. |\n| Boolean Cutters | `Boolean Cutters` | Boolean | item | Apply cutters/vcutters as a boolean subtraction. |\n| Fillet Factor | `Fillet Factor` | Number | item | Fillet factor. |\n| Enable Double Prong Setting | `Enable Double Prong Setting` | Boolean | item | Enable double prong setting. |\n| Enable Scallop Remove Channel | `Enable Scallop Remove Channel` | Boolean | item | Enable scallop remove channel. |\n| Width Gem | `Width Gem` | Number | item | Scalloped width gem. |\n| Height Gem | `Height Gem` | Number | item | Scalloped height gem. |\n| Rail Width | `Rail Width` | Number | item | Scalloped rail width. |\n| Rail Height | `Rail Height` | Number | item | Scalloped rail height. |\n| Width Prong | `Width Prong` | Number | item | Scalloped width prong. |\n| Height Prong | `Height Prong` | Number | item | Scalloped height prong. |\n| Automatic Prong Size | `Automatic Prong Size` | Boolean | item | Automatic prong size. |\n| Prong External Diameter | `Prong External Diameter` | Number | item | Prong external diameter. |\n| Prong Internal Diameter | `Prong Internal Diameter` | Number | item | Prong internal diameter. |","metadata":{"title":"Gemsets","section":"Halo Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","collection":"grasshopper","hash":"d1d7fdceb6b45ab682d14b4bef9e618c","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Enable | `Cutters Enable` | Boolean | item | Enable cutters. |\n| Cutters Keep | `Cutters Keep` | Boolean | item | Keep cutters. |\n| Cutters Length | `Cutters Length` | Number | item | Cutters length. |\n| Cutters Over Girdle | `Cutters Over Girdle` | Number | item | Cutters over girdle. |\n| Cutters Over Girdle Middle | `Cutters Over Girdle Middle` | Number | item | Cutters over girdle middle. |\n| Cutters Shape | `Cutters Shape` | Text | item | Cutters shape. |\n| Cutters Start Height | `Cutters Start Height` | Number | item | Cutters start height. |\n| Cutters Start Width | `Cutters Start Width` | Number | item | Cutters start width. |\n| Cutters End Height | `Cutters End Height` | Number | item | Cutters end height. |\n| Cutters End Width | `Cutters End Width` | Number | item | Cutters end width. |\n| Cutters Shape Factor | `Cutters Shape Factor` | Number | item | Cutters shape factor. |\n| VCutters Enable | `VCutters Enable` | Boolean | item | Enable vcutters. |\n| VCutters Keep | `VCutters Keep` | Boolean | item | Keep vcutters. |\n| VCutters Start Height | `VCutters Start Height` | Number | item | VCutters start height. |\n| VCutters Start Width | `VCutters Start Width` | Number | item | VCutters start width. |\n| VCutters End Height | `VCutters End Height` | Number | item | VCutters end height. |\n| VCutters End Width | `VCutters End Width` | Number | item | VCutters end width. |\n| VCutters Length | `VCutters Length` | Number | item | VCutters length. |\n| VCutters Over Girdle | `VCutters Over Girdle` | Number | item | VCutters over girdle. |\n| Drill Enable | `Drill Enable` | Boolean | item | Enable drill. |\n| Drill Type | `Drill Type` | Text | item | Drill type. |","metadata":{"title":"Gemsets","section":"Halo Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","collection":"grasshopper","hash":"ba492f787d306c30263fc0d62532ff94","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Drill Width | `Drill Width` | Number | item | Drill width. |\n| Drill Height | `Drill Height` | Number | item | Drill height. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Halo Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-gems-reader","collection":"grasshopper","hash":"56c39b1f179b0e70229c99ce2ae59ba9","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Prongs Reader\n\nReads a Halo prongs dictionary and outputs its standard values.\n\nNickname: `HaloProngsReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Halo Dictionary | `HaloDict` | Generic | item | Dictionary with halo parameters. |\n\nOutputs","metadata":{"title":"Gemsets","section":"Halo Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-prongs-reader","collection":"grasshopper","hash":"5b4b7d6a556ddc8e3f6abcac1dcd3b41","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Prongs Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Number of Prongs | `Number of Prongs` | Integer | item | Number of prongs. |\n| Diameter | `Diameter` | Number | item | Diameter of prongs. |\n| Height Over Girdle | `Height Over Girdle` | Number | item | Height of prongs over girdle. |\n| Cap Bump | `Cap Bump` | Number | item | Bump amount applied to the prong cap. |\n| Gem Inside | `Gem Inside` | Number | item | Gem inside distance. |\n| Rotation | `Rotation` | Number | item | Rotation of prongs. |\n| Extension for Manufacturing | `Extension for Manufacturing` | Number | item | Extra extension for manufacturing. |\n| Move in Z | `Move in Z` | Number | item | Move prongs in Z. |\n| Internal Diameter | `Internal Diameter` | Number | item | Internal diameter. |\n| External Diameter | `External Diameter` | Number | item | External diameter. |\n| Mode | `Mode` | Text | item | Prong mode. |\n| Cap Mode | `Cap Mode` | Text | item | Cap mode. |\n| Cap Claw Inside | `Cap Claw Inside` | Number | item | Cap claw inside. |\n| Cap Claw Tip Height | `Cap Claw Tip Height` | Number | item | Cap claw tip height. |\n| Cap Claw Tip Width | `Cap Claw Tip Width` | Number | item | Cap claw tip width. |\n| Cap Claw Tip Distance | `Cap Claw Tip Distance` | Number | item | Cap claw tip distance. |\n| Cap Claw Tension | `Cap Claw Tension` | Number | item | Cap claw tension. |\n| Extend To Bridge | `Extend To Bridge` | Boolean | item | Whether prongs extend to bridge. |\n| Height To Bridge | `Height To Bridge` | Number | item | Height to bridge. |\n| Bridge Straight | `Bridge Straight` | Boolean | item | Whether the bridge is straight. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Gemsets","section":"Halo Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-prongs-reader","collection":"grasshopper","hash":"142473eeacfbd8c770322f6075bbed59","indexed_by":"docs-index"}},{"content":"Gemsets — Halo Reader\n\nReads a Halo dictionary and outputs its standard values.\n\nNickname: `HaloReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Halo Dictionary | `HaloDict` | Generic | item | Dictionary with halo parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Channel Profile | `ChannelProfile` | Text | item | Halo channel profile. |\n| Channel Height | `ChannelHeight` | Number | item | Halo channel height. |\n| Channel Width | `ChannelWidth` | Number | item | Halo channel width. |\n| Channel Inner Height | `ChannelInnerHeight` | Number | item | Halo channel inner height. |\n| Channel Inner Width | `ChannelInnerWidth` | Number | item | Halo channel inner width. |","metadata":{"title":"Gemsets","section":"Halo Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#halo-reader","collection":"grasshopper","hash":"cb5aa4169ee0b630c8a2a31cf9ae6c57","indexed_by":"docs-index"}},{"content":"Gemsets — Trellis Reader\n\nReads a Trellis dictionary and outputs its standard values.\n\nNickname: `TrellisReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Trellis Dictionary | `TrellisDict` | Generic | item | Dictionary with trellis parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Top Profile | `TopProfile` | Text | item | Trellis top profile. |\n| Top Profile Height | `TopProfileHeight` | Number | item | Trellis top profile height. |\n| Top Profile Width | `TopProfileWidth` | Number | item | Trellis top profile width. |\n| Top Profile Gem Inside | `TopProfileGemInside` | Boolean | item | Trellis top profile gem inside. |","metadata":{"title":"Gemsets","section":"Trellis Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#trellis-reader","collection":"grasshopper","hash":"1980175795f10520d6ecc5e7c978ab5c","indexed_by":"docs-index"}},{"content":"Gemsets — Tulip Reader\n\nReads a Tulip dictionary and outputs its standard values.\n\nNickname: `TulipReader` · Tab: Readers › Gemsets\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Tulip Dictionary | `TulipDict` | Generic | item | Dictionary with tulip parameters. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Number | `Number` | Integer | item | Tulip number. |\n| Thickness | `Thickness` | Number | item | Tulip thickness. |\n| Height | `Height` | Number | item | Tulip height. |","metadata":{"title":"Gemsets","section":"Tulip Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/gemsets/#tulip-reader","collection":"grasshopper","hash":"1b6829f5773fd9a8c1becff233231b3d","indexed_by":"docs-index"}},{"content":"Global\n\n6 components in Readers › Global.\n\nCenter Stone Reader\nReads the 'center_stone' section from a JSON and outputs standard values.\n\nNickname: `CenterStoneReader` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Input JSON string containing a 'center_stone' section. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Material | `Material` | Text | item | Gem material. |\n| Gem Shape | `Shape` | Text | item | Gem shape. |\n| Gem Size (ct) | `SizeCt` | Number | item | Gem size in carats. |\n| Gem Size X | `SizeX` | Number | item | Gem size X. |\n| Gem Size Y | `SizeY` | Number | item | Gem size Y. |\n| Gem Size Z | `SizeZ` | Number | item | Gem size Z. |\n| Move In Z | `Move In Z` | Number | item | Move in Z. |\n| Rotate 90 | `Rotate90` | Boolean | item | Rotate gem 90 degrees. |\n| Gem Properties | `Props` | Text | item | Dictionary (JSON) with gem color, clarity, cut, polish, symmetry, fluorescence, origin, certification and certificate number. |\n| Connector | `Connector` | Generic | item | Gem identity as a dictionary (shape, carat, compound) for direct connection to a Gem component. |","metadata":{"title":"Global","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/","collection":"grasshopper","hash":"d381f5e9932332b62fb45f50cf05f6a8","indexed_by":"docs-index"}},{"content":"Global — Computation Mode\n\nSplits a RENDER / MANUFACTURING string into Render and Manufacturing booleans. Defaults to Render when no input is provided.\n\nNickname: `Mode` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | Computation mode: RENDER or MANUFACTURING. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Render | `Render` | Boolean | item | True when the mode is RENDER (default when empty). |\n| Manufacturing | `Manufacturing` | Boolean | item | True when the mode is MANUFACTURING. |","metadata":{"title":"Global","section":"Computation Mode","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#computation-mode","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#computation-mode","collection":"grasshopper","hash":"7b5337ebeca4cab64afea49e50604a17","indexed_by":"docs-index"}},{"content":"Global — Eternity Reader\n\nReads the 'eternity' section from a JSON and outputs sub-dictionaries (gems, prongs, bezels, shank upper/lower) ready to connect to the Eternity readers.\n\nNickname: `EternityReader` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Input JSON string containing an 'eternity' section. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Metal | `Metal` | Text | item | Eternity metal material. |\n| Diameter | `Diameter` | Number | item | Ring diameter. |\n| Gems | `Gems` | Text | item | Eternity gems parameters as JSON dictionary. |\n| Prongs | `Prongs` | Text | item | Eternity prongs parameters as JSON dictionary. |\n| Bezels | `Bezels` | Text | item | Eternity bezels parameters as JSON dictionary. |\n| Shank Upper | `Shank Upper` | Text | item | Eternity upper shank parameters as JSON dictionary. |\n| Shank Lower | `Shank Lower` | Text | item | Eternity lower shank parameters as JSON dictionary. |","metadata":{"title":"Global","section":"Eternity Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#eternity-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#eternity-reader","collection":"grasshopper","hash":"a261c7e84e47c07bcf5b420c33b8027e","indexed_by":"docs-index"}},{"content":"Global — Gemset Reader\n\nReads the 'gemset' section from a JSON and outputs style, material, and grouped dictionaries for bezel, halo, trellis, tulip, and basket.\n\nNickname: `GemsetReader` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Input JSON string containing a 'gemset' section. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Style | `Style` | Text | item | Gemset style. |\n| Material | `Material` | Text | item | Gemset material. |\n| Bezel | `Bezel` | Generic | item | Bezel parameters as dictionary. |\n| Halo | `Halo` | Generic | item | Halo parameters as dictionary. |\n| Trellis | `Trellis` | Generic | item | Trellis parameters as dictionary. |\n| Tulip | `Tulip` | Generic | item | Tulip parameters as dictionary. |\n| Basket | `Basket` | Generic | item | Basket parameters as dictionary. |\n| Cluster | `Cluster` | Generic | item | Cluster parameters as dictionary. |\n| Peghead | `Peghead` | Generic | item | Peghead parameters as dictionary. |\n| Martini | `Martini` | Generic | item | Martini parameters as dictionary. |","metadata":{"title":"Global","section":"Gemset Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#gemset-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#gemset-reader","collection":"grasshopper","hash":"8cc89608064344baed1a64ae06fc011f","indexed_by":"docs-index"}},{"content":"Global — Global Reader\n\nReads the 'global' section from a JSON and outputs standard values.\n\nNickname: `GlobalReader` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON _(optional)_ | `JSON` | Text | item | Input JSON string containing a 'global' section. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Generate GLB | `Generate GLB` | Boolean | item | Whether to generate GLB. |\n| Generate 3DM | `Generate 3DM` | Boolean | item | Whether to generate 3DM. |\n| Generate STL | `Generate STL` | Boolean | item | Whether to generate STL. |\n| Generate Sprues | `Generate Sprues` | Boolean | item | Whether to generate Sprues. |\n| Generate Tech | `Generate Tech` | Boolean | item | Whether to generate Tech. |\n| Generate Taxonomy | `Generate Taxonomy` | Boolean | item | Whether to generate Taxonomy. |\n| Generate Pricing | `Generate Pricing` | Boolean | item | Whether to generate Pricing. |\n| Manufacturer ID | `Manufacturer ID` | Text | item | Manufacturer ID string. |\n| Smart Fix | `Smart Fix` | Boolean | item | Whether to apply smart fix. |\n| Computation Mode | `Computation Mode` | Text | item | Computation mode: Render or Manufacturing. |\n| Taxonomy | `Taxonomy` | Generic | item | Global taxonomy dictionary. |","metadata":{"title":"Global","section":"Global Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#global-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#global-reader","collection":"grasshopper","hash":"d92af386e8ff59c03ba39134e3076f42","indexed_by":"docs-index"}},{"content":"Global — Shank Reader\n\nReads the 'shank' section from a JSON and outputs style, material, diameter, classic and cathedral dictionaries.\n\nNickname: `ShankReader` · Tab: Readers › Global\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| JSON | `JSON` | Text | item | Input JSON string containing a 'shank' section. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Style | `Style` | Text | item | Shank style (e.g. CLASSIC, CATHEDRAL). |\n| Material | `Material` | Text | item | Shank material. |\n| Diameter | `Diameter` | Number | item | Ring diameter. |\n| Classic | `Classic` | Text | item | Classic parameters as JSON dictionary. |\n| Cathedral | `Cathedral` | Text | item | Cathedral parameters as JSON dictionary. |\n| Advanced Cathedral | `Adv Cathedral` | Text | item | Advanced Cathedral parameters as JSON dictionary. |","metadata":{"title":"Global","section":"Shank Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#shank-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/global/#shank-reader","collection":"grasshopper","hash":"b0e45809efc9476c80bd827ed52a491e","indexed_by":"docs-index"}},{"content":"Shanks\n\n15 components in Readers › Shanks.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/","collection":"grasshopper","hash":"d5d18cfb10620481b2a4ed4e2ac12c98","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Gems Reader\n\nReads an Advanced Cathedral gems dictionary and outputs its standard values.\n\nNickname: `AdvCathedralGemsReader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cathedral | `Cathedral` | Text | item | Cathedral parameters JSON dictionary. |\n\nOutputs","metadata":{"title":"Shanks","section":"Advanced Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","collection":"grasshopper","hash":"429dbf3823c111142863d5868c984203","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Gems enable. |\n| Angle | `Angle` | Number | item | Gems angle. |\n| Gem Size | `Gem Size` | Number | item | Gems gem size. |\n| Min Distance | `Min Distance` | Number | item | Gems min distance. |\n| Gem Shape | `Gem Shape` | Text | item | Gems gem shape. |\n| Gem Vertical | `Gem Vertical` | Number | item | Gems gem vertical. |\n| Inner Width | `Inner Width` | Number | item | Gems inner width. |\n| Inner Depth | `Inner Depth` | Number | item | Gems inner depth. |\n| Bright Cut | `Bright Cut` | Number | item | Gems bright cut. |\n| Margin | `Margin` | Number | item | Gems margin. |\n| Setting Mode | `Setting Mode` | Text | item | Gems setting mode. |\n| Prong Gem Inside | `Prong Gem Inside` | Number | item | Gems prong gem inside. |\n| Prong Diameter | `Prong Diameter` | Number | item | Gems prong diameter. |\n| Prong Height | `Prong Height` | Number | item | Gems prong height. |\n| Prong Extension For Mfg | `Prong Extension For Mfg` | Number | item | Gems prong extension for manufacturing. |\n| Prong Automatic Diameter | `Prong Automatic Diameter` | Boolean | item | Gems prong automatic diameter. |\n| Cutters Enable | `Cutters Enable` | Boolean | item | Gems cutters enable. |\n| Cutters Mode | `Cutters Mode` | Text | item | Gems cutters mode. |\n| Cutters Start Height | `Cutters Start Height` | Number | item | Gems cutters start height. |\n| Cutters Start Width | `Cutters Start Width` | Number | item | Gems cutters start width. |\n| Cutters End Height | `Cutters End Height` | Number | item | Gems cutters end height. |\n| Cutters End Width | `Cutters End Width` | Number | item | Gems cutters end width. |\n| Cutters Shape | `Cutters Shape` | Text | item | Gems cutters shape. |","metadata":{"title":"Shanks","section":"Advanced Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","collection":"grasshopper","hash":"d62ae2b03faf1aa7f5c2719878312237","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Length | `Cutters Length` | Number | item | Gems cutters length. |\n| Cutters Move In Z | `Cutters Move In Z` | Number | item | Gems cutters move in Z. |\n| Cutters Move Middle In Z | `Cutters Move Middle In Z` | Number | item | Gems cutters move middle in Z. |\n| Cutters Shape Scale | `Cutters Shape Scale` | Number | item | Gems cutters shape scale. |\n| VCutters Enable | `VCutters Enable` | Boolean | item | Gems vcutters enable. |\n| VCutters Mode | `VCutters Mode` | Text | item | Gems vcutters mode. |\n| VCutters Start Height | `VCutters Start Height` | Number | item | Gems vcutters start height. |\n| VCutters Start Width | `VCutters Start Width` | Number | item | Gems vcutters start width. |\n| VCutters End Height | `VCutters End Height` | Number | item | Gems vcutters end height. |\n| VCutters End Width | `VCutters End Width` | Number | item | Gems vcutters end width. |\n| VCutters Length | `VCutters Length` | Number | item | Gems vcutters length. |\n| VCutters Move In Z | `VCutters Move In Z` | Number | item | Gems vcutters move in Z. |\n| Drill Enable | `Drill Enable` | Boolean | item | Gems drill enable. |\n| Drill Shape | `Drill Shape` | Text | item | Gems drill shape. |\n| Drill Width | `Drill Width` | Number | item | Gems drill width. |\n| Drill Height | `Drill Height` | Number | item | Gems drill height. |\n| Drill Allow Intersection | `Drill Allow Intersection` | Boolean | item | Gems drill allow intersection. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to Params component. |","metadata":{"title":"Shanks","section":"Advanced Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-gems-reader","collection":"grasshopper","hash":"74fe26d2aa26034191499b05766f5fd5","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Shank Reader\n\nReads an Advanced Cathedral shank dictionary and outputs its standard values.\n\nNickname: `AdvCathedralShankReader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Advanced Cathedral Dictionary | `Dict` | Generic | item | Dictionary with advanced cathedral parameters. |\n\nOutputs","metadata":{"title":"Shanks","section":"Advanced Cathedral Shank Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","collection":"grasshopper","hash":"e002865f8072fa93634a6a0cbb97754c","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Shank Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Arm Height | `Arm Height` | Number | item | Advanced cathedral arm height. |\n| Arm Opening | `Arm Opening` | Number | item | Advanced cathedral arm opening. |\n| Tip Inclination | `Tip Inclination` | Number | item | Advanced cathedral tip inclination. |\n| Tangent Point | `Tangent Point` | Number | item | Advanced cathedral tangent point. |\n| Tip Round | `Tip Round` | Number | item | Advanced cathedral tip round. |\n| Bridge Enable | `Bridge Enable` | Boolean | item | Advanced cathedral bridge enable. |\n| Bridge Width | `Bridge Width` | Number | item | Advanced cathedral bridge width. |\n| Bridge Thickness | `Bridge Thickness` | Number | item | Advanced cathedral bridge thickness. |\n| Bridge Fillet | `Bridge Fillet` | Number | item | Advanced cathedral bridge fillet. |\n| Bridge Angle | `Bridge Angle` | Number | item | Advanced cathedral bridge angle. |\n| Bridge Diameter | `Bridge Diameter` | Number | item | Advanced cathedral bridge diameter. |\n| Bridge Open Angle | `Bridge Open Angle` | Number | item | Advanced cathedral bridge open angle. |\n| Shared Profile | `Shared Profile` | Boolean | item | Advanced cathedral shared profile. |\n| Gem Gradient | `Gem Gradient` | Boolean | item | Advanced cathedral gem gradient. |\n| Gem Gradient Points | `Gem Gradient Points` | Integer | item | Advanced cathedral gem gradient points. |\n| Gem Size Middle Position | `Gem Size Middle Position` | Number | item | Advanced cathedral gem size middle position. |\n| Gem Size Start | `Gem Size Start` | Number | item | Advanced cathedral gem size start. |\n| Gem Size Middle | `Gem Size Middle` | Number | item | Advanced cathedral gem size middle. |","metadata":{"title":"Shanks","section":"Advanced Cathedral Shank Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","collection":"grasshopper","hash":"dd052ad22b422cf16d9572de17d712bc","indexed_by":"docs-index"}},{"content":"Shanks — Advanced Cathedral Shank Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Size End | `Gem Size End` | Number | item | Advanced cathedral gem size end. |\n| Prong Grow | `Prong Grow` | Number | item | Advanced cathedral prong grow. |\n| Prong Min Diameter | `Prong Min Diameter` | Number | item | Advanced cathedral prong min diameter. |\n| End Prong Count | `End Prong Count` | Integer | item | Advanced cathedral end prong count. |\n| Prong Spacing | `Prong Spacing` | Number | item | Advanced cathedral prong spacing. |\n| Prong Distance | `Prong Distance` | Number | item | Advanced cathedral prong distance. |","metadata":{"title":"Shanks","section":"Advanced Cathedral Shank Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#advanced-cathedral-shank-reader","collection":"grasshopper","hash":"58d71d02e2622423e9f7a9c2481676e2","indexed_by":"docs-index"}},{"content":"Shanks — Cathedral Gems Reader\n\nReads cathedral gems parameters from a Cathedral dictionary.\n\nNickname: `CathedralGems` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cathedral | `Cathedral` | Text | item | Cathedral parameters JSON dictionary. |\n\nOutputs","metadata":{"title":"Shanks","section":"Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","collection":"grasshopper","hash":"d2e784e1ba809e1a91ba9eb4d9087660","indexed_by":"docs-index"}},{"content":"Shanks — Cathedral Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Gems enable. |\n| Angle | `Angle` | Number | item | Gems angle. |\n| Gem Size | `Gem Size` | Number | item | Gems gem size. |\n| Min Distance | `Min Distance` | Number | item | Gems min distance. |\n| Gem Shape | `Gem Shape` | Text | item | Gems gem shape. |\n| Gem Vertical | `Gem Vertical` | Number | item | Gems gem vertical. |\n| Inner Width | `Inner Width` | Number | item | Gems inner width. |\n| Inner Depth | `Inner Depth` | Number | item | Gems inner depth. |\n| Bright Cut | `Bright Cut` | Number | item | Gems bright cut. |\n| Margin | `Margin` | Number | item | Gems margin. |\n| Setting Mode | `Setting Mode` | Text | item | Gems setting mode. |\n| Prong Gem Inside | `Prong Gem Inside` | Number | item | Gems prong gem inside. |\n| Prong Diameter | `Prong Diameter` | Number | item | Gems prong diameter. |\n| Prong Height | `Prong Height` | Number | item | Gems prong height. |\n| Prong Extension For Mfg | `Prong Extension For Mfg` | Number | item | Gems prong extension for manufacturing. |\n| Prong Automatic Diameter | `Prong Automatic Diameter` | Boolean | item | Gems prong automatic diameter. |\n| Cutters Enable | `Cutters Enable` | Boolean | item | Gems cutters enable. |\n| Cutters Mode | `Cutters Mode` | Text | item | Gems cutters mode. |\n| Cutters Start Height | `Cutters Start Height` | Number | item | Gems cutters start height. |\n| Cutters Start Width | `Cutters Start Width` | Number | item | Gems cutters start width. |\n| Cutters End Height | `Cutters End Height` | Number | item | Gems cutters end height. |\n| Cutters End Width | `Cutters End Width` | Number | item | Gems cutters end width. |\n| Cutters Shape | `Cutters Shape` | Text | item | Gems cutters shape. |","metadata":{"title":"Shanks","section":"Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","collection":"grasshopper","hash":"b208602210efef36d97e82a0f70c202c","indexed_by":"docs-index"}},{"content":"Shanks — Cathedral Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Length | `Cutters Length` | Number | item | Gems cutters length. |\n| Cutters Move In Z | `Cutters Move In Z` | Number | item | Gems cutters move in Z. |\n| Cutters Move Middle In Z | `Cutters Move Middle In Z` | Number | item | Gems cutters move middle in Z. |\n| Cutters Shape Scale | `Cutters Shape Scale` | Number | item | Gems cutters shape scale. |\n| VCutters Enable | `VCutters Enable` | Boolean | item | Gems vcutters enable. |\n| VCutters Mode | `VCutters Mode` | Text | item | Gems vcutters mode. |\n| VCutters Start Height | `VCutters Start Height` | Number | item | Gems vcutters start height. |\n| VCutters Start Width | `VCutters Start Width` | Number | item | Gems vcutters start width. |\n| VCutters End Height | `VCutters End Height` | Number | item | Gems vcutters end height. |\n| VCutters End Width | `VCutters End Width` | Number | item | Gems vcutters end width. |\n| VCutters Length | `VCutters Length` | Number | item | Gems vcutters length. |\n| VCutters Move In Z | `VCutters Move In Z` | Number | item | Gems vcutters move in Z. |\n| Drill Enable | `Drill Enable` | Boolean | item | Gems drill enable. |\n| Drill Shape | `Drill Shape` | Text | item | Gems drill shape. |\n| Drill Width | `Drill Width` | Number | item | Gems drill width. |\n| Drill Height | `Drill Height` | Number | item | Gems drill height. |\n| Drill Allow Intersection | `Drill Allow Intersection` | Boolean | item | Gems drill allow intersection. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to Params component. |","metadata":{"title":"Shanks","section":"Cathedral Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-gems-reader","collection":"grasshopper","hash":"a56922a31b9f057b955cf250ae6f564b","indexed_by":"docs-index"}},{"content":"Shanks — Cathedral Shank Reader\n\nReads cathedral shank parameters from a Cathedral dictionary.\n\nNickname: `Cathedral Shank Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cathedral | `Cathedral` | Text | item | Cathedral parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Text | item | Cathedral profile. |\n| Top Width | `Top Width` | Number | item | Cathedral top width. |\n| Top Height | `Top Height` | Number | item | Cathedral top height. |\n| Bottom Width | `Bottom Width` | Number | item | Cathedral shank bottom width. |\n| Bottom Height | `Bottom Height` | Number | item | Cathedral shank bottom height. |\n| Cap Distance | `Cap Distance` | Number | item | Cathedral shank cap distance. |\n| Arm Tangent | `Arm Tangent` | Number | item | Cathedral shank arm tangent. |\n| Arm Angle | `Arm Angle` | Number | item | Cathedral shank arm angle. |\n| Arm Width | `Arm Width` | Number | item | Cathedral shank arm width. |\n| Arm Height | `Arm Height` | Number | item | Cathedral shank arm height. |\n| Bridge Enable | `Bridge Enable` | Boolean | item | Cathedral shank bridge enable. |\n| Bridge Width | `Bridge Width` | Number | item | Cathedral shank bridge width. |\n| Bridge Thickness | `Bridge Thickness` | Number | item | Cathedral shank bridge thickness. |\n| Bridge Fillet | `Bridge Fillet` | Number | item | Cathedral shank bridge fillet. |\n| Bridge Disk Diam | `Bridge Disk Diam` | Number | item | Cathedral shank bridge disk diameter. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Shank Params component. |","metadata":{"title":"Shanks","section":"Cathedral Shank Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-shank-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#cathedral-shank-reader","collection":"grasshopper","hash":"efa284f2f987e527670577b702b6ad09","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Bezels Reader\n\nReads eternity bezels parameters from an Eternity JSON dictionary.\n\nNickname: `Eternity Bezels Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity | `Eternity` | Text | item | Eternity parameters JSON dictionary. |\n\nOutputs","metadata":{"title":"Shanks","section":"Eternity Bezels Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-bezels-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-bezels-reader","collection":"grasshopper","hash":"27212d668eacab153dec8a3113a31120","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Bezels Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Rail Mode | `Rail Mode` | Text | item | Bezel rail mode (SINGLE / DOUBLE). |\n| Shape | `Shape` | Text | item | Bezel rail shape. |\n| Profile Shape | `Profile Shape` | Text | item | Profile shape. |\n| Remove Finger | `Remove Finger` | Boolean | item | Remove inside finger geometry. |\n| Top Diameter | `Top Diameter` | Number | item | Top rail diameter. |\n| Top Width | `Top Width` | Number | item | Top rail width. |\n| Top Height | `Top Height` | Number | item | Top rail height. |\n| Top Move Z | `Top Move Z` | Number | item | Top rail vertical shift. |\n| Top Thread Dia. | `Top Thread Dia.` | Number | item | Top thread diameter. |\n| Top Thread X | `Top Thread X` | Number | item | Top thread X offset. |\n| Top Thread Y | `Top Thread Y` | Number | item | Top thread Y offset. |\n| Bottom Diameter | `Bottom Diameter` | Number | item | Bottom rail diameter. |\n| Bottom Width | `Bottom Width` | Number | item | Bottom rail width. |\n| Bottom Height | `Bottom Height` | Number | item | Bottom rail height. |\n| Bottom Move Z | `Bottom Move Z` | Number | item | Bottom rail vertical shift. |\n| Bottom Thread Dia. | `Bottom Thread Dia.` | Number | item | Bottom thread diameter. |\n| Bottom Thread X | `Bottom Thread X` | Number | item | Bottom thread X offset. |\n| Bottom Thread Y | `Bottom Thread Y` | Number | item | Bottom thread Y offset. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to Params component. |","metadata":{"title":"Shanks","section":"Eternity Bezels Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-bezels-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-bezels-reader","collection":"grasshopper","hash":"ba3b6a83777845eafd74057fef5ccc5b","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Gems Reader\n\nReads eternity gems parameters from an Eternity JSON dictionary.\n\nNickname: `Eternity Gems Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity | `Eternity` | Text | item | Eternity parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Carat | `Carat` | Number | item | Gem carat weight. |\n| Shape | `Shape` | Text | item | Gem shape. |\n| Compound | `Compound` | Text | item | Gem compound. |\n| Distribution | `Distribution` | Text | item | Gem distribution. |\n| Move In Z | `Move In Z` | Number | item | Vertical adjustment. |\n| Min Distance | `Min Distance` | Number | item | Minimum spacing between gems. |\n| Orientation | `Orientation` | Text | item | Gem orientation. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to Params component. |","metadata":{"title":"Shanks","section":"Eternity Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-gems-reader","collection":"grasshopper","hash":"055497a90c08ec4da008a8fadc8f84d7","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Prongs Reader\n\nReads eternity prongs parameters from an Eternity JSON dictionary.\n\nNickname: `Eternity Prongs Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity | `Eternity` | Text | item | Eternity parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Distribution | `Prongs Distribution` | Text | item | SHARED / INDIVIDUAL_FOR_EACH_GEM. |\n| Top Distance | `Top Distance` | Number | item | Distance between top prongs. |\n| Bottom Distance | `Bottom Distance` | Number | item | Distance between bottom prongs. |\n| Height Over Girdle | `Height Over Girdle` | Number | item | Prong vertical offset over gem girdle. |\n| Top Diameter | `Top Diameter` | Number | item | Top prong diameter. |\n| Bottom Diameter | `Bottom Diameter` | Number | item | Bottom prong diameter. |\n| Individual Top Dist. | `Individual Top Dist.` | Number | item | Individual prongs spacing (top). |\n| Individual Bottom Dist. | `Individual Bottom Dist.` | Number | item | Individual prongs spacing (bottom). |\n| Expansion Mfg. | `Expansion Mfg.` | Number | item | Extra offset for manufacturing allowance. |\n| Prong Mode | `Prong Mode` | Text | item | STRAIGHT / CURVED. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to Params component. |","metadata":{"title":"Shanks","section":"Eternity Prongs Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-prongs-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-prongs-reader","collection":"grasshopper","hash":"e79852cf93ad19e8cd10da4bc30e0dd8","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Shank Lower Reader\n\nReads eternity lower shank parameters from an Eternity JSON dictionary.\n\nNickname: `Eternity Shank Lower Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity | `Eternity` | Text | item | Eternity parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Generic | item | Profile asset. |\n| Type | `Type` | Text | item | Shank type. |\n| Width | `Width` | Number | item | Shank width. |\n| Height | `Height` | Number | item | Shank height. |\n| Type | `Type` | Integer | item | Profile type index. |\n| Thickness | `Thickness` | Number | item | Profile thickness. |\n| Comfort | `Comfort` | Number | item | Comfort rounding. |\n| Orientation | `Orientation` | Integer | item | Profile orientation index. |","metadata":{"title":"Shanks","section":"Eternity Shank Lower Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-shank-lower-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-shank-lower-reader","collection":"grasshopper","hash":"4dddd009bda2befd05839ef051bd64be","indexed_by":"docs-index"}},{"content":"Shanks — Eternity Shank Upper Reader\n\nReads eternity upper shank parameters from an Eternity JSON dictionary.\n\nNickname: `Eternity Shank Upper Reader` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity | `Eternity` | Text | item | Eternity parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Generic | item | Profile asset. |\n| Type | `Type` | Text | item | Shank type. |\n| Width | `Width` | Number | item | Shank width. |\n| Height | `Height` | Number | item | Shank height. |\n| Type | `Type` | Integer | item | Profile type index. |\n| Thickness | `Thickness` | Number | item | Profile thickness. |\n| Comfort | `Comfort` | Number | item | Comfort rounding. |\n| Orientation | `Orientation` | Integer | item | Profile orientation index. |","metadata":{"title":"Shanks","section":"Eternity Shank Upper Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-shank-upper-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#eternity-shank-upper-reader","collection":"grasshopper","hash":"d247e556d54fa7ed8bf42c8fd3eb3584","indexed_by":"docs-index"}},{"content":"Shanks — Classic Adv Reader\n\nReads classic advanced parameters from a Classic dictionary.\n\nNickname: `ClassicAdv` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Opening Type | `Opening Type` | Text | item | Advanced opening type. |\n| Cut Length | `Cut Length` | Number | item | Advanced cut length. |\n| Cut Bumping | `Cut Bumping` | Number | item | Advanced cut bumping. |\n| Strangle Opening | `Strangle Opening` | Number | item | Advanced strangle opening. |\n| Strangle Base X | `Strangle Base X` | Number | item | Advanced strangle base X. |\n| Strangle Base Y | `Strangle Base Y` | Number | item | Advanced strangle base Y. |\n| Strangle Base Z | `Strangle Base Z` | Number | item | Advanced strangle base Z. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Shanks","section":"Classic Adv Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-adv-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-adv-reader","collection":"grasshopper","hash":"3578936e55a7362130e84d2a74e6cad3","indexed_by":"docs-index"}},{"content":"Shanks — Classic Bottom Reader\n\nReads classic bottom profile parameters from a Classic dictionary.\n\nNickname: `ClassicBottom` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Bottom enable. |\n| Profile | `Profile` | Text | item | Bottom profile. |\n| Height | `Height` | Number | item | Bottom height. |\n| Width | `Width` | Number | item | Bottom width. |\n| Rotation | `Rotation` | Number | item | Bottom rotation. |\n| Displacement | `Displacement` | Number | item | Bottom displacement. |\n| Type | `Type` | Text | item | Bottom type. |\n| Thickness | `Thickness` | Number | item | Bottom thickness. |\n| Comfort | `Comfort` | Number | item | Bottom comfort. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Profile Params component. |","metadata":{"title":"Shanks","section":"Classic Bottom Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-bottom-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-bottom-reader","collection":"grasshopper","hash":"306e8c6dfe8ec9d2cdad069966db9df5","indexed_by":"docs-index"}},{"content":"Shanks — Classic External Reader\n\nReads classic external profile parameters from a Classic dictionary.\n\nNickname: `ClassicExternal` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | External enable. |\n| Profile | `Profile` | Text | item | External profile. |\n| Top | `Top` | Number | item | External top. |\n| Mid | `Mid` | Number | item | External mid. |\n| Bottom | `Bottom` | Number | item | External bottom. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Shanks","section":"Classic External Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-external-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-external-reader","collection":"grasshopper","hash":"d71fc9d6ab66f8a344fc8d13d0478caa","indexed_by":"docs-index"}},{"content":"Shanks — Classic Gems Reader\n\nReads classic gems parameters from a Classic dictionary.\n\nNickname: `ClassicGems` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs","metadata":{"title":"Shanks","section":"Classic Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","collection":"grasshopper","hash":"8478a3894cc78a6fb5f64ec48ac56810","indexed_by":"docs-index"}},{"content":"Shanks — Classic Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enabled | `Enabled` | Boolean | item | Gems enable. |\n| Gem Shape | `Gem Shape` | Text | item | Gems gem shape. |\n| Gem Size | `Gem Size` | Number | item | Gems gem size. |\n| Angle | `Angle` | Number | item | Gems angle. |\n| Min Distance | `Min Distance` | Number | item | Gems min distance. |\n| Vertical | `Vertical` | Number | item | Gems gem vertical. |\n| Bright Cut | `Bright Cut` | Number | item | Gems bright cut. |\n| Inner Depth | `Inner Depth` | Number | item | Gems inner depth. |\n| Inner Width | `Inner Width` | Number | item | Gems inner width. |\n| Margin | `Margin` | Number | item | Gems margin. |\n| Setting Mode | `Setting Mode` | Text | item | Gems setting mode: NONE, SCALLOPED, SHARED. |\n| Prong Height | `Prong Height` | Number | item | Gems prong height. |\n| Prong Move Z | `Prong Move Z` | Number | item | Gems prong move in Z. |\n| Extension Mfg | `Extension Mfg` | Number | item | Gems prong extension for manufacturing. |\n| Gem Inside | `Gem Inside` | Number | item | Gems prong gem inside. |\n| Auto Prong Diameter | `Auto Prong Diameter` | Boolean | item | Gems prong automatic diameter. |\n| Prong Diameter | `Prong Diameter` | Number | item | Gems prong diameter. |\n| Cutters Mode | `Cutters Mode` | Text | item | Gems cutters mode. |\n| Cutters Start Height | `Cutters Start Height` | Number | item | Gems cutters start height. |\n| Cutters Start Width | `Cutters Start Width` | Number | item | Gems cutters start width. |\n| Cutters End Height | `Cutters End Height` | Number | item | Gems cutters end height. |\n| Cutters End Width | `Cutters End Width` | Number | item | Gems cutters end width. |\n| Cutters Shape | `Cutters Shape` | Text | item | Gems cutters shape. |","metadata":{"title":"Shanks","section":"Classic Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","collection":"grasshopper","hash":"98e9538db7233693a7ef578c6046e94c","indexed_by":"docs-index"}},{"content":"Shanks — Classic Gems Reader\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Length | `Cutters Length` | Number | item | Gems cutters length. |\n| Cutters Move In Z | `Cutters Move In Z` | Number | item | Gems cutters move in Z. |\n| Cutters Move Middle In Z | `Cutters Move Middle In Z` | Number | item | Gems cutters move middle in Z. |\n| Cutters Shape Scale | `Cutters Shape Scale` | Number | item | Gems cutters shape scale. |\n| VCutters Enable | `VCutters Enable` | Boolean | item | Gems vcutters enable. |\n| VCutters Mode | `VCutters Mode` | Text | item | Gems vcutters mode. |\n| VCutters Start Height | `VCutters Start Height` | Number | item | Gems vcutters start height. |\n| VCutters Start Width | `VCutters Start Width` | Number | item | Gems vcutters start width. |\n| VCutters End Height | `VCutters End Height` | Number | item | Gems vcutters end height. |\n| VCutters End Width | `VCutters End Width` | Number | item | Gems vcutters end width. |\n| VCutters Length | `VCutters Length` | Number | item | Gems vcutters length. |\n| VCutters Move In Z | `VCutters Move In Z` | Number | item | Gems vcutters move in Z. |\n| Drill Enable | `Drill Enable` | Boolean | item | Gems drill enable. |\n| Drill Shape | `Drill Shape` | Text | item | Gems drill shape. |\n| Drill Width | `Drill Width` | Number | item | Gems drill width. |\n| Drill Height | `Drill Height` | Number | item | Gems drill height. |\n| Drill Allow Intersection | `Drill Allow Intersection` | Boolean | item | Gems drill allow intersection. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Params component. |","metadata":{"title":"Shanks","section":"Classic Gems Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-gems-reader","collection":"grasshopper","hash":"a880f33ca83fd00a834c6b60579c4942","indexed_by":"docs-index"}},{"content":"Shanks — Classic Mid Reader\n\nReads classic mid profile parameters from a Classic dictionary.\n\nNickname: `ClassicMid` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | Mid enable. |\n| Profile | `Profile` | Text | item | Mid profile. |\n| Height | `Height` | Number | item | Mid height. |\n| Width | `Width` | Number | item | Mid width. |\n| Rotation | `Rotation` | Number | item | Mid rotation. |\n| Displacement | `Displacement` | Number | item | Mid displacement. |\n| Type | `Type` | Text | item | Mid type. |\n| Thickness | `Thickness` | Number | item | Mid thickness. |\n| Comfort | `Comfort` | Number | item | Mid comfort. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Profile Params component. |","metadata":{"title":"Shanks","section":"Classic Mid Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-mid-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-mid-reader","collection":"grasshopper","hash":"7685bf2589bba5f9e8322c4c1aca4db1","indexed_by":"docs-index"}},{"content":"Shanks — Classic Top Reader\n\nReads classic top profile parameters from a Classic dictionary.\n\nNickname: `ClassicTop` · Tab: Readers › Shanks\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic | `Classic` | Text | item | Classic parameters JSON dictionary. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile | `Profile` | Text | item | Top profile. |\n| Height | `Height` | Number | item | Top height. |\n| Width | `Width` | Number | item | Top width. |\n| Rotation | `Rotation` | Number | item | Top rotation. |\n| Displacement | `Displacement` | Number | item | Top displacement. |\n| Type | `Type` | Text | item | Top type. |\n| Thickness | `Thickness` | Number | item | Top thickness. |\n| Comfort | `Comfort` | Number | item | Top comfort. |\n| Connector | `Connector` | Generic | item | All values as dictionary for direct connection to the Profile Params component. |","metadata":{"title":"Shanks","section":"Classic Top Reader","url":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-top-reader","source":"https://www.rhinoartisan.com/docs/grasshopper/components/readers/shanks/#classic-top-reader","collection":"grasshopper","hash":"a44b205c3ae72f720eb0080aad378003","indexed_by":"docs-index"}},{"content":"Shanks\n\nRing bodies: classic, cathedral, eternity, signet, bypass and the rest.\n\n71 components in 16 groups.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","collection":"grasshopper","hash":"698a648a3781f58700edf97801f808b6","indexed_by":"docs-index"}},{"content":"Shanks\n\n- Advanced Cathedral — 3 components: Advanced Cathedral, Advanced Cathedral - Gems Params, Advanced Cathedral - Shank Params.\n- Advanced Ring — 4 components: Advanced, Advanced - Gems Parameters, Advanced - Global Parameters, Advanced - Profile Parameters.\n- Bypass — 3 components: Bypass, Bypass - Gems Params, Bypass - Shank Params.\n- Cathedral — 3 components: Cathedral, Cathedral - Gems Params, Cathedral - Shank Params.\n- Class Ring — 4 components: Class Ring, Class Ring - Gem Params, Class Ring - Shank Params, Class Ring - Top Side Params.\n- Classic — 6 components: Classic, Classic - Advanced Parameters, Classic - External Profile, Classic - Gems Parameters, Classic - Profile, Classic - Profile With Enable.\n- Engraving — 2 components: Engraving, Engraving - Text Parameters.\n- Eternity — 6 components: Eternity, Eternity - Bezels Parameters, Eternity - Gems Parameters, Eternity - Prongs Parameters, Eternity - Shank Lower, Eternity - Shank Upper.\n- Matching Shank — 4 components: Matching Shank, Matching Shank - Fit Params, Matching Shank - Gems Params, Matching Shank - Shank Params.\n- Pave Shank — 4 components: Pave Shank, Pave Shank - Band Params, Pave Shank - Cutters Params, Pave Shank - Row Params.\n- Ring Curve — 2 components: Ring Curve, Ring Curve - Parameters.\n- Ring Cut — 1 component: Ring Cylinder.\n- Ring Sizes — 19 components: Ring Sizes - British, Ring Sizes - China, Ring Sizes - Europe, Ring Sizes - USA, Ring Sizes - Australia, Ring Sizes - Brazil, Ring Sizes - Canada, Ring Sizes - France, Ring Sizes - Germany, Ring Sizes - India, Ring Sizes - India Extended, Ring Sizes - Israel, Ring Sizes - Italy, Ring Sizes - Japan, Ring Sizes - Russia, Ring Sizes - South America, Ring Sizes - Spain, Ring Sizes - Switzerland, Ring Sizes - Türkiye.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","collection":"grasshopper","hash":"dfab574d0191ea5f330cb51e386d7ef6","indexed_by":"docs-index"}},{"content":"Shanks\n\n- Signet — 1 component: Signet.\n- Two Rows Shank — 5 components: Two Rows Shank, Two Rows Shank - Cutters Params, Two Rows Shank - Gems Params, Two Rows Shank - Prongs Params, Two Rows Shank - Rail Params.\n- Wedding — 4 components: Wedding, Wedding Band, Wedding - Gems, Wedding - Profile.","metadata":{"title":"Shanks","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/","collection":"grasshopper","hash":"722245b4a1e5168d00308144be183757","indexed_by":"docs-index"}},{"content":"Advanced Cathedral\n\n3 components in Shanks › Advanced Cathedral.\n\nAdvanced Cathedral\nCreates an advanced cathedral shank with optional parameters\n\nNickname: `Adv Cathedral` · Tab: Shanks › Advanced Cathedral\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size diameter |\n| Shank _(optional)_ | `Shank` | Generic | item | — | Shank parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of an AdvancedCathedralShank |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Shank Brep geometry |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Meshes` | Geometry | list | Gem meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Advanced Cathedral taxonomy with reader-compatible keys |\n| Cutters | `Cutters` | Generic | list | Cutters geometry generated by the advanced cathedral |","metadata":{"title":"Advanced Cathedral","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/","collection":"grasshopper","hash":"48736bcac536fa834114076419bd1e12","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Gems Params\n\nParameters for Advanced Cathedral Gems\n\nNickname: `Adv Cathedral Gems Params` · Tab: Shanks › Advanced Cathedral\n\nInputs","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","collection":"grasshopper","hash":"60cef1677cd5f721fb703a52e65edd73","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | Enable gems |\n| Angle _(optional)_ | `Angle` | Number | item | Gem angle |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | Gem size |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | Minimum distance between gems |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | Gem shape |\n| Gem Vertical _(optional)_ | `Gem Vertical` | Boolean | item | Gem vertical |\n| Inner Width _(optional)_ | `Inner Width` | Number | item | Inner width |\n| Inner Depth _(optional)_ | `Inner Depth` | Number | item | Inner depth |\n| Bright Cut _(optional)_ | `Bright Cut` | Boolean | item | Bright cut |\n| Margin _(optional)_ | `Margin` | Number | item | Margin |\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | Setting mode (prong type) |\n| Prong Gem Inside _(optional)_ | `Prong Gem Inside` | Boolean | item | Prong gem inside |\n| Prong Diameter _(optional)_ | `Prong Diameter` | Number | item | Prong diameter |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | Prong height |\n| Prong Move In Z _(optional)_ | `Prong Move In Z` | Number | item | Prong move in Z |\n| Prong Extension For Mfg _(optional)_ | `Prong Extension For Mfg` | Number | item | Prong extension for manufacturing |\n| Prong Automatic Diameter _(optional)_ | `Prong Automatic Diameter` | Boolean | item | Prong automatic diameter |\n| Cutters Enable _(optional)_ | `Cutters Enable` | Boolean | item | Cutters enable |\n| Cutters Mode _(optional)_ | `Cutters Mode` | Text | item | Cutters mode |\n| Cutters Start Height _(optional)_ | `Cutters Start Height` | Number | item | Cutters start height |","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","collection":"grasshopper","hash":"f02e59d3f6834c9ef8f99f805a04382b","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Start Width _(optional)_ | `Cutters Start Width` | Number | item | Cutters start width |\n| Cutters End Height _(optional)_ | `Cutters End Height` | Number | item | Cutters end height |\n| Cutters End Width _(optional)_ | `Cutters End Width` | Number | item | Cutters end width |\n| Cutters Shape _(optional)_ | `Cutters Shape` | Text | item | Cutters shape |\n| Cutters Length _(optional)_ | `Cutters Length` | Number | item | Cutters length |\n| Cutters Move In Z _(optional)_ | `Cutters Move In Z` | Number | item | Cutters move in Z |\n| Cutters Move Middle In Z _(optional)_ | `Cutters Move Middle In Z` | Number | item | Cutters move middle in Z |\n| Cutters Shape Scale _(optional)_ | `Cutters Shape Scale` | Number | item | Cutters shape scale |\n| VCutters Enable _(optional)_ | `VCutters Enable` | Boolean | item | VCutters enable |\n| VCutters Mode _(optional)_ | `VCutters Mode` | Text | item | VCutters mode |\n| VCutters Start Height _(optional)_ | `VCutters Start Height` | Number | item | VCutters start height |\n| VCutters Start Width _(optional)_ | `VCutters Start Width` | Number | item | VCutters start width |\n| VCutters End Height _(optional)_ | `VCutters End Height` | Number | item | VCutters end height |\n| VCutters End Width _(optional)_ | `VCutters End Width` | Number | item | VCutters end width |\n| VCutters Length _(optional)_ | `VCutters Length` | Number | item | VCutters length |\n| VCutters Move In Z _(optional)_ | `VCutters Move In Z` | Number | item | VCutters move in Z |\n| Drill Enable _(optional)_ | `Drill Enable` | Boolean | item | Drill enable |\n| Drill Shape _(optional)_ | `Drill Shape` | Text | item | Drill shape |","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","collection":"grasshopper","hash":"9b75acb81a3387f7f1dee26b53c90581","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Drill Width _(optional)_ | `Drill Width` | Number | item | Drill width |\n| Drill Height _(optional)_ | `Drill Height` | Number | item | Drill height |\n| Drill Allow Intersection _(optional)_ | `Drill Allow Intersection` | Boolean | item | Drill allow intersection |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Params` | Generic | item | Dictionary of gems parameters |","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---gems-params","collection":"grasshopper","hash":"a127b12c00d7a8b310789d68ca9b68a6","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Shank Params\n\nParameters for the Advanced Cathedral shank\n\nNickname: `Adv Cathedral Shank Params` · Tab: Shanks › Advanced Cathedral\n\nInputs","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","collection":"grasshopper","hash":"6adec7da56eea2f980385b38abc876d0","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Shank Params\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Arm Height _(optional)_ | `Arm Height` | Number | item | `2.60` | Arm height |\n| Arm Opening _(optional)_ | `Arm Opening` | Number | item | `4.00` | Arm opening |\n| Tip Inclination _(optional)_ | `Tip Inclination` | Number | item | `6.10` | Tip inclination |\n| Tangent Point _(optional)_ | `Tangent Point` | Number | item | `0.0` | Tangent point |\n| Tip Round _(optional)_ | `Tip Round` | Number | item | `0.50` | Tip round |\n| Bridge Enable _(optional)_ | `Bridge Enable` | Boolean | item | `true` | Enable/disable bridge |\n| Bridge Width _(optional)_ | `Bridge Width` | Number | item | `1.30` | Bridge width |\n| Bridge Thickness _(optional)_ | `Bridge Thickness` | Number | item | `0.90` | Bridge thickness |\n| Bridge Fillet _(optional)_ | `Bridge Fillet` | Number | item | `0.0` | Bridge fillet |\n| Bridge Angle _(optional)_ | `Bridge Angle` | Number | item | `100.0` | Bridge angle |\n| Bridge Diameter _(optional)_ | `Bridge Diameter` | Number | item | `2.30` | Bridge diameter |\n| Bridge Open Angle _(optional)_ | `Bridge Open Angle` | Number | item | `0.0` | Bridge open angle |\n| Shared Profile _(optional)_ | `Shared Profile` | Boolean | item | `true` | Shared profile |\n| Gem Gradient _(optional)_ | `Gem Gradient` | Boolean | item | `true` | Gem gradient |\n| Gem Gradient Points _(optional)_ | `Gem Gradient Points` | Integer | item | `2` | Gem gradient points |\n| Gem Size Middle Position _(optional)_ | `Gem Size Middle Position` | Number | item | `0.5` | Gem size middle position |\n| Gem Size Start _(optional)_ | `Gem Size Start` | Number | item | `1.20` | Gem size start |\n| Gem Size Middle _(optional)_ | `Gem Size Middle` | Number | item | `2.0` | Gem size middle |","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","collection":"grasshopper","hash":"0b8321ce60db1ab8c24f824daada7c7c","indexed_by":"docs-index"}},{"content":"Advanced Cathedral — Advanced Cathedral - Shank Params\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Size End _(optional)_ | `Gem Size End` | Number | item | `1.80` | Gem size end |\n| Prong Grow _(optional)_ | `Prong Grow` | Number | item | `0.0` | Prong grow |\n| Prong Min Diameter _(optional)_ | `Prong Min Diameter` | Number | item | `0.45` | Prong minimum diameter |\n| End Prong Count _(optional)_ | `End Prong Count` | Integer | item | `2` | End prong count |\n| Prong Spacing _(optional)_ | `Prong Spacing` | Number | item | `0.0` | Prong spacing |\n| Prong Distance _(optional)_ | `Prong Distance` | Number | item | `0.0` | Prong distance |\n| Station Positions _(optional)_ | `Station Positions` | Number | list | — | Station positions |\n| Station Widths _(optional)_ | `Station Widths` | Number | list | — | Station widths |\n| Station Heights _(optional)_ | `Station Heights` | Number | list | — | Station heights |\n| Station Profile _(optional)_ | `Station Profile` | Generic | item | — | Station profile asset |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Params | `Shank Params` | Generic | item | Dictionary of shank parameters |","metadata":{"title":"Advanced Cathedral","section":"Advanced Cathedral - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-cathedral/#advanced-cathedral---shank-params","collection":"grasshopper","hash":"14ccb26a5bb353acd34d7ed9038a42d8","indexed_by":"docs-index"}},{"content":"Advanced Ring\n\n4 components in Shanks › Advanced Ring.\n\nAdvanced\nCreates a shank defined by multiple profiles along a curve\n\nNickname: `Shank - Advanced` · Tab: Shanks › Advanced Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Ring Curve _(optional)_ | `RingCurve` | RingCurve | item | RingCurve object |\n| Global _(optional)_ | `Glob` | Generic | item | Global parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | Gems parameters |\n| Profiles _(optional)_ | `Profiles` | Generic | list | Profiles along the shank |\n| JSON _(optional)_ | `JSON` | Text | item | JSON definition of RingBySection |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Ring geometry |\n| Ring Curve | `Ring Curve` | Curve | list | Ring geometry |\n| Gems Curve | `Gems Curve` | Curve | list | Ring geometry |\n| Magnet Top | `MagTop` | Point | item | Top center of bounding box |\n| Magnet Bottom | `MagBot` | Point | item | Bottom center of bounding box |\n| Magnet Finger Size Top | `Finger size top` | Point | item | Bottom center of the Bridge |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |\n| Semantic | `Semantic` | Text | item | Semantic text description of the advanced ring |","metadata":{"title":"Advanced Ring","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/","collection":"grasshopper","hash":"97b4c22cad49613d3109015c167c3333","indexed_by":"docs-index"}},{"content":"Advanced Ring — Advanced - Gems Parameters\n\nParameters for gems in RingBySection\n\nNickname: `Advanced Gems` · Tab: Shanks › Advanced Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable | `Enable` | Boolean | item | `false` | Enable gems |\n| Gem Size | `GemSz` | Number | item | `1.5` | Gem size |\n| Angle | `Ang` | Number | item | `180` | Angle |\n| Min Distance | `MinDist` | Number | item | `0.2` | Minimum distance |\n| Vertical | `Vert` | Number | item | `0` | Vertical offset |\n| Bright Cut | `BrtCut` | Number | item | `0.3` | Bright cut |\n| Inner Height | `InH` | Number | item | `1` | Inner height |\n| Inner Width | `InW` | Number | item | `1.5` | Inner width |\n| Margin | `Marg` | Number | item | `1` | Margin |\n| Type Prong | `PrType` | Text | item | `NONE` | Type of prong |\n| Prong Height | `PrH` | Number | item | `1` | Prong height |\n| Gem Inside | `GemIn` | Number | item | `0.1` | Gem inside depth |\n| Drill Type | `DrType` | Text | item | `NONE` | Drill type |\n| Drill Width | `DrW` | Number | item | `1` | Drill width |\n| Drill Height | `DrH` | Number | item | `1` | Drill height |\n| Extension For Manufacturing | `ExtMan` | Number | item | `1` | Offset for manufacturing |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Params` | Generic | item | Dictionary of gems params |","metadata":{"title":"Advanced Ring","section":"Advanced - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---gems-parameters","collection":"grasshopper","hash":"3f982d6f682b5672d3c307ae343552e8","indexed_by":"docs-index"}},{"content":"Advanced Ring — Advanced - Global Parameters\n\nGlobal parameters for RingBySection\n\nNickname: `Advanced Global` · Tab: Shanks › Advanced Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Start Flip | `StFlip` | Boolean | item | `false` | Flip start profile |\n| End Flip | `EnFlip` | Boolean | item | `false` | Flip end profile |\n| Start Cap Distance | `StCap` | Number | item | `1.0` | Cap distance at start |\n| End Cap Distance | `EnCap` | Number | item | `1.0` | Cap distance at end |\n| Arm Enable | `ArmEn` | Boolean | item | `false` | Enable arms |\n| Arm Angle | `ArmAng` | Number | item | `100` | Angle of arms |\n| Arm Width | `ArmW` | Number | item | `2.4` | Width of arms |\n| Arm Thickness | `ArmThk` | Number | item | `0.6` | Thickness of arms |\n| Arm Diameter | `ArmDia` | Number | item | `3.6` | Diameter of arms |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Global Params | `Params` | Generic | item | Dictionary of global params |","metadata":{"title":"Advanced Ring","section":"Advanced - Global Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---global-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---global-parameters","collection":"grasshopper","hash":"0648e6bf85fd516f968509a730c78b28","indexed_by":"docs-index"}},{"content":"Advanced Ring — Advanced - Profile Parameters\n\nParameters for a profile section of RingBySection\n\nNickname: `Advanced Profile` · Tab: Shanks › Advanced Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| T | `T` | Number | item | `0` | Normalized position along curve (0-1) |\n| Height | `H` | Number | item | `2` | Profile height |\n| Width | `W` | Number | item | `3` | Profile width |\n| Rotation | `Rot` | Number | item | `0` | Rotation of the profile |\n| Displacement | `Disp` | Number | item | `0` | Displacement from curve |\n| Type | `Type` | Text | item | `COMFORT` | Profile type (COMFORT, FLAT, etc.) |\n| Thickness | `Thk` | Number | item | `0.7` | Profile thickness |\n| Comfort | `Comf` | Number | item | `0.3` | Comfort rounding value |\n| Enable | `En` | Boolean | item | `true` | Enable this section profile |\n| Label | `Lbl` | Text | item | `1` | Optional text label for the profile |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile Params | `Params` | Generic | item | Dictionary of profile params |","metadata":{"title":"Advanced Ring","section":"Advanced - Profile Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---profile-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/advanced-ring/#advanced---profile-parameters","collection":"grasshopper","hash":"6fff160811d296f93a8f54fe7b2ca299","indexed_by":"docs-index"}},{"content":"Bypass\n\n3 components in Shanks › Bypass.\n\nBypass\nCreates a bypass (crossover) shank with optional parameters\n\nNickname: `Bypass` · Tab: Shanks › Bypass\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size parameters |\n| Shank _(optional)_ | `Shank` | Generic | item | — | Shank parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Bypass |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Ring Brep geometry (shank and prongs) |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Cutters | `Cutters` | Brep | list | Cutters geometry generated by the bypass |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Bypass taxonomy with reader-compatible keys |","metadata":{"title":"Bypass","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/","collection":"grasshopper","hash":"1b20839467b5b8a74cf9ebf3fed80065","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Gems Params\n\nParameters for Bypass Gems\n\nNickname: `Bypass Gems Params` · Tab: Shanks › Bypass\n\nInputs","metadata":{"title":"Bypass","section":"Bypass - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","collection":"grasshopper","hash":"220c305d7e4d6fddea30a2bc011adb05","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | Enable gems |\n| Angle _(optional)_ | `Angle` | Number | item | Gem band arc in degrees from each tip |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | Minimum distance between gems |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | Gem shape |\n| Gem Vertical _(optional)_ | `Gem Vertical` | Number | item | Gem vertical |\n| Inner Width _(optional)_ | `Inner Width` | Number | item | Inner width |\n| Inner Depth _(optional)_ | `Inner Depth` | Number | item | Inner depth |\n| Bright Cut _(optional)_ | `Bright Cut` | Number | item | Bright cut |\n| Margin _(optional)_ | `Margin` | Number | item | Margin from the arm tip |\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | Setting mode NONE, SCALLOPED, SHARED |\n| Gem Gradient _(optional)_ | `Gem Gradient` | Boolean | item | Enable the gem size gradient along the arm |\n| Gem Gradient Points _(optional)_ | `Gem Gradient Points` | Integer | item | Gradient stops: 2 (start/end) or 3 (start/middle/end) |\n| Gem Size Start _(optional)_ | `Gem Size Start` | Number | item | Gem size at the start (top, next to the tip) |\n| Gem Size Middle _(optional)_ | `Gem Size Middle` | Number | item | Gem size at the middle stop |\n| Gem Size End _(optional)_ | `Gem Size End` | Number | item | Gem size at the end (bottom) |\n| Gem Size Middle Position _(optional)_ | `Gem Size Middle Pos` | Number | item | Normalised position of the middle stop (0-1) |\n| Prong Gem Inside _(optional)_ | `Prong Gem Inside` | Number | item | Prong gem inside |\n| Prong Diameter _(optional)_ | `Prong Diameter` | Number | item | Prong diameter |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | Prong height |","metadata":{"title":"Bypass","section":"Bypass - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","collection":"grasshopper","hash":"021afc214fb800c8993d7f04ef56ea14","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Extension For Mfg _(optional)_ | `Prong Extension For Mfg` | Number | item | Prong extension for manufacturing |\n| Prong Automatic Diameter _(optional)_ | `Prong Automatic Diameter` | Boolean | item | Prong automatic diameter |\n| Prong Grow _(optional)_ | `Prong Grow` | Number | item | Prong grow |\n| Prong Min Diameter _(optional)_ | `Prong Min Diameter` | Number | item | Minimum prong diameter |\n| End Prong Count _(optional)_ | `End Prong Count` | Integer | item | Prong count at the run ends |\n| Prong Spacing _(optional)_ | `Prong Spacing` | Number | item | Prong spacing |\n| Prong Distance _(optional)_ | `Prong Distance` | Number | item | Prong distance |\n| Cutters Start Height _(optional)_ | `Cutters Start Height` | Number | item | Cutters start height |\n| Cutters Start Width _(optional)_ | `Cutters Start Width` | Number | item | Cutters start width |\n| Cutters End Height _(optional)_ | `Cutters End Height` | Number | item | Cutters end height |\n| Cutters End Width _(optional)_ | `Cutters End Width` | Number | item | Cutters end width |\n| Cutters Shape _(optional)_ | `Cutters Shape` | Text | item | Cutters shape |\n| Cutters Length _(optional)_ | `Cutters Length` | Number | item | Cutters length |\n| Cutters Move In Z _(optional)_ | `Cutters Move In Z` | Number | item | Cutters move in Z |\n| Cutters Move Middle In Z _(optional)_ | `Cutters Move Middle In Z` | Number | item | Cutters move middle in Z |\n| Cutters Shape Scale _(optional)_ | `Cutters Shape Scale` | Number | item | Cutters shape scale |\n| VCutters Enable _(optional)_ | `VCutters Enable` | Boolean | item | VCutters enable |\n| VCutters Start Height _(optional)_ | `VCutters Start Height` | Number | item | VCutters start height |","metadata":{"title":"Bypass","section":"Bypass - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","collection":"grasshopper","hash":"f81831b9a4c2e00e7d7e25657a39c1ce","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| VCutters Start Width _(optional)_ | `VCutters Start Width` | Number | item | VCutters start width |\n| VCutters End Height _(optional)_ | `VCutters End Height` | Number | item | VCutters end height |\n| VCutters End Width _(optional)_ | `VCutters End Width` | Number | item | VCutters end width |\n| VCutters Length _(optional)_ | `VCutters Length` | Number | item | VCutters length |\n| VCutters Move In Z _(optional)_ | `VCutters Move In Z` | Number | item | VCutters move in Z |\n| Drill Enable _(optional)_ | `Drill Enable` | Boolean | item | Drill enable |\n| Drill Shape _(optional)_ | `Drill Shape` | Text | item | Drill shape |\n| Drill Width _(optional)_ | `Drill Width` | Number | item | Drill width |\n| Drill Height _(optional)_ | `Drill Height` | Number | item | Drill height |\n| Drill Allow Intersection _(optional)_ | `Drill Allow Intersection` | Boolean | item | Drill allow intersection |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Params` | Generic | item | Dictionary of gems parameters |","metadata":{"title":"Bypass","section":"Bypass - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---gems-params","collection":"grasshopper","hash":"a7f03b329ff1f284c3d6d15d5903ff9b","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Shank Params\n\nParameters for Bypass Shank\n\nNickname: `Bypass - Shank Params` · Tab: Shanks › Bypass\n\nInputs","metadata":{"title":"Bypass","section":"Bypass - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","collection":"grasshopper","hash":"6bd67c33adbb3ab44d5af02afd92aa25","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Shank Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | Ring profile: HALF_ROUND, OVAL, RECTANGLE, ROUNDED_TRAPEZOID or a profile asset name (e.g. 006) |\n| Top Width _(optional)_ | `Top Width` | Number | item | Top width of the shank |\n| Top Height _(optional)_ | `Top Height` | Number | item | Top height of the shank |\n| Bottom Width _(optional)_ | `Bottom Width` | Number | item | Bottom width of the shank |\n| Bottom Height _(optional)_ | `Bottom Height` | Number | item | Bottom height of the shank |\n| Cap Distance _(optional)_ | `Cap Distance` | Number | item | Cap distance |\n| Arm Tangent _(optional)_ | `Arm Tangent` | Number | item | Tangent control |\n| Arm Angle _(optional)_ | `Arm Angle` | Number | item | Arm angle |\n| Arm Width _(optional)_ | `Arm Width` | Number | item | Arm width |\n| Arm Height _(optional)_ | `Arm Height` | Number | item | Arm height |\n| Tip Rotation _(optional)_ | `Tip Rotation` | Number | item | Tip profile rotation in degrees about the rail tangent |\n| Displacement _(optional)_ | `Displacement` | Number | item | Maximum Y displacement of the arm tip (mm), controls the crossover |\n| Displacement Start _(optional)_ | `Displacement Start` | Integer | item | Rail point (1-8, 1 = bottom) where the progressive displacement starts |\n| Bridge Enable _(optional)_ | `Bridge Enable` | Boolean | item | Enable/disable bridge |\n| Bridge Angle _(optional)_ | `Bridge Angle` | Number | item | Angle in degrees from the top of the ring where the bridge ends |\n| Bridge Width _(optional)_ | `Bridge Width` | Number | item | Bridge width |\n| Bridge Thickness _(optional)_ | `Bridge Thickness` | Number | item | Bridge thickness |","metadata":{"title":"Bypass","section":"Bypass - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","collection":"grasshopper","hash":"7ccc7da8a21fbf35f153ef341b4edc9e","indexed_by":"docs-index"}},{"content":"Bypass — Bypass - Shank Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Bridge Disk Diam _(optional)_ | `Bridge Disk Diam` | Number | item | Diameter of the central cylinder joining the two bridge halves |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from the Shank Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Params | `Shank Params` | Generic | item | Dictionary of shank parameters |","metadata":{"title":"Bypass","section":"Bypass - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/bypass/#bypass---shank-params","collection":"grasshopper","hash":"c9dcd99f5b5fa5810abe7f0aca4543c4","indexed_by":"docs-index"}},{"content":"Cathedral\n\n3 components in Shanks › Cathedral.\n\nCathedral\nCreates a cathedral shank with optional parameters\n\nNickname: `Cathedral` · Tab: Shanks › Cathedral\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size parameters |\n| Shank _(optional)_ | `Shank` | Generic | item | — | Shank parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Cathedral |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Ring Brep geometry |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Magnet Bridge Top | `Bridge Top` | Point | item | Top center of the Bridge |\n| Magnet Bridge Bottom | `Bridge Bot.` | Point | item | Bottom center of the Bridge |\n| Taxonomy | `Taxonomy` | Generic | item | Cathedral taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the cathedral ring |\n| Cutters | `Cutters` | Generic | list | Cutters geometry generated by the cathedral |\n| Gemsetting | `Gemsetting` | Text | item | Gem setting type derived from the gems setting mode: NONE -> CHANNEL, SHARED -> PRONG, SCALLOPED -> PAVE |","metadata":{"title":"Cathedral","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/","collection":"grasshopper","hash":"d0c5291e2e1614ee7fc838888f218d8d","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral - Gems Params\n\nParameters for Cathedral Gems\n\nNickname: `Cathedral Gems Params` · Tab: Shanks › Cathedral\n\nInputs","metadata":{"title":"Cathedral","section":"Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","collection":"grasshopper","hash":"0fe69986ec2dbbe6c0cc8a2e5bef5bf0","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | Enable gems |\n| Angle _(optional)_ | `Angle` | Number | item | Gem angle |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | Gem size |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | Minimum distance between gems |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | Gem shape |\n| Gem Vertical _(optional)_ | `Gem Vertical` | Number | item | Gem vertical |\n| Inner Width _(optional)_ | `Inner Width` | Number | item | Inner width |\n| Inner Depth _(optional)_ | `Inner Depth` | Number | item | Inner depth |\n| Bright Cut _(optional)_ | `Bright Cut` | Boolean | item | Bright cut |\n| Margin _(optional)_ | `Margin` | Number | item | Margin |\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | Setting mode NONE, SCALLOPED, SHARED |\n| Prong Gem Inside _(optional)_ | `Prong Gem Inside` | Boolean | item | Prong gem inside |\n| Prong Diameter _(optional)_ | `Prong Diameter` | Number | item | Prong diameter |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | Prong height |\n| Prong Move In Z _(optional)_ | `Prong Move In Z` | Number | item | Prong move in Z |\n| Prong Extension For Mfg _(optional)_ | `Prong Extension For Mfg` | Number | item | Prong extension for manufacturing |\n| Prong Automatic Diameter _(optional)_ | `Prong Automatic Diameter` | Boolean | item | Prong automatic diameter |\n| Cutters Mode _(optional)_ | `Cutters Mode` | Text | item | Cutters mode |\n| Cutters Start Height _(optional)_ | `Cutters Start Height` | Number | item | Cutters start height |\n| Cutters Start Width _(optional)_ | `Cutters Start Width` | Number | item | Cutters start width |","metadata":{"title":"Cathedral","section":"Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","collection":"grasshopper","hash":"8928b8a6ae02ea9c5c1940ef36b24c02","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters End Height _(optional)_ | `Cutters End Height` | Number | item | Cutters end height |\n| Cutters End Width _(optional)_ | `Cutters End Width` | Number | item | Cutters end width |\n| Cutters Shape _(optional)_ | `Cutters Shape` | Text | item | Cutters shape |\n| Cutters Length _(optional)_ | `Cutters Length` | Number | item | Cutters length |\n| Cutters Move In Z _(optional)_ | `Cutters Move In Z` | Number | item | Cutters move in Z |\n| Cutters Move Middle In Z _(optional)_ | `Cutters Move Middle In Z` | Number | item | Cutters move middle in Z |\n| Cutters Shape Scale _(optional)_ | `Cutters Shape Scale` | Number | item | Cutters shape scale |\n| VCutters Enable _(optional)_ | `VCutters Enable` | Boolean | item | VCutters enable |\n| VCutters Mode _(optional)_ | `VCutters Mode` | Text | item | VCutters mode |\n| VCutters Start Height _(optional)_ | `VCutters Start Height` | Number | item | VCutters start height |\n| VCutters Start Width _(optional)_ | `VCutters Start Width` | Number | item | VCutters start width |\n| VCutters End Height _(optional)_ | `VCutters End Height` | Number | item | VCutters end height |\n| VCutters End Width _(optional)_ | `VCutters End Width` | Number | item | VCutters end width |\n| VCutters Length _(optional)_ | `VCutters Length` | Number | item | VCutters length |\n| VCutters Move In Z _(optional)_ | `VCutters Move In Z` | Number | item | VCutters move in Z |\n| Drill Enable _(optional)_ | `Drill Enable` | Boolean | item | Drill enable |\n| Drill Shape _(optional)_ | `Drill Shape` | Text | item | Drill shape |\n| Drill Width _(optional)_ | `Drill Width` | Number | item | Drill width |\n| Drill Height _(optional)_ | `Drill Height` | Number | item | Drill height |","metadata":{"title":"Cathedral","section":"Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","collection":"grasshopper","hash":"6cf120d8ab12eba1af75c656b785185a","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Drill Allow Intersection _(optional)_ | `Drill Allow Intersection` | Boolean | item | Drill allow intersection |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Params` | Generic | item | Dictionary of gems parameters |","metadata":{"title":"Cathedral","section":"Cathedral - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---gems-params","collection":"grasshopper","hash":"7a5d344394d80efc9d73eb5df1406efb","indexed_by":"docs-index"}},{"content":"Cathedral — Cathedral - Shank Params\n\nParameters for Cathedral Shank\n\nNickname: `Cathedral - Shank Params` · Tab: Shanks › Cathedral\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | Ring profile: HALF_ROUND, OVAL, RECTANGLE or ROUNDED_TRAPEZOID |\n| Top Width _(optional)_ | `Top Width` | Number | item | Top width of the shank |\n| Top Height _(optional)_ | `Top Height` | Number | item | Top height of the shank |\n| Bottom Width _(optional)_ | `Bottom Width` | Number | item | Bottom width of the shank |\n| Bottom Height _(optional)_ | `Bottom Height` | Number | item | Bottom height of the shank |\n| Cap Distance _(optional)_ | `Cap Distance` | Number | item | Cap distance |\n| Arm Tangent _(optional)_ | `Arm Tangent` | Number | item | Tangent control |\n| Arm Angle _(optional)_ | `Arm Angle` | Number | item | Arm angle |\n| Arm Width _(optional)_ | `Arm Width` | Number | item | Arm width |\n| Arm Height _(optional)_ | `Arm Height` | Number | item | Arm height |\n| Bridge Enable _(optional)_ | `Bridge Enable` | Boolean | item | Enable/disable bridge |\n| Bridge Width _(optional)_ | `Bridge Width` | Number | item | Bridge width |\n| Bridge Thickness _(optional)_ | `Bridge Thickness` | Number | item | Bridge thickness |\n| Bridge Fillet _(optional)_ | `Bridge Fillet` | Number | item | Bridge fillet |\n| Bridge Disk Diam _(optional)_ | `Bridge Disk Diam` | Number | item | Bridge disk diameter |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from the Shank Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Params | `Shank Params` | Generic | item | Dictionary of shank parameters |","metadata":{"title":"Cathedral","section":"Cathedral - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/cathedral/#cathedral---shank-params","collection":"grasshopper","hash":"67fcce4bccbc5b0e42e5caa4cbc8155f","indexed_by":"docs-index"}},{"content":"Class Ring\n\n4 components in Shanks › Class Ring.","metadata":{"title":"Class Ring","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/","collection":"grasshopper","hash":"585c5c96021130ec3384ae94c91547c4","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring\n\nCreates a class ring (signet-style shank with a stone seat) with optional parameters\n\nNickname: `ClassRing` · Tab: Shanks › Class Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size diameter |\n| Top Side _(optional)_ | `Top Side` | Generic | item | — | Top side parameters |\n| Shank _(optional)_ | `Shank` | Generic | item | — | Shank parameters |\n| Gem _(optional)_ | `Gem` | Generic | item | — | Gem parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Class Ring |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Class Ring","section":"Class Ring","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring","collection":"grasshopper","hash":"c10736f6299bfc3331ee0868b115daee","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Brep | `Brep` | Brep | item | Ring Brep geometry |\n| Curves | `Curves` | Curve | list | Head outline curves |\n| Gem | `Gem` | Generic | item | Faceted stone sitting on the head seat (when Stone Type is GEMSTONE) |\n| Gem Mesh | `Gem Mesh` | Mesh | item | Mesh of the faceted stone |\n| Cabochon | `Cabochon` | Brep | item | Cabochon stone Brep (when Stone Type is CABOCHON) |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Class ring taxonomy with reader-compatible keys |","metadata":{"title":"Class Ring","section":"Class Ring","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring","collection":"grasshopper","hash":"f5b1d743b141fd8d498525d3c72be6db","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring - Gem Params\n\nGem parameters for Class Ring\n\nNickname: `Class Ring - Gem Params` · Tab: Shanks › Class Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | Gem shape: OVAL, ROUND or CUSHION |\n| Stone Type _(optional)_ | `Stone Type` | Text | item | Stone type: GEMSTONE (faceted) or CABOCHON |\n| Cabochon Height _(optional)_ | `Cabochon Height` | Number | item | Dome height of the cabochon stone. Values at or below zero fall back to half the smaller side of the seat. |\n| Move Z _(optional)_ | `Move Z` | Number | item | Vertical stone offset from the seat plane: negative sinks the stone into the head |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Params | `Gem Params` | Generic | item | Dictionary of gem parameters |","metadata":{"title":"Class Ring","section":"Class Ring - Gem Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---gem-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---gem-params","collection":"grasshopper","hash":"3951e3901ebb81d421ad6de85d2e5a15","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring - Shank Params\n\nShank parameters for Class Ring\n\nNickname: `Class Ring - Shank Params` · Tab: Shanks › Class Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Top Surface Height _(optional)_ | `Top Surface Height` | Number | item | Height of the top surface over the finger hole |\n| Angle _(optional)_ | `Angle` | Number | item | Shank angle |\n| Bottom Height _(optional)_ | `Bottom Height` | Number | item | Shank thickness under the finger hole |\n| Bottom Width _(optional)_ | `Bottom Width` | Number | item | Shank width at the bottom |\n| Side Width _(optional)_ | `Side Width` | Number | item | Shank width at the sides of the finger hole |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Params | `Shank Params` | Generic | item | Dictionary of shank parameters |","metadata":{"title":"Class Ring","section":"Class Ring - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---shank-params","collection":"grasshopper","hash":"e47571d080f83e40d0b08583b98d4c90","indexed_by":"docs-index"}},{"content":"Class Ring — Class Ring - Top Side Params\n\nTop side parameters for Class Ring\n\nNickname: `Class Ring - Top Side Params` · Tab: Shanks › Class Ring\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Top Height _(optional)_ | `Top Height` | Number | item | Seat semi-axis along the finger axis |\n| Top Width _(optional)_ | `Top Width` | Number | item | Seat semi-axis across the finger axis |\n| Stand Height _(optional)_ | `Stand Height` | Number | item | Height of the stone stand over the finger hole |\n| Depth _(optional)_ | `Depth` | Number | item | Depth of the head side step |\n| Offset _(optional)_ | `Offset` | Number | item | Head base margin reduction (base outline is seat + 3 - Offset) |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Top Side Params | `Top Side Params` | Generic | item | Dictionary of top side parameters |","metadata":{"title":"Class Ring","section":"Class Ring - Top Side Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---top-side-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/class-ring/#class-ring---top-side-params","collection":"grasshopper","hash":"07d460f70f90712234204a2108548296","indexed_by":"docs-index"}},{"content":"Classic\n\n6 components in Shanks › Classic.","metadata":{"title":"Classic","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/","collection":"grasshopper","hash":"a3fa8d3f67a3ff8391f37dac85d12664","indexed_by":"docs-index"}},{"content":"Classic — Classic\n\nCreates a classic ring with optional parameters\n\nNickname: `Classic` · Tab: Shanks › Classic\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Ring Diameter` | Number | item | — | Finger size parameters |\n| Top Profile _(optional)_ | `Top Profile` | Generic | item | — | Top profile parameters |\n| Mid Profile _(optional)_ | `Mid Profile` | Generic | item | — | Middle profile parameters |\n| Bottom Profile _(optional)_ | `Bottom Profile` | Generic | item | — | Bottom profile parameters |\n| External Profile _(optional)_ | `External Profile` | Generic | item | — | External profile parameters |\n| Advanced _(optional)_ | `Advanced` | Generic | item | — | Advanced parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Classic |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Classic","section":"Classic","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic","collection":"grasshopper","hash":"a13a88a3457571087bd33f654abd522c","indexed_by":"docs-index"}},{"content":"Classic — Classic\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | item | Ring Brep geometry |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Gems Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Magnet Finger Size Top | `Finger size top` | Point | item | Bottom center of the Bridge |\n| Taxonomy | `Taxonomy` | Generic | item | Classic taxonomy with reader-compatible keys |\n| Semantic | `Semantic` | Text | item | Semantic text description of the classic ring |\n| Gemsetting | `Gemsetting` | Text | item | Gem setting type derived from the gems setting mode: NONE -> CHANNEL, SHARED -> PRONG, SCALLOPED -> PAVE |","metadata":{"title":"Classic","section":"Classic","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic","collection":"grasshopper","hash":"642fe78afb411b6619f7411d75d2a0ad","indexed_by":"docs-index"}},{"content":"Classic — Classic - Advanced Parameters\n\nDefine advanced parameters for a Classic ring\n\nNickname: `Classic - Advanced` · Tab: Shanks › Classic\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Opening Type _(optional)_ | `Opening Type` | Text | item | `NONE` | Opening type (e.g. NONE, CUT, STRANGLE) |\n| Cut Length _(optional)_ | `Cut Length` | Number | item | `6.0` | Cut length |\n| Cut Bumping _(optional)_ | `Cut Bumping` | Number | item | `0.0` | Cut bumping |\n| Strangle Opening _(optional)_ | `Strangle Opening` | Number | item | `6.0` | Strangle opening |\n| Strangle Base X _(optional)_ | `Strangle Base X` | Number | item | `2.0` | Strangle base X |\n| Strangle Base Y _(optional)_ | `Strangle Base Y` | Number | item | `2.0` | Strangle base Y |\n| Strangle Base Z _(optional)_ | `Strangle Base Z` | Number | item | `0.7` | Strangle base Z |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic Advanced Params | `Advanced` | Generic | item | Advanced parameters for Classic ring |","metadata":{"title":"Classic","section":"Classic - Advanced Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---advanced-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---advanced-parameters","collection":"grasshopper","hash":"3f0750a3ba795191c88d8f64d63e3993","indexed_by":"docs-index"}},{"content":"Classic — Classic - External Profile\n\nDefine external profile parameters for a Classic ring\n\nNickname: `Classic - External` · Tab: Shanks › Classic\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | Enable external profile |\n| Profile _(optional)_ | `Profile` | Text | item | External profile: SQUARE_DOOM_SIDES, CUTTED_OVAL, OVAL_FLATTENED_TOP or OVAL_FLATTENED_BOTTOM |\n| Top _(optional)_ | `Top` | Number | item | Top value |\n| Mid _(optional)_ | `Mid` | Number | item | Mid value |\n| Bottom _(optional)_ | `Bottom` | Number | item | Bottom value |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic External Profile Params | `External` | Generic | item | External profile parameters for Classic ring |","metadata":{"title":"Classic","section":"Classic - External Profile","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---external-profile","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---external-profile","collection":"grasshopper","hash":"8a1aa3a0db42e833f310d24d6f68b938","indexed_by":"docs-index"}},{"content":"Classic — Classic - Gems Parameters\n\nDefine gem-related parameters for a Classic ring\n\nNickname: `Classic - Gems` · Tab: Shanks › Classic\n\nInputs","metadata":{"title":"Classic","section":"Classic - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","collection":"grasshopper","hash":"167bc5cbd9c39ad25d1956db73db0904","indexed_by":"docs-index"}},{"content":"Classic — Classic - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `Enabled` | Boolean | item | `true` | Enable gems |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | `ROUND` | Gem shape |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | `1.2` | Size of the gem |\n| Angle _(optional)_ | `Angle` | Number | item | `180.0` | Angle in degrees |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | `0.2` | Minimum distance between gems |\n| Vertical _(optional)_ | `Vertical` | Number | item | `-0.2` | Vertical offset |\n| Bright Cut _(optional)_ | `Bright Cut` | Number | item | `0.0` | Bright cut value |\n| Inner Height _(optional)_ | `Inner Height` | Number | item | `0.6` | Inner height |\n| Inner Width _(optional)_ | `Inner Width` | Number | item | `0.8` | Inner width |\n| Margin _(optional)_ | `Margin` | Number | item | `0.5` | Margin |\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | `SCALLOPED` | Setting mode: NONE, SCALLOPED, SHARED |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | `0.6` | Height of prongs |\n| Prong Move Z _(optional)_ | `Prong Move Z` | Number | item | `0.0` | Move prong in Z |\n| Extension Mfg _(optional)_ | `Extension Mfg` | Number | item | `1.0` | Extension for manufacturing |\n| Gem Inside _(optional)_ | `Gem Inside` | Number | item | `0.1` | Gem inside offset |\n| Auto Prong Diameter _(optional)_ | `Auto Prong Diameter` | Boolean | item | `false` | Automatic prong diameter |\n| Prong Diameter _(optional)_ | `Prong Diameter` | Number | item | `0.5` | Prong diameter |\n| Cutters Start Height _(optional)_ | `Cutters Start Height` | Number | item | `2.0` | Cutters start height |","metadata":{"title":"Classic","section":"Classic - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","collection":"grasshopper","hash":"73c5f4f26f0f4400b7b7493519e0ec7c","indexed_by":"docs-index"}},{"content":"Classic — Classic - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Cutters Start Width _(optional)_ | `Cutters Start Width` | Number | item | `0.8` | Cutters start width |\n| Cutters End Height _(optional)_ | `Cutters End Height` | Number | item | `2.0` | Cutters end height |\n| Cutters End Width _(optional)_ | `Cutters End Width` | Number | item | `1.0` | Cutters end width |\n| Cutters Shape _(optional)_ | `Cutters Shape` | Text | item | `U_SHAPE` | Cutters shape: U_SHAPE, V_SHAPE, SQUARE_SHAPE, TRAPEZOIDAL_SHAPE, FRENCH_SETTING_SHAPE |\n| Cutters Length _(optional)_ | `Cutters Length` | Number | item | `5.0` | Cutters length |\n| Cutters Move In Z _(optional)_ | `Cutters Move In Z` | Number | item | `0.0` | Cutters move in Z |\n| Cutters Move Middle In Z _(optional)_ | `Cutters Move Middle In Z` | Number | item | `0.0` | Cutters move middle in Z |\n| Cutters Shape Scale _(optional)_ | `Cutters Shape Scale` | Number | item | `1.0` | Cutters shape scale |\n| VCutters Enable _(optional)_ | `VCutters Enable` | Boolean | item | `true` | Enable vcutters |\n| VCutters Start Height _(optional)_ | `VCutters Start Height` | Number | item | `2.0` | VCutters start height |\n| VCutters Start Width _(optional)_ | `VCutters Start Width` | Number | item | `1.0` | VCutters start width |\n| VCutters End Height _(optional)_ | `VCutters End Height` | Number | item | `2.0` | VCutters end height |\n| VCutters End Width _(optional)_ | `VCutters End Width` | Number | item | `1.0` | VCutters end width |\n| VCutters Length _(optional)_ | `VCutters Length` | Number | item | `5.0` | VCutters length |\n| VCutters Move In Z _(optional)_ | `VCutters Move In Z` | Number | item | `0.7` | VCutters move in Z |","metadata":{"title":"Classic","section":"Classic - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","collection":"grasshopper","hash":"fc89c824de1eed96c00ab70a5f2fe6ea","indexed_by":"docs-index"}},{"content":"Classic — Classic - Gems Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Drill Enable _(optional)_ | `Drill Enable` | Boolean | item | `false` | Enable drill |\n| Drill Shape _(optional)_ | `Drill Shape` | Text | item | `ROUND` | Drill shape: ROUND, SQUARE or HEXAGON |\n| Drill Width _(optional)_ | `Drill Width` | Number | item | `1.0` | Width of drill |\n| Drill Height _(optional)_ | `Drill Height` | Number | item | `1.0` | Height of drill |\n| Drill Allow Intersection _(optional)_ | `Drill Allow Intersection` | Boolean | item | `false` | Allow drill intersection |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from the Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic Gems Params | `Gems` | Generic | item | Gem parameters for Classic ring |","metadata":{"title":"Classic","section":"Classic - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---gems-parameters","collection":"grasshopper","hash":"7afb0172f6200ff4a21e3fc70aee6b2e","indexed_by":"docs-index"}},{"content":"Classic — Classic - Profile\n\nDefine a ClassicProfile for a Classic Ring\n\nNickname: `Classic - Profile` · Tab: Shanks › Classic\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | Ring profile: HALF_ROUND, OVAL, RECTANGLE or ROUNDED_TRAPEZOID |\n| Height _(optional)_ | `Height` | Number | item | Profile height |\n| Width _(optional)_ | `Width` | Number | item | Profile width |\n| Rotation _(optional)_ | `Rotation` | Number | item | Profile rotation in degrees |\n| Displacement _(optional)_ | `Displacement` | Number | item | Profile displacement |\n| Type _(optional)_ | `Type` | Text | item | Profile type SOLID, COMFORT OR THICKNESS |\n| Thickness _(optional)_ | `Thickness` | Number | item | Profile thickness |\n| Comfort _(optional)_ | `Comfort` | Number | item | Comfort value |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Profile Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic Profile Params | `P` | Generic | item | Classic profile parameters |","metadata":{"title":"Classic","section":"Classic - Profile","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---profile","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---profile","collection":"grasshopper","hash":"a2a415768ef499c932d2382fa63a68f9","indexed_by":"docs-index"}},{"content":"Classic — Classic - Profile With Enable\n\nDefine a ClassicProfile for a Classic Ring with an enable toggle\n\nNickname: `Classic - Profile With Enable` · Tab: Shanks › Classic\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Enable the profile |\n| Profile _(optional)_ | `Profile` | Text | item | — | Ring profile: HALF_ROUND, OVAL, RECTANGLE or ROUNDED_TRAPEZOID |\n| Height _(optional)_ | `Height` | Number | item | `1.8` | Profile height |\n| Width _(optional)_ | `Width` | Number | item | `2.5` | Profile width |\n| Rotation _(optional)_ | `Rotation` | Number | item | `0.0` | Profile rotation in degrees |\n| Displacement _(optional)_ | `Displacement` | Number | item | `0.0` | Profile displacement |\n| Type _(optional)_ | `Type` | Text | item | `SOLID` | Profile type SOLID, COMFORT OR THICKNESS |\n| Thickness _(optional)_ | `Thickness` | Number | item | `0.7` | Profile thickness |\n| Comfort _(optional)_ | `Comfort` | Number | item | `0.3` | Comfort value |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a Profile Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Classic Profile Params | `P` | Generic | item | Classic profile parameters |","metadata":{"title":"Classic","section":"Classic - Profile With Enable","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---profile-with-enable","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/classic/#classic---profile-with-enable","collection":"grasshopper","hash":"6dc4522ad3f3bd3053371269d2a5596c","indexed_by":"docs-index"}},{"content":"Engraving\n\n2 components in Shanks › Engraving.","metadata":{"title":"Engraving","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/","collection":"grasshopper","hash":"1e6bb4e93232455de607ec7788e268d3","indexed_by":"docs-index"}},{"content":"Engraving — Engraving\n\nCreates an engraved text ring flowing text along an implicit ring curve built from a finger diameter\n\nNickname: `Engraving` · Tab: Shanks › Engraving\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger diameter used to build the implicit ring curve |\n| Rotation Angle _(optional)_ | `Angle` | Number | item | — | Rotation of the ring seam (and text) around the Y axis, in degrees |\n| Text _(optional)_ | `Text` | Generic | item | — | Text parameters |\n| Orientation Plane _(optional)_ | `Plane` | Plane | item | — | Orientation plane applied to the flat text before flowing along the ring. Defaults to World XY. |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of EngraveRingParams |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Engraving","section":"Engraving","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving","collection":"grasshopper","hash":"3aa9c3f64b5a181cb52875ea07fa333b","indexed_by":"docs-index"}},{"content":"Engraving — Engraving\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Breps | `Breps` | Brep | list | Engraved text Breps (only when Thickness > 0) |\n| Curves | `Curves` | Curve | list | Engraved text curves flowed along the ring |\n| Ring Curve | `Ring Curve` | Curve | item | Implicit ring curve used as mother for the engraving |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Engraving taxonomy dictionary (reader-compatible keys) |","metadata":{"title":"Engraving","section":"Engraving","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving","collection":"grasshopper","hash":"09c6501ce74848fb9edce478eec4bdd6","indexed_by":"docs-index"}},{"content":"Engraving — Engraving - Text Parameters\n\nDefine the text parameters for an engraved ring\n\nNickname: `Engraving Text` · Tab: Shanks › Engraving\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Text | `Text` | Text | item | `RhinoArtisan` | Text to engrave |\n| Font | `Font` | Text | item | `Bienchen` | Font name (e.g. Bienchen, Discipuli Britannica, Helvetia Verbundene, Sacramento or any installed font) |\n| Font Style | `Font Style` | Text | item | `Regular` | Font style: Regular, Bold or Italic |\n| Height | `Height` | Number | item | `1.5` | Text height |\n| Spacing | `Spacing` | Number | item | `0.5` | Spacing between letters |\n| Thickness | `Thickness` | Number | item | `0.0` | Extrusion thickness. 0 outputs curves only. |\n| Move Z | `Move Z` | Number | item | `0.0` | Offset of the text along Z before flowing |\n| Horizontal Align | `Horizontal Align` | Text | item | `CENTER` | Horizontal alignment: LEFT, CENTER, RIGHT or JUSTIFY |\n| Vertical Align | `Vertical Align` | Text | item | `CENTER` | Vertical alignment: TOP, CENTER or BOTTOM |\n| Flip Horizontal | `Flip Horizontal` | Boolean | item | `false` | Mirror the text horizontally |\n| Flip Vertical | `Flip Vertical` | Boolean | item | `false` | Mirror the text vertically |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Text Params | `Text` | Generic | item | Dictionary of text parameters |","metadata":{"title":"Engraving","section":"Engraving - Text Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving---text-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/engraving/#engraving---text-parameters","collection":"grasshopper","hash":"af9e0e522d7f15e86ba60840e42a9764","indexed_by":"docs-index"}},{"content":"Eternity\n\n6 components in Shanks › Eternity.","metadata":{"title":"Eternity","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/","collection":"grasshopper","hash":"ff8fa4134fb6048b1f75da62fca254be","indexed_by":"docs-index"}},{"content":"Eternity — Eternity\n\nCreates an eternity ring with configurable gems, prongs, bezels and shank parameters\n\nNickname: `Eternity` · Tab: Shanks › Eternity\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size diameter (mm) |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Eternity gems parameters (dict) |\n| Prongs _(optional)_ | `Prongs` | Generic | item | — | Eternity prongs parameters (dict) |\n| Bezels _(optional)_ | `Bezels` | Generic | item | — | Eternity bezels parameters (dict). Supports nested TopRail/BottomRail dicts |\n| Shank Upper _(optional)_ | `ShankUp` | Generic | item | — | Upper shank parameters (dict) |\n| Shank Lower _(optional)_ | `ShankLow` | Generic | item | — | Lower shank parameters (dict) |\n| Cutters _(optional)_ | `Cutters` | Generic | item | — | Cutter parameters (dict) |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of an Eternity |\n| Metal _(optional)_ | `Metal` | Text | item | `GOLD_YELLOW_18` | Metal material (e.g. GOLD_YELLOW_18, SILVER, PLATINUM) |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Eternity","section":"Eternity","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity","collection":"grasshopper","hash":"b9f4afd90483f96ee765e2d934d7a489","indexed_by":"docs-index"}},{"content":"Eternity — Eternity\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Ring Brep geometry |\n| Gems | `Gems` | GemObject | list | Gem objects |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Magnet Finger Size Top | `Finger size top` | Point | item | Bottom center of the Bridge |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |\n| Semantic | `Semantic` | Text | item | Semantic text description of the eternity ring |\n| Taxonomy | `Taxonomy` | Generic | item | Eternity taxonomy with reader-compatible keys |","metadata":{"title":"Eternity","section":"Eternity","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity","collection":"grasshopper","hash":"38ff4bb74d9a6f68770060dd812656aa","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Bezels Parameters\n\nDefines bezel rail and profile parameters for Eternity rings\n\nNickname: `EternityBezels` · Tab: Shanks › Eternity\n\nInputs","metadata":{"title":"Eternity","section":"Eternity - Bezels Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","collection":"grasshopper","hash":"16f5fffe126c7a4083f9725b91163a12","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Bezels Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Rail Mode _(optional)_ | `Rail Mode` | Text | item | `DOUBLE` | Bezel rail mode (SINGLE / DOUBLE) |\n| Shape _(optional)_ | `Shape` | Text | item | `ROUND` | Bezel rail shape (ROUND / RECTANGLE / OVAL) |\n| Profile Shape _(optional)_ | `Profile Shape` | Text | item | `ROUND` | Profile shape (ROUND / SQUARE) |\n| Remove Finger _(optional)_ | `Remove Finger` | Boolean | item | `false` | Remove inside finger geometry |\n| Top Diameter _(optional)_ | `Top Diameter` | Number | item | `1.3` | Top rail diameter |\n| Top Width _(optional)_ | `Top Width` | Number | item | `1.3` | Top rail width |\n| Top Height _(optional)_ | `Top Height` | Number | item | `1.3` | Top rail height |\n| Top Move Z _(optional)_ | `Top Move Z` | Number | item | `0.6` | Top rail vertical shift |\n| Top Thread Dia. _(optional)_ | `Top Thread Dia.` | Number | item | `0.4` | Thread diameter |\n| Top Thread X _(optional)_ | `Top Thread X` | Number | item | `0.4` | Thread X offset |\n| Top Thread Y _(optional)_ | `Top Thread Y` | Number | item | `0.4` | Thread Y offset |\n| Bottom Diameter _(optional)_ | `Bottom Diameter` | Number | item | `1.3` | Bottom rail diameter |\n| Bottom Width _(optional)_ | `Bottom Width` | Number | item | `1.3` | Bottom rail width |\n| Bottom Height _(optional)_ | `Bottom Height` | Number | item | `1.3` | Bottom rail height |\n| Bottom Move Z _(optional)_ | `Bottom Move Z` | Number | item | `1.6` | Bottom rail vertical shift |\n| Bottom Thread Dia. _(optional)_ | `Bottom Thread Dia.` | Number | item | `0.4` | Thread diameter |\n| Bottom Thread X _(optional)_ | `Bottom Thread X` | Number | item | `0.4` | Thread X offset |","metadata":{"title":"Eternity","section":"Eternity - Bezels Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","collection":"grasshopper","hash":"5eb61c0a4350d6dd54e70b24775ea1ca","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Bezels Parameters\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Bottom Thread Y _(optional)_ | `Bottom Thread Y` | Number | item | `0.4` | Thread Y offset |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity Bezels Params | `Eternity Bezels Params` | Generic | item | Bezel parameters dictionary |","metadata":{"title":"Eternity","section":"Eternity - Bezels Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---bezels-parameters","collection":"grasshopper","hash":"4d751c7622df36997be733e1967844ed","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Gems Parameters\n\nDefine gem-related parameters for an Eternity ring\n\nNickname: `Eternity - Gems Parameters` · Tab: Shanks › Eternity\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Carat _(optional)_ | `Carat` | Number | item | `0.03` | Gem carat weight |\n| Shape _(optional)_ | `Shape` | Text | item | `ROUND` | Gem shape (ROUND / PRINCESS / OVAL ...) |\n| Compound _(optional)_ | `Compound` | Text | item | `DIAMOND` | Gem compound (Diamond / Sapphire ...) |\n| Distribution _(optional)_ | `Distribution` | Text | item | `FULL` | Gem distribution FULL, HALF, THREEQUARTERS, FIVESTONES, SEVENSTONES, NINESTONES |\n| Move In Z _(optional)_ | `Move In Z` | Number | item | `2.0` | Vertical adjustment |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | `0.1` | Minimum spacing between gems |\n| Orientation _(optional)_ | `Orientation` | Text | item | `NATURAL` | Gem orientation (NATURAL / ROTATED) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity Gems Params | `Eternity Gems Params` | Generic | item | Gem parameters for Eternity ring |","metadata":{"title":"Eternity","section":"Eternity - Gems Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---gems-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---gems-parameters","collection":"grasshopper","hash":"27c71f4fbe74a15ed3b7039606ebe927","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Prongs Parameters\n\nDefines prong parameters for Eternity rings\n\nNickname: `Eternity - Prongs Parameters` · Tab: Shanks › Eternity\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Prongs Distribution _(optional)_ | `Prongs Distribution` | Text | item | `SHARED` | SHARED / INDIVIDUAL_FOR_EACH_GEM |\n| Top Distance _(optional)_ | `Top Distance` | Number | item | `1.3` | Distance between top prongs |\n| Bottom Distance _(optional)_ | `Bottom Distance` | Number | item | `1.3` | Distance between bottom prongs |\n| Height Over Girdle _(optional)_ | `Height Over Girdle` | Number | item | `0.1` | Prong vertical offset over gem girdle |\n| Top Diameter _(optional)_ | `Top Diameter` | Number | item | `0.8` | Top prong diameter |\n| Bottom Diameter _(optional)_ | `Bottom Diameter` | Number | item | `0.8` | Bottom prong diameter |\n| Individual Top Dist. _(optional)_ | `Individual Top Dist.` | Number | item | `0.8` | Individual prongs spacing (top) |\n| Individual Bottom Dist. _(optional)_ | `Individual Bottom Dist.` | Number | item | `0.5` | Individual prongs spacing (bottom) |\n| Expansion Mfg. _(optional)_ | `Expansion Mfg.` | Number | item | `1.0` | Extra offset for manufacturing allowance |\n| Prong Mode _(optional)_ | `Prong Mode` | Text | item | `STRAIGHT` | STRAIGHT / CURVED |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Eternity Prongs Params | `Eternity Prongs Params` | Generic | item | Prong parameters dictionary |","metadata":{"title":"Eternity","section":"Eternity - Prongs Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---prongs-parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---prongs-parameters","collection":"grasshopper","hash":"cdef652f67d564b75d8ddefebcdad6aa","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Shank Lower\n\nDefines parameters for the *lower* part of the Eternity shank\n\nNickname: `Eternity - Shank Lower` · Tab: Shanks › Eternity\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Asset _(optional)_ | `Asset` | Generic | item | — | Profile asset |\n| Type _(optional)_ | `Type` | Text | item | `SOLID` | Shank type (SOLID / SPLIT / etc.) |\n| Width _(optional)_ | `Width` | Number | item | `2.25` | Shank width |\n| Height _(optional)_ | `Height` | Number | item | `1.50` | Shank height |\n| Type _(optional)_ | `Type` | Integer | item | `0` | Profile type index |\n| Thickness _(optional)_ | `Thickness` | Number | item | `0.60` | Profile thickness |\n| Comfort _(optional)_ | `Comfort` | Number | item | `0.20` | Comfort rounding |\n| Orientation _(optional)_ | `Orientation` | Integer | item | `0` | Profile orientation index |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Lower Shank Params | `Lower Shank Params` | Generic | item | Dictionary for Eternity.LowerParams |","metadata":{"title":"Eternity","section":"Eternity - Shank Lower","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---shank-lower","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---shank-lower","collection":"grasshopper","hash":"d541b6b2460f6e61e828b894510abea6","indexed_by":"docs-index"}},{"content":"Eternity — Eternity - Shank Upper\n\nDefines parameters for the *upper* part of the Eternity shank\n\nNickname: `Eternity - Shank Upper` · Tab: Shanks › Eternity\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Asset _(optional)_ | `Asset` | Generic | item | — | Profile asset |\n| Type _(optional)_ | `Type` | Text | item | `SOLID` | Shank type (SOLID / SPLIT / etc.) |\n| Width _(optional)_ | `Width` | Number | item | `2.25` | Shank width |\n| Height _(optional)_ | `Height` | Number | item | `1.50` | Shank height |\n| Type _(optional)_ | `Type` | Integer | item | `0` | Profile type index |\n| Thickness _(optional)_ | `Thickness` | Number | item | `0.60` | Profile thickness |\n| Comfort _(optional)_ | `Comfort` | Number | item | `0.20` | Comfort rounding |\n| Orientation _(optional)_ | `Orientation` | Integer | item | `0` | Profile orientation index |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Upper Shank Params | `Upper Shank Params` | Generic | item | Dictionary for Eternity.UpperParams |","metadata":{"title":"Eternity","section":"Eternity - Shank Upper","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---shank-upper","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/eternity/#eternity---shank-upper","collection":"grasshopper","hash":"e0994b1ddb7c61784ad24b33f1802878","indexed_by":"docs-index"}},{"content":"Matching Shank\n\n4 components in Shanks › Matching Shank.","metadata":{"title":"Matching Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/","collection":"grasshopper","hash":"c24cdb8e8d26dd489f89b4be76a2bd70","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank\n\nCreates a matching band fitted against an existing ring or gemset\n\nNickname: `MatchingShank` · Tab: Shanks › Matching Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Mother _(optional)_ | `Mother` | Geometry | list | — | Ring/gemset geometry to match (Breps, Extrusions or Meshes) |\n| Ring Curve _(optional)_ | `Ring Curve` | Curve | item | — | Closed rail curve of the finger hole. When absent, a circle from Ring Diameter at the origin (ring in the ZX plane, finger axis = Y) is used. |\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size parameters |\n| Shank _(optional)_ | `Shank` | Generic | item | — | Shank parameters |\n| Fit _(optional)_ | `Fit` | Generic | item | — | Fit parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a Matching Shank |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Matching Shank","section":"Matching Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank","collection":"grasshopper","hash":"fbe92264210515a64318369f7c428168","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Band Brep geometry (band + prongs; both bands when Both Sides) |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Cutters | `Cutters` | Generic | list | Cutters geometry generated by the matching shank |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Matching Shank taxonomy with reader-compatible keys |","metadata":{"title":"Matching Shank","section":"Matching Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank","collection":"grasshopper","hash":"436b93a280ca4f2feddd5e025e831e3f","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Fit Params\n\nFit parameters for Matching Shank: how the band seats against the mother ring\n\nNickname: `Matching Shank - Fit Params` · Tab: Shanks › Matching Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Clearance _(optional)_ | `Clearance` | Number | item | Radial offset used to probe outside the rail and seat the band against the ring |\n| Distance _(optional)_ | `Distance` | Number | item | Axial gap between the band and the original ring (negative = press into it) |\n| Top Distance _(optional)_ | `Top Distance` | Number | item | Extra axial gap at the ring top (mm), fading to zero at 90 degrees |\n| Precision _(optional)_ | `Precision` | Integer | item | Number of profile sections around the ring (always even; minimum 2) |\n| Flip Side _(optional)_ | `Flip Side` | Boolean | item | Places the band on the other side of the original ring |\n| Both Sides _(optional)_ | `Both Sides` | Boolean | item | Build the band on both sides of the mother ring (mirrored pair) |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Fit Params | `Fit Params` | Generic | item | Dictionary of fit parameters |","metadata":{"title":"Matching Shank","section":"Matching Shank - Fit Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---fit-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---fit-params","collection":"grasshopper","hash":"09a167e5b90f341f9c6b9ef8a8f05bce","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Gems Params\n\nGems parameters for Matching Shank\n\nNickname: `Matching Shank Gems Params` · Tab: Shanks › Matching Shank\n\nInputs","metadata":{"title":"Matching Shank","section":"Matching Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","collection":"grasshopper","hash":"b52f71ebf0b06aba716732b61222ff60","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | Enable gems |\n| Distribution _(optional)_ | `Distribution` | Text | item | Gem run layout: FULL (whole ring), SIDE (between Start/End Angle on each side) or TOP (arc centered on the top) |\n| Start Angle _(optional)_ | `Start Angle` | Number | item | SIDE only: run start, degrees from the top (0 = top) |\n| End Angle _(optional)_ | `End Angle` | Number | item | SIDE only: run end, degrees from the top (180 = bottom) |\n| Top Angle _(optional)_ | `Top Angle` | Number | item | TOP only: total covered arc in degrees, centered on the top |\n| Row Offset _(optional)_ | `Row Offset` | Number | item | Lateral shift of the gem row across the band (mm, + = toward the matched ring) |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | Gem shape |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | Gem size |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | Minimum distance between gems |\n| Gem Vertical _(optional)_ | `Gem Vertical` | Number | item | Gem vertical |\n| Margin _(optional)_ | `Margin` | Number | item | Margin |\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | Setting mode NONE, SCALLOPED, SHARED |\n| Inner Width _(optional)_ | `Inner Width` | Number | item | Channel width at the ring top |\n| Inner Depth _(optional)_ | `Inner Depth` | Number | item | Channel depth at the ring top |\n| Bottom Inner Width _(optional)_ | `Bottom Inner Width` | Number | item | Channel width at the ring bottom; 0 = same as top |\n| Bottom Inner Depth _(optional)_ | `Bottom Inner Depth` | Number | item | Channel depth at the ring bottom; 0 = same as top |\n| Bright Cut _(optional)_ | `Bright Cut` | Number | item | Bright cut |","metadata":{"title":"Matching Shank","section":"Matching Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","collection":"grasshopper","hash":"3a99f3e62e8ae27492fb864ec2376280","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gem Gradient _(optional)_ | `Gem Gradient` | Boolean | item | Enable gem size gradient along the run |\n| Gradient Points _(optional)_ | `Gradient Points` | Integer | item | Gradient stops: 2 (Start/End) or 3 (Start/Middle/End) |\n| Size Start _(optional)_ | `Size Start` | Number | item | Gem size at the run start |\n| Size Middle _(optional)_ | `Size Middle` | Number | item | Gem size at the run middle (3-point gradient) |\n| Size End _(optional)_ | `Size End` | Number | item | Gem size at the run end |\n| Middle Position _(optional)_ | `Middle Position` | Number | item | Normalized position of the middle gradient stop (0-1) |\n| Prong Gem Inside _(optional)_ | `Prong Gem Inside` | Number | item | Prong gem inside |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | Prong height |\n| Prong Diameter _(optional)_ | `Prong Diameter` | Number | item | Prong diameter |\n| Prong Automatic Diameter _(optional)_ | `Prong Automatic Diameter` | Boolean | item | Prong automatic diameter |\n| Prong Top Diameter _(optional)_ | `Prong Top Diameter` | Number | item | Manual prong diameter at the ring top (mm); 0 = automatic |\n| Prong Bottom Diameter _(optional)_ | `Prong Bottom Diameter` | Number | item | Manual prong diameter at the ring bottom (mm); 0 = same as top |\n| Prong Grow _(optional)_ | `Prong Grow` | Number | item | Prong grow |\n| Prong Min Diameter _(optional)_ | `Prong Min Diameter` | Number | item | Minimum prong diameter |\n| End Prong Count _(optional)_ | `End Prong Count` | Integer | item | Prong count at the run ends |\n| Prong Spacing _(optional)_ | `Prong Spacing` | Number | item | Prong spacing |\n| Prong Distance _(optional)_ | `Prong Distance` | Number | item | Prong distance |","metadata":{"title":"Matching Shank","section":"Matching Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","collection":"grasshopper","hash":"df46c1394aafa4addc79552fa0a19782","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prong Extension For Mfg _(optional)_ | `Prong Extension For Mfg` | Number | item | Prong extension for manufacturing |\n| Cutters Start Height _(optional)_ | `Cutters Start Height` | Number | item | Cutters start height |\n| Cutters Start Width _(optional)_ | `Cutters Start Width` | Number | item | Cutters start width |\n| Cutters End Height _(optional)_ | `Cutters End Height` | Number | item | Cutters end height |\n| Cutters End Width _(optional)_ | `Cutters End Width` | Number | item | Cutters end width |\n| Cutters Shape _(optional)_ | `Cutters Shape` | Text | item | Cutters shape |\n| Cutters Length _(optional)_ | `Cutters Length` | Number | item | Cutters length |\n| Cutters Move In Z _(optional)_ | `Cutters Move In Z` | Number | item | Cutters move in Z |\n| Cutters Move Middle In Z _(optional)_ | `Cutters Move Middle In Z` | Number | item | Cutters move middle in Z |\n| Cutters Shape Scale _(optional)_ | `Cutters Shape Scale` | Number | item | Cutters shape scale |\n| VCutters Enable _(optional)_ | `VCutters Enable` | Boolean | item | VCutters enable |\n| VCutters Start Height _(optional)_ | `VCutters Start Height` | Number | item | VCutters start height |\n| VCutters Start Width _(optional)_ | `VCutters Start Width` | Number | item | VCutters start width |\n| VCutters End Height _(optional)_ | `VCutters End Height` | Number | item | VCutters end height |\n| VCutters End Width _(optional)_ | `VCutters End Width` | Number | item | VCutters end width |\n| VCutters Length _(optional)_ | `VCutters Length` | Number | item | VCutters length |\n| VCutters Move In Z _(optional)_ | `VCutters Move In Z` | Number | item | VCutters move in Z |","metadata":{"title":"Matching Shank","section":"Matching Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","collection":"grasshopper","hash":"6def4420cd434c65bdcfa86c165c5b57","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Gems Params\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Drill Enable _(optional)_ | `Drill Enable` | Boolean | item | Drill enable |\n| Drill Shape _(optional)_ | `Drill Shape` | Text | item | Drill shape |\n| Drill Width _(optional)_ | `Drill Width` | Number | item | Drill width |\n| Drill Height _(optional)_ | `Drill Height` | Number | item | Drill height |\n| Drill Allow Intersection _(optional)_ | `Drill Allow Intersection` | Boolean | item | Drill allow intersection |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Params` | Generic | item | Dictionary of gems parameters |","metadata":{"title":"Matching Shank","section":"Matching Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---gems-params","collection":"grasshopper","hash":"72b82d409790b9042b2f45b245bf7c12","indexed_by":"docs-index"}},{"content":"Matching Shank — Matching Shank - Shank Params\n\nShank parameters for Matching Shank\n\nNickname: `Matching Shank - Shank Params` · Tab: Shanks › Matching Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | Ring profile: HALF_ROUND, OVAL, RECTANGLE or ROUNDED_TRAPEZOID |\n| Profile Width _(optional)_ | `Profile Width` | Number | item | Top profile width of the band |\n| Profile Height _(optional)_ | `Profile Height` | Number | item | Top profile height of the band |\n| Bottom Width _(optional)_ | `Bottom Width` | Number | item | Bottom profile width; 0 = same as top |\n| Bottom Height _(optional)_ | `Bottom Height` | Number | item | Bottom profile height; 0 = same as top |\n| Interior Type _(optional)_ | `Interior Type` | Text | item | Inner face closure: SOLID or COMFORT |\n| Comfort _(optional)_ | `Comfort` | Number | item | Comfort-fit dome depth (mm); used when Interior Type = COMFORT |\n| Connector _(optional)_ | `Connector` | Generic | item | Dictionary from a Reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Shank Params | `Shank Params` | Generic | item | Dictionary of shank parameters |","metadata":{"title":"Matching Shank","section":"Matching Shank - Shank Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---shank-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/matching-shank/#matching-shank---shank-params","collection":"grasshopper","hash":"e7b2f47f8f4f94437ebfc78e89f6edaa","indexed_by":"docs-index"}},{"content":"Pave Shank\n\n4 components in Shanks › Pave Shank.\n\nPave Shank\nCreates a pave shank: a band with longitudinal rows of stones, optional cutters and prongs\n\nNickname: `PaveShank` · Tab: Shanks › Pave Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size diameter (mm) |\n| Band _(optional)_ | `Band` | Generic | item | — | Band parameters (dict): top profile and opening |\n| Rows _(optional)_ | `Rows` | Generic | list | — | Gem rows: list of row dicts, one per longitudinal row (from Pave Shank - Row Params) |\n| Cutters _(optional)_ | `Cutters` | Generic | item | — | Cutter parameters (dict) |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a PaveShank |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Pave Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/","collection":"grasshopper","hash":"7296da6fe1d06272410d4e2c4d2665b0","indexed_by":"docs-index"}},{"content":"Pave Shank\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Band Brep geometry (cutters subtracted when enabled) plus solid prongs |\n| Gems | `Gems` | GemObject | list | Gem objects |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | PaveShank taxonomy with reader-compatible keys |","metadata":{"title":"Pave Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/","collection":"grasshopper","hash":"c2e843759095aacb73de1b52dc1c6daf","indexed_by":"docs-index"}},{"content":"Pave Shank — Pave Shank - Band Params\n\nBand parameters for Pave Shank: top profile and opening\n\nNickname: `PaveShank - Band Params` · Tab: Shanks › Pave Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Profile _(optional)_ | `Profile` | Text | item | — | Ring profile: HALF_ROUND, OVAL, RECTANGLE or ROUNDED_TRAPEZOID |\n| Width _(optional)_ | `Width` | Number | item | `3.0` | Band profile width |\n| Height _(optional)_ | `Height` | Number | item | `2.0` | Band profile height |\n| Type _(optional)_ | `Type` | Text | item | `COMFORT` | Profile type: SOLID, COMFORT or THICKNESS |\n| Thickness _(optional)_ | `Thickness` | Number | item | `0.7` | Profile thickness |\n| Comfort _(optional)_ | `Comfort` | Number | item | `0.3` | Comfort value |\n| Opening Type _(optional)_ | `Opening Type` | Text | item | `NONE` | Opening type: NONE, CUT or STRANGLE |\n| Cut Length _(optional)_ | `Cut Length` | Number | item | `6.0` | Cut length |\n| Cut Bumping _(optional)_ | `Cut Bumping` | Number | item | `0.2` | Cut bumping |\n| Strangle Opening _(optional)_ | `Strangle Opening` | Number | item | `6.0` | Strangle opening |\n| Strangle Base X _(optional)_ | `Strangle Base X` | Number | item | `2.0` | Strangle base X |\n| Strangle Base Y _(optional)_ | `Strangle Base Y` | Number | item | `2.0` | Strangle base Y |\n| Strangle Base Z _(optional)_ | `Strangle Base Z` | Number | item | `0.7` | Strangle base Z |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Band Params | `Band Params` | Generic | item | Dictionary of band parameters |","metadata":{"title":"Pave Shank","section":"Pave Shank - Band Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---band-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---band-params","collection":"grasshopper","hash":"cbaee812c3cc31765fcda13651fc0b7f","indexed_by":"docs-index"}},{"content":"Pave Shank — Pave Shank - Cutters Params\n\nCutter parameters for Pave Shank (one cutter solid per gem, subtracted from the band)\n\nNickname: `PaveShank - Cutters Params` · Tab: Shanks › Pave Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `Enabled` | Boolean | item | `false` | Enable/disable the cutters boolean |\n| Height Top _(optional)_ | `Height Top` | Number | item | `100.0` | Cutter height top (%) |\n| Size Top _(optional)_ | `Size Top` | Number | item | `40.0` | Cutter size top (%) |\n| Height Crown _(optional)_ | `Height Crown` | Number | item | `34.0` | Cutter height crown (%) |\n| Gem Inside _(optional)_ | `Gem Inside` | Number | item | `0.0` | Gem inside |\n| Height Girdle _(optional)_ | `Height Girdle` | Number | item | `3.0` | Cutter height girdle (%) |\n| Size Drill _(optional)_ | `Size Drill` | Number | item | `40.0` | Cutter drill size (%) |\n| Height Pavilion _(optional)_ | `Height Pavilion` | Number | item | `71.0` | Cutter height pavilion (%) |\n| Size Bottom _(optional)_ | `Size Bottom` | Number | item | `40.0` | Cutter size bottom (%) |\n| Height Drill _(optional)_ | `Height Drill` | Number | item | `200.0` | Cutter drill height (%) |\n| Drill Type _(optional)_ | `Drill Type` | Integer | item | `0` | Drill shape index: 0 = Round, 1 = Square, 2 = Hexagon |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Params | `Cutters Params` | Generic | item | Dictionary of cutter parameters |","metadata":{"title":"Pave Shank","section":"Pave Shank - Cutters Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---cutters-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---cutters-params","collection":"grasshopper","hash":"b783c0c80c07d0fb961adb45b0b8d148","indexed_by":"docs-index"}},{"content":"Pave Shank — Pave Shank - Row Params\n\nOne longitudinal gem row for Pave Shank. Wire several into the Rows list input, one per row\n\nNickname: `PaveShank - Row Params` · Tab: Shanks › Pave Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Gem Size _(optional)_ | `Gem Size` | Number | item | `1.2` | Stone diameter (mm) |\n| Offset _(optional)_ | `Offset` | Number | item | `0.0` | Lateral position of the row (mm along the top profile from its centre; 0 = middle of the band) |\n| Spacing _(optional)_ | `Spacing` | Number | item | `0.15` | Gap (mm) between consecutive stones along the row |\n| Start Angle _(optional)_ | `Start Angle` | Number | item | `0.0` | Row start angle in degrees around the ring |\n| End Angle _(optional)_ | `End Angle` | Number | item | `360.0` | Row end angle in degrees around the ring |\n| Mirror _(optional)_ | `Mirror` | Boolean | item | `false` | Also place the same stones at -Offset (same row) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Row | `Row` | Generic | item | Dictionary describing one gem row |","metadata":{"title":"Pave Shank","section":"Pave Shank - Row Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---row-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/pave-shank/#pave-shank---row-params","collection":"grasshopper","hash":"f1d28420ec8c8147a71658f6799d3abe","indexed_by":"docs-index"}},{"content":"Ring Curve\n\n2 components in Shanks › Ring Curve.\n\nRing Curve\nCreate a base curve for shanks using FingerSize, Parameters, and Profile\n\nNickname: `RingCurve` · Tab: Shanks › Ring Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | Finger size diameter |\n| Parameters _(optional)_ | `Params` | Generic | item | RingCurve parameters |\n| JSON _(optional)_ | `JSON` | Text | item | JSON definition of RingCurve |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Ring Curve | `Curve` | Curve | item | Resulting shank curve |\n| RingCurve | `RingCurve` | RingCurve | item | RingCurve object |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |","metadata":{"title":"Ring Curve","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-curve/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-curve/","collection":"grasshopper","hash":"06246c3455a08f3f9f9e2ffba2193bc9","indexed_by":"docs-index"}},{"content":"Ring Curve — Ring Curve - Parameters\n\nParameters for RingCurve (Type, Bypass, Shape, etc.)\n\nNickname: `Ring Curve Params` · Tab: Shanks › Ring Curve\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Type | `Type` | Text | item | `CLOSE` | Curve type (CLOSE, OPEN, BYPASS, SHAPE) |\n| Opening Length | `OpenLen` | Number | item | `5.0` | Opening length |\n| Bypass Opening Length | `BypLen` | Number | item | `14.0` | Bypass opening length |\n| Bypass Angle | `BypAng` | Number | item | `0.0` | Bypass angle |\n| Bypass Offset X | `BypX` | Number | item | `2.0` | Bypass offset in X |\n| Bypass Offset Y | `BypY` | Number | item | `2.0` | Bypass offset in Y |\n| Bypass Tangent | `BypTan` | Number | item | `1.0` | Bypass tangent |\n| Shape Opening Length | `ShpLen` | Number | item | `14.0` | Shape opening length |\n| Shape Type | `ShpType` | Text | item | `ROUND` | Shape type (ROUND, SQUARE, etc.) |\n| Shape Width | `ShpW` | Number | item | `6.0` | Shape width |\n| Shape Height | `ShpH` | Number | item | `4.0` | Shape height |\n| Shape Diameter | `ShpD` | Number | item | `5.0` | Shape diameter |\n| Shape Offset | `ShpOff` | Number | item | `1.0` | Shape offset |\n| Shape Move Z | `ShpZ` | Number | item | `2.0` | Shape move in Z |\n| Shape Start Circle | `ShpStart` | Number | item | `0.3` | Shape start position on circle |\n| Shape End Circle | `ShpEnd` | Number | item | `Math.PI - 0.3` | Shape end position on circle |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| RingCurve Params | `Params` | Generic | item | Dictionary of RingCurve parameters |","metadata":{"title":"Ring Curve","section":"Ring Curve - Parameters","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-curve/#ring-curve---parameters","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-curve/#ring-curve---parameters","collection":"grasshopper","hash":"16a23d0e27cb4e30fb7612c47ca23ef9","indexed_by":"docs-index"}},{"content":"Ring Cut\n\n1 component in Shanks › Ring Cut.\n\nRing Cylinder\nCreates a cylinder from a ring diameter and extrusion height\n\nNickname: `RingCyl` · Tab: Shanks › Ring Cut\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | `17.0` | Ring inner diameter in mm |\n| Extrusion _(optional)_ | `Extrusion` | Number | item | `20.0` | Total extrusion height in mm (split equally above and below) |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cylinder | `Cyl` | Brep | item | Ring cylinder Brep |\n| Base Circle | `Circle` | Curve | item | Base circle at ring plane |","metadata":{"title":"Ring Cut","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-cut/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-cut/","collection":"grasshopper","hash":"d21d43ce526a7b54490b001ea0d38e12","indexed_by":"docs-index"}},{"content":"Ring Sizes\n\n19 components in Shanks › Ring Sizes.\n\nRing Sizes - British\nPredefined list of ring size systems.\n\nNickname: `British` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 77 values\n\n| Label | Value |\n|---|---|\n| A | `11.95` |\n| A 1/2 | `12.18` |\n| B | `12.37` |\n| B 1/2 | `12.60` |\n| C | `12.78` |\n| C 1/2 | `13.00` |\n| D | `13.21` |\n| D 1/2 | `13.41` |\n| E | `13.61` |\n| E 1/2 | `13.83` |\n| F | `14.05` |\n| F 1/2 | `14.15` |\n| F 3/4 | `14.25` |\n| G | `14.36` |\n| G 1/4 | `14.45` |\n| G 1/2 | `14.56` |\n| H | `14.65` |\n| H 1/2 | `14.86` |\n| I | `15.04` |\n| I 1/2 | `15.27` |\n| J | `15.40` |\n| J 1/4 | `15.53` |\n| J 1/2 | `15.70` |\n| K | `15.80` |\n| K 1/4 | `15.90` |\n| K 1/2 | `16.00` |\n| L | `16.10` |\n| L 1/4 | `16.30` |\n| L 1/2 | `16.41` |\n| M | `16.51` |\n| M 1/2 | `16.71` |\n| N | `16.92` |\n| N 1/2 | `17.13` |\n| O | `17.35` |\n| O 1/2 | `17.45` |\n| P | `17.75` |\n| P 1/2 | `17.97` |\n| Q | `18.19` |\n| Q 1/2 | `18.35` |\n| Q 3/4 | `18.53` |\n| R | `18.61` |\n| R 1/4 | `18.69` |\n| R 1/2 | `18.80` |\n| R 3/4 | `18.89` |\n| S | `19.10` |\n| S 1/4 | `19.22` |\n| S 1/2 | `19.31` |\n| S 3/4 | `19.41` |\n| T | `19.51` |\n| T 1/4 | `19.62` |\n| T 1/2 | `19.84` |\n| U | `20.02` |\n| U 1/2 | `20.20` |\n| V | `20.32` |\n| V 1/4 | `20.44` |\n| V 1/2 | `20.68` |\n| W | `20.76` |\n| W 1/4 | `20.85` |\n| W 1/2 | `20.94` |\n| W 3/4 | `21.08` |\n| X | `21.18` |\n| X 1/4 | `21.24` |\n| X 1/2 | `21.30` |\n| Y | `21.49` |\n| Y 1/2 | `21.69` |\n| Z | `21.89` |\n| Z+1/2 | `22.10` |\n| Z+1 | `22.33` |\n| Z+1.5 | `22.60` |\n| Z+2 | `22.69` |\n| Z+2.5 | `22.92` |\n| Z+3 | `23.06` |\n| Z+3.5 | `23.24` |\n| Z+4 | `23.47` |\n| Z+4.5 | `23.55` |\n| Z+5 | `23.87` |\n| Z+6 | `24.27` |","metadata":{"title":"Ring Sizes","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/","collection":"grasshopper","hash":"8e41e50cc568844715547f35ca356990","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - China\n\nPredefined list of Chinese ring sizes.\n\nNickname: `China` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 25 values\n\n| Label | Value |\n|---|---|\n| 2 | `13.21` |\n| 3 | `13.61` |\n| 4 | `14.05` |\n| 5 | `14.36` |\n| 6 | `14.56` |\n| 7 | `14.86` |\n| 8 | `15.27` |\n| 9 | `15.7` |\n| 10 | `16.0` |\n| 12 | `16.51` |\n| 13 | `16.92` |\n| 14 | `17.35` |\n| 15 | `17.75` |\n| 16 | `18.19` |\n| 17 | `18.53` |\n| 18 | `18.89` |\n| 19 | `19.41` |\n| 20 | `19.84` |\n| 21 | `20.02` |\n| 22 | `20.2` |\n| 23 | `20.68` |\n| 24 | `21.08` |\n| 25 | `21.49` |\n| 26 | `21.89` |\n| 27 | `22.33` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - China","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---china","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---china","collection":"grasshopper","hash":"5eda64d1eaaa1743023f2063b6e1a16d","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Europe\n\nPredefined list of European ring sizes.\n\nNickname: `Europe` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 37 values\n\n| Label | Value |\n|---|---|\n| 40 | `12.7` |\n| 41 | `13.0` |\n| 42 | `13.3` |\n| 43 | `13.6` |\n| 44 | `14.0` |\n| 45 | `14.3` |\n| 46 | `14.6` |\n| 47 | `15.0` |\n| 48 | `15.3` |\n| 49 | `15.6` |\n| 50 | `15.9` |\n| 51 | `16.2` |\n| 52 | `16.5` |\n| 53 | `16.8` |\n| 54 | `17.2` |\n| 55 | `17.5` |\n| 56 | `17.8` |\n| 57 | `18.1` |\n| 58 | `18.4` |\n| 59 | `18.8` |\n| 60 | `19.1` |\n| 61 | `19.4` |\n| 62 | `19.7` |\n| 63 | `20.0` |\n| 64 | `20.3` |\n| 65 | `20.6` |\n| 66 | `21.0` |\n| 67 | `21.3` |\n| 68 | `21.6` |\n| 69 | `22.0` |\n| 70 | `22.3` |\n| 71 | `22.6` |\n| 72 | `22.9` |\n| 73 | `23.2` |\n| 74 | `23.5` |\n| 75 | `23.8` |\n| 76 | `24.2` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Europe","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---europe","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---europe","collection":"grasshopper","hash":"ae340cc254af1d78b6051575d612c08e","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - USA\n\nPredefined list of USA ring sizes.\n\nNickname: `USA` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs\n\nValues\n\nShow all 81 values\n\n| Label | Value |\n|---|---|\n| 0 | `11.95` |\n| 1/2 | `11.95` |\n| 3/4 | `12.18` |\n| 1 | `12.37` |\n| 1 1/4 | `12.60` |\n| 1 1/2 | `12.78` |\n| 1 3/4 | `13.00` |\n| 2 | `13.21` |\n| 2 1/4 | `13.41` |\n| 2 1/2 | `13.61` |\n| 2 3/4 | `13.83` |\n| 3 | `14.05` |\n| 3 1/8 | `14.15` |\n| 3 1/4 | `14.25` |\n| 3 3/8 | `14.36` |\n| 3 1/2 | `14.45` |\n| 3 5/8 | `14.56` |\n| 3 3/4 | `14.65` |\n| 4 | `14.86` |\n| 4 1/4 | `15.04` |\n| 4 1/2 | `15.27` |\n| 4 5/8 | `15.40` |\n| 4 3/4 | `15.53` |\n| 5 | `15.70` |\n| 5 1/8 | `15.80` |\n| 5 1/4 | `15.90` |\n| 5 3/8 | `16.00` |\n| 5 1/2 | `16.10` |\n| 5 3/4 | `16.30` |\n| 5 7/8 | `16.41` |\n| 6 | `16.51` |\n| 6 1/4 | `16.71` |\n| 6 1/2 | `16.92` |\n| 6 3/4 | `17.13` |\n| 7 | `17.35` |\n| 7 1/4 | `17.45` |\n| 7 1/2 | `17.75` |\n| 7 3/4 | `17.97` |\n| 8 | `18.19` |\n| 8 1/4 | `18.35` |\n| 8 1/2 | `18.53` |\n| 8 5/8 | `18.61` |\n| 8 3/4 | `18.69` |\n| 8 7/8 | `18.80` |\n| 9 | `18.89` |\n| 9 1/8 | `19.10` |\n| 9 1/4 | `19.22` |\n| 9 3/8 | `19.31` |\n| 9 1/2 | `19.41` |\n| 9 5/8 | `19.51` |\n| 9 3/4 | `19.62` |\n| 10 | `19.84` |\n| 10 1/4 | `20.02` |\n| 10 1/2 | `20.20` |\n| 10 5/8 | `20.32` |\n| 10 3/4 | `20.44` |\n| 11 | `20.68` |\n| 11 1/8 | `20.76` |\n| 11 1/4 | `20.85` |\n| 11 3/8 | `20.94` |\n| 11 1/2 | `21.08` |\n| 11 5/8 | `21.18` |\n| 11 3/4 | `21.24` |\n| 11 7/8 | `21.30` |\n| 12 | `21.49` |\n| 12 1/4 | `21.69` |\n| 12 1/2 | `21.89` |\n| 12 3/4 | `22.10` |\n| 13 | `22.20` |\n| 13 1/4 | `22.40` |\n| 13 1/2 | `22.61` |\n| 13 3/4 | `22.81` |\n| 14 | `23.01` |\n| 14 1/4 | `23.22` |\n| 14 1/2 | `23.42` |\n| 14 3/4 | `23.62` |\n| 15 | `23.83` |\n| 15 1/4 | `24.03` |\n| 15 1/2 | `24.23` |\n| 15 3/4 | `24.43` |\n| 16 | `24.64` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - USA","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---usa","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---usa","collection":"grasshopper","hash":"0c9cf879726c8c6a0ee19cd3f4aa3402","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Australia\n\nPredefined list of ring size systems.\n\nNickname: `Australia` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 77 values\n\n| Label | Value |\n|---|---|\n| A | `11.95` |\n| A 1/2 | `12.18` |\n| B | `12.37` |\n| B 1/2 | `12.60` |\n| C | `12.78` |\n| C 1/2 | `13.00` |\n| D | `13.21` |\n| D 1/2 | `13.41` |\n| E | `13.61` |\n| E 1/2 | `13.83` |\n| F | `14.05` |\n| F 1/2 | `14.15` |\n| F 3/4 | `14.25` |\n| G | `14.36` |\n| G 1/4 | `14.45` |\n| G 1/2 | `14.56` |\n| H | `14.65` |\n| H 1/2 | `14.86` |\n| I | `15.04` |\n| I 1/2 | `15.27` |\n| J | `15.40` |\n| J 1/4 | `15.53` |\n| J 1/2 | `15.70` |\n| K | `15.80` |\n| K 1/4 | `15.90` |\n| K 1/2 | `16.00` |\n| L | `16.10` |\n| L 1/4 | `16.30` |\n| L 1/2 | `16.41` |\n| M | `16.51` |\n| M 1/2 | `16.71` |\n| N | `16.92` |\n| N 1/2 | `17.13` |\n| O | `17.35` |\n| O 1/2 | `17.45` |\n| P | `17.75` |\n| P 1/2 | `17.97` |\n| Q | `18.19` |\n| Q 1/2 | `18.35` |\n| Q 3/4 | `18.53` |\n| R | `18.61` |\n| R 1/4 | `18.69` |\n| R 1/2 | `18.80` |\n| R 3/4 | `18.89` |\n| S | `19.10` |\n| S 1/4 | `19.22` |\n| S 1/2 | `19.31` |\n| S 3/4 | `19.41` |\n| T | `19.51` |\n| T 1/4 | `19.62` |\n| T 1/2 | `19.84` |\n| U | `20.02` |\n| U 1/2 | `20.20` |\n| V | `20.32` |\n| V 1/4 | `20.44` |\n| V 1/2 | `20.68` |\n| W | `20.76` |\n| W 1/4 | `20.85` |\n| W 1/2 | `20.94` |\n| W 3/4 | `21.08` |\n| X | `21.18` |\n| X 1/4 | `21.24` |\n| X 1/2 | `21.30` |\n| Y | `21.49` |\n| Y 1/2 | `21.69` |\n| Z | `21.89` |\n| Z+1/2 | `22.10` |\n| Z+1 | `22.33` |\n| Z+1.5 | `22.60` |\n| Z+2 | `22.69` |\n| Z+2.5 | `22.92` |\n| Z+3 | `23.06` |\n| Z+3.5 | `23.24` |\n| Z+4 | `23.47` |\n| Z+4.5 | `23.55` |\n| Z+5 | `23.87` |\n| Z+6 | `24.27` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Australia","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---australia","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---australia","collection":"grasshopper","hash":"4986624f0fb8f0018a63e6dc78afadb0","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Brazil\n\nPredefined list of Brazilian ring sizes.\n\nNickname: `Brazil` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 36 values\n\n| Label | Value |\n|---|---|\n| 1 | `13.05` |\n| 2 | `13.37` |\n| 3 | `13.69` |\n| 4 | `14.01` |\n| 5 | `14.32` |\n| 6 | `14.64` |\n| 7 | `14.96` |\n| 8 | `15.28` |\n| 9 | `15.60` |\n| 10 | `15.92` |\n| 11 | `16.23` |\n| 12 | `16.55` |\n| 13 | `16.87` |\n| 14 | `17.19` |\n| 15 | `17.51` |\n| 16 | `17.83` |\n| 17 | `18.14` |\n| 18 | `18.46` |\n| 19 | `18.78` |\n| 20 | `19.10` |\n| 21 | `19.42` |\n| 22 | `19.74` |\n| 23 | `20.05` |\n| 24 | `20.37` |\n| 25 | `20.69` |\n| 26 | `21.01` |\n| 27 | `21.33` |\n| 28 | `21.65` |\n| 29 | `21.96` |\n| 30 | `22.28` |\n| 31 | `22.60` |\n| 32 | `22.92` |\n| 33 | `23.24` |\n| 34 | `23.55` |\n| 35 | `23.87` |\n| 36 | `24.19` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Brazil","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---brazil","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---brazil","collection":"grasshopper","hash":"e6389130f03f8c3e70c4ef1db8b8263d","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Canada\n\nPredefined list of Canadian ring sizes.\n\nNickname: `Canada` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 70 values\n\n| Label | Value |\n|---|---|\n| 0 | `11.95` |\n| 1/2 | `11.95` |\n| 3/4 | `12.18` |\n| 1 | `12.37` |\n| 1 1/4 | `12.6` |\n| 1 1/2 | `12.78` |\n| 1 3/4 | `13.0` |\n| 2 | `13.21` |\n| 2 1/4 | `13.41` |\n| 2 1/2 | `13.61` |\n| 2 3/4 | `13.83` |\n| 3 | `14.05` |\n| 3 1/8 | `14.15` |\n| 3 1/4 | `14.25` |\n| 3 3/8 | `14.36` |\n| 3 1/2 | `14.45` |\n| 3 5/8 | `14.56` |\n| 3 3/4 | `14.65` |\n| 4 | `14.86` |\n| 4 1/4 | `15.04` |\n| 4 1/2 | `15.27` |\n| 4 5/8 | `15.4` |\n| 4 3/4 | `15.53` |\n| 5 | `15.7` |\n| 5 1/8 | `15.8` |\n| 5 1/4 | `15.9` |\n| 5 3/8 | `16.0` |\n| 5 1/2 | `16.1` |\n| 5 3/4 | `16.3` |\n| 5 7/8 | `16.41` |\n| 6 | `16.51` |\n| 6 1/4 | `16.71` |\n| 6 1/2 | `16.92` |\n| 6 3/4 | `17.13` |\n| 7 | `17.35` |\n| 7 1/4 | `17.45` |\n| 7 1/2 | `17.75` |\n| 7 3/4 | `17.97` |\n| 8 | `18.19` |\n| 8 1/4 | `18.35` |\n| 8 1/2 | `18.53` |\n| 8 5/8 | `18.61` |\n| 8 3/4 | `18.69` |\n| 8 7/8 | `18.8` |\n| 9 | `18.89` |\n| 9 1/8 | `19.1` |\n| 9 1/4 | `19.22` |\n| 9 3/8 | `19.31` |\n| 9 1/2 | `19.41` |\n| 9 5/8 | `19.51` |\n| 9 3/4 | `19.62` |\n| 10 | `19.84` |\n| 10 1/4 | `20.02` |\n| 10 1/2 | `20.2` |\n| 10 5/8 | `20.32` |\n| 10 3/4 | `20.44` |\n| 11 | `20.68` |\n| 11 1/8 | `20.76` |\n| 11 1/4 | `20.85` |\n| 11 3/8 | `20.94` |\n| 11 1/2 | `21.08` |\n| 11 5/8 | `21.18` |\n| 11 3/4 | `21.24` |\n| 11 7/8 | `21.3` |\n| 12 | `21.49` |\n| 12 1/4 | `21.69` |\n| 12 1/2 | `21.89` |\n| 12 3/4 | `22.1` |\n| 13 | `22.33` |\n| 13.5 | `22.6` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Canada","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---canada","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---canada","collection":"grasshopper","hash":"5885d63903a3fa2d4e077ad69e362fe7","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - France\n\nRing sizes for France system\n\nNickname: `France` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 37 values\n\n| Label | Value |\n|---|---|\n| 40 | `12.7` |\n| 41 | `13` |\n| 42 | `13.3` |\n| 43 | `13.6` |\n| 44 | `14` |\n| 45 | `14.3` |\n| 46 | `14.6` |\n| 47 | `15` |\n| 48 | `15.3` |\n| 49 | `15.6` |\n| 50 | `15.9` |\n| 51 | `16.2` |\n| 52 | `16.5` |\n| 53 | `16.8` |\n| 54 | `17.2` |\n| 55 | `17.5` |\n| 56 | `17.8` |\n| 57 | `18.1` |\n| 58 | `18.4` |\n| 59 | `18.8` |\n| 60 | `19.1` |\n| 61 | `19.4` |\n| 62 | `19.7` |\n| 63 | `20` |\n| 64 | `20.3` |\n| 65 | `20.6` |\n| 66 | `21` |\n| 67 | `21.3` |\n| 68 | `21.6` |\n| 69 | `22` |\n| 70 | `22.3` |\n| 71 | `22.6` |\n| 72 | `22.9` |\n| 73 | `23.2` |\n| 74 | `23.5` |\n| 75 | `23.8` |\n| 76 | `24.2` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - France","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---france","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---france","collection":"grasshopper","hash":"dbb7b47ff8252e2b5364c78741443ef1","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Germany\n\nPredefined list of ring size system: Germany.\n\nNickname: `Germany` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 37 values\n\n| Label | Value |\n|---|---|\n| 40 | `12.7` |\n| 41 | `13.0` |\n| 42 | `13.3` |\n| 43 | `13.6` |\n| 44 | `14.0` |\n| 45 | `14.3` |\n| 46 | `14.6` |\n| 47 | `15.0` |\n| 48 | `15.3` |\n| 49 | `15.6` |\n| 50 | `15.9` |\n| 51 | `16.2` |\n| 52 | `16.5` |\n| 53 | `16.8` |\n| 54 | `17.2` |\n| 55 | `17.5` |\n| 56 | `17.8` |\n| 57 | `18.1` |\n| 58 | `18.4` |\n| 59 | `18.8` |\n| 60 | `19.1` |\n| 61 | `19.4` |\n| 62 | `19.7` |\n| 63 | `20.0` |\n| 64 | `20.3` |\n| 65 | `20.6` |\n| 66 | `21.0` |\n| 67 | `21.3` |\n| 68 | `21.6` |\n| 69 | `22.0` |\n| 70 | `22.3` |\n| 71 | `22.6` |\n| 72 | `22.9` |\n| 73 | `23.2` |\n| 74 | `23.5` |\n| 75 | `23.8` |\n| 76 | `24.2` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Germany","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---germany","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---germany","collection":"grasshopper","hash":"9ce66fac7978280d93ee9f79df5850d5","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - India\n\nPredefined list of Indian ring sizes.\n\nNickname: `India` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 35 values\n\n| Label | Value |\n|---|---|\n| 1 | `13.00` |\n| 2 | `13.33` |\n| 3 | `13.67` |\n| 4 | `14.00` |\n| 5 | `14.33` |\n| 6 | `14.67` |\n| 7 | `15.00` |\n| 8 | `15.33` |\n| 9 | `15.67` |\n| 10 | `16.00` |\n| 11 | `16.33` |\n| 12 | `16.67` |\n| 13 | `17.00` |\n| 14 | `17.33` |\n| 15 | `17.67` |\n| 16 | `18.00` |\n| 17 | `18.33` |\n| 18 | `18.67` |\n| 19 | `19.00` |\n| 20 | `19.33` |\n| 21 | `19.67` |\n| 22 | `20.00` |\n| 23 | `20.33` |\n| 24 | `20.67` |\n| 25 | `21.00` |\n| 26 | `21.33` |\n| 27 | `21.67` |\n| 28 | `22.00` |\n| 29 | `22.33` |\n| 30 | `22.67` |\n| 31 | `23.00` |\n| 32 | `23.33` |\n| 33 | `23.67` |\n| 34 | `24.00` |\n| 35 | `24.33` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - India","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---india","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---india","collection":"grasshopper","hash":"fa0aa008510ce1cb98c6804cc9d0b465","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - India Extended\n\nPredefined list of extended Indian ring sizes.\n\nNickname: `India Extended` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 21 values\n\n| Label | Value |\n|---|---|\n| 3 | `13.7` |\n| 4 | `14.0` |\n| 5 | `14.3` |\n| 6 | `14.6` |\n| 7 | `15.0` |\n| 8 | `15.3` |\n| 9 | `15.6` |\n| 10 | `15.9` |\n| 11 | `16.2` |\n| 12 | `16.5` |\n| 13 | `16.8` |\n| 14 | `17.2` |\n| 15 | `17.5` |\n| 16 | `17.8` |\n| 17 | `18.1` |\n| 18 | `18.4` |\n| 19 | `18.8` |\n| 20 | `19.1` |\n| 21 | `19.4` |\n| 22 | `19.7` |\n| 23 | `20.0` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - India Extended","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---india-extended","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---india-extended","collection":"grasshopper","hash":"8c9f6882509e06c21d6f44a73c5f7725","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Israel\n\nPredefined list of Israeli ring sizes.\n\nNickname: `Israel` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 25 values\n\n| Label | Value |\n|---|---|\n| 2 | `13.21` |\n| 3 | `13.61` |\n| 4 | `14.05` |\n| 5 | `14.36` |\n| 6 | `14.56` |\n| 7 | `14.86` |\n| 8 | `15.27` |\n| 9 | `15.7` |\n| 10 | `16.0` |\n| 12 | `16.51` |\n| 13 | `16.92` |\n| 14 | `17.35` |\n| 15 | `17.75` |\n| 16 | `18.19` |\n| 17 | `18.53` |\n| 18 | `18.89` |\n| 19 | `19.41` |\n| 20 | `19.84` |\n| 21 | `20.02` |\n| 22 | `20.2` |\n| 23 | `20.68` |\n| 24 | `21.08` |\n| 25 | `21.49` |\n| 26 | `21.89` |\n| 27 | `22.33` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Israel","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---israel","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---israel","collection":"grasshopper","hash":"fa0eb25c00c1f4cb1bb027e01236e1b9","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Italy\n\nPredefined list of ring size system: Italy.\n\nNickname: `Italy` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 40 values\n\n| Label | Value |\n|---|---|\n| 1 | `13.0` |\n| 2 | `13.3` |\n| 3 | `13.6` |\n| 4 | `14.0` |\n| 5 | `14.3` |\n| 6 | `14.6` |\n| 7 | `15.0` |\n| 8 | `15.3` |\n| 9 | `15.6` |\n| 10 | `16.0` |\n| 11 | `16.2` |\n| 12 | `16.5` |\n| 13 | `16.8` |\n| 14 | `17.2` |\n| 15 | `17.5` |\n| 16 | `17.8` |\n| 17 | `18.1` |\n| 18 | `18.4` |\n| 19 | `18.8` |\n| 20 | `19.1` |\n| 21 | `19.4` |\n| 22 | `19.7` |\n| 23 | `20.0` |\n| 24 | `20.3` |\n| 25 | `20.6` |\n| 26 | `21.0` |\n| 27 | `21.3` |\n| 28 | `21.6` |\n| 29 | `22.0` |\n| 30 | `22.3` |\n| 31 | `22.6` |\n| 32 | `22.9` |\n| 33 | `23.2` |\n| 34 | `23.5` |\n| 35 | `23.8` |\n| 36 | `24.2` |\n| 37 | `24.5` |\n| 38 | `24.8` |\n| 39 | `25.1` |\n| 40 | `25.4` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Italy","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---italy","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---italy","collection":"grasshopper","hash":"2f5943ce8a77c9b047e91516d0055e20","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Japan\n\nPredefined list of ring size system: Japan.\n\nNickname: `Japan` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 40 values\n\n| Label | Value |\n|---|---|\n| 1 | `12.0` |\n| 2 | `12.4` |\n| 3 | `12.7` |\n| 4 | `13.0` |\n| 5 | `13.4` |\n| 6 | `13.7` |\n| 7 | `14.0` |\n| 8 | `14.4` |\n| 9 | `14.7` |\n| 10 | `15.0` |\n| 11 | `15.4` |\n| 12 | `15.7` |\n| 13 | `16.0` |\n| 14 | `16.4` |\n| 15 | `16.7` |\n| 16 | `17.0` |\n| 17 | `17.4` |\n| 18 | `17.7` |\n| 19 | `18.0` |\n| 20 | `18.4` |\n| 21 | `18.7` |\n| 22 | `19.0` |\n| 23 | `19.4` |\n| 24 | `19.7` |\n| 25 | `20.0` |\n| 26 | `20.4` |\n| 27 | `20.7` |\n| 28 | `21.0` |\n| 29 | `21.4` |\n| 30 | `21.7` |\n| 31 | `22.0` |\n| 32 | `22.4` |\n| 33 | `22.7` |\n| 34 | `23.0` |\n| 35 | `23.4` |\n| 36 | `23.7` |\n| 37 | `24.0` |\n| 38 | `24.4` |\n| 39 | `24.7` |\n| 40 | `25.0` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Japan","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---japan","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---japan","collection":"grasshopper","hash":"972f88a5067da234fa3c1dc54f6cf9ac","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Russia\n\nPredefined list of ring size system: Russia.\n\nNickname: `Russia` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 27 values\n\n| Label | Value |\n|---|---|\n| 15 | `14.4` |\n| 15.5 | `14.8` |\n| 16 | `15.2` |\n| 16.5 | `15.6` |\n| 17 | `16.0` |\n| 17.5 | `16.5` |\n| 18 | `16.9` |\n| 18.5 | `17.3` |\n| 19 | `17.7` |\n| 19.5 | `18.2` |\n| 20 | `18.6` |\n| 20.5 | `19.0` |\n| 21 | `19.4` |\n| 21.5 | `19.8` |\n| 22 | `20.2` |\n| 22.5 | `20.6` |\n| 23 | `21.0` |\n| 23.5 | `21.4` |\n| 24 | `21.8` |\n| 24.5 | `22.3` |\n| 25 | `22.7` |\n| 25.5 | `23.1` |\n| 26 | `23.5` |\n| 26.5 | `23.9` |\n| 27 | `24.3` |\n| 27.5 | `24.7` |\n| 28 | `25.1` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Russia","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---russia","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---russia","collection":"grasshopper","hash":"c0cc5bad040c18ca77ccc06fa692052e","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - South America\n\nPredefined list of South American ring sizes.\n\nNickname: `South America` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 37 values\n\n| Label | Value |\n|---|---|\n| 3 | `12.37` |\n| 4 | `12.78` |\n| 5 | `13.21` |\n| 6 | `13.5` |\n| 7 | `14.0` |\n| 8 | `14.24` |\n| 9 | `14.45` |\n| 10 | `14.85` |\n| 11 | `15.27` |\n| 12 | `15.48` |\n| 13 | `15.7` |\n| 14 | `16.1` |\n| 15 | `16.51` |\n| 16 | `16.73` |\n| 17 | `17.14` |\n| 18 | `17.56` |\n| 19 | `17.75` |\n| 20 | `18.19` |\n| 21 | `18.59` |\n| 22 | `18.78` |\n| 23 | `19.22` |\n| 24 | `19.41` |\n| 25 | `19.84` |\n| 26 | `20.24` |\n| 27 | `20.46` |\n| 28 | `20.88` |\n| 29 | `21.3` |\n| 30 | `21.49` |\n| 31 | `21.89` |\n| 32 | `22.33` |\n| 33 | `22.54` |\n| 34 | `22.75` |\n| 35 | `22.92` |\n| 36 | `23.78` |\n| 37 | `24.0` |\n| 38 | `24.41` |\n| 39 | `24.83` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - South America","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---south-america","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---south-america","collection":"grasshopper","hash":"2b6ff445b069700d95cb7bf28e122c7e","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Spain\n\nPredefined list of ring size system: Spain.\n\nNickname: `Spain` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 40 values\n\n| Label | Value |\n|---|---|\n| 1 | `12.4` |\n| 2 | `12.8` |\n| 3 | `13.2` |\n| 4 | `13.6` |\n| 5 | `14.0` |\n| 6 | `14.4` |\n| 7 | `14.8` |\n| 8 | `15.2` |\n| 9 | `15.6` |\n| 10 | `16.0` |\n| 11 | `16.5` |\n| 12 | `16.9` |\n| 13 | `17.3` |\n| 14 | `17.7` |\n| 15 | `18.1` |\n| 16 | `18.5` |\n| 17 | `19.0` |\n| 18 | `19.4` |\n| 19 | `19.8` |\n| 20 | `20.2` |\n| 21 | `20.6` |\n| 22 | `21.0` |\n| 23 | `21.4` |\n| 24 | `21.8` |\n| 25 | `22.2` |\n| 26 | `22.6` |\n| 27 | `23.0` |\n| 28 | `23.4` |\n| 29 | `23.8` |\n| 30 | `24.2` |\n| 31 | `24.6` |\n| 32 | `25.0` |\n| 33 | `25.4` |\n| 34 | `25.8` |\n| 35 | `26.2` |\n| 36 | `26.6` |\n| 37 | `27.0` |\n| 38 | `27.4` |\n| 39 | `27.8` |\n| 40 | `28.2` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Spain","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---spain","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---spain","collection":"grasshopper","hash":"2e172db42a2fa0e87813dd6cb5c8fefd","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Switzerland\n\nPredefined list of ring size system: Switzerland.\n\nNickname: `Switzerland` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 40 values\n\n| Label | Value |\n|---|---|\n| 1 | `12.7` |\n| 2 | `13.0` |\n| 3 | `13.3` |\n| 4 | `13.6` |\n| 5 | `14.0` |\n| 6 | `14.3` |\n| 7 | `14.6` |\n| 8 | `15.0` |\n| 9 | `15.3` |\n| 10 | `15.6` |\n| 11 | `15.9` |\n| 12 | `16.2` |\n| 13 | `16.5` |\n| 14 | `16.8` |\n| 15 | `17.2` |\n| 16 | `17.5` |\n| 17 | `17.8` |\n| 18 | `18.1` |\n| 19 | `18.4` |\n| 20 | `18.8` |\n| 21 | `19.1` |\n| 22 | `19.4` |\n| 23 | `19.7` |\n| 24 | `20.0` |\n| 25 | `20.3` |\n| 26 | `20.6` |\n| 27 | `21.0` |\n| 28 | `21.3` |\n| 29 | `21.6` |\n| 30 | `22.0` |\n| 31 | `22.3` |\n| 32 | `22.6` |\n| 33 | `22.9` |\n| 34 | `23.2` |\n| 35 | `23.5` |\n| 36 | `23.8` |\n| 37 | `24.2` |\n| 38 | `24.5` |\n| 39 | `24.8` |\n| 40 | `25.1` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Switzerland","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---switzerland","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---switzerland","collection":"grasshopper","hash":"2039b0810c786b98210615952ff8616a","indexed_by":"docs-index"}},{"content":"Ring Sizes — Ring Sizes - Türkiye\n\nPredefined list of Turkish ring sizes.\n\nNickname: `Türkiye` · Tab: Shanks › Ring Sizes · Value list — a dropdown you pick from, with no inputs · In the tab's dropdown, not on the ribbon face\n\nValues\n\nShow all 25 values\n\n| Label | Value |\n|---|---|\n| 2 | `13.21` |\n| 3 | `13.61` |\n| 4 | `14.05` |\n| 5 | `14.36` |\n| 6 | `14.56` |\n| 7 | `14.86` |\n| 8 | `15.27` |\n| 9 | `15.7` |\n| 10 | `16.0` |\n| 12 | `16.51` |\n| 13 | `16.92` |\n| 14 | `17.35` |\n| 15 | `17.75` |\n| 16 | `18.19` |\n| 17 | `18.53` |\n| 18 | `18.89` |\n| 19 | `19.41` |\n| 20 | `19.84` |\n| 21 | `20.02` |\n| 22 | `20.2` |\n| 23 | `20.68` |\n| 24 | `21.08` |\n| 25 | `21.49` |\n| 26 | `21.89` |\n| 27 | `22.33` |","metadata":{"title":"Ring Sizes","section":"Ring Sizes - Türkiye","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---türkiye","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/ring-sizes/#ring-sizes---türkiye","collection":"grasshopper","hash":"3068ab184d576df29ede35a075c8ff0d","indexed_by":"docs-index"}},{"content":"Signet\n\n1 component in Shanks › Signet.\n\nSignet\nDescription\n\nNickname: `Signet` · Tab: Shanks › Signet\n\nInputs\n\n_This component has no inputs._\n\nOutputs\n\n_This component has no outputs._","metadata":{"title":"Signet","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/signet/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/signet/","collection":"grasshopper","hash":"fd7e12ce61673d7018620e9386b9ab3b","indexed_by":"docs-index"}},{"content":"Two Rows Shank\n\n5 components in Shanks › Two Rows Shank.","metadata":{"title":"Two Rows Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/","collection":"grasshopper","hash":"67c9bc6c0cdfac29e147d12f35b7946c","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank\n\nCreates a two-rows knife pave shank with optional parameters\n\nNickname: `TwoRowsShank` · Tab: Shanks › Two Rows Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | — | Finger size parameters |\n| Top Profile _(optional)_ | `Top Profile` | Generic | item | — | Top profile parameters (Classic band) |\n| Mid Profile _(optional)_ | `Mid Profile` | Generic | item | — | Middle profile parameters (Classic band) |\n| Bottom Profile _(optional)_ | `Bottom Profile` | Generic | item | — | Bottom profile parameters (Classic band) |\n| External Profile _(optional)_ | `External Profile` | Generic | item | — | External profile parameters (Classic band) |\n| Advanced _(optional)_ | `Advanced` | Generic | item | — | Advanced parameters (opening) |\n| Rail _(optional)_ | `Rail` | Generic | item | — | Rail / channel parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | — | Gems parameters |\n| Prongs _(optional)_ | `Prongs` | Generic | item | — | Prong parameters |\n| Cutters _(optional)_ | `Cutters` | Generic | item | — | Gem drill-cutter parameters |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of a TwoRowsShank |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank","collection":"grasshopper","hash":"0848258839e1e1c05c0825112c2c9035","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Shank Brep geometry (band + prongs) |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Meshes` | Geometry | list | Gem Meshes |\n| Cutters | `Cutters` | Brep | list | Gem drill-cutter Breps (when cutters are enabled) |\n| Magnet Top | `Magnet Top` | Plane | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Plane | item | Bottom center of the bounding box |\n| Magnet North | `Magnet North` | Plane | item | North center of the bounding box |\n| Magnet South | `Magnet South` | Plane | item | South center of the bounding box |\n| Magnet West | `Magnet West` | Plane | item | West center of the bounding box |\n| Magnet East | `Magnet East` | Plane | item | East center of the bounding box |\n| Taxonomy | `Taxonomy` | Generic | item | Two Rows Shank taxonomy with reader-compatible keys |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank","collection":"grasshopper","hash":"e84b145b21101dc0ddb95ca0f9d8bd69","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Cutters Params\n\nGem drill-cutter parameters for a Two Rows Shank (percentages of the gem size unless noted)\n\nNickname: `TwoRows - Cutters Params` · Tab: Shanks › Two Rows Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `false` | Generate the gem drill cutters |\n| Height Top _(optional)_ | `Height Top` | Number | item | `100.0` | Cutter top height |\n| Size Top _(optional)_ | `Size Top` | Number | item | `100.0` | Cutter top size |\n| Height Crown _(optional)_ | `Height Crown` | Number | item | `40.0` | Cutter crown height |\n| Gem Inside _(optional)_ | `Gem Inside` | Number | item | `0.0` | How much the cutter bites into the gem |\n| Height Girdle _(optional)_ | `Height Girdle` | Number | item | `3.0` | Cutter girdle height |\n| Size Drill _(optional)_ | `Size Drill` | Number | item | `40.0` | Cutter drill size |\n| Height Pavilion _(optional)_ | `Height Pavilion` | Number | item | `71.0` | Cutter pavilion height |\n| Size Bottom _(optional)_ | `Size Bottom` | Number | item | `40.0` | Cutter bottom size |\n| Height Drill _(optional)_ | `Height Drill` | Number | item | `200.0` | Cutter drill height |\n| Drill Type _(optional)_ | `Drill Type` | Integer | item | `0` | Drill shape index (0-3) |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Cutters Params | `Cutters Params` | Generic | item | Dictionary of cutter parameters |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Cutters Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---cutters-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---cutters-params","collection":"grasshopper","hash":"bd714ded7130963f105730c6b241f52f","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Gems Params\n\nGem parameters for a Two Rows Shank\n\nNickname: `TwoRows - Gems Params` · Tab: Shanks › Two Rows Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enable _(optional)_ | `Enable` | Boolean | item | `true` | Place gems on the rails |\n| Gem Shape _(optional)_ | `Gem Shape` | Text | item | `ROUND` | Gem shape (ROUND ...) |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | `1.0` | Gem diameter, in mm |\n| Min Distance _(optional)_ | `Min Distance` | Number | item | `0.1` | Minimum spacing between gems, in mm |\n| Move In Z _(optional)_ | `Move In Z` | Number | item | `0.0` | Vertical adjustment of the gems along the face normal, in mm |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Gems Params | `Gems Params` | Generic | item | Dictionary of gem parameters |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Gems Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---gems-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---gems-params","collection":"grasshopper","hash":"5d17f4aea28d43c4e088dc66906fbce6","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Prongs Params\n\nProng parameters for a Two Rows Shank\n\nNickname: `TwoRows - Prongs Params` · Tab: Shanks › Two Rows Shank\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Setting Mode _(optional)_ | `Setting Mode` | Text | item | `NONE` | Prong setting mode: NONE or SHARED |\n| External Diameter _(optional)_ | `External Diameter` | Number | item | `0.5` | Diameter of the outer prongs, in mm |\n| Internal Diameter _(optional)_ | `Internal Diameter` | Number | item | `0.5` | SINGLE rail only: diameter of the shared central prongs, in mm |\n| Distance _(optional)_ | `Distance` | Number | item | `0.0` | Transverse separation of the prongs (+ apart / - closer), in mm |\n| End Prong Count _(optional)_ | `End Prong Count` | Integer | item | `2` | Rail end finish: 1 = single centred prong, 2 = one per side |\n| Over Girdle _(optional)_ | `Over Girdle` | Number | item | `0.3` | Prong bead height over the gem girdle, in mm |\n| Gem Inside _(optional)_ | `Gem Inside` | Number | item | `0.1` | How much each prong overlaps the gem (lateral bite), in mm |\n| Move In Z _(optional)_ | `Move In Z` | Number | item | `0.0` | Vertical adjustment of the prongs, in mm |\n| Extension For Manufacturing _(optional)_ | `Extension Mfg.` | Number | item | `1.0` | Prong extension for MANUFACTURING mode, in mm |\n| Automatic Diameter _(optional)_ | `Automatic Diameter` | Boolean | item | `false` | Derive the prong diameter automatically from the gem size |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Prongs Params | `Prongs Params` | Generic | item | Dictionary of prong parameters |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Prongs Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---prongs-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---prongs-params","collection":"grasshopper","hash":"c70ccfe014f5497f068af52a586612c8","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Rail Params\n\nRail / channel parameters for a Two Rows Shank\n\nNickname: `TwoRows - Rail Params` · Tab: Shanks › Two Rows Shank\n\nInputs","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Rail Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","collection":"grasshopper","hash":"65f224f05ba7a01e8a8a8906e7e88642","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Rail Params\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Layout Mode _(optional)_ | `Layout Mode` | Text | item | `TOP_ANGLE` | Rail layout: FULL, SIDE_ANGLE or TOP_ANGLE |\n| Start Angle _(optional)_ | `Start Angle` | Number | item | `30.0` | SIDE_ANGLE only: start angle in degrees |\n| End Angle _(optional)_ | `End Angle` | Number | item | `150.0` | SIDE_ANGLE only: end angle in degrees |\n| Top Angle _(optional)_ | `Top Angle` | Number | item | `60.0` | TOP_ANGLE only: aperture centered on the top, in degrees |\n| Rail Mode _(optional)_ | `Rail Mode` | Text | item | `DOUBLE` | SINGLE (one wide channel for both rows) or DOUBLE (one channel per row) |\n| Cut Orientation _(optional)_ | `Cut Orientation` | Text | item | `ANGLED` | DOUBLE only: ANGLED (channels follow the face angle) or HORIZONTAL (flat channels) |\n| Width _(optional)_ | `Width` | Number | item | `1.30` | Channel width along the face, in mm |\n| Offset _(optional)_ | `Offset` | Number | item | `0.3` | Channel carved depth into the band, in mm |\n| Central Wall _(optional)_ | `Central Wall` | Number | item | `0.4` | DOUBLE only: width of the metal wall left between the two rows, in mm |\n| Outer Border _(optional)_ | `Outer Border` | Number | item | `0.3` | SINGLE only: outer metal rim per side, in mm |\n| Row Spacing _(optional)_ | `Row Spacing` | Number | item | `0.1` | SINGLE only: gap between the two gem rows (edge to edge), in mm |\n| End Margin _(optional)_ | `End Margin` | Number | item | `0.3` | Gap between each channel end and the nearest gem (edge to edge), in mm |\n| Fit Tolerance _(optional)_ | `Fit Tolerance` | Number | item | `0.1` | Spine rebuild fit tolerance, in mm |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Rail Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","collection":"grasshopper","hash":"e5fa27dc4707d5b55f423a5ff27c095b","indexed_by":"docs-index"}},{"content":"Two Rows Shank — Two Rows Shank - Rail Params\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Rotation _(optional)_ | `Rotation` | Number | item | `0.0` | Rotates the gem direction around the rail tangent, in degrees |\n| Connector _(optional)_ | `Connector` | Generic | item | — | Dictionary from a reader Connector output. Individual inputs override. |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Rail Params | `Rail Params` | Generic | item | Dictionary of rail parameters |","metadata":{"title":"Two Rows Shank","section":"Two Rows Shank - Rail Params","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/two-rows-shank/#two-rows-shank---rail-params","collection":"grasshopper","hash":"d8b64c1c444271e694762b042b4ed7c4","indexed_by":"docs-index"}},{"content":"Wedding\n\n4 components in Shanks › Wedding.","metadata":{"title":"Wedding","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/","collection":"grasshopper","hash":"671f0b8f89f5651e9ead563275e1cec8","indexed_by":"docs-index"}},{"content":"Wedding — Wedding\n\nCreates a pair of wedding rings with optional parameters\n\nNickname: `Wedding` · Tab: Shanks › Wedding\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Ring 1 Diameter _(optional)_ | `Dia1` | Number | item | — | Finger size diameter for ring 1 |\n| Ring 1 Profile _(optional)_ | `Prof1` | Generic | item | — | Profile parameters for ring 1 |\n| Ring 1 Gems _(optional)_ | `Gems1` | Generic | item | — | Gems parameters for ring 1 |\n| Ring 2 Diameter _(optional)_ | `Dia2` | Number | item | — | Finger size diameter for ring 2 |\n| Ring 2 Profile _(optional)_ | `Prof2` | Generic | item | — | Profile parameters for ring 2 |\n| Ring 2 Gems _(optional)_ | `Gems2` | Generic | item | — | Gems parameters for ring 2 |\n| JSON _(optional)_ | `JSON` | Text | item | — | JSON representation of WeddingRings |\n| Computation Mode _(optional)_ | `Computation Mode` | Text | item | `RENDER` | Computation mode: RENDER or MANUFACTURING. Defaults to RENDER. |\n\nOutputs","metadata":{"title":"Wedding","section":"Wedding","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding","collection":"grasshopper","hash":"74ffc7df66065c80d38b834df84b4ce3","indexed_by":"docs-index"}},{"content":"Wedding — Wedding\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps Ring 1 | `BReps1` | Brep | list | Ring 1 Brep geometry |\n| Gems Ring 1 | `Gems1` | Generic | list | Ring 1 gem geometries |\n| Meshes Ring 1 | `Meshes1` | Geometry | list | Ring 1 gem meshes |\n| BReps Ring 2 | `BReps2` | Brep | list | Ring 2 Brep geometry |\n| Gems Ring 2 | `Gems2` | Generic | list | Ring 2 gem geometries |\n| Meshes Ring 2 | `Meshes2` | Geometry | list | Ring 2 gem meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Magnet Finger Size Top | `Finger size top` | Point | item | Bottom center of the Bridge |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |\n| Semantic | `Semantic` | Text | item | Semantic text description of the wedding rings |","metadata":{"title":"Wedding","section":"Wedding","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding","collection":"grasshopper","hash":"aff2ff05d84c4edba69baed47eb05bf3","indexed_by":"docs-index"}},{"content":"Wedding — Wedding Band\n\nCreates a single wedding band with optional parameters\n\nNickname: `Wedding Band` · Tab: Shanks › Wedding\n\nInputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Ring Diameter _(optional)_ | `Diameter` | Number | item | Finger size diameter |\n| Profile _(optional)_ | `Profile` | Generic | item | Profile parameters |\n| Gems _(optional)_ | `Gems` | Generic | item | Gems parameters |\n| JSON _(optional)_ | `JSON` | Text | item | JSON representation of WeddingBand |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| BReps | `BReps` | Brep | list | Ring Brep geometry |\n| Gems | `Gems` | Generic | list | Gem geometries |\n| Meshes | `Gems Meshes` | Geometry | list | Gem Meshes |\n| Magnet Top | `Magnet Top` | Point | item | Top center of the bounding box |\n| Magnet Bottom | `Magnet Bot.` | Point | item | Bottom center of the bounding box |\n| Magnet Finger Size Top | `Finger size top` | Point | item | Bottom center of the Bridge |\n| Dictionary | `Dict` | Generic | item | Dictionary with key/value pairs |","metadata":{"title":"Wedding","section":"Wedding Band","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding-band","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding-band","collection":"grasshopper","hash":"92aeceada729228ed4577b168c386bcb","indexed_by":"docs-index"}},{"content":"Wedding — Wedding - Gems\n\nDefine gem-related parameters for a Wedding Ring\n\nNickname: `Wedding - Gems` · Tab: Shanks › Wedding\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Enabled _(optional)_ | `Enabled` | Boolean | item | `false` | Enable gems |\n| Distribution _(optional)_ | `Distribution` | Text | item | `Full` | Gems distribution (Full, Half, Onequarter, Custom) |\n| Custom Distance _(optional)_ | `Cust. Dist.` | Text | item | `Continuous` | Custom distance mode (Continuous, Equidistant) |\n| Shape _(optional)_ | `Shape` | Text | item | `Round` | Gem shape (Round, Princess) |\n| Number Of Gems _(optional)_ | `Num. Gems` | Integer | item | `1` | Number of gems |\n| Gem Size _(optional)_ | `Gem Size` | Number | item | `1.2` | Size of the gem |\n| Min Distance _(optional)_ | `Min. Dist.` | Number | item | `0.1` | Minimum distance between gems |\n| Vertical _(optional)_ | `Vertical` | Number | item | `-0.10` | Vertical offset |\n| Inner Width _(optional)_ | `Inn. Width` | Number | item | `1.2` | Inner width |\n| Inner Height _(optional)_ | `Inn. Height` | Number | item | `0.7` | Inner height |\n| Gem Inside _(optional)_ | `Gem Inside` | Number | item | `0.3` | Gem inside offset |\n| Prong Height _(optional)_ | `Prong Height` | Number | item | `0.2` | Height of prongs |\n| Extension Mfg _(optional)_ | `Ext. Mfg.` | Number | item | `0.4` | Extension for manufacturing |\n| Prong Move Z _(optional)_ | `Prong Move Z` | Number | item | `0.8` | Move prong in Z |\n| Prong Diameter _(optional)_ | `Prong Dia.` | Number | item | `0.4` | Prong diameter |\n| Auto Prong Diameter _(optional)_ | `Auto Prong Dia.` | Boolean | item | `false` | Automatic prong diameter |\n| Prong Type _(optional)_ | `Prong Type` | Text | item | `None` | Prong type (None, Shared, Channel) |","metadata":{"title":"Wedding","section":"Wedding - Gems","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---gems","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---gems","collection":"grasshopper","hash":"e81e72bc3b85c6c8badcf1ae262c567f","indexed_by":"docs-index"}},{"content":"Wedding — Wedding - Gems\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Wedding Gems Params | `Gems` | Generic | item | Gem parameters for Wedding ring |","metadata":{"title":"Wedding","section":"Wedding - Gems","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---gems","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---gems","collection":"grasshopper","hash":"2e04a4a3e3f9980595972e97cf99828b","indexed_by":"docs-index"}},{"content":"Wedding — Wedding - Profile\n\nDefine a profile for a Wedding Ring\n\nNickname: `Wedding - Profile` · Tab: Shanks › Wedding\n\nInputs\n\n| Name | Nickname | Type | Access | Default | Description |\n|---|---|---|---|---|---|\n| Asset _(optional)_ | `Asset` | Generic | item | — | Ring profile asset |\n| Height _(optional)_ | `Height` | Number | item | `2.0` | Profile height |\n| Width _(optional)_ | `Width` | Number | item | `3.0` | Profile width |\n\nOutputs\n\n| Name | Nickname | Type | Access | Description |\n|---|---|---|---|---|\n| Wedding Profile Params | `P` | Generic | item | Wedding profile parameters |","metadata":{"title":"Wedding","section":"Wedding - Profile","url":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---profile","source":"https://www.rhinoartisan.com/docs/grasshopper/components/shanks/wedding/#wedding---profile","collection":"grasshopper","hash":"294919849d7e5a9efe0e941feae17fd1","indexed_by":"docs-index"}},{"content":"How a definition is built\n\nThere are more than 240 components, but only a handful of patterns. Once you can tell which family a component belongs to, its ports explain themselves — and the reference becomes a lookup rather than a reading list.\n\nThe four families\nAlmost every component is one of these:\n\n| Family | How to recognise it | What it does |\n|---|---|---|\n| Parameter | Named `Something - … Parameters` or `… Params` | Bundles a set of related settings into one value. |\n| Builder | Named after the thing itself — `Classic`, `Halo`, `Bezel`, `Bail` | Takes parameter bundles and produces geometry. |\n| Reader | In the Readers tab, or named `… Reader` | Unpacks a bundle or a JSON section back into individual values. |\n| Value list | A dropdown with no inputs | Offers the valid values for a text or numeric input. |\n\nThe rest are supporting cast: assets, exporters, manufacturing sprues and utilities, all in the Artisan tab.","metadata":{"title":"How a definition is built","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/","collection":"grasshopper","hash":"9e27a07754bc05d2d0aec0db581b53c2","indexed_by":"docs-index"}},{"content":"How a definition is built — Parameters go in bundles\n\nA ring has too many settings to be one row of inputs, so they are grouped. Classic does not take twenty numbers — it takes a Top Profile bundle, a Mid Profile bundle, an External Profile bundle, an Advanced bundle and a Gems bundle, each built by its own parameter component.\n\nThis matters for how they behave: a parameter component only passes on the inputs you actually connect. Set carat on `Classic - Gems Parameters` and leave the rest alone, and the bundle carries carat and nothing else — every other setting keeps the builder's own default. You never have to fill in a component to use one part of it.\n\nThe same applies to builders. Every input on `Classic` is optional; drop it on the canvas with nothing wired in and it still produces a ring.","metadata":{"title":"How a definition is built","section":"Parameters go in bundles","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#parameters-go-in-bundles","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#parameters-go-in-bundles","collection":"grasshopper","hash":"db83760f6c4d73ccae508a404310e7a4","indexed_by":"docs-index"}},{"content":"How a definition is built — Builders produce more than geometry\n\nA builder's first outputs are the obvious ones — `BReps` for the metal, `Gems` and `Meshes` for the stones, kept separate so you can render, price or export them apart. Three more are worth knowing:\n\n- Magnet points. Points at the top and bottom centre of the bounding box, and at the top of the finger-size circle. They are the anchors you snap another part to, so a head lands on a shank without measuring.\n- Taxonomy. The complete parameter set of what was built, as a dictionary. This is what the Readers tab consumes, and what a configurator stores to rebuild the piece later.\n- Semantic. A plain-language description of the piece — the sentence a product page or a quote shows to a customer.\n\nBuilders also take a Computation Mode, `RENDER` or `MANUFACTURING`. The same definition produces presentation geometry or production geometry depending on which you pass; the `Computation Mode` value list (Artisan › Value List) gives you the two valid strings.","metadata":{"title":"How a definition is built","section":"Builders produce more than geometry","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#builders-produce-more-than-geometry","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#builders-produce-more-than-geometry","collection":"grasshopper","hash":"4723264bd9bae16e24d1418eea392bdd","indexed_by":"docs-index"}},{"content":"How a definition is built — Readers run the chain backwards\n\nReaders exist because the interesting inputs often arrive as data rather than as slider values — from a configurator, an order, or another part of the definition. They come in two levels.\n\nSection readers (Readers › Global) take a whole JSON job and split it up. `Global Reader` pulls out the job-level flags — which formats to generate, the computation mode, the manufacturer. `Shank Reader` pulls out style, material and diameter, and hands back the Classic or Cathedral settings as a dictionary of their own.\n\nGroup readers (Readers › Shanks, Readers › Gemsets) take one of those dictionaries and expand it into individual values. `Classic Adv Reader` turns the Classic dictionary into opening type, cut length, cut bumping and the rest — each on its own output, ready to wire into a parameter component.\n\nChained together the two levels give you the automation path end to end:\n\n```\nJSON job\n  → Global Reader        (what to generate, which mode)\n  → Shank Reader         (style, material, diameter, sub-dictionaries)\n  → Classic Adv Reader   (individual values)\n  → Classic - … Params   (bundled back up)\n  → Classic              (geometry + taxonomy + semantic)\n  → Exporters            (3DM · STL · GLB · technical chart · SKU)\n```\n\nEvery builder also accepts a JSON input directly, so you can skip the middle of that chain when you do not need to alter anything on the way through.","metadata":{"title":"How a definition is built","section":"Readers run the chain backwards","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#readers-run-the-chain-backwards","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#readers-run-the-chain-backwards","collection":"grasshopper","hash":"5ed5c7ac2420d04dcdd70dfeaaca4ad8","indexed_by":"docs-index"}},{"content":"How a definition is built — Named assets, not redrawn profiles\n\nProfile components in Artisan › Assets — `Ring Profile by Name`, `Bezel Profile by Name`, `Halo Profile by Name` and the others — fetch a profile from RhinoArtisan's asset library by name instead of making you rebuild the curve. They read the library that the RhinoArtisan plug-in installs, so the profiles available on the canvas are the same ones available in RhinoArtisan itself.","metadata":{"title":"How a definition is built","section":"Named assets, not redrawn profiles","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#named-assets-not-redrawn-profiles","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#named-assets-not-redrawn-profiles","collection":"grasshopper","hash":"c40ed63fd0ce9f4b88a69d40d8a49682","indexed_by":"docs-index"}},{"content":"How a definition is built — Ring sizes are diameters\n\nEvery shank component takes a ring diameter in millimetres, never a local size. The nineteen ring size value lists (Shanks › Ring Sizes) do the conversion: pick USA, Europe, Japan or any of the others, choose a size in that system, and the list outputs the diameter to wire in. Swapping the list swaps the sizing system without touching anything downstream.","metadata":{"title":"How a definition is built","section":"Ring sizes are diameters","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#ring-sizes-are-diameters","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#ring-sizes-are-diameters","collection":"grasshopper","hash":"29779092c1230cfc1e0a285710e53f38","indexed_by":"docs-index"}},{"content":"How a definition is built — Where a definition ends\n\nThe Artisan › Exporters group turns a result into deliverables: 3DM, STL and GLB, each as a file on disk or as a base64 string when the output is going straight into another application. Alongside them sit the non-geometry exports — technical charts, the semantic description, the taxonomy, SKU generation and comparison, and UI files.\n\nFor casting, Artisan › Manufacturing builds the sprue tree — single sprues, inner branches, and full inner and external trees.","metadata":{"title":"How a definition is built","section":"Where a definition ends","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#where-a-definition-ends","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#where-a-definition-ends","collection":"grasshopper","hash":"2d4104cc8e806565b080ecbc7b6bad7c","indexed_by":"docs-index"}},{"content":"How a definition is built — Next\n\nComponent reference — every component in every tab, with its exact inputs, outputs, types and defaults.","metadata":{"title":"How a definition is built","section":"Next","url":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#next","source":"https://www.rhinoartisan.com/docs/grasshopper/concepts/#next","collection":"grasshopper","hash":"a8ddf42312a221340594489c1c6ab06b","indexed_by":"docs-index"}},{"content":"Getting started — Requirements\n\n- RhinoArtisan 7, installed and licensed. Artisan for Grasshopper is part of RhinoArtisan 7 and included in its license — nothing extra to buy. The components share RhinoArtisan's engine, check its license when they solve, and read its asset library (profiles, gem data).\n- Rhino 8 for Windows, on Windows 10 or 11. The plug-in is built against the Rhino 8 and Grasshopper 8 APIs; it does not load in Rhino 7 or earlier. Grasshopper comes with Rhino 8 — run the `Grasshopper` command to open it.\n- Someone at the seat. Your license covers definitions you run and supervise yourself. Solving them on a server — Rhino.Compute, Hops, Rhino.Inside, Windows Server or any unattended job — needs an Automation license; definitions your customers drive, such as a web configurator, need an OEM agreement. See what your license covers.","metadata":{"title":"Getting started","section":"Requirements","url":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#requirements","source":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#requirements","collection":"grasshopper","hash":"f76f2492f9a81e1d488dd0f33d909aa8","indexed_by":"docs-index"}},{"content":"Getting started — Install\n\nThere is nothing extra to install: the RhinoArtisan 7 installer registers Artisan for Grasshopper with Grasshopper.\n\n1. Install RhinoArtisan 7 on a machine that has Rhino 8.\n2. Start Rhino and run `Grasshopper`. Six new tabs appear at the end of the ribbon: Artisan, Gems, Gemset, Shanks, Accessories, Readers.\n\nNo tabs? The installer registers the components for the Windows account that ran it, with a small `RhinoArtisan.ghlink` file in Grasshopper's components folder (File → Special Folders → Components Folder). Working from another account? Create that file in your own components folder with one line — the RhinoArtisan folder, by default `C:\\Program Files\\RhinoArtisan 7\\Rhino 8\\net48` — and restart Rhino. Don't copy `ArtisanGrasshopper.gha` in there by hand: two copies of the library make Grasshopper report a file conflict at every start.","metadata":{"title":"Getting started","section":"Install","url":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#install","source":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#install","collection":"grasshopper","hash":"ae05861c347a9388827474c315df41f0","indexed_by":"docs-index"}},{"content":"Getting started — Your first ring\n\nA shank builder is the shortest path to geometry, because every one of its inputs is optional. Drop a Classic component (Shanks › Classic) on the canvas and it already produces a ring using the plug-in's default profiles.\n\nFrom there, three steps make it parametric:\n\n1. Set a finger size. Drop a Ring Sizes value list (Shanks › Ring Sizes) — pick the system your customers use, USA or Europe or British — and wire it into Classic's Ring Diameter. The list outputs a diameter in millimetres, which is what every shank component expects. Change the dropdown and the ring resizes.\n\n2. Shape the band. Add Classic - Profile (Shanks › Classic) and wire its output into Classic's Top Profile. This is a *parameter component*: it bundles a set of related settings into one value. Only the inputs you actually connect are applied — anything you leave alone keeps the builder's own default.\n\n3. Add stones. Add Classic - Gems Parameters and wire it into Classic's Gems input, then set carat and shape on it. Classic's Gems and Meshes outputs carry the stones as separate geometry from the metal, so you can render or export them apart.","metadata":{"title":"Getting started","section":"Your first ring","url":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#your-first-ring","source":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#your-first-ring","collection":"grasshopper","hash":"0c4243d2861a432b2bd3c51d0e2eae80","indexed_by":"docs-index"}},{"content":"Getting started — Getting something out\n\nThe BReps output is Rhino geometry — bake it, or keep working with it in Grasshopper. When you want a deliverable instead, the Artisan › Exporters group takes it from there: `Exporter 3DM Files`, `Exporter Manufacturing STL` for casting, `Exporter GLB Files` for the web, or the base64 variants when the result is going straight into an application rather than onto disk.\n\nTwo other outputs are worth knowing about early. Taxonomy is the ring's full parameter set as a dictionary — feed it to the matching component in the Readers tab to read any single value back out. Semantic is a plain-language sentence describing what was built, which is what a configurator or a product listing shows to a customer.","metadata":{"title":"Getting started","section":"Getting something out","url":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#getting-something-out","source":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#getting-something-out","collection":"grasshopper","hash":"ea80a0bb76c3486f2f4b9938a7b719cd","indexed_by":"docs-index"}},{"content":"Getting started — Next\n\nHow a definition is built explains the four families of component and the pattern they share — the fastest way to make sense of the full reference.","metadata":{"title":"Getting started","section":"Next","url":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#next","source":"https://www.rhinoartisan.com/docs/grasshopper/getting-started/#next","collection":"grasshopper","hash":"be0855a8acd2fc41d40db46733536ec5","indexed_by":"docs-index"}},{"content":"Overview\n\nArtisan for Grasshopper puts the RhinoArtisan jewelry engine on the Grasshopper canvas. The same rings, settings and stones you build with the RhinoArtisan commands become components you can wire together, drive from sliders, and rebuild automatically when a value changes.\n\nIncluded in your RhinoArtisan 7 license. Artisan for Grasshopper installs with RhinoArtisan 7 and runs on your license — no extra module to buy. Servers and customer-facing systems are licensed differently: see what your license covers.","metadata":{"title":"Overview","url":"https://www.rhinoartisan.com/docs/grasshopper/","source":"https://www.rhinoartisan.com/docs/grasshopper/","collection":"grasshopper","hash":"d10f599bdfa6cbfe3eabc412431ddfb9","indexed_by":"docs-index"}},{"content":"Overview — What it is\n\nA Grasshopper plug-in with more than 240 components spread across six ribbon tabs. Between them they cover a complete piece: the shank, the stones, the settings that hold them, the accessories, and the export formats you hand to a renderer, a customer or a caster.\n\nNothing here is a re-implementation. The components call the same geometry kernel as RhinoArtisan itself, so a Classic ring built on the canvas is the same Classic ring built from the toolbar — only now its diameter, profile and stone size are inputs you can vary.","metadata":{"title":"Overview","section":"What it is","url":"https://www.rhinoartisan.com/docs/grasshopper/#what-it-is","source":"https://www.rhinoartisan.com/docs/grasshopper/#what-it-is","collection":"grasshopper","hash":"8dad32f2e22c66464218d91b2412d14e","indexed_by":"docs-index"}},{"content":"Overview — The six tabs\n\n| Tab | What it holds |\n|---|---|\n| Artisan | Assets, exporters, manufacturing sprues, value lists and the utilities that hold a definition together. |\n| Gems | Individual stones, created by carat, by millimetre size or by shape. |\n| Gemset | The settings that place and hold stones — bezels, baskets, halos, prongs, channels and rails. |\n| Shanks | Ring bodies: classic, cathedral, eternity, signet, bypass, wedding and the rest. |\n| Accessories | Bails, beads, charms, milgrain and rope details. |\n| Readers | Components that unpack a result back into its individual values. |\n\nThe tabs are ordered deliberately — Artisan, Gems, Gemset, Shanks, Accessories, Readers — and the plug-in moves them to sit together at the end of the Grasshopper ribbon, after the native tabs.","metadata":{"title":"Overview","section":"The six tabs","url":"https://www.rhinoartisan.com/docs/grasshopper/#the-six-tabs","source":"https://www.rhinoartisan.com/docs/grasshopper/#the-six-tabs","collection":"grasshopper","hash":"db92296d648eace477e29dd333b2ea94","indexed_by":"docs-index"}},{"content":"Overview — What it is good for\n\n- Collections instead of one-offs. Define a ring once, then drive finger size, stone carat and profile from inputs and generate the whole size run or the whole stone range.\n- Configurator data. Every builder emits a taxonomy dictionary and a semantic description alongside its geometry — the data a product configurator, a SKU and a spec sheet feed on. Generate that data and the models on your own seats; a configurator that runs Artisan live for your customers is an OEM case.\n- Production files, automatically. The exporters write 3DM, STL and GLB — as files or as base64 strings — plus technical charts, so a definition can end in the deliverables rather than in a model you still have to export by hand.\n- Manufacturing prep. Sprue components build the casting tree, and every builder accepts a computation mode so the same definition can produce render geometry or manufacturing geometry.","metadata":{"title":"Overview","section":"What it is good for","url":"https://www.rhinoartisan.com/docs/grasshopper/#what-it-is-good-for","source":"https://www.rhinoartisan.com/docs/grasshopper/#what-it-is-good-for","collection":"grasshopper","hash":"16db8383f3cbc57259c9c0f1866f65ce","indexed_by":"docs-index"}},{"content":"Overview — What your license covers\n\nArtisan for Grasshopper is licensed like the Scripting API and MCP: it is one of RhinoArtisan's automation interfaces, and what decides the license is who runs the definition, and for whom — not the operating system, and not whether the software lets it run.\n\n| Use | License |\n|---|---|\n| Definitions your team runs and supervises in Rhino, on its own seats: collections, size runs, exports, configurator data | Included in your RhinoArtisan 7 license |\n| Definitions solved with nobody at the seat — Rhino.Compute, Hops, Rhino.Inside, scheduled or queued jobs, any server — even for internal use | Automation license |\n| Definitions your customers or any other third party drive — a web configurator, a hosted API, a Grasshopper hosting platform | OEM agreement |\n\nSelling the jewelry, models, renders and files you make with it is never restricted. The full terms are in the EULA; for Automation and OEM, talk to us.","metadata":{"title":"Overview","section":"What your license covers","url":"https://www.rhinoartisan.com/docs/grasshopper/#what-your-license-covers","source":"https://www.rhinoartisan.com/docs/grasshopper/#what-your-license-covers","collection":"grasshopper","hash":"7b979ece94c96dce44191b53c17ca5a4","indexed_by":"docs-index"}},{"content":"Overview — Where to go next\n\n- Getting started — check the requirements and build your first ring.\n- How a definition is built — the four kinds of component and how they chain together. Read this before the reference.\n- Component reference — every component, with the exact ports it exposes.\n\nBeta. Artisan for Grasshopper is one of the RhinoArtisan 7 beta features: components get added and inputs can still change between releases. If a definition matters in production, keep that machine on a fixed RhinoArtisan version and test before you update.\n\nBuilding Grasshopper workflows for your company? Standard RhinoArtisan support covers the product itself — installation, licensing and how its tools work. For architecture, automation and development questions around what your team builds with Artisan Grasshopper, RhinoArtisan Support Plus gives you direct access to our technical team.","metadata":{"title":"Overview","section":"Where to go next","url":"https://www.rhinoartisan.com/docs/grasshopper/#where-to-go-next","source":"https://www.rhinoartisan.com/docs/grasshopper/#where-to-go-next","collection":"grasshopper","hash":"0c7646e1f399bdad8a87fa099dbdfd1f","indexed_by":"docs-index"}},{"content":"What does RhinoArtisan offer that standalone Rhino does not?\n\nRhinoArtisan speeds up and simplifies jewelry 3D modeling. It adds thousands of pre-designed shapes, jewelry-specific tools and parametric control — drastically cutting design time compared to line-by-line Rhino modeling.\n\nWhat you get depends on your profile. Pick the one that fits you best to see the details, or browse the full feature list.\n\n* For designers — more creative range, more precision, more output.\n* For manufacturers — your entire production workflow, automated.\n* For retailers — turn your store into a live showroom.\n* All features — every capability in one place.","metadata":{"title":"What does RhinoArtisan offer that standalone Rhino does not?","url":"https://www.rhinoartisan.com/faq/licensing/#what-does-rhinoartisan-offer-that-standalone-rhino-does-not","source":"https://www.rhinoartisan.com/faq/licensing/#what-does-rhinoartisan-offer-that-standalone-rhino-does-not","collection":"faq","hash":"e00a58156e2393c650f20a04532ee1a6","indexed_by":"docs-index"}},{"content":"How can I purchase RhinoArtisan?\n\nTo acquire RhinoArtisan, simply access the website and go to the Buy section at https://www.rhinoartisan.com/buy","metadata":{"title":"How can I purchase RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/licensing/#how-can-i-purchase-rhinoartisan","source":"https://www.rhinoartisan.com/faq/licensing/#how-can-i-purchase-rhinoartisan","collection":"faq","hash":"73d2ae32633579e14970aeef183cabf2","indexed_by":"docs-index"}},{"content":"Can I buy RhinoArtisan through a reseller?\n\nYes — RhinoArtisan is available through a network of authorized resellers around the world. Find the one closest to you on our resellers page.\n\nFind a reseller near you","metadata":{"title":"Can I buy RhinoArtisan through a reseller?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-buy-rhinoartisan-through-a-reseller","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-buy-rhinoartisan-through-a-reseller","collection":"faq","hash":"d3ba9f8c497ef01399d84a60cc52e2bc","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan include Rhino?\n\nWe offer two versions of RhinoArtisan: RhinoArtisan 6.0 Full Edition, which includes Rhino, and RhinoArtisan 6.0 for Rhino Users, perfect for those who already have Rhino. For more information and pricing, please visit www.rhinoartisan.com/buy.\n\nRhinoArtisan works on Rhino 8.0 for Windows. More details...","metadata":{"title":"Does RhinoArtisan include Rhino?","url":"https://www.rhinoartisan.com/faq/licensing/#does-rhinoartisan-include-rhino","source":"https://www.rhinoartisan.com/faq/licensing/#does-rhinoartisan-include-rhino","collection":"faq","hash":"419838e8e9531bfdb24d0b00be58e67d","indexed_by":"docs-index"}},{"content":"How to move my license to another computer\n\nIn order to activate your RhinoArtisan license on a new computer, you must first deactivate it on the old one. To desactivate your license please follow the next steps:\n\nIn Rhino or RhinoArtisan, run the command: ArtisanLicense or click on the toolbar:\n\nRhinoArtisan License Wizard will appear. Next click the Deactivate your license button, and then click the Deactivate button.\n\nYour license has been deactivated, and can now be activated on another computer.\n\nTo know how to activate it, click here...\n\nIf your license configuration allows it, you can also use Rhino Cloud Zoo so RhinoArtisan moves with you across different computers without having to deactivate and reactivate every time. Learn more about Cloud Zoo.","metadata":{"title":"How to move my license to another computer","url":"https://www.rhinoartisan.com/faq/licensing/#how-to-move-my-license-to-another-computer","source":"https://www.rhinoartisan.com/faq/licensing/#how-to-move-my-license-to-another-computer","collection":"faq","hash":"1d6e7b0de80f98ef7a8977bc7ef9b808","indexed_by":"docs-index"}},{"content":"My trial license has expired. Can I extend it?\n\nTechnically, no — trial licenses can't be extended. In most cases the 15-day trial is more than enough time to see the value RhinoArtisan brings to your workflow.\n\nIf it wasn't enough for you, you can go ahead and purchase a license — and if it turns out not to be the right fit, you have 15 days to request a refund. You'll find the details in our refund policy.","metadata":{"title":"My trial license has expired. Can I extend it?","url":"https://www.rhinoartisan.com/faq/licensing/#my-trial-license-has-expired-can-i-extend-it","source":"https://www.rhinoartisan.com/faq/licensing/#my-trial-license-has-expired-can-i-extend-it","collection":"faq","hash":"156eb7f66da747aa5cedd922a8ddc306","indexed_by":"docs-index"}},{"content":"Do you offer student licenses?\n\nYes, for students of RhinoArtisan Schools: schools, universities and training centers with an active RhinoArtisan Lab License.\n\nThe Educational license costs €1,000 (excl. VAT) and is perpetual: a one-time payment, no expiry and no maintenance fees. It includes every RhinoArtisan online course and every RhinoArtisan 7 minor update (major releases are not included). It covers RhinoArtisan only (Rhino 7 or 8 is not included) and it's for learning and training, not for commercial work. Support comes through Ask, our AI assistant; our team steps in only for license issues.\n\nSchools equip a whole classroom with a Lab License: 30 users from a single perpetual license.\n\nStudent licenses","metadata":{"title":"Do you offer student licenses?","url":"https://www.rhinoartisan.com/faq/licensing/#do-you-offer-student-licenses","source":"https://www.rhinoartisan.com/faq/licensing/#do-you-offer-student-licenses","collection":"faq","hash":"b6a64dc3ffb2c6ee382ba5093ee5fdfc","indexed_by":"docs-index"}},{"content":"Who is RhinoArtisan for?\n\nRhinoArtisan is designed for jewelry designers, manufacturers, retailers and educational institutions. Each profile uses it differently:\n\n* Designers — to create faster, iterate variations and use jewelry-specific tools.\n* Manufacturers — to prepare production-ready files and feed downstream systems.\n* Retailers — to co-design with customers in-store and present designs visually.\n* Schools — to teach professional jewelry CAD on industry-standard software.\n\n* For designers\n* For manufacturers\n* For retailers\n* For schools","metadata":{"title":"Who is RhinoArtisan for?","url":"https://www.rhinoartisan.com/faq/licensing/#who-is-rhinoartisan-for","source":"https://www.rhinoartisan.com/faq/licensing/#who-is-rhinoartisan-for","collection":"faq","hash":"0c9778043040bb74147648b3f5261298","indexed_by":"docs-index"}},{"content":"What does RhinoArtisan offer if I come from RhinoGold, MatrixGold or another jewelry CAD?\n\nRhinoArtisan is a modern solution for 3D jewelry design — created by the founder of RhinoGold and developed by 2Shapes. If you already use another jewelry CAD, RhinoArtisan lets you keep working in a Rhino-based environment, with updated tools, new features and a workflow focused on design, manufacturing and commercial presentation.\n\nIf you're coming from MatrixGold, Matrix, 3Design or RhinoGold, you may also be eligible for our Competitive Upgrade offer.\n\nCompetitive Upgrade — 20% off","metadata":{"title":"What does RhinoArtisan offer if I come from RhinoGold, MatrixGold or another jewelry CAD?","url":"https://www.rhinoartisan.com/faq/licensing/#what-does-rhinoartisan-offer-if-i-come-from-rhinogold-matrixgold-or-another-jewelry-cad","source":"https://www.rhinoartisan.com/faq/licensing/#what-does-rhinoartisan-offer-if-i-come-from-rhinogold-matrixgold-or-another-jewelry-cad","collection":"faq","hash":"355e5201605349dc7f562fc0448a8998","indexed_by":"docs-index"}},{"content":"What are the benefits of RhinoArtisan for designers?\n\nRhinoArtisan helps designers work faster, test variations more easily, and use tools created specifically for jewelry. Its parametric components let you modify ring sizes, gemstones, settings, profiles and other elements without rebuilding the model from scratch.\n\nRhinoArtisan for designers","metadata":{"title":"What are the benefits of RhinoArtisan for designers?","url":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-designers","source":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-designers","collection":"faq","hash":"00cb91c9763f412e8670be5cb931d534","indexed_by":"docs-index"}},{"content":"What are the benefits of RhinoArtisan for manufacturers?\n\nRhinoArtisan helps manufacturers prepare models for production, organize technical information and reduce errors in the workflow. You can generate gemstone lists, reports, manufacturing data and exports useful for internal processes or integration with other systems.\n\nRhinoArtisan for manufacturers","metadata":{"title":"What are the benefits of RhinoArtisan for manufacturers?","url":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-manufacturers","source":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-manufacturers","collection":"faq","hash":"c7bf3a6c2d9c170a011f2c4223221072","indexed_by":"docs-index"}},{"content":"What are the benefits of RhinoArtisan for retailers?\n\nRhinoArtisan lets retailers deliver a more visual, personalized and professional sales experience. You can present designs, change options together with the customer, and turn ideas into clear, viable models ready to move toward production.\n\nRhinoArtisan for retailers","metadata":{"title":"What are the benefits of RhinoArtisan for retailers?","url":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-retailers","source":"https://www.rhinoartisan.com/faq/licensing/#what-are-the-benefits-of-rhinoartisan-for-retailers","collection":"faq","hash":"ad198edb82c045370bedcc0926d3344b","indexed_by":"docs-index"}},{"content":"Do I need to buy Rhino if I already have a license?\n\nNo. If you already have a compatible Rhino license (Rhino 7 or Rhino 8), you can use it with RhinoArtisan — no need to buy Rhino again.","metadata":{"title":"Do I need to buy Rhino if I already have a license?","url":"https://www.rhinoartisan.com/faq/licensing/#do-i-need-to-buy-rhino-if-i-already-have-a-license","source":"https://www.rhinoartisan.com/faq/licensing/#do-i-need-to-buy-rhino-if-i-already-have-a-license","collection":"faq","hash":"c1bc1cc8f983da97ce8460d0bc24b538","indexed_by":"docs-index"}},{"content":"Can I use my RhinoArtisan license in Cloud Zoo?\n\nYes. Cloud Zoo is McNeel's license system for Rhino: it lets you and your team access your licenses from anywhere, online or offline, without checking licenses in and out. It's free to set up through your Rhino Account and works for both individual users and organizations sharing a pool of licenses.\n\nYou'll find the full step-by-step on adding RhinoArtisan to Cloud Zoo in our docs.\n\nCloud Zoo — full guide","metadata":{"title":"Can I use my RhinoArtisan license in Cloud Zoo?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-use-my-rhinoartisan-license-in-cloud-zoo","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-use-my-rhinoartisan-license-in-cloud-zoo","collection":"faq","hash":"523e3e39cc87ea0de60d201ae343b4e0","indexed_by":"docs-index"}},{"content":"What is the Competitive Upgrade License?\n\nThe Competitive Upgrade License is designed for users coming from another jewelry CAD — such as MatrixGold, RhinoGold, Matrix or 3Design — and lets them access RhinoArtisan under special conditions.\n\nSee the Competitive Upgrade offer","metadata":{"title":"What is the Competitive Upgrade License?","url":"https://www.rhinoartisan.com/faq/licensing/#what-is-the-competitive-upgrade-license","source":"https://www.rhinoartisan.com/faq/licensing/#what-is-the-competitive-upgrade-license","collection":"faq","hash":"fc90ce1a10a4e866755d61f4b0584c16","indexed_by":"docs-index"}},{"content":"Does the Competitive Upgrade License include Rhino?\n\nNo. The Competitive Upgrade License does not include Rhino. You'll need to purchase Rhino separately if you don't already have a compatible license.","metadata":{"title":"Does the Competitive Upgrade License include Rhino?","url":"https://www.rhinoartisan.com/faq/licensing/#does-the-competitive-upgrade-license-include-rhino","source":"https://www.rhinoartisan.com/faq/licensing/#does-the-competitive-upgrade-license-include-rhino","collection":"faq","hash":"d389c6d06b82232e6873995c0e44350d","indexed_by":"docs-index"}},{"content":"Is RhinoArtisan suitable for jewelry schools?\n\nYes. RhinoArtisan is well suited to jewelry schools and training centers: it's easier to learn than many traditional CAD tools, offers Lab Licenses that cover a full classroom, and gives students access to the same professional workflows used in the industry.\n\nRhinoArtisan for Schools","metadata":{"title":"Is RhinoArtisan suitable for jewelry schools?","url":"https://www.rhinoartisan.com/faq/licensing/#is-rhinoartisan-suitable-for-jewelry-schools","source":"https://www.rhinoartisan.com/faq/licensing/#is-rhinoartisan-suitable-for-jewelry-schools","collection":"faq","hash":"59ed064a7990be25adc74dde1ea7f015","indexed_by":"docs-index"}},{"content":"Who can buy a Lab School license?\n\nLab School licenses are reserved exclusively for officially recognised jewelry schools. They cannot be purchased by individuals, studios or companies, even when the buyer's intent is teaching.\n\nAny government accredited school can order Lab Licenses on a school purchase order or procurement card. Provide one of the following with your order:\n\n- The school's tax exemption certificate.\n- A faculty or staff pay stub from the current school term. You may redact any sensitive information (salary, personal ID, address) — we only need to verify the institution and the term.\n\nOnce we confirm the documentation, the order moves forward and we issue the Lab License. If you have any doubts about eligibility, contact us before purchasing and we will guide you through the right path for your institution.","metadata":{"title":"Who can buy a Lab School license?","url":"https://www.rhinoartisan.com/faq/licensing/#who-can-buy-a-lab-school-license","source":"https://www.rhinoartisan.com/faq/licensing/#who-can-buy-a-lab-school-license","collection":"faq","hash":"bc9a371220a21da6d06ab864365ba8ba","indexed_by":"docs-index"}},{"content":"What kind of technical support is included?\n\nRhinoArtisan includes email technical support at no additional cost — for customers, schools, resellers and even users testing the demo version. If you run into trouble, our team is here to help.\n\nStudent Educational licenses are the exception: they are supported by Ask, our AI assistant, which answers questions at any time. Our team steps in only for license issues, such as activation or access.","metadata":{"title":"What kind of technical support is included?","url":"https://www.rhinoartisan.com/faq/licensing/#what-kind-of-technical-support-is-included","source":"https://www.rhinoartisan.com/faq/licensing/#what-kind-of-technical-support-is-included","collection":"faq","hash":"2208a109bb85caf479b7a169d0b5b63a","indexed_by":"docs-index"}},{"content":"Are updates included?\n\nRhinoArtisan releases major updates periodically. Some updates may involve an additional cost depending on your license and version. Most users choose to update so they keep benefiting from the latest tools and improvements.","metadata":{"title":"Are updates included?","url":"https://www.rhinoartisan.com/faq/licensing/#are-updates-included","source":"https://www.rhinoartisan.com/faq/licensing/#are-updates-included","collection":"faq","hash":"868b216431134ffca2c9de5efc247262","indexed_by":"docs-index"}},{"content":"How often are major RhinoArtisan versions released?\n\nMajor versions are released when they introduce significant product advances. RhinoArtisan 7.0 will arrive in September and will mark a new stage for the platform.","metadata":{"title":"How often are major RhinoArtisan versions released?","url":"https://www.rhinoartisan.com/faq/licensing/#how-often-are-major-rhinoartisan-versions-released","source":"https://www.rhinoartisan.com/faq/licensing/#how-often-are-major-rhinoartisan-versions-released","collection":"faq","hash":"f53559c9b01b7ed3c2a5f0195a1e1d5b","indexed_by":"docs-index"}},{"content":"How much does it cost to upgrade to RhinoArtisan 7?\n\nThe price depends on the version you are upgrading from.\n\nFrom RhinoArtisan 6 — the upgrade costs €850. Until 18 October 2026 it is available at the launch price of €550.\n\nFrom RhinoArtisan 5 (any version, 5.0 through 5.4) — the upgrade costs €1,450, or €1,150 until 18 October 2026.\n\nBoth commercial and educational RhinoArtisan 6 or 5 licenses qualify, and the upgrade is always a commercial RhinoArtisan 7 license. Upgrades are perpetual, one-time payments, and they don't include Rhino: you keep using the Rhino 7 or Rhino 8 license you already have.\n\nHow to upgrade: sign in to your account. Every eligible RhinoArtisan 6 or 5 license shows an Upgrade to RhinoArtisan 7 button that takes you straight to checkout. Your RhinoArtisan 7 key is issued automatically the moment the payment goes through, and your previous license stays valid for 30 days after the upgrade, so you can move your projects over at your own pace.\n\nIf you are not sure which version your licence covers, run the ArtisanAbout command in Rhino, or contact us and we will check it for you.","metadata":{"title":"How much does it cost to upgrade to RhinoArtisan 7?","url":"https://www.rhinoartisan.com/faq/licensing/#how-much-does-it-cost-to-upgrade-to-rhinoartisan-7","source":"https://www.rhinoartisan.com/faq/licensing/#how-much-does-it-cost-to-upgrade-to-rhinoartisan-7","collection":"faq","hash":"debff23de7e84f410a4389b2b20d8928","indexed_by":"docs-index"}},{"content":"I bought RhinoArtisan 6 shortly before 7 came out. Do I get 7 for free?\n\nYes. Commercial licenses purchased within the six months before the launch of RhinoArtisan 7 are eligible for a free upgrade to RhinoArtisan 7.\n\nSign in to your account: an eligible license shows Free upgrade to RhinoArtisan 7 included, with a Request free upgrade button. Press it and our team issues your RhinoArtisan 7 key by email within one business day.\n\nOne thing to know before you press it: the RhinoArtisan 7 license replaces your RhinoArtisan 6 license, which is revoked when the new key is issued. With the paid upgrade, by contrast, your 6 license stays valid for 30 more days.\n\nIf you think your purchase qualifies but your account doesn't show the free upgrade, contact us with your order details and we'll check it.","metadata":{"title":"I bought RhinoArtisan 6 shortly before 7 came out. Do I get 7 for free?","url":"https://www.rhinoartisan.com/faq/licensing/#i-bought-rhinoartisan-6-shortly-before-7-came-out-do-i-get-7-for-free","source":"https://www.rhinoartisan.com/faq/licensing/#i-bought-rhinoartisan-6-shortly-before-7-came-out-do-i-get-7-for-free","collection":"faq","hash":"3aeef2fbe930cdc614b5e742dbb5a35a","indexed_by":"docs-index"}},{"content":"Can I keep using RhinoArtisan 6.8 after upgrading to 7?\n\nFor a while, yes. When you buy the upgrade, RhinoArtisan 7 comes with its own product key and your RhinoArtisan 6.8 license stays valid for 30 days after the upgrade, so you can finish open projects and move your files over at your own pace. After those 30 days the 6.8 license is retired.\n\nIf your upgrade is the free one for recent purchases, the RhinoArtisan 7 license replaces the 6.8 one as soon as the new key is issued.","metadata":{"title":"Can I keep using RhinoArtisan 6.8 after upgrading to 7?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-keep-using-rhinoartisan-6-8-after-upgrading-to-7","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-keep-using-rhinoartisan-6-8-after-upgrading-to-7","collection":"faq","hash":"c2edae808ff89780f54bb93302621b0b","indexed_by":"docs-index"}},{"content":"Can we use RhinoArtisan on several computers?\n\nYes. RhinoArtisan can be installed on as many computers as you need, and each authorised user signs in with their own account.\n\nThat also covers one person working from different machines — say, a desktop at the studio and a laptop on the go. You sign in with your account and occupy one of your team's available licenses while you're using RhinoArtisan.\n\nHow many people can use the software at the same time is determined by the number of licenses in your company's team.","metadata":{"title":"Can we use RhinoArtisan on several computers?","url":"https://www.rhinoartisan.com/faq/licensing/#can-we-use-rhinoartisan-on-several-computers","source":"https://www.rhinoartisan.com/faq/licensing/#can-we-use-rhinoartisan-on-several-computers","collection":"faq","hash":"67afc1aee95ffe5b1ae82fe3a6baf143","indexed_by":"docs-index"}},{"content":"Do we need a license per person, per computer, or per company?\n\nNeither per person nor per computer. Licenses are managed through a company team: you invite as many users as you need — no individual license per member — and the number of licenses determines how many people can use RhinoArtisan simultaneously.\n\nAvailable licenses are assigned on a first-come basis: when a user opens RhinoArtisan they take a license, and when they stop using it, it returns to the pool for the next person.\n\nThis is especially flexible when some people use the software daily and others only occasionally. For example, a company with six users — two regulars and four occasional — could work comfortably with three licenses, as long as no more than three people need RhinoArtisan at the same moment.","metadata":{"title":"Do we need a license per person, per computer, or per company?","url":"https://www.rhinoartisan.com/faq/licensing/#do-we-need-a-license-per-person-per-computer-or-per-company","source":"https://www.rhinoartisan.com/faq/licensing/#do-we-need-a-license-per-person-per-computer-or-per-company","collection":"faq","hash":"709deb50136faf6a14fbbd9b8478c761","indexed_by":"docs-index"}},{"content":"How do I activate RhinoArtisan on a new computer?\n\nInstall Rhino and RhinoArtisan on the new machine and sign in with your account — that's it.\n\nThe process is automatic: when you open RhinoArtisan, the system checks whether a license is available in your company's team and assigns it to you while you use the software. There's nothing to transfer manually from one computer to another.\n\nOur team can also help you with the installation and the initial setup of users and devices — just ask.","metadata":{"title":"How do I activate RhinoArtisan on a new computer?","url":"https://www.rhinoartisan.com/faq/licensing/#how-do-i-activate-rhinoartisan-on-a-new-computer","source":"https://www.rhinoartisan.com/faq/licensing/#how-do-i-activate-rhinoartisan-on-a-new-computer","collection":"faq","hash":"d23fba58a9ff4b40145e292b2b3629fc","indexed_by":"docs-index"}},{"content":"Are the online courses included with the license?\n\nCourses aren't normally bundled with the license.\n\nHowever, promotional offers sometimes include them — our current offer includes access to all RhinoArtisan online courses at no extra cost. Check the latest offer or contact us to confirm what's included right now.","metadata":{"title":"Are the online courses included with the license?","url":"https://www.rhinoartisan.com/faq/licensing/#are-the-online-courses-included-with-the-license","source":"https://www.rhinoartisan.com/faq/licensing/#are-the-online-courses-included-with-the-license","collection":"faq","hash":"e7dc65a679a4f88e81f858800b0fe36d","indexed_by":"docs-index"}},{"content":"Can I automate my work with the Scripting API or MCP?\n\nYes. Your license includes the Scripting API, MCP and the Artisan for Grasshopper components for your own work: batch a collection, connect your ERP, drive RhinoArtisan from your AI assistant, run a whole size range from one definition.\n\nOne rule: every running RhinoArtisan needs its licensed seat, with you at the keyboard. Processes that run without a person at the seat — overnight queues, server jobs — need an Automation license instead.\n\nRhinoArtisan EULA","metadata":{"title":"Can I automate my work with the Scripting API or MCP?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-automate-my-work-with-the-scripting-api-or-mcp","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-automate-my-work-with-the-scripting-api-or-mcp","collection":"faq","hash":"8c2b4314c403221481e12dff65610602","indexed_by":"docs-index"}},{"content":"Is Artisan for Grasshopper included in my license?\n\nYes. Artisan for Grasshopper — more than 240 jewelry components for the Grasshopper canvas — installs with RhinoArtisan 7 and runs on your RhinoArtisan license, like the Scripting API and MCP. It needs Rhino 8.\n\nYour license covers definitions your team runs and supervises on its own seats. Solving them with nobody at the seat — Rhino.Compute, Hops, Rhino.Inside, any server or queue — needs an Automation license, and a definition your customers drive, such as a web configurator, needs an OEM agreement.\n\nWhat your license covers","metadata":{"title":"Is Artisan for Grasshopper included in my license?","url":"https://www.rhinoartisan.com/faq/licensing/#is-artisan-for-grasshopper-included-in-my-license","source":"https://www.rhinoartisan.com/faq/licensing/#is-artisan-for-grasshopper-included-in-my-license","collection":"faq","hash":"a0b778364579e006995a4d22a122a4de","indexed_by":"docs-index"}},{"content":"Can I run RhinoArtisan unattended — overnight queues or a build server?\n\nThat's Unattended Use — execution without a person at the licensed seat — and it's covered by a separate Automation license, not by the standard seat.\n\nIf you're planning scheduled jobs, processing queues or server-side pipelines, contact us and we'll set you up.\n\nIt's the same whatever runs it — a script, an AI assistant through MCP or a Grasshopper definition — and wherever it runs: Windows Server, a cloud machine, a workstation in a rack, Rhino.Compute, Hops or Rhino.Inside. If nobody is at the seat supervising, it's Unattended Use, even for purely internal work. If your customers or other third parties drive it, it needs an OEM agreement instead.\n\nTalk to us about Automation","metadata":{"title":"Can I run RhinoArtisan unattended — overnight queues or a build server?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-run-rhinoartisan-unattended-overnight-queues-or-a-build-server","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-run-rhinoartisan-unattended-overnight-queues-or-a-build-server","collection":"faq","hash":"cf027a978d3104f120ba16aeb4b35326","indexed_by":"docs-index"}},{"content":"Can I build a web service or customer configurator on RhinoArtisan?\n\nNot with a standard license. Anything where third parties — including your own customers — drive RhinoArtisan through an app, website or hosted API needs an OEM agreement. That includes a Grasshopper definition with Artisan components served to them through Rhino.Compute, Hops or a Grasshopper hosting platform.\n\nTo be clear: selling the jewelry, designs, renders and documents you create with RhinoArtisan is your normal use and is never restricted — including models and data you generate on your own seats and publish in your own catalogue or configurator. The line is who operates the software: your people may; systems serving third parties need an OEM agreement. We do these — talk to us.\n\nTalk to us about OEM","metadata":{"title":"Can I build a web service or customer configurator on RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/licensing/#can-i-build-a-web-service-or-customer-configurator-on-rhinoartisan","source":"https://www.rhinoartisan.com/faq/licensing/#can-i-build-a-web-service-or-customer-configurator-on-rhinoartisan","collection":"faq","hash":"db1175d17b2a7387ccb73daaf4df6525","indexed_by":"docs-index"}},{"content":"Why are MCP and the Scripting API labeled Beta?\n\nThey're new in 7.0 and we're refining their surface with real-world use. They work today, and they're included with your seat — but names and signatures may still change until they graduate to a stable v1. After that, changes come with versioning and a deprecation window: deprecated interfaces keep working for at least six months. The same goes for Flow Studio AI and the Artisan for Grasshopper components.\n\nThe current list of beta features lives in RhinoArtisan Labs.\n\nRhinoArtisan Labs","metadata":{"title":"Why are MCP and the Scripting API labeled Beta?","url":"https://www.rhinoartisan.com/faq/licensing/#why-are-mcp-and-the-scripting-api-labeled-beta","source":"https://www.rhinoartisan.com/faq/licensing/#why-are-mcp-and-the-scripting-api-labeled-beta","collection":"faq","hash":"8d9aacc1861bcd2ba0714539e40a5a55","indexed_by":"docs-index"}},{"content":"How can I install RhinoArtisan?\n\nIn this documentation we have a section that shows you how to download, install and activate your licence.\n\nHow to download, install and activate your license","metadata":{"title":"How can I install RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#how-can-i-install-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-can-i-install-rhinoartisan","collection":"faq","hash":"3495e679b567e593e530bb946fcc9b2a","indexed_by":"docs-index"}},{"content":"How do I activate my RhinoArtisan license?\n\nIt's very simple. When you buy RhinoArtisan — even for the evaluation — you receive a product key, and activating it only takes a moment from inside Rhino or RhinoArtisan.\n\nYou'll find the complete step-by-step in the License page.\n\nLicense — how to activate","metadata":{"title":"How do I activate my RhinoArtisan license?","url":"https://www.rhinoartisan.com/faq/#how-do-i-activate-my-rhinoartisan-license","source":"https://www.rhinoartisan.com/faq/#how-do-i-activate-my-rhinoartisan-license","collection":"faq","hash":"2f7eee949f1da0a607aff54de14e1af0","indexed_by":"docs-index"}},{"content":"How can I update Rhino?\n\nHaving Rhinoceros installed with the most recent version is crucial for stability and security reasons. Here is how to check if you have the latest version and how to update it.\n\nIn the Help menu, click on Check for Updates...\n\nThe following window will show you if you have the latest version. Please check the Enable Updates and Usage Statistics option is enabled.\n\nYou can also buy it manually by clicking on Check Now...","metadata":{"title":"How can I update Rhino?","url":"https://www.rhinoartisan.com/faq/#how-can-i-update-rhino","source":"https://www.rhinoartisan.com/faq/#how-can-i-update-rhino","collection":"faq","hash":"0f335cae76cd0c9811c54e88f2c16427","indexed_by":"docs-index"}},{"content":"How can I update RhinoArtisan?\n\nRhinoArtisan will display a message in your command prompt whenever there's an update available to download. If you see this message and close RhinoArtisan, the update process will begin.\n\nEvery time we eject Rhino or RhinoArtisan, if we have an internet connection, it will check if there is a new version available.\n\n### RhinoArtisan User Interface\n\nYou can also update RhinoArtisan manually by clicking on the Update button on the File tab.\n\n### Rhino User Interface\n\nThe upgrade option is also available in Rhino.\n\nRhinoArtisan will download and wait for us to close Rhino or RhinoArtisan.","metadata":{"title":"How can I update RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#how-can-i-update-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-can-i-update-rhinoartisan","collection":"faq","hash":"13a44dc091e39665310ca757a58ff85c","indexed_by":"docs-index"}},{"content":"Do I need previous CAD experience to use RhinoArtisan?\n\nNo. RhinoArtisan is built to make jewelry design easier and more accessible. You can pick up the essential tools quickly thanks to its intuitive interface, while more advanced workflows can be mastered with training, videos and technical support.\n\nCourses, tutorials and video lessons","metadata":{"title":"Do I need previous CAD experience to use RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#do-i-need-previous-cad-experience-to-use-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#do-i-need-previous-cad-experience-to-use-rhinoartisan","collection":"faq","hash":"77cadb4212dad321b26c2f506d117385","indexed_by":"docs-index"}},{"content":"How long does it take to learn RhinoArtisan?\n\nYou can learn the essential tools quickly — even in a single day for the basics. More advanced jewelry techniques take longer, but RhinoArtisan offers training resources and technical support to help you progress.\n\nCourses, tutorials and video lessons","metadata":{"title":"How long does it take to learn RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#how-long-does-it-take-to-learn-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-long-does-it-take-to-learn-rhinoartisan","collection":"faq","hash":"ac0e58427366368f061902b2ba34bad9","indexed_by":"docs-index"}},{"content":"What does RhinoArtisan offer to schools and educational institutions?\n\nRhinoArtisan offers an accessible way to introduce students to 3D jewelry design. Its jewelry-specific tools let students learn professional design, modeling and production-preparation workflows without starting from a completely generic CAD environment.\n\nRhinoArtisan for Schools","metadata":{"title":"What does RhinoArtisan offer to schools and educational institutions?","url":"https://www.rhinoartisan.com/faq/#what-does-rhinoartisan-offer-to-schools-and-educational-institutions","source":"https://www.rhinoartisan.com/faq/#what-does-rhinoartisan-offer-to-schools-and-educational-institutions","collection":"faq","hash":"429f3970733a7585d214d52d6ffaa228","indexed_by":"docs-index"}},{"content":"Do I need to know Rhino before learning RhinoArtisan?\n\nPrevious Rhino experience isn't required — but RhinoArtisan runs inside Rhino, so it's worth learning Rhino's basic concepts along the way.\n\nOur training combines Rhino's general tools with RhinoArtisan's jewelry-specific commands, so you pick up both in a single, structured path.\n\nCourses, tutorials and video lessons","metadata":{"title":"Do I need to know Rhino before learning RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#do-i-need-to-know-rhino-before-learning-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#do-i-need-to-know-rhino-before-learning-rhinoartisan","collection":"faq","hash":"ed333d9425194338cb7d4d9dae272277","indexed_by":"docs-index"}},{"content":"Is RhinoArtisan a good fit for a business starting from zero in CAD?\n\nYes — as long as someone in the team takes ownership of learning and using the software consistently.\n\nRhinoArtisan is designed specifically for jewelry, with visual tools, component libraries and parametric commands that remove much of the initial complexity of generic CAD platforms.\n\nFor a team starting from scratch, we recommend a structured learning path built on our courses, videos, tutorials and documentation, backed by our technical support.","metadata":{"title":"Is RhinoArtisan a good fit for a business starting from zero in CAD?","url":"https://www.rhinoartisan.com/faq/#is-rhinoartisan-a-good-fit-for-a-business-starting-from-zero-in-cad","source":"https://www.rhinoartisan.com/faq/#is-rhinoartisan-a-good-fit-for-a-business-starting-from-zero-in-cad","collection":"faq","hash":"26d02f7f8c75649091ea0f88866fd4d4","indexed_by":"docs-index"}},{"content":"What are the minimum system requirements?\n\nRhinoArtisan runs comfortably on most modern computers, but there's a baseline you'll want to meet for a smooth experience. You'll find the full list — processor, RAM, graphics card, operating system and supported Rhino versions — in our system requirements page.\n\nSystem Requirements","metadata":{"title":"What are the minimum system requirements?","url":"https://www.rhinoartisan.com/faq/#what-are-the-minimum-system-requirements","source":"https://www.rhinoartisan.com/faq/#what-are-the-minimum-system-requirements","collection":"faq","hash":"f6540caf99f21e8edf6372622a557bb8","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan work on Mac?\n\nAt the moment, RhinoArtisan is optimized exclusively for Rhino on Windows. Rhino for Windows provides certain features and capabilities required for the plugin to deliver the best possible performance and functionality.\n\nUnfortunately, Rhino for Mac does not yet include all the necessary features, which currently prevents us from offering a compatible macOS version.\n\nFor now, our focus is on continuing to improve and expand RhinoArtisan on Windows. However, we are closely following the development of Rhino for Mac, and we do not rule out the possibility of a Mac version in the future as the platform evolves.","metadata":{"title":"Does RhinoArtisan work on Mac?","url":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-work-on-mac","source":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-work-on-mac","collection":"faq","hash":"56657b490803a634f44d4ae32dec183f","indexed_by":"docs-index"}},{"content":"Rhino 8 and .NET Core 7: What Does It Mean?\n\nWith the release of Rhino 8, the developers have updated the .NET libraries to Core 7, bringing a significant improvement in performance compared to Rhino 7.0. This upgrade not only enhances user experience but also unlocks new possibilities to make the most of the software’s capabilities.\n\nAt RhinoArtisan, we’ve ensured that version 6.0 is fully aligned with Rhino’s recommendations, allowing you to enjoy seamless integration and optimal performance with both.\n\nFor compatibility reasons, Rhino 8 offers the option to run at reduced performance using the older .NET Framework 4.8 libraries, ensuring that plugins that haven’t been updated can still function. However, this creates an important limitation: Rhino 8 does not support the simultaneous use of both libraries. This means that if you are using a plugin based on the older libraries, Rhino will be unable to load other plugins that rely on the newer ones.\n\nWe strongly recommend reaching out to the developers of any plugins that have not yet been updated to request compatibility with the new libraries. It would be a shame to have Rhino 8 and not fully benefit from its capabilities.\n\nIf you have any questions or need assistance, please don’t hesitate to contact us. We’re here to help.\n\nFind more technical documentation on Rhino Official Website: https://developer.rhino3d.com/guides/rhinocommon/moving-to-dotnet-7/#advantages-of-net-core-for-rhino","metadata":{"title":"Rhino 8 and .NET Core 7: What Does It Mean?","url":"https://www.rhinoartisan.com/faq/#rhino-8-and-net-core-7-what-does-it-mean","source":"https://www.rhinoartisan.com/faq/#rhino-8-and-net-core-7-what-does-it-mean","collection":"faq","hash":"dcf7320375155845bc69e47e61bebaf3","indexed_by":"docs-index"}},{"content":"How can I know which version of Rhino I'm using?\n\nYou can see your Rhino version inside Rhino. Click on the Help menu and About Rhino:\n\nIn the right-bottom area of the window, you will see the version. In our case is Rhino 7.0 SR19.","metadata":{"title":"How can I know which version of Rhino I'm using?","url":"https://www.rhinoartisan.com/faq/#how-can-i-know-which-version-of-rhino-i-m-using","source":"https://www.rhinoartisan.com/faq/#how-can-i-know-which-version-of-rhino-i-m-using","collection":"faq","hash":"2dcc82677e76cb8e275ae0273e9848db","indexed_by":"docs-index"}},{"content":"What version of RhinoArtisan I'm using?\n\nSometimes, our technical support team needs to know exactly which version you have installed on your computer. The main reason is that, in many cases, when a user reports a question or problem, it has already been fixed in later versions.\n\n### Command Prompt\n\nWhen Rhino or RhinoArtisan opens, it displays the exact version at the command prompt.\n\n### Rhino User Interface\n\nIn the RhinoArtisan toolbar, you can find the About icon on the right hand side.\n\nYou can also check your current version by executing the command ArtisanAbout, which will open a window similar to this one:\n\n### RhinoArtisan User Interface\n\nIn the RhinoArtisan user interface, you will find the same icon, in this case in the top right corner:","metadata":{"title":"What version of RhinoArtisan I'm using?","url":"https://www.rhinoartisan.com/faq/#what-version-of-rhinoartisan-i-m-using","source":"https://www.rhinoartisan.com/faq/#what-version-of-rhinoartisan-i-m-using","collection":"faq","hash":"68aea26b1317761c9e30ecb510cd837a","indexed_by":"docs-index"}},{"content":"What are the minimum recommended graphics card requirements?\n\nWe recommend a dedicated graphics card with at least 4 GB of VRAM for smoother performance — especially with complex models, advanced visualization or scenes with many gemstones.\n\nFor the full hardware and software requirements, see the system requirements page.\n\nSystem Requirements","metadata":{"title":"What are the minimum recommended graphics card requirements?","url":"https://www.rhinoartisan.com/faq/#what-are-the-minimum-recommended-graphics-card-requirements","source":"https://www.rhinoartisan.com/faq/#what-are-the-minimum-recommended-graphics-card-requirements","collection":"faq","hash":"79425fa9c99856a91d0391e6fa5cc260","indexed_by":"docs-index"}},{"content":"Rhino doesn't load RhinoArtisan. What can I do?\n\nThere are three reasons why Rhino does not load RhinoArtisan:\n\n## 1. Rhino is not updated:\n\nRhinoArtisan requires Rhino 7, 8 or 9.\n\nLet's check what Rhino version we are using. To do this, we will open Rhino, in the menu Help > Check for Updates...&#x20;\n\n## 2. Diagnotics & Repair\n\nSome updates or plugins may leave residual entries in Rhino's registry, which can lead to conflicts and unexpected behavior. Over time, these leftover settings might interfere with new versions of the software or cause instability when loading third-party extensions.\n\nHow to execture Diagnostics & Repair:\n\nHere are the steps:\n\n1. Double-click the RhinoArtisan icon on your desktop.\n\n2. In the RhinoArtisan start menu, click Diagnostics & Repair, located on the lower left side.\n\n3. When asked _“Do you want to clean Windows registry of Rhino and Artisan?”_, answer Yes.\n4. When asked _“Do you want to delete the Artisan user folder?”_, answer Yes.\n5. When asked _“Do you want to check your connection to the Artisan license server?”_, answer Yes. (This step is to check if a firewall is blocking the license verification).\n\nOnce this process is complete, restart Rhino. It will launch as if it were a fresh installation, clearing any registry issues that might have prevented the RhinoArtisan plugin from loading properly.\n\n## 3. Send Us Your System Information\n\nIf the problem persists after following the steps above, please try typing SetDotNetRuntime in Rhino’s command line and select NetCore.\n\n\\ If the issue continues, run the same command again and change the NetCoreVersion from v7 to v8, then restart Rhino.","metadata":{"title":"Rhino doesn't load RhinoArtisan. What can I do?","url":"https://www.rhinoartisan.com/faq/#rhino-doesn-t-load-rhinoartisan-what-can-i-do","source":"https://www.rhinoartisan.com/faq/#rhino-doesn-t-load-rhinoartisan-what-can-i-do","collection":"faq","hash":"27c6ec8c4295c32e68c36bbb67595b22","indexed_by":"docs-index"}},{"content":"Rhino doesn't load RhinoArtisan. What can I do?\n\nIf the problem still persists after following the steps above, we recommend sending us your Rhino system information so we can analyze your configuration and identify the possible cause of the issue.\n\nTo extract this information, follow these steps:\n\n1. Open Rhino and type SystemInfo in the command line.\n2. Press Enter, and Rhino will generate a detailed report about your system configuration, including information about your graphics card, OpenGL settings, and other system parameters.\n3. Copy or save this information and send it to us via email at support@rhinoartisan.com.\n\nOur team will review your system details and help you find a solution to the issue.\n\n## 4. Rhino Installation Problem\n\nIn some cases, there may be problems installing Rhino, so at this point, we recommend uninstalling and reinstalling it. We will have a clean installation, which will make Rhino run much faster and be able to load plugins.\n\nTo uninstall Rhino, please check Rhinoceros documentation. https://wiki.mcneel.com/rhino/uninstalling","metadata":{"title":"Rhino doesn't load RhinoArtisan. What can I do?","url":"https://www.rhinoartisan.com/faq/#rhino-doesn-t-load-rhinoartisan-what-can-i-do","source":"https://www.rhinoartisan.com/faq/#rhino-doesn-t-load-rhinoartisan-what-can-i-do","collection":"faq","hash":"39f9c50638e28aad8ccdbf21a580ec6f","indexed_by":"docs-index"}},{"content":"How can I remove the RhinoArtisan license from Rhino Options > Licenses?\n\nYes. You can manually remove the RhinoArtisan license files from your computer.\n\nFollow these steps:\n\n1. Open Windows File Explorer.\n2. Browse to the following folder:\n\n```\n%appdata%\\McNeel\\Rhinoceros\\6.0\\License Manager\\Licenses\n```\n\n3. You will probably find several license files in this folder.\\ Delete all the files inside.\n4. Then browse to:\n\n```\n%programdata%\\McNeel\\Rhinoceros\\6.0\\License Manager\\Licenses\n```\n\n5. You will probably find one license file in this folder.\\ Delete all the files inside.\n\nAfter removing these files, restart Rhino. The RhinoArtisan license should no longer appear under Options > Licenses.","metadata":{"title":"How can I remove the RhinoArtisan license from Rhino Options > Licenses?","url":"https://www.rhinoartisan.com/faq/#how-can-i-remove-the-rhinoartisan-license-from-rhino-options-licenses","source":"https://www.rhinoartisan.com/faq/#how-can-i-remove-the-rhinoartisan-license-from-rhino-options-licenses","collection":"faq","hash":"4e8e62dac2eb58c3906aace2fb122c95","indexed_by":"docs-index"}},{"content":"How to display the toolbar?\n\nTo display the RhinoArtisan toolbar, go to the Window menu and, within the menu, select Toolbars...\n\nIn the \"Toolbars and toolbar groups\" section, select Artisan. This will display all the toolbars, then select the one called Artisan.\n\nDone! This toolbar works like any other Rhino toolbar; locate it wherever you prefer.","metadata":{"title":"How to display the toolbar?","url":"https://www.rhinoartisan.com/faq/#how-to-display-the-toolbar","source":"https://www.rhinoartisan.com/faq/#how-to-display-the-toolbar","collection":"faq","hash":"efe3ff17aeb67e3a6c4143c38e48a109","indexed_by":"docs-index"}},{"content":"What should I do if RhinoArtisan does not load after installation?\n\nFirst, make sure you're using a compatible version of Rhino — preferably Rhino 8. If the problem persists, run the SystemInfo command in Rhino and send the output to our support team so we can review your system configuration.\n\nContact support","metadata":{"title":"What should I do if RhinoArtisan does not load after installation?","url":"https://www.rhinoartisan.com/faq/#what-should-i-do-if-rhinoartisan-does-not-load-after-installation","source":"https://www.rhinoartisan.com/faq/#what-should-i-do-if-rhinoartisan-does-not-load-after-installation","collection":"faq","hash":"2b4f87c925c307b602bf3d4aac02f79d","indexed_by":"docs-index"}},{"content":"Why does everything on my screen look white?\n\nAn advanced display mode such as Raytraced may have been accidentally activated. Switch the view back to a standard mode like Shaded to return to a lighter and more stable display.","metadata":{"title":"Why does everything on my screen look white?","url":"https://www.rhinoartisan.com/faq/#why-does-everything-on-my-screen-look-white","source":"https://www.rhinoartisan.com/faq/#why-does-everything-on-my-screen-look-white","collection":"faq","hash":"6e6aa718f939e0e2b1e74814b1a0129a","indexed_by":"docs-index"}},{"content":"My objects appear in silver or gold instead of layer colors. How can I change this?\n\nThis is usually caused by the display mode or the Outliner panel settings. Review the active display mode and switch the display settings if you want to see layer colors rather than a rendered metal appearance.","metadata":{"title":"My objects appear in silver or gold instead of layer colors. How can I change this?","url":"https://www.rhinoartisan.com/faq/#my-objects-appear-in-silver-or-gold-instead-of-layer-colors-how-can-i-change-this","source":"https://www.rhinoartisan.com/faq/#my-objects-appear-in-silver-or-gold-instead-of-layer-colors-how-can-i-change-this","collection":"faq","hash":"561bac41a4279841d22d8b6ed92c42bc","indexed_by":"docs-index"}},{"content":"I can't log in to RhinoArtisan.com or reset my password. What can I do?\n\nAfter a recent website migration, some previous passwords were not transferred for security reasons. Use the password reset option to set a new one.\n\nIf the reset link doesn't work, try opening it in an incognito window or another browser to rule out cache or cookie issues.","metadata":{"title":"I can't log in to RhinoArtisan.com or reset my password. What can I do?","url":"https://www.rhinoartisan.com/faq/#i-can-t-log-in-to-rhinoartisan-com-or-reset-my-password-what-can-i-do","source":"https://www.rhinoartisan.com/faq/#i-can-t-log-in-to-rhinoartisan-com-or-reset-my-password-what-can-i-do","collection":"faq","hash":"08308bc0a114137a4001aef8b688807f","indexed_by":"docs-index"}},{"content":"What should I do if my license is stuck on a previous computer?\n\nIf you can't deactivate the license because the computer is no longer available — it's been formatted, replaced or simply isn't accessible — contact the support team. They'll review the case and manually release the license if applicable.\n\nContact support","metadata":{"title":"What should I do if my license is stuck on a previous computer?","url":"https://www.rhinoartisan.com/faq/#what-should-i-do-if-my-license-is-stuck-on-a-previous-computer","source":"https://www.rhinoartisan.com/faq/#what-should-i-do-if-my-license-is-stuck-on-a-previous-computer","collection":"faq","hash":"1fbfbff982cf5ac5100371f321631f15","indexed_by":"docs-index"}},{"content":"Is the AI Assistant available in RhinoArtisan 6.8?\n\nYes. Assistant is available in RhinoArtisan 6.8.0.3 and later for customers with a commercial license. Run the ArtisanAbout command in Rhino to check which version you have.\n\nSetup needs a short guided installation — Assistant runs entirely on your own computer, so the local AI engine and model have to be downloaded once. Our team walks you through it after your license is activated.\n\nIt is not available during the 15-day trial for that same reason. If you'd like to see Assistant before deciding, get in touch and we'll show it to you live.\n\nAssistant is currently in beta and under active development. See the Assistant documentation for what it does and what beta means.\n\nIn RhinoArtisan 7 the Assistant is built in, runs online and is part of the trial: see Assistant.","metadata":{"title":"Is the AI Assistant available in RhinoArtisan 6.8?","url":"https://www.rhinoartisan.com/faq/#is-the-ai-assistant-available-in-rhinoartisan-6-8","source":"https://www.rhinoartisan.com/faq/#is-the-ai-assistant-available-in-rhinoartisan-6-8","collection":"faq","hash":"2f21c287ab6f2c14c1461bd3e5cff2f9","indexed_by":"docs-index"}},{"content":"How to restore the user interface layout?\n\nRhinoArtisan's user interface is fully configurable, allowing you to adapt it to your taste. If, for some reason, you want to return to the original installation state, you must follow the steps below:\n\n1. Type in the command line: WindowLayout, and press enter.\n\nThe Window Layout window will appear. Then, double-click in Artisan, restoring us to its original layout.","metadata":{"title":"How to restore the user interface layout?","url":"https://www.rhinoartisan.com/faq/#how-to-restore-the-user-interface-layout","source":"https://www.rhinoartisan.com/faq/#how-to-restore-the-user-interface-layout","collection":"faq","hash":"42c1b22aa13425501b9d6607d8b38c37","indexed_by":"docs-index"}},{"content":"How to import textures on RhinoArtisan\n\nTo use custom textures on the Texture 3D command on RhinoArtisan, you will need to follow these steps:\n\n### 1. Open the User folder\n\nIn Rhino, you will find the icon User Folder on the RhinoArtisan toolbar\n\n### 2. Find and open the Texture3D folder:\n\n### 3. Drag and drop your texture on this folder\n\nCongratulations, the next time you run the Texture 3D command, you will be able to use your new texture!","metadata":{"title":"How to import textures on RhinoArtisan","url":"https://www.rhinoartisan.com/faq/#how-to-import-textures-on-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-to-import-textures-on-rhinoartisan","collection":"faq","hash":"d6cffe5a6dce71db0336cded421af061","indexed_by":"docs-index"}},{"content":"How can I learn to use RhinoArtisan?\n\nRhinoArtisan offers a comprehensive, learning platform that equips you with the essential skills needed to master RhinoArtisan . From command utilization to crafting one-of-a-kind models from scratch, our learning platform empowers you to unlock your full creative potential.\n\nhttps://www.rhinoartisan.com/learn","metadata":{"title":"How can I learn to use RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#how-can-i-learn-to-use-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-can-i-learn-to-use-rhinoartisan","collection":"faq","hash":"7bfb20fbdff9804871f85f6f2b072d4e","indexed_by":"docs-index"}},{"content":"How to disable the tripod?\n\nTo disable the tripod, go to Options > Artisan, and under Tripod, select None.\n\nIn Rhino and RhinoArtisan UI, you can access to options running the command Options","metadata":{"title":"How to disable the tripod?","url":"https://www.rhinoartisan.com/faq/#how-to-disable-the-tripod","source":"https://www.rhinoartisan.com/faq/#how-to-disable-the-tripod","collection":"faq","hash":"936e9b05691d67159057e4d842c639dc","indexed_by":"docs-index"}},{"content":"How to modify a translation in RhinoArtisan?\n\nTo change any text in RhinoArtisan, we can do it from a single file. In the installation folder, we will find a folder called Languages, which is usually located at C:\\Program Files\\RhinoArtisan 6\\languages. Inside this folder, you will find a list of files named after each language; for example, in Italian it is \"it,\" in French it is \"fr,\" etc.\n\nRhinoArtisan is available in several languages, including English, German, French, Spanish, Italian, Portuguese, Russian, Chinese (simplified and traditional), Japanese, and Korean.\n\nThese files are in .json format and can be opened with any text editor. However, I would like to recommend that you try Visual Studio Code. This agile and completely free editor from Microsoft will allow you to view the content with colors that help you easily identify each word.\n\nYou can obtain Visual Studio Code for free through this link: https://code.visualstudio.com/.\n\nAs you can see, there is blue text that serves as the identifier, and we should not change this. What we need to modify is the text that follows, which is in salmon color.\n\nImportant: Windows does not allow you to modify files within the Program Files folder.\n\nIt is important to note that Windows does not allow you to modify files within the Program Files folder. Therefore, I recommend copying the file to your desktop or Documents so that you can edit it without any issues. Afterwards, you simply need to copy it back into the Languages folder.\n\nIf you have any questions, please contact us to support@rhinoartisan.com","metadata":{"title":"How to modify a translation in RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#how-to-modify-a-translation-in-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#how-to-modify-a-translation-in-rhinoartisan","collection":"faq","hash":"7b7bd1db4e98fdc19216678ade711b8d","indexed_by":"docs-index"}},{"content":"How can I reduce the size of a large 3D file?\n\nTo shrink a heavy 3D file, use the Reduce Mesh command found in the Manufacturing tab. It simplifies dense mesh geometry while keeping the overall shape intact.\n\nFor SubD objects, the Remesh option works especially well — it rebuilds the topology with fewer faces, which usually cuts the file size by a significant margin.","metadata":{"title":"How can I reduce the size of a large 3D file?","url":"https://www.rhinoartisan.com/faq/#how-can-i-reduce-the-size-of-a-large-3d-file","source":"https://www.rhinoartisan.com/faq/#how-can-i-reduce-the-size-of-a-large-3d-file","collection":"faq","hash":"a9906f73f4ec72413f3a86324966d4be","indexed_by":"docs-index"}},{"content":"Is RhinoArtisan's real-time pricing reliable and adaptable?\n\nYes. The data follows official sources updated twice daily, and you can also replace it with your own suppliers' data to match how you price internally.","metadata":{"title":"Is RhinoArtisan's real-time pricing reliable and adaptable?","url":"https://www.rhinoartisan.com/faq/#is-rhinoartisan-s-real-time-pricing-reliable-and-adaptable","source":"https://www.rhinoartisan.com/faq/#is-rhinoartisan-s-real-time-pricing-reliable-and-adaptable","collection":"faq","hash":"acd105a71b24518ce328432e53412fe5","indexed_by":"docs-index"}},{"content":"Can I calculate prices inside RhinoArtisan?\n\nYes. RhinoArtisan includes real-time pricing tools that calculate costs based on jewelry components, materials, processes and either supplier price lists or live online sources.","metadata":{"title":"Can I calculate prices inside RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#can-i-calculate-prices-inside-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#can-i-calculate-prices-inside-rhinoartisan","collection":"faq","hash":"9cfba70b5cbf19e605730731430d991d","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan help prevent costly production errors?\n\nYes. RhinoArtisan ensures viable manufacturing outputs through STL tools, offers 3D-printing compatibility, and provides jewelry reports and live pricing — so no detail is overlooked before production.","metadata":{"title":"Does RhinoArtisan help prevent costly production errors?","url":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-help-prevent-costly-production-errors","source":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-help-prevent-costly-production-errors","collection":"faq","hash":"fa3403e09a96dbc90d3b27a390d1e128","indexed_by":"docs-index"}},{"content":"Can RhinoArtisan be used for manufacturing?\n\nYes. RhinoArtisan supports manufacturing workflows with production-ready files, STL repair tools, technical reports, jewel reports, material information and exportable data for manufacturing or ERP workflows.\n\nRhinoArtisan for manufacturers","metadata":{"title":"Can RhinoArtisan be used for manufacturing?","url":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-be-used-for-manufacturing","source":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-be-used-for-manufacturing","collection":"faq","hash":"adcb405a6a401cddf0269db68ed6c29b","indexed_by":"docs-index"}},{"content":"Can retailers use RhinoArtisan in-store with customers?\n\nYes. RhinoArtisan is built for in-store co-design: salespeople and customers can customize jewelry together in real time, visualize the changes and see updated pricing during the configuration process.\n\nRhinoArtisan for retailers","metadata":{"title":"Can retailers use RhinoArtisan in-store with customers?","url":"https://www.rhinoartisan.com/faq/#can-retailers-use-rhinoartisan-in-store-with-customers","source":"https://www.rhinoartisan.com/faq/#can-retailers-use-rhinoartisan-in-store-with-customers","collection":"faq","hash":"31fcafbeede2b01eeff38253d1e8a07c","indexed_by":"docs-index"}},{"content":"Can I create realistic images or videos with RhinoArtisan?\n\nYes. RhinoArtisan includes tools to produce high-quality renders and visual content for presentations, marketing, online stores or in-store sales.","metadata":{"title":"Can I create realistic images or videos with RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#can-i-create-realistic-images-or-videos-with-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#can-i-create-realistic-images-or-videos-with-rhinoartisan","collection":"faq","hash":"e1cd349c34f0763fde82449d6543258a","indexed_by":"docs-index"}},{"content":"Can RhinoArtisan help me modify existing designs?\n\nYes. RhinoArtisan allows flexible customization of jewelry designs — changing shape, color, gemstone type, size and other product attributes, depending on the design and workflow.","metadata":{"title":"Can RhinoArtisan help me modify existing designs?","url":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-help-me-modify-existing-designs","source":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-help-me-modify-existing-designs","collection":"faq","hash":"182526adecca7eb28e661abeb3df49d4","indexed_by":"docs-index"}},{"content":"Can RhinoArtisan be used without an internet connection?\n\nRhinoArtisan can work offline in certain scenarios, but some features need an internet connection — especially online services, connected libraries, license validation and cloud-related functionality. For the full experience, we recommend working with an internet connection.","metadata":{"title":"Can RhinoArtisan be used without an internet connection?","url":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-be-used-without-an-internet-connection","source":"https://www.rhinoartisan.com/faq/#can-rhinoartisan-be-used-without-an-internet-connection","collection":"faq","hash":"3e3cf5c8ccb86c6b7126a10eff17c72a","indexed_by":"docs-index"}},{"content":"Can I use Assistant in the RhinoArtisan 7 trial?\n\nYes. The Assistant is included in the 15-day trial of RhinoArtisan 7, with nothing extra to install: it runs online, so it works on any computer from the first launch.\n\nLike every AI tool in RhinoArtisan 7, it runs on your own account with an AI provider: create an OpenRouter account, add credit and paste the key into Options → Artisan → Integrations. The AI usage is billed by the provider, not by us, and RhinoArtisan adds no margin. The same goes for the other AI tools you can try during those 15 days: Generative AI Studio, including Text to 3D, works with your fal.ai key. Step by step in Accounts and API keys.\n\nThis is new in 7: the RhinoArtisan 6.8 trial didn't include the Assistant, because that version ran the AI locally and needed a guided installation.","metadata":{"title":"Can I use Assistant in the RhinoArtisan 7 trial?","url":"https://www.rhinoartisan.com/faq/#can-i-use-assistant-in-the-rhinoartisan-7-trial","source":"https://www.rhinoartisan.com/faq/#can-i-use-assistant-in-the-rhinoartisan-7-trial","collection":"faq","hash":"fed9dd4bcfa0dda5346abb1f732c5a64","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan run online or on my computer?\n\nRhinoArtisan is a desktop application that runs as a plugin inside Rhino. It doesn't run in a browser, and it doesn't depend on the cloud to design.\n\nAn internet connection is used mainly for:\n\n- Activating and validating your license.\n- Downloading updates.\n- Accessing online training.\n- Certain connected or AI-powered services.\n\nYour day-to-day modeling happens entirely on your computer.","metadata":{"title":"Does RhinoArtisan run online or on my computer?","url":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-run-online-or-on-my-computer","source":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-run-online-or-on-my-computer","collection":"faq","hash":"6205dc87bf0381bdde07ab6a625cb8ce","indexed_by":"docs-index"}},{"content":"Where are my designs stored — locally or in the cloud?\n\nDesigns are saved as standard Rhino files (normally `.3dm`), and you decide where they live: on your computer, an internal server, a shared drive, or a cloud storage service such as Google Drive, OneDrive or Dropbox.\n\nRhinoArtisan never forces you to store your designs in a proprietary cloud. Your files are yours, in an open format, wherever you keep them.\n\nWe can also offer complementary solutions for viewing or sharing selected models online — contact us if that's something your team needs.","metadata":{"title":"Where are my designs stored — locally or in the cloud?","url":"https://www.rhinoartisan.com/faq/#where-are-my-designs-stored-locally-or-in-the-cloud","source":"https://www.rhinoartisan.com/faq/#where-are-my-designs-stored-locally-or-in-the-cloud","collection":"faq","hash":"aca84686d138776e3b26dd4a31806362","indexed_by":"docs-index"}},{"content":"How do I share designs with clients and manufacturers?\n\nShare the original Rhino file, or export to another format depending on who receives it and what it's for:\n\n- Manufacturing / 3D printing — export production-ready files (e.g. STL).\n- Client visualization and approval — share renders, images or viewer files.\n- Internal teamwork — use a shared folder or your cloud storage system.\n\nBecause designs are standard Rhino files, they travel well between studios, workshops and production partners.","metadata":{"title":"How do I share designs with clients and manufacturers?","url":"https://www.rhinoartisan.com/faq/#how-do-i-share-designs-with-clients-and-manufacturers","source":"https://www.rhinoartisan.com/faq/#how-do-i-share-designs-with-clients-and-manufacturers","collection":"faq","hash":"8cfd3c99614f308328e7698fb740631b","indexed_by":"docs-index"}},{"content":"What types of jewelry can I create with RhinoArtisan?\n\nPractically any piece you can imagine, including:\n\n- Engagement rings\n- Wedding bands and matching bands\n- Pavé and micro-setting rings\n- Solitaires, halos and multi-stone designs\n- Prong, bezel, basket and other setting styles\n- Earrings\n- Pendants\n- Bracelets and bangles\n- Fully custom pieces built from scratch\n- Variations of existing designs\n- Models prepared for rendering, 3D printing or manufacturing\n\nOn top of RhinoArtisan's parametric tools and jewelry libraries, you have every general modeling tool in Rhino at your disposal.\n\nThe real limit usually isn't the software — it's manufacturing. A piece can be perfectly possible as a digital design and still need checking that it can be cast, printed, set, polished and produced correctly.","metadata":{"title":"What types of jewelry can I create with RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#what-types-of-jewelry-can-i-create-with-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#what-types-of-jewelry-can-i-create-with-rhinoartisan","collection":"faq","hash":"38b6658edb28ba8747fab3aa1353332f","indexed_by":"docs-index"}},{"content":"Are there design limitations I should know about before buying?\n\nThere's no fixed list of pieces that can't be designed — Rhino is an extremely flexible modeling platform, and organic, sculptural or artistic designs are all possible (some may call for more advanced Rhino or SubD techniques).\n\nThe two things worth knowing before you buy:\n\n1. It's a professional CAD tool. RhinoArtisan simplifies and automates a great deal of jewelry work, but you still need to learn to design properly and understand basic manufacturing requirements — minimum thicknesses, tolerances, casting, setting, polishing and how metals behave.\n2. Performance depends on your computer, especially with very complex designs, rendering, or AI features. Check the system requirements before purchasing.","metadata":{"title":"Are there design limitations I should know about before buying?","url":"https://www.rhinoartisan.com/faq/#are-there-design-limitations-i-should-know-about-before-buying","source":"https://www.rhinoartisan.com/faq/#are-there-design-limitations-i-should-know-about-before-buying","collection":"faq","hash":"9ba573ad304b7097786d1ad67c53856a","indexed_by":"docs-index"}},{"content":"Is the AI included in my RhinoArtisan license?\n\nThe AI features are included. The model usage is not.\n\nTools such as the Assistant, Flow Studio AI and Generative AI Studio connect to AI models run by outside providers. Those models cannot be packaged inside software by anyone: they run only on the provider's own infrastructure, and every request costs real money. You create an account with the provider and pay them directly for exactly what you use.\n\nWe could have bundled a small open-source model and called the AI included, but it would have been noticeably worse at the questions jewelers actually ask. We would rather give you access to the best models available at cost.\n\nFull detail in AI in RhinoArtisan.","metadata":{"title":"Is the AI included in my RhinoArtisan license?","url":"https://www.rhinoartisan.com/faq/#is-the-ai-included-in-my-rhinoartisan-license","source":"https://www.rhinoartisan.com/faq/#is-the-ai-included-in-my-rhinoartisan-license","collection":"faq","hash":"32dfc49f0a3cd29e4a212a317ce0584e","indexed_by":"docs-index"}},{"content":"Do I need to create accounts with other companies to use the AI?\n\nYes, for the AI features, and only for the ones you actually want to use.\n\n* OpenRouter covers the Assistant, Flow Studio AI and the Smart mode of File Search.\n* fal.ai covers Generative AI Studio (images, video and 3D).\n\nBoth take a few minutes to set up. You add credit, create a key, and paste it once into Options → Artisan → Integrations. From then on every feature that needs it simply works.\n\nIf you only want image generation you set up fal.ai alone, and the other way round.\n\nStep by step in Accounts and API keys.","metadata":{"title":"Do I need to create accounts with other companies to use the AI?","url":"https://www.rhinoartisan.com/faq/#do-i-need-to-create-accounts-with-other-companies-to-use-the-ai","source":"https://www.rhinoartisan.com/faq/#do-i-need-to-create-accounts-with-other-companies-to-use-the-ai","collection":"faq","hash":"0c8baf391ca713cd872c7e0e7e741700","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan take a cut of what I spend on AI?\n\nNo. Not a cent.\n\nYou pay the provider directly, at their published rate. We do not resell credits, we do not mark anything up, and we do not receive a share of what you spend. RhinoArtisan never sees your balance.\n\nThis is also why you get to choose your own model for each feature and move it up or down whenever you like. The billing is yours, so the choice is yours too.","metadata":{"title":"Does RhinoArtisan take a cut of what I spend on AI?","url":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-take-a-cut-of-what-i-spend-on-ai","source":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-take-a-cut-of-what-i-spend-on-ai","collection":"faq","hash":"a5e8b4586f780d38666e1e0a00cd5457","indexed_by":"docs-index"}},{"content":"Can I be charged more than I expect for AI usage?\n\nNo, because the balances are prepaid.\n\nYou add credit first and the tools draw it down. There is no monthly invoice arriving after the fact, and no subscription. When the balance reaches zero the AI features simply stop working until you top up again, so the most you can ever spend is the amount you have already put in.\n\nBoth providers also let you set spending limits and issue one key per machine, and both show a usage breakdown by model and by day.\n\nRhinoArtisan never makes AI calls on its own: every charge corresponds to something you asked for. Leaving the program open costs nothing.\n\nMore in Costs and spending.","metadata":{"title":"Can I be charged more than I expect for AI usage?","url":"https://www.rhinoartisan.com/faq/#can-i-be-charged-more-than-i-expect-for-ai-usage","source":"https://www.rhinoartisan.com/faq/#can-i-be-charged-more-than-i-expect-for-ai-usage","collection":"faq","hash":"1b5b3af3940c80db86a26bfb8f11e4db","indexed_by":"docs-index"}},{"content":"What works in RhinoArtisan without any AI account?\n\nEverything except the AI tools: the Assistant, Flow Studio AI, Generative AI Studio and the Smart mode of File Search. Searching your archive by file name works without one.\n\nAll modeling commands, gem studios and gemsets, shank builders, the manufacturing checks, 3D printing preparation, pricing breakdowns, technical documentation and reports, Curator and rendering work exactly as they always have. None of them contacts an outside provider.\n\nRhinoArtisan is a jewelry CAD program that has AI tools in it, not an AI product. If you never use those tools you never create an account and you never spend anything beyond your license.","metadata":{"title":"What works in RhinoArtisan without any AI account?","url":"https://www.rhinoartisan.com/faq/#what-works-in-rhinoartisan-without-any-ai-account","source":"https://www.rhinoartisan.com/faq/#what-works-in-rhinoartisan-without-any-ai-account","collection":"faq","hash":"b7394747d4c8c4f0b3eb31d56e91d899","indexed_by":"docs-index"}},{"content":"The AI didn't do what I expected. Is that a bug?\n\nIt depends on what failed. If a tool fails — MCP won't connect from the documented setup, a documented API call misbehaves, a generation errors out — that's on us: contact standard support.\n\nIf the tools work but your assistant made a poor decision, that's the nature of AI assistants: RhinoArtisan provides the tools; your assistant drives them, and results depend on the model and the prompt. Better prompts and the workflows shown in our docs get much better results.\n\nEither way: always review AI output professionally before manufacturing or quoting.\n\nRhinoArtisan MCP documentation","metadata":{"title":"The AI didn't do what I expected. Is that a bug?","url":"https://www.rhinoartisan.com/faq/#the-ai-didn-t-do-what-i-expected-is-that-a-bug","source":"https://www.rhinoartisan.com/faq/#the-ai-didn-t-do-what-i-expected-is-that-a-bug","collection":"faq","hash":"7cfb2e1520ee68a85f5cb42a5006c75c","indexed_by":"docs-index"}},{"content":"Does RhinoArtisan integrate with our existing production systems?\n\nYes. RhinoArtisan is designed to slot into existing production workflows. You can export to Excel or JSON to feed your ERP, MRP or any in-house system, so the data from your designs (gems, materials, weights, costs, parts) flows straight into the tools your team already uses.","metadata":{"title":"Does RhinoArtisan integrate with our existing production systems?","url":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-integrate-with-our-existing-production-systems","source":"https://www.rhinoartisan.com/faq/#does-rhinoartisan-integrate-with-our-existing-production-systems","collection":"faq","hash":"6853b1e38c9663f595c169180354bf1e","indexed_by":"docs-index"}},{"content":"How can I integrate RhinoArtisan into my printer's 3D printing software?\n\nWith RhinoArtisan, you can print on any printer on the market thanks to its repair and STL exporter.\n\nNext, we will see how to automate even more with the RhinoArtisan 3D printing command.\n\nLet's see what is the result of what we are going to do:\n\nBy default, we must select to indicate which application we want to use to print. In this case, we will use Chitubox, but the process is exactly the same for any printer.\n\nWe must discover where it is installed on our computer, so we will go to the application icon or a shortcut and right-click on Properties.\n\nIn the properties window, copy the Target content by right-clicking on the text.\n\nNow we will go to the RhinoArtisan options. In RhinoArtisan mode, click on Settings in the File tab.\n\nIn the case of Rhino, click on Rhino Options.\n\nSelect Artisan from the options on the left, and paste the path of the file we copied earlier. Click OK, and everything is ready!","metadata":{"title":"How can I integrate RhinoArtisan into my printer's 3D printing software?","url":"https://www.rhinoartisan.com/faq/#how-can-i-integrate-rhinoartisan-into-my-printer-s-3d-printing-software","source":"https://www.rhinoartisan.com/faq/#how-can-i-integrate-rhinoartisan-into-my-printer-s-3d-printing-software","collection":"faq","hash":"1600f7e7f3b41563448b6d01791af82a","indexed_by":"docs-index"}},{"content":"Can I use RhinoArtisan with KeyShot for rendering?\n\nYes — we have direct integration with KeyShot. In the Rendering tab you'll find a KeyShot button that automatically sends your geometry to KeyShot, so you can move from modeling to a professional render in one click.","metadata":{"title":"Can I use RhinoArtisan with KeyShot for rendering?","url":"https://www.rhinoartisan.com/faq/#can-i-use-rhinoartisan-with-keyshot-for-rendering","source":"https://www.rhinoartisan.com/faq/#can-i-use-rhinoartisan-with-keyshot-for-rendering","collection":"faq","hash":"b2a0275e5aa52ca6052e2edad29530f7","indexed_by":"docs-index"}},{"content":"How do I know if RhinoArtisan works with my 3D printer?\n\nThis is a very standard area. RhinoArtisan lets you export to STL — and even repair the STL if it has errors — so the file works with virtually any 3D printer on the market.\n\nOn top of that, RhinoArtisan ships with direct connectors to the most popular jewelry slicer apps. One click and your design opens in the slicer ready to print:\n\n* Asiga Composer\n* Formlabs Preform\n* 3D Systems Geomagic\n* Anycubic Workshop\n* B9 Captivate\n* Elegoo Chitubox — also a great option if you use a printer from another brand\n\nSee all 3D printing connectors","metadata":{"title":"How do I know if RhinoArtisan works with my 3D printer?","url":"https://www.rhinoartisan.com/faq/#how-do-i-know-if-rhinoartisan-works-with-my-3d-printer","source":"https://www.rhinoartisan.com/faq/#how-do-i-know-if-rhinoartisan-works-with-my-3d-printer","collection":"faq","hash":"ea0775dc2a1f9e9f6313ed244dd07e36","indexed_by":"docs-index"}},{"content":"What formats can I export my 3D model to from RhinoArtisan?\n\nGreat question — and the answer is reassuring. RhinoArtisan is a plugin for Rhino, so it doesn't handle saving and exporting itself: Rhino does. That has a big upside: your work is 100% compatible with native Rhino and with any other Rhino plugin, including Matrix, RhinoGold and MatrixGold.\n\nIn practice that means you can save and export to every format Rhino supports — `.3dm`, `.stl`, `.obj`, `.iges`, `.step`, `.fbx`, `.dwg`, `.dxf` and many more — using Rhino's standard Save As / Export commands.","metadata":{"title":"What formats can I export my 3D model to from RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#what-formats-can-i-export-my-3d-model-to-from-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#what-formats-can-i-export-my-3d-model-to-from-rhinoartisan","collection":"faq","hash":"7ca8e31edd406258a3d35dea772f843a","indexed_by":"docs-index"}},{"content":"Will someone help us get started and learn?\n\nYes — our team accompanies you through installation, activation, initial setup and the learning process, and answers any question that comes up in daily use. It's one of the services we're most proud of.\n\nSupport is personal: each license purchased includes one designated support contact. For example, a company with two licenses can name two people who contact our support team directly.\n\nFor customers with no previous experience, we recommend combining support with the training materials: support solves specific problems and doubts, while the courses, videos and tutorials teach you the complete design workflow.","metadata":{"title":"Will someone help us get started and learn?","url":"https://www.rhinoartisan.com/faq/#will-someone-help-us-get-started-and-learn","source":"https://www.rhinoartisan.com/faq/#will-someone-help-us-get-started-and-learn","collection":"faq","hash":"8673985cec8861c066051601e30e24c1","indexed_by":"docs-index"}},{"content":"How does technical support work?\n\nContact our team describing your question and include, where possible, screenshots, files or details of the process you're trying to complete.\n\nWe analyse whether the issue relates to RhinoArtisan itself, the installation, the license, the file, or your computer's configuration — and guide you from there.\n\nWe often reply with personalised videos: it's the clearest and fastest way to show how to use a command or resolve a specific doubt.","metadata":{"title":"How does technical support work?","url":"https://www.rhinoartisan.com/faq/#how-does-technical-support-work","source":"https://www.rhinoartisan.com/faq/#how-does-technical-support-work","collection":"faq","hash":"32d99bc6844ea83aef3ac1115912ac36","indexed_by":"docs-index"}},{"content":"What happens if RhinoArtisan has a problem?\n\nOur team reviews the case and tries to reproduce it.\n\nIf it's a configuration or installation issue, we help you fix it. If it turns out to be a software bug, we document it and pass it to the development team for resolution — and keep you posted.","metadata":{"title":"What happens if RhinoArtisan has a problem?","url":"https://www.rhinoartisan.com/faq/#what-happens-if-rhinoartisan-has-a-problem","source":"https://www.rhinoartisan.com/faq/#what-happens-if-rhinoartisan-has-a-problem","collection":"faq","hash":"eb4fc71d3b8f943a5f66070786cbae2d","indexed_by":"docs-index"}},{"content":"Who helps me if my question is about Rhino rather than RhinoArtisan?\n\nMost support requests aren't really software problems — they're questions about how to apply a command, or the best procedure to achieve a certain result.\n\nIf you purchased Rhino together with RhinoArtisan through us, our team provides full support for both.\n\nEither way, we never leave a customer without an answer: even if you didn't buy Rhino through us, we'll always try to point you in the right direction.","metadata":{"title":"Who helps me if my question is about Rhino rather than RhinoArtisan?","url":"https://www.rhinoartisan.com/faq/#who-helps-me-if-my-question-is-about-rhino-rather-than-rhinoartisan","source":"https://www.rhinoartisan.com/faq/#who-helps-me-if-my-question-is-about-rhino-rather-than-rhinoartisan","collection":"faq","hash":"25e88f851cff44ff555ee8de5ed1b7e4","indexed_by":"docs-index"}},{"content":"How do I contact support, and how fast do you reply?\n\nStart with Ask, our AI assistant — it answers many questions about RhinoArtisan, its commands and its workflows instantly, any time of day.\n\nWhen you need a human, contact our official support service through the contact form.\n\nThe official response window is 3 to 72 hours, depending on the urgency and complexity of the request — though in practice our response times are usually much closer to 3 hours than to 72.","metadata":{"title":"How do I contact support, and how fast do you reply?","url":"https://www.rhinoartisan.com/faq/#how-do-i-contact-support-and-how-fast-do-you-reply","source":"https://www.rhinoartisan.com/faq/#how-do-i-contact-support-and-how-fast-do-you-reply","collection":"faq","hash":"2a02c1ff7c6eca0cb5b88806a2d88f7d","indexed_by":"docs-index"}}]}