13
13
Optional ,
14
14
Sequence ,
15
15
TextIO ,
16
+ TypeAlias ,
16
17
TypeVar ,
17
18
Union ,
18
19
overload ,
@@ -109,11 +110,11 @@ def format_svg(path: Iterable[SvgPathCommand], float_format: str = "f") -> str:
109
110
)
110
111
111
112
112
- SvgPathLike = Union [str , Iterable [SvgPathCommand ], svgelements .Path ]
113
- ShapeElement = svgelements .Shape
114
- ParentElement = Union [svgelements .Group , svgelements .Use ]
113
+ SvgPathLike : TypeAlias = Union [str , Iterable [SvgPathCommand ], svgelements .Path ]
114
+ ShapeElement : TypeAlias = svgelements .Shape
115
+ ParentElement : TypeAlias = Union [svgelements .Group , svgelements .Use ]
115
116
116
- FaceOrWire = Union [TopoDS_Wire , TopoDS_Face ]
117
+ FaceOrWire : TypeAlias = Union [TopoDS_Wire , TopoDS_Face ]
117
118
118
119
119
120
class DocumentInfo (NamedTuple ):
@@ -220,31 +221,31 @@ def process_wire(
220
221
yield from wires
221
222
222
223
if metadata :
223
- wires_from_doc = wires_from_svg_document (
224
+ wires_from_doc_with_metadata = wires_from_svg_document (
224
225
svg_file ,
225
226
ignore_visibility = ignore_visibility ,
226
227
metadata_factory = metadata ,
227
228
)
228
- transform = doc_transform (wires_from_doc .doc_info )
229
+ transform = doc_transform (wires_from_doc_with_metadata .doc_info )
229
230
items = (
230
- (transform (face_or_wire ), m )
231
- for wires , is_filled , m in wires_from_doc
231
+ (transform (face_or_wire ), metadata )
232
+ for wires , is_filled , metadata in wires_from_doc_with_metadata
232
233
for face_or_wire in process_wire (wires , is_filled )
233
234
)
234
- return ItemsFromDocument (items , wires_from_doc .doc_info )
235
+ return ItemsFromDocument (items , wires_from_doc_with_metadata .doc_info )
235
236
else :
236
- wires_from_doc = wires_from_svg_document (
237
+ wires_from_doc_without_metadata = wires_from_svg_document (
237
238
svg_file ,
238
239
ignore_visibility = ignore_visibility ,
239
240
metadata_factory = None ,
240
241
)
241
- transform = doc_transform (wires_from_doc .doc_info )
242
+ transform = doc_transform (wires_from_doc_without_metadata .doc_info )
242
243
items = (
243
244
transform (face_or_wire )
244
- for wires , is_filled , _metadata in wires_from_doc
245
+ for wires , is_filled , _metadata in wires_from_doc_without_metadata
245
246
for face_or_wire in process_wire (wires , is_filled )
246
247
)
247
- return ItemsFromDocument (items , wires_from_doc .doc_info )
248
+ return ItemsFromDocument (items , wires_from_doc_without_metadata .doc_info )
248
249
249
250
250
251
class ColorAndLabel :
@@ -274,6 +275,8 @@ def _color(
274
275
return tuple (float (v ) / 255 for v in rgba ) # type: ignore
275
276
except TypeError :
276
277
return 0 , 0 , 0 , 1
278
+ else :
279
+ return None
277
280
278
281
@staticmethod
279
282
def _label (element : Union [ShapeElement , ParentElement ], label_by : str ):
@@ -312,6 +315,8 @@ def check_unskewed_transform() -> Union[tuple[float, float, float], None]:
312
315
is_skewed = abs (o .angle_to (y ) - o .angle_to (x )) != pi / 2 # type: ignore
313
316
if not is_skewed :
314
317
return o .distance_to (x ), o .distance_to (y ), o .angle_to (x ) # type: ignore
318
+ else :
319
+ return None
315
320
316
321
element .reify ()
317
322
@@ -325,11 +330,12 @@ def check_unskewed_transform() -> Union[tuple[float, float, float], None]:
325
330
scale_x , scale_y , angle = scale_and_angle
326
331
r1 = float (element .rx ) * scale_x # type: ignore
327
332
r2 = float (element .ry ) * scale_y # type: ignore
328
- if r1 == r2 :
329
- curve = circle_curve (r1 , center = center )
330
- else :
331
- curve = ellipse_curve (r1 , r2 , center = center , rotation = degrees (angle ))
332
- yield wire_from_continuous_edges ((edge_from_curve (curve ),))
333
+ circle_or_ellpise = (
334
+ circle_curve (r1 , center = center )
335
+ if r1 == r2
336
+ else ellipse_curve (r1 , r2 , center = center , rotation = degrees (angle ))
337
+ )
338
+ yield wire_from_continuous_edges ((edge_from_curve (circle_or_ellpise ),))
333
339
334
340
elif path := svg_element_to_path (element ):
335
341
yield from wires_from_svg_path (path )
@@ -503,7 +509,7 @@ def wire_to_svg_path(
503
509
# but wires can be non-manifold or otherwise degenerate and may not have visit them all.
504
510
# We'll add remaining edges individually
505
511
506
- #TODO use a set if/when OCP implements `__eq__`
512
+ # TODO use a set if/when OCP implements `__eq__`
507
513
all_edges = {hash (e ): e for e in map (TopoDS .Edge_s , topoDS_iterator (wire ))}
508
514
509
515
if len (ordered_edges ) < len (all_edges ):
@@ -777,25 +783,25 @@ def is_filled(element: ShapeElement):
777
783
return fill .value is not None # type: ignore
778
784
779
785
if callable (metadata_factory ):
780
- wires = (
786
+ wires_with_metadata = (
781
787
(
782
788
list (wires_from_svg_element (source_element )),
783
789
is_filled (source_element ),
784
790
metadata_factory (source_element , source_parents ),
785
791
)
786
792
for source_element , source_parents in elements
787
793
)
788
- return ItemsFromDocument (wires , elements .doc_info )
794
+ return ItemsFromDocument (wires_with_metadata , elements .doc_info )
789
795
else :
790
- wires = (
796
+ wires_without_metadata = (
791
797
(
792
798
list (wires_from_svg_element (source_element )),
793
799
is_filled (source_element ),
794
800
None ,
795
801
)
796
802
for source_element , _source_parents in elements
797
803
)
798
- return ItemsFromDocument (wires , elements .doc_info )
804
+ return ItemsFromDocument (wires_without_metadata , elements .doc_info )
799
805
800
806
801
807
def find_shapes_svg_in_document (
@@ -806,7 +812,7 @@ def find_shapes_svg_in_document(
806
812
def walk_svg_element (
807
813
element : svgelements .SVGElement , parents : tuple [ParentElement , ...] = ()
808
814
) -> Iterator [tuple [ShapeElement , tuple [ParentElement , ...]]]:
809
- if isinstance (element , ShapeElement ):
815
+ if isinstance (element , svgelements . Shape ):
810
816
yield element , parents
811
817
elif isinstance (element , (svgelements .Group , svgelements .Use )):
812
818
new_parents = * parents , element
0 commit comments