###### DM2 w20 ue_12 20210115
###### get and manipulate surface (control)points
###### _______________________
import rhinoscriptsyntax as rs
import sys
sys.path.append("P:/")
import dm2_lib as dm2
###### ________________________
###### worx with shepperton.3dm only

dm2.newEmptyLayer("DEMO::frames", [ 60,  70, 100] )
dm2.newEmptyLayer("DEMO::circs",  [ 60,  70, 100] )
dm2.newEmptyLayer("DEMO::tst",    [200, 150, 250] )
rs.UnselectAllObjects()
rs.LayerVisible("OSM", 1)
#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
#rs.Redraw()

crater = rs.ObjectsByLayer("crater_srf")
crater = rs.ExplodePolysurfaces( crater )
crater = crater[0]
#rs.Command("-isolate -selID "+str(crater)+" enter", 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 )
print 
impaktPoint = steg_coords[300]

print "impaktPoint", impaktPoint

rs.Command( "PointsOff _enter", 0)
#dm2.textDots(steg_coords)


#rs.EnableObjectGrips( crater, 1) # surface
#crater_points = rs.ObjectGripLocations(crater)
#print "len(crater_points) =",len(crater_points)




#########################################
dm2.newEmptyLayer( "SPACESHIP", [0,0,0] )


#1. rad

center0 = [0,0,0]
radius = 90.0
hoehe  = 10.4
divi = 250
divi_speichen = 15
divi_temp = 50

center1 = rs.VectorAdd( center0, [0,0,hoehe] ) 

#ebene 0

