Newer
Older
# GPL # "author": "Buerbaum Martin (Pontiac)"
Spivak Vladimir (cwolf3d)
committed
import bpy, bmesh
from math import sin, cos, tan, pi, radians
from bpy.types import Operator
from bpy.props import (
FloatProperty,
IntProperty,
Spivak Vladimir (cwolf3d)
committed
BoolProperty,
StringProperty,
Spivak Vladimir (cwolf3d)
committed
from bpy_extras import object_utils
# Create a new mesh (object) from verts/edges/faces.
# verts/edges/faces ... List of vertices/edges/faces for the
# new mesh (as used in from_pydata)
# name ... Name of the new mesh (& object)
Spivak Vladimir (cwolf3d)
committed
def create_mesh(context, verts, edges, faces, name):
# Create new mesh
mesh = bpy.data.meshes.new(name)
# Make a mesh from a list of verts/edges/faces.
mesh.from_pydata(verts, edges, faces)
mesh.update()
Spivak Vladimir (cwolf3d)
committed
return mesh
def createFaces(vertIdx1, vertIdx2, closed=False, flipped=False):
if not vertIdx1 or not vertIdx2:
return None
if len(vertIdx1) < 2 and len(vertIdx2) < 2:
fan = False
if (len(vertIdx1) != len(vertIdx2)):
if (len(vertIdx1) == 1 and len(vertIdx2) > 1):
fan = True
else:
return None
total = len(vertIdx2)
if closed:
# Bridge the start with the end.
if flipped:
face = [
vertIdx1[0],
vertIdx2[0],
vertIdx2[total - 1]]
if not fan:
face.append(vertIdx1[total - 1])
faces.append(face)
face = [vertIdx2[0], vertIdx1[0]]
if not fan:
face.append(vertIdx1[total - 1])
face.append(vertIdx2[total - 1])
faces.append(face)
# Bridge the rest of the faces.
for num in range(total - 1):
if fan:
face = [vertIdx2[num], vertIdx1[0], vertIdx2[num + 1]]
else:
face = [vertIdx2[num], vertIdx1[num],
vertIdx1[num + 1], vertIdx2[num + 1]]
faces.append(face)
if fan:
face = [vertIdx1[0], vertIdx2[num], vertIdx2[num + 1]]
else:
face = [vertIdx1[num], vertIdx2[num],
vertIdx2[num + 1], vertIdx1[num + 1]]
faces.append(face)
# Create the vertices and polygons for a simple elbow (bent pipe)
Spivak Vladimir (cwolf3d)
committed
def ElbowJointParameters():
ElbowJointParameters = [
"radius",
"div",
"angle",
"startLength",
"endLength",
]
return ElbowJointParameters
class AddElbowJoint(Operator, object_utils.AddObjectHelper):
bl_idname = "mesh.primitive_elbow_joint_add"
bl_label = "Add Pipe Elbow"
bl_description = "Construct an elbow pipe mesh"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
Spivak Vladimir (cwolf3d)
committed
ElbowJoint : BoolProperty(name = "ElbowJoint",
default = True,
description = "ElbowJoint")
#### change properties
change : BoolProperty(name = "Change",
default = False,
description = "change ElbowJoint")
description="The radius of the pipe",
default=1.0,
min=0.01,
max=100.0,
description="Number of vertices (divisions)",
default=32, min=3, max=256
)
name="Angle",
description="The angle of the branching pipe (i.e. the 'arm' - "
"Measured from the center line of the main pipe",
default=radians(45.0),
min=radians(-179.9),
max=radians(179.9),
description="Length of the beginning of the pipe",
default=3.0,
min=0.01,
max=100.0,
description="Length of the end of the pipe",
default=3.0,
min=0.01,
max=100.0,
Spivak Vladimir (cwolf3d)
committed
def draw(self, context):
layout = self.layout
box = layout.box()
box.prop(self, 'radius')
box.prop(self, 'div')
box.prop(self, 'angle')
box.prop(self, 'startLength')
box.prop(self, 'endLength')
if self.change == False:
# generic transform props
box = layout.box()
Spivak Vladimir (cwolf3d)
committed
box.prop(self, 'align', expand=True)
box.prop(self, 'location', expand=True)
box.prop(self, 'rotation', expand=True)
def execute(self, context):
# turn off 'Enter Edit Mode'
use_enter_edit_mode = bpy.context.preferences.edit.use_enter_edit_mode
bpy.context.preferences.edit.use_enter_edit_mode = False
Thomas Dinges
committed
radius = self.radius
div = self.div
Thomas Dinges
committed
angle = self.angle
Thomas Dinges
committed
startLength = self.startLength
endLength = self.endLength
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
verts = []
faces = []
loop1 = [] # The starting circle
loop2 = [] # The elbow circle
loop3 = [] # The end circle
# Create start circle
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = -startLength
loop1.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
# Create deformed joint circle
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = locX * tan(angle / 2.0)
loop2.append(len(verts))
verts.append([locX * radius, locY * radius, locZ * radius])
# Create end circle
baseEndLocX = -endLength * sin(angle)
baseEndLocZ = endLength * cos(angle)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
# Create circle
locX = sin(curVertAngle) * radius
locY = cos(curVertAngle) * radius
locZ = 0.0
# Rotate circle
locZ = locX * cos(pi / 2.0 - angle)
locX = locX * sin(pi / 2.0 - angle)
loop3.append(len(verts))
# Translate and add circle vertices to the list.
verts.append([baseEndLocX + locX, locY, baseEndLocZ + locZ])
# Create faces
faces.extend(createFaces(loop1, loop2, closed=True))
faces.extend(createFaces(loop2, loop3, closed=True))
Spivak Vladimir (cwolf3d)
committed
if bpy.context.mode == "OBJECT":
Spivak Vladimir (cwolf3d)
committed
if (context.selected_objects != []) and context.active_object and \
(context.active_object.data is not None) and ('ElbowJoint' in context.active_object.data.keys()) and \
(self.change == True):
Spivak Vladimir (cwolf3d)
committed
obj = context.active_object
oldmesh = obj.data
oldmeshname = obj.data.name
mesh = create_mesh(context, verts, [], faces, "Elbow Joint")
obj.data = mesh
Spivak Vladimir (cwolf3d)
committed
for material in oldmesh.materials:
obj.data.materials.append(material)
Spivak Vladimir (cwolf3d)
committed
bpy.data.meshes.remove(oldmesh)
obj.data.name = oldmeshname
else:
mesh = create_mesh(context, verts, [], faces, "Elbow Joint")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
mesh.update()
obj.data["ElbowJoint"] = True
obj.data["change"] = False
for prm in ElbowJointParameters():
obj.data[prm] = getattr(self, prm)
if bpy.context.mode == "EDIT_MESH":
active_object = context.active_object
name_active_object = active_object.name
bpy.ops.object.mode_set(mode='OBJECT')
mesh = create_mesh(context, verts, [], faces, "TMP")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
obj.select_set(True)
active_object.select_set(True)
Vladimir Spivak(cwolf3d)
committed
bpy.context.view_layer.objects.active = active_object
Spivak Vladimir (cwolf3d)
committed
bpy.ops.object.join()
context.active_object.name = name_active_object
bpy.ops.object.mode_set(mode='EDIT')
if use_enter_edit_mode:
bpy.ops.object.mode_set(mode = 'EDIT')
# restore pre operator state
bpy.context.preferences.edit.use_enter_edit_mode = use_enter_edit_mode
# Create the vertices and polygons for a simple tee (T) joint
# The base arm of the T can be positioned in an angle if needed though
Spivak Vladimir (cwolf3d)
committed
def TeeJointParameters():
TeeJointParameters = [
"radius",
"div",
"angle",
"startLength",
"endLength",
"branchLength",
]
return TeeJointParameters
class AddTeeJoint(Operator, object_utils.AddObjectHelper):
bl_idname = "mesh.primitive_tee_joint_add"
bl_label = "Add Pipe Tee-Joint"
bl_description = "Construct a tee-joint pipe mesh"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
Spivak Vladimir (cwolf3d)
committed
TeeJoint : BoolProperty(name = "TeeJoint",
default = True,
description = "TeeJoint")
#### change properties
change : BoolProperty(name = "Change",
default = False,
description = "change TeeJoint")
description="The radius of the pipe",
default=1.0,
min=0.01,
max=100.0,
description="Number of vertices (divisions)",
name="Angle",
description="The angle of the branching pipe (i.e. the 'arm' - "
"Measured from the center line of the main pipe",
default=radians(90.0),
min=radians(0.1),
max=radians(179.9),
name="Length Start",
description="Length of the beginning of the"
" main pipe (the straight one)",
default=3.0,
min=0.01,
max=100.0,
name="End Length",
description="Length of the end of the"
" main pipe (the straight one)",
default=3.0,
min=0.01,
max=100.0,
description="Length of the arm pipe (the bent one)",
default=3.0,
min=0.01,
max=100.0,
Spivak Vladimir (cwolf3d)
committed
def draw(self, context):
layout = self.layout
box = layout.box()
box.prop(self, 'radius')
box.prop(self, 'div')
box.prop(self, 'angle')
box.prop(self, 'startLength')
box.prop(self, 'endLength')
box.prop(self, 'branchLength')
if self.change == False:
# generic transform props
box = layout.box()
Spivak Vladimir (cwolf3d)
committed
box.prop(self, 'align', expand=True)
box.prop(self, 'location', expand=True)
box.prop(self, 'rotation', expand=True)
def execute(self, context):
# turn off 'Enter Edit Mode'
use_enter_edit_mode = bpy.context.preferences.edit.use_enter_edit_mode
bpy.context.preferences.edit.use_enter_edit_mode = False
Thomas Dinges
committed
radius = self.radius
div = self.div
Thomas Dinges
committed
angle = self.angle
Thomas Dinges
committed
startLength = self.startLength
endLength = self.endLength
branchLength = self.branchLength
# Odd vertice number not supported (yet)
self.report({'INFO'}, "Odd vertices number is not yet supported")
return {'CANCELLED'}
verts = []
faces = []
# List of vert indices of each cross section
loopMainStart = [] # Vert indices for the beginning of the main pipe
loopJoint1 = [] # Vert indices for joint that is used to connect the joint & loopMainStart
loopJoint2 = [] # Vert indices for joint that is used to connect the joint & loopArm
loopJoint3 = [] # Vert index for joint that is used to connect the joint & loopMainEnd
loopArm = [] # Vert indices for the end of the arm
loopMainEnd = [] # Vert indices for the end of the main pipe.
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# Create start circle (main pipe)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = -startLength
loopMainStart.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
# Create deformed joint circle
vertTemp1 = None
vertTemp2 = None
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
if vertIdx == 0:
vertTemp1 = len(verts)
if vertIdx == div / 2:
# @todo: This will possibly break if we
# ever support odd divisions.
vertTemp2 = len(verts)
loopJoint1.append(len(verts))
if (vertIdx < div / 2):
# Straight side of main pipe.
locZ = 0
loopJoint3.append(len(verts))
else:
# Branching side
locZ = locX * tan(angle / 2.0)
loopJoint2.append(len(verts))
verts.append([locX * radius, locY * radius, locZ * radius])
# Create 2. deformed joint (half-)circle
loopTemp = []
for vertIdx in range(div):
if (vertIdx > div / 2):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = -cos(curVertAngle)
locZ = -(radius * locX * tan((pi - angle) / 2.0))
loopTemp.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
loopTemp2 = loopTemp[:]
# Finalise 2. loop
loopTemp.reverse()
loopTemp.append(vertTemp1)
loopJoint2.reverse()
loopJoint2.extend(loopTemp)
loopJoint2.reverse()
# Finalise 3. loop
loopTemp2.append(vertTemp2)
loopTemp2.reverse()
loopJoint3.extend(loopTemp2)
# Create end circle (branching pipe)
baseEndLocX = -branchLength * sin(angle)
baseEndLocZ = branchLength * cos(angle)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
# Create circle
locX = sin(curVertAngle) * radius
locY = cos(curVertAngle) * radius
locZ = 0.0
# Rotate circle
locZ = locX * cos(pi / 2.0 - angle)
locX = locX * sin(pi / 2.0 - angle)
loopArm.append(len(verts))
# Add translated circle.
verts.append([baseEndLocX + locX, locY, baseEndLocZ + locZ])
# Create end circle (main pipe)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = endLength
loopMainEnd.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
# Create faces
faces.extend(createFaces(loopMainStart, loopJoint1, closed=True))
faces.extend(createFaces(loopJoint2, loopArm, closed=True))
faces.extend(createFaces(loopJoint3, loopMainEnd, closed=True))
Spivak Vladimir (cwolf3d)
committed
if bpy.context.mode == "OBJECT":
Spivak Vladimir (cwolf3d)
committed
if (context.selected_objects != []) and context.active_object and \
(context.active_object.data is not None) and ('TeeJoint' in context.active_object.data.keys()) and \
(self.change == True):
Spivak Vladimir (cwolf3d)
committed
obj = context.active_object
oldmesh = obj.data
oldmeshname = obj.data.name
mesh = create_mesh(context, verts, [], faces, "Tee Joint")
obj.data = mesh
Spivak Vladimir (cwolf3d)
committed
for material in oldmesh.materials:
obj.data.materials.append(material)
Spivak Vladimir (cwolf3d)
committed
bpy.data.meshes.remove(oldmesh)
obj.data.name = oldmeshname
else:
mesh = create_mesh(context, verts, [], faces, "Tee Joint")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
mesh.update()
obj.data["TeeJoint"] = True
obj.data["change"] = False
for prm in TeeJointParameters():
obj.data[prm] = getattr(self, prm)
if bpy.context.mode == "EDIT_MESH":
active_object = context.active_object
name_active_object = active_object.name
bpy.ops.object.mode_set(mode='OBJECT')
mesh = create_mesh(context, verts, [], faces, "TMP")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
obj.select_set(True)
active_object.select_set(True)
Vladimir Spivak(cwolf3d)
committed
bpy.context.view_layer.objects.active = active_object
Spivak Vladimir (cwolf3d)
committed
bpy.ops.object.join()
context.active_object.name = name_active_object
bpy.ops.object.mode_set(mode='EDIT')
if use_enter_edit_mode:
bpy.ops.object.mode_set(mode = 'EDIT')
# restore pre operator state
bpy.context.preferences.edit.use_enter_edit_mode = use_enter_edit_mode
Spivak Vladimir (cwolf3d)
committed
def WyeJointParameters():
WyeJointParameters = [
"radius",
"div",
"angle1",
"angle2",
"startLength",
"branch1Length",
"branch2Length",
]
return WyeJointParameters
class AddWyeJoint(Operator, object_utils.AddObjectHelper):
bl_idname = "mesh.primitive_wye_joint_add"
bl_label = "Add Pipe Wye-Joint"
bl_description = "Construct a wye-joint pipe mesh"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
Spivak Vladimir (cwolf3d)
committed
WyeJoint : BoolProperty(name = "WyeJoint",
default = True,
description = "WyeJoint")
#### change properties
change : BoolProperty(name = "Change",
default = False,
description = "change WyeJoint")
description="The radius of the pipe",
default=1.0,
min=0.01,
max=100.0,
description="Number of vertices (divisions)",
name="Angle 1",
description="The angle of the 1. branching pipe "
"(measured from the center line of the main pipe)",
default=radians(45.0),
min=radians(-179.9),
max=radians(179.9),
name="Angle 2",
description="The angle of the 2. branching pipe "
"(measured from the center line of the main pipe) ",
default=radians(45.0),
min=radians(-179.9),
max=radians(179.9),
name="Length Start",
description="Length of the beginning of the"
" main pipe (the straight one)",
default=3.0,
min=0.01,
max=100.0,
description="Length of the 1. arm",
default=3.0,
min=0.01,
max=100.0,
description="Length of the 2. arm",
default=3.0,
min=0.01,
max=100.0,
Spivak Vladimir (cwolf3d)
committed
def draw(self, context):
layout = self.layout
box = layout.box()
box.prop(self, 'radius')
box.prop(self, 'div')
box.prop(self, 'angle1')
box.prop(self, 'angle2')
box.prop(self, 'startLength')
box.prop(self, 'branch1Length')
box.prop(self, 'branch2Length')
if self.change == False:
# generic transform props
box = layout.box()
Spivak Vladimir (cwolf3d)
committed
box.prop(self, 'align', expand=True)
box.prop(self, 'location', expand=True)
box.prop(self, 'rotation', expand=True)
def execute(self, context):
# turn off 'Enter Edit Mode'
use_enter_edit_mode = bpy.context.preferences.edit.use_enter_edit_mode
bpy.context.preferences.edit.use_enter_edit_mode = False
Thomas Dinges
committed
radius = self.radius
div = self.div
Thomas Dinges
committed
angle1 = self.angle1
angle2 = self.angle2
Thomas Dinges
committed
startLength = self.startLength
branch1Length = self.branch1Length
branch2Length = self.branch2Length
# Odd vertice number not supported (yet)
self.report({'INFO'}, "Odd vertices number is not yet supported")
return {'CANCELLED'}
verts = []
faces = []
# List of vert indices of each cross section
loopMainStart = [] # Vert indices for the beginning of the main pipe
loopJoint1 = [] # Vert index for joint that is used to connect the joint & loopMainStart
loopJoint2 = [] # Vert index for joint that is used to connect the joint & loopArm1
loopJoint3 = [] # Vert index for joint that is used to connect the joint & loopArm2
loopArm1 = [] # Vert idxs for end of the 1. arm
loopArm2 = [] # Vert idxs for end of the 2. arm
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
# Create start circle
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = -startLength
loopMainStart.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
# Create deformed joint circle
vertTemp1 = None
vertTemp2 = None
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
if vertIdx == 0:
vertTemp2 = len(verts)
if vertIdx == div / 2:
# @todo: This will possibly break if we
# ever support odd divisions.
vertTemp1 = len(verts)
loopJoint1.append(len(verts))
if (vertIdx > div / 2):
locZ = locX * tan(angle1 / 2.0)
loopJoint2.append(len(verts))
else:
locZ = locX * tan(-angle2 / 2.0)
loopJoint3.append(len(verts))
verts.append([locX * radius, locY * radius, locZ * radius])
# Create 2. deformed joint (half-)circle
loopTemp = []
angleJoint = (angle2 - angle1) / 2.0
for vertIdx in range(div):
if (vertIdx > div / 2):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = (-sin(curVertAngle) * sin(angleJoint) / sin(angle2 - angleJoint))
locZ = (-(sin(curVertAngle) * cos(angleJoint) / sin(angle2 - angleJoint)))
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
loopTemp.append(len(verts))
verts.append([locX * radius, locY * radius, locZ * radius])
loopTemp2 = loopTemp[:]
# Finalise 2. loop
loopTemp.append(vertTemp1)
loopTemp.reverse()
loopTemp.append(vertTemp2)
loopJoint2.reverse()
loopJoint2.extend(loopTemp)
loopJoint2.reverse()
# Finalise 3. loop
loopTemp2.reverse()
loopJoint3.extend(loopTemp2)
# Create end circle (1. branching pipe)
baseEndLocX = -branch1Length * sin(angle1)
baseEndLocZ = branch1Length * cos(angle1)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
# Create circle
locX = sin(curVertAngle) * radius
locY = cos(curVertAngle) * radius
locZ = 0.0
# Rotate circle
locZ = locX * cos(pi / 2.0 - angle1)
locX = locX * sin(pi / 2.0 - angle1)
loopArm1.append(len(verts))
# Add translated circle.
verts.append([baseEndLocX + locX, locY, baseEndLocZ + locZ])
# Create end circle (2. branching pipe)
baseEndLocX = branch2Length * sin(angle2)
baseEndLocZ = branch2Length * cos(angle2)
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
# Create circle
locX = sin(curVertAngle) * radius
locY = cos(curVertAngle) * radius
locZ = 0.0
# Rotate circle
locZ = locX * cos(pi / 2.0 + angle2)
locX = locX * sin(pi / 2.0 + angle2)
loopArm2.append(len(verts))
# Add translated circle
verts.append([baseEndLocX + locX, locY, baseEndLocZ + locZ])
# Create faces
faces.extend(createFaces(loopMainStart, loopJoint1, closed=True))
faces.extend(createFaces(loopJoint2, loopArm1, closed=True))
faces.extend(createFaces(loopJoint3, loopArm2, closed=True))
Spivak Vladimir (cwolf3d)
committed
if bpy.context.mode == "OBJECT":
Spivak Vladimir (cwolf3d)
committed
if (context.selected_objects != []) and context.active_object and \
(context.active_object.data is not None) and ('WyeJoint' in context.active_object.data.keys()) and \
(self.change == True):
Spivak Vladimir (cwolf3d)
committed
obj = context.active_object
oldmesh = obj.data
oldmeshname = obj.data.name
mesh = create_mesh(context, verts, [], faces, "Wye Joint")
obj.data = mesh
Spivak Vladimir (cwolf3d)
committed
for material in oldmesh.materials:
obj.data.materials.append(material)
Spivak Vladimir (cwolf3d)
committed
bpy.data.meshes.remove(oldmesh)
obj.data.name = oldmeshname
else:
mesh = create_mesh(context, verts, [], faces, "Wye Joint")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
mesh.update()
obj.data["WyeJoint"] = True
obj.data["change"] = False
for prm in WyeJointParameters():
obj.data[prm] = getattr(self, prm)
if bpy.context.mode == "EDIT_MESH":
active_object = context.active_object
name_active_object = active_object.name
bpy.ops.object.mode_set(mode='OBJECT')
mesh = create_mesh(context, verts, [], faces, "TMP")
Spivak Vladimir (cwolf3d)
committed
obj = object_utils.object_data_add(context, mesh, operator=self)
Spivak Vladimir (cwolf3d)
committed
obj.select_set(True)
active_object.select_set(True)
Vladimir Spivak(cwolf3d)
committed
bpy.context.view_layer.objects.active = active_object
Spivak Vladimir (cwolf3d)
committed
bpy.ops.object.join()
context.active_object.name = name_active_object
bpy.ops.object.mode_set(mode='EDIT')
if use_enter_edit_mode:
bpy.ops.object.mode_set(mode = 'EDIT')
# restore pre operator state
bpy.context.preferences.edit.use_enter_edit_mode = use_enter_edit_mode
# Create the vertices and polygons for a cross (+ or X) pipe joint
Spivak Vladimir (cwolf3d)
committed
def CrossJointParameters():
CrossJointParameters = [
"radius",
"div",
"angle1",
"angle2",
"angle3",
"startLength",
"branch1Length",
"branch2Length",
"branch3Length",
]
return CrossJointParameters
class AddCrossJoint(Operator, object_utils.AddObjectHelper):
bl_idname = "mesh.primitive_cross_joint_add"
bl_label = "Add Pipe Cross-Joint"
bl_description = "Construct a cross-joint pipe mesh"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
Spivak Vladimir (cwolf3d)
committed
CrossJoint : BoolProperty(name = "CrossJoint",
default = True,
description = "CrossJoint")
#### change properties
change : BoolProperty(name = "Change",
default = False,
description = "change CrossJoint")
description="The radius of the pipe",
default=1.0,
min=0.01,
max=100.0,
description="Number of vertices (divisions)",
description="The angle of the 1. arm (from the main axis)",
default=radians(90.0),
min=radians(-179.9),
max=radians(179.9),
angle2: FloatProperty(name="Angle 2",
description="The angle of the 2. arm (from the main axis)",
default=radians(90.0),
min=radians(-179.9),
max=radians(179.9),
angle3: FloatProperty(name="Angle 3 (center)",
description="The angle of the center arm (from the main axis)",
default=radians(0.0),
min=radians(-179.9),
max=radians(179.9),
name="Length Start",
description="Length of the beginning of the "
"main pipe (the straight one)",
default=3.0,
min=0.01,
max=100.0,
branch1Length: FloatProperty(name="Length Arm 1",
description="Length of the 1. arm",
default=3.0,
min=0.01,
max=100.0,
description="Length of the 2. arm",
default=3.0,
min=0.01,
max=100.0,
name="Length Arm 3 (center)",
description="Length of the center arm",
default=3.0,
min=0.01,
max=100.0,
Spivak Vladimir (cwolf3d)
committed
def draw(self, context):
layout = self.layout
box = layout.box()
box.prop(self, 'radius')
box.prop(self, 'div')
box.prop(self, 'angle1')
box.prop(self, 'angle2')
box.prop(self, 'angle3')
box.prop(self, 'startLength')
box.prop(self, 'branch1Length')
box.prop(self, 'branch2Length')
box.prop(self, 'branch3Length')
if self.change == False:
# generic transform props
box = layout.box()
Spivak Vladimir (cwolf3d)
committed
box.prop(self, 'align', expand=True)
box.prop(self, 'location', expand=True)
box.prop(self, 'rotation', expand=True)
def execute(self, context):
# turn off 'Enter Edit Mode'
use_enter_edit_mode = bpy.context.preferences.edit.use_enter_edit_mode
bpy.context.preferences.edit.use_enter_edit_mode = False
Thomas Dinges
committed
radius = self.radius
div = self.div
Thomas Dinges
committed
angle1 = self.angle1
angle2 = self.angle2
angle3 = self.angle3
Thomas Dinges
committed
startLength = self.startLength
branch1Length = self.branch1Length
branch2Length = self.branch2Length
branch3Length = self.branch3Length
# Odd vertice number not supported (yet)
self.report({'INFO'}, "Odd vertices number is not yet supported")
return {'CANCELLED'}
verts = []
faces = []
# List of vert indices of each cross section
loopMainStart = [] # Vert indices for the beginning of the main pipe
loopJoint1 = [] # Vert index for joint that is used to connect the joint & loopMainStart
loopJoint2 = [] # Vert index for joint that is used to connect the joint & loopArm1
loopJoint3 = [] # Vert index for joint that is used to connect the joint & loopArm2
loopJoint4 = [] # Vert index for joint that is used to connect the joint & loopArm3
loopArm1 = [] # Vert idxs for the end of the 1. arm
loopArm2 = [] # Vert idxs for the end of the 2. arm
loopArm3 = [] # Vert idxs for the center arm end
# Create start circle
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
locZ = -startLength
loopMainStart.append(len(verts))
verts.append([locX * radius, locY * radius, locZ])
# Create 1. deformed joint circle
vertTemp1 = None
vertTemp2 = None
for vertIdx in range(div):
curVertAngle = vertIdx * (2.0 * pi / div)
locX = sin(curVertAngle)
locY = cos(curVertAngle)
if vertIdx == 0: