"""Script by Mitch Heynick - version 8 December 2013
Unrolls a series of surfaces/polysurfaces
This version is modifed to run on Mac"""

import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino

def BBCP(obj):
    bb = rs.BoundingBox(obj)
    if bb: return (bb[0]+bb[6])/2

def MultiUnroll():
    objIDs = rs.GetObjects("Select surfaces to unroll",8+16,preselect=True)
    if not objIDs: return
    
    crvs=rs.GetObjects("Select curves to unroll with surfaces", 4)
    
    if sc.sticky.has_key("urNumbering"):
        oldNumMac = sc.sticky["urNumbering"]
    else:
        oldNumMac="Yes"
        
    numbering=rs.GetString("Number objects?",oldNumMac,["No","Yes"])
    if not (numbering=="No" or numbering=="Yes"): return
    
    newSPt = rs.GetPoint("Start point for unrolls - press Enter for world 0")
    if not newSPt: newSPt=Rhino.Geometry.Point3d(0,0,0)
    
    if sc.sticky.has_key("urSpacing"):
        oldSpace = sc.sticky["urSpacing"]
    else:
        oldSpace=1.0
    space = rs.GetReal("Spacing between unrolls?",oldSpace,0)
    if not space: return
    
    comm = "-_UnrollSrf _Explode=_No Labels=_No"
    if crvs:
        tempGroup = rs.AddGroup()
        rs.AddObjectsToGroup(crvs, tempGroup)
        comm+=" _-SelGroup "+tempGroup+" _Enter"
    
    rs.EnableRedraw(False)
    count=0 ; noUnroll=0
    for i,objID in enumerate(objIDs):
        rs.UnselectAllObjects()
        ctr = BBCP(objID)
        if ctr:
            rs.SelectObject(objID)
            rs.Command(comm+" _Enter", False)
            urObjs = rs.LastCreatedObjects()
            if urObjs:
                if numbering[0]:
                    #group orig obj and number dot
                    dot = rs.AddTextDot(str(i + 1), ctr)
                    rs.ObjectLayer(dot, rs.ObjectLayer(objID))
                    group = rs.AddGroup()
                    rs.AddObjectsToGroup([objID, dot], group)
                    
                bb = rs.BoundingBox(urObjs)
                rs.MoveObjects(urObjs, newSPt-bb[0])
                newSPt[0] = newSPt[0] + bb[1][0] - bb[0][0] + space
                
                if numbering[0]:
                #add number dot to unrolled objects and group
                    dot = rs.AddTextDot(str(i + 1), BBCP(urObjs))
                    group = rs.AddGroup()
                    rs.AddObjectsToGroup(urObjs, group)
                    rs.AddObjectToGroup(dot, group)
                    count += 1
                else:
                    noUnroll += 1
                    
    #Clean up, store settings, report
    if tempGroup: rs.DeleteGroup(tempGroup)
    sc.sticky["urNumbering"] = numbering[0]
    sc.sticky["urSpacing"] = space    
    rs.UnselectAllObjects()
    msg="Sucessfully unrolled {} objects".format(count)
    if noUnroll > 0:
        msg+=" | Unable to unroll {} objects".format(noUnroll)
    print msg

MultiUnroll()