diff --git a/README.md b/README.md index 6946e76..956512c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ # fvr fvr; a suite of tools designed to enhance efficiency and productivity. + +Example usage: +- `fvr.geom.polygon(vertices).area` +- `fvr.wire.awg(number)` +- `fvr.wire.awg(number).diameter` +- `fvr.wire.awg(number).area` diff --git a/src/fvr/geom.py b/src/fvr/geom.py index d32cfdb..6551fc4 100644 --- a/src/fvr/geom.py +++ b/src/fvr/geom.py @@ -1,19 +1,40 @@ +import re from fvr.typing import FloatArray -def area(vertices: FloatArray) -> float: - r"""Determine the area of a simple polygon. +class polygon: + def __init__(self, vertices: FloatArray|str): + r"""Properties of a simple polygon. - Args: - vertices: List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]" - - Shoelace formula, Gauss's area formula, surveyor's formula + Args: + vertices: List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]" + """ + if isinstance(vertices, str): + vertices = self.str2arr(vertices) + self.vertices = vertices - https://en.wikipedia.org/wiki/Shoelace_formula - """ - count = len(vertices) # of corners - result = 0.0 - for i in range(count): - j = (i + 1) % count - result += vertices[i][0] * vertices[j][1] - vertices[i][1] * vertices[j][0] - result = abs(result) / 2.0 - return result + @staticmethod + def str2arr(vertices: str) -> list: + strm = re.match(r'\[.*\]', ''.join(vertices)) + if strm and strm.group(): + return eval(strm.group()) + + @property + def area(self) -> float: + r"""Determine the area of a simple polygon. + + Example: + >>> fvr.geom.polygon([[0, 0], [0, 1], [1, 1], [1, 0]]).area + >>> fvr.geom.polygon('[[0, 0], [0, 1], [1, 1], [1, 0]]').area + + Shoelace formula, Gauss's area formula, surveyor's formula + + https://en.wikipedia.org/wiki/Shoelace_formula + """ + count = len(self.vertices) # of corners + result = 0.0 + for i in range(count): + j = (i + 1) % count + result += self.vertices[i][0] * self.vertices[j][1] - \ + self.vertices[i][1] * self.vertices[j][0] + result = abs(result) / 2.0 + return result diff --git a/src/fvr/wire.py b/src/fvr/wire.py index 48b3ef6..a3d9c2e 100644 --- a/src/fvr/wire.py +++ b/src/fvr/wire.py @@ -10,18 +10,20 @@ class awg: number: AWG wire size, also '00', '000', '0000' """ self.number = number - self.num2int() + self._number = self.num2int(number) - def num2int(self): - if isinstance(self.number, int): - self._number = self.number - elif self.number.isdigit(): - if self.number in ['00', '000', '0000']: - self._number = 1 - len(self.number) + @staticmethod + def num2int(number: int|str): + if isinstance(number, int): + res = number + elif number.isdigit(): + if number in ['00', '000', '0000']: + res = 1 - len(number) else: - self._number = int(self.number) + res = int(number) else: - raise ValueError + raise ValueError(f"{number} is not a number.") + return res @property def diameter(self):