Source code for ddg.conversion.blender.net

from ddg.conversion.blender.halfedge import hes_to_bmesh
from ddg.datastructures.halfedge.surface_generator import icosphere
from ddg.datastructures.nets import utils as nutils
from ddg.datastructures.nets.net import (
    DiscreteCurve,
    DiscreteNet,
    EmptyNet,
    NetCollection,
    PointNet,
)
from ddg.visualization.blender.bmesh import from_pydata, join
from ddg.visualization.blender.curve import create_curve


[docs]def empty_to_bmesh(empty, bpy_data=None): if isinstance(empty, EmptyNet): if bpy_data is not None: bpy_data.clear() return bpy_data else: return from_pydata([], [], []) elif isinstance(empty, NetCollection) and isinstance(empty._nets[0], EmptyNet): if bpy_data is not None: bpy_data.clear() return bpy_data else: return from_pydata([], [], []) else: raise TypeError(point + " is not of type EmptyNet.")
[docs]def point_to_bmesh(point, sphere_radius=0, sphere_subdivision=3, bpy_data=None): """ if not isinstance(point, PointNet): raise TypeError(point + ' is not of type PointNet.') if sphere_radius == 0: return from_pydata([net()], [], []) else: return create_icosphere(center=net(), radius= sphere_radius, sphere_subdivision=sphere_subdivision) """ if isinstance(point, PointNet): if sphere_radius == 0: return from_pydata([point()], [], [], bpy_data) else: center = point() ico = icosphere(sphere_subdivision, sphere_radius) for v in ico.verts: v.co += center return hes_to_bmesh(ico, bpy_data=bpy_data) elif isinstance(point, NetCollection) and isinstance(point._nets[0], PointNet): return join(*[point_to_bmesh(p) for p in point], free=True, bm=bpy_data)
[docs]def net_to_bmesh(net, bounding=10, only_wire=False, bpy_data=None): if isinstance(net, DiscreteNet): subdomain = nutils.bound_domain(net.domain, bounding) if only_wire or isinstance(net, DiscreteCurve): return from_pydata( net[subdomain], subdomain.edge_data, [], bm=bpy_data, doubles=subdomain.double_edged, ) else: return from_pydata( net[subdomain], [], subdomain.face_data, bm=bpy_data, doubles=subdomain.double_edged, ) elif isinstance(net, NetCollection): return join( *[net_to_bmesh(n, bounding=bounding, only_wire=only_wire) for n in net], free=True, bm=bpy_data ) else: raise TypeError( "Net does not support given type: {}".format(net.__class__.__name__) )
[docs]def curve_to_bpy_curve( net, bounding=10, curve_properties=None, curve_type=None, bpy_data=None, name=None ): if name is None: name = net.name # TODO BOUNDING if isinstance(net, DiscreteCurve): subdomain = nutils.bound_domain(net.domain, bounding) curve_coordinates = list(net[subdomain]) cyclic = [net.domain.periodic] elif isinstance(net, NetCollection) and isinstance(net._nets[0], DiscreteCurve): curve_coordinates = [] cyclic = [] for c in net: # TODO BOUNDING subdomain = nutils.bound_domain(c.domain, bounding) curve_coordinates.append(list(c[subdomain])) cyclic.append(c.domain.periodic) else: raise TypeError(point + " is not of type DiscreteCurve.") if curve_type is not None: curvedata = create_curve( curve_coordinates, name=name, type=curve_type, cyclic=cyclic, curve=bpy_data ) else: curvedata = create_curve( curve_coordinates, name=name, cyclic=cyclic, curve=bpy_data )