Beauty of not organic Multipipe

Beauty of not organic Multipipe v5.gh (28.4 KB)

All geometries can be transformed into printable mesh or closed BREP easily.

Beveled VS Not beveled

This is amazing Quan!

I wonder if [1] more control of the beveling (the Blender sense of beveling) and [2] breaking the Ngons could improve the results further.

I tried not to use ngon mesh, but the result was bad.
It cannot do Blender sense of beveling. It can chamfer, but not fillet. And it cannot chamfer specific edges.

CubeFit(Multipipe) used.

test 240302 v0.gh (24.9 KB)

Now with this approach, models like this might be easier to make.


@dale @DavidRutten @DanielPiker
Please implement Weighted Subd Crease in Grasshopper, or at leas, tell what is the schedule.

Expose SubDCrease functionality to RhinoCommon : RH-79547 (myjetbrains.com)
Rhino 8 - SubD weighted creases in Grasshopper - Rhino Developer - McNeel Forum

Please add​:clap::clap:
Immediately

And the bevel/fillet mesh tool (in Rhino) too! These are such important tools–I hope they drop before R9 :sob:

Hi, @piac.
Thank you for developing Weaverbird!
Is it possible to bevel the specific edges of a mesh with Weaverbird?
If no, is there any possibility users can do that with Grasshopper?
Rhino can do that, but when I search for related functions in RhinoCommon, there is none.

Found this on YT.

Expose SubDCrease functionality to RhinoCommon : RH-79547 (myjetbrains.com)

This and Bevel | Rhino 3-D modeling :sob: :pray:t3:

Non-organic?

RH-79547 is fixed in Rhino 8 Service Release 36

Beauty of not organic Multipipe v5 Fillet with subd crease.gh (25.8 KB)

With the new SubDCrease API we can do things like this easily

using System;
using System.Collections;
using System.Collections.Generic;

using Rhino;
using Rhino.Geometry;

using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;

public class Script_Instance : GH_ScriptInstance
{
    private void RunScript(
		DataTree<SubD> S,
		DataTree<int> E,
		DataTree<double> W,
		ref object A)
    {
        DataTree<SubD> outTree = new DataTree<SubD>();

        for (int i = 0; i < S.BranchCount; i++)
        {
            GH_Path path = S.Path(i);
            List<SubD> subdList = S.Branch(path);

            List<int> edgeIndices = E.PathExists(path) ? E.Branch(path) : (E.BranchCount > 0 ? E.Branch(0) : new List<int>());
            List<double> edgeWeights = W.PathExists(path) ? W.Branch(path) : (W.BranchCount > 0 ? W.Branch(0) : new List<double>());

            for (int j = 0; j < subdList.Count; j++)
            {
                SubD originalSubD = subdList[j];
                
                if (originalSubD == null)
                {
                    outTree.Add(null, path);
                    continue;
                }

                SubD dupSubD = (SubD)originalSubD.Duplicate();
                
                for(int k = 0; k < edgeIndices.Count; k++)
                {
                    int eIdx = edgeIndices[k];
                    
                    double w = k < edgeWeights.Count ? edgeWeights[k] : (edgeWeights.Count > 0 ? edgeWeights[edgeWeights.Count - 1] : 0.0);
                    
                    SubDEdge edge = dupSubD.Edges.Find(eIdx);
                    if (edge != null)
                    {
                        if (w <= 0.0)
                        {
                            edge.Sharpness = SubDEdgeSharpness.Smooth;
                        }
                        else
                        {
                            // 【解除注释,真正执行赋值】
                            // 由于我们无法完全确定 SR36 暴露的这个结构体的实例化方法名,
                            // 这里提供最标准的 C# 实例化写法。
                            // 如果你在新版编辑器里点击 Run 后这里报红字,
                            // 请删掉等号后面的代码,输入 SubDEdgeSharpness. 
                            // 然后在弹出的代码提示列表中,选择那个带有 Weight/Percentage 之类字眼的方法。
                            edge.Sharpness = new SubDEdgeSharpness(w); 
                        }
                    }
                }
                
                outTree.Add(dupSubD, path);
            }
        }
        
        A = outTree;
    }
}