+void PartSet_SketcherMgr::onShowPoints(bool toShow)
+{
+ if (!myCurrentSketch.get())
+ return;
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+ Handle(AIS_InteractiveContext) aContext = aViewer->AISContext();
+
+ bool aToUpdate = false;
+ if (toShow) {
+ std::list<ResultPtr> aFreePoints = SketcherPrs_Tools::getFreePoints(myCurrentSketch);
+
+ // Delete obsolete presentations
+ std::list<ResultPtr> aDelList;
+ foreach(ResultPtr aObj, myPointsHighlight.keys()) {
+ bool aFound = (std::find(aFreePoints.begin(), aFreePoints.end(), aObj) != aFreePoints.end());
+ if (!aFound)
+ aDelList.push_back(aObj);
+ }
+ foreach(ResultPtr aObj, aDelList) {
+ aContext->Remove(myPointsHighlight[aObj], false);
+ aToUpdate = true;
+ myPointsHighlight.remove(aObj);
+ }
+
+ // Display new objects
+ QList<ResultPtr> aKeysList = myPointsHighlight.keys();
+ std::list<ResultPtr>::const_iterator aIt;
+ for (aIt = aFreePoints.cbegin(); aIt != aFreePoints.cend(); aIt++) {
+ if (!aKeysList.contains(*aIt)) {
+ GeomShapePtr aShapePtr = (*aIt)->shape();
+ TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
+ Handle(AIS_Shape) aShapePrs = new AIS_Shape(aShape);
+ aShapePrs->SetColor(Quantity_NOC_BLUE1);
+ aShapePrs->SetZLayer(Graphic3d_ZLayerId_Top);
+ Handle(Prs3d_Drawer) aDrawer = aShapePrs->Attributes();
+ if (aDrawer->HasOwnPointAspect()) {
+ aDrawer->PointAspect()->SetTypeOfMarker(Aspect_TOM_O_STAR);
+ aDrawer->PointAspect()->SetColor(Quantity_NOC_BLUE1);
+ aDrawer->PointAspect()->SetScale(2);
+ }
+ else
+ aDrawer->SetPointAspect(new Prs3d_PointAspect(Aspect_TOM_O_STAR, Quantity_NOC_BLUE1, 2));
+ aContext->Display(aShapePrs, false);
+ aContext->Deactivate(aShapePrs);
+ myPointsHighlight[*aIt] = aShapePrs;
+ aToUpdate = true;
+ }
+ }
+ }
+ else {
+ foreach(Handle(AIS_Shape) aPrs, myPointsHighlight.values()) {
+ aContext->Remove(aPrs, false);
+ aToUpdate = true;
+ }
+ myPointsHighlight.clear();
+ }
+ if (aToUpdate)
+ aViewer->update();
+}
+
+void PartSet_SketcherMgr::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+ if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOF_OBJECTS)) {
+ std::shared_ptr<ModelAPI_ObjectUpdatedMessage> anUpdateMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::set<ObjectPtr> aObjects = anUpdateMsg->objects();
+ std::set<ObjectPtr>::const_iterator aIt;
+ QList<ModuleBase_ViewerPrsPtr> aPrsList;
+ for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aIt);
+ if (aFeature.get()) {
+ std::list<ResultPtr> aRes = aFeature->results();
+ std::list<ResultPtr>::const_iterator aRIt;
+ for (aRIt = aRes.cbegin(); aRIt != aRes.cend(); ++aRIt) {
+ ModuleBase_ViewerPrsPtr aPrsPtr(new ModuleBase_ViewerPrs(*aRIt));
+ aPrsList.append(aPrsPtr);
+ }
+ }
+ }
+ if (aPrsList.size() > 0) {
+ myModule->workshop()->setSelected(aPrsList);
+ }
+ }
+}
+
+bool isExternal(const ObjectPtr& theObject)
+{
+ AttributeSelectionPtr aAttr =
+ theObject->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID());
+ if (aAttr)
+ return aAttr->context().get() != NULL && !aAttr->isInvalid();
+ return false;
+}
+
+bool isCopy(const ObjectPtr& theObject)
+{
+ AttributeBooleanPtr anAttr = theObject->data()->boolean(SketchPlugin_SketchEntity::COPY_ID());
+ if (anAttr.get())
+ return anAttr->value();
+ return false;
+}
+
+bool isIncludeToResult(const ObjectPtr& theObject)
+{
+ AttributeBooleanPtr anAttr;
+ std::set<AttributePtr> aRefsToMe = theObject->data()->refsToMe();
+ std::set<AttributePtr>::const_iterator aIt;
+ for (aIt = aRefsToMe.cbegin(); aIt != aRefsToMe.cend(); ++aIt) {
+ if ((*aIt)->id() == SketchPlugin_Projection::PROJECTED_FEATURE_ID()) {
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>((*aIt)->owner());
+ if (aFeature.get() && !aFeature->isMacro()) {
+ anAttr = aFeature->data()->boolean(SketchPlugin_Projection::INCLUDE_INTO_RESULT());
+ if (anAttr.get())
+ return anAttr->value();
+ }
+ }
+ }
+ return true;
+}
+
+//**************************************************************************************
+std::vector<int> PartSet_SketcherMgr::colorOfObject(const ObjectPtr& theObject,
+ const FeaturePtr& theFeature, bool isConstruction) const
+{
+ PartSet_OverconstraintListener* aOCListener = myModule->overconstraintListener();
+ std::string aKind = theFeature->getKind();
+
+ if (aOCListener->isConflictingObject(theObject)) {
+ return Config_PropManager::color("Visualization", "sketch_overconstraint_color");
+ }
+ if (isDistanceKind(aKind)) {
+ return Config_PropManager::color("Visualization", "sketch_dimension_color");
+ }
+ if (isExternal(theFeature))
+ return Config_PropManager::color("Visualization", "sketch_external_color");
+
+ if (aOCListener->isFullyConstrained()) {
+ return Config_PropManager::color("Visualization", "sketch_fully_constrained_color");
+ }
+ if (aKind == SketchPlugin_ConstraintCoincidence::ID())
+ return std::vector<int>(3, 0);
+
+ if (isConstruction)
+ return Config_PropManager::color("Visualization", "sketch_auxiliary_color");
+
+ return Config_PropManager::color("Visualization", "sketch_entity_color");
+}
+
+//**************************************************************************************
+void PartSet_SketcherMgr::customizeSketchPresentation(const ObjectPtr& theObject,
+ const AISObjectPtr& thePrs) const
+{
+ FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+
+ // set color from preferences
+ std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
+ aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
+ bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
+
+ std::vector<int> aColor = colorOfObject(theObject, aFeature, isConstruction);
+ if (!aColor.empty()) {
+ // The code below causes redisplay again
+ if (ModelAPI_Session::get()->isOperation()) {
+ AttributeIntArrayPtr aColorAttr = theObject->data()->intArray(ModelAPI_Result::COLOR_ID());
+ if (aColorAttr.get()) {
+ aColorAttr->setSize(3, false);
+ // Set the color attribute in order do not use default colors in the presentation object
+ for (int i = 0; i < 3; i++)
+ aColorAttr->setValue(i, aColor[i], false);
+ }
+ }
+ thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+ }
+
+ int aShapeType = thePrs->getShapeType();
+ // a compound is processed like the edge because the
+ // arc feature uses the compound for presentable AIS
+ if (aShapeType != 6/*an edge*/ && aShapeType != 7/*a vertex*/ && aShapeType != 0/*compound*/)
+ return;
+
+ int aWidth = Config_PropManager::integer("Visualization", "sketch_line_width");
+ if (isExternal(aFeature)) {
+ thePrs->setWidth(isIncludeToResult(aFeature)? aWidth : 1);
+ return;
+ }
+ std::string aKind = aFeature->getKind();
+ if (isDistanceKind(aKind))
+ return;
+
+ if (aShapeType == 6 || aShapeType == 0) { // if this is an edge or a compound
+ if (isConstruction) {
+ // Set axilliary line
+ thePrs->setWidth(SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY());
+ thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY());
+ }
+ else {
+ thePrs->setWidth(aWidth);
+ thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE());
+ }
+ }
+ else if (aShapeType == 7) { // otherwise this is a vertex
+ // The width value do not have effect on the point presentation.
+ // It is defined in order to extend selection area of the object.
+ thePrs->setWidth(17);
+ // thePrs->setPointMarker(1, 1.); // Set point as a '+' symbol
+ }
+ if (isCopy(aFeature) || !isIncludeToResult(aFeature)) {
+ double aPrsWidth = thePrs->width();
+ thePrs->setWidth(aPrsWidth / 2.5);
+ }
+
+ double aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
+ thePrs->setDeflection(aDeflection);
+}
+
+//*************************************************************************************
+void PartSet_Fitter::fitAll(Handle(V3d_View) theView)
+{
+ CompositeFeaturePtr aSketch = mySketchMgr->activeSketch();
+
+ ModuleBase_IWorkshop* aWorkshop = mySketchMgr->module()->workshop();
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+
+ Bnd_Box aBndBox;
+ int aNumberOfSubs = aSketch->numberOfSubs();
+ double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
+ for (int i = 0; i < aNumberOfSubs; i++) {
+ FeaturePtr aFeature = aSketch->subFeature(i);
+ if (aDisplayer->isVisible(aFeature)) {
+ AISObjectPtr aAisPtr = aDisplayer->getAISObject(aFeature);
+ Handle(AIS_InteractiveObject) aAisObj = aAisPtr->impl<Handle(AIS_InteractiveObject)>();
+ if (!aAisObj->IsInfinite()) {
+ Bnd_Box aBox;
+ aAisObj->BoundingBox(aBox);
+ aBndBox.Add(aBox);
+ }
+ }
+ else {
+ std::list<ResultPtr> aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ ResultPtr aRes;
+ for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) {
+ aRes = (*aIt);
+ if (aRes->isDisplayed()) {
+ FeaturePtr aCurFeature = ModelAPI_Feature::feature(aRes);
+ if (aCurFeature.get()) {
+ std::shared_ptr<SketchPlugin_Feature> aSPFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(aCurFeature);
+ if (aSPFeature.get()) {
+ bool isAxiliary =
+ aSPFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value();
+ if (!(aSPFeature->isExternal() || isAxiliary)) {
+ GeomShapePtr aShape = aRes->shape();
+ aShape->computeSize(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
+ Bnd_Box aBox;
+ aBox.Update(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
+ aBndBox.Add(aBox);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (aBndBox.IsVoid())
+ theView->FitAll();
+ else
+ theView->FitAll(aBndBox, 0.01);
+}