NEW: Welcome to the Rhino 6 version of this page! Looking for the older Rhino 5 version?

Space Morph

Demonstrates how to construct the Twist, Bend, Taper, Maelstrom, Stretch, Sporph, Flow, and Splop space morphs.

partial class Examples
{
  static Rhino.DocObjects.ObjectType SpaceMorphObjectFilter()
  {
    Rhino.DocObjects.ObjectType filter =
      Rhino.DocObjects.ObjectType.Point |
      Rhino.DocObjects.ObjectType.PointSet |
      Rhino.DocObjects.ObjectType.Curve |
      Rhino.DocObjects.ObjectType.Surface |
      Rhino.DocObjects.ObjectType.PolysrfFilter |
      Rhino.DocObjects.ObjectType.Mesh |
      Rhino.DocObjects.ObjectType.Grip |
      Rhino.DocObjects.ObjectType.Cage;
    return filter;
  }

  public static Rhino.Commands.Result Twist(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to twist", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Line axis;
    rc = Rhino.Input.RhinoGet.GetLine(out axis);
    if (rc != Rhino.Commands.Result.Success || axis == null)
      return rc;

    double angle = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Twist angle in degrees", false, ref angle);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(angle))
      return rc;

    Rhino.Geometry.Morphs.TwistSpaceMorph morph = new Rhino.Geometry.Morphs.TwistSpaceMorph();
    morph.TwistAxis = axis;
    morph.TwistAngleRadians = Rhino.RhinoMath.ToRadians(angle);

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Bend(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to bend", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Line axis;
    rc = Rhino.Input.RhinoGet.GetLine(out axis);
    if (rc != Rhino.Commands.Result.Success || axis == null)
      return rc;

    Rhino.Geometry.Point3d point;
    rc = Rhino.Input.RhinoGet.GetPoint("Point to bend through", false, out point);
    if (rc != Rhino.Commands.Result.Success || !point.IsValid)
      return rc;

    Rhino.Geometry.Morphs.BendSpaceMorph morph = new Rhino.Geometry.Morphs.BendSpaceMorph(axis.From, axis.To, point, true, false);

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Taper(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to taper", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Line axis;
    rc = Rhino.Input.RhinoGet.GetLine(out axis);
    if (rc != Rhino.Commands.Result.Success || axis == null)
      return rc;

    double radius0 = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Starting radius", false, ref radius0);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(radius0))
      return rc;

    double radius1 = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Ending radius", false, ref radius1);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(radius1))
      return rc;

    Rhino.Geometry.Morphs.TaperSpaceMorph morph = new Rhino.Geometry.Morphs.TaperSpaceMorph(axis.From, axis.To, radius0, radius1, false, false);

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Maelstrom(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to maelstrom", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Plane plane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane();

    double radius0 = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Starting radius", false, ref radius0);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(radius0))
      return rc;

    double radius1 = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Ending radius", false, ref radius1);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(radius1))
      return rc;

    double angle = Rhino.RhinoMath.UnsetValue;
    rc = Rhino.Input.RhinoGet.GetNumber("Twist angle in degrees", false, ref angle);
    if (rc != Rhino.Commands.Result.Success || !Rhino.RhinoMath.IsValidDouble(angle))
      return rc;

    Rhino.Geometry.Morphs.MaelstromSpaceMorph morph = new Rhino.Geometry.Morphs.MaelstromSpaceMorph(plane, radius0, radius1, Rhino.RhinoMath.ToRadians(angle));

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Stretch(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to stretch", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Plane plane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane();

    Rhino.Geometry.Line axis;
    rc = Rhino.Input.RhinoGet.GetLine(out axis);
    if (rc != Rhino.Commands.Result.Success || axis == null)
      return rc;

    Rhino.Geometry.Morphs.StretchSpaceMorph morph = new Rhino.Geometry.Morphs.StretchSpaceMorph(axis.From, axis.To, axis.Length * 1.5);

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Sporph(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to sporph", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Input.Custom.GetObject go0 = new Rhino.Input.Custom.GetObject();
    go0.SetCommandPrompt("Source surface");
    go0.GeometryFilter = Rhino.DocObjects.ObjectType.Surface;
    go0.SubObjectSelect = false;
    go0.EnablePreSelect(false, true);
    go0.DeselectAllBeforePostSelect = false;
    go0.Get();
    if (go0.CommandResult() != Rhino.Commands.Result.Success)
      return go0.CommandResult();

    Rhino.DocObjects.ObjRef srf0_ref = go0.Object(0);

    Rhino.Input.Custom.GetObject go1 = new Rhino.Input.Custom.GetObject();
    go1.SetCommandPrompt("Source surface");
    go1.GeometryFilter = Rhino.DocObjects.ObjectType.Surface;
    go1.SubObjectSelect = false;
    go1.EnablePreSelect(false, true);
    go1.DeselectAllBeforePostSelect = false;
    go1.Get();
    if (go1.CommandResult() != Rhino.Commands.Result.Success)
      return go1.CommandResult();

    Rhino.DocObjects.ObjRef srf1_ref = go1.Object(0);

    Rhino.Geometry.Morphs.SporphSpaceMorph morph = new Rhino.Geometry.Morphs.SporphSpaceMorph(srf0_ref.Surface(), srf1_ref.Surface());

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Flow(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to flow", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Input.Custom.GetObject go0 = new Rhino.Input.Custom.GetObject();
    go0.SetCommandPrompt("Source curve");
    go0.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
    go0.SubObjectSelect = false;
    go0.EnablePreSelect(false, true);
    go0.DeselectAllBeforePostSelect = false;
    go0.Get();
    if (go0.CommandResult() != Rhino.Commands.Result.Success)
      return go0.CommandResult();

    Rhino.DocObjects.ObjRef crv0_ref = go0.Object(0);

    Rhino.Input.Custom.GetObject go1 = new Rhino.Input.Custom.GetObject();
    go1.SetCommandPrompt("Source curve");
    go1.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
    go1.SubObjectSelect = false;
    go1.EnablePreSelect(false, true);
    go1.DeselectAllBeforePostSelect = false;
    go1.Get();
    if (go1.CommandResult() != Rhino.Commands.Result.Success)
      return go1.CommandResult();

    Rhino.DocObjects.ObjRef crv1_ref = go1.Object(0);

    Rhino.Geometry.Morphs.FlowSpaceMorph morph = new Rhino.Geometry.Morphs.FlowSpaceMorph(crv0_ref.Curve(), crv1_ref.Curve(), false);

    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

  public static Rhino.Commands.Result Splop(Rhino.RhinoDoc doc)
  {
    ObjectType filter = SpaceMorphObjectFilter();
    Rhino.DocObjects.ObjRef objref;
    Rhino.Commands.Result rc = Rhino.Input.RhinoGet.GetOneObject("Select object to splop", false, filter, out objref);
    if (rc != Rhino.Commands.Result.Success || objref == null)
      return rc;

    Rhino.Geometry.Plane plane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane();

    Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
    go.SetCommandPrompt("Surface to splop on");
    go.GeometryFilter = Rhino.DocObjects.ObjectType.Surface;
    go.SubObjectSelect = false;
    go.EnablePreSelect(false, true);
    go.DeselectAllBeforePostSelect = false;
    go.Get();
    if (go.CommandResult() != Rhino.Commands.Result.Success)
      return go.CommandResult();

    Rhino.DocObjects.ObjRef srfref = go.Object(0);

    double u, v;
    srfref.SurfaceParameter(out u, out v);

    Rhino.Geometry.Point2d uv = new Rhino.Geometry.Point2d(u,v);

    Rhino.Geometry.Morphs.SplopSpaceMorph morph = new Rhino.Geometry.Morphs.SplopSpaceMorph(plane, srfref.Surface(), uv);
    Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
    if (morph.Morph(geom))
    {
      doc.Objects.Add(geom);
      doc.Views.Redraw();
    }

    return Rhino.Commands.Result.Success;
  }

}
' No VB.NET sample available
# No Python sample available