void selectPrimByPath(IPrimitive *rootNode, const std::string &path, TPrimitiveSet &result) { std::vector<std::string> parts; NLMISC::explode(path, std::string("."), parts, false); // IPrimitive * tmpChild; result.clear(); if (parts.empty()) return; // handle a special case if (parts.size() > 1 && parts[1] == "primitive") { parts[0] += ".primitive"; parts.erase(parts.begin()+1); } TPrimitiveSet candidats, nextStep; candidats.push_back(rootNode); // check root validity std::string name; rootNode->getPropertyByName("name", name); if (name != parts.front()) return; for (uint i=1; i<parts.size(); ++i) { for (uint j=0; j<candidats.size(); ++j) { for (uint k=0; k<candidats[j]->getNumChildren(); ++k) { std::string name; IPrimitive *child; candidats[j]->getChild(child, k); child->getPropertyByName("name", name); if (name == parts[i]) { nextStep.push_back(child); } } } candidats.swap(nextStep); nextStep.clear(); } result.swap(candidats); // for (uint i=0; i<parts.size(); ++i) // { // for (uint j=0; j<candidats.size(); ++j) // { // std::string tmpName; // std::vector<std::string> name; // candidats[j]->getPropertyByName("name", tmpName); // NLMISC::explode(tmpName,".",name); // // bool test=false; // for(uint k=0;k<name.size();k++) // { // if (name.at(k)==parts[i+k]) // test=true; // else // { // test=false; // break; // } // } // if (test) // { // if (i == parts.size()-1) // { // } // else // { // for(uint k=0;k<candidats[j]->getNumChildren();k++) // { // candidats[j]->getChild(tmpChild,k); // nextStep.push_back(tmpChild); // } // } //// result.clear(); //// result.push_back(candidats[j]); // i+=name.size()-1; // break; // } // // } // // candidats.swap(nextStep); // nextStep.clear(); // // if (candidats.empty()) // return; // } // store the result // result.swap(candidats); //result.push_back(candidats.at(0)->getParent()); }
bool CPrimitiveClass::CParameter::translateAutoname (std::string &result, const IPrimitive &primitive, const CPrimitiveClass &primitiveClass) const { result = ""; string::size_type strBegin = 0; string::size_type strEnd = 0; while (strBegin != Autoname.size()) { strEnd = Autoname.find ('$', strBegin); if (strEnd == string::npos) { strEnd = Autoname.size(); result += Autoname.substr (strBegin, strEnd-strBegin); } else { // Copy the remaining string result += Autoname.substr (strBegin, strEnd-strBegin); if (strEnd != Autoname.size()) { strBegin = strEnd+1; strEnd = Autoname.find ('$', strBegin); if (strEnd == string::npos) strEnd = Autoname.size(); else { string keyWord = Autoname.substr (strBegin, strEnd-strBegin); // Loop for the parameter uint i; for (i=0; i<primitiveClass.Parameters.size (); i++) { if (primitiveClass.Parameters[i].Name == keyWord) { // Get its string value string str; const IProperty *prop; if (primitive.getPropertyByName (keyWord.c_str(), prop)) { // The property has been found ? if (prop) { // Array or string ? const CPropertyString *_string = dynamic_cast<const CPropertyString *>(prop); // Is a string ? if (_string) { if (!(_string->String.empty())) { result += _string->String; break; } } else { // Try an array const CPropertyStringArray *array = dynamic_cast<const CPropertyStringArray *>(prop); // Is an array ? if (array) { if (!(array->StringArray.empty())) { uint i; for (i=0; i<array->StringArray.size()-1; i++) result += array->StringArray[i] + "\n"; result += array->StringArray[i]; break; } } } } } // Get its default value std::string result2; if (primitiveClass.Parameters[i].getDefaultValue (result2, primitive, primitiveClass)) { result += result2; break; } } } strEnd++; } } } strBegin = strEnd; } return true; }