Skip to content
test-path.py 4.63 KiB
Newer Older
####################################################################################################

from Patro.Common.Logging import Logging
Logging.setup_logging()

from Patro.GeometryEngine.Path import (
    Path2D,
    LinearSegment, QuadraticBezierSegment, CubicBezierSegment
)
from Patro.GeometryEngine.Vector import Vector2D
from Patro.GraphicEngine.GraphicScene.GraphicItem import GraphicPathStyle, GraphicBezierStyle
from Patro.GraphicEngine.Painter.QtPainter import QtScene
from Patro.GraphicStyle import Colors, StrokeStyle

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

class SceneBuilder:

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

    def __init__(self):

        self._scene = QtScene()

        self._bounding_box = None
        for path in (
                self._make_path1(),
                self._make_path2(),
                self._make_path3(),
                ):
            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_path1(self):

        start_point = Vector2D(0, 0)
        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_path2(self):

        start_point = Vector2D(20, 0)
        path = Path2D(start_point)
        path.line_to(Vector2D(10, 0))
        path.line_to(Vector2D(0, 10), radius=5)
        path.line_to(Vector2D(10, 0), radius=5)
        path.line_to(Vector2D(0, 20), radius=5)
        path.line_to(Vector2D(-10, 0), radius=5)
        path.line_to(Vector2D(0, -10), radius=5)

        return path

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

    def _make_path3(self):

        start_point = Vector2D(40, 0)
        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)

        return path

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

    def _add_path(self, path):

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

        for item in path:
            # print('Path part:', item)
            if isinstance(item, LinearSegment):
                # print('linear', item.start_point, item.stop_point, item.points)
                if item.radius is not None:
                    print('-'*10)
                    print(item.bissector)
                    print(item.bulge_angle, item.bulge_center, item.start_point, item.stop_point)
                    print(item.bulge_geometry)
                    arc = item.bulge_geometry
                    self._scene.circle(arc.center, arc.radius,
                                       path_style,
                                       start_angle=arc.domain.start,
                                       stop_angle=arc.domain.stop,
                                       user_data=item,
                    )
                self._scene.segment(*item.points,
                                    path_style,
                                    user_data=item,
                )
            elif isinstance(item, QuadraticBezierSegment):
                self._scene.quadratic_bezier(*item.points,
                                             path_style,
                                             user_data=item,
                )
            elif isinstance(item, CubicBezierSegment):
                self._scene.cubic_bezier(*item.points,
                                         path_style,
                                         user_data=item,
                )
            # Fixme: why here ???
            self._update_bounding_box(item)

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

scene = QtScene()

scene_builder = SceneBuilder()

application.qml_application.scene = scene_builder.scene