######emma kretz
######13.hausuebung
######stanley kubricks spaceship

import rhinoscriptsyntax as rs
import sys
sys.path.append("P:/")
import dm2_lib as dm2
###### ________________________
###### worx with shepperton.3dm only

dm2.newEmptyLayer("DEMO::frames", [ 220,220,220] )
dm2.newEmptyLayer("DEMO::circs",  [ 220,220,220] )
dm2.newEmptyLayer("DEMO::tst",    [ 220,220,220] )
rs.UnselectAllObjects()
rs.LayerVisible("OSM", 0)
#rs.ZoomExtents()
#rs.Redraw()
rs.EnableRedraw(0)

rs.Command("-show enter", 0)                    # show all hidden
#rs.Redraw()
rs.ViewDisplayMode(mode="rendered")
#rs.Redraw()
rs.ViewDisplayMode(mode="Wireframe")            # speedUp: no renderMeshes generated
crater = rs.ObjectsByLayer("crater_srf")
crater = rs.ExplodePolysurfaces( crater )
crater = crater[0]
rs.LayerVisible("OSM", 0)
rs.LayerVisible("CRATER", 1)


## read points of surface

steg = rs.ObjectsByLayer("crater_steg")[0]
print steg
rs.Command( "SolidPtOn selID "+str(steg)+" enter", 0) # polySrf
steg_coords = rs.ObjectGripLocations( steg )
impaktPoint = steg_coords[300]

print "impaktPoint", impaktPoint

rs.Command( "PointsOff _enter", 0)

#########################################

dm2.newEmptyLayer( "SPACESHIP", [0,0,0] )


## 1. rad

center0 = [0,0,0]
radius = 90.0*4
hoehe  = 10.4*4
hoehe1 = 50.0*4

divi = 250
divi_speichen = 16
divi_temp = 50
divi_verb_minis = divi_speichen*4

center1 = rs.VectorAdd( center0, [0,0,hoehe] ) 

## ebene 0

def makeSpaceshipRad( center0 ):
    circ0 = rs.AddCircle(center0, radius)                  
    circ0innen = rs.AddCircle(center0, radius*0.8)    
    circ0mini = rs.AddCircle([0,0,center0[2]-5], radius*0.2)
    
    coords0 = rs.DivideCurve(circ0, divi_speichen, 0)  
    coords0innen = rs.DivideCurve(circ0innen, divi_speichen, 0) 
    coords0mini = rs.DivideCurve(circ0mini, divi_speichen, 0)
    
    center1 = rs.VectorAdd( center0, [0,0,hoehe] ) 
    
    if 1:
        ## ebene 1
        circ1 = rs.AddCircle(center1, radius)
        circ1innen = rs.AddCircle(center1, radius*0.8) 
        circ1mini = rs.AddCircle ([0,0,center0[2]+hoehe+5], radius*0.2)
        circ1micro = rs.AddCircle ([0,0,center0[2]+hoehe+5], radius*0.1)
    
        coords1 = rs.DivideCurve(circ1, divi_speichen, 0) 
        coords1innen = rs.DivideCurve(circ1innen, divi_speichen, 0) 
        coords1mini = rs.DivideCurve(circ1mini, divi_speichen, 0)
        coords1micro = rs.DivideCurve(circ1micro, divi_speichen, 0)
        
    if 1:
        coords0_divi = rs.DivideCurve( circ0, divi )
        coords1_divi = rs.DivideCurve( circ1, divi )
        
        coords0innen_divi = rs.DivideCurve( circ0innen, divi )
        coords1innen_divi = rs.DivideCurve( circ1innen, divi )
        
        #lines zwischen circ0 und circ0innen
    
    if 1:
        ## raeder + rundum
        for i in range(divi):
            rs.AddCurve( [ coords0_divi[i],coords0innen_divi[i],coords1innen_divi[i],coords1_divi[i],coords0_divi[i]], 1)
            #rs.ObjectColor(rs.AllObjects()[0], [0,110,100])
            
        ## speichen
        for i in range(0, divi_speichen, 4):
            crv_speichen_0 = rs.AddLine( coords0innen[i], coords0mini[i])
            crv_speichen_1 = rs.AddLine( coords1innen[i], coords1mini[i])
            crv_speichen_0_divi_temp = rs.DivideCurve( crv_speichen_0, divi_temp )
            crv_speichen_1_divi_temp = rs.DivideCurve( crv_speichen_1, divi_temp )
            for j in range(divi_temp+1): ## !
                rs.AddLine( crv_speichen_0_divi_temp[j], crv_speichen_1_divi_temp[j], )
                #rs.ObjectColor(rs.AllObjects()[0], [0,0,100])

makeSpaceshipRad( [0,0,0] )
makeSpaceshipRad( [0,0,hoehe1] )

### spindel:
coords = [ [radius*0.1, 0,-5]
            ,[radius*0.2, 0,-5]
            ,[radius*0.2, 0, hoehe+5]
            ,[radius*0.1, 0, hoehe+5]
            ,[radius*0.1, 0, hoehe1-5]
            ,[radius*0.2, 0, hoehe1-5]
            ,[radius*0.2, 0, hoehe1+hoehe+5]
            ,[radius*0.1, 0, hoehe1+hoehe+5]
            ,[radius*0.1, 0,-5]
         ]
rs.AddCurve( coords, 1)

