import Rhino
import scriptcontext
import System.Guid
from Rhino import *
from Rhino.DocObjects import *
from Rhino.Commands import *
from scriptcontext import doc
import System.Guid
import gc


def StoreMeshToDocument(mesh, name, layer):
    id = scriptcontext.doc.Objects.AddMesh(mesh)
    rhino_object = Rhino.RhinoDoc.ActiveDoc.Objects.Find(id)
    rhino_object.Attributes.LayerIndex = layer
    rhino_object.Attributes.Name = name
    rhino_object.CommitChanges()
    return rhino_object


def RunCommand():
    input_layer_id = doc.ActiveDoc.Layers.Find("Building Solid Mesh", -1)
    result_layer_id = doc.ActiveDoc.Layers.Find("Result", -1)

    object_enumerator_settings = ObjectEnumeratorSettings()
    object_enumerator_settings.LayerIndexFilter = input_layer_id
    object_enumerator_settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Mesh;
    rhino_objects = doc.Objects.GetObjectList(object_enumerator_settings)

    xform = Rhino.Geometry.Transform.Translation(2621232.0, 1259640.0, 343.0)

    for rhino_object in rhino_objects:
        mesh = rhino_object.Geometry
        mesh.Vertices.UseDoublePrecisionVertices = True
        doublePresisionMesh = Rhino.Geometry.Mesh()
        doublePresisionMesh.Vertices.UseDoublePrecisionVertices = True
        point3dArray = mesh.Vertices.ToPoint3dArray()
        doublePresisionMesh.Vertices.AddVertices(point3dArray)
        for meshFace in mesh.Faces:
            if meshFace.IsQuad:
                doublePresisionMesh.Faces.AddFace(meshFace.A, meshFace.B, meshFace.C, meshFace.D)
            if meshFace.IsTriangle:
                doublePresisionMesh.Faces.AddFace(meshFace.A, meshFace.B, meshFace.C)

        doublePresisionMesh.FaceNormals.ComputeFaceNormals()
        doublePresisionMesh.Normals.ComputeNormals()
        doublePresisionMesh.Compact()

        print 'Double precision MeshVertexList.UseDoublePrecisionVertices: {0}'.format(
            str(doublePresisionMesh.Vertices.UseDoublePrecisionVertices))
        doublePresisionMesh.Transform(xform)
        StoreMeshToDocument(doublePresisionMesh, 'Moved back to origin', result_layer_id)

    return Result.Success


if __name__ == "__main__":
    RunCommand()
