
#HAUSUEBUNG 09 ELISA WIDHALM#

######################
# DM2_w21_ue_09      #
# _Fun_With_Sun      #
# tool4_ra           #
##########_basic_setup

###___________________________
import rhinoscriptsyntax as rs
import random
import sys
sys.path.append( "/Volumes/app/WWW/sonne17/dm2/library" )
sys.path.append( "P:/" )
import dm2_lib as dm2
###___________________________
#reload (dm2)

rs.EnableRedraw(0)                                      # speed up !
rs.UnitSystem(4)                                        # km = 5, meters = 4, cm = 3 etc
rs.Command("-groundplane Options On=No enter enter", 0) # groundplane > 0 = off
rs.ShowGrid(None, 1)                                    # grid > 0 = off
rs.ShowGridAxes(None, 1)                                # y/y/z axen display > 0 = off
rs.ViewDisplayMode(view=None, mode="Rendered")			# shadeMode fuer current view
rs.Command("cplane w t enter", 0)						# cPlane World Top
rs.Command("PrintDisplay State=Off Color=Display Thickness=40 enter", 0)

rs.UnselectAllObjects()
dm2.newEmptyLayer( "PROJ::crv", [200,  10, 20] )
dm2.newEmptyLayer( "PROJ::srf", [ 100,  100, 200] )
dm2.newEmptyLayer( "PROJ::tmp",  [140,  120, 140] )
rs.Redraw()
###________________
dm2.ort = "giza"   # for calculation of sun_angles: latitude, longitude and timeZone
dat = dm2.dat

###_________________________# open giza_00_osm.3dm
if 0:
    rs.EnableRedraw(1)
    dm2.newEmptyLayer( "OSM" )
    rs.Command("_-open No \"giza_00.3dm\" _enter _enter", 0)
    rs.ZoomExtents()
    rs.EnableRedraw(0)
###_________________________#


##################
# list of pyramids
# list_name    "name"      height*)  OSM_ID         *)lt wiki
cheops    =  [ "cheops",    146.60, "4420397"] 
chefren   =  [ "chefren",   143.50, "4420396"]
mykerinos =  [ "mykerinos",  65.00, "4420398"]
henutsen   = [ "henutsen",   29.60, "219797726"]    # Princess: King's daughter: daughter of Khufu (but more likely to be a wife)
meritetis  = [ "meritetis",  30.00, "219797724"]   # King's wife: Wife of Khufu
hetepheres = [ "hetepheres", 30.25, "198032492"]  # Queen HetepheresKing's wife, king's daughter: Wife of Sneferu and mother of Khufu 
khentkawes = [ "khentkawes", 18.50, "73174154"]  # Queen 
queen_A = [ "queen_A", 21.2, "25416060"]        # Queen A
queen_B = [ "queen_B", 21.2, "25416067"]       # Queen B
queen_C = [ "queen_C", 21.2, "25416093"]      # Queen C
##############################################
# collect pyramid_list into one pyramids_list
pyramids = dm2.pyramids

########### 
if 0:   ### generate the pyramid's faces
        ### check the faces's ObjectName
    dm2.newEmptyLayer( "GIZA::pyramids", [140,140,40] )
    dm2.rgbMat2Lay("GIZA::pyramids", 200,200,40, T=0.1, Gloss=0.1, Refl=0.1, matNam="pyraMat" )
    for i in range( len(pyramids) ):
        print pyramids[i][0],":\t",pyramids[i][1], "meters"
        dm2.makePyramid ( NameOrNumber=i, SrfsOrCrvs=1, verbose=0 )
        dm2.zA()
    ###########################nota:
    # pyramids[i][0] = name        #
    # pyramids[i][1] = height      #
    # pyramids[i][2] = OSM_ID      #
    # pyramids[i][3] = top_coord   #
    # pyramids[i][4] = baseCoords  #
    ################################


dm2.newEmptyLayer( "PROJ::tmp",  [140,  120, 140] )

p0 = pyramids[2][3]
p1 = pyramids[0][3]
p2 = pyramids[6][3] # khentkawes

p01 = dm2.pntInbetween( p0, p1, 0.5)    #Kruemmung point in between
p01[2] -= rs.Distance( p0, p1 )*0.12
p12 = dm2.pntInbetween( p1, p2, 0.5)
p12[2] -= rs.Distance( p1, p2 )*0.06
p20 = dm2.pntInbetween( p2, p0, 0.5)
p20[2] -= rs.Distance( p2, p0 )*0.12



vec0112 = rs.VectorSubtract( p01, p12 )
p01 = rs.VectorAdd( p01, vec0112*-0.2)
p12 = rs.VectorAdd( p12, vec0112*0.2)
vec2001 = rs.VectorSubtract( p20, p01 )
p20 = rs.VectorAdd( p20, vec2001*-0.2)

