Skip to content

Instantly share code, notes, and snippets.

@OrganicIrradiation
Last active March 3, 2016 18:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OrganicIrradiation/0f67bcc2742587454d21 to your computer and use it in GitHub Desktop.
Save OrganicIrradiation/0f67bcc2742587454d21 to your computer and use it in GitHub Desktop.
Preparing a “Blobby” Object for Printing with Shapeways
wallScale = 0.975;
print('Generate inner shell');
bpy.ops.object.duplicate();
innerShell = bpy.data.objects['0431630057 Sphere Tri 5.001'];
bpy.ops.transform.resize(value=(wallScale,wallScale,wallScale));
print('Subtract inner from outer shell');
bpy.context.scene.objects.active = outerShell;
bpy.ops.object.modifier_add(type='BOOLEAN');
outerShell.modifiers[0].operation = 'DIFFERENCE';
outerShell.modifiers[0].object = innerShell;
bpy.ops.object.modifier_apply(apply_as='DATA',modifier='Boolean');
innerShell.select = True;
bpy.context.scene.objects.active = innerShell;
bpy.ops.object.delete();
import bpy
from sys import platform as _platform
print('Delete existing meshes');
bpy.ops.object.select_by_type(type='MESH');
bpy.ops.object.delete();
print('Load outer shell');
bpy.ops.import_mesh.stl(filepath='0431630057_sphere_tri_5.stl');
outerShell = bpy.data.objects['0431630057 Sphere Tri 5'];
print('Ensure normals face out');
bpy.context.scene.objects.active = outerShell;
bpy.ops.object.mode_set(mode='EDIT');
bpy.ops.mesh.select_all(action='SELECT');
bpy.ops.mesh.normals_make_consistent(inside=False);
bpy.ops.object.editmode_toggle();
import bpy
import math
from mathutils import Vector
def drange(start, stop, step):
r = start
while r <= stop:
yield r
r += step
r = 0.25;
rSphere = r*0.975;
sphereSubdivisions = 4;
print('Delete existing meshes');
bpy.ops.object.select_by_type(type='MESH');
bpy.ops.object.delete();
context = bpy.context
# Cut out the spherical grid
for x in drange(-0.75/r, 0.75/r, 1):
for y in drange(-0.75/r, 0.75/r, 1):
for z in drange(-0.75/r, 0.75/r, 1):
print(x,y,z);
origin = (0,0,0);
moveTo = (x*2*r - (y%2*r) - (z%2*r),
r + (math.sqrt(3)*r*y) + (z%2*r)/2,
r + (math.sqrt(6)*2/3*r*z));
bpy.ops.mesh.primitive_ico_sphere_add(location=origin,size=rSphere,subdivisions=sphereSubdivisions);
obj = context.active_object;
obj.location += Vector(moveTo);
sphereToDelete = bpy.data.objects['Icosphere'];
print('Export the mesh');
bpy.ops.object.select_by_type(type='MESH');
bpy.ops.export_mesh.stl(filepath='holyMesh.stl');
r = 0.05;
rSphere = r*0.975;
for ( x = [-0.75/r:0.75/r]) {
for ( y = [-0.75/r:0.75/r]) {
for ( z = [-0.75/r:0.75/r]) {
translate( [x*2*r - (y%2*r) - (z%2*r),
r+ sqrt(3)*r*y + (z%2*r)/2,
r + sqrt(6)*2/3*r*z] )
sphere(rSphere, $fn=50, center = false);
}
}
}
r = 0.05;
rSphere = r*0.975;
wallScale = 0.975;
difference() {
difference() {
% import("0431630057_sphere_tri_5.stl");
scale([wallScale,wallScale,wallScale]) import("0431630057_sphere_tri_5.stl");
}
% for ( x = [-0.75/r:0.75/r]) {
for ( y = [-0.75/r:0.75/r]) {
for ( z = [-0.75/r:0.75/r]) {
translate( [x*2*r - (y%2*r) - (z%2*r),
r+ sqrt(3)*r*y + (z%2*r)/2,
r + sqrt(6)*2/3*r*z] )
sphere(rSphere, $fn=50, center = false);
}
}
}
}
import bpy
from sys import platform as _platform
import math
from mathutils import Vector
def drange(start, stop, step):
r = start
while r <= stop:
yield r
r += step
r = 0.25;
rSphere = r*0.975;
wallScale = 0.975;
sphereSubdivisions = 4;
print('Delete existing meshes');
bpy.ops.object.select_by_type(type='MESH');
bpy.ops.object.delete();
print('Load outer shell');
bpy.ops.import_mesh.stl(filepath='0431630057_sphere_tri_5.stl');
outerShell = bpy.data.objects['0431630057 Sphere Tri 5'];
print('Ensure normals face out');
bpy.context.scene.objects.active = outerShell;
bpy.ops.object.mode_set(mode='EDIT');
bpy.ops.mesh.select_all(action='SELECT');
bpy.ops.mesh.normals_make_consistent(inside=False);
bpy.ops.object.editmode_toggle();
print('Generate inner shell');
bpy.ops.object.duplicate();
innerShell = bpy.data.objects['0431630057 Sphere Tri 5.001'];
bpy.ops.transform.resize(value=(wallScale,wallScale,wallScale));
print('Subtract inner from outer shell');
bpy.context.scene.objects.active = outerShell;
bpy.ops.object.modifier_add(type='BOOLEAN');
outerShell.modifiers[0].operation = 'DIFFERENCE';
outerShell.modifiers[0].object = innerShell;
bpy.ops.object.modifier_apply(apply_as='DATA',modifier='Boolean');
innerShell.select = True;
bpy.context.scene.objects.active = innerShell;
bpy.ops.object.delete();
context = bpy.context
# Cut out the spherical grid
for x in drange(-0.75/r, 0.75/r, 1):
for y in drange(-0.75/r, 0.75/r, 1):
for z in drange(-0.75/r, 0.75/r, 1):
print(x,y,z);
origin = (0,0,0);
moveTo = (x*2*r - (y%2*r) - (z%2*r),
r + (math.sqrt(3)*r*y) + (z%2*r)/2,
r + (math.sqrt(6)*2/3*r*z));
bpy.ops.mesh.primitive_ico_sphere_add(location=origin,size=rSphere,subdivisions=sphereSubdivisions);
obj = context.active_object;
obj.location += Vector(moveTo);
sphereToDelete = bpy.data.objects['Icosphere'];
bpy.context.scene.objects.active = outerShell;
bpy.ops.object.modifier_add(type='BOOLEAN');
outerShell.modifiers[0].operation = 'DIFFERENCE';
outerShell.modifiers[0].object = sphereToDelete;
bpy.ops.object.modifier_apply(apply_as='DATA',modifier='Boolean');
sphereToDelete.select = True;
bpy.context.scene.objects.active = sphereToDelete;
bpy.ops.object.delete();
wallScale = 0.975;
difference() {
% import("0431630057_sphere_tri_5.stl");
scale([wallScale, wallScale, wallScale]) import("0431630057_sphere_tri_5.stl");
}
import("0431630057_sphere_tri_5.stl");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment