### https://iam.tugraz.at/dm2/w20/diag/dm2/hu_08/emma_kretz_hu_08.py
### grabbed:  2020-12-09 18:09:58
#################################


######## DM2
######## iam@richdank.com
######## http://iam.tugraz.at/dm2/
######## template 201204: structure 4duerer

######## import
import rhinoscriptsyntax as rs
import sys
sys.path.append( "P:/" )
import dm2_lib as dm2
import random

######## erase all
dm2.eA()

######## run the lodge demo ...
dm2.newEmptyLayer("LODGE::base", [0,0,0])
if 1 :
    all_data = dm2.getLodge( verbose=0, demo=0 )
    panels = all_data[0]
    panels_sleeve = all_data[1]
    panels_right = all_data[2]
    panels_left = all_data[3]
    sections = all_data[4]
    cvs_sleeve = all_data[5]
    cvs_right= all_data[6]
    cvs_left= all_data[7]

######## ... or generate a matrix of lodges
elif 1 :
    dm2.newEmptyLayer("LODGE::base::matrix", [0,0,0])
    max_x = 4
    max_y = 4
    for x in range( max_x ) :
        for y in range( max_y ) :
            dm2.getLodge( pos_x=(x+.5-max_x/2)*16, pos_y=(y+.5-max_y/2)*16, verbose=0, demo=1 )



###Hausuebung8


rs.EnableRedraw(0)
print panels_sleeve[0]
dm2.newEmptyLayer("LODGE::base::panel_0", [0,0,0])

fac_1 = -0.75
fac_2 = 0.25
fac_3 = 0.8
fac_4 = -0.2
deg_1 = 1
deg_2 = 1
num = 130



def panel_0 (pan,i) :
    pnt_center = dm2.pntCentroid(pan)                           #mittelpunkt eines panels
    
    vec_a = rs.VectorSubtract(pan[1], pan[0])                   #vector generieren von stelle 0 nach 1
    vec_b = rs.VectorSubtract(pan[1], pan[2])                   #vector generieren von stelle 2 nach 1
    
    vec_a_scale = rs.VectorScale(vec_a, fac_1)                  #vector skalieren um den faktor1
    vec_b_scale = rs.VectorScale(vec_b, fac_2)                  #vecror skalieren um faktor2
    
    norm_vec = rs.VectorCrossProduct(vec_a_scale, vec_b_scale)  #orthogonal zu vec_a_scale und vec_b_scale
    norm_vec_scale = rs.VectorScale(norm_vec, fac_4)            #skalierung auf -0.5 -> nach innen
    
    vec_0 = rs.VectorSubtract(pnt_center, pan[0])               #vektor von der mitte zu den eckpunkten eines panels
    vec_1 = rs.VectorSubtract(pnt_center, pan[1])
    vec_2 = rs.VectorSubtract(pnt_center, pan[2])
    vec_3 = rs.VectorSubtract(pnt_center, pan[3])
    
    vec_0_scale = rs.VectorScale(vec_0, fac_3)                  #skalierung: entspricht 80 prozent der laenge des vektors -> 20 prozent fensterflaeche
    vec_1_scale = rs.VectorScale(vec_1, fac_3)
    vec_2_scale = rs.VectorScale(vec_2, fac_3)
    vec_3_scale = rs.VectorScale(vec_3, fac_3)
    
    pnt_0 = rs.VectorAdd(pan[0], norm_vec)                      #vektor von eckpunkten bis zum normalvektor -> festlegung der punkte fuer die fenster
    pnt_1 = rs.VectorAdd(pan[1], norm_vec)
    pnt_2 = rs.VectorAdd(pan[2], norm_vec)
    pnt_3 = rs.VectorAdd(pan[3], norm_vec)
    
    if 1:
        pnt_0 = rs.VectorAdd(pnt_0, vec_0_scale)                #vektor hinzufuegen, der sich auf vectorscale von vorher bezieht
        pnt_1 = rs.VectorAdd(pnt_1, vec_1_scale)
        pnt_2 = rs.VectorAdd(pnt_2, vec_2_scale)
        pnt_3 = rs.VectorAdd(pnt_3, vec_3_scale)
        
        mov_u = rs.VectorScale( vec_0_scale, random.uniform(-0.5, 0.5) )
        mov_v = rs.VectorScale( vec_2_scale, random.uniform(-0.5, 0.5) )
        movVec = rs.VectorAdd(mov_u, mov_v) 
        pnt_0 = rs.VectorAdd(pnt_0, movVec)                     #vektor hinzufuegen, der sich auf vectorscale von vorher bezieht
        pnt_1 = rs.VectorAdd(pnt_1, movVec)
        pnt_2 = rs.VectorAdd(pnt_2, movVec)
        pnt_3 = rs.VectorAdd(pnt_3, movVec)
    
    
    
    crv0 = [pan[0], pan[1], pan[2], pan[3], pan[0]]     #liste festlegen fuer aussenliegende curve eines panels
    crv0 = rs.AddCurve(crv0, deg_1)                     #curve generieren
    crv1 = [pnt_0, pnt_1, pnt_2, pnt_3, pnt_0]          #liste fuer fensterpunkte
    crv1 = rs.AddCurve(crv1, deg_2)                     #curve, die fensterpunkte verbindet
    
    #kurven unterteilen und verbinden
                        
    for n in range (num+1) :
        fac = n/num
        coord0 = dm2.pntCurvePerp(crv0, fac)     
        coord1 = dm2.pntCurvePerp(crv1, fac)
        rs.AddLine(coord0, coord1)
    rs.DeleteObjects( [crv0] )



#auf alle panels uebertragen
for p,panel in enumerate(panels_sleeve) :
        panel_0 (panel, p)           
