import bpy,math,os,json from mathutils import Vector,Matrix from math import sin,cos,pi OUT=os.path.dirname(os.path.abspath(__file__));s=bpy.context.scene detail=bpy.data.collections['DETAIL - full geometry for renders'] col=bpy.data.collections.new('33 Daily life - training gathering play and food');detail.children.link(col) COL={'life':col};active='life' src=open(OUT+'/../samford-modular/build_scene.py').read();exec(src[src.index('def mesh('):src.index('timber=textured(')]) cubefs=[tuple(reversed(f)) for f in cubefs] wood=bpy.data.materials['Unpainted hardwood - long X grain'];woodz=bpy.data.materials['Oiled spotted gum posts - vertical grain'];steel=bpy.data.materials['Reusable dark steel bolts and shoes'];stone=bpy.data.materials['Split sandstone facing - mineral grain'];roof=bpy.data.materials['Pale Colorbond - powder coated steel'];linen=bpy.data.materials['Undyed flax linen'];gravel=bpy.data.materials['Loose local gravel - fine stones'];F=1.12 rubber=mat('Exercise mat muted charcoal',(.035,.048,.044),.94) sage=mat('Table tennis muted green',(.10,.21,.16),.63) cream=mat('Ceramic tea bowls warm white',(.73,.68,.56),.48) white=mat('Table tennis painted court lines',(.8,.79,.71),.63) black=mat('Freezer seals and equipment grips',(.028,.03,.029),.7) metal=mat('Appliance brushed metal',(.44,.46,.43),.36,.7) def ground(x,y):return -.024*y+.004*x+.12*sin(x*.19)*cos(y*.14)+.055*sin(x*.72+y*.32) def path(n,pts,w): vs=[];fs=[] for a,b in zip(pts,pts[1:]): a,b=Vector(a),Vector(b);delta=b-a;perp=Vector((-delta.y,delta.x)).normalized()*w/2;steps=max(2,int(delta.length/.3));off=len(vs) for i in range(steps+1): q=a+delta*i/steps for v in [q-perp,q+perp]:vs.append((v.x,v.y,ground(v.x,v.y)+.085)) for i in range(steps):k=off+2*i;fs.append((k,k+1,k+3,k+2)) return mesh(n,vs,fs,gravel) def deck(n,cx,cy,w,d,z): box(n+' accessible pier deck',(cx,cy,z-.09),(w,d,.18),wood,.01) for x in [cx-w/2+.15,cx+w/2-.15]: for y in [cy-d/2+.15,cy+d/2-.15]: g=ground(x,y);box(n+' stone pier',(x,y,(g+z-.18)/2),(.3,.3,max(.08,z-.18-g)),stone,.01) for i in range(int(d/.15)): box(n+' deck board joint',(cx,cy-d/2+.075+i*.15,z+.002),(w,.006,.003),steel) def bench(n,x,y,z,length=2.7): box(n+' seat',(x,y,z+.45),(length,.43,.065),wood,.015) box(n+' linen seat pad',(x,y,z+.502),(length-.1,.39,.04),linen,.016) for xx in [x-length*.37,x+length*.37]:box(n+' leg',(xx,y,z+.21),(.07,.35,.42),woodz,.008) box(n+' backrest',(x,y+.21,z+.75),(length,.055,.27),wood,.012) def ring(n,c,r,t,material): cx,cy,cz=c;vs=[];fs=[];N=48;M=10 for i in range(N): a=i*2*pi/N for j in range(M): b=j*2*pi/M;rr=r+t*cos(b);vs.append((cx+rr*cos(a),cy+t*sin(b),cz+rr*sin(a))) for i in range(N): for j in range(M):fs.append((i*M+j,((i+1)%N)*M+j,((i+1)%N)*M+(j+1)%M,i*M+(j+1)%M)) ob=mesh(n,vs,fs,material) for p in ob.data.polygons:p.use_smooth=True return ob # Covered exercise pavilion west of the garage. Independent steel exercise frame. tx,ty,tz=-12.2,-18,.95 deck('TRAINING',tx,ty,4.8,5.4,tz) for x in [tx-2.28,tx+2.28]: for y,h in [(ty-2.57,2.95),(ty+2.57,3.25)]: box('Training timber canopy post',(x,y,tz+h/2),(.125,.125,h),woodz,.005) box('Training canopy steel shoe',(x,y,tz+.07),(.16,.16,.14),steel,.005) for x in [tx-2.28+i*.57 for i in range(9)]:beam('Training exposed roof rafter',(x,ty-2.9,tz+2.95),(x,ty+2.9,tz+3.29),.065,.18,wood) ro=box('Training pale mono pitch canopy',(tx,ty,tz+3.16),(5.3,6,.065),roof,.006);ro.rotation_euler.x=math.atan(.3/5.4) for x in [tx-.98,tx+.98]: box('EXERCISE FRAME - steel upright',(x,ty+.85,tz+1.4),(.095,.095,2.8),steel,.006) box('Exercise frame bolted foot plate',(x,ty+.85,tz+.02),(.30,.36,.04),steel,.005) for dx in [-.1,.1]: for dy in [-.12,.12]:rod('Exercise frame anchor concept',(x+dx,ty+.85+dy,tz+.04),(x+dx,ty+.85+dy,tz+.067),.011,metal,sides=8) bar=rod('PULL UP BAR - dedicated steel frame',(tx-1.02,ty+.85,tz+2.70),(tx+1.02,ty+.85,tz+2.70),.017,steel,sides=20) bar['Design intent']='Dedicated exercise frame intended to be load rated by its manufacturer or structural engineer. These concept anchor plates do not establish a safe working load.' for x in [tx-.28,tx+.28]: box('Adjustable ring hanging strap',(x,ty+.85,tz+2.10),(.027,.009,1.18),black,.002) ring('WOODEN GYMNASTIC RING',(x,ty+.85,tz+1.40),.125,.017,wood) for x,y in [(tx-.65,ty-.5),(tx+.55,ty-.5)]:box('MOVABLE EXERCISE MAT',(x,y,tz+.022),(.85,1.85,.045),rubber,.025) box('Adjustable weight bench seat',(tx+1.55,ty-.88,tz+.45),(.40,.38,.09),rubber,.035) back=box('ADJUSTABLE BENCH - inclined back',(tx+1.55,ty-.25,tz+.60),(.40,.91,.09),rubber,.035);back.rotation_euler.x=.3 beam('Bench adjustable steel spine',(tx+1.55,ty-1.05,tz+.15),(tx+1.55,ty+.23,tz+.41),.065,.065,steel) for y in [ty-1,ty+.15]:box('Bench stabilising foot',(tx+1.55,y,tz+.065),(.59,.065,.065),steel,.009) box('Dumbbell timber stand',(tx-1.55,ty-.5,tz+.72),(.68,1.25,.06),wood,.012) for y in [ty-.95,ty-.05]: box('Dumbbell stand leg',(tx-1.55,y,tz+.34),(.5,.06,.68),steel) for y in [ty-.80,ty-.22]: rod('ADJUSTABLE DUMBBELL grip',(tx-1.73,y,tz+.85),(tx-1.37,y,tz+.85),.019,steel,sides=16) for x in [tx-1.77,tx-1.33]: for dx in [-.06,-.02,.02,.06]:box('Dumbbell selectable weight plate',(x+dx,y,tz+.85),(.027,.22,.23),black,.008) for i,x in enumerate([-9.60,-9.25,-8.90]): top=.76-.19*i;box('Training access step',(x,-17,top-.08),(.36,1.2,.16),wood,.009) path('Training to garage pedestrian link',[(-8.65,-17),(-8.4,-15),(-6.4,-13.4)],1.1) # Outdoor dining: a separate terrace keeps the original narrow veranda clear. dx,dy=10,3.5;deck('GATHERING TERRACE',dx,dy,6,5.8,F) deck('Veranda terrace connection',6.5,4.2,1,1.5,F) box('OUTDOOR TABLE - ten place timber top',(dx,dy,F+.76),(3.2,1.03,.085),wood,.025) for x in [dx-1.13,dx+1.13]:box('Outdoor table trestle',(x,dy,F+.36),(.10,.78,.72),woodz,.01) bench('Outdoor north bench - four places',dx,dy+.98,F,2.95) south_start=set(col.objects);bench('Outdoor south bench - four places',dx,dy-.98,F,2.95) for o in set(col.objects)-south_start: if 'backrest' in o.name:o.location.y=dy-1.19 for x in [dx-1.94,dx+1.94]: box('Outdoor end chair seat',(x,dy,F+.45),(.47,.47,.06),wood,.012) for a in [-.17,.17]: for b in [-.17,.17]:box('Outdoor end chair leg',(x+a,dy+b,F+.21),(.038,.038,.42),woodz) box('Outdoor end chair back',(x+(-.21 if x