+
+void SketchPlugin_Plugin::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+ const Events_ID kRequestEvent =
+ Events_Loop::loop()->eventByName(EVENT_FEATURE_STATE_REQUEST);
+ if (theMessage->eventID() == kRequestEvent) {
+ std::shared_ptr<ModelAPI_FeatureStateMessage> aStateMessage =
+ std::dynamic_pointer_cast<ModelAPI_FeatureStateMessage>(theMessage);
+ Events_Loop::loop()->send(getFeaturesState(aStateMessage->feature()), false);
+ }
+}
+
+std::shared_ptr<ModelAPI_FeatureStateMessage> SketchPlugin_Plugin
+::getFeaturesState(const std::shared_ptr<ModelAPI_Feature>& theFeature) const
+{
+ const Events_ID kResponseEvent = Events_Loop::loop()->eventByName(EVENT_FEATURE_STATE_RESPONSE);
+ std::shared_ptr<ModelAPI_FeatureStateMessage> aMsg(
+ new ModelAPI_FeatureStateMessage(kResponseEvent, this));
+
+ bool aHasSketchPlane = false;
+ std::shared_ptr<SketchPlugin_Sketch> aSketchFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Sketch>(theFeature);
+ if (aSketchFeature.get()) {
+ std::shared_ptr<ModelAPI_Data> aData = aSketchFeature->data();
+ if (aData) {
+ std::shared_ptr<GeomDataAPI_Dir> aNormal =
+ std::dynamic_pointer_cast<GeomDataAPI_Dir>(
+ aData->attribute(SketchPlugin_Sketch::NORM_ID()));
+ // it is important to check whether the normal attribute is initialized
+ // because it is possible that normal values are filled when the plane is checked on validity
+ aHasSketchPlane = aNormal && aNormal->isInitialized() &&
+ !(aNormal->x() == 0 && aNormal->y() == 0 && aNormal->z() == 0);
+
+ aMsg->setState(SketchPlugin_Point::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_IntersectionPoint::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Line::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Circle::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Arc::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Projection::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintCoincidence::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintCollinear::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintDistance::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintLength::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintParallel::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintPerpendicular::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintRadius::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintRigid::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintHorizontal::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintVertical::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintEqual::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintTangent::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintMiddle::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintMirror::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Fillet::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintSplit::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_ConstraintAngle::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_MultiRotation::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_MultiTranslation::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_Trim::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_MacroArc::ID(), aHasSketchPlane);
+ aMsg->setState(SketchPlugin_MacroCircle::ID(), aHasSketchPlane);
+ // SketchRectangle is a python feature, so its ID is passed just as a string
+ aMsg->setState("SketchRectangle", aHasSketchPlane);
+ }
+ }
+ return aMsg;
+}