24-Jan-2005  
 

Rien

 

 

Gestion de l'impression des objets dans Metafor via les nouvelles streams:

Le but est de doter les objets de Metafor d'une interface unique pour permettre l'impression des infos les concernant. Grâce aux streams, il est possible d'avoir une interface unifiée pour écrire ses infos soit sur la console (ostream - std::cout), dans python (ostringstream) et dans un fichier (ofstream).

Interface:

L'idée principale est de définir l'opérateur << entre une ostream et chaque objet. Le problème, c'est que cette interface n'est pas virtuelle (on aimerait par exemple que, quand on affiche le CurveSet, il ne soit pas écrit Curve, Curve, ... mais bien Arc, Line, ... etc).

La solution est donné par ce brave Stroustrup: on définit une interface virtuelle (j'ai appellé la fonction "write") dans une classe de base (nouvelle classe VirtualObject). L'opérateur << appelle write et tout fonctionne comme sur des roulettes.

Options:

Pour chaque objet, on peut vouloir une impression plus ou moins détaillée en fonction des circonstances. On a pas envie d'afficher le contenu de chaque élément lorsqu'on affiche l'ElementSet. par contre, quand on s'intéresse à un élément particulier, on aimerait voir les détails.

Ici, il est très facile de s'embrouiller et d'arriver à une interface complexe (et donc inutilisable car non maintenue). J'ai donc choisi de simplifier un maximum les choses. Les options d'impressions sont gérées par une série de bits. pour l'instant, il y en a 2 (et j'espère qu'il y en aura pas beaucoup plus):

Pourquoi ne pas faire un seul flag? (détails on/off). Tout "simplement" à cause de l'héritage et de ma haine des couper/coller. Par exemple, imaginons qu'on veuille imprimer une Curve (dérivant de NumberedObject). NumberedObject affiche en résumé "NomObjet #no" en mode WOpt::summary et d'autres infos supplémentaires en WOpt::details. On aimerait ajouter des infos supplementaires à côté de "NomObjet #no" (la liste des points de la courbe - le maillage - etc) ainsi que des infos après les détails de NumberedObject.

Indentation:

Quand un objet affiche ses infos détaillées ou d'autres objets, il est intéressant d'augmenter l'indentation à chaque ligne. Ceci est géré par un objet Indentor (comme dans VTK). Pour augmenter une indentation, il suffit d'appeler Indentor::getNext().

Exemple:

Voici le code de NumberedObject:

void 
NumberedObject::write(std::ostream &out, const Indentor &indent, const WOpt::flags &opts)
{
    if(opts&WOpt::summary)
        out << indent << getObjectName() << " #" << getNo();
    if(opts&WOpt::details)
    {
        if(opts&WOpt::summary) out << '\n';
        out << indent.getNext() << "searchIndex=" << searchIndex << '\n';
    }
}

Et celui exécuté par Curve...

template <class T>
void 
GeoObject::write(std::ostream &out, const Indentor &indent, const WOpt::flags &opts)
{
    if(opts&WOpt::summary)
    {
        NumberedObject::write(out,indent,WOpt::summary);
        T tmp(UserNo::invalid());
        out << " " << tmp.getObjectName() << "s ";
        for(int i=0; i<size(); ++i)
        {
            out << comps[i].getNo() << " ";
        }
        MeshedObject::write(out,indent,WOpt::summary);
        NodeContainer::write(out,indent,WOpt::summary);
    }
    if(opts&WOpt::details)
    {
        if(opts&WOpt::summary) out << '\n';
        NumberedObject::write(out,indent,WOpt::details);
        MeshedObject::write(out,indent,WOpt::details);
        NodeContainer::write(out,indent,WOpt::details);
    }
}
Line #1 Points 1 2 (mesh #0:11 pts)
    searchIndex=13
    mesh #0:
    1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
    2
Line #1 Points 1 2 (mesh #0:11 pts)
searchIndex=13
mesh #0:
1, 3, 4, 5, 6, 7, 8, 9, 10, 11,
2

J'espère que tous ces développements vont permettre aux utilisateurs de Metafor (moi en premier) de comprendre ce qui existe à l'interieur des différents objets.

Noubliez pas qu'il est maintenant possible d'afficher un objet avec "print object" dans python !!

 

Exemple Python:

import apps.qs.cont2
print apps.qs.cont2.getDomain()

donne

MetaDomain named "noname"
    Metafor analysis (owner)
    ElementSet of size 111
    Geometry dim=2D_EPD
        PointSet of size 7 (hash=off)
        CurveSet of size 5 (hash=off)
        WireSet of size 1 (hash=off)
        SideSet of size 1 (hash=off)
    Topology dim=Not set
        PointSet of size 121 (hash=off)
        CurveSet of size 220 (hash=off)
        WireSet of size 100 (hash=off)
        SideSet of size 100 (hash=off)
        SurfaceSet of size 100 (hash=off)
    NodeSet of size 121 (hash=off)
    InteractionSet of size 2 (std::vector)
    LoadingSet of size 3
    MaterialSet of size 2

essayez avec les autres objets (interactions, objets géométriques, matériaux, etc)...

Fichiers ajoutés/supprimés:

A mtGeo/mtGeoEnums.cpp

 

Back to Metafor web server
created :19-jan-05   modified : 24-Jan-2005
contact : r_boman_AT_yahoo.fr