blendercam/scripts/addons/cam/opencamlib/oclSample.py

93 wiersze
3.5 KiB
Python

import os
try:
import ocl
except ImportError:
try:
import opencamlib as ocl
except ImportError:
pass
import tempfile
from io_mesh_stl import blender_utils
import mathutils
import math
from cam.simple import activate
from cam.exception import *
from cam.async_op import progress_async
OCL_SCALE = 1000.0
_PREVIOUS_OCL_MESH=None
def get_oclSTL(operation):
me = None
oclSTL = ocl.STLSurf()
found_mesh=False
for collision_object in operation.objects:
activate(collision_object)
if collision_object.type == "MESH" or collision_object.type== "CURVE" or collision_object.type== "FONT" or collision_object.type== "SURFACE":
found_mesh=True
global_matrix = mathutils.Matrix.Identity(4)
faces = blender_utils.faces_from_mesh(collision_object, global_matrix, operation.use_modifiers)
for face in faces:
t = ocl.Triangle(ocl.Point(face[0][0]*OCL_SCALE, face[0][1]*OCL_SCALE, (face[0][2]+operation.skin)*OCL_SCALE),
ocl.Point(face[1][0]*OCL_SCALE, face[1][1]*OCL_SCALE, (face[1][2]+operation.skin)*OCL_SCALE),
ocl.Point(face[2][0]*OCL_SCALE, face[2][1]*OCL_SCALE, (face[2][2]+operation.skin)*OCL_SCALE))
oclSTL.addTriangle(t)
# FIXME needs to work with collections
if not found_mesh:
raise CamException("This operation requires a mesh or curve object or equivalent (e.g. text, volume).")
return oclSTL
async def ocl_sample(operation, chunks,use_cached_mesh = False):
global _PREVIOUS_OCL_MESH
op_cutter_type = operation.cutter_type
op_cutter_diameter = operation.cutter_diameter
op_minz = operation.minz
op_cutter_tip_angle = math.radians(operation.cutter_tip_angle)/2
if op_cutter_type == "VCARVE":
cutter_length = (op_cutter_diameter/math.tan(op_cutter_tip_angle))/2
else:
cutter_length = 10
cutter = None
if op_cutter_type == 'END':
cutter = ocl.CylCutter((op_cutter_diameter + operation.skin * 2) * 1000, cutter_length)
elif op_cutter_type == 'BALLNOSE':
cutter = ocl.BallCutter((op_cutter_diameter + operation.skin * 2) * 1000, cutter_length)
elif op_cutter_type == 'VCARVE':
cutter = ocl.ConeCutter((op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle, cutter_length)
elif op_cutter_type =='CYLCONE':
cutter = ocl.CylConeCutter((operation.cylcone_diameter/2+operation.skin)*2000,(op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle)
elif op_cutter_type == 'BALLCONE':
cutter = ocl.BallConeCutter((operation.ball_radius + operation.skin) * 2000,
(op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle)
elif op_cutter_type =='BULLNOSE':
cutter = ocl.BullCutter((op_cutter_diameter + operation.skin * 2) * 1000,operation.bull_corner_radius*1000, cutter_length)
else:
print("Cutter unsupported: {0}\n".format(op_cutter_type))
quit()
bdc = ocl.BatchDropCutter()
if use_cached_mesh and _PREVIOUS_OCL_MESH is not None:
oclSTL=_PREVIOUS_OCL_MESH
else:
oclSTL = get_oclSTL(operation)
_PREVIOUS_OCL_MESH=oclSTL
bdc.setSTL(oclSTL)
bdc.setCutter(cutter)
for chunk in chunks:
for coord in chunk.points:
bdc.appendPoint(ocl.CLPoint(coord[0] * 1000, coord[1] * 1000, op_minz * 1000))
await progress_async("OpenCAMLib sampling")
bdc.run()
cl_points = bdc.getCLPoints()
return cl_points