Beispiel #1
0
EGS_Object *EGS_ObjectFactory::createObjects(EGS_Input *i,
        const string &section_delimeter, const string &object_delimeter,
        const string &select_key, const char *funcname, bool unique) {
    if (!i) {
        egsWarning("EGS_ObjectFactory::createObjects(): null input?\n");
        return 0;
    }
    EGS_Input *input = i;
    if (!i->isA(section_delimeter)) {
        input = i->takeInputItem(section_delimeter);
        if (!input) {
            egsWarning("EGS_ObjectFactory::createObjects(): the input is"
                       " not of type %s and also does not have items of this type\n",
                       section_delimeter.c_str());
            return 0;
        }
    }
    EGS_Input *ij;
    int errors = 0;
    while ((ij = input->takeInputItem(object_delimeter)) != 0) {
        EGS_Object *o = createSingleObject(ij,funcname,unique);
        if (!o) {
            errors++;
        }
        delete ij;
    }
    if (errors) egsWarning("EGS_ObjectFactory::createObjects(): %d errors"
                               " occured while creating objects\n",errors);
    string sought_object;
    EGS_Object *o = 0;
    if (objects.size() > 0) {
        o = objects[objects.size()-1];
    }
    int err = input->getInput(select_key,sought_object);
    if (!err) {
        o = getObject(sought_object);
        if (!o) egsWarning("EGS_ObjectFactory::createObjects(): an object "
                               "with the name %s does not exist\n",sought_object.c_str());
    }
    return o;
}
EGS_ENVELOPEG_EXPORT EGS_BaseGeometry* createGeometry(EGS_Input *input) {
    if( !input ) {
        egsWarning(eeg_message1,eeg_message2);
        return 0;
    }
    //
    // *** new indexing style
    //
    int indexing = 0;
    input->getInput("new indexing style",indexing);
    //
    // *** Base geometry
    //
    EGS_Input *i = input->takeInputItem(eeg_keyword1);
    if( !i ) {
        egsWarning(eeg_message1,eeg_message3); return 0;
    }
    EGS_Input *ig = i->takeInputItem(eeg_keyword2);
    EGS_BaseGeometry *g;
    if( ig ) { // defined inline
        g = EGS_BaseGeometry::createSingleGeometry(ig);
        delete ig;
        if( !g ) {
            egsWarning(eeg_message1,eeg_message4);
            delete i; return 0;
        }
    }
    else {  // defined via a name of a previously defined geometry
        string bgname;
        int err = i->getInput(eeg_keyword1,bgname);
        delete i;
        if( err ) {
            egsWarning(eeg_message1,eeg_message5); return 0;
        }
        g = EGS_BaseGeometry::getGeometry(bgname);
        if( !g ) {
            egsWarning(eeg_message6,bgname.c_str()); return 0;
        }
    }
    vector<EnvelopeAux *> fgeoms;
    EGS_Input *ix;
    while( (ix = input->takeInputItem("inscribe in regions")) != 0 ) {
        vector<string> values;
        ix->getInput("inscribe in regions",values);
        if( values.size() < 2 ) egsWarning("createGeometry(envelope geometry):"
              " %d inputs for 'inscribe in regions'? 2 or more are needed\n",values.size());
        else {
            EGS_BaseGeometry *gj = EGS_BaseGeometry::getGeometry(values[0]);
            if( !gj ) egsWarning(eeg_message6,values[0].c_str());
            else {
                EnvelopeAux *aux = new EnvelopeAux;
                aux->g = gj;
                aux->nreg = values.size()-1;
                aux->regs = new int [aux->nreg];
                for(int j=0; j<aux->nreg; j++)
                    aux->regs[j] = atoi(values[j+1].c_str());
                fgeoms.push_back(aux);
            }
        }
        delete ix;
    }
    if( fgeoms.size() > 0 ) {
        EGS_BaseGeometry *result = new EGS_FastEnvelope(g,fgeoms,"",indexing);
        result->setName(input);
        for(int j=0; j<fgeoms.size(); j++) delete fgeoms[j];
        return result;
    }

    //
    // *** Inscribed geometries
    //
    i = input->takeInputItem(eeg_keyword3);
    vector<EGS_BaseGeometry *> geoms;
    if( !i ) {
        if( fgeoms.size() ) egsWarning(eeg_message1,eeg_message7);
    }
    else {
        // first try for inscribed geometries defined inline
        while( (ig = i->takeInputItem(eeg_keyword2)) != 0 ) {
            EGS_BaseGeometry *gj = EGS_BaseGeometry::createSingleGeometry(ig);
            delete ig;
            if( !gj ) egsWarning(eeg_message1,eeg_message8);
            else geoms.push_back(gj);
        }
        // if geoms.size() is 0, check if inscribed geometries are defined
        // via names of previously defined geometries.
        if( !geoms.size() ) {
            vector<string> igeoms;
            int err = i->getInput(eeg_keyword3,igeoms);
            if( err || !igeoms.size() )
                egsWarning(eeg_message1,eeg_message7);
            else {
                for(unsigned int j=0; j<igeoms.size(); j++) {
                    EGS_BaseGeometry *gj =
                        EGS_BaseGeometry::getGeometry(igeoms[j]);
                    if( !gj )
                        egsWarning(eeg_message6,igeoms[j].c_str());
                    else geoms.push_back(gj);
                }
            }
        }
        delete i;
    }
    /*
    EGS_BaseGeometry *result = fgeoms.size() ?
        new EGS_EnvelopeGeometry(g,fgeoms,geoms) :
        new EGS_EnvelopeGeometry(g,geoms);
        */
    EGS_BaseGeometry *result = new EGS_EnvelopeGeometry(g,geoms,"",indexing);
    result->setName(input);
    result->setLabels(input);
    return result;

}
Beispiel #3
0
EGS_SMART_ENVELOPE_EXPORT EGS_BaseGeometry* createGeometry(EGS_Input *input) {
    if( !input ) {
        egsWarning(eeg_message1,eeg_message2);
        return 0;
    }
    //
    // *** Base geometry
    //
    EGS_Input *i = input->takeInputItem(eeg_keyword1);
    if( !i ) {
        egsWarning(eeg_message1,eeg_message3); return 0;
    }
    EGS_Input *ig = i->takeInputItem(eeg_keyword2);
    EGS_BaseGeometry *g;
    if( ig ) { // defined inline
        g = EGS_BaseGeometry::createSingleGeometry(ig);
        delete ig;
        if( !g ) {
            egsWarning(eeg_message1,eeg_message4);
            delete i; return 0;
        }
    }
    else {  // defined via a name of a previously defined geometry
        string bgname;
        int err = i->getInput(eeg_keyword1,bgname);
        delete i;
        if( err ) {
            egsWarning(eeg_message1,eeg_message5); return 0;
        }
        g = EGS_BaseGeometry::getGeometry(bgname);
        if( !g ) {
            egsWarning(eeg_message6,bgname.c_str()); return 0;
        }
    }
    vector<SmartEnvelopeAux *> fgeoms;
    int nbase = g->regions();
    EGS_Input *ix;
    while( (ix = input->takeInputItem("inscribe geometry")) != 0 ) {
        vector<string> values;
        ix->getInput("inscribe geometry",values);
        if( values.size() < 2 ) egsWarning("createGeometry(smart envelope):"
              " %d inputs for 'inscribe geometry'? 2 or more are needed\n",values.size());
        else {
            EGS_BaseGeometry *gj = EGS_BaseGeometry::getGeometry(values[0]);
            if( !gj ) egsWarning(eeg_message6,values[0].c_str());
            else {
                SmartEnvelopeAux *aux = new SmartEnvelopeAux;
                aux->g = gj;
                aux->ireg = atoi(values[1].c_str());
                aux->type = values.size() == 3 ? atoi(values[2].c_str()) : 0;
                //egsInformation("set geometr: %s %d %d\n",values[0].c_str(),aux->ireg,aux->type);
                if( aux->ireg < 0 || aux->ireg >= nbase ) {
                    egsWarning("createGeometry(smart envelope): wrong "
                         "region index %d for inscribed geometry %s\n",
                         aux->ireg,gj->getName().c_str());
                    delete aux;
                }
                else fgeoms.push_back(aux);
            }
        }
        delete ix;
    }
    EGS_BaseGeometry *result = new EGS_SmartEnvelope(g,fgeoms,"");
    result->setName(input);
    result->setLabels(input);
    for(int j=0; j<fgeoms.size(); j++) delete fgeoms[j];
    return result;

}