mirror of
https://github.com/sinseman44/PyCNC.git
synced 2026-01-12 02:40:04 +00:00
106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
from __future__ import division
|
|
import math
|
|
|
|
|
|
class Coordinates(object):
|
|
""" This object represent machine coordinates.
|
|
Machine supports 3 axis, so there are X, Y and Z.
|
|
"""
|
|
def __init__(self, x, y, z, e):
|
|
""" Create object.
|
|
:param x: x coordinated.
|
|
:param y: y coordinated.
|
|
:param z: z coordinated.
|
|
"""
|
|
self.x = round(x, 10)
|
|
self.y = round(y, 10)
|
|
self.z = round(z, 10)
|
|
self.e = round(e, 10)
|
|
|
|
def is_zero(self):
|
|
""" Check if all coordinates are zero.
|
|
:return: boolean value.
|
|
"""
|
|
return (self.x == 0.0 and self.y == 0.0 and self.z == 0.0
|
|
and self.e == 0.0)
|
|
|
|
def is_in_aabb(self, p1, p2):
|
|
""" Check coordinates are in aabb(Axis-Aligned Bounding Box).
|
|
aabb is specified with two points. E is ignored.
|
|
:param p1: First point in Coord object.
|
|
:param p2: Second point in Coord object.
|
|
:return: boolean value.
|
|
"""
|
|
min_x, max_x = sorted((p1.x, p2.x))
|
|
min_y, max_y = sorted((p1.y, p2.y))
|
|
min_z, max_z = sorted((p1.z, p2.z))
|
|
if self.x < min_x or self.y < min_y or self.z < min_z:
|
|
return False
|
|
if self.x > max_x or self.y > max_y or self.z > max_z:
|
|
return False
|
|
return True
|
|
|
|
def length(self):
|
|
""" Calculate the length of vector.
|
|
:return: Vector length.
|
|
"""
|
|
return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z
|
|
+ self.e * self.e)
|
|
|
|
def round(self, base_x, base_y, base_z, base_e):
|
|
""" Round values to specified base, ie 0.49 with base 0.25 will be 0.5.
|
|
:param base_x: Base for x axis.
|
|
:param base_y: Base for y axis.
|
|
:param base_z: Base for z axis.
|
|
:param base_e: Base for e axis.
|
|
:return: New rounded object.
|
|
"""
|
|
return Coordinates(round(self.x / base_x) * base_x,
|
|
round(self.y / base_y) * base_y,
|
|
round(self.z / base_z) * base_z,
|
|
round(self.e / base_e) * base_e)
|
|
|
|
def find_max(self):
|
|
""" Find a maximum value of all values.
|
|
:return: maximum value.
|
|
"""
|
|
return max(self.x, self.y, self.z, self.e)
|
|
|
|
# build in function implementation
|
|
def __add__(self, other):
|
|
return Coordinates(self.x + other.x, self.y + other.y,
|
|
self.z + other.z, self.e + other.e)
|
|
|
|
def __sub__(self, other):
|
|
return Coordinates(self.x - other.x, self.y - other.y,
|
|
self.z - other.z, self.e - other.e)
|
|
|
|
def __mul__(self, v):
|
|
"""
|
|
@rtype: Coordinates
|
|
"""
|
|
return Coordinates(self.x * v, self.y * v, self.z * v, self.e * v)
|
|
|
|
def __div__(self, v):
|
|
"""
|
|
@rtype: Coordinates
|
|
"""
|
|
return Coordinates(self.x / v, self.y / v, self.z / v, self.e / v)
|
|
|
|
def __truediv__(self, v):
|
|
"""
|
|
@rtype: Coordinates
|
|
"""
|
|
return Coordinates(self.x / v, self.y / v, self.z / v, self.e / v)
|
|
|
|
def __eq__(self, other):
|
|
return self.x == other.x and self.y == other.y and self.z == other.z \
|
|
and self.e == other.e
|
|
|
|
def __str__(self):
|
|
return '(' + str(self.x) + ', ' + str(self.y) + ', ' + str(self.z) \
|
|
+ ', ' + str(self.e) + ')'
|
|
|
|
def __abs__(self):
|
|
return Coordinates(abs(self.x), abs(self.y), abs(self.z), abs(self.e))
|