Back to SDS/2 Parametric Scripts
## Basis3D.py Version
1.04 (module macrolib.Basis3D)
## Copyright (c) 2006
Bruce Vaughan, BV Detailing & Design, Inc.
## All rights
reserved.
## NOT FOR
############################################################################
"""
Class BasisTransToGlobal
Given 3 counter-clockwise non-collinear
points, define an orthonormal basis in 3D space (the
local basis).
Calculate the global point, a vector in the
standard basis set, given a displacement vector in the local basis.
The object type of the displacement vector
'vR' is 'point'.
An instance translate
method can be called:
ref_pt + instance.translate(x, y, z) -->
global coordinate point object
Method 'translate'
example usage:
pt = global
point origin of translation to be calculated (example: mem.left.location)
a = class instance
x, y, and z
are offsets from pt in the local basis
pt + a.translate(x, y, z)
Class BasisTransToLocal
Given 3 counter-clockwise non-collinear
points, define an orthonormal basis.
Given a fourth point in the standard basis
set, calculate the local coordinate in the defined basis.
Method 'trans_to_local'
example usage:
a = class instance (defines local
basis)
x, y, and z
are floats corresponding to global coordinate
a.trans_to_local(x,
y, z) --> local point in local basis defined by class instance 'a'
Version 1.01 (
Version 1.02 (
Add trans_to_local
method to BasisTransToLocal
Version 1.03 (
Version 1.04 (
__str__
method is inherited from Plane3D.
"""
from macrolib.ExceptWarn import formatExceptionInfo
from macrolib.P3D import Plane3D
from param import Warning
from point import Point
from macrolib.fifDim import fifDim
def
chk_type(p_list):
for p in p_list:
if not isinstance(p, type(Point(0,0,0))):
return
False
return True
class BasisTransToGlobal(Plane3D):
def __init__(self,
vN, vA, vB,
vR=Point(0,0,0)):
self.vN = vN
self.vA = vA
self.vB = vB
self.vR = vR
# local basis
aligned with plane defined
Plane3D.__init__(self,
vN, vA, vB)
if chk_type([vR, ]):
if self.N_len > 0.0:
# Unit vector normal to defined
plane, local basis 'Z'
self.N
= self.N_uv
# Unit vector between vN and vA,
local basis 'X'
self.A
= self.d0
# Unit cross product vector,
local basis 'Y'
self.B
= self.cross_product(self.N, self.A)
# global
coordinate vector
self.R
= self.translate(vR.x, vR.y,
vR.z) + vN
else:
Warning("The
points are collinear ***INVALID***")
self.R
= None
else:
raise TypeError, "Arguments must be <type
'point'>"
def
translate(self, X, Y, Z):
def determinant3(a,b,c,m,n,k,u,v,w):
return
a*n*w + b*k*u + m*v*c - c*n*u - b*m*w - a*k*v
A, B, N = self.A,
self.B, self.N
M = (X*X + Y*Y + Z*Z)**0.5
# vR
normalized
if M > 0:
X1, Y1, Z1 = X/M, Y/M, Z/M
else:
X1, Y1, Z1 = 0.0, 0.0, 0.0
D = determinant3(A.x, A.y, A.z,
N.x, N.y, N.z, B.x, B.y,
B.z)
Dx =
determinant3(X1, A.y, A.z,
Z1, N.y, N.z, Y1, B.y, B.z)
Dy = determinant3(A.x, X1, A.z, N.x, Z1, N.z,
B.x, Y1, B.z)
Dz = determinant3(A.x, A.y, X1, N.x, N.y,
Z1, B.x, B.y, Y1)
# resultant
unit vector R1
R1 = Point(Dx/D, Dy/D, Dz/D)
# global
coordinate vector with respect to local basis origin
return
Point(R1.x*M, R1.y*M, R1.z*M)
def __repr__(self):
return
'BasisTransToGlobal(Point(%s), Point(%s), Point(%s), Point(%s))' % (self.vN, self.vA, self.vB, self.vR)
def version(self):
"Basis3D.BasisTransToGlobal
Version 1.03"
##
END BasisTransToGlobal()
##########################################################
class BasisTransToLocal(Plane3D):
def __init__(self,
vN, vA, vB,
R1=Point(0,0,0)):
# local basis
aligned with plane defined
Plane3D.__init__(self,
vN, vA, vB)
self.vN = vN
self.vA = vA
self.vB = vB
self.R1 = R1
if chk_type([R1, ]):
if self.N_len > 0.0:
# Unit vector normal to defined
plane, local basis 'Z'
self.N
= self.N_uv
# Unit vector between vN and vA,
local basis "X"
self.A
= self.d0
# Unit cross product vector,
local basis "Y"
self.B
= self.cross_product(self.N, self.A)
# instance
attribute 'P' is the local coordinate vector
self.P
= self.trans_to_local(R1.x, R1.y, R1.z)
else:
Warning("The
points are collinear ***INVALID***")
self.P
= None
else:
raise TypeError, "Arguments must be <type
'point'>"
def dot_product(self, p1, p2):
return
(p1.x*p2.x + p1.y*p2.y + p1.z*p2.z)
def trans_to_local(self, X, Y, Z):
R = Point(X, Y, Z) - self.vN
# Vector projection of: R along vA, R along vB,
R along vN
return Point(self.dot_product(R, self.A), self.dot_product(R, self.B), self.dot_product(R, self.N))
def __repr__(self):
return
'BasisTransToLocal(Point(%s), Point(%s), Point(%s), Point(%s))' % (self.vN, self.vA, self.vB, self.R1)
def version(self):
"Basis3D.BasisTransToLocal Version
1.03"
##
END BasisTransToGlobal()
##########################################################
def
test_BasisTransToGlobal():
from macrolib.ExceptWarn import formatExceptionInfo
from macrolib.PrintPtList import formatPtList
from macrolib.PrintDict import formatDict
from param import Dialog, dim_print,
Warning, ResponseNotOK, Units
from point import
Point, PointLocate
import os
Units("feet")
try:
dlg1 = Dialog("Translate
to Global in an Orthogonal Basis")
dlg1.group_title("Orthonormal Basis and Resultant Unit Vector")
image_path = os.path.join(os.getcwd(), "macro", "Images")
image_name = os.path.join(image_path, "Basis3D_XYZ.gif")
dlg1.image(image_name)
dlg1.group_title("Translation
Vector")
dlg1.entry('distX', dim_print(60.0),
"Enter translate 'X' direction")
dlg1.entry('distY', dim_print(30.0),
"Enter translate 'Y' direction")
dlg1.entry('distZ', dim_print(0.0),
"Enter translate 'Z' direction")
try:
dlg1.done()
except ResponseNotOK:
raise StandardError, "User Cancelled"
pt1 = PointLocate("Pick point
1 (Basis 0,0,0)")
pt2 = PointLocate("Pick point
2 (Basis 'X')")
pt3 = PointLocate("Pick point
3 to define plane")
pt4 = Point(dlg1.distX,
dlg1.distY, dlg1.distZ)
except:
Warning(formatExceptionInfo())
else:
if pt1 and pt2
and pt3 and pt4:
a = BasisTransToGlobal(pt1,
pt2, pt3, pt4)
if a.R:
Warning(formatPtList("Resultant Global Point:", [a.R, ]))
print formatPtList("Local Basis Origin:", [pt1, ])
print formatPtList("Local Basis Translate Vector:",
[pt4, ])
print formatPtList("Resultant Global Point:", [a.R, ])
print formatDict("BasisTransToGlobal Instance
Dictionary:", a.__dict__)
# print
formatDict("Local Dictionary:", locals())
print formatPtList("Resultant Global Points Calculated With
Method 'translate':",
[pt1+a.translate(12, 12, 0), pt1+a.translate(13, 13, 0), \
pt1+a.translate(14, 14, -3)])
print
dir(a)
print
print a
print
print repr(a)
##
END test_BasisTransToGlobal() ##########################
def
test_BasisTransToLocal():
from macrolib.ExceptWarn import formatExceptionInfo
from macrolib.PrintPtList import formatPtList
from macrolib.PrintDict import formatDict
from param import Warning, Units, dim_print
from point import
Point, PointLocate
Units("feet")
try:
pt1 = PointLocate("Pick point
1 (Basis 0,0,0)")
pt2 = PointLocate("Pick point
2 (Basis 'X')")
pt3 = PointLocate("Pick point
3 to define plane")
pt4 = PointLocate("Pick point
4 and determine local basis coordinates")
except:
Warning(formatExceptionInfo())
else:
a = BasisTransToLocal(pt1,
pt2, pt3)
if a.P:
Warning(formatPtList("Global
Point(0,0,0) --> Local Basis Point(0,0,0):", [a.P,
]))
print formatPtList("Global
Point(0,0,0) --> Local Basis Point(0,0,0):", [a.P,
])
print formatPtList("Selected Global Point (%s, %s, %s)
--> Resultant Local Point:" % \
(dim_print(pt4.x),
dim_print(pt4.y), dim_print(pt4.z)),
\
[a.trans_to_local(pt4.x, pt4.y, pt4.z),
])
print formatDict("BasisTransToLocal Instance
Dictionary:", a.__dict__)
print formatDict("Local Dictionary:", locals())
print formatPtList("Resultant Local Points Calculated With
Method 'trans_to_local':",
[a.trans_to_local(12,
12, 0), a.trans_to_local(13, 13, 0), \
a.trans_to_local(14,
14, -3)])
print
print
dir(a)
print
print a
print
print repr(a)
##
END test_BasisTransToLocal() ##########################
if
__name__ == '__main__':
try:
#test_BasisTransToGlobal()
test_BasisTransToLocal()
finally:
del
BasisTransToGlobal
del
BasisTransToLocal
"""
Output from test_BasisTransToGlobal()
Local
Basis Origin:
X
attribute Y attribute Z attribute
============================================================
31-1
3/4 32-4 1/2 988-6 1/8
Local
Basis Translate Vector:
X
attribute Y attribute Z attribute
============================================================
5-0 2-6 1-0
Resultant
Global Point:
X
attribute Y attribute Z attribute
============================================================
35-10
7/16 35-6 1/4 988-7 3/4
BasisTransToGlobal
Instance Dictionary:
Key
= A Value = 0.834688, 0.353974,
-0.421898
Key
= B Value = 0, 0.766081, 0.642744
Key
= D Value = -37814556.9835
Key
= F Value =
Key
= G Value =
Key
= N Value = 0.550723, -0.53649,
0.639439
Key
= N_len
Value = 4987.071941
Key
= N_uv
Value = 0.550723, -0.53649, 0.639439
Key
= Q Value = 1.96714819484
Key
= R Value =
Key
= Ra Value =
Key
= d Value = 83.60451, 35.454928,
-42.258426
Key
= d0 Value = 0.834688, 0.353974,
-0.421898
Key
= e Value = -17.392406, 30.767261,
40.793163
Key
= e0 Value = -0.322236, 0.570038,
0.755792
Key
= k Value = 37814556.9835
Key
= k0 Value = 7582.516842
Key
= p1 Value =
Key
= p2 Value =
Key
= p3 Value =
Key
= pp Value =
Key
= vA Value =
Key
= vB
Value =
Key
= vN
Value =
Key
= vR
Value = 60, 30, 12
Resultant
Global Points Calculated With Method 'translate':
X
attribute Y attribute Z attribute
============================================================
31-11
13/16 33-5 15/16 988-8 3/4
32-0
5/8 33-7 1/16 988-8 15/16
31-11
13/16 33-9 3/4 988-7 1/4
['A',
'B', 'D', 'F', 'G', 'N', 'N_len', 'N_uv', 'PointRotate3D', 'Q', 'R', 'Ra', '__class__', '__delattr__', '__dict__',
'__doc__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__',
'__str__', '__weakref__', 'cross_product', 'd', 'd0', 'dot_product',
'e', 'e0', 'k', 'k0', 'lie_check', 'p1', 'p2', 'p3',
'plane_2', 'plane_3', 'plane_def', 'pp', 'three_pt_circle', 'translate', 'vA',
'vB', 'vN', 'vR', 'version']
Instance
of Class BasisTransToGlobal - Plane Definition Data:
Normal Unit Vector - 0.5507, -0.5365, 0.6394
Displacement from Model Origin - 7582.5168
Plane
Origin and Unit Vector Points:
Origin point - 31'-1 3/4, 32'-4 1/2, 988'-6
1/8
Unit Vector d0 - 0.8347, 0.3540, -0.4219
Unit Vector e0 - -0.3222, 0.5700, 0.7558
BasisTransToGlobal(Point(373.772672,
"""
"""
Output from test_BasisTransToLocal()
Global
Point(0,0,0) --> Local Basis Point(0,0,0):
X
attribute Y attribute Z attribute
============================================================
379-7
1/8 -660-1 7/8 -631-10 1/2
Selected
Global Point (37-3 7/8, 39-8 9/16, 989-4 3/16) --> Resultant Local Point:
X
attribute Y attribute Z attribute
============================================================
7-4
3/4 6-1 15/16 0
BasisTransToLocal
Instance Dictionary:
Key
= A Value = 0.834688, 0.353974,
-0.421898
Key
= B Value = 0, 0.766081, 0.642744
Key
= D Value = -129165559.229
Key
= F Value =
Key
= G Value =
Key
= N Value = 0.550723, -0.53649,
0.639439
Key
= N_len
Value = 17034.655105
Key
= N_uv
Value = 0.550723, -0.53649, 0.639439
Key
= P Value = 4555.104174,
-7921.895658, -7582.516842
Key
= Q Value = 1.16249738903
Key
= R1 Value = 0, 0, 0
Key
= Ra Value =
Key
= d Value = 83.60451, 35.454928,
-42.258426
Key
= d0 Value = 0.834688, 0.353974,
-0.421898
Key
= e Value = 61.411363,
Key
= e0 Value = 0.331412, 0.843652,
0.422394
Key
= k Value = 129165559.229
Key
= k0 Value = 7582.516842
Key
= p1 Value =
Key
= p2 Value =
Key
= p3 Value =
Key
= pp Value =
Key
= vA Value =
Key
= vB
Value =
Key
= vN
Value =
Local
Dictionary:
Key
= Point Value =
<built-in function Point>
Key
= PointLocate Value = <built-in function PointLocate>
Key
= Units Value =
<built-in function Units>
Key
= Warning Value =
<built-in function Warning>
Key
= a Value = Instance
of Class BasisTransToLocal - Plane Definition Data:
Normal Unit Vector - 0.5507, -0.5365, 0.6394
Displacement from Model Origin - 7582.5168
Plane
Origin and Unit Vector Points:
Origin point - 31'-1 3/4, 32'-4 1/2, 988'-6
1/8
Unit Vector d0 - 0.8347, 0.3540, -0.4219
Unit Vector e0 - 0.3314, 0.8437, 0.4224
Key
= dim_print Value = <built-in function dim_print>
Key
= formatDict Value = <function formatDict at 0x06491764>
Key
= formatExceptionInfo Value = <function formatExceptionInfo
at 0x064403AC>
Key
= formatPtList Value = <function formatPtList at 0x06491DBC>
Key
= pt1 Value =
Key
= pt2 Value =
Key
= pt3 Value =
Key
= pt4 Value =
Resultant
Local Points Calculated With Method 'trans_to_local':
X
attribute Y attribute Z attribute
============================================================
380-9
3/8 -659-4 11/16 -631-10 3/8
380-10
9/16 -659-3 15/16 -631-10 5/16
381-1 -659-5 1/8 -632-0 1/4
['A',
'B', 'D', 'F', 'G', 'N', 'N_len', 'N_uv', 'P', 'PointRotate3D', 'Q', 'R1', 'Ra', '__class__',
'__delattr__', '__dict__',
'__doc__', '__getattribute__', '__hash__',
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__',
'__str__', '__weakref__', 'cross_product', 'd', 'd0', 'dot_product',
'e', 'e0', 'k', 'k0', 'lie_check', 'p1', 'p2', 'p3',
'plane_2', 'plane_3', 'plane_def', 'pp', 'three_pt_circle', 'trans_to_local',
'vA', 'vB', 'vN', 'version']
Instance
of Class BasisTransToLocal - Plane Definition Data:
Normal Unit Vector - 0.5507, -0.5365, 0.6394
Displacement from Model Origin - 7582.5168
Plane
Origin and Unit Vector Points:
Origin point - 31'-1 3/4, 32'-4 1/2, 988'-6
1/8
Unit Vector d0 - 0.8347, 0.3540, -0.4219
Unit Vector e0 - 0.3314, 0.8437, 0.4224
BasisTransToLocal(Point(373.772672,
"""
“””
Script Basis3D_XYZ demonstrating
class BasisTransToGlobal and its translate() method
“””
## Basis3D_XYZ.py
Version 1.01
## Copyright (c) 2006
Bruce Vaughan, BV Detailing & Design, Inc.
## All rights reserved.
## NOT FOR
############################################################################
"""
Define a plane in 3D space by picking 3
counter-clockwise non-collinear points.
Line p1p2 defines the 'X' axis of an
orthogonal basis.
Translate X, Y, and Z
dimensions in the orthogonal basis and return a global point.
Display information in Report Viewer.
Add miscellaneous members to represent the orthonormal basis and the calculated resultant unit vector.
A basis which is also an orthonormal set of vectors (ie
every pair of vectors is orthogonal, and every
vector has
magnitude 1) is called an orthonormal basis.
Revision History:
Version 1.00 (
Version 1.01 (
"""
def
run_script():
from
macrolib.Basis3D import BasisTransToGlobal
from macrolib.ExceptWarn import formatExceptionInfo
from macrolib.P3D
import Plane3D
from macrolib.PolarPt import PolarPt3D
from macrolib.PrintPtList import formatPtList
from macrolib.PrintDict import formatDict
from param import Warning, yes_or_no, dim_print, Prompt, Units, Dialog, ResponseNotOK
from point import
Point, PointLocate
from rnd_bar import RndBar
from member import
Member
import os
Units("feet")
#######################################################
def add_RP(pt1, pt2, mk=""):
# cannot assign existing = "Yes"
# cannot assign sequence to
miscellaneous member
# description
is ignored
memadd1 = Member('Misc Round Bar')
memadd1.piecemark = mk
memadd1.left.location = pt1
memadd1.right.location = pt2
memadd1.grade = "A36"
memadd1.centered = "Yes"
memadd1.bar_diameter = .01
memadd1.work_pt_dist = 1.0
memadd1.mtrl_type = "Round
bar"
memadd1.finish = "None"
# memadd1.existing = "Yes"
memadd1.description = "Ref
Point"
memadd1.ref_pt_offset = (0, 0, 0)
memadd1.add()
return memadd1
###########################################
try:
dlg1 = Dialog("Translate
to Global in an Orthogonal Basis")
dlg1.group_title("Orthonormal Basis and Resultant Unit Vector")
image_path = os.path.join(os.getcwd(), "macro", "Images")
image_name = os.path.join(image_path, "Basis3D_XYZ.gif")
dlg1.image(image_name)
dlg1.group_title("Translation
Vector")
dlg1.entry('distX', dim_print(100.0),
"Enter translate 'X' direction")
dlg1.entry('distY', dim_print(75.00),
"Enter translate 'Y' direction")
dlg1.entry('distZ', dim_print(-50.0),
"Enter translate 'Z' direction")
try:
dlg1.done()
except ResponseNotOK:
raise StandardError, "User Cancelled"
pt1 = PointLocate("Pick point
1 (Basis 0,0,0)")
pt2 = PointLocate("Pick point
2 (Basis 'X')")
pt3 = PointLocate("Pick point
3 to define plane")
pt4 = Point(dlg1.distX,
dlg1.distY, dlg1.distZ)
except:
Warning(formatExceptionInfo())
else:
a = BasisTransToGlobal(pt1,
pt2, pt3, pt4)
if a.R:
add_RP(pt1, pt1+a.N)
add_RP(pt1, pt1+a.A)
add_RP(pt1, pt1+a.B)
add_RP(pt1, PolarPt3D(pt1, a.R, -(pt1.dist(a.R)-1.0)))
print formatPtList("Resultant Global Point (instance
attribute 'R'):", [a.R, ])
print formatDict("\nBasisTransToGlobal
Instance Dictionary:", a.__dict__)
print formatDict("\nLocal
Dictionary:", locals())
print formatPtList("Global points calculated with method
'translate':",
[pt1+a.translate(120, 120, 0), pt1+a.translate(132, 132, 0),
pt1+a.translate(144, 144, -30)])
print formatDict("\nBasisTransToGlobal
Instance Dictionary After Calling Method 'translate':", a.__dict__)
##
END run_script() ############################################
if
__name__ == '__main__':
try:
run_script()
finally:
“””
Sample output from test script
Basis3D_XYZ:
Local
Basis Origin:
X attribute Y attribute
Z attribute
============================================================
57-1 1/8 73-0 1/4
138-3 1/2
Local Basis Translate Vector:
X attribute Y attribute
Z attribute
============================================================
5-0 2-6
1-0
Resultant Global Point:
X attribute Y attribute
Z attribute
============================================================
56-6 11/16 76-2 7/8
142-11 1/4
BasisTransToGlobal Instance Dictionary:
Key = A Value = 0.276485, 0.771189, 0.573432
Key = B Value = -0.900763, 0, 0.43431
Key = D Value = -1483971.6353
Key = F Value =
Key = G Value =
Key = N Value = 0.334935, -0.636607, 0.694658
Key = N_len Value = 1800.007731
Key = N_uv Value = 0.334935,
-0.636607, 0.694658
Key = Q Value = 1.57079632679
Key = R Value =
Key = Ra Value = 60.0000315318
Key = d Value = 16.589103, 46.271336, 34.405943
Key = d0 Value = 0.276485, 0.771189, 0.573432
Key = e Value = -27.023002, 1e-06, 13.029357
Key = e0 Value = -0.900763, 0, 0.43431
Key = k Value = 1483971.6353
Key = k0 Value =
Key = p1 Value =
Key = pp Value = 94.2478291377
Key = vN Value =
Resultant Global Points Calculated With Method 'translate':
X attribute Y attribute
Z attribute
============================================================
56-5 5/8 73-9 1/2
139-3 5/8
56-5 73-10 1/4
139-4 5/8
56-3 3/8 74-0 15/16
139-3 1/2
“””