Makroerweiterung über MLL-Extension

Antworten
hlinke Verified
MLL-TEAM
MLL-TEAM
Beiträge: 231
Registriert: Do 10. Apr 2025, 19:30
Wohnort: Trier
Hat sich bedankt: 193 mal
Wurde bedankt: 274 mal
Kontaktdaten:

Makroerweiterung über MLL-Extension

#1

Beitrag von hlinke Verified »

@jueff
Hallo Jürgen,

im Zuge der Implementierung der MLL-Extensions für Peters Schedule Extension bin ich auch über die Makroextensions gestolpert.

Ein geniale Idee mit vielen Möglichkeiten.

Dies hat mich auf die dumme Idee gebracht, daß ich die Animations-Makros in der pyMLL, die ja am Ende recht komplexe Patternmakos ausspucken, ja um eine Funktion erweitern könnte, individuelle Makroerweiterungen zu erzeugen, die in der pyMobaledLIb UND im Excel ProgrammGenerator gleichermaßen genutzt werden können.

Nach längerem Ausprobieren, habe ich jetzt eine Lösung für die MultiLED_Farb-Animation implementiert, die im pyMLL und in Excel funktioniert.

Allerdings bin ich dabei auf ein Problem gestoßen, für das ich keine einfache Lösung gefunden habe, und für die ich erstmal einen Workaround implementiert habe. Vielleicht habe ich da ja auch etwas übersehen.

