Draw Mesh

Demonstrates how to create a mesh from an existing surface and draw it in a display conduit.

partial class Examples
{
public static Result DrawMesh(RhinoDoc doc)
{
var gs = new GetObject();
gs.SetCommandPrompt("select sphere");
gs.GeometryFilter = ObjectType.Surface;
gs.DisablePreSelect();
gs.SubObjectSelect = false;
gs.Get();
if (gs.CommandResult() != Result.Success)
return gs.CommandResult();
Sphere sphere;
gs.Object(0).Surface().TryGetSphere(out sphere);
if (sphere.IsValid)
{
var mesh = Mesh.CreateFromSphere(sphere, 10, 10);
if (mesh == null)
return Result.Failure;
var conduit = new DrawBlueMeshConduit(mesh) {Enabled = true};
doc.Views.Redraw();
var in_str = "";
Rhino.Input.RhinoGet.GetString("press <Enter> to continue", true, ref in_str);
conduit.Enabled = false;
doc.Views.Redraw();
return Result.Success;
}
else
return Result.Failure;
}
}
class DrawBlueMeshConduit : DisplayConduit
{
readonly Mesh m_mesh;
readonly Color m_color;
readonly DisplayMaterial m_material;
readonly BoundingBox m_bbox;
public DrawBlueMeshConduit(Mesh mesh)
{
// set up as much data as possible so we do the minimum amount of work possible inside
// the actual display code
m_mesh = mesh;
m_color = System.Drawing.Color.Blue;
m_material = new DisplayMaterial();
m_material.Diffuse = m_color;
if (m_mesh != null && m_mesh.IsValid)
m_bbox = m_mesh.GetBoundingBox(true);
}
// this is called every frame inside the drawing code so try to do as little as possible
// in order to not degrade display speed. Don't create new objects if you don't have to as this
// will incur an overhead on the heap and garbage collection.
protected override void CalculateBoundingBox(CalculateBoundingBoxEventArgs e)
{
base.CalculateBoundingBox(e);
// Since we are dynamically drawing geometry, we needed to override
// CalculateBoundingBox. Otherwise, there is a good chance that our
// dynamically drawing geometry would get clipped.
// Union the mesh's bbox with the scene's bounding box
e.BoundingBox.Union(m_bbox);
}
protected override void PreDrawObjects(DrawEventArgs e)
{
base.PreDrawObjects(e);
var vp = e.Display.Viewport;
if (vp.DisplayMode.EnglishName.ToLower() == "wireframe")
e.Display.DrawMeshWires(m_mesh, m_color);
else
e.Display.DrawMeshShaded(m_mesh, m_material);
}
}