Back to SDS/2 Parametric Scripts
## Copyright (c) 2006
## All rights reserved.
## angle.py Version 1.00 (module 'angle')
## Version 1.01 (
"""
/// 'rtod' - Radian argument returns degrees
/// 'dtor' - Degree argument returns radians
/// 'angle_between_members' - Return the complement to the
projected net angle between mem1 and mem2 in radians (0.0< theta <1.0)
/// 'flg_bevel_cut' - Return the bevel cut angle in degrees
given the framing face and relative rotation in degrees
/// 'bm_setback' - Return a setback given a depth (d2),
clearance (clr), setback (setb),
and flange bevel cut
/// 'planRotPts' - Return plan angle in radians for argument
points
"""
from math import pi, atan,
cos
##########################################################################
# convert
radians to degrees
def rtod ( r ):
return (r * 180.0
/ pi)
# convert
degrees to radians
def dtor ( d ):
return (d * pi /
180.0)
##########################################################################
# return
the complement to the projected net angle in radians between mem1 and mem2
# the projection is
in the plane of the top flange of mem1
def angle_between_members(mem1,
mem2):
pt1 = mem1.trans_to_local(mem2.left_location
- mem1.left_location)
pt2 = mem1.trans_to_local(mem2.right_location
- mem1.left_location)
return atan((pt2.x - pt1.x) / (pt2.z - pt1.z))
##########################################################################
# return
the bevel cut angle in degrees given the framing face
# and
relative rotation
def flg_bevel_cut
(face, rot):
if face ==
"Face C":
if rot >=
0.0 and rot < 90.0:
return
-rot
else:
return
360.0 - rot
elif
face == "Face D":
return 90.0 -
rot
elif
face == "Face A":
return 180.0 -
rot
elif
face == "Face B":
return 270.0 -
rot
elif
face == "None":
return 0.0
else:
print
"Invalid results"
return 0
##########################################################################
# return
a setback given a depth (d2), clearance (clr),
setback (setb),
# and
flange bevel cut
def bm_setback (d2, clr, setb, rot): # rot is the
flange bevel cut
return (d2 + clr + setb) / cos(dtor(rot))
#######################################################
# return
plan angle for argument points in radians
def planRotPts(p1,
p2):
from math import
pi, atan2
dpx
= p2.x - p1.x
dpy = p2.y - p1.y
if round(dpx, 4) == 0.0:
if dpy > 0.0:
return
pi/2.0
else:
return
-pi/2.0
else:
A = atan2(dpy, dpx)
if A > pi:
return A -
pi
else:
return A
##########################################################################
def test_planRotPts():
from param import yes_or_no, Warning
from point import
Point, PointLocate
pt1 = PointLocate("Select Point 1")
pt2 = PointLocate("Select Point 2")
Warning("The
plan angle between selected points is %0.4f degrees." % (rtod(planRotPts(pt1, pt2))))
##########################################################################
def test_angle_between_members():
from member import
Member, MemberLocate
from param import yes_or_no, Warning
from macrolib.ExceptWarn import formatExceptionInfo
mem1 = MemberLocate("Select
Member 1")
mem2 = MemberLocate("Select
Member 2")
Warning('The
complement to the net angle between the members in the plane\nof the top flange of Member 1 = %0.4f degrees' % \
(rtod(angle_between_members(mem1,
mem2))))
## END test_angle_between_members() #################################
if __name__ == '__main__':
try:
test_angle_between_members()
test_planRotPts()
finally: