예제 #1
0
class SceneImporter:

    _logger = _module_logger.getChild('SceneImporter')

    ##############################################

    def __init__(self, dxf_path):

        self._importer = DxfImporter(dxf_path)
        self._scene = QtScene()

        self._bounding_box = None
        for item in self._importer:
            self._add_item(item)
        self._scene.bounding_box = self._bounding_box  # Fixme:

    ##############################################

    @property
    def scene(self):
        return self._scene

    ##############################################

    def _update_bounding_box(self, item):

        if hasattr(item, 'bounding_box'):
            interval = item.bounding_box
            if self._bounding_box is None:
                self._bounding_box = interval
            else:
                self._bounding_box |= interval

    ##############################################

    def _add_item(self, item):

        self._logger.info(item)

        line_width = 3.

        path_style = GraphicPathStyle(
            line_width=line_width,
            stroke_color=Colors.black,
            stroke_style=StrokeStyle.SolidLine,
        )

        if isinstance(item, list):
            for segment in item:
                self._add_item(segment)

        elif isinstance(item, BSpline2D):
            path_style = GraphicPathStyle(
                line_width=line_width,
                stroke_color=Colors.blue_blue,
            )
            self._scene.polyline(
                item.points,
                path_style,
                user_data=item,
            )
            path_style = GraphicBezierStyle(
                line_width=5.0,
                stroke_color=Colors.black,
                show_control=True,
                control_color=Colors.red,
            )
            self._scene.add_spline(item, path_style)

        else:
            self._scene.add_geometry(item, path_style)

        self._update_bounding_box(item)
예제 #2
0
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):

        center = (0, 0)
        ellipses = [Ellipse2D(center, 20, 10, angle=angle)
                    for angle in range(0, 360, 20)]
        center = (50, 0)
        ellipse_arc = Ellipse2D(center, 20, 10, angle=60, domain=AngularDomain(30, 160))

        ellipses_bezier = [ellipse.to_bezier() for ellipse in ellipses]
        flat_ellipses_bezier = []
        for segments in ellipses_bezier:
            flat_ellipses_bezier += list(segments)

        return [
            *flat_ellipses_bezier,
            *ellipse_arc.to_bezier(),
        ]

    ##############################################

    def _add_item(self, item):

        path_style = GraphicPathStyle(
            line_width=self._line_width,
            stroke_color=Colors.black,
            stroke_style=StrokeStyle.SolidLine,
            cap_style=CapStyle.RoundCap,
        )

        self._scene.add_geometry(item, path_style)
        # Fixme: why here ???
        self._update_bounding_box(item)
예제 #3
0
class SceneBuilder:

    ##############################################

    def __init__(self):

        self._scene = QtScene()

        self._bounding_box = None
        for item in (self._make_polygon(), ):
            self._add_item(item)
        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_polygon(self):

        points = Vector2D.from_coordinates(
            (0, 0),
            (-1, 2),
            (0, 3),
            (2, 4),
            (1, 5),
            (4, 6),
            (3, 3),
            (5, 3),
            (7, 3),
            (7, 2),
            (6, 1),
            (3, 2),
            (2, 1),
        )

        polygon = Polygon2D(*points)
        return polygon

    ##############################################

    def _add_item(self, item):

        path_style = GraphicPathStyle(
            line_width=3.0,
            stroke_color=Colors.black,
            stroke_style=StrokeStyle.SolidLine,
        )

        self._scene.add_geometry(item, path_style)

        # Fixme: why here ???
        self._update_bounding_box(item)
예제 #4
0
파일: test-arrow.py 프로젝트: maaaash/Patro
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):

        items = []
        for angle in range(0, 360, 30):
            point1 = Vector2D(0, 0)
            point2 = Vector2D.from_polar(50, angle)
            segment = Segment2D(point1, point2)
            items.append(segment)
            head = TriangularHead(point2, segment.direction, length=5, width=5)
            # head = head.to_path()
            items.append(head)

        return items

    ##############################################

    def _add_item(self, item):

        path_style = GraphicPathStyle(
            line_width=self._line_width,
            stroke_color=Colors.black,
            stroke_style=StrokeStyle.SolidLine,
            cap_style=CapStyle.RoundCap,
        )

        if isinstance(item, ArrowHead):
            path_style.fill_color = Colors.black

        self._scene.add_geometry(item, path_style)
        # Fixme: why here ???
        self._update_bounding_box(item)
예제 #5
0
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)