[QUIZ#1] Mark (C.O.F.F.E.E.)

Mark

Cinema4D
Hi Ihr Lieben!

...hm, hat mich doch ein wenig gereizt:
Herr Hupf spielt mit dem Gedanken, direkt im neuen Browser "Titan 2.0" Cinema4D zu implementieren ... oder war es anders herum?! :)
Die "Unscharfe Suche" also folgend als Coffee-Plugin für Cinema4D: Unterhalb einer selektierten Hierarchie (im Screenshot "Präsidenten") werden die Objekte selektiert, dessen Name zur "unscharfen Suche" passen.

Bekannte Einschränkungen:
a) Groß-/Kleinschreibung wird beachtet (es gibt kein "lowercase" in Coffee :eek:)
b) Auch Leerzeichen müssen im Objekt-Namen korrekt positioniert sein

Code:
//    ============================================================================    //
//    Unscharfe Selektion                                                                //
//    (c) by mark@eggtion.net                                                            //
//                                                                                    //
//    Beitrag zum Coding-Quiz #1                                                        //
//  http://www.tutorials.de/forum/diskussion/323776-quiz-1-unscharfe-suche.html        //
//    ============================================================================    //

var PLUGIN_ID = 1023043;

//    ==============================    //
//    Dialog & Objekt-Selektion        //
//    ==============================    //
class MyDialog : GeDialog
{
    private:
        var _doc;
        var _op;

    public:
        MyDialog();

        CreateLayout();
        Init();
        CoreMessage(id,msg);
        Match(obj,search);
        Search(obj,search);
        Command(id,msg);
}

MyDialog::MyDialog()
{
    super(PLUGIN_ID);
    _op        = NULL;
    _doc    = NULL;
}

MyDialog::CreateLayout()
{
    SetTitle("Unscharfe Selektion");
    AddGroupBeginV(4000, BFH_SCALEFIT, 1, "Group", 0);
    {
        AddGroupBorderSpace(4,4,4,4);
        AddGroupBeginV(4000, BFH_SCALEFIT, 2, "Group", 0);
        {
            AddStaticText(1000, BFH_LEFT, 0, 0, "Suche", 0);
            AddEditText(4001, BFH_SCALEFIT, 0, 0);
            AddStaticText(1000, BFH_LEFT, 0, 0, "Selektiert", 0);
            AddStaticText(4002, BFH_LEFT, 0, 0, "0      ", 0);
        }
        AddGroupEnd();
        
        AddSeparatorH(0);
        AddStaticText(1000, BFH_LEFT, 0, 0, "Beitrag zum Coding-Quiz #1 auf tutorials.de", 0);
        AddStaticText(1000, BFH_LEFT, 0, 0, "(c) mark@eggtion.net", 0);
    }
    AddGroupEnd();
    
    return TRUE;
}


MyDialog::Init()
{
    var doc = GetActiveDocument(); if (!doc) return FALSE;
    var op    = GetActiveObject(doc);

    _doc    = doc;
    _op        = op;

    return TRUE;
}

//    Prüft, ob der Objektname zur unscharfen Suche passt
MyDialog::Match(obj, search)
{
    var name = obj->GetName();
    var spos = -1;
    var npos = -1;
    
    do
    {
        npos++;
        spos++;
        npos = strstr(name, strmid(search, spos, 1), npos);

    }
    while(npos != -1);
    
    if (spos == sizeof(search)) return TRUE;
    return FALSE;
}

//    Durchsucht eine Hierarchie von Objekten
//    Passt die unscharfe Suche, wird das Objekt selektiert
MyDialog::Search(obj, search)
{
    var cnt = 0;
    obj        = obj->GetDown();
    while(obj) {
        if (Match(obj, search)) {
            obj->SetBit(BIT_AOBJ);
            cnt++;
        } else {
            obj->DelBit(BIT_AOBJ);
        }
        obj = obj->GetNext();
    }

    SetString(4002, tostring(cnt));

    return TRUE;
}

MyDialog::Command(id,msg)
{
    if (!_doc) return FALSE;
    
    switch (id)
    {
        //    die Suche-Eingabe ändert sich
        case 4001:
        {
            if (!_op) return false;
            Search(_op, GetString(4001));
            break;
        }
    }
    
    EventAdd();
    _doc->Message(MSG_UPDATE);
    
    return TRUE;
}

MyDialog::CoreMessage(id,msg)
{
    switch (id)
    {
        //    Änderungen durch den User
        case NEW_DOCUMENT:
        case DOCUMENT_CHANGED:
        case NEW_ACTIVE_OBJECT:
        case ACTIVE_OBJECT_CHANGED:
        {
            var oldop = _op;
            Init();
            if (_op != oldop) Search(_op, GetString(4001));
            return TRUE;
        }
        break;
    }
    return FALSE;
}

//    ==============================    //
//    C4D-MenuPlugin                    //
//    ==============================    //
class MyMenuPlugin : MenuPlugin
{
    public:
        MyMenuPlugin();

        GetID();
        GetName();
        GetHelp();
        GetState();
        Execute(doc);

        RestoreLayout(secret);
}

MyMenuPlugin::MyMenuPlugin()
{
    super();
}

MyMenuPlugin::GetState()
{
    return CMD_ENABLED;
}

MyMenuPlugin::GetID()
{
    return PLUGIN_ID;
}

MyMenuPlugin::GetName()
{
    return "Unscharfe Selektion";
}

MyMenuPlugin::GetHelp()
{
    return "Selektiert Objekte anhand einer unscharfen Suche";
}

var d;
MyMenuPlugin::Execute(doc)
{
    d->Open(TRUE, -1, -1);
}

MyMenuPlugin::RestoreLayout(secret)
{
    if (!d) d = new(MyDialog);
    d->RestoreLayout(secret);
}

//    ==============================    //
//    Main                            //
//    ==============================    //
main()
{
    d = new(MyDialog);
    Register(MyMenuPlugin);
    println("---------------------------------");
    println("Unscharf selektieren registriert");
    println("http://www.tutorials.de/forum/diskussion/323776-quiz-1-unscharfe-suche.html");
    println("---------------------------------");
}

Liebe Grüße,
Mark.
 

Anhänge

  • UnscharfeSelektion.jpg
    UnscharfeSelektion.jpg
    95,1 KB · Aufrufe: 73
Hi!

Der Schritt zum Coffee-Node in XPresso ist natürlich nur ein kleiner und somit auch noch diese Variante hinten angefügt ;)

Code:
//    Prüft, ob der Objektname zur unscharfen Suche passt
Check_Match(obj, search)
{
    var name = obj->GetName();
    var spos = -1;
    var npos = -1;
    
    do
    {
        npos++;
        spos++;
        npos = strstr(name, strmid(search, spos, 1), npos);

    }
    while(npos != -1);
    
    if (spos == sizeof(search)) return true;
    return false;
}
//    Main
main()
{
    if (!Obj) {
        Match = false;
        return true;
    }
    if (Check_Match(Obj, Search)) {
        Match = true;
    } else {
        Match = false;
    }
    return true;
}

Anmerkung zum Screenshot, für die, die XPresso nicht kennen: "Hierarchie" liefert pro Frame alle Objekte unterhalb einer Hierarchie, hier alles Präsidenten. Das Objekt-Node ganz rechts Namens "George Washington" ist somit mißverständlich: tatsächlich nimmt es jeweils den Namen des aktuellen - von der Hierarchie gelieferten - Präsidenten an. Der Verteiler ist nötig, da C4D für "Sichtbar im Editor" nicht - wie zu vermuten - einen Bool-Wert, sondern 0 = An, 1 = Aus und 2 = Undefiniert verlangt.

So, nun gebe ich aber endlich Ruh' ;)

Liebe Grüße,
Mark.
 

Anhänge

  • UnscharfeSelektion2.jpg
    UnscharfeSelektion2.jpg
    41,6 KB · Aufrufe: 54
Absoluter Hammer, ich hab zwar mit viel gerechnet aber nicht mit Coffee :eek: Ziemlich cool, wie du das in C4D integriert hast, so hat es ja vielleicht sogar einen gewissen Nutzen :) Wobei ich mir nicht so sicher bin, wie oft man im C4D-Workflow Objekte nach Namen selektiert ;)

Grüße,
Matthias
 
Zurück