crv01 = rs.AddCurve( [p0, p01, p1], 2 )
crv12 = rs.AddCurve( [p2, p12, p1], 2 )
crv20 = rs.AddCurve( [p2, p20, p0], 2 )

srf = rs.AddEdgeSrf( rs.AllObjects()[0:3] )

##############################

rs.CurrentLayer( "PROJ::crv" )
anz = 15
coords = rs.DivideCurve( crv20, anz, 0)
allCoords = []
for cor in coords:
    param = rs.SurfaceClosestPoint(srf, cor)
    crv = rs.ExtractIsoCurve( srf, param, 1 )
    allCoords.extend( rs.DivideCurve(crv, anz, 0) )
    rs.DeleteObject( crv )
rs.DeleteObject( srf )
#dm2.textDots( allCoords )



def mypanel (panel, segments, hoehe):
    pnts = []
    
    
    MIDPnt = dm2.pntCentroid(allCoords)
    MIDPnt[2]=0
    panel1= []

    panel1.append(panel[0])
    panel1.append(panel[1])
    panel1.append(panel[2])
    panel1.append(panel[3])
    
    mid1 = dm2.pntCentroid(panel1)
    pnts.append (mid1)
    vec = [mid1[0],mid1[1],mid1[2]+hoehe]

    
    CrvPnl1 = rs.AddCurve( [panel1[0], panel1[1]] )
    crvPnl1 = rs.DivideCurve (CrvPnl1,segments,0,1)
    rs.DeleteObject(CrvPnl1)
    CrvPnl2 = rs.AddCurve( [panel1[1],panel1[2]])
    crvPnl2 = rs.DivideCurve (CrvPnl2,segments,0,1)
    rs.DeleteObject(CrvPnl2)
    CrvPnl3 = rs.AddCurve([panel1[2],panel1[3]])
    crvPnl3 = rs.DivideCurve (CrvPnl3,segments,0,1)
    rs.DeleteObject(CrvPnl3)
    CrvPnl4 = rs.AddCurve([panel1[3],panel1[0]])
    crvPnl4 = rs.DivideCurve (CrvPnl4,segments,0,1)
    rs.DeleteObject(CrvPnl4)
    
    crvPnl = []
    crvPnl.extend(crvPnl1)
    crvPnl.extend(crvPnl2)
    crvPnl.extend(crvPnl3)
    crvPnl.extend(crvPnl4)
    
    if 0:
        for i, pt in enumerate(crvPnl):
            Crv = rs.AddLine(crvPnl[i],vec)
            rs.ObjectColor(Crv,[0,0,0])
    
    if 1:
        for i, pt in enumerate(crvPnl):
            vec3 = [mid1[0],mid1[1],mid1[2]]
            crv = []
            crv.append(crvPnl[i])
            crv.append(vec3)
            crv.append(vec)
            Crv = rs.AddCurve(crv)
            rs.ObjectColor(Crv,[0,0,0])
    return vec

gizaCoords = []
for x in range(anz):
    for y in range(anz):
        y += (anz+1)*x
        p0 = allCoords[y+anz+1]
        p1 = allCoords[y]
        p2 = allCoords[y+1]
        p3 = allCoords[y+anz+2]
        #rs.AddSrfPt( [p0,p1,p2,p3] )
        gizaCoords.append( [p0,p1,p2,p3] )


if 1:
    vecList = []
    for i in range (len(gizaCoords)):
        panel = gizaCoords[i]
        coords = panel[:]   #kopie liste panel
        coords.append(coords[0])
        distX = rs.Distance(coords[0], coords[1])
        #crv = rs.AddCurve( coords )
        #areaX = rs.CurveArea( crv )[0]
        #print distX 
        
        hoeheX = 15                 #hoehe veraendert sich je nach groesse des panels
        if distX > hoeheX:
            hoeheX = distX
        vecList.append( mypanel (panel, 5, hoeheX) )

#rs.AddCurve( vecList, 1 )

#dm2.textDots( vecList )

y=0                     #loop
for x in range(anz-1):
    for y in range(anz-1):
        y += anz*x
        p0 = vecList[y]
        p1 = vecList[y+1]
        p2 = vecList[y+anz+1]
        p3 = vecList[y+anz]
        #rs.AddSrfPt( [p0, p1,p2,p3] )
        rs.AddCurve( [p0, p1,p2,p3, p0], 1 )    #zweischaligkeit durch diagonalen und kurve ueber den spitzen
        rs.AddCurve( [p0, p2], 1 )
        rs.AddCurve( [p1, p3], 1 )



'''

panel = gizaCoords[0]
mypanel (panel,5,15)
'''