* Is generated by any algorithm or GUI of the application to inform the user about
* the problem. In GUI mode all such errors are collected in the message log window.
*/
-class EVENTS_EXPORT Events_Error : public Events_Message
+class Events_Error : public Events_Message
{
std::string myDescription; ///< the description of the error
public:
/// default destructor
- virtual ~Events_Error();
+ EVENTS_EXPORT virtual ~Events_Error();
/// Identifier of this event (one for all errors)
- static Events_ID errorID();
+ EVENTS_EXPORT static Events_ID errorID();
/// Specific error string
- const char* description() const;
+ EVENTS_EXPORT const char* description() const;
/// Allows to send an error quickly: it creates and sends the error object automatically
- static void send(const std::string& theDescription, const void* theSender = 0);
+ EVENTS_EXPORT static void send(const std::string& theDescription, const void* theSender = 0);
protected:
/// Default constructor. Use "send" message for generation an error.
- Events_Error(const std::string& theDescription, const void* theSender = 0);
+ EVENTS_EXPORT Events_Error(const std::string& theDescription, const void* theSender = 0);
};
#endif /* EVENTS_ERROR_H_ */
aComposite->removeFeature(theFeature);
}
}
+ // this must be before erase since theFeature erasing removes all information about
+ // the feature results and groups of results
+ // To reproduce: create sketch, extrusion, remove sketch => constructions tree is not updated
+ clearHistory(theFeature);
// erase fields
theFeature->erase();
if (myFeatures.IsBound(aFeatureLabel))
myFeatures.UnBind(aFeatureLabel);
- clearHistory(theFeature);
-
static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
ModelAPI_EventCreator::get()->sendUpdated(theFeature, EVENT_DISP);
// erase all attributes under the label of feature
myHistory.erase(aHIter); // erase from map => this means that it is not synchronized
if (theObj->groupName() == ModelAPI_Feature::group()) { // clear results group of the feature
FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theObj);
- if (aFeature->firstResult().get())
- clearHistory(aFeature->firstResult());
+ std::string aResultGroup = featureResultGroup(aFeature);
+ if (!aResultGroup.empty()) {
+ std::map<std::string, std::vector<ObjectPtr> >::iterator aHIter =
+ myHistory.find(aResultGroup);
+ if (aHIter != myHistory.end())
+ myHistory.erase(aHIter); // erase from map => this means that it is not synchronized
+ }
}
}
}
return FeaturePtr();
}
+std::string Model_Objects::featureResultGroup(FeaturePtr theFeature)
+{
+ if (theFeature->data()->isValid()) {
+ TDF_ChildIterator aLabIter(resultLabel(theFeature->data(), 0).Father());
+ if (aLabIter.More()) {
+ TDF_Label anArgLab = aLabIter.Value();
+ Handle(TDataStd_Comment) aGroup;
+ if (aLabIter.Value().FindAttribute(TDataStd_Comment::GetID(), aGroup)) {
+ return TCollection_AsciiString(aGroup->Get()).ToCString();
+ }
+ }
+ }
+ static std::string anEmpty;
+ return anEmpty; // not found
+}
+
void Model_Objects::updateResults(FeaturePtr theFeature)
{
// for not persistent is will be done by parametric updater automatically