எடுத்துக்காட்டு: காஃபர் சேவைகள்¶
இந்த எடுத்துக்காட்டில் நாங்கள் கொஞ்சம் குறைவான கீழான ஒன்றைச் செய்கிறோம். 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 44dfdd58-7e5c-11f1-9687-aeefab9b931e>,
'component_registry': <gaphor.UML.uml.Component element 44dfe0fa-7e5c-11f1-9687-aeefab9b931e>,
'console_window': <gaphor.UML.uml.Component element 44dfe2bc-7e5c-11f1-9687-aeefab9b931e>,
'diagram_align': <gaphor.UML.uml.Component element 44dfe410-7e5c-11f1-9687-aeefab9b931e>,
'diagram_export': <gaphor.UML.uml.Component element 44dfe53c-7e5c-11f1-9687-aeefab9b931e>,
'diagrams': <gaphor.UML.uml.Component element 44dfe67c-7e5c-11f1-9687-aeefab9b931e>,
'element_dispatcher': <gaphor.UML.uml.Component element 44dfe794-7e5c-11f1-9687-aeefab9b931e>,
'element_editor': <gaphor.UML.uml.Component element 44dfe88e-7e5c-11f1-9687-aeefab9b931e>,
'element_factory': <gaphor.UML.uml.Component element 44dfe988-7e5c-11f1-9687-aeefab9b931e>,
'event_manager': <gaphor.UML.uml.Component element 44dfec1c-7e5c-11f1-9687-aeefab9b931e>,
'export_menu': <gaphor.UML.uml.Component element 44dfeda2-7e5c-11f1-9687-aeefab9b931e>,
'file_manager': <gaphor.UML.uml.Component element 44dfeeb0-7e5c-11f1-9687-aeefab9b931e>,
'html_report': <gaphor.UML.uml.Component element 44dfefaa-7e5c-11f1-9687-aeefab9b931e>,
'main_window': <gaphor.UML.uml.Component element 44dff09a-7e5c-11f1-9687-aeefab9b931e>,
'model_browser': <gaphor.UML.uml.Component element 44dff180-7e5c-11f1-9687-aeefab9b931e>,
'model_changed': <gaphor.UML.uml.Component element 44dff266-7e5c-11f1-9687-aeefab9b931e>,
'modeling_language': <gaphor.UML.uml.Component element 44dff360-7e5c-11f1-9687-aeefab9b931e>,
'properties': <gaphor.UML.uml.Component element 44dff446-7e5c-11f1-9687-aeefab9b931e>,
'recent_files': <gaphor.UML.uml.Component element 44dff59a-7e5c-11f1-9687-aeefab9b931e>,
'recovery': <gaphor.UML.uml.Component element 44dff694-7e5c-11f1-9687-aeefab9b931e>,
'sanitizer': <gaphor.UML.uml.Component element 44dff77a-7e5c-11f1-9687-aeefab9b931e>,
'toolbox': <gaphor.UML.uml.Component element 44dff860-7e5c-11f1-9687-aeefab9b931e>,
'tools_menu': <gaphor.UML.uml.Component element 44dff95a-7e5c-11f1-9687-aeefab9b931e>,
'undo_actions': <gaphor.UML.uml.Component element 44dffa40-7e5c-11f1-9687-aeefab9b931e>,
'undo_manager': <gaphor.UML.uml.Component element 44dffb26-7e5c-11f1-9687-aeefab9b931e>}
அனைத்து கூறுகளையும் வரைபடமாக்குவதன் மூலம், கட்டமைப்பாளர் அளவுரு பெயர்களின் அடிப்படையில் அந்த கூறுகளுக்கு இடையில் சார்புகளை உருவாக்கலாம்.
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 ஐ நம்பியுள்ளன.