################################### ### DM2_w24 # AGruber@tugraz.at ### ### hu_06 UN_headquaters NYC ### ###################################################### ### paneling / new dimensions ### 87.5 x 22.0 meters (was lenY = 116.56 / lenX = 28.18) ################################### ###################################################### ################################### ### DM2_w24 # AGruber@tugraz.at ### ### hu_06 UN_headquaters NYC ### ###################################################### ### paneling / new dimensions ### 87.5 x 22.0 meters (was lenY = 116.56 / lenX = 28.18) ################################### ###################################################### ############################## import rhinoscriptsyntax as rs import random, time, sys, os ### #sys.path.append("P:/") ### sys.path.append("C:\Users\giulia\Documents\A_STUDIUM\DM_2") import DM_lib as dm ### 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(rs.CurrentView(), "wireframe") rs.ViewDisplayMode(rs.CurrentView(), "rendered") rs.Command("cplane w t enter", 0) # cPlane World Top dm.PointRadius(displayModeX=0, rad=3, styl=3) dm.printDisplay(1, 2000) # nomen est omen rs.EnableRedraw(0) ###_________________________________________# ### basic settings for grid to fit UN_slab # ### # floors = H = dm.H = 40 # default=40 / incl roof slabs = L = dm.L = 11 # default=11 depth = D = dm.D = 4 # default= 4 / division in building_depth floorHeight = fH = dm.fH = 4.0 # default= 4.0 / 4.0*(H-1) = 156 meters # ################ # get from DM_lib as dm: UnoGridCoords = dm.UnoGridCoords # get gridCoords L*D*H = 1760 UnoPanelCoords = dm.UnoPanelCoords # get panelCoords [frontPanels, backPanels, sidePanels, upSidePanels] / default arguments s.u. ################____________________________# ################ lengthVec = lVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) )) ## rs.AddPoint( dm.getUnoCoord(1, 0, 0) ) depthVec = dVec = rs.VectorUnitize(rs.VectorSubtract( dm.getUnoCoord(0, 1, 0), dm.getUnoCoord(0, 0, 0) )) ## rs.AddPoint( dm.getUnoCoord(0, 1, 0) ) ################ ########################################################################################### UnoPanelCoords = dm.getUNpanelCoords(anzL=10*7, anzH=39, anzD=3, stepL=1, stepH=1, stepD=1) ### = all ~windows_panels BigPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=2, stepH=6, stepD=2) ### = all ~windows_panels UnoPanelCoords = dm.getUNpanelCoords(anzL=int(9*1.5), anzH=int(39*1.4), anzD=3, stepL=1, stepH=2, stepD=1) ### = standard for hu_06 LX=18 ## int(9*2) HX=74 ## int(39*1.9) UnoPanelCoords = dm.getUNpanelCoords(anzL=LX, anzH=HX, anzD=3, stepL=1, stepH=2, stepD=1) ### = standard for hu_06 ########################################################################################### ########################################################## frontPanels = UnoPanelCoords[0] ### list of coordLists ! backPanels = UnoPanelCoords[1] sidePanels = UnoPanelCoords[2] upSidePanels = UnoPanelCoords[3] allPanels = UnoPanelCoords[4] ################################# dm.newEmptyLayer("UNO::setUp", [120,120,240]) dm.getCameraTarget() if 1: ### SETUP >> dont' exec @ homework ! # outlines UNO Headquartes rs.ObjectColor(rs.AddCurve( [dm.getUnoCoord(0,0,0), dm.getUnoCoord(0,0,39), dm.getUnoCoord(10,0,39), dm.getUnoCoord(10,0,0), dm.getUnoCoord(10,3,0), dm.getUnoCoord(0,3,0), dm.getUnoCoord(0,3,39), dm.getUnoCoord(10,3,39)], 1), [100,111,100]) rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 1, 0) ), [222, 0, 0] ) rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(1, 0, 0) ), [0, 222, 0] ) rs.ObjectColor(rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(0, 0, 2) ), [0, 0, 222] ) #rs.ObjectPrintWidth( rs.AllObjects()[0:4], 1.0 ) #rs.ZoomExtents() #for coords in BigPanelCoords[4]: rs.AddCurve( coords, 1 ) allPanels = [[dm.getUnoCoord( 0, 0, 20), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord(10, 0, 39), dm.getUnoCoord(10, 0, 20)]] # Rahmen fur Anordnung Blende allPanels.append([dm.getUnoCoord( 0, 0, 0), dm.getUnoCoord( 0, 0, 20), dm.getUnoCoord(10, 0, 20), dm.getUnoCoord(10, 0, 0)]) random.shuffle(allPanels) def dividePanel( panel=allPanels[0], maxPanels=50, minHig=4.0 ): #midhig nicht uber 5... verstellen Rhino schmiert ab + midhight reguliert fein teiigkeit dm.esc() #teil ein segment der fassade in 4 kleine Segmente if maxPanels>500: maxPanels=500 #random.shuffle(allPanels) #ordnet Blende random an if rs.Distance( panel[0], panel[1] ) > minHig*2: allPanels.remove( panel ) pMid = dm.pntInbetween(panel[0],panel[2]) allPanels.append([panel[0], dm.pntInbetween(panel[0],panel[1]), pMid, dm.pntInbetween(panel[3],panel[0])]) allPanels.append([dm.pntInbetween(panel[0],panel[1]), panel[1],dm.pntInbetween(panel[1],panel[2]), pMid]) allPanels.append([pMid, dm.pntInbetween(panel[1],panel[2]), panel[2], dm.pntInbetween(panel[2],panel[3])]) allPanels.append([dm.pntInbetween(panel[0],panel[3]), pMid, dm.pntInbetween(panel[2],panel[3]), panel[3]]) if len(allPanels) <= maxPanels : dividePanel( panel=random.choice( allPanels[0: int(len(allPanels)*0.7)]), maxPanels=maxPanels ) # wenn panel kleiner als max wird random panel mit faktor multipliziert dividePanel(panel=allPanels[0], maxPanels=128, minHig=4.0 ) print "::: len(allPanels)",len(allPanels) #_____________________________here you go: dm.newEmptyLayer("myPROJ", [10,11,12]) #dm.ort= "NYC UN" sunVec = dm.setSun(year=2024, mon=12, day=20, hour=16, min=0, sec=0, verbose=1)[2] #setting Sonne sunVec = rs.VectorScale(sunVec, -100.0) print rs.VectorLength( sunVec ), "meters" print sunVec def gC(L,D,H): return dm.getUnoCoord(L,D,H) #################################### #################################### #################################### bahnLage = bL =0 p00 = rs.VectorAdd(gC(random.randint(0,0), bL, 35), rs.VectorScale(lVec, 0.0)) p0 = gC(random.randint(7,10), bL, 35) p1 = gC(8, bL, random.randint(20,30)) p2 = gC(0, bL, 20) p3 = gC(10, bL, 15) p4 = gC(5, bL, 10) p5 = gC(8, bL, 7) p6 = gC(4, bL, 20) p7 = gC(10, bL, 5) p8 = gC(1, bL, 15) p9 = gC(9, bL, 2) p10 = gC(6, bL, 25) p11 = gC(1, bL, 30) coords = [p00, p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p00] xxx = rs.AddCurve( coords, 2 ) rs.ObjectName(xxx, "xxx") coords = rs.CurveEditPoints(rs.ObjectsByName("xxx")[0]) #print coords rs.DeleteObject( rs.ObjectsByName("xxx")[0] ) bahn = rs.AddCurve( coords, 1 ) rs.ObjectName(bahn, "bahn") bahn = rs.ObjectsByName("bahn")[0] rs.HideObject( rs.ObjectsByName("bahn")[0] ) rs.Redraw() #Definition der Sonnenrichtung und der Ebenen def myPanel(panel, cnt=0): p0,p1,p2,p3 = panel coords = [p0,p1,p2,p3, p0] rs.AddCurve( coords, 1 ) cenPt = dm.pntInbetween( p0, p2 ) #erstellt mittelpunkt der Diagonalen in der Fassade #rs.AddPoint( cenPt ) sunPt = rs.VectorAdd(cenPt, sunVec) sunBeam = rs.AddLine(cenPt, sunPt) centerBrunnen = [707.636,597.570,0.000] vec = rs.VectorSubtract(cenPt, [707.636,597.570,0.000]) vec = rs.VectorUnitize(vec) vec = rs.VectorScale( vec, -100) reflBeam = rs.AddLine(cenPt, rs.VectorAdd(cenPt, vec) ) tweenCrv = rs.AddTweenCurves(sunBeam, reflBeam, number_of_curves = 1, method = 1, sample_number = 10) #Ebene fur projezierten schatten planeNorm = rs.CurvePerpFrame(tweenCrv, 0.0) #circ = rs.AddCircle( planeNorm, 5.0) rect = rs.AddRectangle( planeNorm, 8.75*0.9, 12.0*0.9) coords = rs.CurveEditPoints(rect) centerRect = dm.pntInbetween(coords[1], coords[3] ) #rs.AddPoint( centerRect ) movVec = rs.VectorSubtract(cenPt, centerRect) rs.MoveObject( rect, movVec) rs.AddPlanarSrf( rect ) coordsRect = rs.CurveEditPoints(rect) #dm.textDots(coordsRect) for i in range(4): rs.AddLine(panel[i], coordsRect[i+1]) rs.DeleteObjects( [tweenCrv, reflBeam, sunBeam] ) if cnt%20==0: #if random.uniform(0,1) < 0.1: reflBeam = rs.AddLine(cenPt, centerBrunnen ) #rs.CurveArrows(reflBeam, arrow_style=2) sunBeam = rs.AddLine(cenPt, sunPt) rs.CurveArrows(sunBeam, arrow_style=1) #myPanel(panel, cnt=i) minDist = rs.Distance( gC(0,0,0), gC(0,bL,0) ) maxDist = rs.Distance( gC(0,0,0), gC(10,bL,39) ) ### hexaPnts: p0,p1,p2,p3 = frontPanels[0] cenPt_0 = dm.pntInbetween( p0, p2 ) ######## anz = 32 ######## def makeHexaPnts(panel, anz=anz, blendeSize=1.1): #p0,p1,p2,p3 = panel #cenPt_0 = dm.pntInbetween( p0, p2 ) planeX = rs.PlaneFromPoints( cenPt_0, dm.pntInbetween(p0,p1), p1 ) rad = rs.Distance(p0,p3)*0.5*blendeSize #wenn uber 0.5 gestelllt Blenden uberschneiden circ = rs.AddCircle(planeX, rad) hexaPnts = rs.DivideCurve(circ, 6, 0) hexaPnts.append(hexaPnts[0]) XhexaPnts = [dm.pntInbetween(p0,p1,0.25), dm.pntInbetween(p1,p0,0.25), dm.pntInbetween(p1,p2,0.5), dm.pntInbetween(p2,p3,0.25), dm.pntInbetween(p3,p2,0.25), dm.pntInbetween(p3,p0,0.5), dm.pntInbetween(p0,p1,0.25) ] hexagon = rs.AddCurve( hexaPnts, 1 ) blendenPnts = rs.DivideCurve(hexagon, anz*6, 0) blendenPnts = blendenPnts+blendenPnts #dm.textDots(blendenPnts[0:4]) #dm.textDots(blendenPnts[anz*6:anz*12]) rs.DeleteObjects([circ]) rs.DeleteObjects([hexagon]) for blatt in range(0): #Sechseck schleife damit jede Seite unterteilt wird for i in range(anz): pass #rs.AddLine( blendenPnts[blatt*anz], blendenPnts[blatt*anz+1+anz+i%anz]) #rs.ObjectName( rs.AllObjects()[0], "bLine") return [hexaPnts, blendenPnts] hexaCoords_0 = makeHexaPnts(frontPanels[0], anz=anz, blendeSize=0.98) def blendenHexagons(panel): p0,p1,p2,p3 = panel hexaPnts = [dm.pntInbetween(p0,p1,0.25), dm.pntInbetween(p1,p0,0.25), dm.pntInbetween(p1,p2,0.5), dm.pntInbetween(p2,p3,0.25), dm.pntInbetween(p3,p2,0.25), dm.pntInbetween(p3,p0,0.5), dm.pntInbetween(p0,p1,0.25) ] rs.AddCurve( hexaPnts, 1 ) #Definiton fur die Blendengeometrie def blendenPanel(panel, anz=anz, blendeFac=1, blendeSize=0.2): p0,p1,p2,p3 = panel coords = [p0,p1,p2,p3, p0] #rs.AddCurve( coords, 1 ) cenPt = dm.pntInbetween( p0, p2 ) movVec = rs.VectorSubtract(cenPt, cenPt_0) hexaPnts = [ rs.VectorAdd(cor, movVec) for cor in hexaCoords_0[0] ] blendenPnts = [ rs.VectorAdd(cor, movVec) for cor in hexaCoords_0[1] ] ### dist from bahn param = rs.CurveClosestPoint(bahn, cenPt) pOnBahn = rs.EvaluateCurve(bahn, param) #rs.AddPoint( pOnBahn ) dist = rs.Distance( cenPt, pOnBahn ) blende = int(dm.reMap(dist, minDist, maxDist, 1, anz*2-4, limit=1))*blendeFac intervall = 5 wid=0.5 if blende > anz: #intervall = 3 wid=0.3 if blende >= anz*1: pass #blende=anz*2-0 #intervall = 4 wid=0.8 #print "anz > blende", anz, ">", blende #if frameNr==0: if f==11110: hexagon = rs.AddCurve( hexaPnts, 1 ) coords=[] for blatt in range(6):#Sechseck schleife damit jede Seite unterteilt wird for i in range(0,blende,intervall): pass #rs.AddLine( blendenPnts[blatt*anz], blendenPnts[blatt*anz+0+anz+i%blende]) #rs.ObjectName( rs.AllObjects()[0], "bLine") #rs.ObjectPrintWidth(rs.AllObjects()[0], wid) coords.extend( [blendenPnts[blatt*anz], blendenPnts[blatt*anz+0+anz+i%blende], blendenPnts[blatt*anz+1+anz+i%blende]] ) rs.AddCurve( coords, 1 ) rs.ObjectName( rs.AllObjects()[0], "bLine") #rs.Redraw() #blendenPanel(frontPanels[2], anz=anz, blendeFac=2, blendeSize=0.9) rs.CurrentLayer("myPROJ") dm.setCameraTarget( [562.66044717, 671.939802, 78.0], [748.52276333, 570.07075277, 78.0], lens=30, rota=0, upVec=[0,0,1] ) # ... danke, andi ! path = "C:\Users\giulia\Desktop" import os if not os.path.exists(path): os.makedirs(path,) captureIt = 1 frameNr = 0 frames = 250 divi = 250 coords = rs.DivideCurve( bahn, divi, 0) #rs.AddCurve( coords, 1 ) coords.reverse() lenx = 24 dLenx = (lenx-2)/(frames+1) startAt = 0 allPanels = frontPanels[:] print "dLenx", dLenx for f in range(0,frames-1):#-lenx+30): dm.esc() dm.setTime() rs.DeleteObjects(rs.ObjectsByName("bLine")) rs.DeleteObjects(rs.ObjectsByName("bahn")) print "lenx", int(lenx) coordsX = coords[f: f+int(lenx)] if len(coordsX) < 2: print "brrrr..." break bahn = rs.AddCurve( coordsX, 2 ) #rs.AddPoints(coordsX) lenx -= dLenx rs.ObjectName(bahn, "bahn") rs.ObjectColor( bahn, [200,250,0]) rs.ObjectPrintWidth( bahn, 1.0) rs.ObjectPrintColorSource(bahn, 1) #rs.HideObject( bahn ) rs.Redraw() #vorher = len(rs.AllObjects()) for i,panel in enumerate(allPanels[0:]):#frontPanels[20:28]): pass if 0 or f<0: blendenHexagons(panel) dm.esc() if panel[1][2] > 0:# and frameNr==0: blendenPanel(panel, anz=anz, blendeFac=2, blendeSize=0.999) if i and i%(LX*20-1)==0:# and not captureIt: pass rs.Redraw() if captureIt: rs.Redraw() #rs.DeleteObjects(rs.ObjectsByName("bahn")) frameNam = dm.makeName("blendi_01", frameNr, anzahl=4, format='jpg') #rs.SelectObject(bahn) rs.Command("-viewCaptureToFile Width=960 Height=540 Scale=2 DrawCPlaneAxes=No TransparentBackground=No "+path+frameNam+" ", 0) frameNr += 1 dm.getTime(1) print divi, "|",f, "| todo", round((frames-f)*dm.getTime()/60, 2),"min" #____________________________:here you end ################################# #rs.ZoomExtents() rs.EnableRedraw(1) ### 4 the MACs #dm.printDisplay(0) #dm.newEmptyLayer("Default") print "::: FINI"