X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=pymeshio%2Fcommon.py;h=950e2d0f4010317e04038d7b7bc3a86c878c5a3f;hb=1a59747c66623ef3b6b66412d25ffc4e613cd893;hp=7dadc16f151d14cffcf514e679c2de50c2d5ec13;hpb=59e49e6d770cd7dfacd551f005a5ca63c1a525b7;p=meshio%2Fpymeshio.git diff --git a/pymeshio/common.py b/pymeshio/common.py index 7dadc16..950e2d0 100644 --- a/pymeshio/common.py +++ b/pymeshio/common.py @@ -3,12 +3,21 @@ common utilities. """ import math +import struct +import sys -def radian_to_degree(x): - """darian to deglee""" - return x/math.pi * 180.0 +def unicode(src): + """ + literal to unicode for python2 and python3 compatiblity. + in python2 str to unicode. + in python3 str(as unicode) to str. + """ + if sys.version_info[0]<3: + return src.decode('utf-8') + else: + return src """ common structures. @@ -25,6 +34,12 @@ class Vector2(object): def __str__(self): return "<%f %f>" % (self.x, self.y) + def __eq__(self, rhs): + return self.x==rhs.x and self.y==rhs.y + + def __ne__(self, rhs): + return not self.__eq__(rhs) + def __getitem__(self, key): if key==0: return self.x @@ -36,6 +51,10 @@ class Vector2(object): def to_tuple(self): return (self.x, self.y) + def cross(self, rhs): + """cross(outer) product""" + return self.x*rhs.y-self.y*rhs.x + class Vector3(object): """ @@ -50,6 +69,12 @@ class Vector3(object): def __str__(self): return "<%f %f %f>" % (self.x, self.y, self.z) + def __eq__(self, rhs): + return self.x==rhs.x and self.y==rhs.y and self.z==rhs.z + + def __ne__(self, rhs): + return not self.__eq__(rhs) + def __getitem__(self, key): if key==0: return self.x @@ -63,8 +88,39 @@ class Vector3(object): def to_tuple(self): return (self.x, self.y, self.z) - def __add__(l, r): - return Vector3(l.x+r.x, l.y+r.y, l.z+r.z) + def __add__(self, r): + return Vector3(self.x+r.x, self.y+r.y, self.z+r.z) + + def __sub__(self, rhs): + return Vector3(self.x-rhs.x, self.y-rhs.y, self.z-rhs.z) + + def getSqNorm(self): + return self.x*self.x + self.y*self.y + self.z*self.z + + def getNorm(self): + return math.sqrt(self.getSqNorm()) + + def normalize(self): + factor=1.0/self.getNorm() + self.x*=factor + self.y*=factor + self.z*=factor + return self + + def to_a(self): + return [self.x, self.y, self.z] + + def dot(self, rhs): + """dot(inner) product""" + return self.x*rhs.x + self.y*rhs.y + self.z*rhs.z + + def cross(self, rhs): + """cross(outer) product""" + return Vector3( + self.y*rhs.z - rhs.y*self.z, + self.z*rhs.x - rhs.z*self.x, + self.x*rhs.y - rhs.x*self.y, + ) class Quaternion(object): @@ -181,6 +237,12 @@ class RGB(object): self.g=g self.b=b + def __eq__(self, rhs): + return self.r==rhs.r and self.g==rhs.g and self.b==rhs.b + + def __ne__(self, rhs): + return not self.__eq__(rhs) + def __getitem__(self, key): if key==0: return self.r @@ -203,6 +265,12 @@ class RGBA(object): self.b=b self.a=a + def __eq__(self, rhs): + return self.r==rhs.r and self.g==rhs.g and self.b==rhs.b and self.a==rhs.a + + def __ne__(self, rhs): + return not self.__eq__(rhs) + def __getitem__(self, key): if key==0: return self.r @@ -215,3 +283,145 @@ class RGBA(object): else: assert(False) + +""" +utilities +""" +def radian_to_degree(x): + """darian to deglee""" + + return x/math.pi * 180.0 + + +class ParseException(Exception): + """ + Exception in reader + """ + pass + + +def readall(path): + """read all bytes from path + """ + with open(path, "rb") as f: + return f.read() + + +class BinaryReader(object): + """general BinaryReader + """ + def __init__(self, ios): + self.ios=ios + + def is_end(self): + return not self.ios.readable() + + def unpack(self, fmt, size): + result=struct.unpack(fmt, self.ios.read(size)) + return result[0] + + def read_int(self, size): + if size==1: + return self.unpack("b", size) + if size==2: + return self.unpack("h", size) + if size==4: + return self.unpack("i", size) + print("not reach here") + raise ParseException("invalid int size: "+size) + + def read_uint(self, size): + if size==1: + return self.unpack("B", size) + if size==2: + return self.unpack("H", size) + if size==4: + return self.unpack("I", size) + print("not reach here") + raise ParseException("invalid int size: "+size) + + def read_float(self): + return self.unpack("f", 4) + + def read_vector2(self): + return Vector2( + self.read_float(), + self.read_float() + ) + + def read_vector3(self): + return Vector3( + self.read_float(), + self.read_float(), + self.read_float() + ) + + def read_rgba(self): + return RGBA( + self.read_float(), + self.read_float(), + self.read_float(), + self.read_float() + ) + + def read_rgb(self): + return RGB( + self.read_float(), + self.read_float(), + self.read_float() + ) + + +class WriteException(Exception): + """ + Exception in writer + """ + pass + + +class BinaryWriter(object): + def __init__(self, ios): + self.ios=ios + + def write_bytes(self, v, size=None): + if size: + self.ios.write(struct.pack("={0}s".format(size), v)) + else: + self.ios.write(v) + + def write_float(self, v): + self.ios.write(struct.pack("f", v)) + + def write_int(self, v, size): + if size==1: + self.ios.write(struct.pack("b", v)) + elif size==2: + self.ios.write(struct.pack("h", v)) + elif size==4: + self.ios.write(struct.pack("i", v)) + else: + raise WriteError("invalid int uint size") + + def write_uint(self, v, size): + if size==1: + self.ios.write(struct.pack("B", v)) + elif size==2: + self.ios.write(struct.pack("H", v)) + elif size==4: + self.ios.write(struct.pack("I", v)) + else: + raise WriteError("invalid int uint size") + + def write_vector2(self, v): + self.ios.write(struct.pack("=2f", v.x, v.y)) + + def write_vector3(self, v): + self.ios.write(struct.pack("=3f", v.x, v.y, v.z)) + + def write_rgb(self, v): + self.ios.write(struct.pack("=3f", v.r, v.g, v.b)) + + def write_rgba(self, v): + self.ios.write(struct.pack("=4f", v.r, v.g, v.b, v.a)) + +