Autonomer Modulaufruf

Allgemein

Ziel

  • Beim Aufruf von Modulen darf das Untermodul vom Ausgangsmodul keine Anweisungen erhalten, die das Verhalten des Untermoduls beeinflussen.

Vereinbarungen

  • Module müssen mit Hilfe von Python so gecustomized werden, dass sie die auszuführende Aktion beim Aufruf selber verwalten können.
  • Nach dem Modulaufruf darf kein Menüpunktbefehl folgen.
  • Als Filterkriterium werden nur noch @L-Variablen verwendet, keine @Ds.
  • Modulnummern werden nicht in Python fest programmiert, sondern die Modulnummern sind in globalen Variablen zu speichern und aus diesen auszulesen.

Erstellung des autonomen Modulaufrufs

Benutzung des Pythonmoduls ppms_cu.py

Details

  • Das Pythonmodul ppms_cu.py soll zusammen mit der Python-API eine Grundlage bieten um Pythonmakros zu customizen.
    • Dokumentation zu ppms_cu.py
    • Das Pythonmodul verfügt über Klassen und Methoden, die zur Erstellung eines autonomen Modulaufrufs von Relevanz sind.

Klasse Access - Ermöglicht den Zugriff auf PLANTA-Python Objekte

  • Methode - get_datafields_by_sc
    • Sucht in einem Modulobjekt nach Datenfeldern mit dem spezifizierten Filterkriterium
      • Als Rückgabe erhält man ein Python Dictionary mit
        • DAC-Id: String als Key
        • DFC-Id: String als Value zurück.

Klasse Action - Ermöglicht die Manipulation von Objekten/ Startet Aktionen

  • Methode - call_SUB
    • Öffnet ausgehend vom main_mod Object ein Untermodul

Benutzung des Pythonmoduls module_macro_helper.py

Details

 

Erstellung eines Makromoduls zum Aufruf eines Untermoduls

Details

  • Erstellung eines Pythonmacro Moduls gemäß PLANTA CU-Handbuch
  • Das Pythonmacro beinhaltet die Initialisierung des Action-Objekts, sowie den Aufruf von Call_Sub()
#Create object of ppms_cu.Action class 
   ppms_cu_action = ppms_cu.Action(invoker_module) 
   #Create sub_mod_dictionary 
   sub_mod_dict={} 
   sub_mod_dict['009101'] = ["right",0.3,{'@L4':[values]}] 
   ppms_cu_action.call_SUB(sub_mod_dict=sub_mod_dict) 
  • Als Entwicklungvorlage kann z.B. das Modul 0099Y3/ „Pythonmacro: Datenbereiche öffnen" verwendet werden.

Erstellung des Untermodulmakros

Details

  • Anhand der Methoden on_load() und on_focus() kann genau spezifiziert werden, welche Aktionen bei Aufruf bzw. Aktivierung des Untermoduls gestartet werden.
  • Zur vereinfachten Erstellung von Modulmakros kann das Pythonmodul modul_macro_helper.py verwendet werden.

Hinweise

  • Der Aufruf von Call_Sub() führt dazu, dass beim erstmaligen Aufruf die Methoden on_load() ausgeführt werden.
    • Um schon bei on_load() das Modul zu aktivieren, muss on_load() die Methode focus() des Modul Objekts aufrufen.
      • Hierbei führt die Methode focus() dazu, dass sowohl das Modul am Client aktiviert wird, als auch, dass on_focus() ausgeführt wird.
  • Jedes weitere Mal wird direkt die Methode on_focus() aufgerufen.
  • Als Entwicklungsvorlage, kann z.B. das Modul 000857 Datenbereiche verwendet werden.

Hinzufügen individueller Methoden zu einer Modulinstanz

Ziel

  • Die Modulinstanz soll nach außen eine individuelle Schnittstelle anbieten, über die sie steuerbar ist
  • Daten werden in einem Methodenaufruf der Modulinstanz übergeben

Details

  • Zum Binden der Methoden an die Modulinstanz wird die Klasse MethodType des Python-Modules types verwendet

Hinweise

  • Der erste Parameter der zur Methode umgewandelten Funktion ist reserviert für die Instanz
    • Daher sollte dieser zur Verständlichkeit der Methode mit "self" benannt werden (Konvention auch für normale Methoden)
  • Die umgewandelte Funktion kann in dem Macro selbst oder auch in einem externen Modul definiert werden
    • Individuelle Methoden, die von vielen Modulen verwendet werden, sollten zentral (in externem Modul) gehalten werden

Beispiel:

  • ein Projekt-Modul soll Daten eines bestimmten Projektes anzeigen
  • der Programmcode der hinzugefügten Methode ist sehr weit von gutem Code entfernt! Nur die Benutzung von MethodType steht hier im Fokus.
from types import MethodType

mod = ppms.get_target_module()

def show_project(self, project_id):
    self.menu(19)
    project_da = self.get_das()[0]
    first_rec = project_da.get_records()[0]
    project_df = first_rec.get_df('pr_id')
    project_df.set_text_value(project_id)
       
def on_load():
    mod.menu(11)	
    mod.show_project = MethodType(show_project, mod)
    
def on_initial_focus():
    mod.show_project('4711')
    
def on_focus():
    pass

def on_reset():
    on_load()

         PLANTA project









 
  • Suche in Topic-Namen

  • Suche in Topic-Inhalten
This site is powered by the TWiki collaboration platform Powered by Perl