################################### # Hausuebung 11 # # Spamer_Max Benjamin # # 12033091 # ################################### ############################## import rhinoscriptsyntax as rs import random, time, sys ### sys.path.append("/Users/mbns/Downloads") ### 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.Command("cplane w t enter", 0) # cPlane World Top dm.PointRadius(displayModeX=0, rad=3, styl=3) dm.printDisplay(1) # 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 = 2.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=4, 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=10*2.5, anzH=13, anzD=6, stepL=1, stepH=3, 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]) if 0: ### SETUP >> dont' exec @ homework ! 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,0,200]) 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 ) if 0: ### DEMO >> dont' exec @ homework ! print len(frontPanels) dm.textDots( frontPanels[0] ) for coords in frontPanels[0:10]+sidePanels: pass rs.AddPoints( coords ) rs.AddCurve( coords, 1 ) #rs.AddSrfPt( coords ) #for coords in sidePanels[0:]: # rs.AddPoints( coords ) for coords in BigPanelCoords[4]: pass rs.AddCurve( coords, 1 ) if 0: ### DEMO >> dont' exec @ homework ! #############: ### panel_DEF: def myPanel( panel, basement = 0 ): p0, p1, p2, p3 = panel ### get items (==coords) from list rs.AddLine( p0, p2 ) if basement: crv = rs.AddCurve( [p0, p1, dm.pntInbetween(p1, p3), p2, p3], 1 ) rs.ObjectPrintWidth( crv, 1 ) rs.ObjectColor( crv, [200,200,0]) else: coords = [p0, p1, p2, p3, p0] rs.AddCurve( coords, 2 ) #for i,panel in enumerate(frontPanels[0:50] + sidePanels): for i,panel in enumerate(allPanels): pass basement = 0 if i<20 or i>119: basement = 1 myPanel( panel, basement = basement ) ### basement = (i<20 or i>109) #rs.Redraw() #_____________________________here you go: dm.newEmptyLayer("myPROJ", [100,100,100]) def myPanel(panel, dachl = 0): p0, p1, p2, p3 = panel nVec = dm.normVec3pnts(p0, p1, p2) auskrag = 4.9 zVal = p0[2] auskrag = dm.reMap(-zVal, 0, 156, 10.0, 5.0) # Kein negativer Wert mehr kip = -0.4 #winkel nVec[2] += kip nVec = rs.VectorScale(nVec, auskrag) coords0 = [p0, p1, p2, p3, p0] #rs.AddCurve(coords0, 1) # Grundflaeche panel #nur auf langen seite markise #if panel in sidePanels or panel in upSidePanels: # return #markisen p10 = dm.pntInbetween(p1, p0, 0.3) p23 = dm.pntInbetween(p2, p3, 0.3) p12 = rs.VectorAdd(p1, nVec) p121 = rs.VectorAdd(p2, nVec) anz = 80 # Anzahl der Shades coordsA = [p10, p1, p12, p121, p2, p23] crvA = rs.AddCurve(coordsA, 1) crvI = rs.AddCurve([p10, p1, p2, p23], 2) coordsDivA = rs.DivideCurve(crvA, anz, 0) coordsDivI = rs.DivideCurve(crvI, anz, 0) # Markisen Konstruktion p0X = coordsDivA[int(anz * 0.3)] p3X = coordsDivA[int(anz * 0.7)] rs.AddLine(p0, p0X) rs.AddLine(p3, p3X) for i in range(anz): line = rs.AddCurve( [coordsDivA[i], coordsDivI[i]] ) rs.ObjectColor(line, [225,85, 39]) def myPanel_2( panel, dachl = 0 ): p0, p1, p2, p3 = panel #circle = rs.AddCurve( [p0,p1,p2,p3,p0], 4 ) #kreis # Mittelpunkt Panel center_x = (p0[0] + p1[0] + p2[0] + p3[0]) / 4 center_y = (p0[1] + p1[1] + p2[1] + p3[1]) / 4 center_z = (p0[2] + p1[2] + p2[2] + p3[2]) / 4 center_point = [center_x, center_y, center_z] normal_vec = dm.normVec3pnts(p0, p1, p2) # Normalenvektor aus erster Diagonale diagonal_vec = rs.VectorSubtract(p2, p0) # Diagonale Panel radius = 0.25 * rs.VectorLength(diagonal_vec) # Halbe Diagonale als Radius # Ebene und Kreis plane = rs.PlaneFromNormal(center_point, normal_vec) #circle = rs.AddCircle(plane, radius) # Richtungsvektor von p0 nach p1 parallel_vec = rs.VectorUnitize(rs.VectorSubtract(p1, p0)) # Punkte auf Kreis #circle_points = rs.DivideCurve(circle, 10) # Unterteilungen des Kreises def draw_parallel_lines(panel, num_lines_ver, num_lines_hor): p0, p1, p2, p3 = panel # Zwischenpunkte auf den langen Kanten p1p2 und p3p0 points_p1p2 = rs.DivideCurve(rs.AddLine(p1, p2), num_lines_ver) points_p0p3 = rs.DivideCurve(rs.AddLine(p0, p3), num_lines_ver) points_p2p3 = rs.DivideCurve(rs.AddLine(p2, p3), num_lines_hor) points_p1p0 = rs.DivideCurve(rs.AddLine(p1, p0), num_lines_hor) #farben fuer weberei line_color_ver = [0, 0, 255] if is_blue else [255, 255, 255] if is_orange else [225,85, 39] line_color_hor = [225,85, 39] # Zeichnen vertikaler linien for i in range(len(points_p1p2)): start_point_ver = points_p1p2[i] end_point_ver = points_p0p3[i] line_ver = rs.AddLine(start_point_ver, end_point_ver) rs.ObjectColor(line_ver, line_color_ver) # Zeichnen horizontaler linien for i in range(len(points_p2p3)): start_point_hor = points_p2p3[i] end_point_hor = points_p1p0[i] line_hor = rs.AddLine(start_point_hor, end_point_hor) rs.ObjectColor(line_hor, line_color_hor) # Markisen if 1: for i, panel in enumerate(allPanels[:]): dm.esc() dachl = random.randint(0, 115) * (i > 20) if i < 10: pass # dachl = 0 # nur in bestimmten bereich zeichnen if (50 <= i <= 67) or (112 <= i <= 117) or (134 <= i <= 148) or (185 <= i <= 190) or (220 <= i <= 229): # Markisen nur fuer diese Panels hinzufuegen myPanel(panel, dachl=dachl) if i % 10 == 0: rs.Redraw() # if random.random() < 0.5: #random oft marksien # myPanel( panel, dachl=dachl ) # if i%10==0: # rs.Redraw() # Andere Panels bekommen ebenfalls Markisen elif i % 2 == 0: myPanel_2(panel, dachl=dachl) if i % 10 == 0: rs.Redraw() #weberei geht los if 1: num_lines_ver = 5 # Anzahl paralleler Linien horizontal for i, panel in enumerate(allPanels): # Ueberpruefen, ob das Panel im Bereich von 30 bis 40 liegt #if 30 <= i <= 40: # continue # Panel ueberspringen, nichts zeichnen dm.esc() num_lines_hor = 1 # Anzahl paralleler Linien vertikal for i, panel in enumerate(allPanels): # Ueberpruefen, ob das Panel im Bereich von 30 bis 40 liegt #if 50 <= i <= 74: # continue # Panel ueberspringen, nichts zeichnen dm.esc() is_blue = (i%2 == 0) is_orange = (i%3 == 0) draw_parallel_lines(panel, num_lines_hor, num_lines_ver) if i % 10 == 0: rs.Redraw() # Definiere die Linienfarbe is_blue = (i % 2 == 0) is_orange = (i % 3 == 0) # Zeichnen der parallelen Linien draw_parallel_lines(panel, num_lines_hor, num_lines_ver) if i % 10 == 0: rs.Redraw() #wellen weberei import math def draw_parallel_wavy_lines(panel, num_lines_ver, wave_amplitude, wave_frequency, line_color): p0, p1, p2, p3 = panel # Zwischenpunkte auf den langen Kanten p1p2 und p3p0 points_p1p2 = rs.DivideCurve(rs.AddLine(p1, p2), num_lines_ver) points_p0p3 = rs.DivideCurve(rs.AddLine(p0, p3), num_lines_ver) # Berechnung des Normalenvektors von p0 nach p3 line_p03 = rs.VectorSubtract(p3, p0) normal_vec = rs.VectorUnitize([-line_p03[1], line_p03[0], 0]) # Zeichnen der gewellten Linien for i in range(len(points_p1p2)): start_point = points_p1p2[i] end_point = points_p0p3[i] # Wellenbewegung num_divisions = 20 # Anzahl der Punkte entlang der Linie wave_points = [] for j in range(num_divisions + 1): t = j / float(num_divisions) # Normierter Parameter [0, 1] interp_point = rs.PointAdd(start_point, rs.VectorScale(rs.VectorSubtract(end_point, start_point), t)) # Sinusverschiebung entlang des Normalenvektors shift = wave_amplitude * math.sin(2 * math.pi * wave_frequency * t) shifted_point = rs.PointAdd(interp_point, rs.VectorScale(normal_vec, shift)) # Verschiebung entlang des Normalenvektors wave_points.append(shifted_point) # Linie durch die Wellenpunkte zeichnen wave_curve = rs.AddInterpCurve(wave_points, degree=2) rs.ObjectColor(wave_curve, line_color) # Farbe der Linie setzen if 1: wave_amplitude = 0.8 # Maximaler Ausschlag der Welle wave_frequency = 9 # Anzahl der Wellenzyklen pro Linie for i, panel in enumerate(allPanels): # Ueberpruefen, ob das Panel im Bereich von 30 bis 40 liegt if (50 <= i <= 67) or (112 <= i <= 117) or (134 <= i <= 148) or (185 <= i <= 190) or (220 <= i <= 229): continue # Panel ueberspringen, nichts zeichnen dm.esc() # Farben is_blue = (i % 2 == 0) is_orange = (i % 3 == 0) # Festlegen der Linienfarbe line_color = [0, 0, 255] if is_blue else [225, 85, 39] if is_orange else [255, 255, 255] # Zeichnen der gewellten Linien mit Farbe draw_parallel_wavy_lines(panel, num_lines_ver=5, wave_amplitude=wave_amplitude, wave_frequency=wave_frequency, line_color=line_color) if i % 10 == 0: rs.Redraw() #____________________________:here you end ################################# #rs.ZoomExtents() rs.EnableRedraw(1) ### 4 the MACs dm.printDisplay(1) dm.newEmptyLayer("Default")