| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import FreeCAD |
| | import Path |
| | import Path.Base.Generator.dogboneII as dogboneII |
| | import Path.Base.Language as PathLanguage |
| | import Path.Dressup.DogboneII |
| | import CAMTests.PathTestUtils as PathTestUtils |
| | import math |
| |
|
| | PI = math.pi |
| |
|
| |
|
| | class MockTB(object): |
| | def __init__(self, dia): |
| | self.Name = "ToolBit" |
| | self.Label = "ToolBit" |
| | self.Diameter = FreeCAD.Units.Quantity(dia, FreeCAD.Units.Length) |
| |
|
| |
|
| | class MockTC(object): |
| | def __init__(self, dia=2): |
| | self.Name = "TC" |
| | self.Label = "TC" |
| | self.Tool = MockTB(dia) |
| |
|
| |
|
| | class MockOp(object): |
| | def __init__(self, path, dia=2): |
| | self.Name = "OP" |
| | self.Label = "OP" |
| | self.Path = Path.Path(path) |
| | self.ToolController = MockTC(dia) |
| |
|
| |
|
| | class MockFeaturePython(object): |
| | def __init__(self, name): |
| | self.prop = {} |
| | self.addProperty("App::PropertyString", "Name", val=name) |
| | self.addProperty("App::PropertyString", "Label", val=name) |
| | self.addProperty("App::PropertyLink", "Proxy") |
| | self.addProperty("Path::Path", "Path", val=Path.Path()) |
| |
|
| | def addProperty(self, typ, name, grp=None, desc=None, val=None): |
| | self.prop[name] = (typ, val) |
| |
|
| | def setEditorMode(self, name, mode): |
| | pass |
| |
|
| | def __setattr__(self, name, val): |
| | if name == "prop": |
| | return super().__setattr__(name, val) |
| | self.prop[name] = (self.prop[name][0], val) |
| |
|
| | def __getattr__(self, name): |
| | if name == "prop": |
| | return super().__getattr__(name) |
| | typ, val = self.prop.get(name, (None, None)) |
| | if typ is None and val is None: |
| | raise AttributeError |
| | if typ == "App::PropertyLength": |
| | if type(val) == float or type(val) == int: |
| | return FreeCAD.Units.Quantity(val, FreeCAD.Units.Length) |
| | return FreeCAD.Units.Quantity(val) |
| | return val |
| |
|
| |
|
| | def CreateDressup(path): |
| | op = MockOp(path) |
| | obj = MockFeaturePython("DressupDogbone") |
| | db = Path.Dressup.DogboneII.Proxy(obj, op) |
| | obj.Proxy = db |
| | return obj |
| |
|
| |
|
| | def MNVR(gcode, begin=None): |
| | |
| | |
| | return PathLanguage.Maneuver.FromGCode(gcode.replace("/", "\n"), begin) |
| |
|
| |
|
| | def INSTR(gcode, begin=None): |
| | return MNVR(gcode, begin).instr[0] |
| |
|
| |
|
| | def KINK(gcode, begin=None): |
| | maneuver = MNVR(gcode, begin) |
| | if len(maneuver.instr) != 2: |
| | return None |
| | return dogboneII.Kink(maneuver.instr[0], maneuver.instr[1]) |
| |
|
| |
|
| | class TestDressupDogboneII(PathTestUtils.PathTestBase): |
| | """Unit tests for the DogboneII dressup.""" |
| |
|
| | def assertEqualPath(self, path, s): |
| | def cmd2str(cmd): |
| | param = [ |
| | f"{k}{v:g}" if Path.Geom.isRoughly(0, v - int(v)) else f"{k}{v:.2f}" |
| | for k, v in cmd.Parameters.items() |
| | ] |
| | return f"{cmd.Name}{''.join(param)}" |
| |
|
| | p = "/".join([cmd2str(cmd) for cmd in path.Commands]) |
| | self.assertEqual(p, s) |
| |
|
| | def test00(self): |
| | """Verify adaptive length""" |
| |
|
| | def adaptive(k, a, n): |
| | return Path.Dressup.DogboneII.calc_length_adaptive(k, a, n, n) |
| |
|
| | if True: |
| | |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X2"), 0, 1), 0) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1Y1"), 0, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X2Y1"), 0, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X0Y1"), 0, 1), 2.414211) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X0"), 0, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X0Y-1"), 0, 1), 2.414211) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X1Y-1"), 0, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X2Y-1"), 0, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1Y1/G1X0Y2"), 0, 1), 0.414214) |
| |
|
| | if True: |
| | |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y2"), 0, 1), 0) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y1X1"), PI, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y2X1"), PI, 1), 0.089820) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y2X1"), PI / 2, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y0X1"), PI / 2, 1), 2.414211) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y0"), 0, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y0X-1"), PI / 2, 1), 2.414211) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y1X-1"), 0, 1), 1) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y2X-1"), 0, 1), 0.089820) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1Y2X-1"), PI / 2, 1), 0.414214) |
| |
|
| | if True: |
| | |
| | self.assertRoughly(adaptive(KINK("G1X1/G1Y1"), -PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X0Y1"), -PI / 8, 1), 1.613126) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1Y-1"), PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1/G1X0Y-1"), PI / 8, 1), 1.613126) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1X-1"), PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1Y1/G1X1"), 3 * PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1Y-1/G1X1"), -3 * PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1Y-1/G1X-1"), -PI / 4, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1Y1/G1X0Y2"), 0, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X-1Y1/G1X0Y2"), PI, 1), 0.414214) |
| | self.assertRoughly(adaptive(KINK("G1X1Y1/G1X2Y0"), PI / 2, 2), 0.828428) |
| | self.assertRoughly(adaptive(KINK("G1X-1Y-1/G1X-2Y0"), -PI / 2, 2), 0.828428) |
| | self.assertRoughly(adaptive(KINK("G1X-1Y1/G1X-2Y0"), PI / 2, 2), 0.828428) |
| | self.assertRoughly(adaptive(KINK("G1X1Y-1/G1X2Y0"), -PI / 2, 2), 0.828428) |
| |
|
| | def test01(self): |
| | """Verify nominal length""" |
| |
|
| | def nominal(k, a, n): |
| | return Path.Dressup.DogboneII.calc_length_nominal(k, a, n, 0) |
| |
|
| | |
| | self.assertRoughly(nominal(KINK("G1X1/G1X2"), 0, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X1/G1X2"), PI / 2, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X1/G1X2"), PI, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X1/G1X2"), -PI / 2, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X8/G1X12"), 0, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X9/G1X0"), 0, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X7/G1X9"), 0, 13), 13) |
| | self.assertRoughly(nominal(KINK("G1X5/G1X1"), 0, 13), 13) |
| |
|
| | def test02(self): |
| | """Verify custom length""" |
| |
|
| | def custom(k, a, c): |
| | return Path.Dressup.DogboneII.calc_length_custom(k, a, 0, c) |
| |
|
| | |
| | self.assertRoughly(custom(KINK("G1X1/G1X2"), 0, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X1/G1X2"), PI / 2, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X1/G1X2"), PI, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X1/G1X2"), -PI / 2, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X8/G1X12"), 0, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X9/G1X0"), 0, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X7/G1X9"), 0, 7), 7) |
| | self.assertRoughly(custom(KINK("G1X5/G1X1"), 0, 7), 7) |
| |
|
| | def test10(self): |
| | """Verify basic op dressup""" |
| |
|
| | obj = CreateDressup("G1X10/G1Y20") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| |
|
| | |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/G1X11/G1X10/G1Y20") |
| |
|
| | |
| | obj.Side = Path.Dressup.DogboneII.Side.Left |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/G1Y20") |
| |
|
| | def test11(self): |
| | """Verify retaining non-move instructions""" |
| |
|
| | obj = CreateDressup("G1X10/(some comment)/G1Y20") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| |
|
| | |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/(some comment)/G1X11/G1X10/G1Y20") |
| |
|
| | |
| | obj.Side = Path.Dressup.DogboneII.Side.Left |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/(some comment)/G1Y20") |
| |
|
| | def test20(self): |
| | """Verify bone on plunge moves""" |
| |
|
| | obj = CreateDressup("G0Z10/G1Z0/G1X10/G1Y10/G1X0/G1Y0/G0Z10") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath( |
| | obj.Path, |
| | "G0Z10/G1Z0/G1X10/G1X11/G1X10/G1Y10/G1X11/G1X10/G1X0/G1X-1/G1X0/G1Y0/G1X-1/G1X0/G0Z10", |
| | ) |
| |
|
| | def test21(self): |
| | """Verify ignoring plunge moves that don't connect""" |
| |
|
| | obj = CreateDressup("G0Z10/G1Z0/G1X10/G1Y10/G1X0/G1Y5/G0Z10") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath( |
| | obj.Path, |
| | "G0Z10/G1Z0/G1X10/G1X11/G1X10/G1Y10/G1X11/G1X10/G1X0/G1X-1/G1X0/G1Y5/G0Z10", |
| | ) |
| |
|
| | def test30(self): |
| | """Verify TBone_V style""" |
| |
|
| | def check_tbone(d, i, path, out, right): |
| | obj = CreateDressup(f"({d}.{i:02})/{path}") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | if right: |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | else: |
| | obj.Side = Path.Dressup.DogboneII.Side.Left |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_V |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, f"({d}.{i:02})/{out}") |
| |
|
| | |
| | test_data_h = [ |
| | |
| | ("G1X10Y0/G1X10Y10", "G1X10Y0/G1Y-1/G1Y0/G1X10Y10", True), |
| | ("G1X10Y0/G1X20Y10", "G1X10Y0/G1Y-1/G1Y0/G1X20Y10", True), |
| | ("G1X10Y0/G1X90Y10", "G1X10Y0/G1Y-1/G1Y0/G1X90Y10", True), |
| | ("G1X10Y0/G1X0Y10", "G1X10Y0/G1Y-1/G1Y0/G1X0Y10", True), |
| | |
| | ("G1X10Y0/G1X90Y-10", "G1X10Y0/G1Y1/G1Y0/G1X90Y-10", False), |
| | ("G1X10Y0/G1X20Y-10", "G1X10Y0/G1Y1/G1Y0/G1X20Y-10", False), |
| | ("G1X10Y0/G1X10Y-10", "G1X10Y0/G1Y1/G1Y0/G1X10Y-10", False), |
| | ("G1X10Y0/G1X0Y-10", "G1X10Y0/G1Y1/G1Y0/G1X0Y-10", False), |
| | |
| | ("G1X-10Y0/G1X-10Y10", "G1X-10Y0/G1Y-1/G1Y0/G1X-10Y10", False), |
| | ("G1X-10Y0/G1X-20Y10", "G1X-10Y0/G1Y-1/G1Y0/G1X-20Y10", False), |
| | ("G1X-10Y0/G1X-90Y10", "G1X-10Y0/G1Y-1/G1Y0/G1X-90Y10", False), |
| | ("G1X-10Y0/G1X-0Y10", "G1X-10Y0/G1Y-1/G1Y0/G1X-0Y10", False), |
| | |
| | ("G1X-10Y0/G1X-90Y-10", "G1X-10Y0/G1Y1/G1Y0/G1X-90Y-10", True), |
| | ("G1X-10Y0/G1X-20Y-10", "G1X-10Y0/G1Y1/G1Y0/G1X-20Y-10", True), |
| | ("G1X-10Y0/G1X-10Y-10", "G1X-10Y0/G1Y1/G1Y0/G1X-10Y-10", True), |
| | ("G1X-10Y0/G1X-0Y-10", "G1X-10Y0/G1Y1/G1Y0/G1X-0Y-10", True), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_h): |
| | check_tbone("h", i, path, out, right) |
| |
|
| | |
| | test_data_v = [ |
| | |
| | ("G1X0Y10/G1X10Y10", "G1X0Y10/G1Y11/G1Y10/G1X10Y10", False), |
| | ("G1X0Y10/G1X10Y20", "G1X0Y10/G1Y11/G1Y10/G1X10Y20", False), |
| | ("G1X0Y10/G1X10Y90", "G1X0Y10/G1Y11/G1Y10/G1X10Y90", False), |
| | ("G1X0Y10/G1X10Y0", "G1X0Y10/G1Y11/G1Y10/G1X10Y0", False), |
| | |
| | ("G1X0Y-10/G1X10Y-90", "G1X0Y-10/G1Y-11/G1Y-10/G1X10Y-90", True), |
| | ("G1X0Y-10/G1X10Y-20", "G1X0Y-10/G1Y-11/G1Y-10/G1X10Y-20", True), |
| | ("G1X0Y-10/G1X10Y-10", "G1X0Y-10/G1Y-11/G1Y-10/G1X10Y-10", True), |
| | ("G1X0Y-10/G1X10Y-0", "G1X0Y-10/G1Y-11/G1Y-10/G1X10Y-0", True), |
| | |
| | ("G1X0Y10/G1X-10Y10", "G1X0Y10/G1Y11/G1Y10/G1X-10Y10", True), |
| | ("G1X0Y10/G1X-10Y20", "G1X0Y10/G1Y11/G1Y10/G1X-10Y20", True), |
| | ("G1X0Y10/G1X-10Y90", "G1X0Y10/G1Y11/G1Y10/G1X-10Y90", True), |
| | ("G1X0Y10/G1X-10Y0", "G1X0Y10/G1Y11/G1Y10/G1X-10Y0", True), |
| | |
| | ("G1X0Y-10/G1X-10Y-90", "G1X0Y-10/G1Y-11/G1Y-10/G1X-10Y-90", False), |
| | ("G1X0Y-10/G1X-10Y-20", "G1X0Y-10/G1Y-11/G1Y-10/G1X-10Y-20", False), |
| | ("G1X0Y-10/G1X-10Y-10", "G1X0Y-10/G1Y-11/G1Y-10/G1X-10Y-10", False), |
| | ("G1X0Y-10/G1X-10Y-0", "G1X0Y-10/G1Y-11/G1Y-10/G1X-10Y-0", False), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_v): |
| | check_tbone("v", i, path, out, right) |
| |
|
| | def test40(self): |
| | """Verify TBone_S style""" |
| |
|
| | def check_tbone_s(d, i, path, out, right): |
| | obj = CreateDressup(f"(m{d}.{i:02})/{path}") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | if right: |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | else: |
| | obj.Side = Path.Dressup.DogboneII.Side.Left |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_S |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, f"(m{d}.{i:02})/{out}") |
| |
|
| | |
| | test_data_0 = [ |
| | |
| | ("G1X10/G1Y20", "G1X10/G1Y-1/G1Y0/G1Y20", True), |
| | ("G1X10Y10/G1X-10Y30", "G1X10Y10/G1X10.71Y9.29/G1X10Y10/G1X-10Y30", True), |
| | ("G1Y10/G1X-20", "G1Y10/G1X1/G1X0/G1X-20", True), |
| | ( |
| | "G1X-10Y10/G1X-30Y-10", |
| | "G1X-10Y10/G1X-9.29Y10.71/G1X-10Y10/G1X-30Y-10", |
| | True, |
| | ), |
| | ("G1X-10/G1Y-20", "G1X-10/G1Y1/G1Y0/G1Y-20", True), |
| | ( |
| | "G1X-10Y-10/G1X10Y-30", |
| | "G1X-10Y-10/G1X-10.71Y-9.29/G1X-10Y-10/G1X10Y-30", |
| | True, |
| | ), |
| | ("G1Y-10/G1X20", "G1Y-10/G1X-1/G1X0/G1X20", True), |
| | ("G1X10Y-10/G1X30Y10", "G1X10Y-10/G1X9.29Y-10.71/G1X10Y-10/G1X30Y10", True), |
| | |
| | ("G1X10/G1Y-20", "G1X10/G1Y1/G1Y0/G1Y-20", False), |
| | ("G1X10Y10/G1X30Y-10", "G1X10Y10/G1X9.29Y10.71/G1X10Y10/G1X30Y-10", False), |
| | ("G1Y10/G1X20", "G1Y10/G1X-1/G1X0/G1X20", False), |
| | ( |
| | "G1X-10Y10/G1X10Y30", |
| | "G1X-10Y10/G1X-10.71Y9.29/G1X-10Y10/G1X10Y30", |
| | False, |
| | ), |
| | ("G1X-10/G1Y20", "G1X-10/G1Y-1/G1Y0/G1Y20", False), |
| | ( |
| | "G1X-10Y-10/G1X-30Y10", |
| | "G1X-10Y-10/G1X-9.29Y-10.71/G1X-10Y-10/G1X-30Y10", |
| | False, |
| | ), |
| | ("G1Y-10/G1X-20", "G1Y-10/G1X1/G1X0/G1X-20", False), |
| | ( |
| | "G1X10Y-10/G1X-10Y-30", |
| | "G1X10Y-10/G1X10.71Y-9.29/G1X10Y-10/G1X-10Y-30", |
| | False, |
| | ), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_0): |
| | check_tbone_s("0", i, path, out, right) |
| |
|
| | |
| | test_data_1 = [ |
| | |
| | ("G1X20/G1Y10", "G1X20/G1X21/G1X20/G1Y10", True), |
| | ("G1X20Y20/G1X10Y30", "G1X20Y20/G1X20.71Y20.71/G1X20Y20/G1X10Y30", True), |
| | ("G1Y20/G1X-10", "G1Y20/G1Y21/G1Y20/G1X-10", True), |
| | ( |
| | "G1X-20Y20/G1X-30Y10", |
| | "G1X-20Y20/G1X-20.71Y20.71/G1X-20Y20/G1X-30Y10", |
| | True, |
| | ), |
| | ("G1X-20/G1Y-10", "G1X-20/G1X-21/G1X-20/G1Y-10", True), |
| | ( |
| | "G1X-20Y-20/G1X-10Y-30", |
| | "G1X-20Y-20/G1X-20.71Y-20.71/G1X-20Y-20/G1X-10Y-30", |
| | True, |
| | ), |
| | ("G1Y-20/G1X10", "G1Y-20/G1Y-21/G1Y-20/G1X10", True), |
| | ( |
| | "G1X20Y-20/G1X30Y-10", |
| | "G1X20Y-20/G1X20.71Y-20.71/G1X20Y-20/G1X30Y-10", |
| | True, |
| | ), |
| | |
| | ("G1X20/G1Y-10", "G1X20/G1X21/G1X20/G1Y-10", False), |
| | ("G1X20Y20/G1X30Y10", "G1X20Y20/G1X20.71Y20.71/G1X20Y20/G1X30Y10", False), |
| | ("G1Y20/G1X10", "G1Y20/G1Y21/G1Y20/G1X10", False), |
| | ( |
| | "G1X-20Y20/G1X-10Y30", |
| | "G1X-20Y20/G1X-20.71Y20.71/G1X-20Y20/G1X-10Y30", |
| | False, |
| | ), |
| | ("G1X-20/G1Y10", "G1X-20/G1X-21/G1X-20/G1Y10", False), |
| | ( |
| | "G1X-20Y-20/G1X-30Y-10", |
| | "G1X-20Y-20/G1X-20.71Y-20.71/G1X-20Y-20/G1X-30Y-10", |
| | False, |
| | ), |
| | ("G1Y-20/G1X-10", "G1Y-20/G1Y-21/G1Y-20/G1X-10", False), |
| | ( |
| | "G1X20Y-20/G1X10Y-30", |
| | "G1X20Y-20/G1X20.71Y-20.71/G1X20Y-20/G1X10Y-30", |
| | False, |
| | ), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_1): |
| | check_tbone_s("1", i, path, out, right) |
| |
|
| | def test50(self): |
| | """Verify TBone_L style""" |
| |
|
| | def check_tbone_l(d, i, path, out, right): |
| | obj = CreateDressup(f"(m{d}.{i:02})/{path}") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | if right: |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | else: |
| | obj.Side = Path.Dressup.DogboneII.Side.Left |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_L |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, f"(m{d}.{i:02})/{out}") |
| |
|
| | |
| | test_data_1 = [ |
| | |
| | ("G1X10/G1Y20", "G1X10/G1X11/G1X10/G1Y20", True), |
| | ("G1X10Y10/G1X-10Y30", "G1X10Y10/G1X10.71Y10.71/G1X10Y10/G1X-10Y30", True), |
| | ("G1Y10/G1X-20", "G1Y10/G1Y11/G1Y10/G1X-20", True), |
| | ( |
| | "G1X-10Y10/G1X-30Y-10", |
| | "G1X-10Y10/G1X-10.71Y10.71/G1X-10Y10/G1X-30Y-10", |
| | True, |
| | ), |
| | ("G1X-10/G1Y-20", "G1X-10/G1X-11/G1X-10/G1Y-20", True), |
| | ( |
| | "G1X-10Y-10/G1X10Y-30", |
| | "G1X-10Y-10/G1X-10.71Y-10.71/G1X-10Y-10/G1X10Y-30", |
| | True, |
| | ), |
| | ("G1Y-10/G1X20", "G1Y-10/G1Y-11/G1Y-10/G1X20", True), |
| | ( |
| | "G1X10Y-10/G1X30Y10", |
| | "G1X10Y-10/G1X10.71Y-10.71/G1X10Y-10/G1X30Y10", |
| | True, |
| | ), |
| | |
| | ("G1X10/G1Y-20", "G1X10/G1X11/G1X10/G1Y-20", False), |
| | ("G1X10Y10/G1X30Y-10", "G1X10Y10/G1X10.71Y10.71/G1X10Y10/G1X30Y-10", False), |
| | ("G1Y10/G1X20", "G1Y10/G1Y11/G1Y10/G1X20", False), |
| | ( |
| | "G1X-10Y10/G1X10Y30", |
| | "G1X-10Y10/G1X-10.71Y10.71/G1X-10Y10/G1X10Y30", |
| | False, |
| | ), |
| | ("G1X-10/G1Y20", "G1X-10/G1X-11/G1X-10/G1Y20", False), |
| | ( |
| | "G1X-10Y-10/G1X-30Y10", |
| | "G1X-10Y-10/G1X-10.71Y-10.71/G1X-10Y-10/G1X-30Y10", |
| | False, |
| | ), |
| | ("G1Y-10/G1X-20", "G1Y-10/G1Y-11/G1Y-10/G1X-20", False), |
| | ( |
| | "G1X10Y-10/G1X-10Y-30", |
| | "G1X10Y-10/G1X10.71Y-10.71/G1X10Y-10/G1X-10Y-30", |
| | False, |
| | ), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_1): |
| | check_tbone_l("1", i, path, out, right) |
| |
|
| | |
| | test_data_0 = [ |
| | |
| | ("G1X20/G1Y10", "G1X20/G1Y-1/G1Y0/G1Y10", True), |
| | ("G1X20Y20/G1X10Y30", "G1X20Y20/G1X20.71Y19.29/G1X20Y20/G1X10Y30", True), |
| | ("G1Y20/G1X-10", "G1Y20/G1X1/G1X0/G1X-10", True), |
| | ( |
| | "G1X-20Y20/G1X-30Y10", |
| | "G1X-20Y20/G1X-19.29Y20.71/G1X-20Y20/G1X-30Y10", |
| | True, |
| | ), |
| | ("G1X-20/G1Y-10", "G1X-20/G1Y1/G1Y0/G1Y-10", True), |
| | ( |
| | "G1X-20Y-20/G1X-10Y-30", |
| | "G1X-20Y-20/G1X-20.71Y-19.29/G1X-20Y-20/G1X-10Y-30", |
| | True, |
| | ), |
| | ("G1Y-20/G1X10", "G1Y-20/G1X-1/G1X0/G1X10", True), |
| | ( |
| | "G1X20Y-20/G1X30Y-10", |
| | "G1X20Y-20/G1X19.29Y-20.71/G1X20Y-20/G1X30Y-10", |
| | True, |
| | ), |
| | |
| | ("G1X20/G1Y-10", "G1X20/G1Y1/G1Y0/G1Y-10", False), |
| | ("G1X20Y20/G1X30Y10", "G1X20Y20/G1X19.29Y20.71/G1X20Y20/G1X30Y10", False), |
| | ("G1Y20/G1X10", "G1Y20/G1X-1/G1X0/G1X10", False), |
| | ( |
| | "G1X-20Y20/G1X-10Y30", |
| | "G1X-20Y20/G1X-20.71Y19.29/G1X-20Y20/G1X-10Y30", |
| | False, |
| | ), |
| | ("G1X-20/G1Y10", "G1X-20/G1Y-1/G1Y0/G1Y10", False), |
| | ( |
| | "G1X-20Y-20/G1X-30Y-10", |
| | "G1X-20Y-20/G1X-19.29Y-20.71/G1X-20Y-20/G1X-30Y-10", |
| | False, |
| | ), |
| | ("G1Y-20/G1X-10", "G1Y-20/G1X1/G1X0/G1X-10", False), |
| | ( |
| | "G1X20Y-20/G1X10Y-30", |
| | "G1X20Y-20/G1X20.71Y-19.29/G1X20Y-20/G1X10Y-30", |
| | False, |
| | ), |
| | ] |
| |
|
| | for i, (path, out, right) in enumerate(test_data_0): |
| | check_tbone_l("0", i, path, out, right) |
| |
|
| | def test60(self): |
| | """Verify Dogbone style""" |
| |
|
| | obj = CreateDressup("G1X10/G1Y20") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Style = Path.Dressup.DogboneII.Style.Dogbone |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/G1X10.71Y-0.71/G1X10Y0/G1Y20") |
| |
|
| | def test70(self): |
| | """Verify custom length.""" |
| |
|
| | obj = CreateDressup("G0Z10/G1Z0/G1X10/G1Y10/G1X0/G1Y0/G0Z10") |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Incision = Path.Dressup.DogboneII.Incision.Custom |
| | obj.Custom = 3 |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath( |
| | obj.Path, |
| | "G0Z10/G1Z0/G1X10/G1X13/G1X10/G1Y10/G1X13/G1X10/G1X0/G1X-3/G1X0/G1Y0/G1X-3/G1X0/G0Z10", |
| | ) |
| |
|
| | obj.Custom = 2 |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath( |
| | obj.Path, |
| | "G0Z10/G1Z0/G1X10/G1X12/G1X10/G1Y10/G1X12/G1X10/G1X0/G1X-2/G1X0/G1Y0/G1X-2/G1X0/G0Z10", |
| | ) |
| |
|
| | def test80(self): |
| | """Verify adaptive length.""" |
| |
|
| | obj = CreateDressup("G1X10/G1Y20") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Adaptive |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Style = Path.Dressup.DogboneII.Style.Dogbone |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/G1X10.29Y-0.29/G1X10Y0/G1Y20") |
| |
|
| | def test81(self): |
| | """Verify adaptive length II.""" |
| |
|
| | obj = CreateDressup("G1X10/G1X20Y20") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Adaptive |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| |
|
| | obj.Style = Path.Dressup.DogboneII.Style.Dogbone |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath(obj.Path, "G1X10/G1X10.09Y-0.15/G1X10Y0/G1X20Y20") |
| |
|
| | def test90(self): |
| | """Verify dogbone blacklist""" |
| |
|
| | obj = CreateDressup("G0Z10/G1Z0/G1X10/G1Y10/G1X0/G1Y0/G0Z10") |
| | obj.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| | obj.Side = Path.Dressup.DogboneII.Side.Right |
| | obj.BoneBlacklist = [0, 2] |
| | obj.Proxy.execute(obj) |
| | self.assertEqualPath( |
| | obj.Path, "G0Z10/G1Z0/G1X10/G1Y10/G1X11/G1X10/G1X0/G1Y0/G1X-1/G1X0/G0Z10" |
| | ) |
| | return obj |
| |
|
| | def test91(self): |
| | """Verify dogbone on dogbone""" |
| |
|
| | obj = self.test90() |
| |
|
| | obj2 = MockFeaturePython("DressupDogbone001") |
| | db2 = Path.Dressup.DogboneII.Proxy(obj2, obj) |
| | obj2.Proxy = db2 |
| | obj2.Incision = Path.Dressup.DogboneII.Incision.Fixed |
| | obj2.Style = Path.Dressup.DogboneII.Style.Tbone_H |
| | obj2.Side = Path.Dressup.DogboneII.Side.Right |
| | obj2.BoneBlacklist = [1] |
| | obj2.Proxy.execute(obj2) |
| | self.assertEqualPath( |
| | obj2.Path, |
| | "G0Z10/G1Z0/G1X10/G1X11/G1X10/G1Y10/G1X11/G1X10/G1X0/G1X-1/G1X0/G1Y0/G1X-1/G1X0/G0Z10", |
| | ) |
| |
|