################################### ### DM2_w24 # AGruber@tugraz.at ### ### ue_05 UN_headquaters NYC ### ################################### ############################## import rhinoscriptsyntax as rs import random, time, sys ### sys.path.append("P:/") ### sys.path.append("C:\Users\Sven\OneDrive\Tu Graz\DM2")### import DM_lib as dm ### reload(dm) ############################## def drawbuilding (): if 1: if 0: rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord(10, 0, 0) ) rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord( 0, 3, 0) ) rs.AddLine( dm.getUnoCoord(0, 0, 0), dm.getUnoCoord( 0, 0, 39) ) if 0: rs.CurveArrows(rs.AllObjects()[0], arrow_style=2) rs.CurveArrows(rs.AllObjects()[1], arrow_style=2) rs.CurveArrows(rs.AllObjects()[2], arrow_style=2) rs.ObjectColor(rs.AllObjects()[2], [0, 222, 0] ) rs.ObjectColor(rs.AllObjects()[1], [222, 0, 0] ) rs.ObjectColor(rs.AllObjects()[0], [0, 0, 222] ) rs.ObjectPrintWidth( rs.AllObjects()[0:3], 1.0 ) p0 = dm.getUnoCoord( 0, 0, 0) p1 = dm.getUnoCoord( 10, 0, 0) p2 = dm.getUnoCoord( 10, 3, 0) p3 = dm.getUnoCoord( 0, 3, 0) unoBaseCoords = [p0, p1, p2, p3, p0] unoBaseCrv = rs.AddCurve( unoBaseCoords, 1) ### unoTopCoords = [dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord( 10, 0, 39), dm.getUnoCoord( 10, 3, 39), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord( 0, 0, 39), ] unoTopCrv = rs.AddCurve( unoTopCoords, 1) #### basePanels= [] unoFrontCoords = [dm.getUnoCoord( 0, 0, 0), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord( 10, 0, 39), dm.getUnoCoord( 10, 0, 0), dm.getUnoCoord( 0, 0, 0), ] basePanels.append(unoFrontCoords) unoFrontCrv = rs.AddCurve ( unoFrontCoords, 1) rs.ObjectColor(unoFrontCrv, [0, 222, 0] ) ### unoBackCoords = [dm.getUnoCoord( 0, 3, 0), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord( 10, 3, 39), dm.getUnoCoord( 10, 3, 0), dm.getUnoCoord( 0, 3, 0), ] basePanels.append(unoBackCoords) unoBackCrv = rs.AddCurve ( unoBackCoords, 1) rs.ObjectColor(unoBackCrv, [0, 222, 0] ) ### unoSideRCoords = [dm.getUnoCoord( 0, 0, 0), dm.getUnoCoord( 0, 0, 39), dm.getUnoCoord( 0, 3, 39), dm.getUnoCoord( 0, 3, 0), dm.getUnoCoord( 0, 0, 0), ] basePanels.append(unoSideRCoords) unoSideRCrv = rs.AddCurve ( unoSideRCoords, 1) rs.ObjectColor(unoSideRCrv, [0, 222, 0] ) ### unoSideLCoords = [dm.getUnoCoord( 10, 0, 0), dm.getUnoCoord( 10, 0, 39), dm.getUnoCoord( 10, 3, 39), dm.getUnoCoord( 10, 3, 0), dm.getUnoCoord( 10, 0, 0), ] basePanels.append(unoSideLCoords) unoSideLCrv = rs.AddCurve ( unoSideLCoords, 1) rs.ObjectColor(unoSideLCrv, [0, 222, 0] ) rs.ZoomExtents() if 0: ############################## rs.CurrentLayer("UNO::setUp::points") rs.AddPoints( UnoGridCoords ) for i in range(L): rs.ObjectColor( rs.AddTextDot( str(i), dm.getUnoCoord(i, 0, 0) ), [0, 222, 0] ) for i in range(D): rs.ObjectColor( rs.AddTextDot( str(i), dm.getUnoCoord(0, i, 0) ), [222, 0, 0] ) for i in range(H): rs.ObjectColor( rs.AddTextDot( str(i), dm.getUnoCoord(0, 0, i) ), [0, 0, 222] ) ############################## return basePanels def rollerCoaster (anzahl = 128, circDiv = 64, rad = 3.5, makeAll = 0, crvDeg = 3, delCircs = 1,show_points =1, calArray = None, groundCrv = None): # Wenn nichts im Array vorhanden ist if calArray is None: calArray = [(0,0,0), (1,1,0), (2,0,0)] # Erstelle eine quadratische Kurve (Grad 2) durch diese Punkte # crv ist dann GUI dieser Kurve crv = rs.AddCurve(calArray, 2) # Punkte der Kurve sichtbar machen if show_points: i=0 for point in calArray: rs.AddPoint(point) i=i+1 rs.ObjectColor(rs.AddTextDot(str(i), point), [0, 0, 255]) # Definitionsbereich (Domain) der Kurve crv # mit Param 1 wird der Endwert des Definitionsbereichs ermittelt dom = rs.CurveDomain(crv)[1] deltaAng = 360/circDiv # 360/16 print("Variable deltaAng: " + str(deltaAng)) allCoords = [] #print("Variable anzahl: " + str(anzahl)) for p in range(0, anzahl+1): #Schleife x 130; fac = p/anzahl #print("Variable fac: " + str(fac)) #print("Variable dom*fac: " + str(dom*fac)) # Einen Punkt der Kurve evaluieren coord = rs.EvaluateCurve( crv, dom*fac ) # Sucht den naechstgelegenen Punkt in der Grundflaeche vom Punkt para = rs.CurveClosestPoint(groundCrv, coord) #print("Variable para: " + str(para)) # Einen Punkt der Grundflaeche evaluieren coordOnCrv = rs.EvaluateCurve( groundCrv, para ) #print("Variable coordOnCrv: " + str(coordOnCrv)) if show_points: rs.AddPoint(coordOnCrv) rs.ObjectColor(rs.AddTextDot(str(p), coordOnCrv), [139, 35, 35]) # Ermittelt ein Perpendicular Frame planeX = rs.CurvePerpFrame( crv, dom*fac ) ### Returns: plane: Plane on succes ! if show_points: rs.AddPoint(planeX.Origin) rs.ObjectColor(rs.AddTextDot(str(p), planeX.Origin), [0,134,139]) # parallel zu xy_ebene >> horizontal !!! vecXY = dm.vecCurvePerpXY( crv, dom*fac ) #? # Berechne den Tangentenvektor tanX = rs.CurveTangent( crv, dom*fac ) ### nomen est omen :) # horizontalen Punkt skalieren vecXY = rs.VectorScale(vecXY, rad) if 1: #Zeichnen der 3 Linien #crv01 = rs.AddLine( coord, rs.VectorAdd(coord, vecXY) ) ### horizontal !!! #rs.ObjectColor( crv01, [0,255,0]) #crv02 = rs.AddLine( planeX[0], rs.VectorAdd(planeX[0], rs.VectorScale(tanX, rad)) ) #rs.ObjectColor( crv02, [0,0,255]) #crv03 = rs.AddLine( planeX[0], rs.VectorAdd(planeX[0], rs.VectorScale(planeX[1], rad)) ) #rs.ObjectColor( crv03, [255,0,0]) coords = [] for j in range( int(circDiv*0.5)+1 ): if not delCircs: rs.AddLine( coord, rs.VectorAdd(coord, rs.VectorRotate(vecXY, deltaAng*j, tanX) )) coords.append( rs.VectorAdd(coord, rs.VectorRotate(vecXY, deltaAng*j, tanX) ) ) if not delCircs: circ = rs.AddCurve( coords, 1 ) allCoords.append( coords ) else: # Ermitteln Winkel zwischen zwei Vektore, angX = Grad angX = rs.VectorAngle(planeX[1], vecXY) # rotiert die Ebene umd den Winkel mit den Rotationsvektor tanX rotated_plane = rs.RotatePlane( planeX, angX, tanX) # Erstellt einen Kreis circ = rs.AddCircle(rotated_plane, rad ) # vergibt einen neuen Object Namen rs.ObjectName( circ, "cir_"+str(p)) # rotiert den Kreis mit Zentrum Punkt coord um den Winkel angX mit Rotationsachse tanx, urspruengliches Object wird nicht kopiert rs.RotateObject(circ, coord, angX, axis=tanX, copy=0) # Teilungspunkte berechnen # Param: Kurve circ mit Anzahl der Teil circDiv mit Teilung basierend auf Bogenlaenge coords = rs.DivideCurve( circ, circDiv, 0) # Line von Mitte zum X Punkt cirLin = rs.AddLine(coord, coords[0]) rs.ObjectColor( cirLin, [0,255,0]) # vergibt einen neuen Object Namen rs.ObjectName( cirLin, "cirLin_"+str(p)) if delCircs: rs.DeleteObjects([circ, cirLin]) allCoords.append(coords) if makeAll: for i in range( int(circDiv*0.5)+1 ): coords = [] for circList in allCoords: coords.append( circList[i] ) if makeAll == 1: rs.ObjectColor(rs.AddCurve(coords, degree=crvDeg), [100,190,190] ) if makeAll == 2: rs.ObjectColor(rs.AddInterpCurve(coords, degree=crvDeg, knotstyle=3), [0,127,0] ) if i%2==0: rs.Redraw() print ("rollerCoaster") def calculationArrayV1(): calculationArrayV1 = [] for i in range (10): if i==0: point= dm.getUnoCoord( 10, 2, 39 ) elif i==1: point = rs.VectorAdd( dm.getUnoCoord(10,0,39), rs.VectorScale( dVec, -30 ) ) elif i==2: point = rs.VectorAdd( dm.getUnoCoord(0,0,30), rs.VectorScale( lVec, 40 ) ) elif i==3: point = rs.VectorAdd( dm.getUnoCoord(0,3,28) , rs.VectorScale( dVec, 20 ) ) elif i==4: point = dm.getUnoCoord(3,3,25) elif i==5: point = rs.VectorAdd( dm.getUnoCoord(8,3,25), rs.VectorScale( dVec, 20 ) ) elif i==6: point = dm.getUnoCoord(10,0,15) elif i==7: point = rs.VectorAdd( dm.getUnoCoord(8,0,10), rs.VectorScale( lVec, -150 ) ) elif i==8: point = rs.VectorAdd( dm.getUnoCoord(10,0,6), rs.VectorScale( dVec, -100 ) ) elif i==9: point = rs.VectorAdd( dm.getUnoCoord(5,0,2), rs.VectorScale( dVec, -50 ) ) calculationArrayV1.append(point) print ("calculationArrayV1") return calculationArrayV1 def calculationArrayV2(): calculationArrayV2 = [] point = rs.VectorAdd( dm.getUnoCoord( 0, 0, 10 ), rs.VectorScale(lVec, 10) ) calculationArrayV2 = [point] counter = 0 for h in range(0, H-1, 2): counter = counter+1 if counter%4 == 1: point = rs.VectorAdd(dm.getUnoCoord( int((L-1)/2), 0, h ), rs.VectorScale(dVec, random.uniform(0,50))) if counter%4 == 2: point = dm.getUnoCoord( L-1, int((D-1)/2), h ) if counter%4 == 3: point = rs.VectorAdd(dm.getUnoCoord( int((L-1)/2), D-1, h ), rs.VectorScale(dVec, random.uniform(0,50)*-1)) if counter%4 == 0: point = dm.getUnoCoord( 0, int((D-1)/2), h ) calculationArrayV2.append(point) print ("calculationArrayV2") return calculationArrayV2 def panelV1( panel, paneltyp, panelid, normPanel = 1): p0, p1, p2, p3 = panel nVec = dm.normVec3pnts( p0, p1, p2 ) zVal = p0[2] #Domain Definition: You create two domain objects, which represent the ranges (min and max). outVal = dm.reMap(zVal, 0, 156-12, 10, 1) #--> Veraenderung des Musters outValD = dm.reMap(p0[2], 0, 156-12, 0.5, 0.5) #-->Veraenderung VerticalLine #outVal = 10 #outValD = 1 anzLines = int( dm.reMap(zVal, 0, 156-12, 256, 8) ) outVal *= normPanel #ector representing a direction and you want to change its magnitude while maintaining its direction nVec0 = rs.VectorScale( nVec, outVal) nVec1 = rs.VectorScale( nVec, outVal) #finding a point between two points p0I = dm.pntInbetween(p0, p2, outValD) p1I = dm.pntInbetween(p1, p3, outValD) p0V = rs.VectorAdd( p0I, nVec0 ) p1V = rs.VectorAdd( p1I, nVec1 ) #dm.textDots( panel) if normPanel: crv_0 = rs.AddCurve( [p0, p1, p1V , p0V , p0], 1 ) rs.ObjectColor( crv_0, [255,0,255] ) if 1: crv_01 = rs.AddCurve( [p0, p1,p0V, p1V, p0], 4 ) rs.ObjectColor( crv_01, [0,200,0] ) crv_02 = rs.AddCurve( [p0, p1, p1V, p0V, p0], 3 ) rs.ObjectColor( crv_02, [100,100,255] ) crv_03 = rs.AddCurve( [p0, p1, p1V, p0V, p0], 4 ) rs.ObjectColor( crv_03, [100,0,0] ) #### crv_1 = rs.AddCurve( [p2, p1V, p0V, p3, p2], 1 ) rs.ObjectColor( crv_1, [255,0,255] ) if 1: crv_11 = rs.AddCurve( [p2, p1V, p0V, p3, p2], 2 ) rs.ObjectColor( crv_11, [0,200,0] ) crv_12 = rs.AddCurve( [p2, p1V, p0V, p3, p2], 3 ) rs.ObjectColor( crv_12, [100,100,255] ) crv_13 = rs.AddCurve( [p2, p1V, p0V, p3, p2], 4 ) rs.ObjectColor( crv_13, [100,0,0] ) else: if 1: crv_0 = rs.AddCurve( [p0, p1, p1V, p0V, p0], 1 ) crv_1 = rs.AddCurve( [p2, p1V, p0V, p3, p2], 1 ) rs.ObjectColor( crv_0, [105,105,105] ) rs.ObjectColor( crv_1, [105,105,105] ) if 0: rs.ObjectPrintWidth( crv_0, 1) rs.ObjectPrintWidth( crv_1, 1) if 0: crv_0 = rs.AddCurve( [p0, p1, p2, p3, p0], 1 ) crv_1 = rs.AddCurve( [p0, p1, p2, p3, p0], 1 ) rs.ObjectColor( crv_0, [200,0,0]) rs.ObjectColor( crv_1, [200,0,0]) if paneltyp == 0: if panelid in [100, 129 ]: rs.DeleteObject(crv_0) rs.DeleteObject(crv_1) if normPanel: rs.DeleteObject(crv_01) rs.DeleteObject(crv_02) rs.DeleteObject(crv_03) rs.DeleteObject(crv_11) rs.DeleteObject(crv_12) rs.DeleteObject(crv_13) if paneltyp == 1: if panelid in [68, 69, 78, 79, 82, 83, 84 ]: rs.DeleteObject(crv_0) rs.DeleteObject(crv_1) if normPanel: rs.DeleteObject(crv_01) rs.DeleteObject(crv_02) rs.DeleteObject(crv_03) rs.DeleteObject(crv_11) rs.DeleteObject(crv_12) rs.DeleteObject(crv_13) if paneltyp == 2: if panelid in [33]: rs.DeleteObject(crv_0) rs.DeleteObject(crv_1) if normPanel: rs.DeleteObject(crv_01) rs.DeleteObject(crv_02) rs.DeleteObject(crv_03) rs.DeleteObject(crv_11) rs.DeleteObject(crv_12) rs.DeleteObject(crv_13) if paneltyp == 3: if panelid in [15, 16, 17, 19 ]: rs.DeleteObject(crv_0) rs.DeleteObject(crv_1) if normPanel: rs.DeleteObject(crv_01) rs.DeleteObject(crv_02) rs.DeleteObject(crv_03) rs.DeleteObject(crv_11) rs.DeleteObject(crv_12) rs.DeleteObject(crv_13) def panelV2( panel, paneltyp, panelid, normPanel = 1): p0, p1, p2, p3 = panel coordsBuilding = panel coordsBuilding.append( coordsBuilding[0] ) crvBuilding = rs.AddCurve( coordsBuilding, 1 ) coordsCrvBuilding = rs.DivideCurve( crvBuilding, 64, 0) if 0: if panelid == 0 and paneltyp == 0: dm.textDots( panel) normalVector = dm.normVec3pnts(p0,p1,p2) midpointback = dm.pntInbetween(p0,p2, 0.5) #rs.AddPoint( midpointback ) zValue = p0[2] scalFactor = dm.reMap( zValue, 0, 144, 10, 2.0) colorValue = int( dm.reMap( zValue, 0, 144, 0, 250) ) if colorValue > 255: colorValue=255 vectorFront = rs.VectorScale( normalVector, scalFactor) coordsFront = [] for cor in panel: coordsFront.append(rs.VectorAdd(cor, vectorFront)) if 0: if panelid == 0 and paneltyp == 0: dm.textDots( coordsFront) midpoint = dm.pntInbetween(coordsFront[0],coordsFront[2], 0.5) planeFront = rs.PlaneFromNormal(midpoint, normalVector) if normPanel: if 0: coordsFront.append( coordsFront[0] ) coordsFront.remove( coordsFront[random.randint(1,2)] ) crvFront= rs.AddCurve( coordsFront, 2 ) if 1: #rs.AddPoint( midpoint ) crvFront = rs.AddCircle(planeFront, 1) ### coordsCrvFront = rs.DivideCurve( crvFront, 64, 0) ### for i in range(64): pB = coordsCrvBuilding[i] pF = coordsCrvFront[i] lin = rs.AddLine( pB, pF ) rs.ObjectColor(lin, [colorValue, 100,255-colorValue] ) else: if 1: crv_0 = rs.AddCurve( [p0, p1, midpointback, p0], 1 ) crv_1 = rs.AddCurve( [p2, p3, midpointback, p2], 1 ) rs.ObjectColor( crv_0, [105,105,105] ) rs.ObjectColor( crv_1, [105,105,105] ) ###Main### 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(state=1) ### nomen est omen / printDisplay(state=1, scale=1000, thickness=1, color="Display") rs.EnableRedraw(0) ### MAC >> problem ! ###_________________________________________# ### basic settings for grid to fit UN_slab # ### # ! no need 2 change ! 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 gridCoords L*D*H = 1760 UnoGridCoords = dm.getUnoGridCoords() # get from DM_lib as dm ############ UnoPanelCoords = dm.UnoPanelCoords # get panelCoords [frontPanels, backPanels, sidePanels, upSidePanels] / default arguments s.u. UnoPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=1, stepH=3, stepD=1) ### = standard for hu_06 #################___________________________# dm.newEmptyLayer("UNO::setUp::points", [150,150,200] ) dm.newEmptyLayer("UNO::setUp::geo", [150, 20,150] ) dm.newEmptyLayer("UNO::setUp::crv", [200, 100, 100]) dm.newEmptyLayer("UNO::setUp", [120,120,140] ) ################ 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) ) ################ #_____________________________here you go: dm.newEmptyLayer("myPROJ", [100,100,100]) #######Drawbuilding########## basePanels = [] basePanels = drawbuilding () #######DrawPanels########## UnoPanelCoords = dm.getUNpanelCoords(anzL=10*1, anzH=39, anzD=3, stepL=1, stepH=3, stepD=1) ### = standard for hu_06 #UnoPanelCoords = dm.UnoPanelCoords allPanels= [] allPanels= [basePanels[0] ] def dividePanel( panel=allPanels[0], maxPanels=25, minHig=4.0 ): dm.esc() if maxPanels>500: maxPanels=500 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.666)]), maxPanels=maxPanels ) dividePanel(panel=allPanels[0], maxPanels=444, minHig=12.0 ) del UnoPanelCoords [0] UnoPanelCoords.insert(0,allPanels) ###panel### for y in range(0,4): for i,panel in enumerate(UnoPanelCoords[y]): dm.esc() goOut = 1 if y == 0 or y == 1: if i<20: goOut = 0 else: if i<6: goOut = 0 #goOut = 0 if 0: panelV1( panel, y, i, normPanel=goOut ) if 1: panelV2( panel, y, i, normPanel=goOut ) if i%10==0: rs.Redraw() #######Roller########## calculationArray = [] if 0: calculationArray = calculationArrayV1() if 1: calculationArray = calculationArrayV2() rollerCoaster ( anzahl = 32, circDiv = 32, rad = 5.5, makeAll = 2, crvDeg = 2, delCircs = 1,show_points=0 , calArray = calculationArray, groundCrv = unoBaseCrv ) ###################### #____________________________:here you end rs.EnableRedraw(1) ### 4 the MACs dm.newEmptyLayer("Default")