angle = 360/divi_verb_minis
for i in range(divi_verb_minis):
    coords = [ rs.VectorRotate(cor, i*angle, [0,0,1]) for cor in coords ]
    rs.AddCurve( coords, 1)
    #rs.AddCurve( coords, 2)
    #rs.ObjectColor(rs.AllObjects()[0], [250, 50,0] )


#schliessen des zylinder

if 1:
    fac = radius*0.1/divi_temp 
    for i in range(1, divi_temp+1):
        radX = fac*i
        circ0mini = rs.AddCircle ( [0, 0, -5], radX)
        circ3mini = rs.AddCircle ( [0, 0, hoehe1+hoehe+5], radX)
        #rs.ObjectColor(circ3mini, [200,0,0] )
        #rs.ObjectColor(circ0mini, [0,200,0] )


#############

#einbetten

cylinder = rs.AddCylinder([0,0,-3.0*2], hoehe*7, radius+3.0*2, cap=1) 

ganzesSpaceship = rs.ObjectsByLayer("SPACESHIP")

impaktPoint = rs.VectorAdd(impaktPoint, [-500,600,-120] )

rs.MoveObjects( ganzesSpaceship, impaktPoint )
rs.RotateObjects(ganzesSpaceship, impaktPoint, 30.0, [1,1,0] )
#dm2.zA()
rs.ZoomBoundingBox(rs.BoundingBox(ganzesSpaceship))


###############################
rs.EnableObjectGrips( crater, 1)
crater_points = rs.ObjectGripLocations(crater)
print "len(crater_points) =",len(crater_points)
if 1:
    ############################################
    ### boundary selection of surfacePoint/Grips
    ### change location of points ##############
    if 1:
        dm2.newEmptyLayer("DEMO::saturn", [250, 70, 100] )
        rs.EnableObjectGrips( crater, 1)
        rs.CurrentView( "Top" )
        rs.ZoomBoundingBox(rs.BoundingBox(crater))
#            #cen = steg_coords[300]
#            rad = 100.0
#            cen[0] -= 140
#            cen[1] += 570
#            cen[2] -= 100
#            #circX = rs.AddCircle( cen, rad )
#            
#            #saturn = rs.AddSphere( cen, rad )
#            cylinder = rs.AddCylinder(cen, 300, rad, cap=1) 
#            rs.RotateObject( cylinder, cen, 75.0, [1,1,0] )
#            rs.ObjectColor( cylinder, [250,200,10] )
#            dm2.rgbMat2Obj( cylinder,  250,200,10, 0.2, 100, 0.2, "cylinder" )
#            
        ## dummy sphere, etwas groesser
        #spher = rs.AddSphere( cen, rad+10.0 )
        rs.UnselectAllObjects()
        rs.SelectObjects( [cylinder, crater] )
        rs.Command("intersect", 0)
        inter = rs.AllObjects()[0]
        print "inters", inter
        #rs.RebuildCurve( inter, degree=1, point_count=100)
        projected = rs.ProjectCurveToSurface( inter, crater, [0,0,1])
        rs.DeleteObject( inter )
        inter = projected[0]
        rs.Command("-selboundary selID "+str(inter)+" SelectionMode=Window  Precise=No enter", 0)
        rs.CurrentView( "Perspective" )
        rs.ZoomSelected()
        selected_indices = rs.SelectedObjectGrips(crater)
        selectedCoords = [ crater_points[i] for i in selected_indices]
        rs.EnableObjectGrips( crater, 0)
        rs.UnselectAllObjects()
        rs.Command("split selid "+str(cylinder)+" enter selid "+str(crater)+" enter",0)
        cylinder = rs.AllObjects()[0] # der untere teil
        rs.DeleteObject(rs.AllObjects()[1] ) #### das koennte aber umgekehrt sei !
    
    if 1:
        rs.Redraw()
        rs.UnselectAllObjects()
        rs.EnableObjectGrips( crater, 1)
        for i,cor in enumerate(selectedCoords):
            ## "projection lines" intersecting:
            lin = rs.AddLine( cor, rs.VectorAdd(cor, [0,0,-1001]))
            #inters = rs.CurveSurfaceIntersection(lin, cylinder) ### if surface !
            inters = rs.CurveBrepIntersect(lin, cylinder) ### if polySurface !
            rs.DeleteObject(lin)
            if inters:
                ## inters is a list of point objects or point_cloud !
                ## need point to manipulate coords list of crater_srf:
                pnt = inters[1]
                crater_points[selected_indices[i]] = rs.PointCoordinates(inters[1][0])
                #rs.DeleteObject(rs.AllObjects()[0])
            if i%64==0: rs.Redraw()
        #rs.DeleteObject( cylinder )
        
        ## manipulate crater_srf:
        #crater_points = [ dm2.pnt2cor(pnt) for pnt in crater_points ]
        rs.ObjectGripLocations( crater, crater_points )
        rs.EnableObjectGrips( crater, 0)
        ###############################################

    ##############
    ## final look
    
        rs.CurrentLayer("Default")
        for lay in rs.LayerNames():
            rs.LayerVisible( lay, 1)
        rs.LayerVisible( "crater_srf", 0)
        rs.CurrentView("Perspective")
        #rs.ZoomBoundingBox(rs.BoundingBox(cylinder))
        rs.UnselectAllObjects()
        rs.ViewDisplayMode("Perspective", "Rendered")
        rs.DeleteObjects(rs.ObjectsByType(1))