from os import path, listdir, makedirs
from shutil import rmtree
import math
import bpy
from bpy.app.handlers import persistent
from bpy.types import Panel, PropertyGroup, Operator, Scene, UIList, Object
from bpy.props import (BoolProperty, IntProperty, StringProperty,
FloatVectorProperty, PointerProperty,
EnumProperty, CollectionProperty)
from mathutils import Vector
from . ui_panel import ILSPpanel
from . import utils
from . import foam
########################################################################
# PROPERTIES
########################################################################
[docs]
class DomainProperties(PropertyGroup):
[docs]
def setDefaultValues(self, context):
pass
[docs]
def check(self, context):
if self.selected_object is None:
message = 'none object selected ...'
iconValue = 3
return False, message, iconValue
return True
domain_object: PointerProperty(type=Object)
def _selectedObjectPoll(self, object):
if not utils.getDomainByDomainObj(object):
if object not in bpy.context.scene.ilsp_illuminations:
if object.type == 'MESH':
return True
else:
return False
selected_object: PointerProperty(
name="Selected Object",
description="Selected Object",
type=bpy.types.Object,
poll=lambda self, object: self._selectedObjectPoll(object),
)
def _updateFineness(self, context):
domain = context.scene.ilsp_domain
if domain.mesh_fineness == 'veryCoarse':
domain.octree = 6
elif domain.mesh_fineness == 'coarse':
domain.octree = 7
elif domain.mesh_fineness == 'moderate':
domain.octree = 8
elif domain.mesh_fineness == 'fine':
domain.octree = 9
elif domain.mesh_fineness == 'veryFine':
domain.octree = 10
mesh_fineness: EnumProperty(
name="Background Mesh Fineness",
description="Background Mesh Fineness",
items=(
('veryCoarse', "Very Coarse", ""),
('coarse', "Coarse", ""),
('moderate', "Moderate", ""),
('fine', "Fine", ""),
('veryFine', "Very Fine", ""),
),
default='moderate',
update=lambda self, context: self._updateFineness(context),
)
octree: IntProperty(
name="Octree Depth",
description="Octree Depth",
default=8,
min=1,
max=10,
)
########################################################################
# PANELS
########################################################################
[docs]
class ILSP_PT_domain(ILSPpanel, Panel):
bl_label = "Domain Generator"
def _enabled(self, context):
if context.scene.ilsp_domain.selected_object is None:
return False
else:
return True
[docs]
def draw(self, context):
layout = self.layout
layout.use_property_split = False
layout.use_property_decorate = False
domain = context.scene.ilsp_domain
process = context.scene.ilsp_process
enabled = self._enabled(context)
panelValues = True
if process.selected_domain:
self.layout.enabled = False
domain = utils.getDomainByDomainObj(process.selected_domain).props
panelValues = False
row = layout.row()
row.enabled = True
row.prop(domain, "selected_object", icon='OUTLINER_OB_MESH')
layout.separator()
row = layout.row()
row.enabled = enabled
row.prop(domain, "mesh_fineness")
if panelValues:
row = layout.row()
row.enabled = enabled
row.operator("domain.generate_mesh",
text="Generate Background Mesh")
status = domain.check(context)
try:
len(status)
except Exception:
return
layout.label(text=status[1], icon_value=status[2])
########################################################################
# OPERATORSs
########################################################################
[docs]
class ILSP_OT_domain_generateMesh(Operator):
bl_idname = "domain.generate_mesh"
bl_label = "3D-Print Info Volume"
bl_description = "Report the volume of the active mesh"
[docs]
@classmethod
def poll(cls, context):
status = context.scene.ilsp_domain.check(context)
try:
len(status)
except Exception:
return True
return False
[docs]
def execute(self, context):
domain = context.scene.ilsp_domain
domainName = domain.selected_object.name + '_domain'
case = path.join(context.scene.ILSP_tempDir, domainName, 'mesh')
try:
objs = bpy.data.objects
objs.remove(objs[domainName], do_unlink=True)
except Exception:
pass
domain_object = domain.selected_object.copy()
domain_object.data = domain.selected_object.data.copy()
domain_object.name = domainName
domain.selected_object.select_set(False)
domain.selected_object.hide_set(True)
utils.addObjectToCollection(domain_object,
Scene.ILSP_domainCollectionName)
utils.selectOnlyObj(domain_object)
bpy.ops.object.modifier_add(type='REMESH')
bpy.ops.object.modifier_set_active(modifier="Remesh")
bpy.context.object.modifiers["Remesh"].mode = 'SHARP'
bpy.context.object.modifiers["Remesh"].octree_depth = \
domain.octree
bpy.ops.object.modifier_apply(modifier="Remesh")
iLSPDomain = context.scene.ilsp_iLspDomains.add()
iLSPDomain.setDomainState(object=domain.selected_object,
domain_object=domain_object,
props=context.scene.ilsp_domain)
utils.selectOnlyObj(domain_object)
return {'FINISHED'}
[docs]
class iLspDomain(PropertyGroup):
object: PointerProperty(type=Object)
domain_object: PointerProperty(type=Object)
props: PointerProperty(type=DomainProperties)
[docs]
def setDomainState(self, *, object=None, domain_object=None, props=None):
self.object = object
self.domain_object = domain_object
utils.copyProperties(props, self.props)