class SceneImporter(SvgFileInternal): _logger = _module_logger.getChild('SceneImporter') ############################################## def __init__(self, svg_path): self._bounding_box = None self._item_counter = 0 self._scene = QtScene() super().__init__(svg_path) # Fixme: self._scene.bounding_box = self._bounding_box self._logger.info('Number of SVG item: {}'.format(self._item_counter)) self._logger.info('Number of scene item: {}'.format(self._scene.number_of_items)) ############################################## @property def scene(self): return self._scene ############################################## def _update_bounding_box(self, item): interval = item.bounding_box if self._bounding_box is None: self._bounding_box = interval else: self._bounding_box |= interval ############################################## def on_svg_root(self, svg_root): super().on_svg_root(svg_root) self._screen_transformation = AffineTransformation2D.Screen(self._view_box.y.sup) ############################################## def on_group(self, group): # self._logger.info('Group: {}\n{}'.format(group.id, group)) pass ############################################## def on_graphic_item(self, item): # d=" # m 31.589881,269.68673 # a 5,10 0 0 1 7.061333, 0.48142 # 5,10 0 0 1 -0.229465, 14.12342 # 5,10 0 0 1 -7.062064, -0.43644 # 5,10 0 0 1 0.20697 , -14.1248 # L 35,277.00003 # Z" # if item.id == 'ellipse': # print(item) # for part in item.path_data: # print(part) state = self._dispatcher.state.clone().merge(item) # self._logger.info('Item: {}\n{}'.format(item.id, item)) # self._logger.info('Item State:\n' + str(state)) self._item_counter += 1 stroke_style = StrokeStyle.SolidLine if state.stroke_dasharray is None else StrokeStyle.DashLine fill_color = None if state.fill is None else Color(state.fill) path_style = GraphicPathStyle( line_width=2, stroke_color=Colors.black, stroke_style=stroke_style, cap_style=CapStyle.RoundCap, # fill_color=fill_color, ) transformation = self._screen_transformation * state.transform # transformation = state.transform # self._logger.info('Sate Transform\n' + str(transformation)) if isinstance(item, SvgFormat.Path): # and state.stroke_dasharray is None path = item.path_data elif isinstance(item, SvgFormat.Rect): path = item.geometry path = path.transform(transformation) self._update_bounding_box(path) self._scene.add_path(path, path_style)
class SceneBuilder: ############################################## def __init__(self): self._scene = QtScene() self._bounding_box = None for path in ( self._make_directional_path((0, 0)), self._make_rounded_rectangle((20, 0), width=10, height=15, radius=5), self._make_closed_path((35, 0), radius=None), self._make_closed_path((55, 0), radius=3), self._make_absolute_cw_path((0, 40), radius=3), self._make_absolute_ccw_path((0, 45), radius=3), self._make_quadratic((25, 40)), self._make_absolute_quadratic((35, 40)), self._make_cubic((40, 40)), self._make_absolute_cubic((50, 40)), ): self._add_path(path) self._scene.bounding_box = self._bounding_box # Fixme: ############################################## @property def scene(self): return self._scene ############################################## def _update_bounding_box(self, item): interval = item.bounding_box if self._bounding_box is None: self._bounding_box = interval else: self._bounding_box |= interval ############################################## def _make_directional_path(self, start_point): path = Path2D(start_point) path.horizontal_to(10) path.vertical_to(10) path.north_east_to(10) path.north_west_to(10) path.south_west_to(10) path.south_east_to(5) path.south_to(5) path.west_to(10) path.north_to(5) path.east_to(5) return path ############################################## def _make_rounded_rectangle(self, start_point, width, height, radius): path = Path2D(start_point) path.horizontal_to(width) path.vertical_to(height, radius=radius) path.horizontal_to(-width, radius=radius) path.close(radius=radius, close_radius=radius) return path ############################################## def _make_closed_path(self, start_point, radius): path = Path2D(start_point) path.line_to(Vector2D(10, 0)) path.line_to(Vector2D(0, 10), radius=radius) path.line_to(Vector2D(10, 0), radius=radius) path.line_to(Vector2D(0, 20), radius=radius) path.line_to(Vector2D(-10, 0), radius=radius) path.line_to(Vector2D(0, -10), radius=radius) path.close(radius=radius, close_radius=radius) return path ############################################## def _make_absolute_cw_path(self, start_point, radius): # radius = None path = Path2D(start_point) for i, vector in enumerate(( (10, -5), (5, -15), (-5, -15), (-10, -5), )): path.line_to(path.p0 + Vector2D(vector), absolute=True, radius=(radius if i else None)) path.close(radius=radius, close_radius=radius) return path ############################################## def _make_absolute_ccw_path(self, start_point, radius): path = Path2D(start_point) for i, vector in enumerate(( (10, 0), (15, 10), (5, 15), (-5, 10), )): path.line_to(path.p0 + Vector2D(vector), absolute=True, radius=(radius if i else None)) path.close(radius=radius, close_radius=radius) return path ############################################## def _make_quadratic(self, start_point): path = Path2D(start_point) path.quadratic_to( Vector2D(0, 10), Vector2D(10, 10), ) return path ############################################## def _make_absolute_quadratic(self, start_point): path = Path2D(start_point) path.quadratic_to( path.p0 + Vector2D(0, 10), path.p0 + Vector2D(10, 10), absolute=True, ) return path ############################################## def _make_cubic(self, start_point): path = Path2D(start_point) path.cubic_to( Vector2D(5, 10), Vector2D(10, 10), Vector2D(15, 0), ) return path ############################################## def _make_absolute_cubic(self, start_point): path = Path2D(start_point) path.cubic_to( path.p0 + Vector2D(5, 10), path.p0 + Vector2D(10, 10), path.p0 + Vector2D(15, 0), absolute=True, ) return path ############################################## def _add_path(self, path): path_style = GraphicPathStyle( line_width=3.0, stroke_color=Colors.black, stroke_style=StrokeStyle.SolidLine, ) self._scene.add_path(path, path_style) # Fixme: why here ??? self._update_bounding_box(path)
class SceneBuilder: ############################################## def __init__(self): self._scene = QtScene() self._bounding_box = None self._line_width = 5. for path in self._make_figure1(): self._add_item(path) self._scene.bounding_box = self._bounding_box # Fixme: ############################################## @property def scene(self): return self._scene ############################################## def _update_bounding_box(self, item): interval = item.bounding_box if self._bounding_box is None: self._bounding_box = interval else: self._bounding_box |= interval ############################################## def _make_figure1(self): width = 30 space = 2 seam_length = width / 4 long_arm_length = width / 2 short_arm_length = long_arm_length * .6 height = 4 radius = 2 vertical_seam_position = short_arm_length * 2 / 3 vertical_seam_length = height * 1.5 right_side_length = width / 4 y_right_side = height * 1.5 right_side_circle_radius = 1 path1 = Path2D((short_arm_length + space / 2, -height / 2)) path1.west_to(short_arm_length) path1.north_to(height, radius=radius) path1.east_to(long_arm_length, radius=radius) path2 = path1.x_mirror(clone=True) path3 = Path2D((-seam_length / 2, 0)) path3.east_to(seam_length) path4 = Path2D((vertical_seam_position, -vertical_seam_length / 2)) path4.north_to(vertical_seam_length) path5 = path4.x_mirror(clone=True) path6 = Path2D((-right_side_length / 2, y_right_side)) path6.east_to(right_side_length) circle = Circle2D((0, y_right_side), right_side_circle_radius) return [path1, path2, path3, path4, path5, path6, circle] ############################################## def _add_item(self, item): if isinstance(item, Path2D): self._add_path(item) elif isinstance(item, Circle2D): self._add_circle(item) ############################################## def _add_path(self, path): path_style = GraphicPathStyle( line_width=self._line_width, stroke_color=Colors.black, stroke_style=StrokeStyle.SolidLine, cap_style=CapStyle.RoundCap, ) self._scene.add_path(path, path_style) # Fixme: why here ??? self._update_bounding_box(path) ############################################## def _add_circle(self, circle): path_style = GraphicPathStyle( line_width=self._line_width, stroke_color=Colors.black, stroke_style=StrokeStyle.SolidLine, ) self._scene.add_geometry(circle, path_style) self._update_bounding_box(circle)