X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintSplit.cpp;h=e21de959145bec5bc7e92a910de48e5ee504953e;hb=b5893b0a30fac08134c24de4565cb513a43affa6;hp=32199abce256870049b612d95c94b8459bef9566;hpb=0c493630542ba94bdb40104634b40325616ab3bb;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp index 32199abce..e21de9591 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.cpp @@ -45,6 +45,8 @@ #include +//#define CREATE_CONSTRAINTS + //#define DEBUG_SPLIT #ifdef DEBUG_SPLIT #include @@ -96,9 +98,10 @@ void SketchPlugin_ConstraintSplit::execute() ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature); std::set aFeaturesToDelete, aFeaturesToUpdate; - std::map aTangentFeatures; + //std::map aTangentFeatures; std::map aCoincidenceToFeature; - getConstraints(aFeaturesToDelete, aFeaturesToUpdate, aTangentFeatures, aCoincidenceToFeature); + getConstraints(aFeaturesToDelete, aFeaturesToUpdate, /*aTangentFeatures, */ + aCoincidenceToFeature); std::map > aBaseRefAttributes; std::list aRefsToFeature; @@ -139,23 +142,6 @@ void SketchPlugin_ConstraintSplit::execute() } } - if (!aTangentFeatures.empty()) { - std::cout << std::endl; - std::cout << "Tangencies to base feature[" << aTangentFeatures.size() << "]: " << std::endl; - std::map::const_iterator anIt = aTangentFeatures.begin(), - aLast = aTangentFeatures.end(); - for (int i = 1; anIt != aLast; anIt++, i++) { - FeaturePtr aFeature = (*anIt).first; - std::string anAttributeId = (*anIt).second.first; - std::shared_ptr aPointAttr = (*anIt).second.second; - - std::cout << i << "-" << getFeatureInfo(aFeature) << std::endl; - std::cout << " -Attribute to correct:" << anAttributeId << std::endl; - std::cout << " -Point attribute:" << - ModelGeomAlgo_Point2D::getPointAttributeInfo(aPointAttr) << std::endl; - } - } - std::map >::const_iterator aRefIt = aBaseRefAttributes.begin(), aRefLast = aBaseRefAttributes.end(); std::cout << std::endl << "References to attributes of base feature [" << @@ -283,8 +269,6 @@ void SketchPlugin_ConstraintSplit::execute() // coincidence to feature updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences, aFeatureResults, aSplitFeature); - // tangency - updateTangentConstraintsToFeature(aTangentFeatures, aFurtherCoincidences); updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes); @@ -360,7 +344,7 @@ AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious std::set > aSplitShapes; - GeomAlgoAPI_ShapeTools::splitShape(aBaseShape, aPoints, aSplitShapes); + GeomAlgoAPI_ShapeTools::splitShape_p(aBaseShape, aPoints, aSplitShapes); std::shared_ptr aShape = GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes); @@ -378,14 +362,12 @@ AISObjectPtr SketchPlugin_ConstraintSplit::getAISObject(AISObjectPtr thePrevious double aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH(); int aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE(); if (isConstruction) { - aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color", - SKETCH_AUXILIARY_COLOR); + aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color"); aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY(); aLineStyle = SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY(); } else { - aColor = Config_PropManager::color("Visualization", "sketch_entity_color", - SKETCH_ENTITY_COLOR); + aColor = Config_PropManager::color("Visualization", "sketch_entity_color"); } anAIS->setColor(aColor[0], aColor[1], aColor[2]); anAIS->setWidth(aWidth + 1); @@ -437,7 +419,6 @@ void SketchPlugin_ConstraintSplit::getFeaturePoints(const FeaturePtr& theFeature void SketchPlugin_ConstraintSplit::getConstraints(std::set& theFeaturesToDelete, std::set& theFeaturesToUpdate, - std::map& theTangentFeatures, std::map& theCoincidenceToFeature) { std::shared_ptr aData = data(); @@ -464,45 +445,6 @@ void SketchPlugin_ConstraintSplit::getConstraints(std::set& theFeatu theFeaturesToDelete.insert(aRefFeature); else if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) theFeaturesToUpdate.insert(aRefFeature); - else if (aRefFeatureKind == SketchPlugin_ConstraintTangent::ID()) { - if (aBaseFeature->getKind() == SketchPlugin_Circle::ID()) /// TEMPORARY limitaion - /// until tangency between arc and line is implemented - theFeaturesToDelete.insert(aRefFeature); - else { - std::string anAttributeToBeModified; - AttributePoint2DPtr aTangentPoint; - ObjectPtr aResult1 = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_A())->object(); - ObjectPtr aResult2 = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_B())->object(); - if (aResult1.get() && aResult2.get()) { - FeaturePtr aCoincidenceFeature = - SketchPlugin_ConstraintCoincidence::findCoincidenceFeature - (ModelAPI_Feature::feature(aResult1), - ModelAPI_Feature::feature(aResult2)); - // get the point not lying on the splitting feature - for (int i = 0; i < CONSTRAINT_ATTR_SIZE; ++i) { - AttributeRefAttrPtr aRefAttr = aCoincidenceFeature->refattr(ATTRIBUTE(i)); - if (!aRefAttr || aRefAttr->isObject()) - continue; - AttributePoint2DPtr aPoint = - std::dynamic_pointer_cast(aRefAttr->attr()); - if (!aPoint) - continue; - if (aPoint->owner() != aBaseFeature) { - aTangentPoint = aPoint; - break; - } - } - } - if (aTangentPoint.get()) { - FeaturePtr aFeature1 = ModelAPI_Feature::feature(aResult1); - std::string anAttributeToBeModified = aFeature1 == aBaseFeature - ? SketchPlugin_Constraint::ENTITY_A() : SketchPlugin_Constraint::ENTITY_B(); - theTangentFeatures[aRefFeature] = std::make_pair(anAttributeToBeModified, aTangentPoint); - } - else /// there is not coincident point between tangent constraint - theFeaturesToDelete.insert(aRefFeature); - } - } else if (aRefFeatureKind == SketchPlugin_ConstraintCoincidence::ID()) { std::string anAttributeToBeModified; AttributePoint2DPtr aCoincidentPoint; @@ -679,44 +621,6 @@ void SketchPlugin_ConstraintSplit::updateCoincidenceConstraintsToFeature( } } -void SketchPlugin_ConstraintSplit::updateTangentConstraintsToFeature( - const std::map, IdToPointPair>& theTangentFeatures, - const std::set >& theFurtherCoincidences) -{ - if (theTangentFeatures.empty()) - return; - - std::map::const_iterator aTIt = theTangentFeatures.begin(), - aTLast = theTangentFeatures.end(); -#ifdef DEBUG_SPLIT - std::cout << std::endl; - std::cout << "Tangencies to feature(modified):"<< std::endl; -#endif - for (; aTIt != aTLast; aTIt++) { - FeaturePtr aTangentFeature = aTIt->first; - std::string anAttributeId = aTIt->second.first; - AttributePoint2DPtr aTangentPoint = aTIt->second.second; - std::set::const_iterator aFCIt = theFurtherCoincidences.begin(), - aFCLast = theFurtherCoincidences.end(); - std::shared_ptr aCoincPnt = aTangentPoint->pnt(); - AttributePoint2DPtr aFeaturePointAttribute; - /// here we rely on created coincidence between further coincidence point and tangent result - for (; aFCIt != aFCLast && !aFeaturePointAttribute.get(); aFCIt++) { - AttributePoint2DPtr aFCAttribute = *aFCIt; - if (aCoincPnt->isEqual(aFCAttribute->pnt())) - aFeaturePointAttribute = aFCAttribute; - } - if (aFeaturePointAttribute.get()) { - FeaturePtr aFeature = - std::dynamic_pointer_cast(aFeaturePointAttribute->owner()); - aTangentFeature->refattr(anAttributeId)->setObject(getFeatureResult(aFeature)); - } -#ifdef DEBUG_SPLIT - std::cout << " -" << getFeatureInfo(aTangentFeature) << std::endl; -#endif - } -} - void SketchPlugin_ConstraintSplit::updateRefFeatureConstraints( const ResultPtr& theFeatureBaseResult, const std::list& theRefsToFeature) @@ -885,6 +789,7 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature, thePoints.insert(std::dynamic_pointer_cast (theSplitFeature->attribute(SketchPlugin_Line::START_ID()))); +#ifdef CREATE_CONSTRAINTS // additional constraints between split and base features aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(), getFeatureResult(aBaseFeature), @@ -896,6 +801,7 @@ void SketchPlugin_ConstraintSplit::splitLine(FeaturePtr& theSplitFeature, getFeatureResult(theAfterFeature)); theCreatedFeatures.insert(aConstraintFeature); } +#endif } void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, @@ -931,10 +837,6 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, return; } - // manually change type of arc to avoid incorrect self-constrainting of the tangent arc - aBaseFeature->string(SketchPlugin_Arc::ARC_TYPE())->setValue( - SketchPlugin_Arc::ARC_TYPE_CENTER_START_END()); - arrangePointsOnArc(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); #ifdef DEBUG_SPLIT @@ -1021,6 +923,7 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, (theSplitFeature->attribute(SketchPlugin_Arc::START_ID()))); // additional constraints between split and base features +#ifdef CREATE_CONSTRAINTS aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), getFeatureResult(aBaseFeature), getFeatureResult(theSplitFeature)); @@ -1039,6 +942,7 @@ void SketchPlugin_ConstraintSplit::splitArc(FeaturePtr& theSplitFeature, getFeatureResult(theAfterFeature)); theCreatedFeatures.insert(aConstraintFeature); } +#endif } void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature, @@ -1102,10 +1006,12 @@ void SketchPlugin_ConstraintSplit::splitCircle(FeaturePtr& theSplitFeature, theSplitFeature->attribute(SketchPlugin_Arc::START_ID())); theCreatedFeatures.insert(aConstraintFeature); +#ifdef CREATE_CONSTRAINTS aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), getFeatureResult(theSplitFeature), getFeatureResult(theBaseFeatureModified)); theCreatedFeatures.insert(aConstraintFeature); +#endif } void SketchPlugin_ConstraintSplit::arrangePointsOnLine( @@ -1134,7 +1040,7 @@ void SketchPlugin_ConstraintSplit::arrangePointsOnArc( std::shared_ptr aCenter = std::dynamic_pointer_cast( theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt(); - bool isReversed = theArc->boolean(SketchPlugin_Arc::INVERSED_ID())->value(); + bool isReversed = theArc->boolean(SketchPlugin_Arc::REVERSED_ID())->value(); // collect directions to each point std::shared_ptr aStartDir( @@ -1228,10 +1134,7 @@ FeaturePtr SketchPlugin_ConstraintSplit::createArcFeature(const FeaturePtr& theB // update fillet arc: make the arc correct for sure, so, it is not needed to process // the "attribute updated" // by arc; moreover, it may cause cyclicity in hte mechanism of updater - aFeature->data()->blockSendAttributeUpdated(true); - - aFeature->string(SketchPlugin_Arc::ARC_TYPE())->setValue( - SketchPlugin_Arc::ARC_TYPE_CENTER_START_END()); + bool aWasBlocked = aFeature->data()->blockSendAttributeUpdated(true); fillAttribute(aFeature->attribute(SketchPlugin_Arc::CENTER_ID()), theBaseFeature->attribute(aCenterAttributeId)); @@ -1243,10 +1146,10 @@ FeaturePtr SketchPlugin_ConstraintSplit::createArcFeature(const FeaturePtr& theB /// fill referersed state of created arc as it is on the base arc if (theBaseFeature->getKind() == SketchPlugin_Arc::ID()) { - bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::INVERSED_ID())->value(); - aFeature->boolean(SketchPlugin_Arc::INVERSED_ID())->setValue(aReversed); + bool aReversed = theBaseFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->value(); + aFeature->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(aReversed); } - aFeature->data()->blockSendAttributeUpdated(false); + aFeature->data()->blockSendAttributeUpdated(aWasBlocked); aFeature->execute(); // to obtain result return aFeature;