From fd2d80ead21590d57c859a5ff818616466032c8d Mon Sep 17 00:00:00 2001 From: akiva Date: Sat, 24 Jan 2026 16:30:34 -0800 Subject: [PATCH 1/4] Enhance color initialization with hex support --- cadquery/occ_impl/assembly.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cadquery/occ_impl/assembly.py b/cadquery/occ_impl/assembly.py index 4369a9f8c..a65bbb08e 100644 --- a/cadquery/occ_impl/assembly.py +++ b/cadquery/occ_impl/assembly.py @@ -226,7 +226,8 @@ def __init__(self, *args, **kwargs): self.wrapped = Quantity_ColorRGBA() elif len(args) == 1: self.wrapped = Quantity_ColorRGBA() - exists = Quantity_ColorRGBA.ColorFromName_s(args[0], self.wrapped) + exists = (Quantity_ColorRGBA.ColorFromName_s(args[0], self.wrapped) or + Quantity_ColorRGBA.ColorFromHex_s(args[0], self.wrapped)) if not exists: raise ValueError(f"Unknown color name: {args[0]}") elif len(args) == 3: From d26a20241f3c083bf1539b5ab9a188155e77432e Mon Sep 17 00:00:00 2001 From: Akiva Bamberger Date: Sat, 24 Jan 2026 16:46:10 -0800 Subject: [PATCH 2/4] format --- cadquery/occ_impl/assembly.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cadquery/occ_impl/assembly.py b/cadquery/occ_impl/assembly.py index a65bbb08e..11d1f8dc8 100644 --- a/cadquery/occ_impl/assembly.py +++ b/cadquery/occ_impl/assembly.py @@ -226,8 +226,9 @@ def __init__(self, *args, **kwargs): self.wrapped = Quantity_ColorRGBA() elif len(args) == 1: self.wrapped = Quantity_ColorRGBA() - exists = (Quantity_ColorRGBA.ColorFromName_s(args[0], self.wrapped) or - Quantity_ColorRGBA.ColorFromHex_s(args[0], self.wrapped)) + exists = Quantity_ColorRGBA.ColorFromName_s( + args[0], self.wrapped + ) or Quantity_ColorRGBA.ColorFromHex_s(args[0], self.wrapped) if not exists: raise ValueError(f"Unknown color name: {args[0]}") elif len(args) == 3: From 91a69c2f50745b923c9fda24eecb008e019c9797 Mon Sep 17 00:00:00 2001 From: Akiva Bamberger Date: Tue, 27 Jan 2026 21:32:12 -0800 Subject: [PATCH 3/4] add tests for examples given by OCP --- tests/test_assembly.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_assembly.py b/tests/test_assembly.py index 6dc2255d0..ad644ee39 100644 --- a/tests/test_assembly.py +++ b/tests/test_assembly.py @@ -644,6 +644,33 @@ def test_color(): assert c4.wrapped.GetRGB().Green() == pytest.approx(0.2) assert c4.wrapped.Alpha() == 0.5 + # "#FF0" for short sRGB color, "#FF0F" for short sRGBA color, "#FFFF00" for RGB color, or "#FFFF00FF" for RGBA color + c5 = cq.Color("#FF0") + assert c5.wrapped.GetRGB().Red() == 1 + assert c5.wrapped.GetRGB().Green() == 1 + assert c5.wrapped.GetRGB().Blue() == 0 + with pytest.raises(AttributeError): + c5.wrapped.GetRGB().Alpha() + + c6 = cq.Color("#FF0F") + assert c6.wrapped.GetRGB().Red() == 1 + assert c6.wrapped.GetRGB().Green() == 1 + assert c6.wrapped.GetRGB().Blue() == 0 + assert c6.wrapped.Alpha() == 1.0 + + c7 = cq.Color("#FFFF00") + assert c7.wrapped.GetRGB().Red() == 1 + assert c7.wrapped.GetRGB().Green() == 1 + assert c7.wrapped.GetRGB().Blue() == 0 + with pytest.raises(AttributeError): + c7.wrapped.GetRGB().Alpha() + + c8 = cq.Color("#FFFF00FF") + assert c8.wrapped.GetRGB().Red() == 1 + assert c8.wrapped.GetRGB().Green() == 1 + assert c8.wrapped.GetRGB().Blue() == 0 + assert c8.wrapped.Alpha() == 1.0 + with pytest.raises(ValueError): cq.Color("?????") From ca3dc696b2681ccdd056f052042ece0f512704d4 Mon Sep 17 00:00:00 2001 From: Akiva Bamberger Date: Tue, 27 Jan 2026 21:34:25 -0800 Subject: [PATCH 4/4] add comments for test --- tests/test_assembly.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_assembly.py b/tests/test_assembly.py index ad644ee39..2b0b3180d 100644 --- a/tests/test_assembly.py +++ b/tests/test_assembly.py @@ -644,7 +644,7 @@ def test_color(): assert c4.wrapped.GetRGB().Green() == pytest.approx(0.2) assert c4.wrapped.Alpha() == 0.5 - # "#FF0" for short sRGB color, "#FF0F" for short sRGBA color, "#FFFF00" for RGB color, or "#FFFF00FF" for RGBA color + # test for hex string for short sRGB color c5 = cq.Color("#FF0") assert c5.wrapped.GetRGB().Red() == 1 assert c5.wrapped.GetRGB().Green() == 1 @@ -652,12 +652,14 @@ def test_color(): with pytest.raises(AttributeError): c5.wrapped.GetRGB().Alpha() + # test for hex string for short sRGBA color c6 = cq.Color("#FF0F") assert c6.wrapped.GetRGB().Red() == 1 assert c6.wrapped.GetRGB().Green() == 1 assert c6.wrapped.GetRGB().Blue() == 0 assert c6.wrapped.Alpha() == 1.0 + # test for hex string for RGB color c7 = cq.Color("#FFFF00") assert c7.wrapped.GetRGB().Red() == 1 assert c7.wrapped.GetRGB().Green() == 1 @@ -665,6 +667,7 @@ def test_color(): with pytest.raises(AttributeError): c7.wrapped.GetRGB().Alpha() + # test for hex string for RGBA color c8 = cq.Color("#FFFF00FF") assert c8.wrapped.GetRGB().Red() == 1 assert c8.wrapped.GetRGB().Green() == 1