Create Block Definition

Demonstrates how to create a block definition from scratch from user-specified objects, base-point, and name.

partial class Examples
{
  public static Rhino.Commands.Result CreateBlock(Rhino.RhinoDoc doc)
  {
    // Select objects to define block
    var go = new Rhino.Input.Custom.GetObject();
    go.SetCommandPrompt( "Select objects to define block" );
    go.ReferenceObjectSelect = false;
    go.SubObjectSelect = false;
    go.GroupSelect = true;

    // Phantoms, grips, lights, etc., cannot be in blocks.
    const ObjectType forbidden_geometry_filter = Rhino.DocObjects.ObjectType.Light |
                                                 Rhino.DocObjects.ObjectType.Grip | Rhino.DocObjects.ObjectType.Phantom;
    const ObjectType geometry_filter = forbidden_geometry_filter ^ Rhino.DocObjects.ObjectType.AnyObject;
    go.GeometryFilter = geometry_filter;
    go.GetMultiple(1, 0);
    if (go.CommandResult() != Rhino.Commands.Result.Success)
      return go.CommandResult();

    // Block base point
    Rhino.Geometry.Point3d base_point;
    var rc = Rhino.Input.RhinoGet.GetPoint("Block base point", false, out base_point);
    if (rc != Rhino.Commands.Result.Success)
      return rc;

    // Block definition name
    string idef_name = "";
    rc = Rhino.Input.RhinoGet.GetString("Block definition name", false, ref idef_name);
    if (rc != Rhino.Commands.Result.Success)
      return rc;
    // Validate block name
    idef_name = idef_name.Trim();
    if (string.IsNullOrEmpty(idef_name))
      return Rhino.Commands.Result.Nothing;

    // See if block name already exists
    Rhino.DocObjects.InstanceDefinition existing_idef = doc.InstanceDefinitions.Find(idef_name, true);
    if (existing_idef != null)
    {
      Rhino.RhinoApp.WriteLine("Block definition {0} already exists", idef_name);
      return Rhino.Commands.Result.Nothing;
    }

    // Gather all of the selected objects
    var geometry = new System.Collections.Generic.List<Rhino.Geometry.GeometryBase>();
    var attributes = new System.Collections.Generic.List<Rhino.DocObjects.ObjectAttributes>();
    for (int i = 0; i < go.ObjectCount; i++)
    {
      var rhinoObject = go.Object(i).Object();
      if (rhinoObject != null)
      {
        geometry.Add(rhinoObject.Geometry);
        attributes.Add(rhinoObject.Attributes);
      }
    }

    // Gather all of the selected objects
    int idef_index = doc.InstanceDefinitions.Add(idef_name, string.Empty, base_point, geometry, attributes);

    if( idef_index < 0 )
    {
      Rhino.RhinoApp.WriteLine("Unable to create block definition", idef_name);
      return Rhino.Commands.Result.Failure;
    }
    return Rhino.Commands.Result.Success;
  }
}
Partial Friend Class Examples
  Public Shared Function CreateBlock(ByVal doc As Rhino.RhinoDoc) As Rhino.Commands.Result
	' Select objects to define block
	Dim go = New Rhino.Input.Custom.GetObject()
	go.SetCommandPrompt("Select objects to define block")
	go.ReferenceObjectSelect = False
	go.SubObjectSelect = False
	go.GroupSelect = True

	' Phantoms, grips, lights, etc., cannot be in blocks.
	Const forbidden_geometry_filter As ObjectType = Rhino.DocObjects.ObjectType.Light Or Rhino.DocObjects.ObjectType.Grip Or Rhino.DocObjects.ObjectType.Phantom
	Const geometry_filter As ObjectType = forbidden_geometry_filter Xor Rhino.DocObjects.ObjectType.AnyObject
	go.GeometryFilter = geometry_filter
	go.GetMultiple(1, 0)
	If go.CommandResult() <> Rhino.Commands.Result.Success Then
	  Return go.CommandResult()
	End If

	' Block base point
	Dim base_point As Rhino.Geometry.Point3d = Nothing
	Dim rc = Rhino.Input.RhinoGet.GetPoint("Block base point", False, base_point)
	If rc IsNot Rhino.Commands.Result.Success Then
	  Return rc
	End If

	' Block definition name
	Dim idef_name As String = ""
	rc = Rhino.Input.RhinoGet.GetString("Block definition name", False, idef_name)
	If rc IsNot Rhino.Commands.Result.Success Then
	  Return rc
	End If
	' Validate block name
	idef_name = idef_name.Trim()
	If String.IsNullOrEmpty(idef_name) Then
	  Return Rhino.Commands.Result.Nothing
	End If

	' See if block name already exists
	Dim existing_idef As Rhino.DocObjects.InstanceDefinition = doc.InstanceDefinitions.Find(idef_name, True)
	If existing_idef IsNot Nothing Then
	  Rhino.RhinoApp.WriteLine("Block definition {0} already exists", idef_name)
	  Return Rhino.Commands.Result.Nothing
	End If

	' Gather all of the selected objects
	Dim geometry = New System.Collections.Generic.List(Of Rhino.Geometry.GeometryBase)()
	Dim attributes = New System.Collections.Generic.List(Of Rhino.DocObjects.ObjectAttributes)()
	For i As Integer = 0 To go.ObjectCount - 1
	  Dim rhinoObject = go.Object(i).Object()
	  If rhinoObject IsNot Nothing Then
		geometry.Add(rhinoObject.Geometry)
		attributes.Add(rhinoObject.Attributes)
	  End If
	Next i

	' Gather all of the selected objects
	Dim idef_index As Integer = doc.InstanceDefinitions.Add(idef_name, String.Empty, base_point, geometry, attributes)

	If idef_index < 0 Then
	  Rhino.RhinoApp.WriteLine("Unable to create block definition", idef_name)
	  Return Rhino.Commands.Result.Failure
	End If
	Return Rhino.Commands.Result.Success
  End Function
