+ 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();
+