## PolarPt.py
## Copyright (c)
2006
## All rights
reserved.
## NOT FOR
###############################################################################
## Varsion 1.01 (
from macrolib.angle
import dtor
from math import sin, cos
from point import Point
# return
the true midpoint between two points in 3D
def midpt(p1, p2):
return
Point((p2.x-p1.x)/2+p1.x, (p2.y-p1.y)/2+p1.y, (p2.z-p1.z)/2+p1.z)
# return
a point in plan at a given distance and angle (in degrees) from a reference
point
def polar_pt_plan
(pt1, dist1, ang1):
return Point(pt1.x
+ (dist1 * cos(dtor(ang1))),
pt1.y + (dist1 * sin(dtor(ang1))), pt1.z)
###############################################################################
# return
a point in the plane of the top flange of a beam member in member coordinates
# at
a given distance and angle (in degrees) from a reference point in member
coordinates
def polar_pt_hor (pt1,
dist1, ang1):
return Point(pt1.x
+ (dist1 * cos(dtor(ang1))),
pt1.y, pt1.z - (dist1 * sin(dtor(ang1))))
###############################################################################
# return
a point in 3D given a start point and end point and distance beyond end point
def PolarPt3D (p1, p2, d):
# distance between
p1 and p2
s1 = p1.dist(p2)
# net vector
between points
p12 = p2 - p1
# calculate the unit vector
uv
= Point((p12.x)/s1, (p12.y)/s1, (p12.z)/s1)
# calculate new point
return Point((p2.x
+ (uv.x*d)), (p2.y + (uv.y*d)),
p2.z + (uv.z*d))
# end
function definition
#####################################################################
# Test PolarPt3D
def test_PolarPt3D():
from param import yes_or_no, Prompt, ResponseNotOK, Warning, dim_print
from point import PointLocate
ptWP1 = PointLocate("Select
first point")
ptWP2 = PointLocate("Select
second point")
if ptWP1 and ptWP2
!= None:
try:
ext_dist = Prompt
(12.0, "Enter distance" )
except param.ResponseNotOK, e:
yes_or_no('%s\n%s'
% ('ResponseNotOK', e.args[0]),
"OK")
else:
pt3 = PolarPt3D(ptWP1,
ptWP2, ext_dist)
Warning("New
Point PolarPt3D = %s, %s, %s" % (dim_print(pt3.x),
dim_print(pt3.y),dim_print(pt3.z)))
print
"New Point PolarPt3D = %s, %s, %s" % (dim_print(pt3.x),
dim_print(pt3.y),dim_print(pt3.z))
else:
yes_or_no('%s\n%s'
% ('One of the points is invalid', 'Cancel'), "OK")
ptWP1 = PointLocate("Select
point (only valid in plan")
if ptWP1 != None:
try:
ext_dist
= Prompt (12.0, "Enter distance" )
ext_ang =
Prompt (45.0, "Enter angle" )
except param.ResponseNotOK, e:
yes_or_no('%s\n%s'
% ('ResponseNotOK', e.args[0]),
"OK")
else:
pt3 = polar_pt_plan(ptWP1, ext_dist, ext_ang)
Warning("New
Point polar_pt_hor = %s, %s, %s" % (dim_print(pt3.x), dim_print(pt3.y),dim_print(pt3.z)))
print
"New Point polar_pt_hor = %s, %s, %s" % (dim_print(pt3.x), dim_print(pt3.y),dim_print(pt3.z))
else:
yes_or_no('%s\n%s'
% ('The point selection is invalid', 'Cancel'), "OK")
#####################################################################
if __name__ == '__main__':
try:
test_PolarPt3D()
finally: