|  |  | @@ -0,0 +1,100 @@ | 
		
	
		
			
			|  |  |  | import bpy | 
		
	
		
			
			|  |  |  | from mathutils import Vector, Euler | 
		
	
		
			
			|  |  |  | from math import pi | 
		
	
		
			
			|  |  |  | import json | 
		
	
		
			
			|  |  |  | import os | 
		
	
		
			
			|  |  |  | import subprocess | 
		
	
		
			
			|  |  |  | import xml.etree.ElementTree as ET | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | c = bpy.data.objects["cam"] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | selected = bpy.context.selected_objects[0] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bpy.ops.object.transform_apply( rotation = True ) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | data = {} | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | b = selected | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | FRONT = [0, 1, 2, "Front"] | 
		
	
		
			
			|  |  |  | SIDE = [1, 1, 2, "Side"] | 
		
	
		
			
			|  |  |  | TOP = [0, 0, 1, "Top"] | 
		
	
		
			
			|  |  |  | ANGLED = [0.5, 1, 2, "Angled"] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | sides = [FRONT, SIDE, TOP, ANGLED] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | path = "/tmp/macrovision/" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | media_path = "/home/crux/furry/macrovision/media/" | 
		
	
		
			
			|  |  |  | media_folder = "buildings/Houses/" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | os.makedirs(path, exist_ok=True) | 
		
	
		
			
			|  |  |  | os.makedirs(os.path.join(media_path, media_folder), exist_ok=True) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | ns = {"svg": "http://www.w3.org/2000/svg"} | 
		
	
		
			
			|  |  |  | ET.register_namespace("", ns["svg"]) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | TEMPLATE =  """ | 
		
	
		
			
			|  |  |  | {{ | 
		
	
		
			
			|  |  |  | name: "{0}", | 
		
	
		
			
			|  |  |  | sides: {{ | 
		
	
		
			
			|  |  |  | {1} | 
		
	
		
			
			|  |  |  | }} | 
		
	
		
			
			|  |  |  | }}""" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | VIEW_TEMPLATE = '                "{0}": {{ height: math.unit({1}, "meters") }}' | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for angles in sides: | 
		
	
		
			
			|  |  |  | local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector()) | 
		
	
		
			
			|  |  |  | global_bbox_center = b.matrix_world @ local_bbox_center | 
		
	
		
			
			|  |  |  | c.location = global_bbox_center | 
		
	
		
			
			|  |  |  | c.data.ortho_scale = max(b.dimensions) * 1.1 | 
		
	
		
			
			|  |  |  | c.rotation_euler = Euler([angles[1] * pi / 2, 0, angles[0] * pi / 2]) | 
		
	
		
			
			|  |  |  | rot = c.rotation_euler.to_matrix() | 
		
	
		
			
			|  |  |  | rot.invert() | 
		
	
		
			
			|  |  |  | c.location = c.location + Vector([0, 0, 100]) @ rot | 
		
	
		
			
			|  |  |  | data[angles[3]] = b.dimensions[angles[2]] | 
		
	
		
			
			|  |  |  | output_path = os.path.join(path, f"{b.name}-{angles[3]}") | 
		
	
		
			
			|  |  |  | bpy.context.scene.render.filepath = output_path | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | svg_path = output_path + "0001.svg" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bpy.ops.render.render(write_still = True) | 
		
	
		
			
			|  |  |  | os.rename(svg_path, output_path + ".svg") | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | subprocess.check_output([ | 
		
	
		
			
			|  |  |  | "potrace", | 
		
	
		
			
			|  |  |  | "-b", | 
		
	
		
			
			|  |  |  | "svg", | 
		
	
		
			
			|  |  |  | output_path + ".bmp", | 
		
	
		
			
			|  |  |  | "-o", | 
		
	
		
			
			|  |  |  | output_path + "-fill.svg" | 
		
	
		
			
			|  |  |  | ]) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | line_xml = ET.parse(output_path + ".svg") | 
		
	
		
			
			|  |  |  | fill_xml = ET.parse(output_path + "-fill.svg") | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | lines = line_xml.find("./svg:g", namespaces=ns) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | fill_xml.find("svg:g[@fill='#000000']", namespaces=ns).attrib["fill"] = "#1a1a1a" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | fill_xml.iter().__next__().append(lines) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | fill_xml.write(output_path + "-combined.svg") | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | subprocess.Popen([ | 
		
	
		
			
			|  |  |  | "inkscape", | 
		
	
		
			
			|  |  |  | "--without-gui", | 
		
	
		
			
			|  |  |  | "--export-plain-svg=" + os.path.join(media_path, media_folder, f"{b.name}-{angles[3]}.svg"), | 
		
	
		
			
			|  |  |  | "--export-area-drawing", | 
		
	
		
			
			|  |  |  | output_path + "-combined.svg" | 
		
	
		
			
			|  |  |  | ]) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | fill_xml.write(os.path.join(media_path, media_folder, f"{b.name}-{angles[3]}.svg")) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | lines = [] | 
		
	
		
			
			|  |  |  | for key, value in data.items(): | 
		
	
		
			
			|  |  |  | lines.append(VIEW_TEMPLATE.format(key, value)) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | print(TEMPLATE.format(b.name, ",\n".join(lines))) |