diff --git a/src/user/user_model.cc b/src/user/user_model.cc index b6ec8086..fbd94a6b 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -250,15 +250,22 @@ mjCModel& mjCModel::operator+=(const mjCModel& other) { template -void mjCModel::RemoveFromList(std::vector& list) { +void mjCModel::RemoveFromList(std::vector& list, const mjCModel& other) { int nlist = (int)list.size(); int removed = 0; for (int i = 0; i < nlist; i++) { T* element = list[i]; element->id -= removed; + try { + // check if the element contains an error + element->NameSpace(&other); + element->CopyFromSpec(); + element->ResolveReferences(&other); + } catch (mjCError err) { + continue; + } try { // check if the element references something that was removed - // TODO: do not remove elements that contain user errors element->NameSpace(this); element->CopyFromSpec(); element->ResolveReferences(this); @@ -296,12 +303,12 @@ mjCModel& mjCModel::operator-=(const mjCBody& subtree) { ProcessLists(/*checkrepeat=*/false); // check if we have to remove anything else - RemoveFromList(pairs_); - RemoveFromList(excludes_); - RemoveFromList(tendons_); - RemoveFromList(equalities_); - RemoveFromList(actuators_); - RemoveFromList(sensors_); + RemoveFromList(pairs_, oldmodel); + RemoveFromList(excludes_, oldmodel); + RemoveFromList(tendons_, oldmodel); + RemoveFromList(equalities_, oldmodel); + RemoveFromList(actuators_, oldmodel); + RemoveFromList(sensors_, oldmodel); // restore to the original state if (!compiled) { diff --git a/src/user/user_model.h b/src/user/user_model.h index f6c1c782..52bef9c1 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -345,7 +345,7 @@ class mjCModel : public mjCModel_, private mjSpec { const std::vector& sources); // delete from list the elements that cause an error - template void RemoveFromList(std::vector& list); + template void RemoveFromList(std::vector& list, const mjCModel& other); // create mjCBase lists from children lists void CreateObjectLists();