3
11
This repository has been archived on 2024-05-16. You can view files and clone it, but cannot push or open issues or pull requests.
blender-addons-contrib/add_dimension.py

3044 lines
128 KiB
Python

# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and / or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
bl_info = {
'name': 'Dimension',
'author': 'Spivak Vladimir (http://cwolf3d.korostyshev.net)',
'version': (4, 0, 0),
'blender': (2, 80, 0),
'location': 'View3D > Add > Curve',
'description': 'Adds Dimension',
'warning': '', # used for warning icon and text in addons panel
'doc_url': 'http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Curve/Dimension',
"tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
'category': 'Add Curve'}
##------------------------------------------------------------
#### import modules
import bpy
from bpy.props import *
from mathutils import *
from math import *
from bpy.app.handlers import persistent
# Add a TextCurve
def addText(string = '', loc = ((0, 0, 0)), textsize = 1, align = 'CENTER', offset_y = 0, font = ''):
tcu = bpy.data.curves.new(string + 'Data', 'FONT')
text = bpy.data.objects.new(string + 'Text', tcu)
tcu.body = string
tcu.fill_mode = 'BOTH'
tcu.align_x = align
tcu.size = textsize
tcu.offset_y = offset_y
if font == '':
fnt = bpy.data.fonts[0]
else:
fnt = bpy.data.fonts.load(font)
tcu.font = fnt
text.location = loc
bpy.context.collection.objects.link(text)
return text
##------------------------------------------------------------
# Dimension: Linear-1
def Linear1(width = 2, length = 2, dsize = 1, depth = 0.1, center = False, arrow = 'Arrow1', arrowdepth = 0.1, arrowlength = 0.25):
newpoints = []
w = 1
if width < 0:
w = -1
l = 1
if length < 0:
l = -1
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
if arrow == 'Arrow1' or arrow == 'Arrow2':
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize, 0]) #3
newpoints.append([center2, length + l * dsize, 0]) #4
newpoints.append([center2, length + l * dsize / 2 + l * depth / 100, 0]) #5
newpoints.append([center2 + w * arrowlength, length + l * dsize / 2 + l * arrowdepth + l * depth / 2, 0]) #6
if arrow == 'Arrow1':
newpoints.append([center2 + w * arrowlength, length + l * dsize / 2 + l * depth / 2, 0]) #7
newpoints.append([width-center2-w * arrowlength, length + l * dsize / 2 + l * depth / 2, 0]) #8
else:
newpoints.append([center2 + w * arrowlength * 3 / 4, length + l * dsize / 2 + l * depth / 2, 0]) #7
newpoints.append([width-center2-w * arrowlength * 3 / 4, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([width-center2-w * arrowlength, length + l * dsize / 2 + l * arrowdepth + l * depth / 2, 0]) #9
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 100, 0]) #10
newpoints.append([width-center2, length + l * dsize, 0]) #11
newpoints.append([width + center1, length + l * dsize, 0]) #12
newpoints.append([width + center1, length, 0]) #13
newpoints.append([width + center1, 0, 0]) #14
newpoints.append([width-center2, 0, 0]) #15
newpoints.append([width-center2, length, 0]) #16
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 100, 0]) #17
newpoints.append([width-center2-w * arrowlength, length + l * dsize / 2-l * arrowdepth-l * depth / 2, 0]) #18
if arrow == 'Arrow1':
newpoints.append([width-center2-w * arrowlength, length + l * dsize / 2-l * depth / 2, 0]) #19
newpoints.append([center2 + w * arrowlength, length + l * dsize / 2-l * depth / 2, 0]) #20
else:
newpoints.append([width-center2-w * arrowlength * 3 / 4, length + l * dsize / 2-l * depth / 2, 0]) #19
newpoints.append([center2 + w * arrowlength * 3 / 4, length + l * dsize / 2-l * depth / 2, 0]) #20
newpoints.append([center2 + w * arrowlength, length + l * dsize / 2-l * arrowdepth-l * depth / 2, 0]) #21
newpoints.append([center2, length + l * dsize / 2-l * depth / 100, 0]) #22
newpoints.append([center2, length, 0]) #23
newpoints.append([center2, 0, 0]) #24
if arrow == 'Serifs1' or arrow == 'Serifs2':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength * l
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize / 2-l * depth / 2-l * b, 0]) #3
newpoints.append([-center1-x, length + l * dsize / 2-l * depth / 2-l * b-y, 0]) #4
newpoints.append([-center1-w * b-x, length + l * dsize / 2-l * depth / 2-y, 0]) #5
if arrow == 'Serifs2':
newpoints.append([-center1-w * b, length + l * dsize / 2-l * depth / 2, 0]) #6
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #7
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([-center1, length + l * dsize / 2 + l * depth / 2, 0]) #9
newpoints.append([-center1, length + l * dsize, 0]) #10
newpoints.append([center2, length + l * dsize, 0]) #11
newpoints.append([center2, length + l * dsize / 2 + l * depth / 2 + l * b, 0]) #12
newpoints.append([center2 + x, length + l * dsize / 2 + l * depth / 2 + l * b + y, 0]) #13
newpoints.append([center2 + w * b + x, length + l * dsize / 2 + l * depth / 2 + y, 0]) #14
newpoints.append([center2 + w * b, length + l * dsize / 2 + l * depth / 2, 0]) #15
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 2, 0]) #16
newpoints.append([width-center2, length + l * dsize, 0]) #17
newpoints.append([width + center1, length + l * dsize, 0]) #18
newpoints.append([width + center1, length + l * dsize / 2 + l * depth / 2 + l * b, 0]) #19
newpoints.append([width + center1 + x, length + l * dsize / 2 + l * depth / 2 + l * b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, length + l * dsize / 2 + l * depth / 2 + y, 0]) #21
if arrow == 'Serifs2':
newpoints.append([width + center1 + w * b, length + l * dsize / 2 + l * depth / 2, 0]) #22
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #23
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #24
newpoints.append([width + center1, length + l * dsize / 2-l * depth / 2, 0]) #25
newpoints.append([width + center1, length, 0]) #26
newpoints.append([width + center1, 0, 0]) #27
newpoints.append([width-center2, 0, 0]) #28
newpoints.append([width-center2, length, 0]) #29
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 2-l * b, 0]) #30
newpoints.append([width-center2-x, length + l * dsize / 2-l * depth / 2-l * b-y, 0]) #31
newpoints.append([width-center2-w * b-x, length + l * dsize / 2-l * depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, length + l * dsize / 2-l * depth / 2, 0]) #33
newpoints.append([center2, length + l * dsize / 2-l * depth / 2, 0]) #34
newpoints.append([center2, length, 0]) #35
newpoints.append([center2, 0, 0]) #36
if arrow == 'Without':
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize, 0]) #3
newpoints.append([center2, length + l * dsize, 0]) #4
newpoints.append([center2, length + l * dsize / 2 + l * depth / 2, 0]) #7
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([width-center2, length + l * dsize, 0]) #11
newpoints.append([width + center1, length + l * dsize, 0]) #12
newpoints.append([width + center1, length, 0]) #13
newpoints.append([width + center1, 0, 0]) #14
newpoints.append([width-center2, 0, 0]) #15
newpoints.append([width-center2, length, 0]) #16
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 2, 0]) #19
newpoints.append([center2, length + l * dsize / 2-l * depth / 2, 0]) #20
newpoints.append([center2, length, 0]) #23
newpoints.append([center2, 0, 0]) #24
return newpoints
##------------------------------------------------------------
# Dimension: Linear-2
def Linear2(width = 2, dsize = 1, depth = 0.1, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
w = 1
if width < 0:
w = -1
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
if arrow == 'Arrow1' or arrow == 'Arrow2':
newpoints.append([0, 0, 0]) #1
newpoints.append([w * arrowlength, arrowdepth + depth / 2, 0]) #2
if arrow == 'Arrow1':
newpoints.append([w * arrowlength, depth / 2, 0]) #3
newpoints.append([width-w * arrowlength, depth / 2, 0]) #4
else:
newpoints.append([w * arrowlength * 3 / 4, depth / 2, 0]) #3
newpoints.append([width-w * arrowlength * 3 / 4, depth / 2, 0]) #4
newpoints.append([width-w * arrowlength, arrowdepth + depth / 2, 0]) #5
newpoints.append([width, 0, 0]) #6
newpoints.append([width-w * arrowlength, -arrowdepth-depth / 2, 0]) #7
if arrow == 'Arrow1':
newpoints.append([width-w * arrowlength, -depth / 2, 0]) #8
newpoints.append([w * arrowlength, -depth / 2, 0]) #9
else:
newpoints.append([width-w * arrowlength * 3 / 4, -depth / 2, 0]) #8
newpoints.append([w * arrowlength * 3 / 4, -depth / 2, 0]) #9
newpoints.append([w * arrowlength, -arrowdepth-depth / 2, 0]) #10
if arrow == 'Serifs1':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength
newpoints.append([-center1, -dsize / 2, 0]) #2
newpoints.append([-center1, -depth / 2-b, 0]) #3
newpoints.append([-center1-x, -depth / 2-b-y, 0]) #4
newpoints.append([-center1-w * b-x, -depth / 2-y, 0]) #5
newpoints.append([-center1-w * b, -depth / 2, 0]) #6
newpoints.append([-center1-w * dsize / 2, -depth / 2, 0]) #7
newpoints.append([-center1-w * dsize / 2, depth / 2, 0]) #8
newpoints.append([-center1, depth / 2, 0]) #9
newpoints.append([-center1, dsize / 2, 0]) #10
newpoints.append([center2, dsize / 2, 0]) #11
newpoints.append([center2, depth / 2 + b, 0]) #12
newpoints.append([center2 + x, depth / 2 + b + y, 0]) #13
newpoints.append([center2 + w * b + x, depth / 2 + y, 0]) #14
newpoints.append([center2 + w * b, depth / 2, 0]) #15
newpoints.append([width-center2, depth / 2, 0]) #16
newpoints.append([width-center2, dsize / 2, 0]) #17
newpoints.append([width + center1, dsize / 2, 0]) #18
newpoints.append([width + center1, depth / 2 + b, 0]) #19
newpoints.append([width + center1 + x, depth / 2 + b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, depth / 2 + y, 0]) #21
newpoints.append([width + center1 + w * b, depth / 2, 0]) #22
newpoints.append([width + center1 + w * dsize / 2, depth / 2, 0]) #23
newpoints.append([width + center1 + w * dsize / 2, -depth / 2, 0]) #24
newpoints.append([width + center1, -depth / 2, 0]) #25
newpoints.append([width + center1, -dsize / 2, 0]) #26
newpoints.append([width-center2, -dsize / 2, 0]) #29
newpoints.append([width-center2, -depth / 2-b, 0]) #30
newpoints.append([width-center2-x, -depth / 2-b-y, 0]) #31
newpoints.append([width-center2-w * b-x, -depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, -depth / 2, 0]) #33
newpoints.append([center2, -depth / 2, 0]) #34
newpoints.append([center2, -dsize / 2, 0]) #35
if arrow == 'Serifs2':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength
newpoints.append([-center1 + w * b, -depth / 2, 0]) #3
newpoints.append([-center1-x, -depth / 2-b-y, 0]) #4
newpoints.append([-center1-w * b-x, -depth / 2-y, 0]) #5
newpoints.append([center2 + x, depth / 2 + b + y, 0]) #13
newpoints.append([center2 + w * b + x, depth / 2 + y, 0]) #14
newpoints.append([center2 + w * b, depth / 2, 0]) #15
newpoints.append([width + center1-w * b, depth / 2, 0]) #19
newpoints.append([width + center1 + x, depth / 2 + b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, depth / 2 + y, 0]) #21
newpoints.append([width-center2-x, -depth / 2-b-y, 0]) #31
newpoints.append([width-center2-w * b-x, -depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, -depth / 2, 0]) #33
if arrow == 'Without':
newpoints.append([0, depth / 2, 0]) #3
newpoints.append([width, depth / 2, 0]) #4
newpoints.append([width, -depth / 2, 0]) #8
newpoints.append([0, -depth / 2, 0]) #9
return newpoints
##------------------------------------------------------------
# Dimension: Linear-3
def Linear3(width = 2, length = 2, dsize = 1, depth = 0.1, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
w = 1
if width < 0:
w = -1
l = 1
if length < 0:
l = -1
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
if arrow == 'Arrow1' or arrow == 'Arrow2':
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize / 2-l * depth / 100, 0]) #3
newpoints.append([-center1-w * arrowlength, length + l * dsize / 2-l * arrowdepth-l * depth / 2, 0]) #4
if arrow == 'Arrow1':
newpoints.append([-center1-w * arrowlength, length + l * dsize / 2-l * depth / 2, 0]) #5
else:
newpoints.append([-center1-w * arrowlength * 3 / 4, length + l * dsize / 2-l * depth / 2, 0]) #5
newpoints.append([-center1-w * arrowlength-w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #6
newpoints.append([-center1-w * arrowlength-w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #7
if arrow == 'Arrow1':
newpoints.append([-center1-w * arrowlength, length + l * dsize / 2 + l * depth / 2, 0]) #8
else:
newpoints.append([-center1-w * arrowlength * 3 / 4, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([-center1-w * arrowlength, length + l * dsize / 2 + l * arrowdepth + l * depth / 2, 0]) #9
newpoints.append([-center1, length + l * dsize / 2 + l * depth / 100, 0]) #10
newpoints.append([-center1, length + l * dsize, 0]) #11
newpoints.append([center2, length + l * dsize, 0]) #12
newpoints.append([center2, length + l * dsize / 2 + l * depth / 2, 0]) #13
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 2, 0]) #14
newpoints.append([width-center2, length + l * dsize, 0]) #15
newpoints.append([width + center1, length + l * dsize, 0]) #16
newpoints.append([width + center1, length + l * dsize / 2 + l * depth / 100, 0]) #17
newpoints.append([width + center1 + w * arrowlength, length + l * dsize / 2 + l * arrowdepth + l * depth / 2, 0]) #18
if arrow == 'Arrow1':
newpoints.append([width + center1 + w * arrowlength, length + l * dsize / 2 + l * depth / 2, 0]) #19
else:
newpoints.append([width + center1 + w * arrowlength * 3 / 4, length + l * dsize / 2 + l * depth / 2, 0]) #19
newpoints.append([width + center1 + w * arrowlength + w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #20
newpoints.append([width + center1 + w * arrowlength + w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #21
if arrow == 'Arrow1':
newpoints.append([width + center1 + w * arrowlength, length + l * dsize / 2-l * depth / 2, 0]) #22
else:
newpoints.append([width + center1 + w * arrowlength * 3 / 4, length + l * dsize / 2-l * depth / 2, 0]) #22
newpoints.append([width + center1 + w * arrowlength, length + l * dsize / 2-l * arrowdepth-l * depth / 2, 0]) #23
newpoints.append([width + center1, length + l * dsize / 2-l * depth / 100, 0]) #24
newpoints.append([width + center1, length, 0]) #25
newpoints.append([width + center1, 0, 0]) #26
newpoints.append([width-center2, 0, 0]) #27
newpoints.append([width-center2, length, 0]) #28
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 2, 0]) #29
newpoints.append([center2, length + l * dsize / 2-l * depth / 2, 0]) #30
newpoints.append([center2, length, 0]) #31
newpoints.append([center2, 0, 0]) #32
if arrow == 'Serifs1' or arrow == 'Serifs2':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength * l
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize / 2-l * depth / 2-l * b, 0]) #3
newpoints.append([-center1-x, length + l * dsize / 2-l * depth / 2-l * b-y, 0]) #4
newpoints.append([-center1-w * b-x, length + l * dsize / 2-l * depth / 2-y, 0]) #5
newpoints.append([-center1-w * b, length + l * dsize / 2-l * depth / 2, 0]) #6
if arrow == 'Serifs1':
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #7
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #8
else:
newpoints.append([-center1-w * dsize, length + l * dsize / 2-l * depth / 2, 0]) #7
newpoints.append([-center1-w * dsize, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([-center1, length + l * dsize / 2 + l * depth / 2, 0]) #9
newpoints.append([-center1, length + l * dsize, 0]) #10
newpoints.append([center2, length + l * dsize, 0]) #11
newpoints.append([center2, length + l * dsize / 2 + l * depth / 2 + l * b, 0]) #12
newpoints.append([center2 + x, length + l * dsize / 2 + l * depth / 2 + l * b + y, 0]) #13
newpoints.append([center2 + w * b + x, length + l * dsize / 2 + l * depth / 2 + y, 0]) #14
newpoints.append([center2 + w * b, length + l * dsize / 2 + l * depth / 2, 0]) #15
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 2, 0]) #16
newpoints.append([width-center2, length + l * dsize, 0]) #17
newpoints.append([width + center1, length + l * dsize, 0]) #18
newpoints.append([width + center1, length + l * dsize / 2 + l * depth / 2 + l * b, 0]) #19
newpoints.append([width + center1 + x, length + l * dsize / 2 + l * depth / 2 + l * b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, length + l * dsize / 2 + l * depth / 2 + y, 0]) #21
newpoints.append([width + center1 + w * b, length + l * dsize / 2 + l * depth / 2, 0]) #22
if arrow == 'Serifs1':
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #23
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #24
else:
newpoints.append([width + center1 + w * dsize, length + l * dsize / 2 + l * depth / 2, 0]) #23
newpoints.append([width + center1 + w * dsize, length + l * dsize / 2-l * depth / 2, 0]) #24
newpoints.append([width + center1, length + l * dsize / 2-l * depth / 2, 0]) #25
newpoints.append([width + center1, length, 0]) #26
newpoints.append([width + center1, 0, 0]) #27
newpoints.append([width-center2, 0, 0]) #28
newpoints.append([width-center2, length, 0]) #29
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 2-l * b, 0]) #30
newpoints.append([width-center2-x, length + l * dsize / 2-l * depth / 2-l * b-y, 0]) #31
newpoints.append([width-center2-w * b-x, length + l * dsize / 2-l * depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, length + l * dsize / 2-l * depth / 2, 0]) #33
newpoints.append([center2, length + l * dsize / 2-l * depth / 2, 0]) #34
newpoints.append([center2, length, 0]) #35
newpoints.append([center2, 0, 0]) #36
if arrow == 'Without':
newpoints.append([-center1, 0, 0]) #1
newpoints.append([-center1, length, 0]) #2
newpoints.append([-center1, length + l * dsize / 2-l * depth / 2, 0]) #5
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #6
newpoints.append([-center1-w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #7
newpoints.append([-center1, length + l * dsize / 2 + l * depth / 2, 0]) #8
newpoints.append([-center1, length + l * dsize, 0]) #11
newpoints.append([center2, length + l * dsize, 0]) #12
newpoints.append([center2, length + l * dsize / 2 + l * depth / 2, 0]) #13
newpoints.append([width-center2, length + l * dsize / 2 + l * depth / 2, 0]) #14
newpoints.append([width-center2, length + l * dsize, 0]) #15
newpoints.append([width + center1, length + l * dsize, 0]) #16
newpoints.append([width + center1, length + l * dsize / 2 + l * depth / 2, 0]) #19
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2 + l * depth / 2, 0]) #20
newpoints.append([width + center1 + w * dsize / 2, length + l * dsize / 2-l * depth / 2, 0]) #21
newpoints.append([width + center1, length + l * dsize / 2-l * depth / 2, 0]) #22
newpoints.append([width + center1, length, 0]) #25
newpoints.append([width + center1, 0, 0]) #26
newpoints.append([width-center2, 0, 0]) #27
newpoints.append([width-center2, length, 0]) #28
newpoints.append([width-center2, length + l * dsize / 2-l * depth / 2, 0]) #29
newpoints.append([center2, length + l * dsize / 2-l * depth / 2, 0]) #30
newpoints.append([center2, length, 0]) #31
newpoints.append([center2, 0, 0]) #32
return newpoints
##------------------------------------------------------------
# Dimension: Radius
def Radius(width = 2, length = 2, dsize = 1, depth = 0.1, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
w = 1
if width < 0:
w = -1
length = abs(length)
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
if arrow == 'Arrow1' or arrow == 'Arrow2':
newpoints.append([0, depth / 2, 0]) #1
newpoints.append([width, depth / 2, 0]) #2
newpoints.append([width + w * arrowlength, depth / 2 + arrowdepth, 0]) #3
if arrow == 'Arrow1':
newpoints.append([width + w * arrowlength, depth / 2, 0]) #4
else:
newpoints.append([width + w * arrowlength * 3 / 4, depth / 2, 0]) #4
newpoints.append([width + w * arrowlength + w * length, depth / 2, 0]) #5
newpoints.append([width + w * arrowlength + w * length, -depth / 2, 0]) #6
if arrow == 'Arrow1':
newpoints.append([width + w * arrowlength, -depth / 2, 0]) #7
else:
newpoints.append([width + w * arrowlength * 3 / 4, -depth / 2, 0]) #7
newpoints.append([width + w * arrowlength, -depth / 2-arrowdepth, 0]) #8
newpoints.append([width, -depth / 2, 0]) #9
newpoints.append([0, -depth / 2, 0]) #10
if arrow == 'Serifs1' or arrow == 'Serifs2':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength
newpoints.append([0, depth / 2, 0]) #1
if arrow == 'Serifs1':
newpoints.append([width-center2, depth / 2, 0]) #16
newpoints.append([width-center2, dsize / 2, 0]) #17
newpoints.append([width + center1, dsize / 2, 0]) #18
newpoints.append([width + center1, depth / 2 + b, 0]) #19
else:
newpoints.append([width + center1-w * b, depth / 2, 0]) #19
newpoints.append([width + center1 + x, depth / 2 + b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, depth / 2 + y, 0]) #21
newpoints.append([width + center1 + w * b, depth / 2, 0]) #22
newpoints.append([width + center1 + w * length, depth / 2, 0]) #23
newpoints.append([width + center1 + w * length, -depth / 2, 0]) #24
if arrow == 'Serifs1':
newpoints.append([width + center1, -depth / 2, 0]) #25
newpoints.append([width + center1, -dsize / 2, 0]) #26
newpoints.append([width-center2, -dsize / 2, 0]) #29
newpoints.append([width-center2, -depth / 2-b, 0]) #30
else:
newpoints.append([width-center2 + w * b, -depth / 2, 0]) #30
newpoints.append([width-center2-x, -depth / 2-b-y, 0]) #31
newpoints.append([width-center2-w * b-x, -depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, -depth / 2, 0]) #33
newpoints.append([0, -depth / 2, 0]) #10
if arrow == 'Without':
newpoints.append([0, depth / 2, 0]) #1
newpoints.append([width, depth / 2, 0]) #2
newpoints.append([width, -depth / 2, 0]) #9
newpoints.append([0, -depth / 2, 0]) #10
return newpoints
##------------------------------------------------------------
# Dimension: Diameter
def Diameter(width = 2, length = 2, dsize = 1, depth = 0.1, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
width = width / 2
w = 1
if width < 0:
w = -1
length = abs(length)
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
if arrow == 'Arrow1' or arrow == 'Arrow2':
newpoints.append([0, depth / 2, 0]) #1
newpoints.append([width, depth / 2, 0]) #2
newpoints.append([width + w * arrowlength, depth / 2 + arrowdepth, 0]) #3
if arrow == 'Arrow1':
newpoints.append([width + w * arrowlength, depth / 2, 0]) #4
else:
newpoints.append([width + w * arrowlength * 3 / 4, depth / 2, 0]) #4
newpoints.append([width + w * arrowlength + w * length, depth / 2, 0]) #5
newpoints.append([width + w * arrowlength + w * length, -depth / 2, 0]) #6
if arrow == 'Arrow1':
newpoints.append([width + w * arrowlength, -depth / 2, 0]) #7
else:
newpoints.append([width + w * arrowlength * 3 / 4, -depth / 2, 0]) #7
newpoints.append([width + w * arrowlength, -depth / 2-arrowdepth, 0]) #8
newpoints.append([width, -depth / 2, 0]) #9
newpoints.append([0, -depth / 2, 0]) #10
newpoints.append([-width, -depth / 2, 0]) #11
newpoints.append([-width-w * arrowlength, -depth / 2-arrowdepth, 0]) #12
if arrow == 'Arrow1':
newpoints.append([-width-w * arrowlength, -depth / 2, 0]) #13
else:
newpoints.append([-width-w * arrowlength * 3 / 4, -depth / 2, 0]) #13
newpoints.append([-width-w * arrowlength-w * length, -depth / 2, 0]) #14
newpoints.append([-width-w * arrowlength-w * length, depth / 2, 0]) #15
if arrow == 'Arrow1':
newpoints.append([-width-w * arrowlength, depth / 2, 0]) #16
else:
newpoints.append([-width-w * arrowlength * 3 / 4, depth / 2, 0]) #16
newpoints.append([-width-w * arrowlength, depth / 2 + arrowdepth, 0]) #17
newpoints.append([-width, depth / 2, 0]) #18
if arrow == 'Serifs1' or arrow == 'Serifs2':
b = sqrt(depth * depth / 2)
x = sin(radians(45)) * arrowlength * w
y = cos(radians(45)) * arrowlength
newpoints.append([0, depth / 2, 0]) #1
if arrow == 'Serifs1':
newpoints.append([width-center2, depth / 2, 0]) #16
newpoints.append([width-center2, dsize / 2, 0]) #17
newpoints.append([width + center1, dsize / 2, 0]) #18
newpoints.append([width + center1, depth / 2 + b, 0]) #19
else:
newpoints.append([width + center1-w * b, depth / 2, 0]) #19
newpoints.append([width + center1 + x, depth / 2 + b + y, 0]) #20
newpoints.append([width + center1 + w * b + x, depth / 2 + y, 0]) #21
newpoints.append([width + center1 + w * b, depth / 2, 0]) #22
newpoints.append([width + center1 + w * length, depth / 2, 0]) #23
newpoints.append([width + center1 + w * length, -depth / 2, 0]) #24
if arrow == 'Serifs1':
newpoints.append([width + center1, -depth / 2, 0]) #25
newpoints.append([width + center1, -dsize / 2, 0]) #26
newpoints.append([width-center2, -dsize / 2, 0]) #29
newpoints.append([width-center2, -depth / 2-b, 0]) #30
else:
newpoints.append([width-center2 + w * b, -depth / 2, 0]) #30
newpoints.append([width-center2-x, -depth / 2-b-y, 0]) #31
newpoints.append([width-center2-w * b-x, -depth / 2-y, 0]) #32
newpoints.append([width-center2-w * b, -depth / 2, 0]) #33
newpoints.append([0, -depth / 2, 0]) #10
if arrow == 'Serifs1':
newpoints.append([-width + center2, -depth / 2, 0]) #25
newpoints.append([-width + center2, -dsize / 2, 0]) #26
newpoints.append([-width-center1, -dsize / 2, 0]) #29
newpoints.append([-width-center1, -depth / 2-b, 0]) #30
else:
newpoints.append([-width-center1 + w * b, -depth / 2, 0]) #30
newpoints.append([-width-center1-x, -depth / 2-b-y, 0]) #31
newpoints.append([-width-center1-w * b-x, -depth / 2-y, 0]) #32
newpoints.append([-width-center1-w * b, -depth / 2, 0]) #33
newpoints.append([-width + center2-w * length, -depth / 2, 0]) #24
newpoints.append([-width + center2-w * length, depth / 2, 0]) #23
if arrow == 'Serifs1':
newpoints.append([-width-center1, depth / 2, 0]) #16
newpoints.append([-width-center1, dsize / 2, 0]) #17
newpoints.append([-width + center2, dsize / 2, 0]) #18
newpoints.append([-width + center2, depth / 2 + b, 0]) #19
else:
newpoints.append([-width + center2-w * b, depth / 2, 0]) #19
newpoints.append([-width + center2 + x, depth / 2 + b + y, 0]) #20
newpoints.append([-width + center2 + w * b + x, depth / 2 + y, 0]) #21
newpoints.append([-width + center2 + w * b, depth / 2, 0]) #22
if arrow == 'Without':
newpoints.append([0, depth / 2, 0]) #1
newpoints.append([width, depth / 2, 0]) #2
newpoints.append([width, -depth / 2, 0]) #9
newpoints.append([0, -depth / 2, 0]) #10
newpoints.append([-width, -depth / 2, 0]) #11
newpoints.append([-width, depth / 2, 0]) #18
return newpoints
##------------------------------------------------------------
# Dimension: Angular1
def Angular1(width = 2, length = 2, depth = 0.1, angle = 45, resolution = 10, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
if arrow == 'Serifs1' or arrow == 'Serifs2':
arrow = 'Without'
w = 1
if width < 0:
w = -1
if resolution == 0:
resolution = 1
if arrow == 'Without':
arrowdepth = 0.0
arrowlength = 0.0
length = abs(length)
angle = radians(angle)
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
g = hypot(width + w * length, center2)
u_depth = asin((center2) / g)
g = hypot(width, center2)
u_depth_min = asin((center2 + center2/4) / g)
g = hypot(width, arrowlength + w * center2)
u_arrow = asin((arrowlength + w * center2) / g)
if width < 0:
u_depth = -u_depth
u_depth_min = -u_depth_min
a = 1
if angle < 0 :
a = -1
u_depth = -u_depth
u_depth_min = -u_depth_min
u_arrow = -u_arrow
x = (a * center1) / tan(angle / 2)
newpoints.append([-x, -a * center1, 0]) #1
newpoints.append([width + w * length, -a * center1, 0]) #2
newpoints.append([width + w * length, a * center2, 0]) #3
if arrow == 'Without':
newpoints.append([width + w * depth / 2, a * center2, 0]) #4
else:
newpoints.append([width + w * depth / 100, a * center2, 0]) #4
g = width + w * arrowdepth + w * depth / 2
x = cos(u_arrow + u_depth) * g
y = sin(u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #5
if arrow == 'Arrow1':
g = width + w * depth / 2
x = cos(u_arrow + u_depth) * g
y = sin(u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #6
if arrow == 'Arrow2':
g = width + w * depth / 2
x = cos(u_arrow * 3 / 4 + u_depth) * g
y = sin(u_arrow * 3 / 4 + u_depth) * g
newpoints.append([x, y, 0]) #6
i = 1
while i < resolution :
u = i * (angle - u_arrow * 2 - u_depth * 2) / resolution
g = width + w * depth / 2
x = cos(u + u_arrow + u_depth) * g
y = sin(u + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #n
i += 1
if arrow == 'Arrow1':
g = width + w * depth / 2
x = cos(angle - u_arrow - u_depth) * g
y = sin(angle - u_arrow - u_depth) * g
newpoints.append([x, y, 0]) #7
if arrow == 'Arrow2':
g = width + w * depth / 2
x = cos(angle - u_arrow * 3 / 4 - u_depth) * g
y = sin(angle - u_arrow * 3 / 4 - u_depth) * g
newpoints.append([x, y, 0]) #7
u = angle - u_arrow - u_depth
g = width + w * arrowdepth + w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #8
if arrow == 'Without':
g = width + w * depth / 2
x = cos(angle-u_depth_min) * g
y = sin(angle-u_depth_min) * g
newpoints.append([x, y, 0]) #9
else:
g = width + w * depth / 100
x = cos(angle-u_depth_min) * g
y = sin(angle-u_depth_min) * g
newpoints.append([x, y, 0]) #9
if arrow == 'Without':
g = width-w * depth / 2
x = cos(angle-u_depth_min) * g
y = sin(angle-u_depth_min) * g
newpoints.append([x, y, 0]) #10
else:
g = width-w * depth / 100
x = cos(angle-u_depth_min) * g
y = sin(angle-u_depth_min) * g
newpoints.append([x, y, 0]) #10
g = width-w * arrowdepth-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #11
if arrow == 'Arrow1':
u = angle - u_arrow - u_depth
g = width-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #12
if arrow == 'Arrow2':
u = angle - u_arrow * 3 / 4 - u_depth
g = width-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #12
i = resolution - 1
while i >= 1 :
u = i * (angle - u_arrow * 2 - u_depth * 2) / resolution
g = width-w * depth / 2
x = cos(u + u_arrow + u_depth) * g
y = sin(u + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #n
i -= 1
if arrow == 'Arrow1':
g = width-w * depth / 2
x = cos(u_arrow + u_depth) * g
y = sin(u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #13
if arrow == 'Arrow2':
g = width-w * depth / 2
x = cos(u_arrow * 3 / 4 + u_depth) * g
y = sin(u_arrow * 3 / 4 + u_depth) * g
newpoints.append([x, y, 0]) #13
g = width-w * arrowdepth-w * depth / 2
x = cos(u_arrow + u_depth) * g
y = sin(u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #14
if arrow == 'Without':
newpoints.append([width-w * depth / 2, a * center2, 0]) #15
else:
newpoints.append([width-w * depth / 100, a * center2, 0]) #15
x = (a * center2) / tan(angle / 2)
newpoints.append([x, a * center2, 0]) #16
g = width + w * length
x = cos(angle-u_depth) * g
y = sin(angle-u_depth) * g
newpoints.append([x, y, 0]) #17
if center:
g = width + w * length
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #18
else:
g = width + w * length
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #18
return newpoints
##------------------------------------------------------------
# Dimension: Angular2
def Angular2(width = 2, depth = 0.1, angle = 45, resolution = 10, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
if arrow == 'Serifs1' or arrow == 'Serifs2':
arrow = 'Without'
w = 1
if width < 0:
w = -1
if resolution == 0:
resolution = 1
if arrow == 'Without':
arrowdepth = 0.0
arrowlength = 0.0
angle = radians(angle)
newpoints.append([width, 0, 0]) #1
g = hypot(width + w * depth / 2, arrowlength)
u_arrow = asin((arrowlength) / g)
if angle < 0 :
u_arrow = -u_arrow
g = width + w * arrowdepth + w * depth / 2
x = cos(u_arrow) * g
y = sin(u_arrow) * g
newpoints.append([x, y, 0]) #2
if arrow == 'Arrow1':
g = width + w * depth / 2
x = cos(u_arrow) * g
y = sin(u_arrow) * g
newpoints.append([x, y, 0]) #3
if arrow == 'Arrow2':
g = width + w * depth / 2
x = cos(u_arrow * 3 / 4) * g
y = sin(u_arrow * 3 / 4) * g
newpoints.append([x, y, 0]) #3
i = 1
while i < resolution :
u = i * (angle - u_arrow * 2) / resolution
g = width + w * depth / 2
x = cos(u + u_arrow) * g
y = sin(u + u_arrow) * g
newpoints.append([x, y, 0]) #n
i += 1
if arrow == 'Arrow1':
u = angle - u_arrow
g = width + w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #4
if arrow == 'Arrow2':
u = angle - u_arrow * 3 / 4
g = width + w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #4
u = angle - u_arrow
g = width + w * arrowdepth + w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #5
g = width
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #6
g = width-w * arrowdepth-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #7
if arrow == 'Arrow1':
u = angle - u_arrow
g = width-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #8
if arrow == 'Arrow2':
u = angle - u_arrow * 3 / 4
g = width-w * depth / 2
x = cos(u) * g
y = sin(u) * g
newpoints.append([x, y, 0]) #8
i = resolution - 1
while i > 0 :
u = i * (angle - u_arrow * 2) / resolution
g = width-w * depth / 2
x = cos(u + u_arrow) * g
y = sin(u + u_arrow) * g
newpoints.append([x, y, 0]) #n
i -= 1
if arrow == 'Arrow1':
g = width-w * depth / 2
x = cos(u_arrow) * g
y = sin(u_arrow) * g
newpoints.append([x, y, 0]) #9
if arrow == 'Arrow2':
g = width-w * depth / 2
x = cos(u_arrow * 3 / 4) * g
y = sin(u_arrow * 3 / 4) * g
newpoints.append([x, y, 0]) #9
g = width-w * arrowdepth-w * depth / 2
x = cos(u_arrow) * g
y = sin(u_arrow) * g
newpoints.append([x, y, 0]) #10
return newpoints
##------------------------------------------------------------
# Dimension: Angular3
def Angular3(width = 2, length = 2, dsize = 1, depth = 0.1, angle = 45, resolution = 10, center = False, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
if arrow == 'Serifs1' or arrow == 'Serifs2':
arrow = 'Without'
w = 1
if width < 0:
w = -1
if resolution == 0:
resolution = 1
if arrow == 'Without':
arrowdepth = 0.0
arrowlength = 0.0
resolution_2 = floor(resolution / 2)
length = abs(length)
angle = radians(angle)
if center:
center1 = w * depth / 2
center2 = w * depth / 2
else:
center1 = 0
center2 = w * depth
g = hypot(width + w * length, center2)
u_depth = asin((center2) / g)
g = hypot(width + depth / 2, center2)
u_depth_13 = asin((center2 + center2/4) / g)
g = hypot(width-depth / 2, center2)
u_depth_14 = asin((center2 + center2/4) / g)
g = hypot(width, center2)
u_depth_min = asin((center2) / g)
g = hypot(width, arrowlength + w * center2)
u_arrow = asin((arrowlength + w * center2) / g)
g = hypot(width, arrowlength + w * center2 + dsize)
u_dsize = asin((arrowlength + w * center2 + dsize) / g)
if width < 0:
u_depth = -u_depth
u_depth_min = -u_depth_min
u_depth_13 = -u_depth_13
u_depth_14 = -u_depth_14
a = 1
if angle < 0 :
a = -1
u_depth = -u_depth
u_depth_min = -u_depth_min
u_arrow = -u_arrow
u_depth_13 = -u_depth_13
u_depth_14 = -u_depth_14
x = (a * center1) / tan(angle / 2)
newpoints.append([-x, -a * center1, 0]) #1
if arrow == 'Without':
newpoints.append([width-w * depth / 2, -a * center1, 0]) #2
else:
newpoints.append([width-w * depth / 100, -a * center1, 0]) #2
g = width-w * arrowdepth-w * depth / 2
x = cos(-u_arrow-u_depth) * g
y = sin(-u_arrow-u_depth) * g
newpoints.append([x, y, 0]) #3
if arrow == 'Arrow1':
g = width-w * depth / 2
x = cos(-u_arrow-u_depth) * g
y = sin(-u_arrow-u_depth) * g
newpoints.append([x, y, 0]) #4
if arrow == 'Arrow2':
g = width-w * depth / 2
x = cos(-u_arrow * 3 / 4-u_depth) * g
y = sin(-u_arrow * 3 / 4-u_depth) * g
newpoints.append([x, y, 0]) #4
i = 1
while i < resolution_2 :
u = i * (-u_dsize) / resolution_2
g = width-w * depth / 2
x = cos(u-u_arrow) * g
y = sin(u-u_arrow) * g
newpoints.append([x, y, 0]) #n
i += 1
g = width-w * depth / 2
x = cos(-u_arrow-u_depth-u_dsize) * g
y = sin(-u_arrow-u_depth-u_dsize) * g
newpoints.append([x, y, 0]) #5
g = width + w * depth / 2
x = cos(-u_arrow-u_depth-u_dsize) * g
y = sin(-u_arrow-u_depth-u_dsize) * g
newpoints.append([x, y, 0]) #6
i = resolution_2
while i >= 1 :
u = i * (-u_dsize) / resolution_2
g = width + w * depth / 2
x = cos(u-u_arrow) * g
y = sin(u-u_arrow) * g
newpoints.append([x, y, 0]) #n
i -= 1
if arrow == 'Arrow1':
g = width + w * depth / 2
x = cos(-u_arrow-u_depth) * g
y = sin(-u_arrow-u_depth) * g
newpoints.append([x, y, 0]) #7
if arrow == 'Arrow2':
g = width + w * depth / 2
x = cos(-u_arrow * 3 / 4-u_depth) * g
y = sin(-u_arrow * 3 / 4-u_depth) * g
newpoints.append([x, y, 0]) #7
g = width + w * arrowdepth + w * depth / 2
x = cos(-u_arrow-u_depth) * g
y = sin(-u_arrow-u_depth) * g
newpoints.append([x, y, 0]) #8
if arrow == 'Without':
newpoints.append([width + w * depth / 2, -a * center1, 0]) #9
else:
newpoints.append([width + w * depth / 100, -a * center1, 0]) #9
newpoints.append([width + w * length, -a * center1, 0]) #10
newpoints.append([width + w * length, a * center2, 0]) #11
g = width + w * depth / 2
x = cos(u_depth_min) * g
y = sin(u_depth_min) * g
newpoints.append([x, y, 0]) #12
i = 1
while i < resolution :
u = i * (angle - u_depth * 2) / resolution
g = width + w * depth / 2
x = cos(u + u_depth) * g
y = sin(u + u_depth) * g
newpoints.append([x, y, 0]) #n
i += 1
if width > 0 :
g = width + w * depth / 2
x = cos(angle - u_depth_13) * g
y = sin(angle - u_depth_13) * g
newpoints.append([x, y, 0]) #13
g = width-w * depth / 2
x = cos(angle - u_depth_14) * g
y = sin(angle - u_depth_14) * g
newpoints.append([x, y, 0]) #14
else:
g = width + w * depth / 2
x = cos(angle - u_depth_14) * g
y = sin(angle - u_depth_14) * g
newpoints.append([x, y, 0]) #13
g = width-w * depth / 2
x = cos(angle - u_depth_13) * g
y = sin(angle - u_depth_13) * g
newpoints.append([x, y, 0]) #14
i = resolution - 1
while i >= 1 :
u = i * (angle - u_depth * 2) / resolution
g = width-w * depth / 2
x = cos(u + u_depth) * g
y = sin(u + u_depth) * g
newpoints.append([x, y, 0]) #n
i -= 1
g = width-w * depth / 2
x = cos(u_depth_min) * g
y = sin(u_depth_min) * g
newpoints.append([x, y, 0]) #15
x = (a * center2) / tan(angle / 2)
newpoints.append([x, a * center2, 0]) #16
g = width + w * length
x = cos(angle-u_depth) * g
y = sin(angle-u_depth) * g
newpoints.append([x, y, 0]) #17
if center:
g = width + w * length
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #18
if arrow == 'Without':
g = width + w * depth / 2
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #19
else:
g = width + w * depth / 100
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #19
else:
g = width + w * length
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #18
if arrow == 'Without':
g = width + w * depth / 2
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #19
else:
g = width + w * depth / 100
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #19
g = width + w * arrowdepth + w * depth / 2
x = cos(angle + u_arrow + u_depth) * g
y = sin(angle + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #20
if arrow == 'Arrow1':
g = width + w * depth / 2
x = cos(angle + u_arrow + u_depth) * g
y = sin(angle + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #21
if arrow == 'Arrow2':
g = width + w * depth / 2
x = cos(angle + u_arrow * 3 / 4 + u_depth) * g
y = sin(angle + u_arrow * 3 / 4 + u_depth) * g
newpoints.append([x, y, 0]) #21
i = 1
while i < resolution_2 :
u = i * (u_dsize) / resolution_2
g = width + w * depth / 2
x = cos(u + angle + u_arrow) * g
y = sin(u + angle + u_arrow) * g
newpoints.append([x, y, 0]) #n
i += 1
g = width + w * depth / 2
x = cos(angle + u_arrow + u_depth + u_dsize) * g
y = sin(angle + u_arrow + u_depth + u_dsize) * g
newpoints.append([x, y, 0]) #22
g = width-w * depth / 2
x = cos(angle + u_arrow + u_depth + u_dsize) * g
y = sin(angle + u_arrow + u_depth + u_dsize) * g
newpoints.append([x, y, 0]) #23
i = resolution_2
while i >= 1 :
u = i * (u_dsize) / resolution_2
g = width-w * depth / 2
x = cos(u + angle + u_arrow) * g
y = sin(u + angle + u_arrow) * g
newpoints.append([x, y, 0]) #n
i -= 1
if arrow == 'Arrow1':
g = width-w * depth / 2
x = cos(angle + u_arrow + u_depth) * g
y = sin(angle + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #24
if arrow == 'Arrow2':
g = width-w * depth / 2
x = cos(angle + u_arrow * 3 / 4 + u_depth) * g
y = sin(angle + u_arrow * 3 / 4 + u_depth) * g
newpoints.append([x, y, 0]) #24
g = width-w * arrowdepth-w * depth / 2
x = cos(angle + u_arrow + u_depth) * g
y = sin(angle + u_arrow + u_depth) * g
newpoints.append([x, y, 0]) #25
if center:
if arrow == 'Without':
g = width-w * depth / 2
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #26
else:
g = width-w * depth / 100
x = cos(angle + u_depth) * g
y = sin(angle + u_depth) * g
newpoints.append([x, y, 0]) #26
else:
if arrow == 'Without':
g = width-w * depth / 2
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #26
else:
g = width-w * depth / 100
x = cos(angle) * g
y = sin(angle) * g
newpoints.append([x, y, 0]) #26
return newpoints
##------------------------------------------------------------
# Dimension: Note
def Note(width = 2, length = 2, depth = 0.1, angle = 45, arrow = 'Arrow1', arrowdepth = 0.25, arrowlength = 0.25):
newpoints = []
if arrow == 'Serifs1' or arrow == 'Serifs2':
arrow = 'Without'
w = 1
if width < 0:
w = -1
angle = radians(angle)
length = abs(length)
if cos(angle) > 0:
newpoints.append([0, 0, 0]) #1
if arrow == 'Arrow1':
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #2
g = hypot(arrowlength, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #3
if arrow == 'Arrow2':
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #2
g = hypot(arrowlength * 3 / 4, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #3
if arrow == 'Without':
g = w * depth / 2
x = cos(angle + radians(90)) * g
y = sin(angle + radians(90)) * g
newpoints.append([x, y, 0]) #2
g = hypot(width, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle + u) * g
y = sin(angle) * width
newpoints.append([w * x, y + w * depth / 2, 0]) #4
newpoints.append([w * x + w * length, y + w * depth / 2, 0]) #5
newpoints.append([w * x + w * length, y-w * depth / 2, 0]) #6
g = hypot(width, depth / 2)
u = asin((depth / 2) / g)
y = sin(angle) * width
x = cos(angle-u) * g
newpoints.append([w * x, y-w * depth / 2, 0]) #7
if arrow == 'Arrow1':
g = hypot(arrowlength, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #8
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #9
if arrow == 'Arrow2':
g = hypot(arrowlength * 3 / 4, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #8
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #9
if arrow == 'Without':
g = -w * depth / 2
x = cos(angle + radians(90)) * g
y = sin(angle + radians(90)) * g
newpoints.append([x, y, 0]) #6
else:
newpoints.append([0, 0, 0]) #1
if arrow == 'Arrow1':
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #2
g = hypot(arrowlength, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #3
if arrow == 'Arrow2':
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #2
g = hypot(arrowlength * 3 / 4, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle-u) * g
y = sin(angle-u) * g
newpoints.append([w * x, y, 0]) #3
if arrow == 'Without':
g = -w * depth / 2
x = cos(angle + radians(90)) * g
y = sin(angle + radians(90)) * g
newpoints.append([x, y, 0]) #2
g = hypot(width, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle-u) * g
y = sin(angle) * width
newpoints.append([w * x, y + w * depth / 2, 0]) #4
newpoints.append([w * x-w * length, y + w * depth / 2, 0]) #5
newpoints.append([w * x-w * length, y-w * depth / 2, 0]) #6
g = hypot(width, depth / 2)
u = asin((depth / 2) / g)
y = sin(angle) * width
x = cos(angle + u) * g
newpoints.append([w * x, y-w * depth / 2, 0]) #7
if arrow == 'Arrow1':
g = hypot(arrowlength, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #8
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #9
if arrow == 'Arrow2':
g = hypot(arrowlength * 3 / 4, depth / 2)
u = asin((depth / 2) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #8
g = hypot(arrowlength, depth / 2 + arrowdepth)
u = asin((depth / 2 + arrowdepth) / g)
x = cos(angle + u) * g
y = sin(angle + u) * g
newpoints.append([w * x, y, 0]) #9
if arrow == 'Without':
g = w * depth / 2
x = cos(angle + radians(90)) * g
y = sin(angle + radians(90)) * g
newpoints.append([x, y, 0]) #6
return newpoints
##------------------------------------------------------------
# make and set Material
def makeMaterial(name, diffuse, specular, alpha):
mat = bpy.data.materials.new(name)
mat.diffuse_color = diffuse
#mat.diffuse_shader = 'LAMBERT'
#mat.diffuse_intensity = 1.0
mat.specular_color = specular
#mat.specular_shader = 'COOKTORR'
mat.specular_intensity = 0.0
mat.roughness = 0.0
#mat.alpha = alpha
#mat.ambient = 1
#mat.specular_hardness = 1
#mat.use_shadeless = True
return mat
def setMaterial(ob, mat):
me = ob.data
me.materials.append(mat)
def ablength(x1 = 0.0, y1 = 0.0, z1 = 0.0, x2 = 0.0, y2 = 0.0, z2 = 0.0):
return sqrt( (x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2 )
##------------------------------------------------------------
# calculates the matrix for the new object
# depending on user pref
def align_matrix(context, location):
loc = Matrix.Translation(location)
obj_align = context.preferences.edit.object_align
if (context.space_data.type == 'VIEW_3D'
and obj_align == 'VIEW'):
rot = context.space_data.region_3d.view_matrix.to_3x3().inverted().to_4x4()
else:
rot = Matrix()
align_matrix = loc @ rot
return align_matrix
##------------------------------------------------------------
#### Curve creation functions
# sets bezierhandles to auto
def setBezierHandles(obj, mode = 'VECTOR'):
view_layer = bpy.context.view_layer
if obj.type != 'CURVE':
return
view_layer.objects.active = obj
bpy.ops.object.mode_set(mode = 'EDIT', toggle = True)
bpy.ops.curve.select_all(action = 'SELECT')
bpy.ops.curve.handle_type_set(type = mode)
bpy.ops.object.mode_set(mode = 'OBJECT', toggle = True)
view_layer.update()
##------------------------------------------------------------
#### Add units
def addUnits(stext, units):
scale = bpy.context.scene.unit_settings.scale_length
unit_system = bpy.context.scene.unit_settings.system
separate_units = bpy.context.scene.unit_settings.use_separate
if unit_system == 'METRIC':
if units == 'None': scale_steps = 1
if units == '\u00b5m': scale_steps = 1000000
if units == 'mm': scale_steps = 1000
if units == 'cm': scale_steps = 100
if units == 'm': scale_steps = 1
if units == 'km': scale_steps = 1/1000
if units == 'thou': scale_steps = 36000 * 1.0936133
if units == '"': scale_steps = 36 * 1.0936133
if units == '\'': scale_steps = 3 * 1.0936133
if units == 'yd': scale_steps = 1 * 1.0936133
if units == 'mi': scale_steps = 1/1760 * 1.0936133
dval = stext * scale_steps * scale
elif unit_system == 'IMPERIAL':
if units == 'None': scale_steps = 3 * 1.0936133
if units == '\u00b5m': scale_steps = 1000000
if units == 'mm': scale_steps = 1000
if units == 'cm': scale_steps = 100
if units == 'm': scale_steps = 1
if units == 'km': scale_steps = 1/1000
if units == 'thou': scale_steps = 36000 * 1.0936133
if units == '"': scale_steps = 36 * 1.0936133
if units == '\'': scale_steps = 3 * 1.0936133
if units == 'yd': scale_steps = 1 * 1.0936133
if units == 'mi': scale_steps = 1/1760 * 1.0936133
dval = stext * scale_steps * scale
else:
dval = stext
return dval
##------------------------------------------------------------
# create new CurveObject from vertarray and splineType
def createCurve(vertArray, self, align_matrix):
# options to vars
name = self.Dimension_Type # Type as name
# create curve
newCurve = bpy.data.curves.new(name, type = 'CURVE') # curvedatablock
newSpline = newCurve.splines.new('BEZIER') # spline
newSpline.bezier_points.add(int(len(vertArray) * 0.333333333))
newSpline.bezier_points.foreach_set('co', vertArray)
# set curveOptions
newCurve.dimensions = '2D'
newCurve.fill_mode = 'BOTH'
newSpline.use_cyclic_u = True
newSpline.use_endpoint_u = True
# create object with newCurve
DimensionCurve = bpy.data.objects.new(name, newCurve) # object
bpy.context.collection.objects.link(DimensionCurve) # place in active scene
DimensionCurve["Dimension"] = True
DimensionCurve.matrix_world = align_matrix # apply matrix
self.Dimension_Name = DimensionCurve.name
# creat DimensionText and rotation
w = 1
if self.Dimension_width < 0 :
w = -1
l = 1
if self.Dimension_length < 0 :
l = -1
x = self.Dimension_width / 2
y = self.Dimension_length + l * self.Dimension_dsize / 2 + self.Dimension_depth / 2 + self.Dimension_textdepth
gettextround = int(self.Dimension_textround)
stext = addUnits(self.Dimension_width, self.Dimension_units)
stext = abs(round(stext, gettextround))
if gettextround == 0:
stext = abs(int(stext))
align = 'CENTER'
offset_y = 0
if self.Dimension_Type == 'Linear-2':
y = self.Dimension_depth / 2 + self.Dimension_textdepth
if self.Dimension_Type == 'Radius':
x = self.Dimension_width + w * self.Dimension_dsize / 2 + w * abs(self.Dimension_length) / 2
y = self.Dimension_depth / 2 + self.Dimension_textdepth
if self.Dimension_Type == 'Diameter':
x = 0
y = self.Dimension_depth / 2 + self.Dimension_textdepth
g = hypot(x, y)
c = self.Dimension_startlocation
u = asin(y / g)
if self.Dimension_width < 0 :
u = radians(180) - u
xx = cos(u) * g
yy = sin(u) * g
stext = str(stext)
if self.Dimension_units != 'None' and self.Dimension_add_units_name:
stext += self.Dimension_units
if self.Dimension_Type == 'Angular1' or self.Dimension_Type == 'Angular2' or self.Dimension_Type == 'Angular3':
xx = cos(radians(self.Dimension_angle / 2)) * (self.Dimension_width + w * self.Dimension_depth / 2 + w * self.Dimension_textdepth)
yy = sin(radians(self.Dimension_angle / 2)) * (self.Dimension_width + w * self.Dimension_depth / 2 + w * self.Dimension_textdepth)
system_rotation = bpy.context.scene.unit_settings.system_rotation
if system_rotation == 'DEGREES':
stext = abs(round(self.Dimension_angle, gettextround))
if gettextround == 0:
stext = abs(int(stext))
stext = str(stext) + '°'
else:
stext = abs(round(self.Dimension_angle * pi / 180, gettextround))
if gettextround == 0:
stext = abs(int(stext))
stext = str(stext)
align = 'LEFT'
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'RIGHT'
if self.Dimension_width < 0 :
offset_y = 0
align = 'RIGHT'
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'LEFT'
if self.Dimension_Type == 'Note':
if cos(radians(self.Dimension_angle)) > 0:
xx = cos(radians(self.Dimension_angle)) * (self.Dimension_width) + l * w * self.Dimension_depth / 2 + l * w * self.Dimension_textdepth
yy = sin(radians(self.Dimension_angle)) * (self.Dimension_width) + w * self.Dimension_depth / 2 + w * self.Dimension_textdepth
stext = self.Dimension_note
align = 'LEFT'
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'RIGHT'
if self.Dimension_width < 0 :
align = 'RIGHT'
xx = cos(radians(self.Dimension_angle)) * (self.Dimension_width) + l * w * self.Dimension_depth / 2 + l * w * self.Dimension_textdepth
yy = sin(radians(self.Dimension_angle)) * (self.Dimension_width) - w * self.Dimension_depth / 2 - w * self.Dimension_textdepth
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'LEFT'
else:
xx = cos(radians(self.Dimension_angle)) * (self.Dimension_width) - l * w * self.Dimension_depth / 2 - l * w * self.Dimension_textdepth
yy = sin(radians(self.Dimension_angle)) * (self.Dimension_width) + w * self.Dimension_depth / 2 + w * self.Dimension_textdepth
stext = self.Dimension_note
align = 'RIGHT'
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'LEFT'
if self.Dimension_width < 0 :
align = 'LEFT'
xx = cos(radians(self.Dimension_angle)) * (self.Dimension_width) - l * w * self.Dimension_depth / 2 - l * w * self.Dimension_textdepth
yy = sin(radians(self.Dimension_angle)) * (self.Dimension_width) - w * self.Dimension_depth / 2 - w * self.Dimension_textdepth
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
align = 'RIGHT'
if self.Dimension_liberty == '2D':
tv = Vector((xx, yy, 0))
DimensionText = addText(stext, tv, self.Dimension_textsize, align, offset_y, self.Dimension_font)
if self.Dimension_XYZType == 'TOP' or self.Dimension_XYZType == 'BOTTOM':
DimensionCurve.rotation_euler[0] = radians(0)
DimensionCurve.rotation_euler[1] = radians(0)
if self.Dimension_XYType == 'X':
DimensionCurve.rotation_euler[2] = radians(self.Dimension_rotation)
DimensionCurve.location[1] += self.Dimension_offset
if self.Dimension_XYType == 'Y':
DimensionCurve.rotation_euler[2] = radians(90+self.Dimension_rotation)
DimensionCurve.location[0] += self.Dimension_offset
if self.Dimension_XYZType == 'FRONT' or self.Dimension_XYZType == 'BACK':
DimensionCurve.rotation_euler[0] = radians(90)
if self.Dimension_XZType == 'X':
DimensionCurve.rotation_euler[1] = -radians(self.Dimension_rotation)
DimensionCurve.location[1] += self.Dimension_offset
if self.Dimension_XZType == 'Z':
DimensionCurve.rotation_euler[1] = -radians(90+self.Dimension_rotation)
DimensionCurve.location[0] += self.Dimension_offset
DimensionCurve.rotation_euler[2] = radians(0)
if self.Dimension_XYZType == 'RIGHT' or self.Dimension_XYZType == 'LEFT':
DimensionCurve.rotation_euler[0] = radians(90)
if self.Dimension_YZType == 'Y':
DimensionCurve.rotation_euler[1] = -radians(self.Dimension_rotation)
DimensionCurve.location[0] += self.Dimension_offset
if self.Dimension_YZType == 'Z':
DimensionCurve.rotation_euler[1] = -radians(90+self.Dimension_rotation)
DimensionCurve.location[1] += self.Dimension_offset
DimensionCurve.rotation_euler[2] = radians(90)
if self.Dimension_XYZType == 'TOP' or self.Dimension_XYZType == 'FRONT' or self.Dimension_XYZType == 'RIGHT':
DimensionText.rotation_euler[1] = radians(0)
if self.Dimension_XYZType == 'BOTTOM' or self.Dimension_XYZType == 'BACK' or self.Dimension_XYZType == 'LEFT':
DimensionText.rotation_euler[1] = radians(180)
if self.Dimension_width_or_location == 'location':
if self.Dimension_Type == 'Angular1' or self.Dimension_Type == 'Angular2' or self.Dimension_Type == 'Angular3':
vx = self.Dimension_endlocation.x - self.Dimension_startlocation.x
vy = self.Dimension_endlocation.y - self.Dimension_startlocation.y
vz = self.Dimension_endlocation.z - self.Dimension_startlocation.z
if self.Dimension_XYZType == 'TOP' or self.Dimension_XYZType == 'BOTTOM':
g = hypot(vx, vy)
if g != 0 :
u2 = acos(vx / g)
u1 = asin(vy / g)
if u1 < 0 :
u2 = u1
else:
u2 = 0
DimensionCurve.rotation_euler[2] = u2
if self.Dimension_XYZType == 'FRONT' or self.Dimension_XYZType == 'BACK':
g = hypot(vx, vz)
if g != 0 :
u2 = acos(vx / g)
u1 = asin(vz / g)
if u1 < 0 :
u2 = u1
else:
u2 = 0
DimensionCurve.rotation_euler[1] = -u2
if self.Dimension_XYZType == 'RIGHT' or self.Dimension_XYZType == 'LEFT':
g = hypot(vy, vz)
if g != 0 :
u2 = acos(vy / g)
u1 = asin(vz / g)
if u1 < 0 :
u2 = u1
else:
u2 = 0
DimensionCurve.rotation_euler[1] = -u2
if self.Dimension_liberty == '3D':
tv = Vector((xx, yy, 0))
DimensionText = addText(stext, tv, self.Dimension_textsize, align, offset_y, self.Dimension_font)
v = self.Dimension_endlocation - self.Dimension_startlocation
if v.length != 0 :
u1 = -asin(v[2] / v.length)
else:
u1 = 0
g = hypot(v[0], v[1])
if g != 0 :
u2 = asin(v[1] / g)
if self.Dimension_endlocation.x < self.Dimension_startlocation.x :
u2 = radians(180)-asin(v[1] / g)
else:
u2 = 0
DimensionCurve.rotation_euler[0] = radians(self.Dimension_rotation)
DimensionCurve.rotation_euler[1] = u1
DimensionCurve.rotation_euler[2] = u2
# Align to view
if self.Dimension_align_to_camera :
obj_camera = bpy.context.scene.camera
DimensionCurve.rotation_euler[0] = obj_camera.rotation_euler[0]
DimensionCurve.rotation_euler[1] = obj_camera.rotation_euler[1]
DimensionCurve.rotation_euler[2] = obj_camera.rotation_euler[2]
# set materials
if self.Dimension_matname in bpy.data.materials :
setMaterial(DimensionCurve, bpy.data.materials[self.Dimension_matname])
setMaterial(DimensionText, bpy.data.materials[self.Dimension_matname])
else:
red = makeMaterial(self.Dimension_matname, (1, 0, 0, 0), (1, 0, 0), 1)
setMaterial(DimensionCurve, red)
setMaterial(DimensionText, red)
setBezierHandles(DimensionCurve, 'VECTOR')
setBezierHandles(DimensionText, 'VECTOR')
group_name = 'Dimensions'
bpy.ops.object.mode_set(mode = 'OBJECT')
if group_name in bpy.data.collections:
group = bpy.data.collections[group_name]
else:
group = bpy.data.collections.new(group_name)
if not DimensionCurve.name in group.objects:
group.objects.link(DimensionCurve)
if not DimensionText.name in group.objects:
group.objects.link(DimensionText)
DimensionText.parent = DimensionCurve
if self.Dimension_appoint_parent and not self.Dimension_parent == '':
const = DimensionCurve.constraints.new(type='CHILD_OF')
const.target = bpy.data.objects[self.Dimension_parent]
const.inverse_matrix = bpy.data.objects[self.Dimension_parent].matrix_world.inverted()
bpy.context.view_layer.update()
bpy.ops.object.select_all(action='DESELECT')
DimensionCurve.select_set(True)
DimensionText.select_set(True)
bpy.context.view_layer.objects.active = DimensionCurve
bpy.context.view_layer.update()
DimensionCurve["Dimension_Name"] = self.Dimension_Name
DimensionCurve["Dimension_Type"] = self.Dimension_Type
DimensionCurve["Dimension_XYZType"] = self.Dimension_XYZType
DimensionCurve["Dimension_XYType"] = self.Dimension_XYType
DimensionCurve["Dimension_XZType"] = self.Dimension_XZType
DimensionCurve["Dimension_YZType"] = self.Dimension_YZType
DimensionCurve["Dimension_startlocation"] = c
DimensionCurve["Dimension_endlocation"] = self.Dimension_endlocation
DimensionCurve["Dimension_endanglelocation"] = self.Dimension_endanglelocation
DimensionCurve["Dimension_width_or_location"] = self.Dimension_width_or_location
DimensionCurve["Dimension_liberty"] = self.Dimension_liberty
DimensionCurve["Dimension_Change"] = False
#### Dimension properties
DimensionCurve["Dimension_resolution"] = self.Dimension_resolution
DimensionCurve["Dimension_width"] = self.Dimension_width
DimensionCurve["Dimension_length"] = self.Dimension_length
DimensionCurve["Dimension_dsize"] = self.Dimension_dsize
DimensionCurve["Dimension_depth"] = self.Dimension_depth
DimensionCurve["Dimension_depth_from_center"] = self.Dimension_depth_from_center
DimensionCurve["Dimension_angle"] = self.Dimension_angle
DimensionCurve["Dimension_rotation"] = self.Dimension_rotation
DimensionCurve["Dimension_offset"] = self.Dimension_offset
#### Dimension text properties
DimensionCurve["Dimension_textsize"] = self.Dimension_textsize
DimensionCurve["Dimension_textdepth"] = self.Dimension_textdepth
DimensionCurve["Dimension_textround"] = self.Dimension_textround
DimensionCurve["Dimension_font"] = self.Dimension_font
#### Dimension Arrow properties
DimensionCurve["Dimension_arrow"] = self.Dimension_arrow
DimensionCurve["Dimension_arrowdepth"] = self.Dimension_arrowdepth
DimensionCurve["Dimension_arrowlength"] = self.Dimension_arrowlength
#### Materials properties
DimensionCurve["Dimension_matname"] = self.Dimension_matname
#### Note properties
DimensionCurve["Dimension_note"] = self.Dimension_note
DimensionCurve["Dimension_align_to_camera"] = self.Dimension_align_to_camera
#### Parent
DimensionCurve["Dimension_parent"] = self.Dimension_parent
DimensionCurve["Dimension_appoint_parent"] = self.Dimension_appoint_parent
#### Units
DimensionCurve["Dimension_units"] = self.Dimension_units
DimensionCurve["Dimension_add_units_name"] = self.Dimension_add_units_name
return
##------------------------------------------------------------
# Main Function
def main(self, align_matrix):
# deselect all objects
bpy.ops.object.select_all(action = 'DESELECT')
# options
Type = self.Dimension_Type
if self.Dimension_width_or_location == 'location':
if self.Dimension_liberty == '2D':
if self.Dimension_XYZType == 'TOP':
if self.Dimension_XYType == 'X':
self.Dimension_width = self.Dimension_endlocation[0] - self.Dimension_startlocation[0]
if self.Dimension_XYType == 'Y':
self.Dimension_width = self.Dimension_endlocation[1] - self.Dimension_startlocation[1]
if self.Dimension_XYZType == 'FRONT':
if self.Dimension_XZType == 'X':
self.Dimension_width = self.Dimension_endlocation[0] - self.Dimension_startlocation[0]
if self.Dimension_XZType == 'Z':
self.Dimension_width = self.Dimension_endlocation[2] - self.Dimension_startlocation[2]
if self.Dimension_XYZType == 'RIGHT':
if self.Dimension_YZType == 'Y':
self.Dimension_width = self.Dimension_endlocation[1] - self.Dimension_startlocation[1]
if self.Dimension_YZType == 'Z':
self.Dimension_width = self.Dimension_endlocation[2] - self.Dimension_startlocation[2]
if self.Dimension_XYZType == 'BOTTOM':
if self.Dimension_XYType == 'X':
self.Dimension_width = self.Dimension_endlocation[0] - self.Dimension_startlocation[0]
if self.Dimension_XYType == 'Y':
self.Dimension_width = self.Dimension_endlocation[1] - self.Dimension_startlocation[1]
if self.Dimension_XYZType == 'BACK':
if self.Dimension_XZType == 'X':
self.Dimension_width = self.Dimension_endlocation[0] - self.Dimension_startlocation[0]
if self.Dimension_XZType == 'Z':
self.Dimension_width = self.Dimension_endlocation[2] - self.Dimension_startlocation[2]
if self.Dimension_XYZType == 'LEFT':
if self.Dimension_YZType == 'Y':
self.Dimension_width = self.Dimension_endlocation[1] - self.Dimension_startlocation[1]
if self.Dimension_YZType == 'Z':
self.Dimension_width = self.Dimension_endlocation[2] - self.Dimension_startlocation[2]
if self.Dimension_liberty == '3D':
v = self.Dimension_endlocation - self.Dimension_startlocation
self.Dimension_width = v.length
if Type == 'Angular1' or Type == 'Angular2' or Type == 'Angular3':
a = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
b = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
c = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
self.Dimension_width = max(a, b, c)
if self.Dimension_XYZType == 'TOP' or self.Dimension_XYZType == 'BOTTOM':
if self.Angle_Type == 'A':
c = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
b = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, 0)
a = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
if self.Angle_Type == 'B':
a = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
c = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, 0)
b = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
if self.Angle_Type == 'C':
b = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
a = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, 0, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, 0)
c = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, 0)
if self.Dimension_XYZType == 'FRONT' or self.Dimension_XYZType == 'BACK':
if self.Angle_Type == 'A':
c = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
b = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z)
a = ablength(self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
if self.Angle_Type == 'B':
a = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
c = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z)
b = ablength(self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
if self.Angle_Type == 'C':
b = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
a = ablength(self.Dimension_startlocation.x, 0, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z)
c = ablength(self.Dimension_endanglelocation.x, 0, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, 0, self.Dimension_endlocation.z)
if self.Dimension_XYZType == 'RIGHT' or self.Dimension_XYZType == 'LEFT':
if self.Angle_Type == 'A':
c = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
b = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
a = ablength(0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if self.Angle_Type == 'B':
a = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
c = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
b = ablength(0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if self.Angle_Type == 'C':
b = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
a = ablength(0, self.Dimension_startlocation.y, self.Dimension_startlocation.z, 0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
c = ablength(0, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, 0, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if self.Dimension_liberty == '3D':
if self.Angle_Type == 'A':
c = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
b = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
a = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if self.Angle_Type == 'B':
a = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
c = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
b = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if self.Angle_Type == 'C':
b = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
a = ablength(self.Dimension_startlocation.x, self.Dimension_startlocation.y, self.Dimension_startlocation.z, self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z)
c = ablength(self.Dimension_endanglelocation.x, self.Dimension_endanglelocation.y, self.Dimension_endanglelocation.z, self.Dimension_endlocation.x, self.Dimension_endlocation.y, self.Dimension_endlocation.z)
if b != 0 and c != 0 :
self.Dimension_angle = degrees(acos((b**2 + c**2 - a**2)/(2*b*c)))
else:
self.Dimension_angle = 0
#
if self.Dimension_width == 0:
return {'FINISHED'}
# get verts
if Type == 'Linear-1':
verts = Linear1(self.Dimension_width,
self.Dimension_length,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Linear-2':
verts = Linear2(self.Dimension_width,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Linear-3':
verts = Linear3(self.Dimension_width,
self.Dimension_length,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Radius':
verts = Radius(self.Dimension_width,
self.Dimension_length,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Diameter':
verts = Diameter(self.Dimension_width,
self.Dimension_length,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Angular1':
if self.Dimension_angle == 0:
return {'FINISHED'}
verts = Angular1(self.Dimension_width,
self.Dimension_length,
self.Dimension_depth,
self.Dimension_angle,
self.Dimension_resolution,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Angular2':
if self.Dimension_angle == 0:
return {'FINISHED'}
verts = Angular2(self.Dimension_width,
self.Dimension_depth,
self.Dimension_angle,
self.Dimension_resolution,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Angular3':
if self.Dimension_angle == 0:
return {'FINISHED'}
verts = Angular3(self.Dimension_width,
self.Dimension_length,
self.Dimension_dsize,
self.Dimension_depth,
self.Dimension_angle,
self.Dimension_resolution,
self.Dimension_depth_from_center,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
if Type == 'Note':
verts = Note(self.Dimension_width,
self.Dimension_length,
self.Dimension_depth,
self.Dimension_angle,
self.Dimension_arrow,
self.Dimension_arrowdepth,
self.Dimension_arrowlength)
vertArray = []
# turn verts into array
for v in verts:
vertArray += v
# create object
createCurve(vertArray, self, align_matrix)
return
#### Delete dimension group
def DimensionDelete(self, context):
bpy.context.view_layer.update()
bpy.ops.object.mode_set(mode = 'OBJECT')
bpy.ops.object.select_grouped(extend=True, type='CHILDREN_RECURSIVE')
bpy.ops.object.delete()
bpy.context.view_layer.update()
return
class Dimension(bpy.types.Operator):
''''''
bl_idname = "curve.dimension"
bl_label = "Dimension"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
bl_description = "add dimension"
#settings : bpy.props.PointerProperty(type=DimensionVariables)
# align_matrix for the invoke
align_matrix : Matrix()
Dimension : BoolProperty(name = "Dimension",
default = True,
description = "dimension")
#### change properties
Dimension_Name : StringProperty(name = "Name",
description = "Name")
Dimension_Change : BoolProperty(name = "Change",
default = False,
description = "change dimension")
Dimension_Delete : StringProperty(name = "Delete",
description = "Delete dimension")
#### general properties
Types = [('Linear-1', 'Linear-1', 'Linear-1'),
('Linear-2', 'Linear-2', 'Linear-2'),
('Linear-3', 'Linear-3', 'Linear-3'),
('Radius', 'Radius', 'Radius'),
('Diameter', 'Diameter', 'Diameter'),
('Angular1', 'Angular1', 'Angular1'),
('Angular2', 'Angular2', 'Angular2'),
('Angular3', 'Angular3', 'Angular3'),
('Note', 'Note', 'Note')]
Dimension_Type : EnumProperty(name = "Type",
description = "Form of Curve to create",
items = Types)
ATypes = [('A', 'A', 'A'),
('B', 'B', 'B'),
('C', 'C', 'C')]
Angle_Type : EnumProperty(name = "Angle",
description = "Select corne ABC",
items = ATypes)
XYZTypes = [
('TOP', 'Top', 'TOP'),
('FRONT', 'Front', 'FRONT'),
('RIGHT', 'Right', 'RIGHT'),
('BOTTOM', 'Bottom', 'BOTTOM'),
('BACK', 'Back', 'BACK'),
('LEFT', 'Left', 'LEFT')]
Dimension_XYZType : EnumProperty(name = "Coordinate system",
description = "Place in a coordinate system",
items = XYZTypes)
XYTypes = [
('X', 'X', 'X'),
('Y', 'Y', 'Y')]
Dimension_XYType : EnumProperty(name = "XY",
description = "XY",
items = XYTypes)
XZTypes = [
('X', 'X', 'X'),
('Z', 'Z', 'Z')]
Dimension_XZType : EnumProperty(name = "XZ",
description = "XZ",
items = XZTypes)
YZTypes = [
('Y', 'Y', 'Y'),
('Z', 'Z', 'Z')]
Dimension_YZType : EnumProperty(name = "YZ",
description = "YZ",
items = YZTypes)
Dimension_startlocation : FloatVectorProperty(name = "",
description = "Start location",
default = (0.0, 0.0, 0.0),
subtype = 'XYZ')
Dimension_endlocation : FloatVectorProperty(name = "",
description = "End location",
default = (2.0, 2.0, 2.0),
subtype = 'XYZ')
Dimension_endanglelocation : FloatVectorProperty(name = "",
description = "End angle location",
default = (4.0, 4.0, 4.0),
subtype = 'XYZ')
width_or_location_items = [
('width', 'width', 'width'),
('location', 'location', 'location')]
Dimension_width_or_location : EnumProperty(name = "width or location",
items = width_or_location_items,
description = "width or location")
libertyItems = [
('2D', '2D', '2D'),
('3D', '3D', '3D')]
Dimension_liberty : EnumProperty(name = "2D / 3D",
items = libertyItems,
description = "2D or 3D Dimension")
### Arrow
Arrows = [
('Arrow1', 'Arrow1', 'Arrow1'),
('Arrow2', 'Arrow2', 'Arrow2'),
('Serifs1', 'Serifs1', 'Serifs1'),
('Serifs2', 'Serifs2', 'Serifs2'),
('Without', 'Without', 'Without')]
Dimension_arrow : EnumProperty(name = "Arrow",
items = Arrows,
description = "Arrow")
Dimension_arrowdepth : FloatProperty(name = "Depth",
default = 0.1,
min = 0, soft_min = 0,
description = "Arrow depth")
Dimension_arrowlength : FloatProperty(name = "Length",
default = 0.25,
min = 0, soft_min = 0,
description = "Arrow length")
#### Dimension properties
Dimension_resolution : IntProperty(name = "Resolution",
default = 10,
min = 1, soft_min = 1,
description = "Resolution")
Dimension_width : FloatProperty(name = "Width",
default = 2,
unit = 'LENGTH',
description = "Width")
Dimension_length : FloatProperty(name = "Length",
default = 2,
description = "Length")
Dimension_dsize : FloatProperty(name = "Size",
default = 1,
min = 0, soft_min = 0,
description = "Size")
Dimension_depth : FloatProperty(name = "Depth",
default = 0.1,
min = 0, soft_min = 0,
description = "Depth")
Dimension_depth_from_center : BoolProperty(name = "Depth from center",
default = False,
description = "Depth from center")
Dimension_angle : FloatProperty(name = "Angle",
default = 45,
description = "Angle")
Dimension_rotation : FloatProperty(name = "Rotation",
default = 0,
description = "Rotation")
Dimension_offset : FloatProperty(name = "Offset",
default = 0,
description = "Offset")
#### Dimension units properties
Units = [
('None', 'None', 'None'),
('\u00b5m', '\u00b5m', '\u00b5m'),
('mm', 'mm', 'mm'),
('cm', 'cm', 'cm'),
('m', 'm', 'm'),
('km', 'km', 'km'),
('thou', 'thou', 'thou'),
('"', '"', '"'),
('\'', '\'', '\''),
('yd', 'yd', 'yd'),
('mi', 'mi', 'mi')]
Dimension_units : EnumProperty(name = "Units",
items = Units,
description = "Units")
Dimension_add_units_name : BoolProperty(name = "Add units name",
default = False,
description = "Add units name")
#### Dimension text properties
Dimension_textsize : FloatProperty(name = "Size",
default = 1,
description = "Size")
Dimension_textdepth : FloatProperty(name = "Depth",
default = 0.2,
description = "Depth")
Dimension_textround : IntProperty(name = "Rounding",
default = 2,
min = 0, soft_min = 0,
description = "Rounding")
Dimension_font : StringProperty(name = "Font",
default = '',
subtype = 'FILE_PATH',
description = "Font")
#### Materials properties
Dimension_matname : StringProperty(name = "Name",
default = 'Dimension_Red',
description = "Material name")
#### Note properties
Dimension_note : StringProperty(name = "Note",
default = 'Note',
description = "Note text")
Dimension_align_to_camera : BoolProperty(name = "Align to camera",
default = False,
description = "Align to camera")
TMP_startlocation : FloatVectorProperty(name = "",
description = "Start location",
default = (0.0, 0.0, 0.0),
subtype = 'XYZ')
TMP_endlocation : FloatVectorProperty(name = "",
description = "Start location",
default = (2.0, 2.0, 2.0),
subtype = 'XYZ')
TMP_endanglelocation : FloatVectorProperty(name = "",
description = "Start location",
default = (4.0, 4.0, 4.0),
subtype = 'XYZ')
#### Parent
Dimension_parent : StringProperty(name = "Parent",
default = '',
description = "Parent")
Dimension_appoint_parent : BoolProperty(name = "Appoint parent",
default = False,
description = "Appoint parent")
##### DRAW #####
def draw(self, context):
layout = self.layout
# general options
col = layout.column()
col.prop(self, 'Dimension_Type')
# options per Type Linear-1(width = 2, length = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Linear-1':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_depth_from_center')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_offset')
# options per Type Linear-2(width = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Linear-2':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_offset')
# options per Type Linear-3(width = 2, length = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Linear-3':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_depth_from_center')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_offset')
# options per Type Radius(width = 2, length = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Radius':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_rotation')
# options per Type Diameter(width = 2, length = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Diameter':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_rotation')
# options per Type Angular1(width = 2, dsize = 1, depth = 0.1, angle = 45)
if self.Dimension_Type == 'Angular1':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_angle')
else:
row.prop(self, 'Dimension_endlocation')
col = layout.column()
col.label(text = "End angle location:")
row = layout.row()
row.prop(self, 'Dimension_endanglelocation')
row = layout.row()
row.prop(self, 'Angle_Type')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_width')
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_depth_from_center')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_resolution')
# options per Type Angular2(width = 2, dsize = 1, depth = 0.1, angle = 45)
if self.Dimension_Type == 'Angular2':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_angle')
else:
row.prop(self, 'Dimension_endlocation')
col = layout.column()
col.label(text = "End angle location:")
row = layout.row()
row.prop(self, 'Dimension_endanglelocation')
row = layout.row()
row.prop(self, 'Angle_Type')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_width')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_resolution')
# options per Type Angular3(width = 2, dsize = 1, depth = 0.1, angle = 45)
if self.Dimension_Type == 'Angular3':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_angle')
else:
row.prop(self, 'Dimension_endlocation')
col = layout.column()
col.label(text = "End angle location:")
row = layout.row()
row.prop(self, 'Dimension_endanglelocation')
row = layout.row()
row.prop(self, 'Angle_Type')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_width')
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_dsize')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_depth_from_center')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_resolution')
# options per Type Note(width = 2, length = 2, dsize = 1, depth = 0.1)
if self.Dimension_Type == 'Note':
row = layout.row()
row.prop(self, 'Dimension_width_or_location', expand = True)
col = layout.column()
col.label(text = "End location:")
row = layout.row()
if self.Dimension_width_or_location == 'width':
row.prop(self, 'Dimension_width')
else:
row.prop(self, 'Dimension_endlocation')
box = layout.box()
box.label(text="Options")
box.prop(self, 'Dimension_length')
box.prop(self, 'Dimension_depth')
box.prop(self, 'Dimension_angle')
box.prop(self, 'Dimension_rotation')
box.prop(self, 'Dimension_note')
box.prop(self, 'Dimension_offset')
col = layout.column()
row = layout.row()
row.prop(self, 'Dimension_align_to_camera')
col = layout.column()
row = layout.row()
row.prop(self, 'Dimension_liberty', expand = True)
if self.Dimension_liberty == '2D':
col = layout.column()
col.label(text="Coordinate system")
row = layout.row()
row.prop(self, 'Dimension_XYZType', expand = True)
if self.Dimension_XYZType == 'TOP' or self.Dimension_XYZType == 'BOTTOM':
row = layout.row()
row.prop(self, 'Dimension_XYType', expand = True)
if self.Dimension_XYZType == 'FRONT' or self.Dimension_XYZType == 'BACK':
row = layout.row()
row.prop(self, 'Dimension_XZType', expand = True)
if self.Dimension_XYZType == 'RIGHT' or self.Dimension_XYZType == 'LEFT':
row = layout.row()
row.prop(self, 'Dimension_YZType', expand = True)
col = layout.column()
col.label(text="Start location:")
row = layout.row()
row.prop(self, 'Dimension_startlocation')
box = layout.box()
box.prop(self, 'Dimension_units')
box.prop(self, 'Dimension_add_units_name')
if not self.Dimension_parent == '':
box = layout.box()
box.prop(self, 'Dimension_appoint_parent')
box = layout.box()
box.label(text="Text Options")
box.prop(self, 'Dimension_textsize')
box.prop(self, 'Dimension_textdepth')
box.prop(self, 'Dimension_textround')
box.prop(self, 'Dimension_font')
box = layout.box()
box.label(text="Arrow Options")
box.prop(self, 'Dimension_arrow')
box.prop(self, 'Dimension_arrowdepth')
box.prop(self, 'Dimension_arrowlength')
box = layout.box()
box.label(text="Material Option")
box.prop(self, 'Dimension_matname')
##### POLL #####
@classmethod
def poll(cls, context):
return context.scene != None
##### EXECUTE #####
def execute(self, context):
if self.Dimension_Change:
DimensionDelete(self, context)
#go to object mode
if bpy.ops.object.mode_set.poll():
bpy.ops.object.mode_set(mode = 'OBJECT')
bpy.context.view_layer.update()
# main function
self.align_matrix = align_matrix(context, self.Dimension_startlocation)
main(self, self.align_matrix)
return {'FINISHED'}
##### INVOKE #####
def invoke(self, context, event):
bpy.context.view_layer.update()
if self.Dimension_Change:
bpy.context.scene.cursor.location = self.Dimension_startlocation
else:
if self.Dimension_width_or_location == 'width':
self.Dimension_startlocation = bpy.context.scene.cursor.location
if self.Dimension_width_or_location == 'location':
if (self.Dimension_endlocation[2] - self.Dimension_startlocation[2]) != 0 :
self.Dimension_XYZType = 'FRONT'
self.Dimension_XZType = 'Z'
if (self.Dimension_endlocation[1] - self.Dimension_startlocation[1]) != 0 :
self.Dimension_XYZType = 'TOP'
self.Dimension_XYType = 'Y'
if (self.Dimension_endlocation[0] - self.Dimension_startlocation[0]) != 0 :
self.Dimension_XYZType = 'TOP'
self.Dimension_XYType = 'X'
self.align_matrix = align_matrix(context, self.Dimension_startlocation)
self.execute(context)
return {'FINISHED'}
#location update
def StartLocationUpdate(self, context):
bpy.context.scene.cursor.location = self.Dimension_startlocation
return
# ### MENU append ###
def Dimension_object_menu(self, context):
bl_label = 'Dimension'
obj = context.object
layout = self.layout
if 'Dimension' in obj.keys():
props = layout.operator("curve.dimension", text="Change Dimension")
props.Dimension_Change = True
props.Dimension_Delete = obj.name
props.Dimension_width_or_location = obj["Dimension_width_or_location"]
props.Dimension_startlocation = obj.location
props.Dimension_endlocation = obj["Dimension_endlocation"]
props.Dimension_endanglelocation = obj["Dimension_endanglelocation"]
props.Dimension_liberty = obj["Dimension_liberty"]
props.Dimension_Type = obj["Dimension_Type"]
props.Dimension_XYZType = obj["Dimension_XYZType"]
props.Dimension_XYType = obj["Dimension_XYType"]
props.Dimension_XZType = obj["Dimension_XZType"]
props.Dimension_YZType = obj["Dimension_YZType"]
props.Dimension_resolution = obj["Dimension_resolution"]
props.Dimension_width = obj["Dimension_width"]
props.Dimension_length = obj["Dimension_length"]
props.Dimension_dsize = obj["Dimension_dsize"]
props.Dimension_depth = obj["Dimension_depth"]
props.Dimension_depth_from_center = obj["Dimension_depth_from_center"]
props.Dimension_angle = obj["Dimension_angle"]
props.Dimension_rotation = obj["Dimension_rotation"]
props.Dimension_offset = 0
props.Dimension_textsize = obj["Dimension_textsize"]
props.Dimension_textdepth = obj["Dimension_textdepth"]
props.Dimension_textround = obj["Dimension_textround"]
props.Dimension_font = obj["Dimension_font"]
props.Dimension_matname = obj["Dimension_matname"]
props.Dimension_note = obj["Dimension_note"]
props.Dimension_align_to_camera = obj["Dimension_align_to_camera"]
props.Dimension_arrow = obj["Dimension_arrow"]
props.Dimension_arrowdepth = obj["Dimension_arrowdepth"]
props.Dimension_arrowlength = obj["Dimension_arrowlength"]
props.Dimension_parent = obj["Dimension_parent"]
props.Dimension_appoint_parent = obj["Dimension_appoint_parent"]
props.Dimension_units = obj["Dimension_units"]
props.Dimension_add_units_name = obj["Dimension_add_units_name"]
layout.separator()
vertex = []
for obj in context.selected_objects :
if obj.type == 'MESH':
for i in obj.data.vertices :
if i.select :
vertex.append(obj.matrix_world @ i.co)
if obj.type == 'CURVE':
for i in obj.data.splines :
for j in i.bezier_points :
if j.select_control_point :
vertex.append(obj.matrix_world @ j.co)
if len(vertex) == 1:
startvertex = vertex[0]
endvertex = bpy.context.scene.cursor.location
props1 = layout.operator("curve.dimension", text = 'Add linear note')
props1.Dimension_Change = False
props1.Dimension_Type = 'Note'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D note')
props2.Dimension_Change = False
props2.Dimension_Type = 'Note'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
props3 = layout.operator("curve.dimension", text = 'Add linear dimension')
props3.Dimension_Change = False
props3.Dimension_Type = 'Linear-1'
props3.Dimension_width_or_location = 'location'
props3.Dimension_startlocation = endvertex
props3.Dimension_endlocation = startvertex
props3.Dimension_liberty = '2D'
props3.Dimension_rotation = 0
props3.Dimension_parent = obj.name
props4 = layout.operator("curve.dimension", text = 'Add 3D dimension')
props4.Dimension_Change = False
props4.Dimension_Type = 'Linear-1'
props4.Dimension_width_or_location = 'location'
props4.Dimension_startlocation = endvertex
props4.Dimension_endlocation = startvertex
props4.Dimension_liberty = '3D'
props4.Dimension_rotation = 0
props4.Dimension_parent = obj.name
props7 = layout.operator("curve.dimension", text = 'Add linear radius')
props7.Dimension_Change = False
props7.Dimension_Type = 'Radius'
props7.Dimension_width_or_location = 'location'
props7.Dimension_startlocation = endvertex
props7.Dimension_endlocation = startvertex
props7.Dimension_liberty = '2D'
props7.Dimension_rotation = 0
props7.Dimension_parent = obj.name
props8 = layout.operator("curve.dimension", text = 'Add 3D radius')
props8.Dimension_Change = False
props8.Dimension_Type = 'Radius'
props8.Dimension_width_or_location = 'location'
props8.Dimension_startlocation = endvertex
props8.Dimension_endlocation = startvertex
props8.Dimension_liberty = '3D'
props8.Dimension_rotation = 0
props8.Dimension_parent = obj.name
props9 = layout.operator("curve.dimension", text = 'Add linear diameter')
props9.Dimension_Change = False
props9.Dimension_Type = 'Diameter'
props9.Dimension_width_or_location = 'location'
props9.Dimension_startlocation = endvertex
props9.Dimension_endlocation = startvertex
props9.Dimension_liberty = '2D'
props9.Dimension_rotation = 0
props9.Dimension_parent = obj.name
props10 = layout.operator("curve.dimension", text = 'Add 3D diameter')
props10.Dimension_Change = False
props10.Dimension_Type = 'Diameter'
props10.Dimension_width_or_location = 'location'
props10.Dimension_startlocation = endvertex
props10.Dimension_endlocation = startvertex
props10.Dimension_liberty = '3D'
props10.Dimension_rotation = 0
props10.Dimension_parent = obj.name
if len(vertex) == 2:
startvertex = vertex[0]
endvertex = vertex[1]
if endvertex[0] < startvertex[0]:
startvertex = vertex[1]
endvertex = vertex[0]
props1 = layout.operator("curve.dimension", text = 'Add linear dimension')
props1.Dimension_Change = False
props1.Dimension_Type = 'Linear-1'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_endlocation = endvertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D dimension')
props2.Dimension_Change = False
props2.Dimension_Type = 'Linear-1'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_endlocation = endvertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
props3 = layout.operator("curve.dimension", text = 'Add linear radius')
props3.Dimension_Change = False
props3.Dimension_Type = 'Radius'
props3.Dimension_width_or_location = 'location'
props3.Dimension_startlocation = startvertex
props3.Dimension_endlocation = endvertex
props3.Dimension_liberty = '2D'
props3.Dimension_rotation = 0
props3.Dimension_parent = obj.name
props4 = layout.operator("curve.dimension", text = 'Add 3D radius')
props4.Dimension_Change = False
props4.Dimension_Type = 'Radius'
props4.Dimension_width_or_location = 'location'
props4.Dimension_startlocation = startvertex
props4.Dimension_endlocation = endvertex
props4.Dimension_liberty = '3D'
props4.Dimension_rotation = 0
props4.Dimension_parent = obj.name
props5 = layout.operator("curve.dimension", text = 'Add linear diameter')
props5.Dimension_Change = False
props5.Dimension_Type = 'Diameter'
props5.Dimension_width_or_location = 'location'
props5.Dimension_startlocation = startvertex
props5.Dimension_endlocation = endvertex
props5.Dimension_liberty = '2D'
props5.Dimension_rotation = 0
props5.Dimension_parent = obj.name
props6 = layout.operator("curve.dimension", text = 'Add 3D diameter')
props6.Dimension_Change = False
props6.Dimension_Type = 'Diameter'
props6.Dimension_width_or_location = 'location'
props6.Dimension_startlocation = startvertex
props6.Dimension_endlocation = endvertex
props6.Dimension_liberty = '3D'
props6.Dimension_rotation = 0
props6.Dimension_parent = obj.name
if len(vertex) == 3:
startvertex = vertex[0]
endvertex = vertex[1]
endanglevertex = vertex[2]
if endvertex[0] < startvertex[0]:
startvertex = vertex[1]
endvertex = vertex[0]
props1 = layout.operator("curve.dimension", text = 'Add Linear angle dimension')
props1.Dimension_Change = False
props1.Dimension_Type = 'Angular1'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_endlocation = endvertex
props1.Dimension_endanglelocation = endanglevertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D angle dimension')
props2.Dimension_Change = False
props2.Dimension_Type = 'Angular1'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_endlocation = endvertex
props2.Dimension_endanglelocation = endanglevertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
def Dimension_edit_menu(self, context):
bl_label = 'Dimension'
obj = context.object
layout = self.layout
vertex = []
for i in obj.data.vertices :
if i.select :
vertex.append(obj.matrix_world @ i.co)
if len(vertex) == 1:
startvertex = vertex[0]
endvertex = bpy.context.scene.cursor.location
props1 = layout.operator("curve.dimension", text = 'Add linear note')
props1.Dimension_Change = False
props1.Dimension_Type = 'Note'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D note')
props2.Dimension_Change = False
props2.Dimension_Type = 'Note'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
props3 = layout.operator("curve.dimension", text = 'Add linear dimension')
props3.Dimension_Change = False
props3.Dimension_Type = 'Linear-1'
props3.Dimension_width_or_location = 'location'
props3.Dimension_startlocation = endvertex
props3.Dimension_endlocation = startvertex
props3.Dimension_liberty = '2D'
props3.Dimension_rotation = 0
props3.Dimension_parent = obj.name
props4 = layout.operator("curve.dimension", text = 'Add 3D dimension')
props4.Dimension_Change = False
props4.Dimension_Type = 'Linear-1'
props4.Dimension_width_or_location = 'location'
props4.Dimension_startlocation = endvertex
props4.Dimension_endlocation = startvertex
props4.Dimension_liberty = '3D'
props4.Dimension_rotation = 0
props4.Dimension_parent = obj.name
props7 = layout.operator("curve.dimension", text = 'Add linear radius')
props7.Dimension_Change = False
props7.Dimension_Type = 'Radius'
props7.Dimension_width_or_location = 'location'
props7.Dimension_startlocation = endvertex
props7.Dimension_endlocation = startvertex
props7.Dimension_liberty = '2D'
props7.Dimension_rotation = 0
props7.Dimension_parent = obj.name
props8 = layout.operator("curve.dimension", text = 'Add 3D radius')
props8.Dimension_Change = False
props8.Dimension_Type = 'Radius'
props8.Dimension_width_or_location = 'location'
props8.Dimension_startlocation = endvertex
props8.Dimension_endlocation = startvertex
props8.Dimension_liberty = '3D'
props8.Dimension_rotation = 0
props8.Dimension_parent = obj.name
props9 = layout.operator("curve.dimension", text = 'Add linear diameter')
props9.Dimension_Change = False
props9.Dimension_Type = 'Diameter'
props9.Dimension_width_or_location = 'location'
props9.Dimension_startlocation = endvertex
props9.Dimension_endlocation = startvertex
props9.Dimension_liberty = '2D'
props9.Dimension_rotation = 0
props9.Dimension_parent = obj.name
props10 = layout.operator("curve.dimension", text = 'Add 3D diameter')
props10.Dimension_Change = False
props10.Dimension_Type = 'Diameter'
props10.Dimension_width_or_location = 'location'
props10.Dimension_startlocation = endvertex
props10.Dimension_endlocation = startvertex
props10.Dimension_liberty = '3D'
props10.Dimension_rotation = 0
props10.Dimension_parent = obj.name
if len(vertex) == 2:
startvertex = vertex[0]
endvertex = vertex[1]
if endvertex[0] < startvertex[0]:
startvertex = vertex[1]
endvertex = vertex[0]
props1 = layout.operator("curve.dimension", text = 'Add linear dimension')
props1.Dimension_Change = False
props1.Dimension_Type = 'Linear-1'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_endlocation = endvertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D dimension')
props2.Dimension_Change = False
props2.Dimension_Type = 'Linear-1'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_endlocation = endvertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
props3 = layout.operator("curve.dimension", text = 'Add linear radius')
props3.Dimension_Change = False
props3.Dimension_Type = 'Radius'
props3.Dimension_width_or_location = 'location'
props3.Dimension_startlocation = startvertex
props3.Dimension_endlocation = endvertex
props3.Dimension_liberty = '2D'
props3.Dimension_rotation = 0
props3.Dimension_parent = obj.name
props4 = layout.operator("curve.dimension", text = 'Add 3D radius')
props4.Dimension_Change = False
props4.Dimension_Type = 'Radius'
props4.Dimension_width_or_location = 'location'
props4.Dimension_startlocation = startvertex
props4.Dimension_endlocation = endvertex
props4.Dimension_liberty = '3D'
props4.Dimension_rotation = 0
props4.Dimension_parent = obj.name
props5 = layout.operator("curve.dimension", text = 'Add linear diameter')
props5.Dimension_Change = False
props5.Dimension_Type = 'Diameter'
props5.Dimension_width_or_location = 'location'
props5.Dimension_startlocation = startvertex
props5.Dimension_endlocation = endvertex
props5.Dimension_liberty = '2D'
props5.Dimension_rotation = 0
props5.Dimension_parent = obj.name
props6 = layout.operator("curve.dimension", text = 'Add 3D diameter')
props6.Dimension_Change = False
props6.Dimension_Type = 'Diameter'
props6.Dimension_width_or_location = 'location'
props6.Dimension_startlocation = startvertex
props6.Dimension_endlocation = endvertex
props6.Dimension_liberty = '3D'
props6.Dimension_rotation = 0
props6.Dimension_parent = obj.name
if len(vertex) == 3:
startvertex = vertex[0]
endvertex = vertex[1]
endanglevertex = vertex[2]
if endvertex[0] < startvertex[0]:
startvertex = vertex[1]
endvertex = vertex[0]
props1 = layout.operator("curve.dimension", text = 'Add Linear angle dimension')
props1.Dimension_Change = False
props1.Dimension_Type = 'Angular1'
props1.Dimension_width_or_location = 'location'
props1.Dimension_startlocation = startvertex
props1.Dimension_endlocation = endvertex
props1.Dimension_endanglelocation = endanglevertex
props1.Dimension_liberty = '2D'
props1.Dimension_rotation = 0
props1.Dimension_parent = obj.name
props2 = layout.operator("curve.dimension", text = 'Add 3D angle dimension')
props2.Dimension_Change = False
props2.Dimension_Type = 'Angular1'
props2.Dimension_width_or_location = 'location'
props2.Dimension_startlocation = startvertex
props2.Dimension_endlocation = endvertex
props2.Dimension_endanglelocation = endanglevertex
props2.Dimension_liberty = '3D'
props2.Dimension_rotation = 0
props2.Dimension_parent = obj.name
def Dimension_button(self, context):
oper = self.layout.operator(Dimension.bl_idname, text = "Dimension", icon = "PLUGIN")
oper.Dimension_Change = False
oper.Dimension_width_or_location = 'width'
oper.Dimension_liberty = '2D'
################################################################################
##### REGISTER #####
classes = [
Dimension,
]
def register():
from bpy.utils import register_class
for cls in classes:
register_class(cls)
bpy.types.VIEW3D_MT_curve_add.append(Dimension_button)
bpy.types.VIEW3D_MT_object_context_menu.prepend(Dimension_object_menu)
bpy.types.VIEW3D_MT_edit_mesh_context_menu.append(Dimension_edit_menu)
def unregister():
bpy.types.VIEW3D_MT_edit_mesh_context_menu.remove(Dimension_edit_menu)
bpy.types.VIEW3D_MT_object_context_menu.remove(Dimension_object_menu)
bpy.types.VIEW3D_MT_curve_add.remove(Dimension_button)
from bpy.utils import unregister_class
for cls in reversed(classes):
unregister_class(cls)
if __name__ == "__main__":
register()