எடுத்துக்காட்டு: காஃபர் சேவைகள்¶
இந்த எடுத்துக்காட்டில் நாங்கள் கொஞ்சம் குறைவான கீழான ஒன்றைச் செய்கிறோம். Gaphor இல், சேவைகள் நுழைவு புள்ளிகள் என வரையறுக்கப்படுகின்றன. ஒவ்வொரு சேவையும் ஒரு வகை, மற்ற சேவைகளுடன் பொருந்தக்கூடிய பெயர்களுடன் அளவுருக்களை எடுக்கும். இது சேவைகளை மற்ற சேவைகளை சார்ந்து இருக்க அனுமதிக்கிறது.
இது இதுபோன்றதாகத் தெரிகிறது:
# entry point name: my_service
class MyService:
...
# entry point name: my_other_service
class MyOtherService:
def __init__(self, my_service):
...
முதலில் நுழைவு புள்ளிகளை ஏற்றுவோம்.
from gaphor.entrypoint import load_entry_points
entry_points = load_entry_points("gaphor.services")
entry_points
{'auto_layout': gaphor.plugins.autolayout.pydot.AutoLayoutService,
'component_registry': gaphor.services.componentregistry.ComponentRegistry,
'console_window': gaphor.plugins.console.consolewindow.ConsoleWindow,
'diagram_align': gaphor.ui.diagramalign.DiagramAlign,
'diagram_export': gaphor.plugins.diagramexport.export.DiagramExport,
'diagrams': gaphor.ui.diagrams.Diagrams,
'element_dispatcher': gaphor.core.modeling.elementdispatcher.ElementDispatcher,
'element_editor': gaphor.ui.elementeditor.ElementEditor,
'element_factory': gaphor.core.modeling.elementfactory.ElementFactory,
'event_manager': gaphor.core.eventmanager.EventManager,
'export_menu': gaphor.ui.menufragment.MenuFragment,
'file_manager': gaphor.ui.filemanager.FileManager,
'html_report': gaphor.plugins.htmlreport.report.HtmlReportExport,
'main_window': gaphor.ui.mainwindow.MainWindow,
'model_browser': gaphor.ui.modelbrowser.ModelBrowser,
'model_changed': gaphor.ui.modelchanged.ModelChanged,
'modeling_language': gaphor.services.modelinglanguage.ModelingLanguageService,
'properties': gaphor.services.properties.Properties,
'recent_files': gaphor.ui.recentfiles.RecentFiles,
'recovery': gaphor.storage.recovery.Recovery,
'sanitizer': gaphor.UML.sanitizerservice.SanitizerService,
'toolbox': gaphor.ui.toolbox.Toolbox,
'tools_menu': gaphor.ui.menufragment.MenuFragment,
'undo_actions': gaphor.ui.undoactions.UndoActions,
'undo_manager': gaphor.services.undomanager.UndoManager}
இப்போது ஒவ்வொரு சேவைக்கும் எங்கள் மாதிரியில் ஒரு கூறுகளை உருவாக்குவோம்.
from gaphor import UML
from gaphor.core.modeling import ElementFactory
element_factory = ElementFactory()
def create_component(name):
c = element_factory.create(UML.Component)
c.name = name
return c
components = {name: create_component(name) for name in entry_points}
components
{'auto_layout': <gaphor.UML.uml.Component element 9bf8b574-4653-11f1-be8f-ae1f7267a1d2>,
'component_registry': <gaphor.UML.uml.Component element 9bf8b88a-4653-11f1-be8f-ae1f7267a1d2>,
'console_window': <gaphor.UML.uml.Component element 9bf8b9ca-4653-11f1-be8f-ae1f7267a1d2>,
'diagram_align': <gaphor.UML.uml.Component element 9bf8baa6-4653-11f1-be8f-ae1f7267a1d2>,
'diagram_export': <gaphor.UML.uml.Component element 9bf8bb64-4653-11f1-be8f-ae1f7267a1d2>,
'diagrams': <gaphor.UML.uml.Component element 9bf8bc18-4653-11f1-be8f-ae1f7267a1d2>,
'element_dispatcher': <gaphor.UML.uml.Component element 9bf8bcf4-4653-11f1-be8f-ae1f7267a1d2>,
'element_editor': <gaphor.UML.uml.Component element 9bf8bd9e-4653-11f1-be8f-ae1f7267a1d2>,
'element_factory': <gaphor.UML.uml.Component element 9bf8be48-4653-11f1-be8f-ae1f7267a1d2>,
'event_manager': <gaphor.UML.uml.Component element 9bf8bef2-4653-11f1-be8f-ae1f7267a1d2>,
'export_menu': <gaphor.UML.uml.Component element 9bf8bf92-4653-11f1-be8f-ae1f7267a1d2>,
'file_manager': <gaphor.UML.uml.Component element 9bf8c05a-4653-11f1-be8f-ae1f7267a1d2>,
'html_report': <gaphor.UML.uml.Component element 9bf8c104-4653-11f1-be8f-ae1f7267a1d2>,
'main_window': <gaphor.UML.uml.Component element 9bf8c1a4-4653-11f1-be8f-ae1f7267a1d2>,
'model_browser': <gaphor.UML.uml.Component element 9bf8c24e-4653-11f1-be8f-ae1f7267a1d2>,
'model_changed': <gaphor.UML.uml.Component element 9bf8c2f8-4653-11f1-be8f-ae1f7267a1d2>,
'modeling_language': <gaphor.UML.uml.Component element 9bf8c398-4653-11f1-be8f-ae1f7267a1d2>,
'properties': <gaphor.UML.uml.Component element 9bf8c438-4653-11f1-be8f-ae1f7267a1d2>,
'recent_files': <gaphor.UML.uml.Component element 9bf8c4e2-4653-11f1-be8f-ae1f7267a1d2>,
'recovery': <gaphor.UML.uml.Component element 9bf8c582-4653-11f1-be8f-ae1f7267a1d2>,
'sanitizer': <gaphor.UML.uml.Component element 9bf8c780-4653-11f1-be8f-ae1f7267a1d2>,
'toolbox': <gaphor.UML.uml.Component element 9bf8c870-4653-11f1-be8f-ae1f7267a1d2>,
'tools_menu': <gaphor.UML.uml.Component element 9bf8c924-4653-11f1-be8f-ae1f7267a1d2>,
'undo_actions': <gaphor.UML.uml.Component element 9bf8c9ec-4653-11f1-be8f-ae1f7267a1d2>,
'undo_manager': <gaphor.UML.uml.Component element 9bf8ca8c-4653-11f1-be8f-ae1f7267a1d2>}
அனைத்து கூறுகளையும் வரைபடமாக்குவதன் மூலம், கட்டமைப்பாளர் அளவுரு பெயர்களின் அடிப்படையில் அந்த கூறுகளுக்கு இடையில் சார்புகளை உருவாக்கலாம்.
import inspect
for name, cls in entry_points.items():
for param_name in inspect.signature(cls).parameters:
if param_name not in components:
continue
dep = element_factory.create(UML.Usage)
dep.client = components[name]
dep.supplier = components[param_name]
மாதிரியில் உள்ள அனைத்து கூறுகளையும் கொண்டு, நாம் ஒரு வரைபடத்தை உருவாக்கலாம். வரைபடத்தின் கூறுகள் மற்றும் சார்புகளை கைவிட்டு, தானாகவே லேஅவுட் அதன் மந்திரத்தை செய்யட்டும்.
சார்புநிலையை அழகாக மாற்ற, நாம் ஒரு பாணி தாளைச் சேர்க்க வேண்டும். GUI வழியாக நீங்கள் ஒரு புதிய வரைபடத்தை உருவாக்கினால், இந்த உறுப்பு தானாகவே சேர்க்கப்படும்.
from gaphor.core.modeling import StyleSheet
from gaphor.diagram.drop import drop
element_factory.create(StyleSheet)
diagram = element_factory.create(UML.Diagram)
for element in element_factory.lselect():
drop(element, diagram, x=0, y=0)
கடைசி கட்டம் தளவமைப்பு மற்றும் வரைபடத்தை வரைய வேண்டும்.
from gaphor.extensions.ipython import auto_layout, draw
auto_layout(diagram)
draw(diagram, format="svg")
அவ்வளவுதான். வரைபடத்திலிருந்து நீங்கள் பார்க்க முடியும் என, நிறைய சேவைகள் Eventanagager ஐ நம்பியுள்ளன.