EGS_Object *EGS_ObjectFactory::createObjects(EGS_Input *i, const string §ion_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; }
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; }