Skip to content
...@@ -8,7 +8,7 @@ from Patro.GeometryEngine.Path import ( ...@@ -8,7 +8,7 @@ from Patro.GeometryEngine.Path import (
LinearSegment, QuadraticBezierSegment, CubicBezierSegment LinearSegment, QuadraticBezierSegment, CubicBezierSegment
) )
from Patro.GeometryEngine.Vector import Vector2D from Patro.GeometryEngine.Vector import Vector2D
from Patro.GraphicEngine.GraphicScene.GraphicItem import GraphicPathStyle, GraphicBezierStyle from Patro.GraphicEngine.GraphicScene.GraphicStyle import GraphicPathStyle, GraphicBezierStyle
from Patro.GraphicEngine.Painter.QtPainter import QtScene from Patro.GraphicEngine.Painter.QtPainter import QtScene
from Patro.GraphicStyle import Colors, StrokeStyle from Patro.GraphicStyle import Colors, StrokeStyle
......
####################################################################################################
from Patro.Common.Logging import Logging
Logging.setup_logging()
from Patro.GeometryEngine.Conic import Circle2D
from Patro.GeometryEngine.Path import (
Path2D,
LinearSegment, QuadraticBezierSegment, CubicBezierSegment
)
from Patro.GeometryEngine.Transformation import Transformation2D
from Patro.GeometryEngine.Vector import Vector2D
from Patro.GraphicEngine.GraphicScene.GraphicStyle import GraphicPathStyle, GraphicBezierStyle
from Patro.GraphicEngine.Painter.QtPainter import QtScene
from Patro.GraphicStyle import Colors, StrokeStyle, CapStyle
####################################################################################################
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,
)
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)
##############################################
def _add_circle(self, circle):
path_style = GraphicPathStyle(
line_width=self._line_width,
stroke_color=Colors.black,
stroke_style=StrokeStyle.SolidLine,
)
kwargs = dict(user_data=circle)
if circle.domain:
kwargs['start_angle'] = circle.domain.start
kwargs['stop_angle'] = circle.domain.stop
self._scene.circle(circle.center, circle.radius, path_style, **kwargs)
self._update_bounding_box(circle)
####################################################################################################
scene = QtScene()
scene_builder = SceneBuilder()
application.qml_application.scene = scene_builder.scene
# from Patro.GraphicEngine.Painter.QtPainter import QtPainter
# painter = QtPainter(scene_builder.scene)
# painter.to_svg('out.svg')