############################
### diag @ IAM @ DM2_w25 ###
### hu_04 dmLodge_startUP_00
############################

##############################
import rhinoscriptsyntax as rs      ###
import random, time, sys            ###
sys.path.append("P:/WWW/limafi/dm2")              ### add LW P:/ to rhino's default search path AND
sys.path.append("P:/WWW/diag/dm2")  ### add YOUR LW P:/WWW/user/dm2/ to rhino's default search path ...
import DM_lib as dm                 ### ... thus DM_lib.py can be found !
##############################      reload (dm)


rs.UnitSystem(4)                                        # km = 5, meters = 4, cm = 3 etc
rs.ShowGrid(None, 0)                                    # grid > 0 = off
rs.ShowGridAxes(None, 1)                                # y/y/z axen display > 0/1 = off/on
rs.ViewDisplayMode(view=None, mode="wireframe")			# shadeMode fuer current view
rs.AppearanceColor(item=0, color=[230, 230, 230])       ### item=0 => backgroundColor [R,G,B] | 230/230/230 == lightgray
rs.Command("cplane w t enter", 0)						# cPlane World Top
dm.printDisplay(0)                                      # nomen est omen

rs.EnableRedraw(0)                                      ### 4_the_MACs: try 0/1 !
rs.UnselectAllObjects()
dm.newEmptyLayer( "Default")                            
dm.newEmptyLayer( "LODGE", [32, 32, 32] )
dm.newEmptyLayer( "LODGE::demo")    ### newEmtyLayer ist 'current'
dm.newEmptyLayer( "LODGE::setUp",  [111,  11, 111] )    ### newEmtyLayer ist 'current'
dm.newEmptyLayer( "LODGE::crv", [200,  20, 20] )
dm.newEmptyLayer( "LODGE::pnt", [ 100,  100, 100] )
rs.Redraw()
wait = 1

def info():
    ##############################################
    """ LODGE
    Generate a small archetypal house, distorted along perspective algorithms
    A setup for the development of individual panels
    Inspired by
      Albrecht Duerer's "Underweysung" (1525)
      https://de.wikipedia.org/wiki/Perspektive#Geschichte
      https://en.wikipedia.org/wiki/Albrecht_Duerer
    And
      MVRDVs "Porterlodges for the National Park De Hoge Veluwe" (1996)
      https://mvrdv.com/projects/167/hoenderloo-lodge?photo=15877
    Parameters:
      p_width (float, optional): Approx. panel width in units
      l_dist (float, optional): Approx. length of the lodge in units
      d_dist (float, optional): Approx. depth of the lodge in units
      h_dist (float, optional): Approx. height of the lodge in units
      x_pos (float, optional): Move origin of the lodge in x
      y_pos (float, optional): Move origin of the lodge in y
      d_grid (boolean, optional): Fixed depth grid on the the small sides
      d_distord (boolean, optional): Distord basic section of the house
      demo (boolean, optional): Run demo to get an object
      verbose (int, optional): talk & sleep / Print and depict generation of the lodge
    Returns:
      return[0] = list[][][] of all panels, containing groups of 4 points
      return[1] = list[][][] of just the sleeve's panels
      return[2] = list[][][] of just the right section's panels
      return[3] = list[][][] of just the left section's panels
      return[4] = list[][][] of the sections, containing groups of 5 points
      return[5] = list[][] of all the cvs on the sleeve
      return[6] = list[][] of all the cvs on the right section
      return[7] = list[][] of all the cvs on the left section
    Example:
      allData = dm.getLodge( verbose=1000, demo=1 )
      panels = allData[0]
      panels_sleeve = allData[1] // sleeve ~= hull
      panels_right = allData[2]
      panels_left = allData[3]
        sections = allData[4]
        cvs_sleeve= allData[5]
        cvs_right= allData[6]
        cvs_left= allData[7]
    ### allData = dm.getLodge( p_width=1.2, l_dist=10, d_dist=8, h_dist=6, pos_x=0, pos_y=0, d_grid=0, d_distord=1, demo=0, verbose=0 )
    """


