Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--add_mesh_extra_objects/Blocks.py279
-rw-r--r--add_mesh_extra_objects/Wallfactory.py1026
-rw-r--r--add_mesh_extra_objects/__init__.py168
-rw-r--r--add_mesh_extra_objects/add_mesh_beam_builder.py230
-rw-r--r--add_mesh_extra_objects/add_mesh_gears.py238
-rw-r--r--add_mesh_extra_objects/add_mesh_gemstones.py125
-rw-r--r--add_mesh_extra_objects/add_mesh_honeycomb.py74
-rw-r--r--add_mesh_extra_objects/add_mesh_menger_sponge.py48
-rw-r--r--add_mesh_extra_objects/add_mesh_pyramid.py152
-rw-r--r--add_mesh_extra_objects/add_mesh_round_brilliant.py150
-rw-r--r--add_mesh_extra_objects/add_mesh_round_cube.py53
-rw-r--r--add_mesh_extra_objects/add_mesh_star.py5
-rw-r--r--add_mesh_extra_objects/add_mesh_teapot.py19
-rw-r--r--add_mesh_extra_objects/add_mesh_triangles.py356
14 files changed, 1602 insertions, 1321 deletions
diff --git a/add_mesh_extra_objects/Blocks.py b/add_mesh_extra_objects/Blocks.py
index f798cf52..bade30d0 100644
--- a/add_mesh_extra_objects/Blocks.py
+++ b/add_mesh_extra_objects/Blocks.py
@@ -1,4 +1,4 @@
-# GPL # "author":
+# GPL # "authors": dudecon, jambay
# Module notes:
#
@@ -8,87 +8,150 @@
# auto-clip wall edge to SMALL for radial and domes.
# unregister doesn't release all references.
# repeat for opening doesn't distribute evenly when radialized - see wrap around
-# note above.
+# note above.
# if opening width == indent*2 the edge blocks fail (row of blocks cross opening).
# if openings overlap fills inverse with blocks - see h/v slots.
# Negative grout width creates a pair of phantom blocks, seperated by grout
-# width, inside the edges.
-# if block width variance is 0, and edging is on, right edge blocks create a "vertical seam".
+# width, inside the edges.
+# if block width variance is 0, and edging is on, right edge blocks create a "vertical seam"
import bpy
from random import random
-from math import fmod, sqrt, sin, cos, atan, pi as PI
+from math import (
+ fmod, sqrt,
+ sin, cos, atan,
+ pi as PI,
+ )
+
+# Set to True to enable debug_prints
+DEBUG = False
# A few constants
SMALL = 0.000000000001
-NOTZERO = 0.01 # for values that must be != 0; see UI options/variables - sort of a bug to be fixed.
+# for values that must be != 0; see UI options/variables - sort of a bug to be fixed
+NOTZERO = 0.01
-# global variables
+# Global variables
# General masonry Settings
-settings = {'w': 1.2, 'wv': 0.3, 'h': .6, 'hv': 0.3, 'd': 0.3, 'dv': 0.1,
- 'g': 0.1, 'gv': 0.07, 'gd': 0.01, 'gdv': 0.0, 'b': 0, 'bv': 0,
- 'f': 0.0, 'fv': 0.0, 't': 0.0, 'sdv': 0.1, 'hwt': 0.5, 'aln': 0,
- 'wm': 0.8, 'hm': 0.3, 'dm': 0.1,
- 'woff': 0.0, 'woffv': 0.0, 'eoff': 0.3, 'eoffv': 0.0, 'rwhl': 1,
- 'hb': 0, 'ht': 0, 'ge': 0, 'physics': 0}
-# 'w':width 'wv':widthVariation
-# 'h':height 'hv':heightVariation
-# 'd':depth 'dv':depthVariation
-# 'g':grout 'gv':groutVariation 'gd':groutDepth 'gdv':groutDepthVariation
-# 'b':bevel 'bv':bevelVariation
-# 'f':flawSize 'fv':flawSizeVariation 'ff':flawFraction
-# 't':taper
-# 'sdv':subdivision(distance or angle)
-# 'hwt':row height effect on block widths in the row (0=no effect,
-# 1=1:1 relationship, negative values allowed, 0.5 works well)
-# 'aln':alignment(0=none, 1=rows w/features, 2=features w/rows)
-# (currently un-used)
-# 'wm':width minimum 'hm':height minimum 'dm':depth minimum
-# 'woff':row start offset(fraction of width)
-# 'woffv':width offset variation(fraction of width)
-# 'eoff':edge offset 'eoffv':edge offset variation
-# 'rwhl':row height lock(1 is all blocks in row have same height)
-# 'hb':bottom row height 'ht': top row height 'ge': grout the edges
-# 'physics': set up for physics
+# ------------------------
+settings = {
+ 'w': 1.2, 'wv': 0.3, 'h': .6, 'hv': 0.3, 'd': 0.3, 'dv': 0.1,
+ 'g': 0.1, 'gv': 0.07, 'gd': 0.01, 'gdv': 0.0, 'b': 0, 'bv': 0,
+ 'f': 0.0, 'fv': 0.0, 't': 0.0, 'sdv': 0.1, 'hwt': 0.5, 'aln': 0,
+ 'wm': 0.8, 'hm': 0.3, 'dm': 0.1,
+ 'woff': 0.0, 'woffv': 0.0, 'eoff': 0.3, 'eoffv': 0.0, 'rwhl': 1,
+ 'hb': 0, 'ht': 0, 'ge': 0, 'physics': 0
+ }
+"""
+ settings DOCUMENTATION:
+ 'w':width 'wv':widthVariation
+ 'h':height 'hv':heightVariation
+ 'd':depth 'dv':depthVariation
+ 'g':grout 'gv':groutVariation 'gd':groutDepth 'gdv':groutDepthVariation
+ 'b':bevel 'bv':bevelVariation
+ 'f':flawSize 'fv':flawSizeVariation 'ff':flawFraction
+ 't':taper
+ 'sdv':subdivision(distance or angle)
+ 'hwt':row height effect on block widths in the row (0=no effect,
+ 1=1:1 relationship, negative values allowed, 0.5 works well)
+ 'aln':alignment(0=none, 1=rows w/features, 2=features w/rows)
+ (currently unused)
+ 'wm':width minimum 'hm':height minimum 'dm':depth minimum
+ 'woff':row start offset(fraction of width)
+ 'woffv':width offset variation(fraction of width)
+ 'eoff':edge offset 'eoffv':edge offset variation
+ 'rwhl':row height lock(1 is all blocks in row have same height)
+ 'hb':bottom row height 'ht': top row height 'ge': grout the edges
+ 'physics': set up for physics
+"""
# dims = area of wall (face)
-dims = {'s': 0, 'e': PI * 3 / 2, 'b': 0.1, 't': 12.3} # radial
-# 's':start x or theta 'e':end x or theta 'b':bottom z or r 't':top z or r
-# 'w' = e-s and h = t-b; calculated to optimize for various operations/usages
-# dims = {'s':-12, 'e':15, 'w':27, 'b':-15., 't':15., 'h':30}
-# dims = {'s':-bayDim/2, 'e':bayDim/2, 'b':-5., 't':10.} # bay settings?
-
+# ------------------------
+dims = {
+ 's': 0, 'e': PI * 3 / 2, 'b': 0.1, 't': 12.3
+ } # radial
+"""
+ dims DOCUMENTATION:
+ 's':start x or theta 'e':end x or theta 'b':bottom z or r 't':top z or r
+ 'w' = e-s and h = t-b; calculated to optimize for various operations/usages
+ dims = {'s':-12, 'e':15, 'w':27, 'b':-15., 't':15., 'h':30}
+ dims = {'s':-bayDim/2, 'e':bayDim/2, 'b':-5., 't':10.} # bay settings?
+"""
+
+# ------------------------
radialized = 0 # Radiating from one point - round/disc; instead of square
-slope = 0 # Warp/slope; curved over like a vaulted tunnel
+slope = 0 # Warp/slope; curved over like a vaulted tunnel
+
# 'bigblock': merge adjacent blocks into single large blocks
-bigBlock = 0 # Merge blocks
+bigBlock = 0 # Merge blocks
-# Gaps in blocks for various apertures.
+
+# Gaps in blocks for various apertures
+# ------------------------
# openingSpecs = []
-openingSpecs = [{'w': 0.5, 'h': 0.5, 'x': 0.8, 'z': 2.7, 'rp': 1, 'b': 0.0,
- 'v': 0, 'vl': 0, 't': 0, 'tl': 0}]
-# 'w': opening width, 'h': opening height,
-# 'x': horizontal position, 'z': vertical position,
-# 'rp': make multiple openings, with a spacing of x,
-# 'b': bevel the opening, inside only, like an arrow slit.
-# 'v': height of the top arch, 'vl':height of the bottom arch,
-# 't': thickness of the top arch, 'tl': thickness of the bottom arch
-
-# Add blocks to make platforms.
+openingSpecs = [
+ {'w': 0.5, 'h': 0.5, 'x': 0.8, 'z': 2.7, 'rp': 1, 'b': 0.0,
+ 'v': 0, 'vl': 0, 't': 0, 'tl': 0}
+ ]
+"""
+ openingSpecs DOCUMENTATION:
+ 'w': opening width, 'h': opening height,
+ 'x': horizontal position, 'z': vertical position,
+ 'rp': make multiple openings, with a spacing of x,
+ 'b': bevel the opening, inside only, like an arrow slit.
+ 'v': height of the top arch, 'vl':height of the bottom arch,
+ 't': thickness of the top arch, 'tl': thickness of the bottom arch
+"""
+
+# Add blocks to make platforms
+# ------------------------
shelfExt = 0
-shelfSpecs = {'w': 0.5, 'h': 0.5, 'd': 0.3, 'x': 0.8, 'z': 2.7}
-# 'w': block width, 'h': block height, 'd': block depth (shelf size; offset from wall)
-# 'x': horizontal start position, 'z': vertical start position
-# Add blocks to make steps.
+shelfSpecs = {
+ 'w': 0.5, 'h': 0.5, 'd': 0.3, 'x': 0.8, 'z': 2.7
+ }
+"""
+ shelfSpecs DOCUMENTATION:
+ 'w': block width, 'h': block height, 'd': block depth (shelf size; offset from wall)
+ 'x': horizontal start position, 'z': vertical start position
+"""
+
+# Add blocks to make steps
+# ------------------------
stepMod = 0
-stepSpecs = {'x': 0.0, 'z': -10, 'w': 10.0, 'h': 10.0,
- 'v': 0.7, 't': 1.0, 'd': 1.0}
-# 'x': horizontal start position, 'z': vertical start position,
-# 'w': step area width, 'h': step area height,
-# 'v': riser height, 't': tread width, 'd': block depth (step size; offset from wall)
+
+stepSpecs = {
+ 'x': 0.0, 'z': -10, 'w': 10.0, 'h': 10.0,
+ 'v': 0.7, 't': 1.0, 'd': 1.0
+ }
+"""
+ stepSpecs DOCUMENTATION:
+ 'x': horizontal start position, 'z': vertical start position,
+ 'w': step area width, 'h': step area height,
+ 'v': riser height, 't': tread width, 'd': block depth (step size; offset from wall)
+"""
+stepLeft = 0
+shelfBack = 0
+stepOnly = 0
+stepBack = 0
+
+
+# switchable prints
+def debug_prints(func="", text="Message", var=None):
+ global DEBUG
+ if DEBUG:
+ print("\n[{}]\nmessage: {}".format(func, text))
+ if var:
+ print("Error: ", var)
+
+
+# pass variables just like for the regular prints
+def debug_print_vars(*args, **kwargs):
+ global DEBUG
+ if DEBUG:
+ print(*args, **kwargs)
# easier way to get to the random function
@@ -126,6 +189,7 @@ def test(TestN=13):
't': float(t), 'tl': float(tl)}]
return dims, openingSpecs
+
# dims, openingSpecs = test(15)
@@ -290,7 +354,8 @@ def MakeABlock(bounds, segsize, vll=0, Offsets=None, FaceExclude=[],
def MakeAKeystone(xpos, width, zpos, ztop, zbtm, thick, bevel, vll=0, FaceExclude=[], xBevScl=1):
__doc__ = """\
- MakeAKeystone returns lists of points and faces to be made into a square cornered keystone, with optional bevels.
+ MakeAKeystone returns lists of points and faces to be made into a
+ square cornered keystone, with optional bevels.
xpos: x position of the centerline
width: x width of the keystone at the widest point (discounting bevels)
zpos: z position of the widest point
@@ -299,7 +364,8 @@ def MakeAKeystone(xpos, width, zpos, ztop, zbtm, thick, bevel, vll=0, FaceExclud
thick: thickness
bevel: the amount to raise the back vertex to account for arch beveling
vll: the number of vertexes already in the mesh. len(mesh.verts) should give this number
- faceExclude: list of faces to exclude from the faces list. 0:left, 1:right, 2:bottom, 3:top, 4:back, 5:front
+ faceExclude: list of faces to exclude from the faces list.
+ 0:left, 1:right, 2:bottom, 3:top, 4:back, 5:front
xBevScl: how much to divide the end (+- x axis) bevel dimensions.
Set to current average radius to compensate for angular distortion on curved blocks
"""
@@ -427,6 +493,7 @@ class opening:
# ht is the z position; s is the side: 1 for right, -1 for left
# if the height passed is above or below the opening, return None
def edgeS(self, ht, s):
+
# set the row radius: 1 for standard wall (flat)
if radialized:
if slope:
@@ -496,6 +563,7 @@ class opening:
# get the top or bottom of the opening
# ht is the x position; s is the side: 1 for top, -1 for bottom
def edgeV(self, ht, s):
+
dist = abs(self.x - ht)
def radialAdjust(dist, sideVal):
@@ -556,9 +624,11 @@ class opening:
else:
return self.z - self.h / 2 - self.vl + self.rl - circVal
- # and this never happens - but, leave it as failsafe :)
- print("got all the way out of the edgeV! Not good!")
- print("opening x = ", self.x, ", opening z = ", self.z)
+ # and this never happens - but, leave it as failsafe :)
+ debug_prints(func="opening.EdgeV",
+ text="Got all the way out of the edgeV! Not good!")
+ debug_print_vars("opening x = ", self.x, ", opening z = ", self.z)
+
return 0.0
def edgeBev(self, ht):
@@ -618,11 +688,9 @@ class opening:
# class for the whole wall boundaries; a sub-class of "opening"
-
-class OpeningInv(opening):
+class openingInvert(opening):
# this is supposed to switch the sides of the opening
# so the wall will properly enclose the whole wall.
- # We'll see if it works.
def edgeS(self, ht, s):
return opening.edgeS(self, ht, -s)
@@ -776,8 +844,10 @@ def arch(ra, rt, x, z, archStart, archEnd, bevel, bevAngle, vll):
else:
ThisOffset = offsets
- geom = MakeABlock([divs[i] + grt, divs[i + 1] - grt, ArchInner, ArchOuter, DepthBack, DepthFront],
- subdivision, len(avlist) + vll, ThisOffset, [], None, ra)
+ geom = MakeABlock(
+ [divs[i] + grt, divs[i + 1] - grt, ArchInner, ArchOuter, DepthBack, DepthFront],
+ subdivision, len(avlist) + vll, ThisOffset, [], None, ra
+ )
avlist += geom[0]
aflist += geom[1]
@@ -929,6 +999,7 @@ def rowProcessing(row, Thesketch, WallBoundaries):
# initially just the left and right edge of the wall
edgetop = [[dims['s'] + row.EdgeOffset / r1 + edgrt, WallBoundaries],
[dims['e'] + row.EdgeOffset / r1 - edgrt, WallBoundaries]]
+
# Same as edgetop, but for the bottms of the rows
edgebtm = [[dims['s'] + row.EdgeOffset / r1 + edgrt, WallBoundaries],
[dims['e'] + row.EdgeOffset / r1 - edgrt, WallBoundaries]]
@@ -959,9 +1030,17 @@ def rowProcessing(row, Thesketch, WallBoundaries):
# We want to make the walls in order, so sort the intersects.
# This is where you would want to remove edge points that are out of order
- # so that you don't get the "oddity where overlapping openings create blocks inversely" problem
- edgetop.sort()
- edgebtm.sort()
+ # so that you don't get the "oddity where overlapping openings
+ # create blocks inversely" problem
+
+ # Note: sort ended up comparing function pointers
+ # if both Openings and Slots were enabled with Repeats in one of them
+ try:
+ edgetop.sort(key=lambda x: x[0])
+ edgebtm.sort(key=lambda x: x[0])
+ except Exception as ex:
+ debug_prints(func="rowProcessing",
+ text="Sorting has failed", var=ex)
# these two loops trim the edges to the limits of the wall.
# This way openings extending outside the wall don't enlarge the wall.
@@ -1232,7 +1311,7 @@ def plan(Thesketch, oldrows=0):
z = (dims['t'] + dims['b']) / 2
w = (dims['e'] - dims['s'])
h = (dims['t'] - dims['b'])
- WallBoundaries = OpeningInv(x, z, w, h)
+ WallBoundaries = openingInvert(x, z, w, h)
# Go over each row in the list, set up edge blocks and block sections
for rownum in range(len(rows)):
@@ -1348,7 +1427,8 @@ def archGeneration(hole, vlist, flist, sideSign):
flist += aflist
# remove "debug note" once bevel is finalized.
else:
- print("keystone was too narrow - " + str(Wdth))
+ debug_prints(func="archGeneration",
+ text="Keystone was too narrow - " + str(Wdth))
else: # only one arc - curve not peak.
# bottom (sideSign -1) arch has poorly sized blocks...
@@ -1409,8 +1489,11 @@ def archGeneration(hole, vlist, flist, sideSign):
# Do some stuff to incorporate bev here
bevelBlockOffsets(offsets, bev, -1)
- avlist, aflist = MakeABlock([x - xstart - width, x - xstart - woffset, btmSide, topSide,
- - depth / 2, depth / 2], subdivision, len(vlist), Offsets=offsets, xBevScl=1)
+ avlist, aflist = MakeABlock(
+ [x - xstart - width, x - xstart - woffset, btmSide, topSide,
+ -depth / 2, depth / 2], subdivision, len(vlist),
+ Offsets=offsets, xBevScl=1
+ )
# top didn't use radialized in prev version;
# just noting for clarity - may need to revise for "sideSign == 1"
@@ -1439,8 +1522,11 @@ def archGeneration(hole, vlist, flist, sideSign):
# Do some stuff to incorporate bev here
bevelBlockOffsets(offsets, bev, 1)
- avlist, aflist = MakeABlock([x + xstart + woffset, x + xstart + width, btmSide, topSide,
- -depth / 2, depth / 2], subdivision, len(vlist), Offsets=offsets, xBevScl=1)
+ avlist, aflist = MakeABlock(
+ [x + xstart + woffset, x + xstart + width, btmSide, topSide,
+ -depth / 2, depth / 2], subdivision, len(vlist),
+ Offsets=offsets, xBevScl=1
+ )
# top didn't use radialized in prev version;
# just noting for clarity - may need to revise for "sideSign == 1"
@@ -1544,11 +1630,19 @@ def build(Aplan):
# - this way no gaps between platform and wall face due to wall block depth.
wallDepth = settings['d'] / 2 # offset by wall depth so step depth matches UI setting :)
if shelfBack: # place blocks on backside of wall
- ShelfOffsets = [[0, ShelfThk / 2, 0], [0, wallDepth, 0], [0, ShelfThk / 2, 0], [0, wallDepth, 0],
- [0, ShelfThk / 2, 0], [0, wallDepth, 0], [0, ShelfThk / 2, 0], [0, wallDepth, 0]]
+ ShelfOffsets = [
+ [0, ShelfThk / 2, 0], [0, wallDepth, 0],
+ [0, ShelfThk / 2, 0], [0, wallDepth, 0],
+ [0, ShelfThk / 2, 0], [0, wallDepth, 0],
+ [0, ShelfThk / 2, 0], [0, wallDepth, 0]
+ ]
else:
- ShelfOffsets = [[0, -wallDepth, 0], [0, -ShelfThk / 2, 0], [0, -wallDepth, 0], [0, -ShelfThk / 2, 0],
- [0, -wallDepth, 0], [0, -ShelfThk / 2, 0], [0, -wallDepth, 0], [0, -ShelfThk / 2, 0]]
+ ShelfOffsets = [
+ [0, -wallDepth, 0], [0, -ShelfThk / 2, 0],
+ [0, -wallDepth, 0], [0, -ShelfThk / 2, 0],
+ [0, -wallDepth, 0], [0, -ShelfThk / 2, 0],
+ [0, -wallDepth, 0], [0, -ShelfThk / 2, 0]
+ ]
# Add blocks for each "shelf row" in area
while ShelfBtm < ShelfTop:
@@ -1591,11 +1685,19 @@ def build(Aplan):
# Also, will work fine as stand-alone if not used with wall (try block depth 0 and see what happens).
wallDepth = settings['d'] / 2
if stepBack: # place blocks on backside of wall
- StepOffsets = [[0, StepThk / 2, 0], [0, wallDepth, 0], [0, StepThk / 2, 0], [0, wallDepth, 0],
- [0, StepThk / 2, 0], [0, wallDepth, 0], [0, StepThk / 2, 0], [0, wallDepth, 0]]
+ StepOffsets = [
+ [0, StepThk / 2, 0], [0, wallDepth, 0],
+ [0, StepThk / 2, 0], [0, wallDepth, 0],
+ [0, StepThk / 2, 0], [0, wallDepth, 0],
+ [0, StepThk / 2, 0], [0, wallDepth, 0]
+ ]
else:
- StepOffsets = [[0, -wallDepth, 0], [0, -StepThk / 2, 0], [0, -wallDepth, 0], [0, -StepThk / 2, 0],
- [0, -wallDepth, 0], [0, -StepThk / 2, 0], [0, -wallDepth, 0], [0, -StepThk / 2, 0]]
+ StepOffsets = [
+ [0, -wallDepth, 0], [0, -StepThk / 2, 0],
+ [0, -wallDepth, 0], [0, -StepThk / 2, 0],
+ [0, -wallDepth, 0], [0, -StepThk / 2, 0],
+ [0, -wallDepth, 0], [0, -StepThk / 2, 0]
+ ]
# Add steps for each "step row" in area (neg width is interesting but prevented)
while StepBtm < StepTop and StepWide > 0:
@@ -1645,7 +1747,8 @@ def build(Aplan):
else:
r1 = 1
- geom = MakeABlock([x - w / 2, x + w / 2, z - h / 2, z + h / 2, -d / 2, d / 2], settings['sdv'], len(vlist),
+ geom = MakeABlock([x - w / 2, x + w / 2, z - h / 2, z + h / 2, -d / 2, d / 2],
+ settings['sdv'], len(vlist),
corners, None, settings['b'] + rndd() * settings['bv'], r1)
vlist += geom[0]
flist += geom[1]
diff --git a/add_mesh_extra_objects/Wallfactory.py b/add_mesh_extra_objects/Wallfactory.py
index a58b9f5a..41957b22 100644
--- a/add_mesh_extra_objects/Wallfactory.py
+++ b/add_mesh_extra_objects/Wallfactory.py
@@ -1,4 +1,4 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
+# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you may redistribute it, and/or
# modify it, under the terms of the GNU General Public License
@@ -19,22 +19,43 @@
#
# or go online at: http://www.gnu.org/licenses/ to view license options.
#
-# ***** END GPL LICENCE BLOCK *****
+# ##### END GPL LICENCE BLOCK #####
-# This module contains the UI definition, display, and processing (create mesh)
-# functions.
-# The routines to generate the vertices for the wall are found in the "Blocks" module.
+# authors: dudecon, jambay
+
+# This module contains the UI definition, display,
+# and processing (create mesh) functions.
+# The routines to generate the vertices for the wall
+# are found in the "Blocks" module.
import bpy
+from bpy.types import Operator
from bpy.props import (
BoolProperty,
FloatProperty,
)
-from add_mesh_extra_objects.Blocks import *
+from .Blocks import (
+ NOTZERO, PI,
+ dims,
+ settings,
+ shelfSpecs,
+ stepSpecs,
+ createWall,
+ radialized,
+ slope,
+ openingSpecs,
+ bigBlock,
+ shelfExt,
+ stepMod,
+ stepLeft,
+ shelfBack,
+ stepOnly,
+ stepBack,
+ )
-class add_mesh_wallb(bpy.types.Operator):
+class add_mesh_wallb(Operator):
bl_idname = "mesh.wall_add"
bl_label = "Add a Masonry Wall"
bl_description = "Create a block (masonry) wall mesh"
@@ -46,402 +67,407 @@ class add_mesh_wallb(bpy.types.Operator):
# only create object when True
# False allows modifying several parameters without creating object
ConstructTog = BoolProperty(
- name="Construct",
- description="Generate the object",
- default=True
- )
- # need to modify so radial makes a tower (normal); want "flat" setting to make disk (alternate)
+ name="Construct",
+ description="Generate the object",
+ default=True
+ )
+ # need to modify so radial makes a tower (normal);
+ # want "flat" setting to make disk (alternate)
# make the wall circular - if not sloped it's a flat disc
RadialTog = BoolProperty(
- name="Radial",
- description="Make masonry radial",
- default=False
- )
+ name="Radial",
+ description="Make masonry radial",
+ default=False
+ )
# curve the wall - if radial creates dome.
SlopeTog = BoolProperty(
- name="Curved",
- description="Make masonry sloped, or curved",
- default=False
- )
+ name="Curved",
+ description="Make masonry sloped, or curved",
+ default=False
+ )
# need to review defaults and limits for all of these UI objects
# wall area/size
WallStart = FloatProperty(
- name="Start",
- description="Left side, or start angle",
- default=-10.0,
- min=-100, max=100.0
- )
+ name="Start",
+ description="Left side, or start angle",
+ default=-10.0,
+ min=-100, max=100.0
+ )
WallEnd = FloatProperty(
- name="End",
- description="Right side, or end angle",
- default=10.0,
- min=0.0, max=100.0
- )
+ name="End",
+ description="Right side, or end angle",
+ default=10.0,
+ min=0.0, max=100.0
+ )
WallBottom = FloatProperty(
- name="Bottom",
- description="Lower height or radius",
- default=0.0,
- min=-100, max=100
- )
+ name="Bottom",
+ description="Lower height or radius",
+ default=0.0,
+ min=-100, max=100
+ )
WallTop = FloatProperty(
- name="Top",
- description="Upper height or radius",
- default=15.0,
- min=0.0, max=100.0
- )
+ name="Top",
+ description="Upper height or radius",
+ default=15.0,
+ min=0.0, max=100.0
+ )
EdgeOffset = FloatProperty(
- name="Edging",
- description="Block staggering on wall sides",
- default=0.6, min=0.0, max=100.0
- )
+ name="Edging",
+ description="Block staggering on wall sides",
+ default=0.6, min=0.0, max=100.0
+ )
# block sizing
Width = FloatProperty(
- name="Width",
- description="Average width of each block",
- default=1.5,
- min=0.01, max=100.0
- )
+ name="Width",
+ description="Average width of each block",
+ default=1.5,
+ min=0.01, max=100.0
+ )
WidthVariance = FloatProperty(
- name="Variance",
- description="Random variance of block width",
- default=0.5,
- min=0.0, max=100.0
- )
+ name="Variance",
+ description="Random variance of block width",
+ default=0.5,
+ min=0.0, max=100.0
+ )
WidthMinimum = FloatProperty(
- name="Minimum",
- description="Absolute minimum block width",
- default=0.5,
- min=0.01, max=100.0
- )
+ name="Minimum",
+ description="Absolute minimum block width",
+ default=0.5,
+ min=0.01, max=100.0
+ )
Height = FloatProperty(
- name="Height",
- description="Average Height of each block",
- default=0.7,
- min=0.01, max=100.0
- )
+ name="Height",
+ description="Average Height of each block",
+ default=0.7,
+ min=0.01, max=100.0
+ )
HeightVariance = FloatProperty(
- name="Variance",
- description="Random variance of block Height",
- default=0.3,
- min=0.0, max=100.0
- )
+ name="Variance",
+ description="Random variance of block Height",
+ default=0.3,
+ min=0.0, max=100.0
+ )
HeightMinimum = FloatProperty(
- name="Minimum",
- description="Absolute minimum block Height",
- default=0.25,
- min=0.01, max=100.0
- )
+ name="Minimum",
+ description="Absolute minimum block Height",
+ default=0.25,
+ min=0.01, max=100.0
+ )
Depth = FloatProperty(
- name="Depth",
- description="Average Depth of each block",
- default=2.0,
- min=0.01, max=100.0
- )
+ name="Depth",
+ description="Average Depth of each block",
+ default=2.0,
+ min=0.01, max=100.0
+ )
DepthVariance = FloatProperty(
- name="Variance",
- description="Random variance of block Depth",
- default=0.1,
- min=0.0, max=100.0
- )
+ name="Variance",
+ description="Random variance of block Depth",
+ default=0.1,
+ min=0.0, max=100.0
+ )
DepthMinimum = FloatProperty(
- name="Minimum",
- description="Absolute minimum block Depth",
- default=1.0,
- min=0.01, max=100.0
- )
+ name="Minimum",
+ description="Absolute minimum block Depth",
+ default=1.0,
+ min=0.01, max=100.0
+ )
MergeBlock = BoolProperty(
- name="Merge Blocks",
- description="Make big blocks (merge closely adjoining blocks)",
- default=False
- )
+ name="Merge Blocks",
+ description="Make big blocks (merge closely adjoining blocks)",
+ default=False
+ )
# edging for blocks
Grout = FloatProperty(
- name="Thickness",
- description="Distance between blocks",
- default=0.1,
- min=-10.0, max=10.0
- )
+ name="Thickness",
+ description="Distance between blocks",
+ default=0.1,
+ min=-10.0, max=10.0
+ )
GroutVariance = FloatProperty(
- name="Variance",
- description="Random variance of block Grout",
- default=0.03,
- min=0.0, max=100.0)
+ name="Variance",
+ description="Random variance of block Grout",
+ default=0.03,
+ min=0.0, max=100.0
+ )
GroutDepth = FloatProperty(
- name="Depth",
- description="Grout Depth from the face of the blocks",
- default=0.1,
- min=0.0001, max=10.0
- )
+ name="Depth",
+ description="Grout Depth from the face of the blocks",
+ default=0.1,
+ min=0.0001, max=10.0
+ )
GroutDepthVariance = FloatProperty(
- name="Variance",
- description="Random variance of block Grout Depth",
- default=0.03,
- min=0.0, max=100.0
- )
+ name="Variance",
+ description="Random variance of block Grout Depth",
+ default=0.03,
+ min=0.0, max=100.0
+ )
GroutEdge = BoolProperty(
- name="Edging",
- description="Grout perimiter",
- default=False
- )
+ name="Edging",
+ description="Grout perimiter",
+ default=False
+ )
# properties for openings
Opening1Tog = BoolProperty(
- name="Opening(s)",
- description="Make windows or doors",
- default=True
- )
+ name="Opening(s)",
+ description="Make windows or doors",
+ default=True
+ )
Opening1Width = FloatProperty(
- name="Width",
- description="The Width of opening 1",
- default=2.5,
- min=0.01, max=100.0
- )
+ name="Width",
+ description="The Width of the first opening",
+ default=2.5,
+ min=0.01, max=100.0
+ )
Opening1Height = FloatProperty(
- name="Height",
- description="The Height of opening 1",
- default=3.5,
- min=0.01, max=100.0
- )
+ name="Height",
+ description="The Height of the first opening",
+ default=3.5,
+ min=0.01, max=100.0
+ )
Opening1X = FloatProperty(
- name="Indent",
- description="The x position or spacing of opening 1",
- default=5.0,
- min=-100, max=100.0
- )
+ name="Indent",
+ description="The x position or spacing of the first opening",
+ default=5.0,
+ min=-100, max=100.0
+ )
Opening1Z = FloatProperty(
- name="Bottom",
- description="The z position of opening 1",
- default=5.0,
- min=-100, max=100.0
- )
+ name="Bottom",
+ description="The z position of the First opening",
+ default=5.0,
+ min=-100, max=100.0
+ )
Opening1Repeat = BoolProperty(
- name="Repeat",
- description="make multiple openings, with spacing X1",
- default=False
- )
+ name="Repeat",
+ description="make multiple openings, with spacing X1",
+ default=False
+ )
Opening1TopArchTog = BoolProperty(
- name="Top Arch",
- description="Add an arch to the top of opening 1",
- default=True
- )
+ name="Top Arch",
+ description="Add an arch to the top of the first opening",
+ default=True
+ )
Opening1TopArch = FloatProperty(
- name="Curve",
- description="Height of the arch on the top of the opening",
- default=2.5,
- min=0.001, max=100.0
- )
+ name="Curve",
+ description="Height of the arch on the top of the opening",
+ default=2.5,
+ min=0.001, max=100.0
+ )
Opening1TopArchThickness = FloatProperty(
- name="Thickness",
- description="Thickness of the arch on the top of the opening",
- default=0.75,
- min=0.001, max=100.0
- )
+ name="Thickness",
+ description="Thickness of the arch on the top of the opening",
+ default=0.75,
+ min=0.001, max=100.0
+ )
Opening1BtmArchTog = BoolProperty(
- name="Bottom Arch",
- description="Add an arch to the bottom of opening 1",
- default=False
- )
+ name="Bottom Arch",
+ description="Add an arch to the bottom of opening 1",
+ default=False
+ )
Opening1BtmArch = FloatProperty(
- name="Curve",
- description="Height of the arch on the bottom of the opening",
- default=1.0,
- min=0.01, max=100.0
- )
+ name="Curve",
+ description="Height of the arch on the bottom of the opening",
+ default=1.0,
+ min=0.01, max=100.0
+ )
Opening1BtmArchThickness = FloatProperty(
- name="Thickness",
- description="Thickness of the arch on the bottom of the opening",
- default=0.5,
- min=0.01, max=100.0
- )
+ name="Thickness",
+ description="Thickness of the arch on the bottom of the opening",
+ default=0.5,
+ min=0.01, max=100.0
+ )
Opening1Bevel = FloatProperty(
- name="Bevel",
- description="Angle block face",
- default=0.25,
- min=-10.0, max=10.0
- )
+ name="Bevel",
+ description="Angle block face",
+ default=0.25,
+ min=-10.0, max=10.0
+ )
# openings on top of wall
CrenelTog = BoolProperty(
- name="Crenels",
- description="Make openings along top of wall",
- default=False
- )
+ name="Crenels",
+ description="Make openings along top of wall",
+ default=False
+ )
CrenelXP = FloatProperty(
- name="Width %",
- description="Gap width in wall based % of wall width",
- default=0.25,
- min=0.10, max=1.0
- )
+ name="Width",
+ description="Gap width in wall based the percentage of wall width",
+ default=0.25,
+ min=0.10, max=1.0,
+ subtype="PERCENTAGE"
+ )
CrenelZP = FloatProperty(
- name="Height %",
- description="Crenel Height as % of wall height",
- default=0.10,
- min=0.10, max=1.0
- )
+ name="Height",
+ description="Crenel Height as the percentage of wall height",
+ default=0.10,
+ min=0.10, max=1.0,
+ subtype="PERCENTAGE"
+ )
# narrow openings in wall.
# need to prevent overlap with arch openings - though inversion is an interesting effect.
SlotTog = BoolProperty(
- name="Slots",
- description="Make narrow openings in wall",
- default=False
- )
- SlotRpt = BoolProperty(name="Repeat",
- description="Repeat slots along wall",
- default=False
- )
+ name="Slots",
+ description="Make narrow openings in wall",
+ default=False
+ )
+ SlotRpt = BoolProperty(
+ name="Repeat",
+ description="Repeat slots along wall",
+ default=False
+ )
SlotWdg = BoolProperty(
- name="Wedged (n/a)",
- description="Bevel edges of slots",
- default=False
- )
+ name="Wedged (n/a)",
+ description="Bevel edges of slots",
+ default=False
+ )
SlotX = FloatProperty(
- name="Indent",
- description="The x position or spacing of slots",
- default=0.0, min=-100, max=100.0
- )
+ name="Indent",
+ description="The x position or spacing of slots",
+ default=0.0, min=-100, max=100.0
+ )
SlotGap = FloatProperty(
- name="Opening",
- description="The opening size of slots",
- default=0.5, min=0.10, max=100.0
- )
+ name="Opening",
+ description="The opening size of slots",
+ default=0.5, min=0.10, max=100.0
+ )
SlotV = BoolProperty(
- name="Vertical",
- description="Vertical slots",
- default=True
- )
+ name="Vertical",
+ description="Vertical slots",
+ default=True
+ )
SlotVH = FloatProperty(
- name="Height",
- description="Height of vertical slot",
- default=3.5,
- min=0.10, max=100.0
- )
+ name="Height",
+ description="Height of vertical slot",
+ default=3.5,
+ min=0.10, max=100.0
+ )
SlotVBtm = FloatProperty(
- name="Bottom",
- description="Z position for slot",
- default=5.00,
- min=-100.0, max=100.0
- )
+ name="Bottom",
+ description="Z position for slot",
+ default=5.00,
+ min=-100.0, max=100.0
+ )
SlotH = BoolProperty(
- name="Horizontal",
- description="Horizontal slots",
- default=False
- )
+ name="Horizontal",
+ description="Horizontal slots",
+ default=False
+ )
SlotHW = FloatProperty(
- name="Width",
- description="Width of horizontal slot",
- default=2.5,
- min=0.10, max=100.0
- )
+ name="Width",
+ description="Width of horizontal slot",
+ default=2.5,
+ min=0.10, max=100.0
+ )
# this should offset from VBtm... maybe make a % like crenels?
SlotHBtm = FloatProperty(
- name="Bottom",
- description="Z position for horizontal slot",
- default=5.50,
- min=-100.0, max=100.0
- )
+ name="Bottom",
+ description="Z position for horizontal slot",
+ default=5.50,
+ min=-100.0, max=100.0
+ )
# properties for shelf (extend blocks in area)
ShelfTog = BoolProperty(
- name="Shelf",
- description="Add blocks in area by depth to make shelf/platform",
- default=False
- )
+ name="Shelf",
+ description="Add blocks in area by depth to make shelf/platform",
+ default=False
+ )
ShelfX = FloatProperty(
- name="Left",
- description="The x position of Shelf",
- default=-5.00,
- min=-100, max=100.0
- )
+ name="Left",
+ description="The x position of Shelf",
+ default=-5.00,
+ min=-100, max=100.0
+ )
ShelfZ = FloatProperty(
- name="Bottom",
- description="The z position of Shelf",
- default=10.0,
- min=-100, max=100.0
- )
+ name="Bottom",
+ description="The z position of Shelf",
+ default=10.0,
+ min=-100, max=100.0
+ )
ShelfH = FloatProperty(
- name="Height",
- description="The Height of Shelf area",
- default=1.0,
- min=0.01, max=100.0
- )
+ name="Height",
+ description="The Height of Shelf area",
+ default=1.0,
+ min=0.01, max=100.0
+ )
ShelfW = FloatProperty(
- name="Width",
- description="The Width of shelf area",
- default=5.0,
- min=0.01, max=100.0
- )
+ name="Width",
+ description="The Width of shelf area",
+ default=5.0,
+ min=0.01, max=100.0
+ )
ShelfD = FloatProperty(
- name="Depth",
- description="Depth of each block for shelf (from cursor + 1/2 wall depth)",
- default=2.0,
- min=0.01, max=100.0
- )
+ name="Depth",
+ description="Depth of each block for shelf (from cursor + 1/2 wall depth)",
+ default=2.0,
+ min=0.01, max=100.0
+ )
ShelfBack = BoolProperty(
- name="Backside",
- description="Shelf on backside of wall",
- default=False
- )
+ name="Backside",
+ description="Shelf on backside of wall",
+ default=False
+ )
# properties for steps (extend blocks in area, progressive width)
StepTog = BoolProperty(
- name="Steps",
- description="Add blocks in area by depth with progressive width to make steps",
- default=False
- )
+ name="Steps",
+ description="Add blocks in area by depth with progressive width to make steps",
+ default=False
+ )
StepX = FloatProperty(
- name="Left",
- description="The x position of steps",
- default=-9.00,
- min=-100, max=100.0
- )
+ name="Left",
+ description="The x position of steps",
+ default=-9.00,
+ min=-100, max=100.0
+ )
StepZ = FloatProperty(
- name="Bottom",
- description="The z position of steps",
- default=0.0,
- min=-100, max=100.0
- )
+ name="Bottom",
+ description="The z position of steps",
+ default=0.0,
+ min=-100, max=100.0
+ )
StepH = FloatProperty(
- name="Height",
- description="The Height of step area",
- default=10.0,
- min=0.01, max=100.0
- )
+ name="Height",
+ description="The Height of step area",
+ default=10.0,
+ min=0.01, max=100.0
+ )
StepW = FloatProperty(
- name="Width",
- description="The Width of step area",
- default=8.0,
- min=0.01, max=100.0
- )
+ name="Width",
+ description="The Width of step area",
+ default=8.0,
+ min=0.01, max=100.0
+ )
StepD = FloatProperty(
- name="Depth",
- description="Depth of each block for steps (from cursor + 1/2 wall depth)",
- default=1.0,
- min=0.01, max=100.0
- )
+ name="Depth",
+ description="Depth of each block for steps (from cursor + 1/2 wall depth)",
+ default=1.0,
+ min=0.01, max=100.0
+ )
StepV = FloatProperty(
- name="Riser",
- description="Height of each step",
- default=0.70,
- min=0.01, max=100.0
- )
+ name="Riser",
+ description="Height of each step",
+ default=0.70,
+ min=0.01, max=100.0
+ )
StepT = FloatProperty(
- name="Tread",
- description="Width of each step",
- default=1.0,
- min=0.01, max=100.0
- )
+ name="Tread",
+ description="Width of each step",
+ default=1.0,
+ min=0.01, max=100.0
+ )
StepLeft = BoolProperty(
- name="High Left",
- description="Height left; else Height right",
- default=False
- )
+ name="Direction",
+ description="If checked, flip steps direction towards the -X axis",
+ default=False
+ )
StepOnly = BoolProperty(
- name="No Blocks",
- description="Steps only, no supporting blocks",
- default=False
- )
+ name="Steps Only",
+ description="Steps only, no supporting blocks",
+ default=False
+ )
StepBack = BoolProperty(
- name="Backside",
- description="Steps on backside of wall",
- default=False
- )
+ name="Backside",
+ description="Steps on backside of wall",
+ default=False
+ )
# Display the toolbox options
def draw(self, context):
@@ -453,104 +479,152 @@ class add_mesh_wallb(bpy.types.Operator):
# Wall area (size/position)
box = layout.box()
box.label(text="Wall Size (area)")
- box.prop(self, "WallStart")
- box.prop(self, "WallEnd")
- box.prop(self, "WallBottom")
- box.prop(self, "WallTop")
+
+ col = box.column(align=True)
+ col.prop(self, "WallStart")
+ col.prop(self, "WallEnd")
+
+ col = box.column(align=True)
+ col.prop(self, "WallBottom")
+ col.prop(self, "WallTop")
box.prop(self, "EdgeOffset")
# Wall block sizing
box = layout.box()
- box.label(text='Block Sizing')
- box.prop(self, 'MergeBlock')
- # add checkbox for "fixed" sizing (ignore variance) a.k.a. bricks.
- box.prop(self, "Width")
- box.prop(self, "WidthVariance")
- box.prop(self, "WidthMinimum")
- box.prop(self, "Height")
- box.prop(self, "HeightVariance")
- box.prop(self, "HeightMinimum")
- box.prop(self, "Depth")
- box.prop(self, "DepthVariance")
- box.prop(self, "DepthMinimum")
+ box.label(text="Block Sizing")
+ box.prop(self, "MergeBlock")
+
+ # add checkbox for "fixed" sizing (ignore variance) a.k.a. bricks
+ col = box.column(align=True)
+ col.prop(self, "Width")
+ col.prop(self, "WidthVariance")
+ col.prop(self, "WidthMinimum")
+
+ col = box.column(align=True)
+ col.prop(self, "Height")
+ col.prop(self, "HeightVariance")
+ col.prop(self, "HeightMinimum")
+
+ col = box.column(align=True)
+ col.prop(self, "Depth")
+ col.prop(self, "DepthVariance")
+ col.prop(self, "DepthMinimum")
# grout settings
box = layout.box()
box.label(text="Grout")
- box.prop(self, "Grout")
- box.prop(self, "GroutVariance")
- box.prop(self, "GroutDepth")
- box.prop(self, "GroutDepthVariance")
+
+ col = box.column(align=True)
+ col.prop(self, "Grout")
+ col.prop(self, "GroutVariance")
+
+ col = box.column(align=True)
+ col.prop(self, "GroutDepth")
+ col.prop(self, "GroutDepthVariance")
# Wall shape modifiers
box = layout.box()
box.label(text="Wall Shape")
- box.prop(self, "RadialTog")
- box.prop(self, "SlopeTog")
+ row = box.row(align=True)
+ row.prop(self, "RadialTog", toggle=True)
+ row.prop(self, "SlopeTog", toggle=True)
# Openings (doors, windows; arched)
box = layout.box()
box.prop(self, 'Opening1Tog')
- if self.properties.Opening1Tog:
- box.prop(self, "Opening1Width")
- box.prop(self, "Opening1Height")
- box.prop(self, "Opening1X")
- box.prop(self, "Opening1Z")
- box.prop(self, "Opening1Bevel")
- box.prop(self, "Opening1Repeat")
- box.prop(self, "Opening1TopArchTog")
- box.prop(self, "Opening1TopArch")
- box.prop(self, "Opening1TopArchThickness")
- box.prop(self, "Opening1BtmArchTog")
- box.prop(self, "Opening1BtmArch")
- box.prop(self, "Opening1BtmArchThickness")
+ if self.Opening1Tog:
+ col = box.column(align=True)
+ col.prop(self, "Opening1Width")
+ col.prop(self, "Opening1Height")
+ col.prop(self, "Opening1X")
+ col.prop(self, "Opening1Z")
+ col.prop(self, "Opening1Bevel")
+
+ box.prop(self, "Opening1Repeat", toggle=True)
+
+ sub_box = box.box()
+ sub_box.prop(self, "Opening1TopArchTog")
+ if self.Opening1TopArchTog:
+ col = sub_box.column(align=True)
+ col.prop(self, "Opening1TopArch")
+ col.prop(self, "Opening1TopArchThickness")
+
+ sub_box = box.box()
+ sub_box.prop(self, "Opening1BtmArchTog")
+ if self.Opening1BtmArchTog:
+ col = sub_box.column(align=True)
+ col.prop(self, "Opening1BtmArch")
+ col.prop(self, "Opening1BtmArchThickness")
# Slots (narrow openings)
box = layout.box()
- box.prop(self, 'SlotTog')
- if self.properties.SlotTog:
- box.prop(self, "SlotX")
- box.prop(self, "SlotGap")
- box.prop(self, "SlotRpt")
- box.prop(self, "SlotV")
- box.prop(self, "SlotVH")
- box.prop(self, "SlotVBtm")
- box.prop(self, "SlotH")
- box.prop(self, "SlotHW")
- box.prop(self, "SlotHBtm")
+ box.prop(self, "SlotTog")
+ if self.SlotTog:
+ col = box.column(align=True)
+ col.prop(self, "SlotX")
+ col.prop(self, "SlotGap")
+
+ box.prop(self, "SlotRpt", toggle=True)
+
+ sub_box = box.box()
+ sub_box.prop(self, "SlotV")
+ if self.SlotV:
+ col = sub_box.column(align=True)
+ col.prop(self, "SlotVH")
+ col.prop(self, "SlotVBtm")
+
+ sub_box = box.box()
+ sub_box.prop(self, "SlotH")
+ if self.SlotH:
+ col = sub_box.column(align=True)
+ col.prop(self, "SlotHW")
+ col.prop(self, "SlotHBtm")
# Crenels, gaps in top of wall
box = layout.box()
box.prop(self, "CrenelTog")
- if self.properties.CrenelTog:
- box.prop(self, "CrenelXP")
- box.prop(self, "CrenelZP")
+ if self.CrenelTog:
+ col = box.column(align=True)
+ col.prop(self, "CrenelXP")
+ col.prop(self, "CrenelZP")
# Shelfing (protrusions)
box = layout.box()
box.prop(self, 'ShelfTog')
- if self.properties.ShelfTog:
- box.prop(self, "ShelfX")
- box.prop(self, "ShelfZ")
- box.prop(self, "ShelfH")
- box.prop(self, "ShelfW")
- box.prop(self, "ShelfD")
+ if self.ShelfTog:
+ col = box.column(align=True)
+ col.prop(self, "ShelfX")
+ col.prop(self, "ShelfZ")
+
+ col = box.column(align=True)
+ col.prop(self, "ShelfW")
+ col.prop(self, "ShelfH")
+ col.prop(self, "ShelfD")
+
box.prop(self, "ShelfBack")
# Steps
box = layout.box()
box.prop(self, 'StepTog')
- if self.properties.StepTog:
- box.prop(self, "StepX")
- box.prop(self, "StepZ")
- box.prop(self, "StepH")
- box.prop(self, "StepW")
- box.prop(self, "StepD")
- box.prop(self, "StepV")
- box.prop(self, "StepT")
- box.prop(self, "StepLeft")
- box.prop(self, "StepOnly")
- box.prop(self, "StepBack")
+ if self.StepTog:
+ col = box.column(align=True)
+ col.prop(self, "StepX")
+ col.prop(self, "StepZ")
+
+ col = box.column(align=True)
+ col.prop(self, "StepH")
+ col.prop(self, "StepW")
+ col.prop(self, "StepD")
+
+ col = box.column(align=True)
+ col.prop(self, "StepV")
+ col.prop(self, "StepT")
+
+ col = box.column(align=True)
+ row = col.row(align=True)
+ row.prop(self, "StepLeft", toggle=True)
+ row.prop(self, "StepOnly", toggle=True)
+ col.prop(self, "StepBack", toggle=True)
# Respond to UI - get the properties set by user.
# Check and process UI settings to generate masonry
@@ -568,56 +642,57 @@ class add_mesh_wallb(bpy.types.Operator):
global stepBack
# Create the wall when enabled (skip regen iterations when off)
- if not self.properties.ConstructTog:
+ if not self.ConstructTog:
return {'FINISHED'}
# enter the settings for the wall dimensions (area)
# start can't be zero - min/max don't matter [if max less than end] but zero don't workie.
# start can't exceed end.
- if not self.properties.WallStart or self.properties.WallStart >= self.properties.WallEnd:
- self.properties.WallStart = NOTZERO # Reset UI if input out of bounds...
+ if not self.WallStart or self.WallStart >= self.WallEnd:
+ self.WallStart = NOTZERO # Reset UI if input out of bounds...
- dims['s'] = self.properties.WallStart
- dims['e'] = self.properties.WallEnd
- dims['b'] = self.properties.WallBottom
- dims['t'] = self.properties.WallTop
+ dims['s'] = self.WallStart
+ dims['e'] = self.WallEnd
+ dims['b'] = self.WallBottom
+ dims['t'] = self.WallTop
- settings['eoff'] = self.properties.EdgeOffset
+ settings['eoff'] = self.EdgeOffset
# retrieve the settings for the wall block properties
- settings['w'] = self.properties.Width
- settings['wv'] = self.properties.WidthVariance
- settings['wm'] = self.properties.WidthMinimum
+ settings['w'] = self.Width
+ settings['wv'] = self.WidthVariance
+ settings['wm'] = self.WidthMinimum
+
if not radialized:
settings['sdv'] = settings['w']
else:
settings['sdv'] = 0.12
- settings['h'] = self.properties.Height
- settings['hv'] = self.properties.HeightVariance
- settings['hm'] = self.properties.HeightMinimum
+ settings['h'] = self.Height
+ settings['hv'] = self.HeightVariance
+ settings['hm'] = self.HeightMinimum
- settings['d'] = self.properties.Depth
- settings['dv'] = self.properties.DepthVariance
- settings['dm'] = self.properties.DepthMinimum
+ settings['d'] = self.Depth
+ settings['dv'] = self.DepthVariance
+ settings['dm'] = self.DepthMinimum
- if self.properties.MergeBlock:
+ if self.MergeBlock:
bigBlock = 1
else:
bigBlock = 0
- settings['g'] = self.properties.Grout
- settings['gv'] = self.properties.GroutVariance
- settings['gd'] = self.properties.GroutDepth
- settings['gdv'] = self.properties.GroutDepthVariance
+ settings['g'] = self.Grout
+ settings['gv'] = self.GroutVariance
+ settings['gd'] = self.GroutDepth
+ settings['gdv'] = self.GroutDepthVariance
- if self.properties.GroutEdge:
+ if self.GroutEdge:
settings['ge'] = 1
else:
settings['ge'] = 0
# set wall shape modifiers
- if self.properties.RadialTog:
+ if self.RadialTog:
radialized = 1
# eliminate to allow user control for start/completion?
dims['s'] = 0.0 # complete radial
@@ -628,7 +703,7 @@ class add_mesh_wallb(bpy.types.Operator):
else:
radialized = 0
- if self.properties.SlopeTog:
+ if self.SlopeTog:
slope = 1
else:
slope = 0
@@ -636,113 +711,113 @@ class add_mesh_wallb(bpy.types.Operator):
shelfExt = 0
shelfBack = 0
- # Add shelf if enabled
- if self.properties.ShelfTog:
+ # Add shelf if enabled
+ if self.ShelfTog:
shelfExt = 1
- shelfSpecs['h'] = self.properties.ShelfH
- shelfSpecs['w'] = self.properties.ShelfW
- shelfSpecs['d'] = self.properties.ShelfD
- shelfSpecs['x'] = self.properties.ShelfX
- shelfSpecs['z'] = self.properties.ShelfZ
+ shelfSpecs['h'] = self.ShelfH
+ shelfSpecs['w'] = self.ShelfW
+ shelfSpecs['d'] = self.ShelfD
+ shelfSpecs['x'] = self.ShelfX
+ shelfSpecs['z'] = self.ShelfZ
- if self.properties.ShelfBack:
+ if self.ShelfBack:
shelfBack = 1
stepMod = 0
stepLeft = 0
stepOnly = 0
stepBack = 0
- # Make steps if enabled
- if self.properties.StepTog:
+ # Make steps if enabled
+ if self.StepTog:
stepMod = 1
- stepSpecs['x'] = self.properties.StepX
- stepSpecs['z'] = self.properties.StepZ
- stepSpecs['h'] = self.properties.StepH
- stepSpecs['w'] = self.properties.StepW
- stepSpecs['d'] = self.properties.StepD
- stepSpecs['v'] = self.properties.StepV
- stepSpecs['t'] = self.properties.StepT
-
- if self.properties.StepLeft:
+ stepSpecs['x'] = self.StepX
+ stepSpecs['z'] = self.StepZ
+ stepSpecs['h'] = self.StepH
+ stepSpecs['w'] = self.StepW
+ stepSpecs['d'] = self.StepD
+ stepSpecs['v'] = self.StepV
+ stepSpecs['t'] = self.StepT
+
+ if self.StepLeft:
stepLeft = 1
- if self.properties.StepOnly:
+ if self.StepOnly:
stepOnly = 1
- if self.properties.StepBack:
+ if self.StepBack:
stepBack = 1
# enter the settings for the openings
# when openings overlap they create inverse stonework - interesting but not the desired effect :)
- # if opening width == indent*2 the edge blocks fail (row of blocks cross opening) - bug.
+ # if opening width == indent * 2 the edge blocks fail (row of blocks cross opening) - bug.
openingSpecs = []
openingIdx = 0 # track opening array references for multiple uses
# general openings with arch options - can be windows or doors.
- if self.properties.Opening1Tog:
+ if self.Opening1Tog:
# set defaults...
openingSpecs += [{'w': 0.5, 'h': 0.5, 'x': 0.8, 'z': 2.7, 'rp': 1,
'b': 0.0, 'v': 0, 'vl': 0, 't': 0, 'tl': 0}]
- openingSpecs[openingIdx]['w'] = self.properties.Opening1Width
- openingSpecs[openingIdx]['h'] = self.properties.Opening1Height
- openingSpecs[openingIdx]['x'] = self.properties.Opening1X
- openingSpecs[openingIdx]['z'] = self.properties.Opening1Z
- openingSpecs[openingIdx]['rp'] = self.properties.Opening1Repeat
+ openingSpecs[openingIdx]['w'] = self.Opening1Width
+ openingSpecs[openingIdx]['h'] = self.Opening1Height
+ openingSpecs[openingIdx]['x'] = self.Opening1X
+ openingSpecs[openingIdx]['z'] = self.Opening1Z
+ openingSpecs[openingIdx]['rp'] = self.Opening1Repeat
- if self.properties.Opening1TopArchTog:
- openingSpecs[openingIdx]['v'] = self.properties.Opening1TopArch
- openingSpecs[openingIdx]['t'] = self.properties.Opening1TopArchThickness
+ if self.Opening1TopArchTog:
+ openingSpecs[openingIdx]['v'] = self.Opening1TopArch
+ openingSpecs[openingIdx]['t'] = self.Opening1TopArchThickness
- if self.properties.Opening1BtmArchTog:
- openingSpecs[openingIdx]['vl'] = self.properties.Opening1BtmArch
- openingSpecs[openingIdx]['tl'] = self.properties.Opening1BtmArchThickness
+ if self.Opening1BtmArchTog:
+ openingSpecs[openingIdx]['vl'] = self.Opening1BtmArch
+ openingSpecs[openingIdx]['tl'] = self.Opening1BtmArchThickness
- openingSpecs[openingIdx]['b'] = self.properties.Opening1Bevel
+ openingSpecs[openingIdx]['b'] = self.Opening1Bevel
openingIdx += 1 # count window/door/arch openings
# Slots (narrow openings)
- if self.properties.SlotTog:
+ if self.SlotTog:
- if self.properties.SlotV: # vertical slots
+ if self.SlotV: # vertical slots
# set defaults...
openingSpecs += [{'w': 0.5, 'h': 0.5, 'x': 0.0, 'z': 2.7, 'rp': 0,
'b': 0.0, 'v': 0, 'vl': 0, 't': 0, 'tl': 0}]
- openingSpecs[openingIdx]['w'] = self.properties.SlotGap
- openingSpecs[openingIdx]['h'] = self.properties.SlotVH
- openingSpecs[openingIdx]['x'] = self.properties.SlotX
- openingSpecs[openingIdx]['z'] = self.properties.SlotVBtm
- openingSpecs[openingIdx]['rp'] = self.properties.SlotRpt
+ openingSpecs[openingIdx]['w'] = self.SlotGap
+ openingSpecs[openingIdx]['h'] = self.SlotVH
+ openingSpecs[openingIdx]['x'] = self.SlotX
+ openingSpecs[openingIdx]['z'] = self.SlotVBtm
+ openingSpecs[openingIdx]['rp'] = self.SlotRpt
# make them pointy...
- openingSpecs[openingIdx]['v'] = self.properties.SlotGap
- openingSpecs[openingIdx]['t'] = self.properties.SlotGap / 2
- openingSpecs[openingIdx]['vl'] = self.properties.SlotGap
- openingSpecs[openingIdx]['tl'] = self.properties.SlotGap / 2
+ openingSpecs[openingIdx]['v'] = self.SlotGap
+ openingSpecs[openingIdx]['t'] = self.SlotGap / 2
+ openingSpecs[openingIdx]['vl'] = self.SlotGap
+ openingSpecs[openingIdx]['tl'] = self.SlotGap / 2
openingIdx += 1 # count vertical slot openings
# need to handle overlap of H and V slots...
- if self.properties.SlotH: # Horizontal slots
+ if self.SlotH: # Horizontal slots
# set defaults...
openingSpecs += [{'w': 0.5, 'h': 0.5, 'x': 0.0, 'z': 2.7, 'rp': 0,
'b': 0.0, 'v': 0, 'vl': 0, 't': 0, 'tl': 0}]
- openingSpecs[openingIdx]['w'] = self.properties.SlotHW
- openingSpecs[openingIdx]['h'] = self.properties.SlotGap
- openingSpecs[openingIdx]['x'] = self.properties.SlotX
- openingSpecs[openingIdx]['z'] = self.properties.SlotHBtm
+ openingSpecs[openingIdx]['w'] = self.SlotHW
+ openingSpecs[openingIdx]['h'] = self.SlotGap
+ openingSpecs[openingIdx]['x'] = self.SlotX
+ openingSpecs[openingIdx]['z'] = self.SlotHBtm
# horizontal repeat isn't same spacing as vertical...
- openingSpecs[openingIdx]['rp'] = self.properties.SlotRpt
+ openingSpecs[openingIdx]['rp'] = self.SlotRpt
# make them pointy...
openingIdx += 1 # count horizontal slot openings
# Crenellations (top row openings)
- if self.properties.CrenelTog:
+ if self.CrenelTog:
# add bottom arch option?
# perhaps a repeat toggle...
@@ -752,11 +827,11 @@ class add_mesh_wallb(bpy.types.Operator):
openingSpecs += [{'w': 0.5, 'h': 0.5, 'x': 0.0, 'z': 2.7, 'rp': 1,
'b': 0.0, 'v': 0, 'vl': 0, 't': 0, 'tl': 0}]
- wallW = self.properties.WallEnd - self.properties.WallStart
- crenelW = wallW * self.properties.CrenelXP # Width % opening.
+ wallW = self.WallEnd - self.WallStart
+ crenelW = wallW * self.CrenelXP # Width % opening.
- wallH = self.properties.WallTop - self.properties.WallBottom
- crenelH = wallH * self.properties.CrenelZP # % proportional height.
+ wallH = self.WallTop - self.WallBottom
+ crenelH = wallH * self.CrenelZP # % proportional height.
openingSpecs[openingIdx]['w'] = crenelW
openingSpecs[openingIdx]['h'] = crenelH
@@ -772,14 +847,17 @@ class add_mesh_wallb(bpy.types.Operator):
openingSpecs[openingIdx]['x'] = 0
openingSpecs[openingIdx]['rp'] = 0
# set bottom of opening (center of hole)
- openingSpecs[openingIdx]['z'] = self.properties.WallTop - (crenelH / 2)
+ openingSpecs[openingIdx]['z'] = self.WallTop - (crenelH / 2)
openingIdx += 1 # count crenel openings
# Process the user settings to generate a wall
# generate the list of vertices for the wall...
- verts_array, faces_array = createWall(radialized, slope, openingSpecs, bigBlock,
- shelfExt, shelfBack, stepMod, stepLeft, stepOnly, stepBack)
+ verts_array, faces_array = createWall(
+ radialized, slope, openingSpecs, bigBlock,
+ shelfExt, shelfBack, stepMod, stepLeft, stepOnly,
+ stepBack
+ )
# Create new mesh
mesh = bpy.data.meshes.new("Wall")
diff --git a/add_mesh_extra_objects/__init__.py b/add_mesh_extra_objects/__init__.py
index a4290b35..ecc023df 100644
--- a/add_mesh_extra_objects/__init__.py
+++ b/add_mesh_extra_objects/__init__.py
@@ -16,23 +16,28 @@
#
# ##### END GPL LICENSE BLOCK #####
# Contributed to by:
-# Pontiac, Fourmadmen, varkenvarken, tuga3d, meta-androcto, metalliandy #
-# dreampainter, cotejrp1, liero, Kayo Phoenix, sugiany, dommetysk #
-# Phymec, Anthony D'Agostino, Pablo Vazquez, Richard Wilks, lijenstina #
-# xyz presets by elfnor
+# Pontiac, Fourmadmen, varkenvarken, tuga3d, meta-androcto, metalliandy #
+# dreampainter, cotejrp1, liero, Kayo Phoenix, sugiany, dommetysk, Jambay #
+# Phymec, Anthony D'Agostino, Pablo Vazquez, Richard Wilks, lijenstina, #
+# Sjaak-de-Draak, Phil Cote, cotejrp1, xyz presets by elfnor, revolt_randy, #
+
bl_info = {
"name": "Extra Objects",
"author": "Multiple Authors",
- "version": (0, 3, 1),
+ "version": (0, 3, 2),
"blender": (2, 74, 5),
"location": "View3D > Add > Mesh",
"description": "Add extra mesh object types",
"warning": "",
- "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Add_Mesh/Add_Extra",
+ "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/"
+ "Py/Scripts/Add_Mesh/Add_Extra",
"category": "Add Mesh",
}
+# Note: Blocks has to be loaded before the WallFactory or the script
+# will not work properly after (F8) reload
+
if "bpy" in locals():
import importlib
importlib.reload(add_mesh_star)
@@ -54,8 +59,8 @@ if "bpy" in locals():
importlib.reload(add_empty_as_parent)
importlib.reload(mesh_discombobulator)
importlib.reload(add_mesh_beam_builder)
- importlib.reload(Wallfactory)
importlib.reload(Blocks)
+ importlib.reload(Wallfactory)
importlib.reload(add_shape_geodesic)
importlib.reload(forms_271)
importlib.reload(geodesic_classes_271)
@@ -82,8 +87,8 @@ else:
from . import add_empty_as_parent
from . import mesh_discombobulator
from . import add_mesh_beam_builder
- from . import Wallfactory
from . import Blocks
+ from . import Wallfactory
from . import add_mesh_triangles
from .geodesic_domes import add_shape_geodesic
@@ -164,7 +169,8 @@ class INFO_MT_mesh_math_add(Menu):
layout.operator("mesh.primitive_xyz_function_surface",
text="XYZ Math Surface")
self.layout.operator("mesh.primitive_solid_add", text="Regular Solid")
- self.layout.operator("mesh.make_triangle", icon = "MESH_DATA")
+ self.layout.operator("mesh.make_triangle", icon="MESH_DATA")
+
class INFO_MT_mesh_mech(Menu):
# Define the "Math Function" menu
@@ -248,97 +254,97 @@ class discombobulator_scene_props(bpy.types.PropertyGroup):
DISC_doodads = []
# Protusions Buttons:
repeatprot = IntProperty(
- name="Repeat protusions",
- description=("Make several layers of protusion \n"
- "Use carefully, runs recursively the discombulator"),
- default=1, min=1, max=4 # set to 4 because it's 2**n reqursive
- )
+ name="Repeat protusions",
+ description=("Make several layers of protusion \n"
+ "Use carefully, runs recursively the discombulator"),
+ default=1, min=1, max=4 # set to 4 because it's 2**n reqursive
+ )
doprots = BoolProperty(
- name="Make protusions",
- description="Check if we want to add protusions to the mesh",
- default=True
- )
+ name="Make protusions",
+ description="Check if we want to add protusions to the mesh",
+ default=True
+ )
subpolygon1 = BoolProperty(
- name="1",
- default=True
- )
+ name="1",
+ default=True
+ )
subpolygon2 = BoolProperty(
- name="2",
- default=True
- )
+ name="2",
+ default=True
+ )
subpolygon3 = BoolProperty(
- name="3",
- default=True
- )
+ name="3",
+ default=True
+ )
subpolygon4 = BoolProperty(
- name="4",
- default=True
- )
+ name="4",
+ default=True
+ )
polygonschangedpercent = FloatProperty(
- name="Polygon %",
- description="Percentage of changed polygons",
- default=1.0
- )
+ name="Polygon %",
+ description="Percentage of changed polygons",
+ default=1.0
+ )
minHeight = FloatProperty(
- name="Min height",
- description="Minimal height of the protusions",
- default=0.2
- )
+ name="Min height",
+ description="Minimal height of the protusions",
+ default=0.2
+ )
maxHeight = FloatProperty(
- name="Max height",
- description="Maximal height of the protusions",
- default=0.4
- )
+ name="Max height",
+ description="Maximal height of the protusions",
+ default=0.4
+ )
minTaper = FloatProperty(
- name="Min taper",
- description="Minimal height of the protusions",
- default=0.15, min=0.0, max=1.0,
- subtype='PERCENTAGE'
- )
+ name="Min taper",
+ description="Minimal height of the protusions",
+ default=0.15, min=0.0, max=1.0,
+ subtype='PERCENTAGE'
+ )
maxTaper = FloatProperty(
- name="Max taper",
- description="Maximal height of the protusions",
- default=0.35, min=0.0, max=1.0,
- subtype='PERCENTAGE'
- )
+ name="Max taper",
+ description="Maximal height of the protusions",
+ default=0.35, min=0.0, max=1.0,
+ subtype='PERCENTAGE'
+ )
# Doodads buttons:
dodoodads = BoolProperty(
- name="Make doodads",
- description="Check if we want to generate doodads",
- default=False
- )
+ name="Make doodads",
+ description="Check if we want to generate doodads",
+ default=False
+ )
mindoodads = IntProperty(
- name="Minimum doodads number",
- description="Ask for the minimum number of doodads to generate per polygon",
- default=1, min=0, max=50
- )
+ name="Minimum doodads number",
+ description="Ask for the minimum number of doodads to generate per polygon",
+ default=1, min=0, max=50
+ )
maxdoodads = IntProperty(
- name="Maximum doodads number",
- description="Ask for the maximum number of doodads to generate per polygon",
- default=6, min=1, max=50
- )
+ name="Maximum doodads number",
+ description="Ask for the maximum number of doodads to generate per polygon",
+ default=6, min=1, max=50
+ )
doodMinScale = FloatProperty(
- name="Scale min", description="Minimum scaling of doodad",
- default=0.5, min=0.0, max=1.0,
- subtype='PERCENTAGE'
- )
+ name="Scale min", description="Minimum scaling of doodad",
+ default=0.5, min=0.0, max=1.0,
+ subtype='PERCENTAGE'
+ )
doodMaxScale = FloatProperty(
- name="Scale max",
- description="Maximum scaling of doodad",
- default=1.0, min=0.0, max=1.0,
- subtype='PERCENTAGE'
- )
+ name="Scale max",
+ description="Maximum scaling of doodad",
+ default=1.0, min=0.0, max=1.0,
+ subtype='PERCENTAGE'
+ )
# Materials buttons:
sideProtMat = IntProperty(
- name="Side's prot mat",
- description="Material of protusion's sides",
- default=0, min=0
- )
+ name="Side's prot mat",
+ description="Material of protusion's sides",
+ default=0, min=0
+ )
topProtMat = IntProperty(
- name="Prot's top mat",
- description="Material of protusion's top",
- default=0, min=0
- )
+ name="Prot's top mat",
+ description="Material of protusion's top",
+ default=0, min=0
+ )
# Register all operators and panels
diff --git a/add_mesh_extra_objects/add_mesh_beam_builder.py b/add_mesh_extra_objects/add_mesh_beam_builder.py
index 8297f9ae..cacde06a 100644
--- a/add_mesh_extra_objects/add_mesh_beam_builder.py
+++ b/add_mesh_extra_objects/add_mesh_beam_builder.py
@@ -1,16 +1,16 @@
# GPL # "author": revolt_randy, Jambay
-# Create "Beam" primitives. Based on original script by revolt_randy.
-# @todo: track 3D cursor for location.
+# Create "Beam" primitives. Based on original script by revolt_randy
import bpy
+from bpy.types import Operator
from bpy.props import (
+ BoolProperty,
EnumProperty,
FloatProperty,
IntProperty,
)
-from bpy_extras import object_utils
# #####################
@@ -310,12 +310,14 @@ def create_L_beam(sRef):
verts_back_temp = []
# Create front vertices by calculation
- verts_front_temp = [(-x_off, -y_off, z_off),
- (-(x_off - thick), -y_off, z_off),
- (-(x_off - thick), -y_off, -(z_off - thick)),
- (x_off, -y_off, -(z_off - thick)),
- (x_off, -y_off, -z_off),
- (-x_off, -y_off, -z_off)]
+ verts_front_temp = [
+ (-x_off, -y_off, z_off),
+ (-(x_off - thick), -y_off, z_off),
+ (-(x_off - thick), -y_off, -(z_off - thick)),
+ (x_off, -y_off, -(z_off - thick)),
+ (x_off, -y_off, -z_off),
+ (-x_off, -y_off, -z_off)
+ ]
# Adjust taper
vert_outside = verts_front_temp[0]
@@ -329,12 +331,14 @@ def create_L_beam(sRef):
verts_front_temp[3] = [vert_inside[0], vert_inside[1], vert_taper]
# Create back vertices by calculation
- verts_back_temp = [(-x_off, y_off, z_off),
- (-(x_off - thick), y_off, z_off),
- (-(x_off - thick), y_off, -(z_off - thick)),
- (x_off, y_off, -(z_off - thick)),
- (x_off, y_off, -z_off),
- (-x_off, y_off, -z_off)]
+ verts_back_temp = [
+ (-x_off, y_off, z_off),
+ (-(x_off - thick), y_off, z_off),
+ (-(x_off - thick), y_off, -(z_off - thick)),
+ (x_off, y_off, -(z_off - thick)),
+ (x_off, y_off, -z_off),
+ (-x_off, y_off, -z_off)
+ ]
# Adjust taper
vert_outside = verts_back_temp[0]
@@ -394,16 +398,18 @@ def create_T_beam(sRef):
verts_back_temp = []
# Create front vertices
- verts_front_temp = [(-x_off, -y_off, z_off),
- (-thick_off, -y_off, z_off),
- (thick_off, -y_off, z_off),
- (x_off, -y_off, z_off),
- (x_off, -y_off, z_off - thick),
- (thick_off, -y_off, z_off - thick),
- (thick_off, -y_off, -z_off),
- (-thick_off, -y_off, -z_off),
- (-thick_off, -y_off, z_off - thick),
- (-x_off, -y_off, z_off - thick)]
+ verts_front_temp = [
+ (-x_off, -y_off, z_off),
+ (-thick_off, -y_off, z_off),
+ (thick_off, -y_off, z_off),
+ (x_off, -y_off, z_off),
+ (x_off, -y_off, z_off - thick),
+ (thick_off, -y_off, z_off - thick),
+ (thick_off, -y_off, -z_off),
+ (-thick_off, -y_off, -z_off),
+ (-thick_off, -y_off, z_off - thick),
+ (-x_off, -y_off, z_off - thick)
+ ]
# Adjust taper
vert_outside = verts_front_temp[0]
@@ -429,16 +435,18 @@ def create_T_beam(sRef):
verts_front_temp[7] = [vert_taper, vert_inside[1], vert_inside[2]]
# Create fack vertices by calculation
- verts_back_temp = [(-x_off, y_off, z_off),
- (-thick_off, y_off, z_off),
- (thick_off, y_off, z_off),
- (x_off, y_off, z_off),
- (x_off, y_off, z_off - thick),
- (thick_off, y_off, z_off - thick),
- (thick_off, y_off, -z_off),
- (-thick_off, y_off, -z_off),
- (-thick_off, y_off, z_off - thick),
- (-x_off, y_off, z_off - thick)]
+ verts_back_temp = [
+ (-x_off, y_off, z_off),
+ (-thick_off, y_off, z_off),
+ (thick_off, y_off, z_off),
+ (x_off, y_off, z_off),
+ (x_off, y_off, z_off - thick),
+ (thick_off, y_off, z_off - thick),
+ (thick_off, y_off, -z_off),
+ (-thick_off, y_off, -z_off),
+ (-thick_off, y_off, z_off - thick),
+ (-x_off, y_off, z_off - thick)
+ ]
# Adjust taper
vert_outside = verts_back_temp[0]
@@ -514,22 +522,24 @@ def create_I_beam(sRef):
verts_back_temp = []
# Create front vertices by calculation
- verts_front_temp = [(-x_off, -y_off, z_off),
- (-thick_off, -y_off, z_off),
- (thick_off, -y_off, z_off),
- (x_off, -y_off, z_off),
- (x_off, -y_off, z_off - thick),
- (thick_off, -y_off, z_off - thick),
- (thick_off, -y_off, -z_off + thick),
- (x_off, -y_off, -z_off + thick),
- (x_off, -y_off, -z_off),
- (thick_off, -y_off, -z_off),
- (-thick_off, -y_off, -z_off),
- (-x_off, -y_off, -z_off),
- (-x_off, -y_off, -z_off + thick),
- (-thick_off, -y_off, -z_off + thick),
- (-thick_off, -y_off, z_off - thick),
- (-x_off, -y_off, z_off - thick)]
+ verts_front_temp = [
+ (-x_off, -y_off, z_off),
+ (-thick_off, -y_off, z_off),
+ (thick_off, -y_off, z_off),
+ (x_off, -y_off, z_off),
+ (x_off, -y_off, z_off - thick),
+ (thick_off, -y_off, z_off - thick),
+ (thick_off, -y_off, -z_off + thick),
+ (x_off, -y_off, -z_off + thick),
+ (x_off, -y_off, -z_off),
+ (thick_off, -y_off, -z_off),
+ (-thick_off, -y_off, -z_off),
+ (-x_off, -y_off, -z_off),
+ (-x_off, -y_off, -z_off + thick),
+ (-thick_off, -y_off, -z_off + thick),
+ (-thick_off, -y_off, z_off - thick),
+ (-x_off, -y_off, z_off - thick)
+ ]
# Adjust taper
vert_outside = verts_front_temp[0]
@@ -553,22 +563,24 @@ def create_I_beam(sRef):
verts_front_temp[12] = [vert_inside[0], vert_inside[1], vert_taper]
# Create back vertices by calculation
- verts_back_temp = [(-x_off, y_off, z_off),
- (-thick_off, y_off, z_off),
- (thick_off, y_off, z_off),
- (x_off, y_off, z_off),
- (x_off, y_off, z_off - thick),
- (thick_off, y_off, z_off - thick),
- (thick_off, y_off, -z_off + thick),
- (x_off, y_off, -z_off + thick),
- (x_off, y_off, -z_off),
- (thick_off, y_off, -z_off),
- (-thick_off, y_off, -z_off),
- (-x_off, y_off, -z_off),
- (-x_off, y_off, -z_off + thick),
- (-thick_off, y_off, -z_off + thick),
- (-thick_off, y_off, z_off - thick),
- (-x_off, y_off, z_off - thick)]
+ verts_back_temp = [
+ (-x_off, y_off, z_off),
+ (-thick_off, y_off, z_off),
+ (thick_off, y_off, z_off),
+ (x_off, y_off, z_off),
+ (x_off, y_off, z_off - thick),
+ (thick_off, y_off, z_off - thick),
+ (thick_off, y_off, -z_off + thick),
+ (x_off, y_off, -z_off + thick),
+ (x_off, y_off, -z_off),
+ (thick_off, y_off, -z_off),
+ (-thick_off, y_off, -z_off),
+ (-x_off, y_off, -z_off),
+ (-x_off, y_off, -z_off + thick),
+ (-thick_off, y_off, -z_off + thick),
+ (-thick_off, y_off, z_off - thick),
+ (-x_off, y_off, z_off - thick)
+ ]
# Adjust taper
vert_outside = verts_back_temp[0]
@@ -662,63 +674,77 @@ def addBeamObj(sRef, context):
bpy.ops.transform.rotate(value=1.570796, constraint_axis=[False, True, False])
bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
+ if sRef.Cursor:
+ if beamObj.select is True:
+ # we also have to check if we're considered to be in 3D View (view3d)
+ if bpy.ops.view3d.snap_selected_to_cursor.poll():
+ bpy.ops.view3d.snap_selected_to_cursor()
+ else:
+ sRef.Cursor = False
+
# ######################
# Create a beam primitive.
#
# UI functions and object creation.
-class addBeam(bpy.types.Operator):
+class addBeam(Operator):
bl_idname = "mesh.add_beam"
bl_label = "Beam Builder"
bl_description = "Create beam meshes of various profiles"
bl_options = {'REGISTER', 'UNDO'}
Type = EnumProperty(
- items=(
- ('0', "Box", "Square Beam"),
- ("1", "U", "U Beam"),
- ("2", "C", "C Beam"),
- ("3", "L", "L Beam"),
- ("4", "I", "T Beam"),
- ("5", "T", "I Beam")
- ),
- description="Beam form"
- )
+ items=(
+ ('0', "Box Profile", "Square Beam"),
+ ("1", "U Profile", "U Profile Beam"),
+ ("2", "C Profile", "C Profile Beam"),
+ ("3", "L Profile", "L Profile Beam"),
+ ("4", "I Profile", "I Profile Beam"),
+ ("5", "T Profile", "T Profile Beam")
+ ),
+ description="Beam form"
+ )
beamZ = FloatProperty(
- name="Height",
- min=0.01, max=100,
- default=1
- )
+ name="Height",
+ min=0.01, max=100,
+ default=1
+ )
beamX = FloatProperty(
- name="Width",
- min=0.01, max=100,
- default=.5
- )
+ name="Width",
+ min=0.01, max=100,
+ default=.5
+ )
beamY = FloatProperty(
- name="Depth",
- min=0.01,
- max=100,
- default=2
- )
+ name="Depth",
+ min=0.01,
+ max=100,
+ default=2
+ )
beamW = FloatProperty(
- name="Thickness",
- min=0.01, max=1,
- default=0.1
- )
+ name="Thickness",
+ min=0.01, max=1,
+ default=0.1
+ )
edgeA = IntProperty(
- name="Taper",
- min=0, max=100,
- default=0,
- description="Angle beam edges"
- )
+ name="Taper",
+ min=0, max=100,
+ default=0,
+ description="Angle beam edges"
+ )
+ Cursor = BoolProperty(
+ name="Use 3D Cursor",
+ default=False,
+ description="Draw the beam where the 3D Cursor is"
+ )
def draw(self, context):
layout = self.layout
box = layout.box()
- row = box.row()
- row.prop(self, "Type", text="")
+ split = box.split(percentage=0.85, align=True)
+ split.prop(self, "Type", text="")
+ split.prop(self, "Cursor", text="", icon="CURSOR")
box.prop(self, "beamZ")
box.prop(self, "beamX")
diff --git a/add_mesh_extra_objects/add_mesh_gears.py b/add_mesh_extra_objects/add_mesh_gears.py
index 7dc201d9..7eede285 100644
--- a/add_mesh_extra_objects/add_mesh_gears.py
+++ b/add_mesh_extra_objects/add_mesh_gears.py
@@ -2,7 +2,11 @@
import bpy
from bpy.types import Operator
-from math import atan, asin, cos, sin, tan, pi, radians
+from math import (
+ atan, asin, cos,
+ sin, tan, pi,
+ radians,
+ )
from bpy.props import (
FloatProperty,
IntProperty,
@@ -551,64 +555,74 @@ class AddGear(Operator):
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
number_of_teeth = IntProperty(name="Number of Teeth",
- description="Number of teeth on the gear",
- min=2,
- max=265,
- default=12)
+ description="Number of teeth on the gear",
+ min=2,
+ max=265,
+ default=12
+ )
radius = FloatProperty(name="Radius",
- description="Radius of the gear, negative for crown gear",
- min=-100.0,
- max=100.0,
- unit='LENGTH',
- default=1.0)
+ description="Radius of the gear, negative for crown gear",
+ min=-100.0,
+ max=100.0,
+ unit='LENGTH',
+ default=1.0
+ )
addendum = FloatProperty(name="Addendum",
- description="Addendum, extent of tooth above radius",
- min=0.01,
- max=100.0,
- unit='LENGTH',
- default=0.1)
+ description="Addendum, extent of tooth above radius",
+ min=0.01,
+ max=100.0,
+ unit='LENGTH',
+ default=0.1
+ )
dedendum = FloatProperty(name="Dedendum",
- description="Dedendum, extent of tooth below radius",
- min=0.0,
- max=100.0,
- unit='LENGTH',
- default=0.1)
+ description="Dedendum, extent of tooth below radius",
+ min=0.0,
+ max=100.0,
+ unit='LENGTH',
+ default=0.1
+ )
angle = FloatProperty(name="Pressure Angle",
- description="Pressure angle, skewness of tooth tip",
- min=0.0,
- max=radians(45.0),
- unit='ROTATION',
- default=radians(20.0))
+ description="Pressure angle, skewness of tooth tip",
+ min=0.0,
+ max=radians(45.0),
+ unit='ROTATION',
+ default=radians(20.0)
+ )
base = FloatProperty(name="Base",
- description="Base, extent of gear below radius",
- min=0.0,
- max=100.0,
- unit='LENGTH',
- default=0.2)
+ description="Base, extent of gear below radius",
+ min=0.0,
+ max=100.0,
+ unit='LENGTH',
+ default=0.2
+ )
width = FloatProperty(name="Width",
- description="Width, thickness of gear",
- min=0.05,
- max=100.0,
- unit='LENGTH',
- default=0.2)
+ description="Width, thickness of gear",
+ min=0.05,
+ max=100.0,
+ unit='LENGTH',
+ default=0.2
+ )
skew = FloatProperty(name="Skewness",
- description="Skew of teeth",
- min=radians(-90.0),
- max=radians(90.0),
- unit='ROTATION',
- default=radians(0.0))
+ description="Skew of teeth",
+ min=radians(-90.0),
+ max=radians(90.0),
+ unit='ROTATION',
+ default=radians(0.0)
+ )
conangle = FloatProperty(name="Conical angle",
- description="Conical angle of gear",
- min=0.0,
- max=radians(90.0),
- unit='ROTATION',
- default=radians(0.0))
+ description="Conical angle of gear",
+ min=0.0,
+ max=radians(90.0),
+ unit='ROTATION',
+ default=radians(0.0)
+ )
crown = FloatProperty(name="Crown",
- description="Inward pointing extend of crown teeth",
- min=0.0,
- max=100.0,
- unit='LENGTH',
- default=0.0)
+ description="Inward pointing extend of crown teeth",
+ min=0.0,
+ max=100.0,
+ unit='LENGTH',
+ default=0.0
+ )
def draw(self, context):
layout = self.layout
@@ -668,75 +682,75 @@ class AddWormGear(Operator):
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
number_of_teeth = IntProperty(
- name="Number of Teeth",
- description="Number of teeth on the gear",
- min=2,
- max=265,
- default=12
- )
+ name="Number of Teeth",
+ description="Number of teeth on the gear",
+ min=2,
+ max=265,
+ default=12
+ )
number_of_rows = IntProperty(
- name="Number of Rows",
- description="Number of rows on the worm gear",
- min=2,
- max=265,
- default=32
- )
+ name="Number of Rows",
+ description="Number of rows on the worm gear",
+ min=2,
+ max=265,
+ default=32
+ )
radius = FloatProperty(
- name="Radius",
- description="Radius of the gear, negative for crown gear",
- min=-100.0,
- max=100.0,
- unit='LENGTH',
- default=1.0
- )
+ name="Radius",
+ description="Radius of the gear, negative for crown gear",
+ min=-100.0,
+ max=100.0,
+ unit='LENGTH',
+ default=1.0
+ )
addendum = FloatProperty(
- name="Addendum",
- description="Addendum, extent of tooth above radius",
- min=0.01,
- max=100.0,
- unit='LENGTH',
- default=0.1
- )
+ name="Addendum",
+ description="Addendum, extent of tooth above radius",
+ min=0.01,
+ max=100.0,
+ unit='LENGTH',
+ default=0.1
+ )
dedendum = FloatProperty(
- name="Dedendum",
- description="Dedendum, extent of tooth below radius",
- min=0.0,
- max=100.0,
- unit='LENGTH',
- default=0.1
- )
+ name="Dedendum",
+ description="Dedendum, extent of tooth below radius",
+ min=0.0,
+ max=100.0,
+ unit='LENGTH',
+ default=0.1
+ )
angle = FloatProperty(
- name="Pressure Angle",
- description="Pressure angle, skewness of tooth tip",
- min=0.0,
- max=radians(45.0),
- default=radians(20.0),
- unit='ROTATION'
- )
+ name="Pressure Angle",
+ description="Pressure angle, skewness of tooth tip",
+ min=0.0,
+ max=radians(45.0),
+ default=radians(20.0),
+ unit='ROTATION'
+ )
row_height = FloatProperty(
- name="Row Height",
- description="Height of each Row",
- min=0.05,
- max=100.0,
- unit='LENGTH',
- default=0.2
- )
+ name="Row Height",
+ description="Height of each Row",
+ min=0.05,
+ max=100.0,
+ unit='LENGTH',
+ default=0.2
+ )
skew = FloatProperty(
- name="Skewness per Row",
- description="Skew of each row",
- min=radians(-90.0),
- max=radians(90.0),
- default=radians(11.25),
- unit='ROTATION'
- )
+ name="Skewness per Row",
+ description="Skew of each row",
+ min=radians(-90.0),
+ max=radians(90.0),
+ default=radians(11.25),
+ unit='ROTATION'
+ )
crown = FloatProperty(
- name="Crown",
- description="Inward pointing extend of crown teeth",
- min=0.0,
- max=100.0,
- unit='LENGTH',
- default=0.0
- )
+ name="Crown",
+ description="Inward pointing extend of crown teeth",
+ min=0.0,
+ max=100.0,
+ unit='LENGTH',
+ default=0.0
+ )
def draw(self, context):
layout = self.layout
@@ -745,9 +759,11 @@ class AddWormGear(Operator):
box.prop(self, "number_of_rows")
box.prop(self, "radius")
box.prop(self, "row_height")
+
box = layout.box()
box.prop(self, "addendum")
box.prop(self, "dedendum")
+
box = layout.box()
box.prop(self, "angle")
box.prop(self, "skew")
diff --git a/add_mesh_extra_objects/add_mesh_gemstones.py b/add_mesh_extra_objects/add_mesh_gemstones.py
index f99bcd43..0da6b488 100644
--- a/add_mesh_extra_objects/add_mesh_gemstones.py
+++ b/add_mesh_extra_objects/add_mesh_gemstones.py
@@ -2,7 +2,10 @@
import bpy
from bpy.types import Operator
-from mathutils import Vector, Quaternion
+from mathutils import (
+ Vector,
+ Quaternion,
+ )
from math import cos, sin, pi
from bpy.props import (
FloatProperty,
@@ -209,40 +212,40 @@ class AddDiamond(Operator):
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
segments = IntProperty(
- name="Segments",
- description="Number of segments for the diamond",
- min=3,
- max=256,
- default=32
- )
+ name="Segments",
+ description="Number of segments for the diamond",
+ min=3,
+ max=256,
+ default=32
+ )
girdle_radius = FloatProperty(
- name="Girdle Radius",
- description="Girdle radius of the diamond",
- min=0.01,
- max=9999.0,
- default=1.0
- )
+ name="Girdle Radius",
+ description="Girdle radius of the diamond",
+ min=0.01,
+ max=9999.0,
+ default=1.0
+ )
table_radius = FloatProperty(
- name="Table Radius",
- description="Girdle radius of the diamond",
- min=0.01,
- max=9999.0,
- default=0.6
- )
+ name="Table Radius",
+ description="Girdle radius of the diamond",
+ min=0.01,
+ max=9999.0,
+ default=0.6
+ )
crown_height = FloatProperty(
- name="Crown Height",
- description="Crown height of the diamond",
- min=0.01,
- max=9999.0,
- default=0.35
- )
+ name="Crown Height",
+ description="Crown height of the diamond",
+ min=0.01,
+ max=9999.0,
+ default=0.35
+ )
pavilion_height = FloatProperty(
- name="Pavilion Height",
- description="Pavilion height of the diamond",
- min=0.01,
- max=9999.0,
- default=0.8
- )
+ name="Pavilion Height",
+ description="Pavilion height of the diamond",
+ min=0.01,
+ max=9999.0,
+ default=0.8
+ )
def execute(self, context):
verts, faces = add_diamond(self.segments,
@@ -263,40 +266,40 @@ class AddGem(Operator):
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
segments = IntProperty(
- name="Segments",
- description="Longitudial segmentation",
- min=3,
- max=265,
- default=8
- )
+ name="Segments",
+ description="Longitudial segmentation",
+ min=3,
+ max=265,
+ default=8
+ )
pavilion_radius = FloatProperty(
- name="Radius",
- description="Radius of the gem",
- min=0.01,
- max=9999.0,
- default=1.0
- )
+ name="Radius",
+ description="Radius of the gem",
+ min=0.01,
+ max=9999.0,
+ default=1.0
+ )
crown_radius = FloatProperty(
- name="Table Radius",
- description="Radius of the table(top)",
- min=0.01,
- max=9999.0,
- default=0.6
- )
+ name="Table Radius",
+ description="Radius of the table(top)",
+ min=0.01,
+ max=9999.0,
+ default=0.6
+ )
crown_height = FloatProperty(
- name="Table height",
- description="Height of the top half",
- min=0.01,
- max=9999.0,
- default=0.35
- )
+ name="Table height",
+ description="Height of the top half",
+ min=0.01,
+ max=9999.0,
+ default=0.35
+ )
pavilion_height = FloatProperty(
- name="Pavilion height",
- description="Height of bottom half",
- min=0.01,
- max=9999.0,
- default=0.8
- )
+ name="Pavilion height",
+ description="Height of bottom half",
+ min=0.01,
+ max=9999.0,
+ default=0.8
+ )
def execute(self, context):
# create mesh
diff --git a/add_mesh_extra_objects/add_mesh_honeycomb.py b/add_mesh_extra_objects/add_mesh_honeycomb.py
index e93b3b86..357be4cb 100644
--- a/add_mesh_extra_objects/add_mesh_honeycomb.py
+++ b/add_mesh_extra_objects/add_mesh_honeycomb.py
@@ -2,7 +2,10 @@
import bpy
from bpy_extras import object_utils
-from math import pi, sin, cos
+from math import (
+ pi, sin,
+ cos,
+ )
from bpy.props import (
IntProperty,
BoolProperty,
@@ -216,49 +219,48 @@ class add_mesh_honeycomb(bpy.types.Operator):
self.edge = m
rows = IntProperty(
- name="Num of rows",
- default=2,
- min=1, max=100,
- description='Number of the rows'
- )
-
+ name="Num of rows",
+ default=2,
+ min=1, max=100,
+ description='Number of the rows'
+ )
cols = IntProperty(
- name='Num of cols',
- default=2,
- min=1, max=100,
- description='Number of the columns'
- )
+ name='Num of cols',
+ default=2,
+ min=1, max=100,
+ description='Number of the columns'
+ )
layers = BoolVectorProperty(
- name="Layers",
- size=20,
- subtype='LAYER',
- options={'HIDDEN', 'SKIP_SAVE'},
- )
+ name="Layers",
+ size=20,
+ subtype='LAYER',
+ options={'HIDDEN', 'SKIP_SAVE'},
+ )
diam = FloatProperty(
- name='Cell Diameter',
- default=1.0,
- min=0.0, update=fix_edge,
- description='Diameter of the cell'
- )
+ name='Cell Diameter',
+ default=1.0,
+ min=0.0, update=fix_edge,
+ description='Diameter of the cell'
+ )
edge = FloatProperty(
- name='Edge Width',
- default=0.1,
- min=0.0, update=fix_edge,
- description='Width of the edge'
- )
+ name='Edge Width',
+ default=0.1,
+ min=0.0, update=fix_edge,
+ description='Width of the edge'
+ )
# generic transform props
view_align = BoolProperty(
- name="Align to View",
- default=False
- )
+ name="Align to View",
+ default=False
+ )
location = FloatVectorProperty(
- name="Location",
- subtype='TRANSLATION'
- )
+ name="Location",
+ subtype='TRANSLATION'
+ )
rotation = FloatVectorProperty(
- name="Rotation",
- subtype='EULER'
- )
+ name="Rotation",
+ subtype='EULER'
+ )
@classmethod
def poll(cls, context):
diff --git a/add_mesh_extra_objects/add_mesh_menger_sponge.py b/add_mesh_extra_objects/add_mesh_menger_sponge.py
index 3f9ec241..088860d7 100644
--- a/add_mesh_extra_objects/add_mesh_menger_sponge.py
+++ b/add_mesh_extra_objects/add_mesh_menger_sponge.py
@@ -145,36 +145,36 @@ class AddMengerSponge(bpy.types.Operator):
bl_options = {'REGISTER', 'UNDO'}
level = IntProperty(
- name="Level",
- description="Sponge Level",
- min=0, max=4,
- default=1,
- )
+ name="Level",
+ description="Sponge Level",
+ min=0, max=4,
+ default=1,
+ )
radius = FloatProperty(
- name="Width",
- description="Sponge Radius",
- min=0.01, max=100.0,
- default=1.0,
- )
+ name="Width",
+ description="Sponge Radius",
+ min=0.01, max=100.0,
+ default=1.0,
+ )
# generic transform props
view_align = BoolProperty(
- name="Align to View",
- default=False,
- )
+ name="Align to View",
+ default=False,
+ )
location = FloatVectorProperty(
- name="Location",
- subtype='TRANSLATION',
- )
+ name="Location",
+ subtype='TRANSLATION',
+ )
rotation = FloatVectorProperty(
- name="Rotation",
- subtype='EULER',
- )
+ name="Rotation",
+ subtype='EULER',
+ )
layers = BoolVectorProperty(
- name="Layers",
- size=20,
- subtype='LAYER',
- options={'HIDDEN', 'SKIP_SAVE'},
- )
+ name="Layers",
+ size=20,
+ subtype='LAYER',
+ options={'HIDDEN', 'SKIP_SAVE'},
+ )
def execute(self, context):
sponger = MengerSponge(self.level)
diff --git a/add_mesh_extra_objects/add_mesh_pyramid.py b/add_mesh_extra_objects/add_mesh_pyramid.py
index 5c054c9f..680267cb 100644
--- a/add_mesh_extra_objects/add_mesh_pyramid.py
+++ b/add_mesh_extra_objects/add_mesh_pyramid.py
@@ -2,35 +2,43 @@
import bpy
import bmesh
+from bpy.types import Operator
from bpy.props import (
FloatProperty,
IntProperty,
)
from math import pi
-from mathutils import Quaternion, Vector
-from bpy_extras.object_utils import AddObjectHelper, object_data_add
+from mathutils import (
+ Quaternion,
+ Vector,
+ )
+from bpy_extras.object_utils import (
+ AddObjectHelper,
+ object_data_add,
+ )
def create_step(width, base_level, step_height, num_sides):
- axis = [0, 0, -1]
- PI2 = pi * 2
- rad = width / 2
+ axis = [0, 0, -1]
+ PI2 = pi * 2
+ rad = width / 2
+
+ quat_angles = [(cur_side / num_sides) * PI2
+ for cur_side in range(num_sides)]
- quat_angles = [(cur_side / num_sides) * PI2
- for cur_side in range(num_sides)]
+ quaternions = [Quaternion(axis, quat_angle)
+ for quat_angle in quat_angles]
- quaternions = [Quaternion(axis, quat_angle)
- for quat_angle in quat_angles]
+ init_vectors = [Vector([rad, 0, base_level])] * len(quaternions)
- init_vectors = [Vector([rad, 0, base_level])] * len(quaternions)
+ quat_vector_pairs = list(zip(quaternions, init_vectors))
+ vectors = [quaternion * vec for quaternion, vec in quat_vector_pairs]
+ bottom_list = [(vec.x, vec.y, vec.z) for vec in vectors]
+ top_list = [(vec.x, vec.y, vec.z + step_height) for vec in vectors]
+ full_list = bottom_list + top_list
- quat_vector_pairs = list(zip(quaternions, init_vectors))
- vectors = [quaternion * vec for quaternion, vec in quat_vector_pairs]
- bottom_list = [(vec.x, vec.y, vec.z) for vec in vectors]
- top_list = [(vec.x, vec.y, vec.z + step_height) for vec in vectors]
- full_list = bottom_list + top_list
- return full_list
+ return full_list
def split_list(l, n):
@@ -52,83 +60,83 @@ def get_connector_pairs(lst, n_sides):
def add_pyramid_object(self, context):
- all_verts = []
+ all_verts = []
- height_offset = 0
- cur_width = self.width
+ height_offset = 0
+ cur_width = self.width
- for i in range(self.num_steps):
- verts_loc = create_step(cur_width, height_offset, self.height,
- self.num_sides)
- height_offset += self.height
- cur_width -= self.reduce_by
- all_verts.extend(verts_loc)
+ for i in range(self.num_steps):
+ verts_loc = create_step(cur_width, height_offset, self.height,
+ self.num_sides)
+ height_offset += self.height
+ cur_width -= self.reduce_by
+ all_verts.extend(verts_loc)
- mesh = bpy.data.meshes.new("Pyramid")
- bm = bmesh.new()
+ mesh = bpy.data.meshes.new("Pyramid")
+ bm = bmesh.new()
- for v_co in all_verts:
- bm.verts.new(v_co)
+ for v_co in all_verts:
+ bm.verts.new(v_co)
- def add_faces(n, block_vert_sets):
- for bvs in block_vert_sets:
- for i in range(self.num_sides - 1):
- bm.faces.new([bvs[i], bvs[i + n], bvs[i + n + 1], bvs[i + 1]])
- bm.faces.new([bvs[n - 1], bvs[(n * 2) - 1], bvs[n], bvs[0]])
+ def add_faces(n, block_vert_sets):
+ for bvs in block_vert_sets:
+ for i in range(self.num_sides - 1):
+ bm.faces.new([bvs[i], bvs[i + n], bvs[i + n + 1], bvs[i + 1]])
+ bm.faces.new([bvs[n - 1], bvs[(n * 2) - 1], bvs[n], bvs[0]])
- # get the base and cap faces done.
- bm.faces.new(bm.verts[0:self.num_sides])
- bm.faces.new(reversed(bm.verts[-self.num_sides:])) # otherwise normal faces intern... T44619.
+ # get the base and cap faces done.
+ bm.faces.new(bm.verts[0:self.num_sides])
+ bm.faces.new(reversed(bm.verts[-self.num_sides:])) # otherwise normal faces intern... T44619.
- # side faces
- block_vert_sets = split_list(bm.verts, self.num_sides)
- add_faces(self.num_sides, block_vert_sets)
+ # side faces
+ block_vert_sets = split_list(bm.verts, self.num_sides)
+ add_faces(self.num_sides, block_vert_sets)
- # connector faces between faces and faces of the block above it.
- connector_pairs = get_connector_pairs(bm.verts, self.num_sides)
- add_faces(self.num_sides, connector_pairs)
+ # connector faces between faces and faces of the block above it.
+ connector_pairs = get_connector_pairs(bm.verts, self.num_sides)
+ add_faces(self.num_sides, connector_pairs)
- bm.to_mesh(mesh)
- mesh.update()
- res = object_data_add(context, mesh, operator=self)
+ bm.to_mesh(mesh)
+ mesh.update()
+ res = object_data_add(context, mesh, operator=self)
-class AddPyramid(bpy.types.Operator, AddObjectHelper):
+class AddPyramid(Operator, AddObjectHelper):
bl_idname = "mesh.primitive_steppyramid_add"
bl_label = "Pyramid"
bl_description = "Construct a step pyramid mesh"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
num_sides = IntProperty(
- name="Number Sides",
- description="How many sides each step will have",
- min=3, max=20,
- default=4
- )
+ name="Number Sides",
+ description="How many sides each step will have",
+ min=3, max=20,
+ default=4
+ )
num_steps = IntProperty(
- name="Number of Steps",
- description="How many steps for the overall pyramid",
- min=1, max=20,
- default=10
- )
+ name="Number of Steps",
+ description="How many steps for the overall pyramid",
+ min=1, max=20,
+ default=10
+ )
width = FloatProperty(
- name="Initial Width",
- description="Initial base step width",
- min=0.01, max=100.0,
- default=2
- )
+ name="Initial Width",
+ description="Initial base step width",
+ min=0.01, max=100.0,
+ default=2
+ )
height = FloatProperty(
- name="Height",
- description="How tall each step will be",
- min=0.01, max=100.0,
- default=0.1
- )
+ name="Height",
+ description="How tall each step will be",
+ min=0.01, max=100.0,
+ default=0.1
+ )
reduce_by = FloatProperty(
- name="Reduce Step By",
- description="How much to reduce each succeeding step by",
- min=.01, max=2.0,
- default=.20
- )
+ name="Reduce Step By",
+ description="How much to reduce each succeeding step by",
+ min=.01, max=2.0,
+ default=.20
+ )
def execute(self, context):
add_pyramid_object(self, context)
diff --git a/add_mesh_extra_objects/add_mesh_round_brilliant.py b/add_mesh_extra_objects/add_mesh_round_brilliant.py
index 537099b7..850421d8 100644
--- a/add_mesh_extra_objects/add_mesh_round_brilliant.py
+++ b/add_mesh_extra_objects/add_mesh_round_brilliant.py
@@ -1,9 +1,15 @@
# GPL "author": "Dominic Kröper, (dommetysk)"
import bpy
-from math import pi, sin, cos, tan
+from math import (
+ pi, sin,
+ cos, tan,
+ )
from bpy.types import Operator
-from mathutils import Vector, Euler
+from mathutils import (
+ Vector,
+ Euler,
+ )
from bpy.props import (
IntProperty,
FloatProperty,
@@ -34,7 +40,7 @@ def addBrilliant(context, s, table_w, crown_h, girdle_t, pavi_d, bezel_f,
s = s - 1
if not girdle_real:
g_real_smooth = False
- ang = 2 * pi / s # angle step size
+ ang = 2 * pi / s # angle step size
Verts = [] # collect all vertices
Faces = [] # collect all faces
ca = cos(ang)
@@ -300,85 +306,85 @@ class MESH_OT_primitive_brilliant_add(Operator):
# set user options
s = IntProperty(
- name="Segments",
- description="Longitudial segmentation",
- step=1,
- min=6,
- max=128,
- default=16,
- subtype='FACTOR'
- )
+ name="Segments",
+ description="Longitudial segmentation",
+ step=1,
+ min=6,
+ max=128,
+ default=16,
+ subtype='FACTOR'
+ )
table_w = FloatProperty(
- name="Table width",
- description="Width of table",
- min=0.001,
- max=1.0,
- default=0.53,
- subtype='PERCENTAGE'
- )
+ name="Table width",
+ description="Width of table",
+ min=0.001,
+ max=1.0,
+ default=0.53,
+ subtype='PERCENTAGE'
+ )
crown_h = FloatProperty(
- name="Crown height",
- description="Heigth of crown",
- min=0.0,
- max=1.0,
- default=0.162,
- subtype='PERCENTAGE'
- )
+ name="Crown height",
+ description="Heigth of crown",
+ min=0.0,
+ max=1.0,
+ default=0.162,
+ subtype='PERCENTAGE'
+ )
girdle_t = FloatProperty(
- name="Girdle height",
- description="Height of girdle",
- min=0.0,
- max=0.5,
- default=0.017,
- subtype='PERCENTAGE'
- )
+ name="Girdle height",
+ description="Height of girdle",
+ min=0.0,
+ max=0.5,
+ default=0.017,
+ subtype='PERCENTAGE'
+ )
girdle_real = BoolProperty(
- name="Real girdle",
- description="More beautiful girdle; has more polygons",
- default=True
- )
+ name="Real girdle",
+ description="More beautiful girdle; has more polygons",
+ default=True
+ )
g_real_smooth = BoolProperty(
- name="Smooth girdle",
- description="smooth shading for girdle, only available for real girdle",
- default=False
- )
+ name="Smooth girdle",
+ description="smooth shading for girdle, only available for real girdle",
+ default=False
+ )
pavi_d = FloatProperty(
- name="Pavilion depth",
- description="Height of pavillion",
- min=0.0,
- max=1.0,
- default=0.431,
- subtype='PERCENTAGE'
- )
+ name="Pavilion depth",
+ description="Height of pavillion",
+ min=0.0,
+ max=1.0,
+ default=0.431,
+ subtype='PERCENTAGE'
+ )
bezel_f = FloatProperty(
- name="Upper facet factor",
- description="Determines the form of bezel and upper girdle facets",
- min=0.0,
- max=1.0,
- default=0.250,
- subtype='PERCENTAGE'
- )
+ name="Upper facet factor",
+ description="Determines the form of bezel and upper girdle facets",
+ min=0.0,
+ max=1.0,
+ default=0.250,
+ subtype='PERCENTAGE'
+ )
pavi_f = FloatProperty(
- name="Lower facet factor",
- description="Determines the form of pavillion and lower girdle facets",
- min=0.001,
- max=1.0,
- default=0.400,
- subtype='PERCENTAGE'
- )
+ name="Lower facet factor",
+ description="Determines the form of pavillion and lower girdle facets",
+ min=0.001,
+ max=1.0,
+ default=0.400,
+ subtype='PERCENTAGE'
+ )
culet = FloatProperty(
- name="Culet size",
- description="0: no culet (default)",
- min=0.0,
- max=0.999,
- default=0.0,
- subtype='PERCENTAGE'
- )
+ name="Culet size",
+ description="0: no culet (default)",
+ min=0.0,
+ max=0.999,
+ default=0.0,
+ subtype='PERCENTAGE'
+ )
keep_lga = BoolProperty(
- name="Retain lower angle",
- description="If culet > 0, retains angle of pavillion facets",
- default=False
- )
+ name="Retain lower angle",
+ description="If culet > 0, retains angle of pavillion facets",
+ default=False
+ )
# call mesh/object generator function with user inputs
def execute(self, context):
diff --git a/add_mesh_extra_objects/add_mesh_round_cube.py b/add_mesh_extra_objects/add_mesh_round_cube.py
index b56ac3d3..dca438ae 100644
--- a/add_mesh_extra_objects/add_mesh_round_cube.py
+++ b/add_mesh_extra_objects/add_mesh_round_cube.py
@@ -3,7 +3,11 @@
import bpy
from bpy_extras import object_utils
from itertools import permutations
-from math import copysign, pi, sqrt
+from math import (
+ copysign, pi,
+ sqrt,
+ )
+from bpy.types import Operator
from bpy.props import (
BoolProperty,
EnumProperty,
@@ -109,12 +113,12 @@ def round_cube(radius=1.0, arcdiv=4, lindiv=0., size=(0., 0., 0.),
# Sides built left to right bottom up
# xp yp zp xd yd zd
- sides = ((0, 2, 1, (-1, 1, 1)), # Y+ Front
- (1, 2, 0, (-1, -1, 1)), # X- Left
- (0, 2, 1, ( 1, -1, 1)), # Y- Back
- (1, 2, 0, ( 1, 1, 1)), # X+ Right
- (0, 1, 2, (-1, 1, -1)), # Z- Bottom
- (0, 1, 2, (-1, -1, 1))) # Z+ Top
+ sides = ((0, 2, 1, (-1, 1, 1)), # Y+ Front
+ (1, 2, 0, (-1, -1, 1)), # X- Left
+ (0, 2, 1, (1, -1, 1)), # Y- Back
+ (1, 2, 0, (1, 1, 1)), # X+ Right
+ (0, 1, 2, (-1, 1, -1)), # Z- Bottom
+ (0, 1, 2, (-1, -1, 1))) # Z+ Top
# side vertex index table (for sphere)
svit = [[[] for i in range(steps)] for i in range(6)]
@@ -325,36 +329,34 @@ def round_cube(radius=1.0, arcdiv=4, lindiv=0., size=(0., 0., 0.),
return verts, faces
-class AddRoundCube(bpy.types.Operator, object_utils.AddObjectHelper):
+class AddRoundCube(Operator, object_utils.AddObjectHelper):
bl_idname = "mesh.primitive_round_cube_add"
bl_label = "Add Round Cube"
- bl_description = (
- "Create mesh primitives: Quadspheres, "
- "Capsules, Rounded Cuboids, 3D Grids etc"
- )
+ bl_description = ("Create mesh primitives: Quadspheres, "
+ "Capsules, Rounded Cuboids, 3D Grids etc")
bl_options = {"REGISTER", "UNDO", "PRESET"}
sanity_check_verts = 200000
vert_count = 0
radius = FloatProperty(
- name='Radius',
- description='Radius of vertices for sphere, capsule or cuboid bevel',
+ name="Radius",
+ description="Radius of vertices for sphere, capsule or cuboid bevel",
default=1.0, min=0.0, soft_min=0.01, step=10
)
size = FloatVectorProperty(
- name='Size',
- description='Size',
+ name="Size",
+ description="Size",
subtype='XYZ',
)
arc_div = IntProperty(
- name='Arc Divisions',
- description='Arc curve divisions, per quadrant; 0=derive from Linear',
+ name="Arc Divisions",
+ description="Arc curve divisions, per quadrant, 0=derive from Linear",
default=4, min=1
)
lin_div = FloatProperty(
- name='Linear Divisions',
- description='Linear unit divisions (Edges/Faces); 0=derive from Arc',
+ name="Linear Divisions",
+ description="Linear unit divisions (Edges/Faces), 0=derive from Arc",
default=0.0, min=0.0, step=100, precision=1
)
div_type = EnumProperty(
@@ -378,7 +380,8 @@ class AddRoundCube(bpy.types.Operator, object_utils.AddObjectHelper):
def execute(self, context):
if self.arc_div <= 0 and self.lin_div <= 0:
- self.report({'ERROR'}, 'Either Arc Divisions or Linear Divisions must be greater than zero!')
+ self.report({'ERROR'},
+ "Either Arc Divisions or Linear Divisions must be greater than zero")
return {'CANCELLED'}
if not self.no_limit:
@@ -397,8 +400,11 @@ class AddRoundCube(bpy.types.Operator, object_utils.AddObjectHelper):
return {'FINISHED'}
def check(self, context):
- self.arcdiv, self.lindiv, self.vert_count = round_cube(self.radius, self.arc_div, self.lin_div,
- self.size, self.div_type, self.odd_axis_align, True)
+ self.arcdiv, self.lindiv, self.vert_count = round_cube(
+ self.radius, self.arc_div, self.lin_div,
+ self.size, self.div_type, self.odd_axis_align,
+ True
+ )
return True
def invoke(self, context, event):
@@ -440,4 +446,3 @@ class AddRoundCube(bpy.types.Operator, object_utils.AddObjectHelper):
col.prop(self, 'location', expand=True)
col = layout.column(align=True)
col.prop(self, 'rotation', expand=True)
-
diff --git a/add_mesh_extra_objects/add_mesh_star.py b/add_mesh_extra_objects/add_mesh_star.py
index ae63f2c6..b7e420fe 100644
--- a/add_mesh_extra_objects/add_mesh_star.py
+++ b/add_mesh_extra_objects/add_mesh_star.py
@@ -1,7 +1,10 @@
# GPL Original by Fourmadmen
import bpy
-from mathutils import Vector, Quaternion
+from mathutils import (
+ Vector,
+ Quaternion,
+ )
from math import pi
from bpy.props import (
IntProperty,
diff --git a/add_mesh_extra_objects/add_mesh_teapot.py b/add_mesh_extra_objects/add_mesh_teapot.py
index 27e7f703..23dd084f 100644
--- a/add_mesh_extra_objects/add_mesh_teapot.py
+++ b/add_mesh_extra_objects/add_mesh_teapot.py
@@ -5,9 +5,7 @@ from bpy.props import (
IntProperty,
EnumProperty,
)
-
import mathutils
-
import io
import operator
import functools
@@ -111,10 +109,19 @@ def patches_to_raw(patches, resolution):
def make_bezier(ctrlpnts, resolution):
- b1 = lambda t: t * t * t
- b2 = lambda t: 3.0 * t * t * (1.0 - t)
- b3 = lambda t: 3.0 * t * (1.0 - t) * (1.0 - t)
- b4 = lambda t: (1.0 - t) * (1.0 - t) * (1.0 - t)
+
+ def b1(t):
+ return t * t * t
+
+ def b2(t):
+ return 3.0 * t * t * (1.0 - t)
+
+ def b3(t):
+ return 3.0 * t * (1.0 - t) * (1.0 - t)
+
+ def b4(t):
+ return (1.0 - t) * (1.0 - t) * (1.0 - t)
+
p1, p2, p3, p4 = map(mathutils.Vector, ctrlpnts)
def makevert(t):
diff --git a/add_mesh_extra_objects/add_mesh_triangles.py b/add_mesh_extra_objects/add_mesh_triangles.py
index c1a57469..f5768c0a 100644
--- a/add_mesh_extra_objects/add_mesh_triangles.py
+++ b/add_mesh_extra_objects/add_mesh_triangles.py
@@ -1,15 +1,15 @@
+# GPL # "author": Sjaak-de-Draak
+
bl_info = {
"name": "Triangles",
- "description": "Create different types of tirangles.",
+ "description": "Create different types of triangles",
"author": "Sjaak-de-Draak",
- "version": (1, 0),
+ "version": (1, 0, 1),
"blender": (2, 68, 0),
"location": "View3D > Add > Mesh",
- "warning": "First Version", # used for warning icon and text in addons panel
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
+ "warning": "First Version",
+ "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
"Scripts/Triangles",
- "tracker_url": "http://projects.blender.org/tracker/index.php?"
- "func=detail&aid=<number>",
"category": "Add Mesh"}
"""
@@ -19,202 +19,219 @@ and a toolbar menu to further specify settings
import math
import bpy
-import mathutils
-import types
+from mathutils import Vector
+from bpy.types import Operator
+from bpy.props import (
+ BoolProperty,
+ EnumProperty,
+ FloatProperty,
+ )
-# make the mathutils Vector type accessible as Vector
-Vector=mathutils.Vector
def checkEditMode():
- ## Check if we are in edit mode
- ## Returns: 1 if True
- ## 0 if False
+ # Check if we are in edit mode
+ # Returns: 1 if True
+ # 0 if False
if (bpy.context.active_object.mode == 'EDIT'):
- return 1;
- return 0;
+ return 1
+ return 0
+
def exitEditMode():
- ## Check if we are in edit mode (cuz we don't want this when creating a new Mesh)
- ## If we are then toggle back to object mode
+ # Check if we are in edit mode (cuz we don't want this when creating a new Mesh)
+ # If we are then toggle back to object mode
# Check if there are active objects
- if (bpy.context.active_object != None ):
- # Only the active object should be in edit mode
+ if bpy.context.active_object is not None:
+ # Only the active object should be in edit mode
if (bpy.context.active_object.mode == 'EDIT'):
bpy.ops.object.editmode_toggle()
-class MakeTriangle(bpy.types.Operator):
+
+class MakeTriangle(Operator):
bl_idname = "mesh.make_triangle"
bl_label = "Triangle"
+ bl_description = "Construct different types of Triangle Meshes"
bl_options = {"REGISTER", "UNDO"}
- nothing=0
+ nothing = 0
Ya = 0.0
Xb = 0.0
Xc = 0.0
- Vertices = [ ]
- Faces = [ ]
+ Vertices = []
+ Faces = []
- triangleTypeList = [('ISOSCELES', "Isosceles", "Two equal sides", 0),
+ triangleTypeList = [
+ ('ISOSCELES', "Isosceles", "Two equal sides", 0),
('EQUILATERAL', "Equilateral", "Three equal sides and angles (60°)", 1),
('ISOSCELESRIGHTANGLE', "Isosceles right angled", "90° angle and two equal sides", 2),
- ('SCALENERIGHTANGLE', "Scalene right angled", "90° angle, no equal sides", 3)]
-
- triangleFaceList = [('DEFAULT', "Normal", "1 Tri(angle) face", 0),
+ ('SCALENERIGHTANGLE', "Scalene right angled", "90° angle, no equal sides", 3)
+ ]
+ triangleFaceList = [
+ ('DEFAULT', "Normal", "1 Tri(angle) face", 0),
('TRIANGLES', "3 Tri faces", "4 Verticies & 3 Tri(angle) faces", 1),
('QUADS', "3 Quad faces", "7 Verticies & 3 Quad faces", 2),
- ('SAFEQUADS', "6 Quad faces", "12 Verticies & 6 Quad faces", 3)]
+ ('SAFEQUADS', "6 Quad faces", "12 Verticies & 6 Quad faces", 3)
+ ]
# add definitions for some manipulation buttons
- flipX = bpy.props.BoolProperty(name="Flip X sign",
- description="Draw on the other side of the X axis (Mirror on Y axis)",
- default = False)
- flipY = bpy.props.BoolProperty(name="Flip Y sign",
- description="Draw on the other side of the Y axis (Mirror on X axis)",
- default = False)
- scale = bpy.props.FloatProperty(name="Scale",
- description="Triangle scale",
- default=1.0, min=1.0)
- triangleType = bpy.props.EnumProperty(items=triangleTypeList,
- name="Type",
- description="Triangle Type")
- triangleFace = bpy.props.EnumProperty(items=triangleFaceList,
- name="Face types",
- description="Triangle Face Types")
- at_3Dcursor = bpy.props.BoolProperty(name="At 3D Cursor",
- description="Draw the triangle where the 3D cursor is",
- default = False)
-
+ flipX = BoolProperty(
+ name="Flip X sign",
+ description="Draw on the other side of the X axis (Mirror on Y axis)",
+ default=False
+ )
+ flipY = BoolProperty(
+ name="Flip Y sign",
+ description="Draw on the other side of the Y axis (Mirror on X axis)",
+ default=False
+ )
+ scale = FloatProperty(
+ name="Scale",
+ description="Triangle scale",
+ default=1.0,
+ min=1.0
+ )
+ triangleType = EnumProperty(
+ items=triangleTypeList,
+ name="Type",
+ description="Triangle Type"
+ )
+ triangleFace = EnumProperty(
+ items=triangleFaceList,
+ name="Face types",
+ description="Triangle Face Types"
+ )
+ at_3Dcursor = BoolProperty(
+ name="Use 3D Cursor",
+ description="Draw the triangle where the 3D cursor is",
+ default=False
+ )
def draw(self, context):
layout = self.layout
- row = layout.row(align=True)
- row.label(text="Type: ")
-
- row.prop(self, "triangleType", text="")
-
- row = layout.row(align=True)
- row.prop(self, "at_3Dcursor", text="3D Cursor")
- row.prop(self, "scale")
-
- row = layout.row(align=True)
- row.label(text="Face Type: ")
- row.prop(self, "triangleFace", text="")
+ col = layout.column(align=True)
+ col.prop(self, "triangleType", text="Type")
+ col.prop(self, "scale")
+ col.prop(self, "triangleFace", text="Face")
col = layout.column(align=True)
- col.prop(self, "flipX")
- col.prop(self, "flipY")
- #end draw
+ col.prop(self, "at_3Dcursor", text="3D Cursor", toggle=True)
+
+ row = col.row(align=True)
+ row.prop(self, "flipX", toggle=True)
+ row.prop(self, "flipY", toggle=True)
def drawBasicTriangleShape(self):
# set everything to 0
- X = Xa = Xb = Xc = 0.0
- Y = Ya = Yb = Yc = 0.0
- Z = Za = Zb = Zc = 0.0
+ Xb = Xc = 0.0
+ Ya = 0.0
- scale=self.scale
+ scale = self.scale
Xsign = -1 if self.flipX else 1
Ysign = -1 if self.flipY else 1
# Isosceles (2 equal sides)
- if ( self.triangleType == 'ISOSCELES' ):
+ if (self.triangleType == 'ISOSCELES'):
# below a simple triangle containing 2 triangles with 1:2 side ratio
- Ya=(1 * Ysign * scale)
- A=Vector([0.0, Ya, 0.0])
- Xb=(0.5 * Xsign * scale)
- B=Vector([Xb, 0.0, 0.0])
- Xc=(-0.5 * Xsign * scale)
- C=Vector([Xc, 0.0, 0.0])
-
- self.Ya=Ya
- self.Xb=Xb
- self.Xc=Xc
- self.Vertices = [A, B, C,]
+ Ya = (1 * Ysign * scale)
+ A = Vector([0.0, Ya, 0.0])
+ Xb = (0.5 * Xsign * scale)
+ B = Vector([Xb, 0.0, 0.0])
+ Xc = (-0.5 * Xsign * scale)
+ C = Vector([Xc, 0.0, 0.0])
+
+ self.Ya = Ya
+ self.Xb = Xb
+ self.Xc = Xc
+ self.Vertices = [A, B, C, ]
+
return True
# Equilateral (all sides equal)
- if ( self.triangleType == 'EQUILATERAL' ):
- Ya=(math.sqrt(0.75) * Ysign * scale)
- A=Vector([0.0, Ya, 0.0])
- Xb=(0.5 * Xsign * scale)
- B=Vector([Xb, 0.0, 0.0])
- Xc=(-0.5 * Xsign * scale)
- C=Vector([Xc, 0.0, 0.0])
-
- self.Ya=Ya
- self.Xb=Xb
- self.Xc=Xc
- self.Vertices = [A, B, C,]
+ if (self.triangleType == 'EQUILATERAL'):
+ Ya = (math.sqrt(0.75) * Ysign * scale)
+ A = Vector([0.0, Ya, 0.0])
+ Xb = (0.5 * Xsign * scale)
+ B = Vector([Xb, 0.0, 0.0])
+ Xc = (-0.5 * Xsign * scale)
+ C = Vector([Xc, 0.0, 0.0])
+
+ self.Ya = Ya
+ self.Xb = Xb
+ self.Xc = Xc
+ self.Vertices = [A, B, C, ]
+
return True
- # Isosceles right angled ( 1, 1, sqrt(2) )
- if ( self.triangleType == 'ISOSCELESRIGHTANGLE' ):
- Ya=(1 * Ysign * scale)
- A=Vector([0.0, Ya, 0.0])
- Xb=0.0
- B=Vector([Xb, 0.0, 0.0])
- Xc=(1 * Xsign * scale)
- C=Vector([Xc, 0.0, 0.0])
-
- self.Ya=Ya
- self.Xb=Xb
- self.Xc=Xc
- self.Vertices = [A, B, C,]
+ # Isosceles right angled (1, 1, sqrt(2))
+ if (self.triangleType == 'ISOSCELESRIGHTANGLE'):
+ Ya = (1 * Ysign * scale)
+ A = Vector([0.0, Ya, 0.0])
+ Xb = 0.0
+ B = Vector([Xb, 0.0, 0.0])
+ Xc = (1 * Xsign * scale)
+ C = Vector([Xc, 0.0, 0.0])
+
+ self.Ya = Ya
+ self.Xb = Xb
+ self.Xc = Xc
+ self.Vertices = [A, B, C, ]
return True
- # Scalene right angled ( 3, 4, 5 )
- if ( self.triangleType == 'SCALENERIGHTANGLE' ):
- Ya=(1 * Ysign * scale)
- A=Vector([0.0, Ya, 0.0])
- Xb=0
- B=Vector([Xb, 0.0, 0.0])
- Xc=(0.75 * Xsign * scale)
- C=Vector([Xc, 0.0, 0.0])
-
- self.Ya=Ya
- self.Xb=Xb
- self.Xc=Xc
- self.Vertices = [A, B, C,]
+ # Scalene right angled (3, 4, 5)
+ if (self.triangleType == 'SCALENERIGHTANGLE'):
+ Ya = (1 * Ysign * scale)
+ A = Vector([0.0, Ya, 0.0])
+ Xb = 0
+ B = Vector([Xb, 0.0, 0.0])
+ Xc = (0.75 * Xsign * scale)
+ C = Vector([Xc, 0.0, 0.0])
+
+ self.Ya = Ya
+ self.Xb = Xb
+ self.Xc = Xc
+ self.Vertices = [A, B, C, ]
return True
+
return False
def addFaces(self, fType=None):
- Ya=self.Ya
- Xb=self.Xb
- Xc=self.Xc
+ Ya = self.Ya
+ Xb = self.Xb
+ Xc = self.Xc
if (self.triangleFace == 'DEFAULT'):
- self.Faces=[[0,1,2]]
+ self.Faces = [[0, 1, 2]]
return True
if (self.triangleFace == 'TRIANGLES'):
- A=Vector([0.0, Ya, 0.0])
- B=Vector([Xb, 0.0, 0.0])
- C=Vector([Xc, 0.0, 0.0])
- D=Vector([((A.x + B.x + C.x) /3), ((A.y + B.y + C.y) /3), ((A.z + B.z + C.z) /3)])
+ A = Vector([0.0, Ya, 0.0])
+ B = Vector([Xb, 0.0, 0.0])
+ C = Vector([Xc, 0.0, 0.0])
+ D = Vector([((A.x + B.x + C.x) / 3), ((A.y + B.y + C.y) / 3), ((A.z + B.z + C.z) / 3)])
- self.Vertices = [A, B, C, D,]
- self.Faces=[[0,1,3], [1,2,3], [2,0,3]]
+ self.Vertices = [A, B, C, D, ]
+ self.Faces = [[0, 1, 3], [1, 2, 3], [2, 0, 3]]
return True
if (self.triangleFace == 'QUADS'):
- A=Vector([0.0, Ya, 0.0])
- B=Vector([Xb, 0.0, 0.0])
- C=Vector([Xc, 0.0, 0.0])
- D=Vector([((A.x + B.x + C.x) /3), ((A.y + B.y + C.y) /3), ((A.z + B.z + C.z) /3)])
+ A = Vector([0.0, Ya, 0.0])
+ B = Vector([Xb, 0.0, 0.0])
+ C = Vector([Xc, 0.0, 0.0])
+ D = Vector([((A.x + B.x + C.x) / 3), ((A.y + B.y + C.y) / 3), ((A.z + B.z + C.z) / 3)])
AB = A.lerp(B, 0.5)
AC = A.lerp(C, 0.5)
BC = B.lerp(C, 0.5)
- self.Vertices = [A, AB, B, BC, C, AC, D,]
- self.Faces=[[0,1,6,5], [1,2,3,6], [3,4,5,6]]
+ self.Vertices = [A, AB, B, BC, C, AC, D, ]
+ self.Faces = [[0, 1, 6, 5], [1, 2, 3, 6], [3, 4, 5, 6]]
return True
if (self.triangleFace == 'SAFEQUADS'):
- A=Vector([0.0, Ya, 0.0])
- B=Vector([Xb, 0.0, 0.0])
- C=Vector([Xc, 0.0, 0.0])
- D=Vector([((A.x + B.x + C.x) /3), ((A.y + B.y + C.y) /3), ((A.z + B.z + C.z) /3)])
+ A = Vector([0.0, Ya, 0.0])
+ B = Vector([Xb, 0.0, 0.0])
+ C = Vector([Xc, 0.0, 0.0])
+ D = Vector([((A.x + B.x + C.x) / 3), ((A.y + B.y + C.y) / 3), ((A.z + B.z + C.z) / 3)])
E = A.lerp(D, 0.5)
AB = A.lerp(B, 0.5)
AC = A.lerp(C, 0.5)
@@ -226,31 +243,33 @@ class MakeTriangle(bpy.types.Operator):
BCC = BC.lerp(C, 0.5)
CCA = AC.lerp(C, 0.5)
- self.Vertices = [A, AAB, BBA, B, BBC, BC, BCC, C, CCA, AAC, D, E,]
- self.Faces=[[0,1,11,9], [1,2,10,11], [2,3,4,10], [4,5,6,10], [6,7,8,10], [8,9,11,10]]
+ self.Vertices = [A, AAB, BBA, B, BBC, BC, BCC, C, CCA, AAC, D, E, ]
+ self.Faces = [[0, 1, 11, 9], [1, 2, 10, 11], [2, 3, 4, 10],
+ [4, 5, 6, 10], [6, 7, 8, 10], [8, 9, 11, 10]]
return True
- return False
+ return False
def action_common(self, context):
# definitions:
- # a triangle consists of 3 points: A, B, C
- # a 'safer' subdividable triangle consists of 4 points: A, B, C, D
- # a subdivide friendly triangle consists of 7 points: A, B, C, D, AB, AC, BC
- # a truely subdivide friendly triangle consists of (3x4=)12 points: A, B, C, D, E, BC, AAB, AAC, BBA, BBC, BCC, CCA
+ # a triangle consists of 3 points: A, B, C
+ # a 'safer' subdividable triangle consists of 4 points: A, B, C, D
+ # a subdivide friendly triangle consists of 7 points: A, B, C, D, AB, AC, BC
+ # a truely subdivide friendly triangle consists of (3 x 4 = )12 points:
+ # A, B, C, D, E, BC, AAB, AAC, BBA, BBC, BCC, CCA
- BasicShapeCreated=False
- ShapeFacesCreated=False
- go=0
+ BasicShapeCreated = False
+ ShapeFacesCreated = False
+ go = 0
#
# call the functions for creating the triangles and test if successfull
#
- BasicShapeCreated=self.drawBasicTriangleShape()
+ BasicShapeCreated = self.drawBasicTriangleShape()
if (BasicShapeCreated):
- ShapeFacesCreated=self.addFaces()
- if (ShapeFacesCreated):
- go=1
+ ShapeFacesCreated = self.addFaces()
+ if ShapeFacesCreated:
+ go = 1
if (go == 1):
NewMesh = bpy.data.meshes.new("Triangle")
@@ -262,38 +281,37 @@ class MakeTriangle(bpy.types.Operator):
# before doing the deselect make sure edit mode isn't active
exitEditMode()
- bpy.ops.object.select_all(action = "DESELECT")
+ bpy.ops.object.select_all(action="DESELECT")
NewObj.select = True
context.scene.objects.active = NewObj
- if (self.at_3Dcursor == True):
+
+ if self.at_3Dcursor is True:
# we'll need to be sure there is actually an object selected
- if (NewObj.select == True):
+ if NewObj.select is True:
# we also have to check if we're considered to be in 3D View (view3d)
- if (bpy.ops.view3d.snap_selected_to_cursor.poll() == True):
+ if bpy.ops.view3d.snap_selected_to_cursor.poll() is True:
bpy.ops.view3d.snap_selected_to_cursor()
else:
# as we weren't considered to be in 3D View
# the object couldn't be moved to the 3D cursor
# so to avoid confusion we change the at_3Dcursor boolean to false
self.at_3Dcursor = False
+
else:
- print("Failed to create triangle: ")
- print("Triangle type: %s" % self.triangleType)
- print("Face type: %s" % self.triangleFace)
- print("Ya: %s" % self.Ya)
- print("Xb: %s" % self.Xb)
- print("Xc: %s" % self.Xc)
- print("Vertices: %s" % self.Vertices)
- print("Faces: %s" % self.Faces)
-
- #end action_common
-
- def execute(self, context) :
+ self.report({'WARNING'},
+ "Triangle could not be completed. (See Console for more Info)")
+
+ print("\n[Add Mesh Extra Objects]\n\nModule: add_mesh_triangle")
+ print("Triangle type: %s\n" % self.triangleType,
+ "Face type: %s\n" % self.triangleFace,
+ "Ya: %s, Xb: %s, Xc: %s\n" % (self.Ya, self.Xb, self.Xc),
+ "Vertices: %s\n" % self.Vertices,
+ "Faces: %s\n" % self.Faces)
+
+ def execute(self, context):
self.action_common(context)
return {"FINISHED"}
- #end execute
- def invoke(self, context, event) :
+ def invoke(self, context, event):
self.action_common(context)
return {"FINISHED"}
- #end invoke