Jezici modeliranja¶
Since version 2.0, Gaphor supports the concept of Modeling languages. This allows for development of separate modeling languages separate from the Gaphor core application.
The main language was, and will be UML. Gaphor now also supports a subset of SysML, RAAML and the C4 model.
A modeling language in Gaphor is defined by a class implementing the
gaphor.abc.ModelingLanguage abstract base class. The modeling language should
be registered as a gaphor.modelinglanguages entry point.
The ModelingLanguage interface is fairly minimal. It allows other services to
look up elements and diagram items, as well as a toolbox, and diagram types.
However, the responsibilities of a modeling language do not stop there. Parts of
functionality will be implemented by registering handlers to a set of generic
functions.
But let’s not get ahead of ourselves. What is the functionality a modeling language implementation can offer?
Three functionalities are exposed by a ModelingLanguage instance:
A data model (elements) and diagram items
Vrste dijagrma
Definicija kutija alata
Other functionalities can be extended by adding handlers to the respective generic functions:
Spojnice omogućuju spajanje elemenata dijagrama
Format/parse model elements to and from a textual representation
Copy/paste behavior when element copying is not trivial, for example with more than one element is involved
Grupiranje, omogućuje međusobno ugniježđivanje elemenata
Ispuštanje, omogućuje povlačenje elemenata iz prikaza stabla u dijagram
Pravila automatskog čišćenja za održavanje dosljednosti modela
Modeling languages can also provide new UI components. Those components are not loaded
directly when you import a modeling language package. Instead, they should be imported via
the gaphor.modules entrypoint.
Stranice uređivača, prikazane u sklopivoj ploči na desnoj strani
Posebne interakcije u dijagramu
Jezik modeliranja¶
- class gaphor.abc.ModelingLanguage[source]¶
Pružatelj modela je posebna usluga koja omogućuje pristup implementaciji modela, poput UML-a, SysML-a ili RAAML-a.
- abstract property diagram_types: Iterable[DiagramType]¶
Iterate diagram types.
- abstract property element_types: Iterable[ElementCreateInfo]¶
Iterate element types.
- abstractmethod lookup_element(name: str, ns: str | None = None) type[Base] | None[source]¶
Pretraži vrstu elementa modela prema imenu (klase).
A namespace may be provided. This will allow the model to be loaded from that specific modeling language only.
- abstract property toolbox_definition: ToolboxDefinition¶
Get structure for the toolbox.
As a convention, the package containing the modeling language should have an attribute __modeling_language__
that has the same value as the modeling language name in the entry point.
To illustrate:
The file mytool/mylang/__init__.py contains an entry:
__modeling_language__ = "MyLang"
pyproject.toml contains an entry point:
[project.entry-points."gaphor.modelinglanguages"]
"MyLang" = "mytool.mylang.modelinglanguage:MyLangModelingLanguage"
Spojnice¶
Spojnice se koriste za spajanje elemenata.
Connectors should adhere to the ConnectorProtocol.
Normally you would inherit from BaseConnector.
- class gaphor.diagram.connectors.BaseConnector(element: Presentation[Base], line: Presentation[Base])[source]¶
Connection adapter for Gaphor diagram items.
Line item
lineconnects with a handle to a connectable itemelement.- Parametri:
line – spojni element
element – spojiv element
By convention the adapters are registered by (element, line) – in that order.
- allow(handle: Handle, port: Port) bool[source]¶
Odredi je li se elementi mogu povezati.
Is the connection allowed at all (during mouse movement for example)?
Returns True if connection is allowed.
- connect(handle: Handle, port: Port) bool[source]¶
Poveži s elementom.
Establish a connection between element and line. Also takes care of disconnects, if required (e.g. 1:1 relationships).
Note that at this point the line may be connected to some other, or the same element. The connection at model level also still exists.
Returns True if a connection is established.
Formatiraj i obradi¶
Model elements can be formatted to a simple text representation. For example, This is used in the Model Browser. It isn’t a full serialization of the model element.
In some cases it’s useful to parse a text back into an object. This is done when you edit attributes and operations on a class.
Not every format() needs to have an equivalent parse() function.
Kopiraj i umetni¶
Copy and paste works out of the box for simple items: one diagram item with one model element (the subject).
It leverages the load() and save() methods of the elements to ensure all relevant data is copied.
Sometimes items need more than one model element to work. For example an Association: it has two association ends.
In those specific cases you need to implement your own copy and paste functions. To create such a thing you’ll need to create two functions: one for copying and one for pasting.
- gaphor.diagram.copypaste.copy(obj: Base | Iterable) Iterator[tuple[Id, Opaque]]¶
Create a copy of an element (or list of elements). The returned type should be distinct, so the
paste()function can properly dispatch. A copy function normally copies only the element and mandatory related elements. E.g. an Association needs two association ends.
- gaphor.diagram.copypaste.paste(copy_data: Opaque, diagram: Diagram, lookup: Callable[[str], Base | None]) Iterator[Base]¶
Paste previously copied data. Based on the data type created in the
copy()function, try to duplicate the copied elements. Returns the newly created item or element.
Gaphor provides some convenience functions:
- gaphor.diagram.copypaste.copy_full(items: Collection[Base], lookup: Callable[[Id], Base | None] | None = None) CopyData:¶
Copy
items. Thelookupfunction is used to look up owned elements (shown as child nodes in the Model Browser).
Grupiranje¶
Grouping is done by dragging one item on top of another, in a diagram or in the tree view.
- gaphor.diagram.group.owner(element: Base) Base | RootType | None¶
Return the owner for
element. The owner may beRoot, denoting the element should be placed in the root of the ownership hierarchy. IfNoneis returned, there is no owner.
- gaphor.diagram.group.group(parent: Base, element: Base) bool¶
Group an element in a parent element. The grouping can be based on ownership, but other types of grouping are also possible.
Ispuštanje¶
Dropping is performed by dragging an element from the tree view and drop it on a diagram. This is an easy way to extend a diagram with already existing model elements.
Alternatively, a presentation item can be dropped on top of another element.
- gaphor.diagram.drop.drop(element: Base | Presentation, diagram: Diagram | Presentation, x: float, y: float) Presentation | None¶
The drop function creates a new presentation for an element on the diagram, if the element is not a presentation yet. For relationships, a drop only works if both connected elements are present in the same diagram.
While grouping deals with connecting model elements, dropping deals with creating and placing presentation elements on the right item in a diagram.
Automatsko čišćenje modela¶
Gaphor želi održati model sinkroniziran s dijagramima.
A little dispatch function is used to determine if a model element can be removed.
Stranice uređivača svojstva¶
The editor page is constructed from snippets. For example: almost each element has a name, so there is a UI snippet that allows you to edit a name.
Each property page (snippet) should inherit from PropertyPageBase.
Trenutni skočni prozori uređivača (dijagrama)¶
When you double-click on an item in a diagram, a popup can show up, so you can easily change the name.
By default, this works for any named element. You can register your own inline editor function if you need to.
- gaphor.diagram.instanteditors.instant_editor(item: Item, view, event_manager: EventManager, pos: tuple[int, int] | None = None) bool¶
Show a small editor popup in the diagram. Makes for easy editing without resorting to the Element editor.
In case of a mouse press event, the mouse position (relative to the element) are also provided.