### exec whenever ##################################
#dm.allLodgeData = dm.getLodge( demo = 0, verbose=0 )    ### activate this to get a new set of data
allLodgeData    = dm.allLodgeData                       ### this set of data is generated @ startUp (when DM_lib is loaded)
####################################################    ### allLodgeData = [ panels, panels_sleeve, panels_right, panels_left, sections, cvs_sleeve, cvs_right, cvs_left ]

'''
' check setup - just visualization of setUp >> dont execute @ final version of homework <<                                      '
'''
rs.CurrentLayer("LODGE")

def printme (toprint="hallo Michael", a=17, b=444): #default 
    print "hello W"
    print toprint
    print a, "plus", b, "=", a+b

printme(toprint="blackjack", a=17, b=4) #befehl aufrufen - steuern was passiert 

def myPanel( panelX, degree=2 ):
    #p0 = panelX[0]
    #p1 = panelX[1]
    p0,p1, p2, p3 = panelX #liste einzelnen eintraege abrfragen 
    #panelX.append( p0 )
    rs.AddCurve( panelX, degree )
    #rs.AddLine( p0, random.choice([p1, p2, p3] ))
    #rs.AddLine( p1, random.choice([p0, p2, p3] ))
    if 0 and i==0:
        dm.textDots( panelX )


def myKaro( panXXX, degree=2, nachVorn = 0.3, anz=8 ):
    #p0 = panelX[0]
    #p1 = panelX[1]
    p0, p1, p2, p3 = panXXX
    
    mPt01 = dm.pntInbetween(p0, p1, fac=0.5)
    mPt12 = dm.pntInbetween(p1, p2, fac=0.5)
    mPt23 = dm.pntInbetween(p2, p3, fac=0.5)
    mPt30 = dm.pntInbetween(p3, p0, fac=0.5)
    karo_coords = [mPt01,mPt12,mPt23,mPt30]
    karo_coords.append( karo_coords[0] )
    #rs.AddPoint( mPt01 )
    rs.AddCurve( karo_coords, 1 )
    #panelX.append( p0 )
    rs.AddCurve( panXXX, degree )
    lin03 = rs.AddLine( p0, p3 )
    center = dm.pntInbetween(mPt01, mPt23, 0.5)
    rs.AddPoint( center )
    vec0 = rs.VectorSubtract(p1, p0)    
    vec1 = rs.VectorSubtract(p2, p0) 
    norm_vec = rs.VectorCrossProduct(vec0, vec1)
    norm_vec = rs.VectorUnitize(norm_vec)
    norm_vec = rs.VectorScale(norm_vec, nachVorn)
    norm_vec = rs.VectorAdd(center, norm_vec)
    rs.AddLine( center, norm_vec)
    #lin0 = rs.AddLine(p0, norm_vec)
    #lin1 = rs.AddLine(p1, norm_vec)
    #lin2 = rs.AddLine(p2, norm_vec)
    #lin3 = rs.AddLine(p3, norm_vec)
    crv0v3 = rs.AddCurve( [p0, norm_vec, p3], 1)
    
    coords03 = rs.DivideCurve(lin03, anz, 0)
    coords0v3 = rs.DivideCurve(crv0v3, anz, 0)
    for i in range(1,anz):
        rs.AddLine(coords03[i], coords0v3[i])
    
    
    
    if 1 and i==0:
        dm.textDots( panelX )



############################################
for i,panelX in enumerate( allLodgeData[1][0:9]):  ##vorddere paneele [0:1] nur erstes panel 
    pass
    #myPanel( panelX, degree=1) ### damit wird die def ausgefuehrt und was unten veraendert wird, wird so gemacht 
    if i%4 == 0:
         myKaro( panelX, degree=1, nachVorn = 0.2, anz=88 )

############################################

'''              
' end check setup                                                                                                                   ' 
'''


#######################################
################ HERE YOU GO AS YOU GO:
rs.CurrentLayer("LODGE")                          ### or LODGE:: >> goto sublayer !



########################## HERE YOU END
#######################################


########## EOS / EndOfScript
rs.EnableRedraw(1)          ### 4_the_MACs
#dm.eDup( 1 )               ### delete duplicate objects 
dm.printDisplay(1)
dm.zA( 0.9 )
rs.CurrentLayer("Default")
if wait:
    rs.Sleep( wait )
    rs.LayerVisible("LODGE::setUp", 0)