Ich möchte erreichen, daß der Erweiterungsmakro einen Makro mit folgendem Aufbau erzeugt: APatternT1(#LED,28,#InCh,3,0,128,0,PM_NORMAL,1000,256,0,0,0,0,0)

Die MobaLedLib.properties sieht dazu folgendermaßen aus:

Code: Alles auswählen

{
    "id": "HL_TestMacro",
    "minimumMobaLedLibVersion": "3.1.0",
    "platforms": [
        "ESP32",
        "AM328"
    ],
    "macros": [
        {
            "Macro": "APatternT1",
            "Arguments": [
                "LED",
                "EX.HL_TestMacro.Params1",
                "InCh",
                "EX.HL_TestMacro.Params2",
                "EX.HL_TestMacro.Zeit",
                "EX.HL_TestMacro.Params3"
            ],
            "DisplayName": "HL_TestMacro",
            "ShortDescription": "HL_TestMacro Beschreibung",
            "DetailedDescription": "HL_TestMacro Beschreibung",
            "LEDs": "1",
            "InCount": "1",
            "OutCnt": "0"
        }
    ],
    "parameters": [
        {
            "ParameterName": "Zeit",
            "Type": "",
            "Min": "0",
            "Max": "10000",
            "Default": "1000",
            "Options": "",
            "DisplayName": "Zeit",
            "ShortDescription": "Dauer in sec"
        },
        {
            "ParameterName": "Params1",
            "Type": "Logic",
            "Min": "0",
            "Max": "255",
            "Default": "28",
            "Options": "",
            "DisplayName": "ParamGroup1",
            "ShortDescription": "ParamGroup1"
        },
        {
            "ParameterName": "Params2",
            "Type": "Logic",
            "Min": "",
            "Max": "",
            "Default": "3,0,128,0,PM_NORMAL",
            "Options": "",
            "DisplayName": "ParamGroup2",
            "ShortDescription": "ParamGroup2"
        },
        {
            "ParameterName": "Params3",
            "Type": "Logic",
            "Min": "",
            "Max": "",
            "Default": "256,0,0,0,0,0",
            "Options": "",
            "DisplayName": "ParamGroup3",
            "ShortDescription": "ParamGroup3"
        }
    ],
    "includes": "",
    "macroIncludes": ""
}
Die etwas komplexe Konstruktion mit den Paramsgruppen ParamGroup1 bis3 brauche ich, da ich einen einstellbaren Parameter Zeit haben möchte, mit dem ich die Dauer des Patterns ändern kann.

Das funktioniert sehr gut.

Problem: Der Anwender bekommt die ParamGroup1 bis 1 natürlich auch angezeigt und könnte dort Änderungen vornehmen.
Es gibt die Möglichkeit, die Parameter mit einem "#" an erster Stelle zu verstecken. Nur leider werden dann die Defaultwerte nicht übernommen, sondern es werden die Parameternamen eingetragen.
In dem Python Code habe ich mich jetzt so beholfen, daß ich in der UserForm_Other in der Funktion Create_Result folgende Änderung eingebaut habe:

Code: Alles auswählen

def Create_Result(self):
        fn_return_value = ""
        p = Variant()
        #-------------------------------------------------------------
        # Return True if sucessfully checked all inputs
        Res = ''
        for p in self.ParList:
            val = 'Not Found'
            p = Trim(p)
            if Left(p, 1) == '#':
                #***********************************************
                #* change for Macrocreation feature
                #***********************************************
                val = p
                if p.startswith("#EX."):
                    Typ, Min, Max, Def, Opt, InpTxt, Hint = M10.Get_Par_Data(p[1:])
                    val = Def
            else:

Der zusätzliche Code:
#***********************************************
#* change for Macrocreation feature
#***********************************************
val = p
if p.startswith("#EX."):
Typ, Min, Max, Def, Opt, InpTxt, Hint = M10.Get_Par_Data(p[1:])
val = Def

Der zusätzliche Code überprüft, ob es sich um einen Extension-Macro handelt, holt dann die Parameter des Makros und setzt val auf den definierten Defaultwert.

In der Excel VBA wäre dieser Code im Modul UserForm_Other ab Zeile 862 einzufügen.

Bin ich da auf dem richtigen Weg oder gibt es eine bessere Lösung?

Viele Grüße
Harold

hlinke Verified
MLL-TEAM
MLL-TEAM
Beiträge: 231
Registriert: Do 10. Apr 2025, 19:30
Wohnort: Trier
Hat sich bedankt: 193 mal
Wurde bedankt: 274 mal
Kontaktdaten:

Re: Makroerweiterung über MLL-Extension

#2

Beitrag von hlinke Verified »

Hier sind noch zwei Screenshots:

pyMobaLedLib:
pyMLL_Screenshot 2026-02-25181419.jpg
Excel ProgramGenerator:

pyMLL_Screenshot 2026-02-25181610.jpg

Benutzeravatar
jueff Verified
MLL-TEAM
MLL-TEAM
Beiträge: 138
Registriert: Fr 18. Apr 2025, 07:25
Wohnort: Hallein/AT
Hat sich bedankt: 68 mal
Wurde bedankt: 364 mal

Re: Makroerweiterung über MLL-Extension

#3

Beitrag von jueff Verified »

Hallo Harold,

welche Werte des Pattern sind fix und welche sollen ersetzt werden?

APatternT1(#LED,28,#InCh,3,0,128,0,PM_NORMAL,1000,256,0,0,0,0,0)

Was nicht gehen wir ist die ParamGroup 2, welche im Wert "," hat, das wird beim nächsten Öffnen des Dialogs falsch aufgelöst, weil "," schon der Trenner der Argumente ist.

Jürgen...

Benutzeravatar
jueff Verified
MLL-TEAM
MLL-TEAM
Beiträge: 138
Registriert: Fr 18. Apr 2025, 07:25
Wohnort: Hallein/AT
Hat sich bedankt: 68 mal
Wurde bedankt: 364 mal

Re: Makroerweiterung über MLL-Extension

#4

Beitrag von jueff Verified »

Hallo Harold,

MLL Makros, welche in der Makroauswahl aufscheinen, haben nur Variablen als Arugmuent, niemals Konstanten. So z.B.

#define Blinker(LED,Cx,InCh,Period) PatternT1(LED,_NStru(Cx, 2,1),InCh,_Cx2LedCnt(Cx), 0, 255, 0, PF_SLOW,(Period)/32, _Cx2P_BLINK(Cx))

die Argumente LED,Cx,InCh,Period werden in der Oberfläche angezeigt und können editiert werden. Das Pattern dahinter ist im Makro Blinker definiert. LED und InCh sind reservierte Parameter, die der Benutzer nicht editieren kann, sie werden vom ProgGenerator automatisch gesetzt.

In deinem Beipsiel sieht es so aus:

#define HL_TestMacro(LED,InCh,Time,P1,P2,P3,P4,P5,P6) APatternT1(LED,28,InCh,3,0,128,0,PM_NORMAL,Time,P1,P2,P3,P4,P5,P6)

die Patterndefinition kommt in ein eigenes Header file, welches in MobaLedLib.properties so definiert wird:

"macroIncludes": "HLMacros.h"

In den Argumenten scheinen nur die Variablen LED,InCh,Time,P1,P2,P3,P4,P5,P6 auf.

Anbei ein Zip mit dem Beispiel.

Jürgen....
Dateianhänge
HLMakrosMLX.zip
(1.6 KiB) 1-mal heruntergeladen

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag

Zurück zu „MLL-Extensions“