diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..7fb5cdf5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "python.linting.flake8Enabled": false, + "python.linting.pylintEnabled": true, + "python.linting.enabled": true, + "python.pythonPath": "C:\\Users\\micha\\Anaconda3\\envs\\cq\\python.exe" +} \ No newline at end of file diff --git a/cadquery/cq.py b/cadquery/cq.py index 6d51d04a..30ee9ae1 100644 --- a/cadquery/cq.py +++ b/cadquery/cq.py @@ -376,9 +376,7 @@ class CQ(object): # update center to projected origin if desired if centerOption == 'ProjectedOrigin': - projected_center = Vector(0, 0, 0) - projected_center.projectToPlane(center, normal) - center = projected_center + center = Vector(0, 0, 0).projectToPlane(center, normal) # invert if requested if invert: diff --git a/cadquery/occ_impl/geom.py b/cadquery/occ_impl/geom.py index b991ddff..e8d54afc 100644 --- a/cadquery/occ_impl/geom.py +++ b/cadquery/occ_impl/geom.py @@ -154,9 +154,12 @@ class Vector(object): if len(args) == 2: base = args[0] normal = args[1] - else: + elif len(args) == 1: base = args[0].origin - normal = args[1].zDir + normal = args[0].zDir + else: + raise TypeError("Expected 1 or 2 arguments consisting of 1 Plane object \ +or a base Vector and a normal Vector object.") result = self-normal*(((self-base).dot(normal))/normal.Length**2) @@ -164,6 +167,8 @@ class Vector(object): self.y = result.y self.z = result.z + return self + def __neg__(self): return self * -1 diff --git a/tests/TestCadObjects.py b/tests/TestCadObjects.py index 6b1e4ff4..09efaa9b 100644 --- a/tests/TestCadObjects.py +++ b/tests/TestCadObjects.py @@ -151,6 +151,34 @@ class TestCadObjects(BaseTest): self.assertEqual(a, b) self.assertEqual(a, c) + def testVectorProject(self): + """ + Test method to project vector to plane. + """ + decimal_places = 9 + + normal = Vector(1, 2, 3) + base = Vector(5, 7, 9) + x_dir = Vector(1, 0, 0) + + # test passing plane defined by base and normal + point = Vector(10, 11, 12).projectToPlane(base, normal) + self.assertTupleAlmostEquals(point.toTuple(), (59/7, 55/7, 51/7), + decimal_places) + + point = Vector(10, 11, 12).projectToPlane(base, normal.normalized()) + self.assertTupleAlmostEquals(point.toTuple(), (59/7, 55/7, 51/7), + decimal_places) + + # test passing Plane object + point = Vector(10, 11, 12).projectToPlane(Plane(base, x_dir, normal)) + self.assertTupleAlmostEquals(point.toTuple(), (59/7, 55/7, 51/7), + decimal_places) + + # test wrong number of input arguments + with self.assertRaises(TypeError): + Vector(10,11.12).projectToPlane(1,1,1) + def testMatrixCreationAndAccess(self): def matrix_vals(m): return [[m[r,c] for c in range(4)] for r in range(4)]