Changeset 95:8c260716cbb4 in finroc_plugins_parameters
- Timestamp:
- 25.03.2021 08:04:48 (3 years ago)
- Branch:
- 17.03
- Children:
- 96:f998b50b4ea3, 97:2ad135631834
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
internal/tStaticParameterList.cpp
r83 r95 75 75 // Implementation 76 76 //---------------------------------------------------------------------- 77 78 namespace 79 { 80 81 std::vector<core::tFrameworkElement*>& ElementsInStaticParameterEvaluation() 82 { 83 static std::vector<core::tFrameworkElement*> list; 84 return list; 85 } 86 87 } 88 77 89 78 90 tStaticParameterList::tStaticParameterList() : … … 194 206 { 195 207 rrlib::thread::tLock lock2(fe.GetStructureMutex()); 196 197 // all parameters attached to any of the module's parameters 198 std::vector<tStaticParameterImplementationBase*> attached_parameters; 199 std::vector<tStaticParameterImplementationBase*> attached_parameters_tmp; 200 201 tStaticParameterList* spl = fe.GetAnnotation<tStaticParameterList>(); 202 if (spl) 203 { 204 205 // Reevaluate parameters and check whether they have changed 206 bool changed = false; 207 for (size_t i = 0; i < spl->Size(); i++) 208 { 209 spl->Get(i).LoadValue(); 210 changed |= spl->Get(i).HasChanged(); 211 spl->Get(i).GetAllAttachedParameters(attached_parameters_tmp); 212 attached_parameters.insert(attached_parameters.end(), attached_parameters_tmp.begin(), attached_parameters_tmp.end()); 213 } 214 215 if (changed) 216 { 217 fe.OnStaticParameterChange(); 218 for (auto listener : spl->listeners) 219 { 220 listener->OnStaticParameterChange(); 221 } 222 223 // Reset change flags for all parameters 208 auto& in_static_parameter_evaluation = ElementsInStaticParameterEvaluation(); 209 if (std::find(in_static_parameter_evaluation.begin(), in_static_parameter_evaluation.end(), &fe) != in_static_parameter_evaluation.end()) 210 { 211 return; 212 } 213 in_static_parameter_evaluation.push_back(&fe); 214 215 try 216 { 217 // all parameters attached to any of the module's parameters 218 std::vector<tStaticParameterImplementationBase*> attached_parameters; 219 std::vector<tStaticParameterImplementationBase*> attached_parameters_tmp; 220 221 tStaticParameterList* spl = fe.GetAnnotation<tStaticParameterList>(); 222 if (spl) 223 { 224 225 // Reevaluate parameters and check whether they have changed 226 bool changed = false; 224 227 for (size_t i = 0; i < spl->Size(); i++) 225 228 { 226 spl->Get(i).ResetChanged(); 227 } 228 229 // initialize any new child elements 230 if (fe.IsReady()) 231 { 232 fe.Init(); 233 } 234 } 235 } 236 237 // evaluate children's static parameters 238 for (auto it = fe.ChildrenBegin(); it != fe.ChildrenEnd(); ++it) 239 { 240 // follow only primary links 241 if ((it->GetParent() == &fe) && (!it->IsDeleted())) 242 { 243 DoStaticParameterEvaluation(*it); 244 } 245 } 246 247 // evaluate any attached parameters that have changed, too 248 for (size_t i = 0; i < attached_parameters.size(); i++) 249 { 250 if (attached_parameters[i]->HasChanged()) 251 { 252 DoStaticParameterEvaluation(*attached_parameters[i]->GetParentList()->GetAnnotated()); 253 } 254 } 229 spl->Get(i).LoadValue(); 230 changed |= spl->Get(i).HasChanged(); 231 spl->Get(i).GetAllAttachedParameters(attached_parameters_tmp); 232 attached_parameters.insert(attached_parameters.end(), attached_parameters_tmp.begin(), attached_parameters_tmp.end()); 233 } 234 235 if (changed) 236 { 237 fe.OnStaticParameterChange(); 238 for (auto listener : spl->listeners) 239 { 240 listener->OnStaticParameterChange(); 241 } 242 243 // Reset change flags for all parameters 244 for (size_t i = 0; i < spl->Size(); i++) 245 { 246 spl->Get(i).ResetChanged(); 247 } 248 249 // initialize any new child elements 250 if (fe.IsReady()) 251 { 252 fe.Init(); 253 } 254 } 255 } 256 257 // evaluate children's static parameters 258 for (auto it = fe.ChildrenBegin(); it != fe.ChildrenEnd(); ++it) 259 { 260 // follow only primary links 261 if ((it->GetParent() == &fe) && (!it->IsDeleted())) 262 { 263 DoStaticParameterEvaluation(*it); 264 } 265 } 266 267 // evaluate any attached parameters that have changed, too 268 for (size_t i = 0; i < attached_parameters.size(); i++) 269 { 270 if (attached_parameters[i]->HasChanged()) 271 { 272 DoStaticParameterEvaluation(*attached_parameters[i]->GetParentList()->GetAnnotated()); 273 } 274 } 275 } 276 catch (const std::exception& e) 277 { 278 FINROC_LOG_PRINT_STATIC(ERROR, "Static parameter evaluation failed in '", fe, "': ", e); 279 } 280 281 assert(in_static_parameter_evaluation.size() && in_static_parameter_evaluation.back() == &fe); 282 in_static_parameter_evaluation.pop_back(); 255 283 } 256 284
Note: See TracChangeset
for help on using the changeset viewer.