import rhinoscriptsyntax as rs
import Rhino
import scriptcontext as sc


def DefineWorldBasedBlock():

    
    ids = rs.GetObjects("Select objects to block.", preselect=True)
    if not ids: return
    
    name= rs.StringBox("Block name", title="World Block")
    if not name: return
    
    #    planePts = rs.GetPoints(False, False, "Set plane origin", "Set X direction", 3)
    #    if not planePts: return
    #    if len(planePts) !=3: return
    
    #bPlane = rs.PlaneFromPoints(planePts[0], planePts[1], planePts[2])
    bPlane = rs.ViewCPlane()
    if bPlane is None: return
    Wxy = Rhino.Geometry.Plane.WorldXY
    xform = Rhino.Geometry.Transform.PlaneToPlane(bPlane, Wxy)
    
    objs = [sc.doc.Objects.Find(id) for id in ids]
    
    geos = [obj.Geometry for obj in objs]
    attrs = [obj.Attributes for obj in objs]
    
    for geo in geos:
        geo.Transform(xform)
    
    sc.doc.InstanceDefinitions.Add(name, "", Wxy.Origin, geos, attrs)
    
    idx = sc.doc.InstanceDefinitions.Find(name).Index
    bId = sc.doc.Objects.AddInstanceObject(idx, xform.TryGetInverse()[1] )
    rs.DeleteObjects(ids)
    
    
if __name__== "__main__": DefineWorldBasedBlock()