neoscore.core.positioned_object
- class neoscore.core.positioned_object.render_cached_property[source]
Bases:
cached_property
A property annotation for fields which can be cached at render time.
You can annotate any
PositionedObject
property to get this behavior, including on inheriting classes.class Example(PositionedObject): @render_cached_property def some_expensive_computed_property(self): ...
Such properties must be immutable during rendering. Typical
@property
setters are not supported.
- class neoscore.core.positioned_object.PositionedObject[source]
Bases:
object
An object positioned in the scene
This is the base class of all objects in the neoscore scene tree.
A single
PositionedObject
can have multiple graphical representations derived at render-time. If the object’s ancestor is aFlowable
, it will be rendered as a flowable object, capable of being wrapped around lines.The position of this object is relative to that of its parent. Each
PositionedObject
has anotherPositionedObject
for a parent, exceptPage
objects, whose parent is always the global rootDocument
.For convenience, the parent may be initialized to
None
to indicate the first page of the document.To place objects directly in the scene on pages other than the first, simply set the parent to the desired page, accessed through the global document with
neoscore.document.pages[n]
- __init__(pos: PointDef, parent: Optional[PositionedObject])[source]
- Parameters
pos – The position of the object relative to its parent
parent – The parent object. Defaults to the document’s first page.
- property scale: float
A scale factor to be applied to the rendered object.
Outside flowable contexts, scaling is inherited by children.
Scaling occurs relative to
self.transform_origin
, which is by default the local origin.
- property rotation: float
A rotation angle in degrees.
Outside flowable contexts, rotation is inherited by children.
Rotation occurs relative to
self.transform_origin
, which is by default the local origin.
- property breakable_length: Unit
The breakable length of the object.
This is used to determine how and where rendering cuts should be made. A length of zero indicates that no rendering cuts will be made.
The default implementation of this method returns
ZERO
. Subclasses which want to support flowable line breaks should override this method.
- property parent: PositionedObject
The parent object.
If this is set to None, it defaults to the first page of the document.
- property children: List[PositionedObject]
All direct children of this object.
- property descendants: Iterator[PositionedObject]
All the objects in the children subtree.
This recursively searches all the object’s children (and their children, etc.) and provides an iterator over them.
The current implementation performs a simple recursive DFS over the tree, and has the potential to be rather slow.
- property interfaces: List[PositionedObjectInterface]
The graphical backend binding interfaces for this object
Interface objects are created and stored here upon calling
render
.Typically each
PositionedObject
will have at most one interface for each flowable line it appears in.
- property interface_for_children: Optional[PositionedObjectInterface]
The low level object interface to be used by children objects.
Outside flowable contexts, interface classes utilize a parenting scheme much like core classes. The interfaces of child objects should use this field as their parent for proper position and transform inheritance.
Users should rarely, if ever, have to deal with this field.
- descendants_of_class_or_subclass(graphic_object_class: Type[PositionedObject]) Iterator[PositionedObject] [source]
Yield all child descendants with a given class or its subclasses.
- descendants_of_exact_class(graphic_object_class: Type[PositionedObject]) Iterator[PositionedObject] [source]
Yield all child descendants of a given class, excluding sublcasses
- descendants_with_attribute(attribute: str) Iterator[PositionedObject] [source]
Yield all child descendants which has a given attribute.
This is useful for searching descendants for duck-typing matches.
- property ancestors: Iterator[PositionedObject]
All ancestors of this object.
Follows the chain of parents up to and including the
Document
root.The order begins with
self.parent
and traverses upward in the document tree.
- first_ancestor_with_attr(attr: str) Optional[PositionedObject] [source]
Find this object’s closest ancestor with an attribute
- descendant_pos(descendant: PositionedObject) Point [source]
Find the position of a descendant relative to this object.
- Raises
ValueError – If
descendant
is not a descendant of this object.
- descendant_pos_x(descendant: PositionedObject) Unit [source]
Find the x position of a descendant relative to this object.
This is a specialized version of
descendant_pos
provided for optimization.- Raises
ValueError – If
descendant
is not a descendant of this object.
- map_to(dst: PositionedObject) Point [source]
Find an object’s logical position relative to this one
This calculates the position in logical space, which differs from canvas space in that it doesn’t account for repositioning of objects inside
Flowable
containers. For example, this function will return the same relative position for two objects in aFlowable
container whether they are separated by a line break.
- map_x_to(dst: PositionedObject) Unit [source]
Like
map_to
, but only return the X distance from todst
.
- distance_to(obj: PositionedObject, offset: Point = ORIGIN) Unit [source]
Find the distance to a given object, with an optional extra offset.
Like
map_to
, this works in logical coordinates.
- canvas_pos() Point [source]
Find the document-space position of this object.
For objects in
Flowable
s, this should only be accessed at render time, when flowable layouts are available.
- pre_render_hook()[source]
Run code once just before document rendering begins.
Implementations must call the superclass function as well.
- post_render_hook()[source]
Run code once after document rendering completes.
Implementations must call the superclass function as well.
- render()[source]
Render the object and all its children.
This and other render methods should generally not be called directly.
- render_in_flowable()[source]
Render the object to the scene, dispatching partial rendering calls when needed if an object flows across a break in the flowable.
This and other render methods should generally not be called directly.
- render_complete(pos: Point, flowable_line: Optional[NewLine] = None, flowable_x: Optional[Unit] = None)[source]
Render the entire object.
This is used to render all objects outside flowables, as well as those inside flowables when they fit completely in one line of the flowable.
By default, this is a no-op. Subclasses with rendered appearances should override this.
This method behaves differently inside and outside of flowables. Whether this object is inside a flowable can be determined by whether a
flowable_line
is given. When inside a flowable, the given position is in global document coordinates, and created interfaces (or higher level classes) must not be assigned a parent. When not inside a flowable, the given position is relative toself.parent
and created interfaces (or higher level classes) must be assigned a parent. In this case, created interfaces should useself.parent.interface_for_children
as their parent.This and other render methods should generally not be called directly.
- Parameters
pos – The rendering position. If outside a flowable, this is relative to the parent. Otherwise, it is in document coordinates.
flowable_line – If in a
Flowable
, the line in which this object appearsflowable_x – If in a
Flowable
, the flowable x position of this render
- render_before_break(pos: Point, flowable_line: NewLine, flowable_x: Unit)[source]
Render the beginning of the object up to a stopping point.
For use in flowable containers when rendering an object that crosses a line or page break. This function should render the beginning portion of the object up to the break.
By default, this is a no-op. Subclasses with rendered appearances should override this.
Created interfaces and higher level objects should not be assigned a parent.
This and other render methods should generally not be called directly.
- Parameters
pos – The rendering position in document space for drawing.
flowable_line – The line in which this object appears
flowable_x – The flowable x position of this render
- render_spanning_continuation(pos: Point, flowable_line: NewLine, object_x: Unit)[source]
Render the continuation of an object after a break and before another.
For use in flowable containers when rendering an object that crosses two breaks. This function should render the portion of the object surrounded by breaks on either side.
By default, this is a no-op. Subclasses with rendered appearances should override this.
Created interfaces and higher level objects should not be assigned a parent.
This and other render methods should generally not be called directly.
- Parameters
pos – The rendering position in document space for drawing.
flowable_line – The line in which this object appears
object_x – The local object x position of the line’s start.
- render_after_break(pos: Point, flowable_line: NewLine, object_x: Unit)[source]
Render the continuation of an object after a break.
For use in flowable containers when rendering an object that crosses a line or page break. This function should render the ending portion of an object after a break.
By default, this is a no-op. Subclasses with rendered appearances should override this.
Created interfaces and higher level objects should not be assigned a parent.
This and other render methods should generally not be called directly.
- Parameters
pos – The rendering position in document space for drawing.
flowable_line – The line in which this object appears
object_x – The local object x position of the line’s start.