#-*- coding: utf-8 -*- #DM2 Final #Melissa Schnell #Gruppe Gruber 01 ############################## import rhinoscriptsyntax as rs import random, time, sys ### sys.path.append("P:/WWW/kleeblaettchen04/") ### sys.path.append("P:/") ### import DM_lib as dm ### import math #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(0) # nomen est omen rs.EnableRedraw(0) import Rhino import os ###import shepperton if 1: import sheppertonOSMCrvCoords as osmC import sheppertonOSMCrvNames as osmN allOSMCrvCoords = osmC.allOSMCrvCoords allOSMCrvNames = osmN.allOSMCrvNames ### import sheppertonCraterCrvCoords ### import sheppertonCraterCrvNames ### allCraterCrvCoords = sheppertonCraterCrvCoords.allCraterCrvCoords ### allCraterCrvNames = sheppertonCraterCrvNames.allCraterCrvNames from sheppertonCraterCrvCoords import allCraterCrvCoords from sheppertonCraterCrvNames import allCraterCrvNames dm.newEmptyLayer("TST") if 1: dm.newEmptyLayer("TST::IMPORT::OSM", [120,120,120]) dm.setTime() for i in range( len(allOSMCrvCoords) ): pass dm.esc() rs.AddCurve( allOSMCrvCoords[i] , 1) rs.ObjectName( rs.AllObjects()[0], allOSMCrvNames[i] ) if i%500==0: print "---", i, " .. todo", len(allOSMCrvCoords)-i, "tim:", dm.getTime() dm.zA() #rs.Redraw() if 1: dm.newEmptyLayer("TST::IMPORT::crater", [120,120,120]) dm.setTime() for i in range( len(allCraterCrvCoords) ): pass #rs.AddCurve( allCraterCrvCoords[i] , 1) #rs.AddCurve( allCraterCrvCoords[i] , 3) #rs.ObjectName( rs.AllObjects()[0], allCraterCrvNames[i] ) rs.AddCurve( allCraterCrvCoords[i] , 1) rs.ObjectName( rs.AllObjects()[0], allCraterCrvNames[i] ) if i%10==0: print "---", i, " .. todo", len(allCraterCrvCoords)-i, "tim:", dm.getTime(0) rs.ZoomBoundingBox(rs.BoundingBox(rs.ObjectsByLayer("TST::IMPORT::Crater"))) ###rs.Redraw() rs.ObjectName(rs.ObjectsByName("level_-91")[1:], "nixiDixi") dm.newEmptyLayer("myPROJ", [0,0,0]) ##rs.Redraw() #import( #file_shepperton = "P:/WWW\kleeblaettchen04" #if os.path.exists(file_shepperton): # Rhino.RhinoDoc.OpenFile(file_shepperton) ###Grundform Kuppel ------------------------------------ baseCirc = rs.ObjectsByName("level_-91")[0] bBox = rs.BoundingBox( baseCirc ) center = dm.pntInbetween(bBox[0],bBox[2]) aufheben = 10 def makeKuppel(scalTop = 1, hoeheFac = 1): anzSegments = 20*5 anzDivi = 8 ###Guidelines erstellen #baseCirc = rs.ObjectsByName("level_-91")[0] #bBox = rs.BoundingBox( baseCirc ) #center = dm.pntInbetween(bBox[0],bBox[2]) #rs.AddLine( bBox[0], bBox[2] ) radi = rs.Distance(bBox[0],bBox[1])*0.5 hoehe = radi*0.6*hoeheFac rs.DeleteObjects(rs.ObjectsByName("topCirc")) centerOben = rs.VectorAdd(center, [0,0,hoehe]) #rs.AddLine( center, centerOben) topCirc = rs.CopyObject(baseCirc, [0,0,hoehe]) ###erstelle der oberen Kurve topCirc = rs.ScaleObject(topCirc, centerOben , [scalTop, scalTop, 1] ) ###skalieren - kann spaeter leicht ueber Parameter geaendert werden rs.ObjectName( topCirc, "topCirc") rs.RebuildCurve(topCirc, degree=3, point_count=8) #topCirc = rs.AddCircle([0,0,hoehe], radi*.15) baseCoords = rs.DivideCurve(baseCirc, anzSegments, 0) topCoords = rs.DivideCurve(topCirc, anzSegments, 0) roofwindow = rs.AddCurve(topCoords, 2) rs.ObjectColor(roofwindow, [139,0,0]) #rs.AddLine( [0,0,0], [0,0,hoehe]) allCoords = [] for i in range(anzSegments): pBase = baseCoords[i] pTop = topCoords[i] vecRadial = rs.VectorUnitize(pBase) p1 = rs.VectorAdd(pBase, [0,0,hoehe]) p1 = rs.VectorAdd(p1, rs.VectorScale(vecRadial, -12.0)) ###vertikale Teilugen Kuppel crv = rs.AddCurve( [ pBase, p1, pTop ], 2 ) coords = rs.DivideCurve( crv, anzDivi, 0) rs.ObjectColor( crv , [0,0,0] ) #rs.ObjectPrintWidth( crv , 0.75 ) allCoords.append( coords ) ### horizontale Teilungen Kuppel if 1: for i in range( anzDivi+0 ): coords = [ allCoords[j%anzSegments][i] for j in range(anzSegments+1) ] horizontal = rs.AddCurve( coords ) rs.ObjectColor(horizontal, [0,0,0]) #rs.ObjectPrintWidth(horizontal, 0.75) ### Geschwungene Elemente auf Kuppel if 1: for i in range(anzSegments-0): coords = [] for j in range(anzDivi+1): k=(i+j)%anzSegments coords.append( allCoords[k][j] ) #rs.ObjectColor( rs.AddCurve( coords, 7 ), [200,200,0]) #rs.AddPoints( coords ) for i in range(anzSegments-0): #print i coords = [] coordsA = [] for j in range(anzDivi+1): k = i+j k = k%anzSegments cor = allCoords[k][j] coords.append(cor) vec = rs.VectorScale( rs.VectorUnitize(cor), j*1.5) coordsA.append( rs.VectorAdd(cor, vec)) #rs.AddCurve( [cor, rs.VectorAdd(cor, vec)] ) coordsA[-1][2] += aufheben if i%5==0: ###nur jedes fuenfte Segment soll ein geschwungenes Element haben crvU = rs.AddCurve( coords ) crvA=rs.AddCurve( coordsA ) rs.ObjectColor(crvA, [0,0,0]) rs.AddCurve( [coords[-1], coordsA[-1]] ) rs.ObjectName(rs.AllObjects()[0], "tst0") coordsVorne=[] coordsHinten = [] ang = 0 angPlus = 4 for x,vec in enumerate(coordsA): if x < (anzDivi*0.5)+1: if x: ang += angPlus else: ang -= angPlus coordsVorne.append( rs.VectorRotate( vec, ang, [0,0,1]) ) coordsHinten.append( rs.VectorRotate( vec, -ang, [0,0,1]) ) crvV = rs.AddCurve( coordsVorne ) rs.ObjectColor(crvV, [0,0,220]) crvH = rs.AddCurve( coordsHinten ) rs.ObjectColor(crvV, [0,0,0]) rs.ObjectColor( rs.AddTweenCurves(crvU, crvV, 8), [139,0,0]) rs.ObjectColor( rs.AddTweenCurves(crvA, crvH, 8), [105,105,105]) if 1: ### geschwungene Elemente von Kuppel abheben coordsV = rs.CurveEditPoints(crvV) ###versetz nach rechts #rs.AddPoints( coordsV ) #rs.EnableObjectGrips(crvV, 1) #print len(coordsV) nachAussenFac = 0.5 fac=0 for i in range(1, anzDivi): if i < anzDivi*.5: ###abstand bis zur haelfte groeßer werdend fac += nachAussenFac else: ###dann wieder kleinerer abstand zur Hauptlinie fac -= nachAussenFac pAxe = [ center[0],center[1], coordsV[i][2] ] #rs.AddLine( pAxe, coordsV[i] ) vec = rs.VectorSubtract(coordsV[i], pAxe) vec = rs.VectorUnitize( vec ) vec = rs.VectorScale(vec, fac) coordsV[i] = rs.VectorAdd(coordsV[i], vec ) rs.EnableObjectGrips(crvV, 1) rs.ObjectGripLocations(crvV, coordsV) rs.EnableObjectGrips(crvV, 0) #rs.AddCurve(coordsV) coordsH = rs.CurveEditPoints(crvH) ###versetz nach links rs.EnableObjectGrips(crvH, 1) nachAussenFacH = 0.5 facH = 0 for i in range(1, anzDivi) : if i < anzDivi * 0.5: ###abstand bis zur haelfte groeßer werdend facH += nachAussenFacH else: ###dann wieder kleinerer abstand zur Hauptlinie facH -= nachAussenFacH pAxeH = [center[0],center[1], coordsH [i][2] ] vecH = rs.VectorSubtract(coordsH[i], pAxeH) vecH = rs.VectorUnitize( vecH ) vecH = rs.VectorScale(vecH, facH) coordsH [i] = rs.VectorAdd(coordsH[i], vec) rs.ObjectGripLocation(crvH, coordsH) rs.EnableObjectGrips(crvH, 0) dm.eDup(0) rs.HideObject( rs.ObjectsByName("level_-91")[0] ) ### Animation camCrv = sorted ( [ [rs.CurveLength(crv), crv] for crv in rs.ObjectsByName("level_-101") ] )[-1][1] ##camXXX = sorted( coords, key=lambda sortKey: (sortKey[1]) ) #rs.SelectObject(camCrv) dm.setCrvStartPoint( crvID=camCrv, set2point=[-1077.840,70.972,-101.000] ) makeKuppel(scalTop = 0.1, hoeheFac = 1) if 0: camCoords = rs.CurveEditPoints( camCrv ) #rs.AddPoints( camCoords ) anzFrames = 800 camZ = 700.0 camCrv = rs.AddCurve(camCoords, 11) rs.RebuildCurve(camCrv, 3, 25) rs.ScaleObject(camCrv, [0,0,camZ], [1.50,1.50,1], copy=False) camCoords = rs.DivideCurve( camCrv, anzFrames, 0) rs.DeleteObject( camCrv ) camZ = 700.0 camCoords = [ [cor[0], cor[1], 700] for cor in camCoords ] camCrv = rs.AddCurve( camCoords ) deltaZ = (700-300)/(anzFrames-1) for i in range(0, anzFrames, 1): dm.esc() #cam = rs.VectorAdd(camCoords[i], camCoords[i][2] -= deltaZ*i for i in range(0, 300, 1): pass #dm.setCameraTarget(camCoords[i],center, lens=20, rota=0, upVec=0, verbose=0) #rs.AddPoint( camCoords[i] ) #rs.Redraw() #camCoords = rs.CurveEditPoints(camCrv)[0:-1] path = "L:/AnimationFrames/" if not os.path.exists(path): os.makedirs(path) # Parameter fuer Animation captureIt = 1 keepFrames = 800 frameNumber = 0 # Startnummer fuer die Frames #makeKuppel(scalTop = 0.1, hoeheFac = 1) rs.CurrentView("Perspective") rs.EnableRedraw(0) if 0: anz = 800 if anz%2==0: anz += 1 fac = 2/anz scal = 0 frameNum = 0 aufhebenPlus = 0.1 for i in range(1, anzFrames+0):#anz+0): dm.esc() if i > anzFrames*0.5: ###vergroeßern erhoehung oben bei fenster aufhebenPlus = -0.1 aufheben += aufhebenPlus #dm.newEmptyLayer("myPROJ", [0,0,0]) #print i, "scal", scal if i <= (anz*0.5)+1: ###auf- und zumachen Kuppel scal += fac else: scal -= fac #print i, "scal", scal rs.DeleteObjects(rs.ObjectsByLayer("myPROJ")) makeKuppel(scalTop = scal, hoeheFac = 1) cam = camCoords[i] tar = center dm.setCameraTarget(cam,tar, lens=45, rota=0, upVec=0, verbose=0) rs.Redraw() # Die Ansicht aktualisieren #rs.Sleep(100) # Wartet kurz zwischen den Frames # Speichern jedes Frames if captureIt: # Erstellen eines Bildnamens basierend auf der Frame-Nummer nam = dm.makeName("TU", frameNumber=frameNum, anzahl=4, format='jpg') # Bildschirmaufnahme (Speichern als Bild) rs.Command("-viewCaptureToFile Width=640 Height=360 Scale=2 DrawCPlaneAxes=No TransparentBackground=No " + path+nam, 0) # Frame-Zaehler erhoehen frameNum += 1 #print(f"Frame {frameNumber} gespeichert: {nam}") # Optional: Animation abbrechen, wenn noetig dm.esc() rs.ShowObject( rs.ObjectsByName("level_-91")[0] )