End Class
import Rhino
import scriptcontext

def CreateBlock():
    # Select objects to define block
    go = Rhino.Input.Custom.GetObject()
    go.SetCommandPrompt( "Select objects to define block" )
    go.ReferenceObjectSelect = False
    go.SubObjectSelect = False
    go.GroupSelect = True

    # Phantoms, grips, lights, etc., cannot be in blocks.
    forbidden_geometry_filter = Rhino.DocObjects.ObjectType.Light | Rhino.DocObjects.ObjectType.Grip | Rhino.DocObjects.ObjectType.Phantom
    geometry_filter = forbidden_geometry_filter ^ Rhino.DocObjects.ObjectType.AnyObject
    go.GeometryFilter = geometry_filter
    go.GetMultiple(1, 0)
    if go.CommandResult() != Rhino.Commands.Result.Success:
        return go.CommandResult()

    # Block base point
    rc, base_point = Rhino.Input.RhinoGet.GetPoint("Block base point", False)
    if rc != Rhino.Commands.Result.Success: return rc

    # Block definition name
    rc, idef_name = Rhino.Input.RhinoGet.GetString("Block definition name", False, "")
    if rc != Rhino.Commands.Result.Success: return rc
    # Validate block name
    idef_name = idef_name.strip()
    if not idef_name: return Rhino.Commands.Result.Nothing

    # See if block name already exists
    existing_idef = scriptcontext.doc.InstanceDefinitions.Find(idef_name, True)
    if existing_idef:
        print "Block definition", idef_name, "already exists"
        return Rhino.Commands.Result.Nothing

    # Gather all of the selected objects
    objrefs = go.Objects()
    geometry = [item.Object().Geometry for item in objrefs]
    attributes = [item.Object().Attributes for item in objrefs]

    # Add the instance definition
    idef_index = scriptcontext.doc.InstanceDefinitions.Add(idef_name, "", base_point, geometry, attributes)

    if idef_index<0:
        print "Unable to create block definition", idef_name
        return Rhino.Commands.Result.Failure
    return Rhino.Commands.Result.Failure


if __name__=="__main__":
    CreateBlock()