Click or drag to resize

ObjectAttributesDisplayOrder Property

Display order used to force objects to be drawn on top or behind each other. Larger numbers draw on top of smaller numbers.

0 = draw object in standard depth buffered order

<0 = draw object behind "normal" draw order objects

>0 = draw object on top of "normal" draw order objects

Namespace:  Rhino.DocObjects
Assembly:  RhinoCommon (in RhinoCommon.dll)
Since: 5.10
Syntax
public int DisplayOrder { get; set; }

Property Value

Type: Int32
Examples
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using Rhino;
using Rhino.Commands;
using Rhino.Display;
using Rhino.Geometry;
using Rhino.Input;
using Rhino.DocObjects;

namespace examples_cs
{
  public class DisplayOrderCommand : Command
  {
    public override string EnglishName { get { return "csDisplayOrder"; } }

    private List<RhinoObject> m_line_objects = new List<RhinoObject>(); 

    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      // make lines thick so draw order can be easily seen
      var dm = DisplayModeDescription.GetDisplayModes().Single(x => x.EnglishName == "Wireframe");
      var original_thikcness = dm.DisplayAttributes.CurveThickness;
      dm.DisplayAttributes.CurveThickness = 10;
      DisplayModeDescription.UpdateDisplayMode(dm);

      AddLine(Point3d.Origin, new Point3d(10,10,0), Color.Red, doc);
      AddLine(new Point3d(10,0,0), new Point3d(0,10,0), Color.Blue, doc);
      AddLine(new Point3d(8,0,0), new Point3d(8,10,0), Color.Green, doc);
      AddLine(new Point3d(0,3,0), new Point3d(10,3,0), Color.Yellow, doc);
      doc.Views.Redraw();
      Pause("draw order: 1st line drawn in front, last line drawn in the back.  Any key to continue ...");

      //all objects have a DisplayOrder of 0 by default so changing it to 1 moves it to the front.  Here we move the 2nd line (blue) to the front
      m_line_objects[1].Attributes.DisplayOrder = 1;
      m_line_objects[1].CommitChanges();
      doc.Views.Redraw();
      Pause("Second (blue) line now in front.  Any key to continue ...");

      for (int i = 0; i < m_line_objects.Count; i++)
      {
        m_line_objects[i].Attributes.DisplayOrder = i;
        m_line_objects[i].CommitChanges();
      }
      doc.Views.Redraw();
      Pause("Reverse order of original lines, i.e., Yellow 1st and Red last.  Any key to continue ...");

      // restore original line thickness
      dm.DisplayAttributes.CurveThickness = original_thikcness;
      DisplayModeDescription.UpdateDisplayMode(dm);

      doc.Views.Redraw();
      return Result.Success;
    }

    private void Pause(string msg)
    {
      ObjRef obj_ref;
      var rc = RhinoGet.GetOneObject(msg, true, ObjectType.AnyObject, out obj_ref);
    }

    private void AddLine(Point3d from, Point3d to, Color color, RhinoDoc doc)
    {
      var guid = doc.Objects.AddLine(from, to);
      var obj = doc.Objects.Find(guid);
      m_line_objects.Add(obj);
      obj.Attributes.ObjectColor = color;
      obj.Attributes.ColorSource = ObjectColorSource.ColorFromObject;
      obj.CommitChanges();
    }
  }
}
Python
from System.Collections.Generic import *
from System.Drawing import *
from Rhino import *
from Rhino.Commands import *
from Rhino.Display import *
from Rhino.Geometry import *
from Rhino.Input import *
from Rhino.DocObjects import *
from scriptcontext import doc

m_line_objects = []

def RunCommand():
  # make lines thick so draw order can be easily seen
  wfdm = [dm for dm in DisplayModeDescription.GetDisplayModes() if dm.EnglishName == "Wireframe"][0]
  original_thikcness = wfdm.DisplayAttributes.CurveThickness
  wfdm.DisplayAttributes.CurveThickness = 10
  DisplayModeDescription.UpdateDisplayMode(wfdm)

  AddLine(Point3d.Origin, Point3d(10,10,0), Color.Red, doc)
  AddLine(Point3d(10,0,0), Point3d(0,10,0), Color.Blue, doc)
  AddLine(Point3d(8,0,0), Point3d(8,10,0), Color.Green, doc)
  AddLine(Point3d(0,3,0), Point3d(10,3,0), Color.Yellow, doc)
  doc.Views.Redraw()
  Pause("draw order: 1st line drawn in front, last line drawn in the back.  Any key to continue ...")

  #all objects have a DisplayOrder of 0 by default so changing it to 1 moves it to the front.  Here we move the 2nd line (blue) to the front
  m_line_objects[1].Attributes.DisplayOrder = 1
  m_line_objects[1].CommitChanges()
  doc.Views.Redraw()
  Pause("Second (blue) line now in front.  Any key to continue ...")

  for i in range(0, m_line_objects.Count - 1):
    m_line_objects[i].Attributes.DisplayOrder = i
    m_line_objects[i].CommitChanges()

  doc.Views.Redraw()
  Pause("Reverse order of original lines, i.e., Yellow 1st and Red last.  Any key to continue ...")

  # restore original line thickness
  wfdm.DisplayAttributes.CurveThickness = original_thikcness
  DisplayModeDescription.UpdateDisplayMode(wfdm)

  doc.Views.Redraw()
  return Result.Success

def Pause(msg):
  rc, obj_ref = RhinoGet.GetOneObject(msg, True, ObjectType.AnyObject)

def AddLine(from_pt, to_pt, color, doc):
  guid = doc.Objects.AddLine(from_pt, to_pt)
  obj = doc.Objects.Find(guid)
  m_line_objects.Add(obj)
  obj.Attributes.ObjectColor = color
  obj.Attributes.ColorSource = ObjectColorSource.ColorFromObject
  obj.CommitChanges()

if __name__ == "__main__":
  RunCommand()
See Also