Files
create/src/Mod/CAM/CAMTests/TestPathToolLibrary.py
2025-05-19 20:27:28 +02:00

382 lines
12 KiB
Python

import unittest
from Path.Tool.library import Library
from Path.Tool.toolbit import ToolBitEndmill, ToolBitDrill, ToolBitVBit
from Path.Tool.shape import (
ToolBitShapeEndmill,
ToolBitShapeDrill,
ToolBitShapeVBit,
)
class TestPathToolLibrary(unittest.TestCase):
def test_init(self):
library = Library("Test Library")
self.assertEqual(library.label, "Test Library")
self.assertIsNotNone(library.id)
self.assertEqual(len(library._bits), 0)
self.assertEqual(len(library._bit_nos), 0)
def test_str(self):
library = Library("My Library", "123-abc")
self.assertEqual(str(library), '123-abc "My Library"')
def test_eq(self):
library1 = Library("Lib1", "same-id")
library2 = Library("Lib2", "same-id")
library3 = Library("Lib3", "different-id")
self.assertEqual(library1, library2)
self.assertNotEqual(library1, library3)
def test_iter(self):
library = Library("Test Library")
# Create ToolBitShape instances with required parameters
shape1 = ToolBitShapeEndmill(
id="dummy_endmill",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
library.add_bit(bit1)
library.add_bit(bit2)
_bits_list = list(library)
self.assertEqual(len(_bits_list), 2)
self.assertIn(bit1, _bits_list)
self.assertIn(bit2, _bits_list)
def test_get_next_bit_no(self):
library = Library("Test Library")
self.assertEqual(library.get_next_bit_no(), 1)
# Using ToolBit instances in _bit_nos with ToolBitShape
shape_a = ToolBitShapeEndmill(
id="dummy_a",
CuttingEdgeHeight=1.0,
Diameter=1.0,
Flutes=1,
Length=10.0,
ShankDiameter=1.0,
)
shape_b = ToolBitShapeDrill(
id="dummy_b",
Diameter=2.0,
Length=20.0,
ShankDiameter=2.0,
Flutes=2,
TipAngle=118.0,
)
shape_c = ToolBitShapeVBit(
id="dummy_c",
Diameter=3.0,
Angle=90.0,
Length=30.0,
ShankDiameter=3.0,
CuttingEdgeAngle=30.0,
CuttingEdgeHeight=10.0,
Flutes=2,
TipDiameter=1.0,
)
library._bit_nos = {
1: ToolBitEndmill(shape_a),
5: ToolBitDrill(shape_b),
2: ToolBitVBit(shape_c),
}
self.assertEqual(library.get_next_bit_no(), 6)
library._bit_nos = {}
self.assertEqual(library.get_next_bit_no(), 1)
def test_get_bit_no_from_bit(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_1",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_1",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
library.add_bit(bit1, 1)
library.add_bit(bit2, 2)
self.assertEqual(library.get_bit_no_from_bit(bit1), 1)
self.assertEqual(library.get_bit_no_from_bit(bit2), 2)
shape_cutter = ToolBitShapeVBit(
id="dummy_cutter_1",
Diameter=3.0,
Angle=90.0,
Length=30.0,
ShankDiameter=3.0,
CuttingEdgeAngle=30.0,
CuttingEdgeHeight=10.0,
Flutes=2,
TipDiameter=1.0,
)
self.assertIsNone(library.get_bit_no_from_bit(ToolBitVBit(shape_cutter)))
def test_assign_new_bit_no(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_2",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_2",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
# Assign bit1 without specifying number (should get 1)
library.add_bit(bit1)
self.assertEqual(len(library._bits), 1)
self.assertEqual(len(library._bit_nos), 1)
self.assertIn(1, library._bit_nos)
self.assertEqual(library._bit_nos[1], bit1)
# Assign bit2 to number 1 (should reassign bit1)
library.add_bit(bit2, 1)
self.assertEqual(len(library._bits), 2)
self.assertEqual(len(library._bit_nos), 2)
self.assertIn(1, library._bit_nos)
self.assertEqual(library._bit_nos[1], bit2)
# Check if bit1 was reassigned to a new bit number (should be 2)
self.assertIn(2, library._bit_nos)
self.assertEqual(library._bit_nos[2], bit1)
# Assign bit2 to number 10
library.assign_new_bit_no(bit2, 10)
self.assertEqual(len(library._bits), 2)
self.assertEqual(len(library._bit_nos), 2)
self.assertIn(10, library._bit_nos)
self.assertEqual(library._bit_nos[10], bit2)
self.assertNotIn(1, library._bit_nos) # bit2 should no longer be at 1
self.assertIn(2, library._bit_nos)
self.assertEqual(library._bit_nos[2], bit1)
# Assign bit1 to number 5
library.assign_new_bit_no(bit1, 5)
self.assertEqual(len(library._bits), 2)
self.assertEqual(len(library._bit_nos), 2)
self.assertIn(5, library._bit_nos)
self.assertEqual(library._bit_nos[5], bit1)
self.assertNotIn(2, library._bit_nos) # bit1 should no longer be at 2
self.assertIn(10, library._bit_nos)
self.assertEqual(library._bit_nos[10], bit2)
def test_add_bit(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_3",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_3",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
library.add_bit(bit1)
self.assertEqual(len(library._bits), 1)
self.assertIn(bit1, library._bits)
self.assertEqual(len(library._bit_nos), 1)
self.assertIn(1, library._bit_nos)
self.assertEqual(library._bit_nos[1], bit1)
library.add_bit(bit2, 5)
self.assertEqual(len(library._bits), 2)
self.assertIn(bit1, library._bits)
self.assertIn(bit2, library._bits)
self.assertEqual(len(library._bit_nos), 2)
self.assertIn(1, library._bit_nos)
self.assertEqual(library._bit_nos[1], bit1)
self.assertIn(5, library._bit_nos)
self.assertEqual(library._bit_nos[5], bit2)
# Add bit1 again (should not increase bit count in _bits list)
library.add_bit(bit1, 10)
self.assertEqual(len(library._bits), 2)
self.assertIn(bit1, library._bits)
self.assertIn(bit2, library._bits)
self.assertEqual(len(library._bit_nos), 2) # _bit_nos count remains 2
self.assertIn(10, library._bit_nos)
self.assertEqual(library._bit_nos[10], bit1)
self.assertIn(5, library._bit_nos)
self.assertEqual(library._bit_nos[5], bit2)
self.assertNotIn(1, library._bit_nos) # bit1 should no longer be at 1
def test_get_bits(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_4",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_4",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
self.assertEqual(library.get_bits(), [])
library.add_bit(bit1)
library.add_bit(bit2)
_bits_list = library.get_bits()
self.assertEqual(len(_bits_list), 2)
self.assertIn(bit1, _bits_list)
self.assertIn(bit2, _bits_list)
def test_has_bit(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_5",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_5",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
library.add_bit(bit1)
self.assertTrue(library.has_bit(bit1))
self.assertFalse(library.has_bit(bit2))
# Create a new ToolBit with the same properties but different instance
shape1_copy = ToolBitShapeEndmill(
id="dummy_endmill_5_copy", # Use a different ID for the copy
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
bit1_copy = ToolBitEndmill(shape1_copy)
self.assertFalse(library.has_bit(bit1_copy))
def test_remove_bit(self):
library = Library("Test Library")
shape1 = ToolBitShapeEndmill(
id="dummy_endmill_6",
CuttingEdgeHeight=10.0,
Diameter=10.0,
Flutes=2,
Length=50.0,
ShankDiameter=10.0,
)
shape2 = ToolBitShapeDrill(
id="dummy_drill_6",
Diameter=5.0,
Length=40.0,
ShankDiameter=5.0,
Flutes=2,
TipAngle=118.0,
)
shape3 = ToolBitShapeVBit(
id="dummy_cutter_6",
Diameter=3.0,
Angle=90.0,
Length=30.0,
ShankDiameter=3.0,
CuttingEdgeAngle=30.0,
CuttingEdgeHeight=10.0,
Flutes=2,
TipDiameter=1.0,
)
bit1 = ToolBitEndmill(shape1)
bit2 = ToolBitDrill(shape2)
bit3 = ToolBitVBit(shape3)
library.add_bit(bit1, 1)
library.add_bit(bit2, 2)
library.add_bit(bit3, 3)
self.assertEqual(len(library._bits), 3)
self.assertEqual(len(library._bit_nos), 3)
library.remove_bit(bit2)
self.assertEqual(len(library._bits), 2)
self.assertNotIn(bit2, library._bits)
self.assertEqual(len(library._bit_nos), 2)
self.assertNotIn(2, library._bit_nos)
self.assertNotIn(bit2, library._bit_nos.values())
library.remove_bit(bit1)
self.assertEqual(len(library._bits), 1)
self.assertNotIn(bit1, library._bits)
self.assertEqual(len(library._bit_nos), 1)
self.assertNotIn(1, library._bit_nos)
self.assertNotIn(bit1, library._bit_nos.values())
library.remove_bit(bit3)
self.assertEqual(len(library._bits), 0)
self.assertNotIn(bit3, library._bits)
self.assertEqual(len(library._bit_nos), 0)
self.assertNotIn(3, library._bit_nos)
self.assertNotIn(bit3, library._bit_nos.values())
# Removing a non-existent bit should not raise an error
shape_nonexistent = ToolBitShapeEndmill(
id="dummy_nonexistent_6",
CuttingEdgeHeight=99.0,
Diameter=99.0,
Flutes=1,
Length=99.0,
ShankDiameter=99.0,
)
library.remove_bit(ToolBitEndmill(shape_nonexistent))
self.assertEqual(len(library._bits), 0)
self.assertEqual(len(library._bit_nos), 0)
if __name__ == "__main__":
unittest.main()