```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ``` ```#!/usr/bin/python import sys,os,re from pymclevel import * # inclusive range def irange(a,b): return xrange(a,b+1) # count the number of zeroes in the list def count_zeroes(lst): return sum(1 for x in lst if x == 0) # take the given coordinate list, and iterate the next level of the menger sponge fractal def menger_sponge_3d(coordlist): for (x,y,z) in coordlist: x*=3 y*=3 z*=3 for dx in irange(-1,1): for dy in irange(-1,1): for dz in irange(-1,1): if count_zeroes((dx,dy,dz))<=1: yield (x+dx,y+dy,z+dz) # find the minimum and maximum coordinates of any list of coordinates (regardless of dimension) # returns two tuples: mincoords and maxcoords. def bounding_box(coordlist): # find the min and max x,y,z mincoords = list(coordlist[0]) maxcoords = list(coordlist[0]) for c in coordlist[1:]: # for each coordinate for (i,v) in enumerate(c): # for each dimension if v < mincoords[i]: mincoords[i] = v if v > maxcoords[i]: maxcoords[i] = v return (mincoords,maxcoords) # render a list of x,y,z coordinates as a minecraft schematic file def make_schematic_3d(filename,coordlist,block_type=1,verbose=True): (mincoords,maxcoords) = bounding_box(coordlist) (xr,yr,zr) = zip(mincoords,maxcoords) # xr = (mincoords[0],maxcoords[0]), etc. size = (xr[1]-xr[0]+1, zr[1]-zr[0]+1, yr[1]-yr[0]+1) #NB: USES X, Z, Y schematic = MCSchematic(shape=size, mats='Alpha') blocks = 0 for (x,y,z) in coordlist: blocks += 1 schematic.setBlockAt(x - xr[0], z - zr[0], y - yr[0], block_type) #NB: USES X, Z, Y schematic.saveToFile(filename) if verbose: sys.stderr.write("Wrote %d blocks to %s, world size %s.\n" % (blocks,filename,size)) # generate menger sponges up to level 4 (the largest that fits in the world, since the size of a sponge is 3^level) coordlist = [(0,0,0)] for i in xrange(1,5): coordlist = list(menger_sponge_3d(coordlist)) make_schematic_3d("menger3d-%d.schematic" % i,coordlist) ```