circ0 = rs.AddCircle(center0, radius)                  
circ0innen = rs.AddCircle(center0, radius*0.8)    
circ0mini = rs.AddCircle([0,0,-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)

#ebene 1

circ1 = rs.AddCircle(center1, radius)
circ1innen = rs.AddCircle(center1, radius*0.8) 
circ1mini = rs.AddCircle ([0,0,hoehe+5], radius*0.2)
circ1micro = rs.AddCircle ([0,0,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)


###        

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

for i in range(divi):
    circ0_circ0innen_divi = []
    circ0_circ0innen_divi.append(coords0_divi[i])
    circ0_circ0innen_divi.append(coords0innen_divi[i])    
    rs.AddCurve( circ0_circ0innen_divi, 1)

#lines zwischen circ1 und circ1innen

for i in range(divi):
    circ1_circ1innen_divi = []
    circ1_circ1innen_divi.append(coords1_divi[i])
    circ1_circ1innen_divi.append(coords1innen_divi[i])    
    rs.AddCurve( circ1_circ1innen_divi, 1)
    
#lines zwischen circ0 und circ1

for i in range(divi):
    circ0_cir1_divi = []
    circ0_cir1_divi.append(coords0_divi[i])
    circ0_cir1_divi.append(coords1_divi[i])    
    rs.AddCurve( circ0_cir1_divi, 1)
    
#lines zwischen circ0innen und circ1innen

for i in range(divi):
    circ0innen_cir1innen_divi = []
    circ0innen_cir1innen_divi.append(coords0innen_divi[i])
    circ0innen_cir1innen_divi.append(coords1innen_divi[i])    
    rs.AddCurve( circ0innen_cir1innen_divi, 1)



#speichen ebene0

if 1:

    for cor in range(divi_speichen):
        if cor%3: 
            speichen_0 = []
            speichen_0.append(coords0innen[cor])
            speichen_0.append(coords0mini[cor])
            crv_speichen_0 = rs.AddCurve(speichen_0, 1)
            

#speichen ebene1

    for cor in range(divi_speichen):
        if cor%3:
            speichen_1 = []
            speichen_1.append(coords1innen[cor])
            speichen_1.append(coords1mini[cor])
            crv_speichen_1 = rs.AddCurve(speichen_1, 1)
            
 
    crv_speichen_0_divi_temp = rs.DivideCurve( crv_speichen_0, divi_temp )
    crv_speichen_1_divi_temp = rs.DivideCurve( crv_speichen_1, divi_temp )
        
#lines speichen0 speichen 1

    for i in range(divi_temp):
        crv_speichen_0_speichen_1_divi_temp = []
        crv_speichen_0_speichen_1_divi_temp.append(crv_speichen_0_divi_temp[i])
        crv_speichen_0_speichen_1_divi_temp.append(crv_speichen_1_divi_temp[i])    
        rs.AddCurve( crv_speichen_0_speichen_1_divi_temp, 1)


#    aussenCrvs = []
#    innenCrvs = []
#
#    for i in range(divi_speichen):
#        pu0 = coords0[i] 
#        pu1 = coords0innen[i] 
#        rs.AddLine( pu0,pu1 )
#        po0 = coords1[i] 
#        po1 = coords1innen[i] 
#
#        aussenCrv = rs.AddLine( po0, pu0 )
#        innenCrv = rs.AddLine( po1, pu1 )
#        aussenCrvs.append( aussenCrv )
#        innenCrvs.append( innenCrv )
#
#    for i in range(divi_speichen-1):
#        lin0 = aussenCrvs[i]
#        lin1 = aussenCrvs[i+1]
#        if i%2==0:
#            #rs.AddLoftSrf( [lin0, lin1] )
#            p0 = coords0[i]
#            p1 = coords1[i+1]
#            centerField = dm2.pntInbetween(p0, p1, 0.5)
#            #crv = rs.AddLine( centerField, center0)






#2. rad

center0 = [0,0,0]
radius = 90.0
hoehe  = 10.4
hoehe1 = 50
divi_speichen = 15

center2 = rs.VectorAdd( center0, [0,0,hoehe1] ) 
center3 = rs.VectorAdd( center2, [0,0,hoehe] ) 
center3_1 = rs.VectorAdd( center2, [0,0,hoehe+5] ) 

#ebene 2

circ2 = rs.AddCircle(center2, radius)                  
circ2innen = rs.AddCircle(center2, radius*0.8)    
circ2mini = rs.AddCircle([0,0,hoehe1-5], radius*0.2)
circ2micro = rs.AddCircle([0,0,hoehe1-5], radius*0.1)

coords2 = rs.DivideCurve(circ2, divi_speichen, 0)  
coords2innen = rs.DivideCurve(circ2innen, divi_speichen, 0) 
coords2mini = rs.DivideCurve(circ2mini, divi_speichen, 0)
coords2micro = rs.DivideCurve(circ2micro, divi_speichen, 0)

#ebene 3

circ3 = rs.AddCircle(center3, radius)
circ3innen = rs.AddCircle(center3, radius*0.8) 
circ3mini = rs.AddCircle (center3_1, radius*0.2)

coords3 = rs.DivideCurve(circ3, divi_speichen, 0) 
coords3innen = rs.DivideCurve(circ3innen, divi_speichen, 0) 
coords3mini = rs.DivideCurve(circ3mini, divi_speichen, 0)


###

coords2_divi = rs.DivideCurve( circ2, divi )
coords3_divi = rs.DivideCurve( circ3, divi )

coords2innen_divi = rs.DivideCurve( circ2innen, divi )
coords3innen_divi = rs.DivideCurve( circ3innen, divi )


#lines zwischen circ2 und circ2innen

for i in range(divi):
    circ2_circ2innen_divi = []
    circ2_circ2innen_divi.append(coords2_divi[i])
    circ2_circ2innen_divi.append(coords2innen_divi[i])    
    rs.AddCurve( circ2_circ2innen_divi, 1)

#lines zwischen circ3 und circ3innen

for i in range(divi):
    circ3_circ1innen_divi = []
    circ3_circ1innen_divi.append(coords3_divi[i])
    circ3_circ1innen_divi.append(coords3innen_divi[i])    
    rs.AddCurve( circ3_circ1innen_divi, 1)
    
#lines zwischen circ2 und circ3

for i in range(divi):
    circ2_cir3_divi = []
    circ2_cir3_divi.append(coords2_divi[i])
    circ2_cir3_divi.append(coords3_divi[i])    
    rs.AddCurve( circ2_cir3_divi, 1)
    
#lines circ2innen circ3innen

for i in range(divi):
    circ2innen_cir3innen_divi = []
    circ2innen_cir3innen_divi.append(coords2innen_divi[i])
    circ2innen_cir3innen_divi.append(coords3innen_divi[i])    
    rs.AddCurve( circ2innen_cir3innen_divi, 1)



#speichen ebene2

if 0:
    
    for cor in range(divi_speichen):
        if cor%3: 
            speichen_2 = []
            speichen_2.append(coords2innen[cor])
            speichen_2.append(coords2mini[cor])
            crv_speichen_2 = rs.AddCurve(speichen_2, 1)

#speichen ebene3

    for cor in range(divi_speichen):
        if cor%3:
            speichen_3 = []
            speichen_3.append(coords3innen[cor])
            speichen_3.append(coords3mini[cor])
            crv_speichen_3 = rs.AddCurve(speichen_3, 1)

    aussenCrvs = []
    innenCrvs = []

    for i in range(divi_speichen):
        pu2 = coords2[i] 
        pu3 = coords2innen[i] 
        rs.AddLine( pu2,pu3 )
        po2 = coords3[i] 
        po3 = coords3innen[i] 

        aussenCrv = rs.AddLine( po2, pu2 )
        innenCrv = rs.AddLine( po3, pu3 )
        aussenCrvs.append( aussenCrv )
        innenCrvs.append( innenCrv )

    for i in range(divi_speichen-1):
        lin2 = aussenCrvs[i]
        lin3 = aussenCrvs[i+1]
        if i%2==0:
            #rs.AddLoftSrf( [lin2, lin3] )
            p2 = coords2[i]
            p3 = coords3[i+1]
            centerField = dm2.pntInbetween(p2, p3, 0.5)
            #crv = rs.AddLine( centerField, center0)

#verbindung minis 0 und 1

divi_verb_minis = divi_speichen*4
coords0mini = rs.DivideCurve(circ0mini, divi_verb_minis, 0)
coords1mini = rs.DivideCurve(circ1mini, divi_verb_minis, 0)

if 1:
    
    for cor in range(divi_verb_minis): 
        verb_minis_0_1 = []
        verb_minis_0_1.append(coords0mini[cor])
        verb_minis_0_1.append(coords1mini[cor])
        crv_verb_minis_0_1 = rs.AddCurve(verb_minis_0_1, 1)

#verbindung minis 2 und 3

coords2mini = rs.DivideCurve(circ2mini, divi_verb_minis, 0)
coords3mini = rs.DivideCurve(circ3mini, divi_verb_minis, 0)

if 1:
    
    for cor in range(divi_verb_minis): 
        verb_minis_2_3 = []
        verb_minis_2_3.append(coords2mini[cor])
        verb_minis_2_3.append(coords3mini[cor])
        crv_verb_minis_2_3 = rs.AddCurve(verb_minis_2_3, 1)

#verbindung micros 1 und 2

coords1micro = rs.DivideCurve(circ1micro, divi_verb_minis, 0)
coords2micro = rs.DivideCurve(circ2micro, divi_verb_minis, 0)

if 1:
    
    for cor in range(divi_verb_minis): 
        verb_micros_1_2 = []
        verb_micros_1_2.append(coords1micro[cor])
        verb_micros_1_2.append(coords2micro[cor])
        crv_verb_micros_1_2 = rs.AddCurve(verb_micros_1_2, 1)

#verbindung mini und micro 1

if 1:
    
    for cor in range(divi_verb_minis): 
        verb_mini_micro_1 = []
        verb_mini_micro_1.append(coords1mini[cor])
        verb_mini_micro_1.append(coords1micro[cor])
        crv_verb_mini_micro_1 = rs.AddCurve(verb_mini_micro_1, 1)

#verbindung mini und micro 2

if 1:
    
    for cor in range(divi_verb_minis): 
        verb_mini_micro_2 = []
        verb_mini_micro_2.append(coords2mini[cor])
        verb_mini_micro_2.append(coords2micro[cor])
        crv_verb_mini_micro_2 = rs.AddCurve(verb_mini_micro_2, 1)



#schliessen des zylinder

#hier gibt es probleme, weil der kreis ueber den radius hinausgeht, wie loese ich es?

for i in range(1,50):
    circ3mini = rs.AddCircle (center3_1, radius/ i)
    circ0mini = rs.AddCircle (center0, radius/ i)

#radius = 90.0
#hoehe  = 10.4
cylinder = rs.AddCylinder([0,0,-3.0*2], hoehe*7, radius+3.0*2, cap=1) 

ganzesSpaceship = rs.ObjectsByLayer("SPACESHIP")

impaktPoint = rs.VectorAdd(impaktPoint, [-150,330,-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))