From 9a6453156c4512120d03fd4229e68044d3e0b44e Mon Sep 17 00:00:00 2001 From: Pzaff Date: Wed, 11 Oct 2017 22:41:00 -0400 Subject: [PATCH] Fixed the cli so that curves are properly parsed. --- .gitignore | 3 +++ __init__.py | 0 .../cli_application.py => cli_application.py | 25 +++++++++++-------- data_objects/point.py | 17 +++++++++++++ generator/{parser.py => old_parser.py} | 0 logger.py | 21 ++++++++++++++++ run.sh | 4 +-- unit_tests/parser_test.py | 2 +- unit_tests/point_test.py | 25 +++++++++++++++++++ user_interface/{parser.py => curve_parser.py} | 8 +++++- user_interface/gui.py | 1 - 11 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 __init__.py rename user_interface/cli_application.py => cli_application.py (60%) mode change 100755 => 100644 rename generator/{parser.py => old_parser.py} (100%) create mode 100644 logger.py create mode 100644 unit_tests/point_test.py rename user_interface/{parser.py => curve_parser.py} (77%) diff --git a/.gitignore b/.gitignore index dd158e4..6c25327 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,6 @@ target/ #IntelliJ Files *.idea + +#Subdivision Log Generator log file +logs/ diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user_interface/cli_application.py b/cli_application.py old mode 100755 new mode 100644 similarity index 60% rename from user_interface/cli_application.py rename to cli_application.py index b0e3ec2..d71a642 --- a/user_interface/cli_application.py +++ b/cli_application.py @@ -7,19 +7,28 @@ import logging.config import os import sys -from parser import parse_curve_file +from user_interface.curve_parser import parse_curve_file + class CliApplication(cmd.Cmd): - def __init__(self, *args): + def __init__(self, application_path=None, application_name="generator", args=None): self.logger = logging.getLogger(__name__) + self.curve_paths = os.path.join(application_path, "curves") self.arguments = args self.parse_cmd_args(self.arguments) sys.exit(1) - def parse_cmd_args(*args): - if args.generate_m_value: - self.generate_m_value(args.generate_m_value) + def parse_cmd_args(self, args): + if args is not None: + if args.generate_m_value: + if os.path.exists(args.generate_m_value): + self.generate_m_value(args.generate_m_value) + else: + self.generate_m_value(os.path.join(self.curve_paths, args.generate_m_value)) + + else: + raise Exception("There were no arguments when running the application") def generate_m_value(self, curve_file="test.curve"): knot_curve = parse_curve_file(curve_file) @@ -39,11 +48,7 @@ def main(): stick knot's Bezier cure to match the stick knot", default=None, action="store") arguments = argument_parser.parse_args() - logging.basicConfig(filename="generator_log.txt", level="DEBUG") - logger = logging.getLogger(application_name) - logger.info("Parsing arguments") - - application = CliApplication(arguments) + application = CliApplication(application_path, application_name, arguments) if __name__ == "__main__": diff --git a/data_objects/point.py b/data_objects/point.py index cb1f020..214292b 100644 --- a/data_objects/point.py +++ b/data_objects/point.py @@ -4,6 +4,14 @@ """ +def distance_between_points(start_point, end_point): + x = end_point.get_x() - start_point.get_x() + y = end_point.get_y() - start_point.get_y() + z = end_point.get_z() - start_point.get_z() + + return float((x * x + y * y + z * z) ** (1 / 2)) + + class Point: def __init__(self, x_val, y_val, z_val): @@ -17,3 +25,12 @@ def __eq__(self, other): return self.x_val == other.x_val and self.y_val == other.y_val and self.z_val == other.z_val return False + def get_x(self): + return self.x_val + + def get_y(self): + return self.y_val + + def get_z(self): + return self.z_val + diff --git a/generator/parser.py b/generator/old_parser.py similarity index 100% rename from generator/parser.py rename to generator/old_parser.py diff --git a/logger.py b/logger.py new file mode 100644 index 0000000..cc3c6a3 --- /dev/null +++ b/logger.py @@ -0,0 +1,21 @@ +""" +A simplistic Logger class which wraps the Python logging class + +@author Peter Zaffetti +@date 10/10/2017 +""" +import logging +import os + + +def get_logger(classname=None): + log_dir = "logs" + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + logging.basicConfig(filename="logs/generator_log.txt", level="DEBUG") + + if classname is None: + classname = "Subdivision Generator" + + return logging.getLogger(classname) diff --git a/run.sh b/run.sh index b6b0735..2089cea 100755 --- a/run.sh +++ b/run.sh @@ -1,5 +1,3 @@ #!/bin/bash - SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd)" - -$SCRIPT_DIR/user_interface/cli_application.py $* +"$SCRIPT_DIR/user_interface/cli_application.py" $* diff --git a/unit_tests/parser_test.py b/unit_tests/parser_test.py index 7ae371d..774df6e 100644 --- a/unit_tests/parser_test.py +++ b/unit_tests/parser_test.py @@ -3,7 +3,7 @@ @author Peter Zaffetti 2017 """ import unittest -from user_interface.parser import parse_curve_file +from user_interface.curve_parser import parse_curve_file from data_objects.point import Point diff --git a/unit_tests/point_test.py b/unit_tests/point_test.py new file mode 100644 index 0000000..7745e0c --- /dev/null +++ b/unit_tests/point_test.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +""" +@author Peter Zaffetti 2017 +""" +import unittest +from data_objects.point import Point, distance_between_points + + +class PointTest(unittest.TestCase): + origin_test_point = Point(0, 0, 0) + test_point = Point(12, 8, 4) + + def test_getters(self): + self.assertTrue(self.test_point.get_x() == 12) + self.assertTrue(self.test_point.get_y() == 8) + self.assertTrue(self.test_point.get_z() == 4) + + def test_distance_between_points(self): + """Test the distance from the origin to 12, 8 , 4 -> it should be about 14.96662954""" + distance = distance_between_points(self.origin_test_point, self.test_point) + self.assertTrue( distance == 14.96662954) + + +if __name__ == "__main__": + unittest.main() diff --git a/user_interface/parser.py b/user_interface/curve_parser.py similarity index 77% rename from user_interface/parser.py rename to user_interface/curve_parser.py index dd573d0..4c0be08 100644 --- a/user_interface/parser.py +++ b/user_interface/curve_parser.py @@ -4,18 +4,24 @@ """ from data_objects.point import Point from data_objects.stick_knot import StickKnot +from logger import get_logger def parse_curve_file(filename="test.curve"): + logger = get_logger(parse_curve_file.__name__) + curve_file = open(filename, "r") stick_knot_points = list() for line in curve_file: - if line.startswith("%"): + line = ''.join(line.split()) # PDZ- Remove all whitespace in the row + + if line.startswith("%") or line == "": continue comment_split_line = line.split("%") point_values = comment_split_line[0] comma_split_point_values = point_values.split(",") + logger.debug(comma_split_point_values) if len(comma_split_point_values) != 3: raise Exception("The curve file is not formatted properly") diff --git a/user_interface/gui.py b/user_interface/gui.py index d98475e..3aac5fb 100644 --- a/user_interface/gui.py +++ b/user_interface/gui.py @@ -2,4 +2,3 @@ TODO: This is stubbed out for now. Eventually, the GUI will sit on top of the CLI functionality in the cli.py file @author Peter Zaffetti 2017 """ -from cli_application import GenerateMValue