From: nds Date: Thu, 9 Mar 2017 12:21:23 +0000 (+0300) Subject: Issue #2027 Sketcher Trim Feature: split shapes by highlighted point is moved from... X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=403e25175b6523648aea0a83c03d7efc6439923a;p=modules%2Fshaper.git Issue #2027 Sketcher Trim Feature: split shapes by highlighted point is moved from GUI to Trim feature. Trim Line/Arc features. --- diff --git a/src/SketchPlugin/SketchPlugin_Trim.cpp b/src/SketchPlugin/SketchPlugin_Trim.cpp index df4b238c1..ac0630cfd 100644 --- a/src/SketchPlugin/SketchPlugin_Trim.cpp +++ b/src/SketchPlugin/SketchPlugin_Trim.cpp @@ -28,10 +28,11 @@ #include #include #include -#include +//#include #include #include #include +#include #include #include #include @@ -52,12 +53,7 @@ #include #endif -//#define DEBUG_SPLIT -#ifdef DEBUG_SPLIT -#include -#endif - -//static const double PI = 3.141592653589793238463; +static const double PI = 3.141592653589793238463; static const std::string OPERATION_HIGHLIGHT_COLOR() { return "128, 0, 0"; } @@ -68,23 +64,9 @@ SketchPlugin_Trim::SketchPlugin_Trim() void SketchPlugin_Trim::initAttributes() { data()->addAttribute(SketchPlugin_Trim::BASE_OBJECT(), ModelAPI_AttributeReference::typeId()); - //data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId()); - //data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(ENTITY_POINT(), GeomDataAPI_Point2D::typeId()); - //data()->addAttribute(ENTITY_B_POINT(), GeomDataAPI_Point2D::typeId()); } -//FeaturePtr SketchPlugin_Trim::createCoincidenceConstraint(const AttributePtr& theFirstAttribute, -// const AttributePtr& theSecondAttribute) -//{ -// FeaturePtr aConstraint = sketch()->addFeature(SketchPlugin_ConstraintCoincidence::ID()); -// -// fillAttribute(aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()), theFirstAttribute); -// fillAttribute(aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()), theSecondAttribute); -// -// return aConstraint; -//} - void SketchPlugin_Trim::findShapePoints(std::shared_ptr& aStartPoint, std::shared_ptr& aLastPoint) { @@ -135,7 +117,6 @@ std::shared_ptr SketchPlugin_Trim::convertPoint( AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( data()->attribute(SketchPlugin_Trim::BASE_OBJECT())); ObjectPtr aBaseObject = aBaseObjectAttr->value(); - //std::map myObjectToPoints; if (myObjectToPoints.find(aBaseObject) == myObjectToPoints.end()) return aPoint; @@ -158,27 +139,17 @@ std::shared_ptr SketchPlugin_Trim::convertPoint( } } } - if (!aFound) - return aPoint; - //if (aRefsMap.find(thePoint) == aRefsMap.end()) - // return aPoint; - - //const std::pair, - // std::list >& anInfo = aRefsMap.at(thePoint); - - //const std::list& anAttributes = anInfo.first; - //if (!anAttributes.empty()) - // aPoint = anAttributes.front()->pnt(); - //else { - // std::shared_ptr aPlane = sketch()->plane(); - // aPoint = thePoint->to2D(aPlane); - //} + if (!aFound) { + // returns an end of the shape to define direction of split if feature's attribute participates + std::shared_ptr aPlane = sketch()->plane(); + aPoint = thePoint->to2D(aPlane); + } return aPoint; } void SketchPlugin_Trim::execute() { -#ifdef DEBUG_SPLIT +#ifdef DEBUG_TRIM std::cout << "SketchPlugin_Trim::execute" << std::endl; #endif @@ -198,31 +169,15 @@ void SketchPlugin_Trim::execute() return; FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); -//#ifdef DEBUG_TRIM -// const PointToRefsMap& aRefsMap = myObjectToPoints.at(aBaseObject); -//#endif /// points of trim - //std::map, std::shared_ptr > aPntMap; - std::shared_ptr aStartShapePoint, aLastShapePoint; findShapePoints(aStartShapePoint, aLastShapePoint); std::shared_ptr aStartShapePoint2d = convertPoint(aStartShapePoint); - //aPntMap[aStartShapePoint2d] = aStartShapePoint; std::shared_ptr aLastShapePoint2d = convertPoint(aLastShapePoint); - //aPntMap[aLastShapePoint2d] = aLastShapePoint; - - /*AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; - getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); - if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { - setError("Error: Feature has no start and end points."); - return; - }*/ std::set aFeaturesToDelete, aFeaturesToUpdate; - //std::map aTangentFeatures; - //std::map aCoincidenceToFeature; - getConstraints(aFeaturesToDelete, aFeaturesToUpdate);//, aTangentFeatures, aCoincidenceToFeature); + getConstraints(aFeaturesToDelete, aFeaturesToUpdate); std::map > aBaseRefAttributes; std::list aRefsToFeature; @@ -237,14 +192,17 @@ void SketchPlugin_Trim::execute() aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes); updateRefFeatureConstraints(getFeatureResult(aBaseFeature), aRefsToFeature); - //AttributePtr aCenterAttr = aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID()); aFeaturesToDelete.insert(aBaseFeature); // as circle is removed, temporary fill this attribute aBaseObjectAttr->setObject(ResultPtr()); } else if (aKind == SketchPlugin_Line::ID()) { + trimLine(aStartShapePoint2d, aLastShapePoint2d, + aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes); } else if (aKind == SketchPlugin_Arc::ID()) { + trimArc(aStartShapePoint2d, aLastShapePoint2d, + aFurtherCoincidences, aCreatedFeatures, aModifiedAttributes); } // coincidence to result points @@ -256,11 +214,12 @@ void SketchPlugin_Trim::execute() std::shared_ptr aPoint2d = aPointAttribute->pnt(); std::shared_ptr aPoint; - if (aPoint2d->isEqual(aStartShapePoint2d)) + if (aStartShapePoint2d.get() && aPoint2d->isEqual(aStartShapePoint2d)) aPoint = aStartShapePoint; - else if (aPoint2d->isEqual(aLastShapePoint2d)) + else if (aLastShapePoint2d.get() && aPoint2d->isEqual(aLastShapePoint2d)) aPoint = aLastShapePoint; - else + + if (!aPoint.get()) continue; std::pair, std::list > anInfo; @@ -285,299 +244,33 @@ void SketchPlugin_Trim::execute() } } - /*AttributePoint2DPtr anAPoint = std::dynamic_pointer_cast( - aData->attribute(ENTITY_A_POINT())); - std::shared_ptr anAttributeStartPnt2d = anAPoint->pnt(); - - AttributePoint2DPtr aBPoint = std::dynamic_pointer_cast( - aData->attribute(ENTITY_B_POINT())); - std::shared_ptr anAttributeEndPnt2d = aBPoint->pnt(); - - - AttributeRefAttrPtr anARefAttr = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributeRefAttrPtr aBRefAttr = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::ENTITY_B()));*/ - - //AttributePoint2DPtr aFirstPointAttrOfSplit = - // getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_A())); - //AttributePoint2DPtr aSecondPointAttrOfSplit = - // getPointOfRefAttr(aData->attribute(SketchPlugin_Constraint::ENTITY_B())); - //if (!aFirstPointAttrOfSplit.get() || !aFirstPointAttrOfSplit->isInitialized() || - // !aSecondPointAttrOfSplit.get() || !aSecondPointAttrOfSplit->isInitialized()) { - // setError("Error: Sub-shape is not initialized."); - // return; - //} - // Wait all constraints being created, then send update events static Events_ID anUpdateEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); bool isUpdateFlushed = Events_Loop::loop()->isFlushed(anUpdateEvent); if (isUpdateFlushed) Events_Loop::loop()->setFlushed(anUpdateEvent, false); - -// // Find feature constraints - /*FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); - - std::set aNewCoincidencesToSplitFeature; - AttributePoint2DPtr aFeatureStartPointAttr, aFeatureEndPointAttr; - getFeaturePoints(aBaseFeature, aFeatureStartPointAttr, aFeatureEndPointAttr); - - if (aFeatureStartPointAttr.get() && aFeatureStartPointAttr.get()) { // line or arc - AttributePoint2DPtr aStartPointAttribute = - std::dynamic_pointer_cast( - aFeatureStartPointAttr); - std::shared_ptr aFeatureStartPnt2d = aStartPointAttribute->pnt(); - AttributePoint2DPtr anEndPointAttribute = - std::dynamic_pointer_cast( - aFeatureEndPointAttr); - std::shared_ptr aFeatureEndPnt2d = anEndPointAttribute->pnt(); - if (anAttributeStartPnt2d->isEqual(aFeatureStartPnt2d)) { - double anX = aFeatureStartPnt2d->x(); - double anY = aFeatureStartPnt2d->y(); - double anEndX = anAttributeEndPnt2d->x(); - double anEndY = anAttributeEndPnt2d->y(); - aStartPointAttribute->setValue(anAttributeEndPnt2d->x(), anAttributeEndPnt2d->y()); - - createCoincidenceConstraint(aStartPointAttribute, aBRefAttr); - } - } - else { // circle - - }*/ - - // ResultPtr aBaseFeatureResult = getFeatureResult(aBaseFeature); -// std::set aFeaturesToDelete, aFeaturesToUpdate; -// -// std::map aTangentFeatures; -// std::map aCoincidenceToFeature; -// getConstraints(aFeaturesToDelete, aFeaturesToUpdate, aTangentFeatures, aCoincidenceToFeature); -// -//std::map > aBaseRefAttributes; -//std::list aRefsToFeature; -//getRefAttributes(aBaseFeature, aBaseRefAttributes, aRefsToFeature); -// -// std::map aBasePointModifiedAttributes; -// -//#ifdef DEBUG_SPLIT -// std::cout << std::endl; -// std::cout << "SketchPlugin_Trim::execute()" << std::endl; -// std::cout << std::endl; -// -// SketchPlugin_Sketch* aSketch = sketch(); -// std::cout << "SKETCH FEATURES (before split) [" << aSketch->numberOfSubs() << "]:" << std::endl; -// for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) { -// std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl; -// } -// -// std::cout << std::endl; -// std::cout << "---- IN PARAMETERS ----" << std::endl; -// std::cout << "Base feature:" << getFeatureInfo(aBaseFeature) << std::endl; -// std::cout << std::endl; -// -// if (!aCoincidenceToFeature.empty()) { -// std::cout << "Coincidences to base feature[" << -// aCoincidenceToFeature.size() << "]: " << std::endl; -// std::map::const_iterator anIt = aCoincidenceToFeature.begin(), -// aLast = aCoincidenceToFeature.end(); -// for (int i = 1; anIt != aLast; anIt++, i++) { -// FeaturePtr aFeature = (*anIt).first; -// std::string anAttributeId = (*anIt).second.first; -// AttributePoint2DPtr 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; -// } -// } -// -// 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; -// AttributePoint2DPtr 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 [" << -// aBaseRefAttributes.size() << "]" << std::endl; -// for (; aRefIt != aRefLast; aRefIt++) { -// AttributePtr aBaseAttr = aRefIt->first; -// std::list aRefAttributes = aRefIt->second; -// std::string aRefsInfo; -// std::list::const_iterator aRefAttrIt = aRefAttributes.begin(), -// aRefAttrLast = aRefAttributes.end(); -// for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) { -// if (!aRefsInfo.empty()) -// aRefsInfo.append(","); -// AttributePtr aRAttr = *aRefAttrIt; -// aRefsInfo.append(aRAttr->id()); -// FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner()); -// aRefsInfo.append("(" + aRFeature->name() + ") "); -// } -// AttributePoint2DPtr aPointAttr = -// std::dynamic_pointer_cast(aBaseAttr); -// std::cout << aPointAttr->id().c_str() << -// ": " << "[" << aRefAttributes.size() << "] " << aRefsInfo << std::endl; -// } -// std::cout << std::endl; -// std::cout << std::endl << "References to base feature [" << -// aRefsToFeature.size() << "]" << std::endl; -// std::list::const_iterator aRefAttrIt = aRefsToFeature.begin(), -// aRefAttrLast = aRefsToFeature.end(); -// std::string aRefsInfo; -// for (; aRefAttrIt != aRefAttrLast; aRefAttrIt++) { -// if (!aRefsInfo.empty()) -// aRefsInfo.append(","); -// AttributePtr aRAttr = *aRefAttrIt; -// aRefsInfo.append(aRAttr->id()); -// FeaturePtr aRFeature = ModelAPI_Feature::feature(aRAttr->owner()); -// aRefsInfo.append("(" + aRFeature->name() + ") "); -// } -// std::cout << "[" << aRefsToFeature.size() << "] " << aRefsInfo << std::endl; -// -// -// std::cout << std::endl; -// std::cout << "---- SPLIT ----" << std::endl; -// std::cout << std::endl; -//#endif -// -// std::string aFeatureKind = aBaseFeature->getKind(); -// FeaturePtr aSplitFeature, anAfterFeature; -// std::set aFurtherCoincidences; -// std::set aCreatedFeatures; -// std::set> aModifiedAttributes; -// if (aFeatureKind == SketchPlugin_Line::ID()) -// splitLine(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures, -// aModifiedAttributes); -// else if (aFeatureKind == SketchPlugin_Arc::ID()) -// splitArc(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, aCreatedFeatures, -// aModifiedAttributes); -// if (aFeatureKind == SketchPlugin_Circle::ID()) { -// FeaturePtr aCircleFeature = aBaseFeature; -// splitCircle(aSplitFeature, aBaseFeature, anAfterFeature, aFurtherCoincidences, -// aCreatedFeatures, aModifiedAttributes); -// -// updateRefFeatureConstraints(getFeatureResult(aBaseFeature), aRefsToFeature); -// -// AttributePtr aCenterAttr = aCircleFeature->attribute(SketchPlugin_Circle::CENTER_ID()); -// aFeaturesToDelete.insert(aCircleFeature); -// // as circle is removed, temporary fill this attribute -// aBaseObjectAttr->setObject(ResultPtr()); -// } -// -//#ifdef DEBUG_SPLIT -// std::cout << "---- OUT PARAMETERS ----" << std::endl; -// std::cout << "Base modified feature:" << getFeatureInfo(aBaseFeature) << std::endl; -// std::cout << "Split feature:" << getFeatureInfo(aSplitFeature) << std::endl; -// std::cout << "After feature:" << getFeatureInfo(anAfterFeature) << std::endl; -// std::cout << std::endl; -// -// std::cout << "Created features by split:[" << aCreatedFeatures.size() << "]" << std::endl; -// std::set::const_iterator aFIt = aCreatedFeatures.begin(), -// aFLast = aCreatedFeatures.end(); -// for (; aFIt != aFLast; aFIt++) { -// std::cout << getFeatureInfo(*aFIt) << std::endl; -// } -// std::cout << std::endl; -// -// std::cout << "Attributes for further Coincidences:" << std::endl; -// std::set::const_iterator anIt = aFurtherCoincidences.begin(), -// aLast = aFurtherCoincidences.end(); -// for (; anIt != aLast; anIt++) { -// AttributePtr anAttribute = *anIt; -// FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner()); -// std::cout << ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute) -// << " [" << getFeatureInfo(aFeature, false) << "]" << std::endl; -// } -// -// std::cout << "Modifed attributes (constraints to attributes are moved here):" << std::endl; -// std::set >::const_iterator -// aPIt = aModifiedAttributes.begin(), aPLast = aModifiedAttributes.end(); -// std::string aResInfo; -// for (; aPIt != aPLast; aPIt++) { -// if (!aResInfo.empty()) -// aResInfo += "\n"; -// -// std::pair aPair = *aPIt; -// -// AttributePtr anAttr = aPair.first; -// aResInfo.append(anAttr->id()); -// FeaturePtr aFeature = ModelAPI_Feature::feature(anAttr->owner()); -// aResInfo.append("(" + aFeature->name() + ") "); -// -// aResInfo.append(" - is modified to - "); -// -// anAttr = aPair.second; -// aResInfo.append(anAttr->id()); -// aFeature = ModelAPI_Feature::feature(anAttr->owner()); -// aResInfo.append("(" + aFeature->name() + ") "); -// } -// std::cout << aResInfo << std::endl; -//#endif -// -// std::set aFeatureResults; -// aFeatureResults.insert(getFeatureResult(aBaseFeature)); -// if (anAfterFeature.get() && anAfterFeature != aBaseFeature) -// aFeatureResults.insert(getFeatureResult(anAfterFeature)); -// -// // coincidence to feature -// updateCoincidenceConstraintsToFeature(aCoincidenceToFeature, aFurtherCoincidences, -// aFeatureResults, aSplitFeature); -// // tangency -// updateTangentConstraintsToFeature(aTangentFeatures, aFurtherCoincidences); -// - updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes); + updateRefAttConstraints(aBaseRefAttributes, aModifiedAttributes, aFeaturesToDelete); // delete constraints -#ifdef DEBUG_SPLIT +#ifdef DEBUG_TRIM std::cout << "remove features and references:" << std::endl; std::set::const_iterator aDIt = aFeaturesToDelete.begin(), aDLast = aFeaturesToDelete.end(); for (; aDIt != aDLast; aDIt++) { - std::cout << getFeatureInfo(*aDIt, false) << std::endl; - std::cout << std::endl; + //std::cout << getFeatureInfo(*aDIt, false) << std::endl; + //std::cout << std::endl; } #endif ModelAPI_Tools::removeFeaturesAndReferences(aFeaturesToDelete); Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED)); -//#ifdef DEBUG_SPLIT -// std::cout << "update features after split:" << std::endl; -// std::set::const_iterator anUIt = aFeaturesToUpdate.begin(), -// anULast = aFeaturesToUpdate.end(); -// for (; anUIt != anULast; anUIt++) { -// std::cout << getFeatureInfo(*anUIt, false) << std::endl; -// std::cout << std::endl; -// } -//#endif -// updateFeaturesAfterSplit(aFeaturesToUpdate); - // Send events to update the sub-features by the solver. if(isUpdateFlushed) { Events_Loop::loop()->setFlushed(anUpdateEvent, true); } -//#ifdef DEBUG_SPLIT -// std::cout << "SKETCH FEATURES (after split) [" << aSketch->numberOfSubs() << "]:" << std::endl; -// for (int i = 0, aNbSubs = aSketch->numberOfSubs(); i < aNbSubs; i++) { -// std::cout << getFeatureInfo(aSketch->subFeature(i), false) << std::endl; -// } -//#endif - -#ifdef DEBUG_SPLIT +#ifdef DEBUG_TRIM std::cout << "SketchPlugin_Trim::done" << std::endl; #endif } @@ -630,109 +323,22 @@ AISObjectPtr SketchPlugin_Trim::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); 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); - //} anAIS->setColor(aColor[0], aColor[1], aColor[2]); + // modification of width should be replaced to value 1 after highlight problem is fixed anAIS->setWidth(aWidth + 2);//1); anAIS->setLineStyle(aLineStyle); break; } - //XGUI_Tools::workshop(myWorkshop)->displayer()->clearSelected(false); - //if (myCurrentSubShape->object() != anObject || - // myCurrentSubShape->shape() != aBaseShape) { - // myCurrentSubShape->setObject(anObject); - // myCurrentSubShape->setShape(aBaseShape); - //} } } } - /* - AttributePoint2DPtr aFirstPointAttrOfSplit = getPointOfRefAttr( - data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - AttributePoint2DPtr aSecondPointAttrOfSplit = getPointOfRefAttr( - data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - - if (aBaseObjectAttr->isInitialized() && aBaseFeature.get() && - aFirstPointAttrOfSplit->isInitialized() && - aSecondPointAttrOfSplit->isInitialized()) { - - ResultPtr aResult = getFeatureResult(aBaseFeature); - GeomShapePtr aBaseShape = aResult->shape(); - std::list > aPoints; - - std::shared_ptr aStartPnt2d = aFirstPointAttrOfSplit->pnt(); - std::shared_ptr aStartPoint = sketch()->to3D(aStartPnt2d->x(), aStartPnt2d->y()); - aPoints.push_back(aStartPoint); - - std::shared_ptr aSecondPnt2d = aSecondPointAttrOfSplit->pnt(); - std::shared_ptr aSecondPoint = - sketch()->to3D(aSecondPnt2d->x(), aSecondPnt2d->y()); - aPoints.push_back(aSecondPoint); - - std::set > aSplitShapes; - - GeomAlgoAPI_ShapeTools::splitShape(aBaseShape, aPoints, aSplitShapes); - std::shared_ptr aShape = - GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes); - - AISObjectPtr anAIS = thePrevious; - if (aShape) { - if (!anAIS) - anAIS = AISObjectPtr(new GeomAPI_AISObject); - anAIS->createShape(aShape); - std::shared_ptr anAuxiliaryAttr = - aBaseFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID()); - - bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value(); - - std::vector aColor; - 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); - 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); - } - anAIS->setColor(aColor[0], aColor[1], aColor[2]); - anAIS->setWidth(aWidth + 1); - anAIS->setLineStyle(aLineStyle); - } - return anAIS; - }*/ return anAIS; } -//AttributePoint2DPtr SketchPlugin_Trim::getPointOfRefAttr( -// const AttributePtr& theAttribute) -//{ -// AttributePoint2DPtr aPointAttribute; -// -// if (theAttribute->attributeType() == ModelAPI_AttributeRefAttr::typeId()) { -// AttributeRefAttrPtr aRefAttr = -// std::dynamic_pointer_cast(theAttribute); -// if (aRefAttr.get() && aRefAttr->isInitialized()) { -// AttributePtr anAttribute = aRefAttr->attr(); -// if (anAttribute.get() && anAttribute->attributeType() == GeomDataAPI_Point2D::typeId()) -// aPointAttribute = std::dynamic_pointer_cast(anAttribute); -// } -// } -// return aPointAttribute; -//} -// - void SketchPlugin_Trim::getFeaturePoints(const FeaturePtr& theFeature, AttributePoint2DPtr& theStartPointAttr, AttributePoint2DPtr& theEndPointAttr) @@ -756,10 +362,7 @@ void SketchPlugin_Trim::getFeaturePoints(const FeaturePtr& theFeature, } void SketchPlugin_Trim::getConstraints(std::set& theFeaturesToDelete, - std::set& theFeaturesToUpdate//, - //std::map& theTangentFeatures, - //std::map& theCoincidenceToFeature - ) + std::set& theFeaturesToUpdate) { std::shared_ptr aData = data(); @@ -824,56 +427,6 @@ void SketchPlugin_Trim::getConstraints(std::set& theFeaturesToDelete theFeaturesToDelete.insert(aRefFeature); } } - /*else if (aRefFeatureKind == SketchPlugin_ConstraintCoincidence::ID()) { - std::string anAttributeToBeModified; - AttributePoint2DPtr aCoincidentPoint; - AttributeRefAttrPtr anAttrA = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_A()); - AttributeRefAttrPtr anAttrB = aRefFeature->refattr(SketchPlugin_Constraint::ENTITY_B()); - bool isToFeature = false; - if (anAttrA->isObject() || anAttrB->isObject()) { /// coincidence to base feature - FeaturePtr aFeature = anAttrA->isObject() ? ModelAPI_Feature::feature(anAttrA->object()) - : FeaturePtr(); - isToFeature = aFeature.get() && aFeature == aBaseFeature; - anAttributeToBeModified = anAttrA->id(); - if (!isToFeature) { - aFeature = anAttrB->isObject() ? ModelAPI_Feature::feature(anAttrB->object()) - : FeaturePtr(); - isToFeature = aFeature.get() && aFeature == aBaseFeature; - anAttributeToBeModified = anAttrB->id(); - } - if (isToFeature) - aCoincidentPoint = SketchPlugin_ConstraintCoincidence::getPoint(aRefFeature); - } - if (!isToFeature) { /// coincidence to point on base feature - AttributePtr anAttribute; - - if (!anAttrA->isObject()) { - AttributePtr aCurAttribute = anAttrA->attr(); - if (aCurAttribute.get()) { - FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner()); - if (aCurFeature.get() && aCurFeature == aBaseFeature) { - anAttribute = anAttrB->attr(); - anAttributeToBeModified = anAttrA->id(); - } - } - } - if (!anAttribute.get() && !anAttrB->isObject()) { - AttributePtr aCurAttribute = anAttrB->attr(); - if (aCurAttribute.get()) { - FeaturePtr aCurFeature = ModelAPI_Feature::feature(aCurAttribute->owner()); - if (aCurFeature.get() && aCurFeature == aBaseFeature) { - anAttribute = anAttrA->attr(); - anAttributeToBeModified = anAttrB->id(); - } - } - } - if (anAttribute.get()) - aCoincidentPoint = std::dynamic_pointer_cast(anAttribute); - } - //if (aCoincidentPoint.get() && isToFeature) - // theCoincidenceToFeature[aRefFeature] = std::make_pair(anAttributeToBeModified, - // aCoincidentPoint); - }*/ } } @@ -923,121 +476,6 @@ void SketchPlugin_Trim::getRefAttributes(const FeaturePtr& theFeature, } } -//void SketchPlugin_Trim::updateCoincidenceConstraintsToFeature( -// const std::map, IdToPointPair>& theCoincidenceToFeature, -// const std::set& theFurtherCoincidences, -// const std::set& theFeatureResults, -// const FeaturePtr& theSplitFeature) -//{ -// if (theCoincidenceToFeature.empty()) -// return; -// -// // we should build coincidence constraints to end of the split feature -// std::set aNewCoincidencesToSplitFeature; -// AttributePoint2DPtr aStartPointAttr, anEndPointAttr; -// getFeaturePoints(theSplitFeature, aStartPointAttr, anEndPointAttr); -// if (theFurtherCoincidences.find(aStartPointAttr) == theFurtherCoincidences.end()) -// aNewCoincidencesToSplitFeature.insert(aStartPointAttr); -// if (theFurtherCoincidences.find(anEndPointAttr) == theFurtherCoincidences.end()) -// aNewCoincidencesToSplitFeature.insert(anEndPointAttr); -// -// std::map::const_iterator aCIt = theCoincidenceToFeature.begin(), -// aCLast = theCoincidenceToFeature.end(); -//#ifdef DEBUG_SPLIT -// std::cout << std::endl; -// std::cout << "Coincidences to feature(modified):"<< std::endl; -//#endif -// for (; aCIt != aCLast; aCIt++) { -// FeaturePtr aCoincFeature = aCIt->first; -// std::string anAttributeId = aCIt->second.first; -// AttributePoint2DPtr aCoincPoint = aCIt->second.second; -// std::set::const_iterator aFCIt = theFurtherCoincidences.begin(), -// aFCLast = theFurtherCoincidences.end(); -// std::shared_ptr aCoincPnt = aCoincPoint->pnt(); -// AttributePoint2DPtr aFeaturePointAttribute; -// for (; aFCIt != aFCLast && !aFeaturePointAttribute.get(); aFCIt++) { -// AttributePoint2DPtr aFCAttribute = *aFCIt; -// if (aCoincPnt->isEqual(aFCAttribute->pnt())) -// aFeaturePointAttribute = aFCAttribute; -// } -// if (aFeaturePointAttribute.get()) { -// aCoincFeature->refattr(anAttributeId)->setObject(ResultPtr()); -// aCoincFeature->refattr(anAttributeId)->setAttr(aFeaturePointAttribute); -// // create new coincidences to split feature points -// std::set::const_iterator aSFIt = aNewCoincidencesToSplitFeature.begin(), -// aSFLast = aNewCoincidencesToSplitFeature.end(); -// for (; aSFIt != aSFLast; aSFIt++) { -// AttributePoint2DPtr aSFAttribute = *aSFIt; -// if (aCoincPnt->isEqual(aSFAttribute->pnt())) { -// std::string aSecondAttribute = SketchPlugin_Constraint::ENTITY_A(); -// if (anAttributeId == SketchPlugin_Constraint::ENTITY_A()) -// aSecondAttribute = SketchPlugin_Constraint::ENTITY_B(); -// createConstraint(SketchPlugin_ConstraintCoincidence::ID(), -// aSFAttribute, aCoincFeature->refattr(aSecondAttribute)->attr()); -// } -// } -// } -// else { -// /// find feature by shape intersected the point -// ResultPtr aResultForCoincidence = *(theFeatureResults.begin()); -// -// if (theFeatureResults.size() > 1) { // try to find point on additional feature -// ResultPtr anAddtionalResult = *(theFeatureResults.begin()++); -// GeomShapePtr aShape = anAddtionalResult->shape(); -// -// std::shared_ptr aPnt2d = aCoincPoint->pnt(); -// std::shared_ptr aPoint = sketch()->to3D(aPnt2d->x(), aPnt2d->y()); -// -// std::shared_ptr aProjectedPoint; -// if (ModelGeomAlgo_Point2D::isPointOnEdge(aShape, aPoint, aProjectedPoint)) -// aResultForCoincidence = anAddtionalResult; -// } -// aCoincFeature->refattr(anAttributeId)->setObject(aResultForCoincidence); -// } -//#ifdef DEBUG_SPLIT -// std::cout << " -" << getFeatureInfo(aCoincFeature) << std::endl; -//#endif -// } -//} -// -//void SketchPlugin_Trim::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_Trim::updateRefFeatureConstraints( const ResultPtr& theFeatureBaseResult, const std::list& theRefsToFeature) @@ -1053,9 +491,10 @@ void SketchPlugin_Trim::updateRefFeatureConstraints( void SketchPlugin_Trim::updateRefAttConstraints( const std::map >& theBaseRefAttributes, - const std::set >& theModifiedAttributes) + const std::set >& theModifiedAttributes, + std::set& theFeaturesToDelete) { -#ifdef DEBUG_SPLIT +#ifdef DEBUG_TRIM std::cout << "SketchPlugin_Trim::updateRefAttConstraints" << std::endl; #endif @@ -1075,298 +514,188 @@ void SketchPlugin_Trim::updateRefAttConstraints( for (; aRefIt != aRLast; aRefIt++) { AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(*aRefIt); if (aRefAttr.get()) { - aRefAttr->setAttr(aNewAttribute); -#ifdef DEBUG_SPLIT - FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->owner()); - std::cout << " -" << getFeatureInfo(aFeature) << std::endl; + if (aNewAttribute.get()) + aRefAttr->setAttr(aNewAttribute); + else + theFeaturesToDelete.insert(ModelAPI_Feature::feature(aRefAttr->owner())); +#ifdef DEBUG_TRIM + //FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->owner()); + //std::cout << " -" << getFeatureInfo(aFeature) << std::endl; #endif } } } } -//void SketchPlugin_Trim::splitLine(FeaturePtr& theSplitFeature, -// FeaturePtr& theBaseFeatureModified, -// FeaturePtr& theAfterFeature, -// std::set& thePoints, -// std::set& theCreatedFeatures, -// std::set>& theModifiedAttributes) -//{ -// std::set aCreatedFeatures; -// FeaturePtr aConstraintFeature; -// theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature -// -// SketchPlugin_Sketch* aSketch = sketch(); -// if (!aSketch) -// return; -// -// AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( -// data()->attribute(SketchPlugin_Trim::BASE_OBJECT())); -// FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); -// std::string aFeatureKind = aBaseFeature->getKind(); -// if (aFeatureKind != SketchPlugin_Line::ID()) -// return; -// -// AttributePoint2DPtr aFirstPointAttrOfSplit = -// getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); -// AttributePoint2DPtr aSecondPointAttrOfSplit = -// getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); -// AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; -// -// getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); -// if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { -// setError("Error: Feature has no start and end points."); -// return; -// } -// -// arrangePointsOnLine(aStartPointAttrOfBase, anEndPointAttrOfBase, -// aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); -// -//#ifdef DEBUG_SPLIT -// std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; -// std::cout << "Start point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl; -// std::cout << "1st point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl; -// std::cout << "2nd point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl; -// std::cout << "End point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl; -//#endif -// -// /// create a split feature -// theSplitFeature = -// createLineFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); -// theCreatedFeatures.insert(theSplitFeature); -// -// // before split feature -// if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { -// theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase, -// theSplitFeature->attribute(SketchPlugin_Line::START_ID()))); -// } -// else { -// theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here -// /// move end arc point to start of split -// } -// -// // after split feature -// if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) { -// FeaturePtr aFeature; -// if (!theBaseFeatureModified.get()) { -// aFeature = aBaseFeature; ///< use base feature to store all constraints here -// fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), aSecondPointAttrOfSplit); -// aFeature->execute(); // to update result -// } -// else { -// aFeature = createLineFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase); -// theCreatedFeatures.insert(aFeature); -// theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, -// aFeature->attribute(SketchPlugin_Line::END_ID()))); -// } -// aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), -// theSplitFeature->attribute(SketchPlugin_Line::END_ID()), -// aFeature->attribute(SketchPlugin_Line::START_ID())); -// theCreatedFeatures.insert(aConstraintFeature); -// -// thePoints.insert(std::dynamic_pointer_cast -// (aFeature->attribute(SketchPlugin_Line::START_ID()))); -// thePoints.insert(std::dynamic_pointer_cast -// (aFeature->attribute(SketchPlugin_Line::END_ID()))); -// -// if (!theBaseFeatureModified.get()) -// theBaseFeatureModified = aFeature; -// else -// theAfterFeature = aFeature; -// } -// else { -// thePoints.insert(std::dynamic_pointer_cast -// (theSplitFeature->attribute(SketchPlugin_Line::END_ID()))); -// theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, -// theSplitFeature->attribute(SketchPlugin_Line::END_ID()))); -// } -// // base split, that is defined before split feature should be changed at end -// // (after the after feature creation). Otherwise modified value will be used in after feature -// // before split feature -// if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { -// /// move end arc point to start of split -// fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()), -// aFirstPointAttrOfSplit); -// theBaseFeatureModified->execute(); // to update result -// aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), -// theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()), -// theSplitFeature->attribute(SketchPlugin_Line::START_ID())); -// theCreatedFeatures.insert(aConstraintFeature); -// -// thePoints.insert(std::dynamic_pointer_cast -// (theBaseFeatureModified->attribute(SketchPlugin_Line::START_ID()))); -// thePoints.insert(std::dynamic_pointer_cast -// (theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID()))); -// } -// else -// thePoints.insert(std::dynamic_pointer_cast -// (theSplitFeature->attribute(SketchPlugin_Line::START_ID()))); -// -// // additional constraints between split and base features -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(), -// getFeatureResult(aBaseFeature), -// getFeatureResult(theSplitFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// if (theAfterFeature.get()) { -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintParallel::ID(), -// getFeatureResult(aBaseFeature), -// getFeatureResult(theAfterFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// } -//} -// -//void SketchPlugin_Trim::splitArc(FeaturePtr& theSplitFeature, -// FeaturePtr& theBaseFeatureModified, -// FeaturePtr& theAfterFeature, -// std::set& thePoints, -// std::set& theCreatedFeatures, -// std::set>& theModifiedAttributes) -//{ -// std::set aCreatedFeatures; -// FeaturePtr aConstraintFeature; -// theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature -// -// SketchPlugin_Sketch* aSketch = sketch(); -// if (!aSketch) -// return; -// -// AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( -// data()->attribute(SketchPlugin_Trim::BASE_OBJECT())); -// FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); -// std::string aFeatureKind = aBaseFeature->getKind(); -// if (aFeatureKind != SketchPlugin_Arc::ID()) -// return; -// -// AttributePoint2DPtr aFirstPointAttrOfSplit = -// getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); -// AttributePoint2DPtr aSecondPointAttrOfSplit = -// getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); -// AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; -// getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); -// if (!aStartPointAttrOfBase.get() && !anEndPointAttrOfBase.get()) { -// setError("Error: Feature has no start and end points."); -// 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 -// std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; -// std::cout << "Start point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aStartPointAttrOfBase) << std::endl; -// std::cout << "1st point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aFirstPointAttrOfSplit) << std::endl; -// std::cout << "2nd point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(aSecondPointAttrOfSplit) << std::endl; -// std::cout << "End point: " << -// ModelGeomAlgo_Point2D::getPointAttributeInfo(anEndPointAttrOfBase) << std::endl; -//#endif -// -// /// split feature -// theSplitFeature = createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); -// theCreatedFeatures.insert(theSplitFeature); -// -// // before split feature -// if (aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { -// theModifiedAttributes.insert(std::make_pair(aStartPointAttrOfBase, -// theSplitFeature->attribute(SketchPlugin_Arc::START_ID()))); -// } -// else { -// theBaseFeatureModified = aBaseFeature; ///< use base feature to store all constraints here -// /// move end arc point to start of split -// } -// -// // after split feature -// if (!aSecondPointAttrOfSplit->pnt()->isEqual(anEndPointAttrOfBase->pnt())) { -// FeaturePtr aFeature; -// if (!theBaseFeatureModified.get()) { -// aFeature = aBaseFeature; ///< use base feature to store all constraints here -// fillAttribute(aFeature->attribute(SketchPlugin_Arc::START_ID()), aSecondPointAttrOfSplit); -// aFeature->execute(); // to update result -// } -// else { -// aFeature = createArcFeature(aBaseFeature, aSecondPointAttrOfSplit, anEndPointAttrOfBase); -// theCreatedFeatures.insert(aFeature); -// theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, -// aFeature->attribute(SketchPlugin_Arc::END_ID()))); -// } -// aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), -// theSplitFeature->attribute(SketchPlugin_Arc::END_ID()), -// aFeature->attribute(SketchPlugin_Arc::START_ID())); -// theCreatedFeatures.insert(aConstraintFeature); -// -// thePoints.insert(std::dynamic_pointer_cast -// (aFeature->attribute(SketchPlugin_Arc::START_ID()))); -// thePoints.insert(std::dynamic_pointer_cast -// (aFeature->attribute(SketchPlugin_Arc::END_ID()))); -// -// if (!theBaseFeatureModified.get()) -// theBaseFeatureModified = aFeature; -// else -// theAfterFeature = aFeature; -// } -// else { -// thePoints.insert(std::dynamic_pointer_cast -// (theSplitFeature->attribute(SketchPlugin_Arc::END_ID()))); -// theModifiedAttributes.insert(std::make_pair(anEndPointAttrOfBase, -// theSplitFeature->attribute(SketchPlugin_Arc::END_ID()))); -// } -// // base split, that is defined before split feature should be changed at end -// // (after the after feature creation). Otherwise modified value will be used in after feature -// // before split feature -// if (!aStartPointAttrOfBase->pnt()->isEqual(aFirstPointAttrOfSplit->pnt())) { -// /// move end arc point to start of split -// fillAttribute(theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), -// aFirstPointAttrOfSplit); -// theBaseFeatureModified->execute(); // to update result -// aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), -// theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), -// theSplitFeature->attribute(SketchPlugin_Arc::START_ID())); -// theCreatedFeatures.insert(aConstraintFeature); -// -// thePoints.insert(std::dynamic_pointer_cast -// (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()))); -// thePoints.insert(std::dynamic_pointer_cast -// (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()))); -// } -// else -// thePoints.insert(std::dynamic_pointer_cast -// (theSplitFeature->attribute(SketchPlugin_Arc::START_ID()))); -// -// // additional constraints between split and base features -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), -// getFeatureResult(aBaseFeature), -// getFeatureResult(theSplitFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), -// getFeatureResult(theSplitFeature), -// getFeatureResult(aBaseFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// if (theAfterFeature.get()) { -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), -// getFeatureResult(aBaseFeature), -// getFeatureResult(theAfterFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), -// getFeatureResult(theSplitFeature), -// getFeatureResult(theAfterFeature)); -// theCreatedFeatures.insert(aConstraintFeature); -// } -//} +void SketchPlugin_Trim::trimLine(const std::shared_ptr& theStartShapePoint, + const std::shared_ptr& theLastShapePoint, + std::set& thePoints, + std::set& theCreatedFeatures, + std::set>& theModifiedAttributes) +{ + // Check the base objects are initialized. + AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Trim::BASE_OBJECT())); + ObjectPtr aBaseObject = aBaseObjectAttr->value(); + FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); + + /// points of trim + AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; + getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); + + std::shared_ptr aStartFeaturePoint = aStartPointAttrOfBase->pnt(); + std::shared_ptr aLastFeaturePoint = anEndPointAttrOfBase->pnt(); + + std::shared_ptr aStartShapePoint = theStartShapePoint; + std::shared_ptr aLastShapePoint = theLastShapePoint; + arrangePointsOnLine(aStartPointAttrOfBase, anEndPointAttrOfBase, + aStartShapePoint, aLastShapePoint); +#ifdef DEBUG_TRIM + std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; + if (aStartShapePoint.get()) + std::cout << "Start point: [" << aStartShapePoint->x() << ", " << + aStartShapePoint->y() << "]" << std::endl; + std::cout << "1st point: [" << aStartFeaturePoint->x() << ", " << + aStartFeaturePoint->y() << "]" << std::endl; + if (aLastShapePoint.get()) + std::cout << "2st point: [" << aLastShapePoint->x() << ", " << + aLastShapePoint->y() << "]" << std::endl; + std::cout << "End point: [" << aLastFeaturePoint->x() << ", " << + aLastFeaturePoint->y() << "]" << std::endl; +#endif + + bool isStartPoint = !aStartShapePoint.get() || aStartFeaturePoint->isEqual(aStartShapePoint); + bool isLastPoint = !aLastShapePoint.get() || aLastFeaturePoint->isEqual(aLastShapePoint); + if (isStartPoint || isLastPoint) { + // result is one line: changed existing line + std::string aModifiedAttribute = isStartPoint ? SketchPlugin_Line::START_ID() + : SketchPlugin_Line::END_ID(); + std::shared_ptr aPoint; + if (aStartShapePoint.get() && aLastShapePoint.get()) + aPoint = isStartPoint ? aLastShapePoint : aStartShapePoint; + else + aPoint = aStartShapePoint.get() ? aStartShapePoint : aLastShapePoint; + + fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aPoint); + theModifiedAttributes.insert( + std::make_pair(aBaseFeature->attribute(aModifiedAttribute), AttributePtr())); + + thePoints.insert(std::dynamic_pointer_cast + (aBaseFeature->attribute(aModifiedAttribute))); + } + else { + // result is two lines: start line point - start shape point, last shape point - last line point + // create second line + FeaturePtr anNewFeature = createLineFeature(aBaseFeature, aLastShapePoint, aLastFeaturePoint); + thePoints.insert(std::dynamic_pointer_cast + (anNewFeature->attribute(SketchPlugin_Line::START_ID()))); + + std::string aModifiedAttribute = SketchPlugin_Line::END_ID(); + theModifiedAttributes.insert( + std::make_pair(aBaseFeature->attribute(aModifiedAttribute), + anNewFeature->attribute(SketchPlugin_Line::END_ID()))); + + // modify base arc + fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aStartShapePoint); + + thePoints.insert(std::dynamic_pointer_cast + (aBaseFeature->attribute(aModifiedAttribute))); + + // Collinear constraint for lines + createConstraintForObjects(SketchPlugin_ConstraintCollinear::ID(), + getFeatureResult(aBaseFeature), + getFeatureResult(anNewFeature)); + + } +} + +void SketchPlugin_Trim::trimArc(const std::shared_ptr& theStartShapePoint, + const std::shared_ptr& theLastShapePoint, + std::set& thePoints, + std::set& theCreatedFeatures, + std::set>& theModifiedAttributes) +{ + // Check the base objects are initialized. + AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast( + data()->attribute(SketchPlugin_Trim::BASE_OBJECT())); + ObjectPtr aBaseObject = aBaseObjectAttr->value(); + FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); + + /// points of trim + AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; + getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); + + std::shared_ptr aStartArcPoint = aStartPointAttrOfBase->pnt(); + std::shared_ptr aLastArcPoint = anEndPointAttrOfBase->pnt(); + + std::shared_ptr aStartShapePoint = theStartShapePoint; + std::shared_ptr aLastShapePoint = theLastShapePoint; + arrangePointsOnArc(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase, + aStartShapePoint, aLastShapePoint); +#ifdef DEBUG_TRIM + std::cout << "Arranged points (to build split between 1st and 2nd points:" << std::endl; + if (aStartShapePoint.get()) + std::cout << "Start point: [" << aStartShapePoint->x() << ", " << + aStartShapePoint->y() << "]" << std::endl; + std::cout << "1st point: [" << aStartArcPoint->x() << ", " << + aStartArcPoint->y() << "]" << std::endl; + if (aLastShapePoint.get()) + std::cout << "2st point: [" << aLastShapePoint->x() << ", " << + aLastShapePoint->y() << "]" << std::endl; + std::cout << "End point: [" << aLastArcPoint->x() << ", " << + aLastArcPoint->y() << "]" << std::endl; +#endif + + bool isStartPoint = !aStartShapePoint.get() || aStartArcPoint->isEqual(aStartShapePoint); + bool isLastPoint = !aLastShapePoint.get() || aLastArcPoint->isEqual(aLastShapePoint); + if (isStartPoint || isLastPoint) { + // result is one arc: changed existing arc + std::string aModifiedAttribute = isStartPoint ? SketchPlugin_Arc::START_ID() + : SketchPlugin_Arc::END_ID(); + std::shared_ptr aPoint; + if (aStartShapePoint.get() && aLastShapePoint.get()) + aPoint = isStartPoint ? aLastShapePoint : aStartShapePoint; + else + aPoint = aStartShapePoint.get() ? aStartShapePoint : aLastShapePoint; + + fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aPoint); + theModifiedAttributes.insert( + std::make_pair(aBaseFeature->attribute(aModifiedAttribute), AttributePtr())); + + thePoints.insert(std::dynamic_pointer_cast + (aBaseFeature->attribute(aModifiedAttribute))); + } + else { + // result is two arcs: start arc point - start shape point, last shape point - last arc point + // create second arc + FeaturePtr anArcFeature = createArcFeature(aBaseFeature, aLastShapePoint, aLastArcPoint); + thePoints.insert(std::dynamic_pointer_cast + (anArcFeature->attribute(SketchPlugin_Arc::START_ID()))); + + std::string aModifiedAttribute = SketchPlugin_Arc::END_ID(); + theModifiedAttributes.insert( + std::make_pair(aBaseFeature->attribute(aModifiedAttribute), + anArcFeature->attribute(SketchPlugin_Arc::END_ID()))); + + // modify base arc + fillPointAttribute(aBaseFeature->attribute(aModifiedAttribute), aStartShapePoint); + + thePoints.insert(std::dynamic_pointer_cast + (aBaseFeature->attribute(aModifiedAttribute))); + + // equal Radius constraint for arcs + createConstraintForObjects(SketchPlugin_ConstraintEqual::ID(), + getFeatureResult(aBaseFeature), + getFeatureResult(anArcFeature)); + // coincident centers constraint + createConstraint(SketchPlugin_ConstraintCoincidence::ID(), + aBaseFeature->attribute(SketchPlugin_Arc::CENTER_ID()), + anArcFeature->attribute(SketchPlugin_Arc::CENTER_ID())); + } +} void SketchPlugin_Trim::trimCircle(const std::shared_ptr& theStartShapePoint, const std::shared_ptr& theLastShapePoint, - /*FeaturePtr& theSplitFeature, - FeaturePtr& theBaseFeatureModified, - FeaturePtr& theAfterFeature,*/ std::set& thePoints, std::set& theCreatedFeatures, std::set>& theModifiedAttributes) @@ -1378,117 +707,77 @@ void SketchPlugin_Trim::trimCircle(const std::shared_ptr& theStar FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value()); /// points of trim - //std::shared_ptr aStartShapePoint, aLastShapePoint; - //findShapePoints(aStartShapePoint, aLastShapePoint); - //std::shared_ptr aStartShapePoint2d = convertPoint(aStartShapePoint); - //std::shared_ptr aLastShapePoint2d = convertPoint(aLastShapePoint); AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase; getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase); - //std::set aCreatedFeatures; - //FeaturePtr aConstraintFeature; - //theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature - - SketchPlugin_Sketch* aSketch = sketch(); - //if (!aSketch) - // return; - - //AttributePoint2DPtr aFirstPointAttrOfSplit = - // getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_A())); - //AttributePoint2DPtr aSecondPointAttrOfSplit = - // getPointOfRefAttr(data()->attribute(SketchPlugin_Constraint::ENTITY_B())); - - /// split feature - //theSplitFeature = - // createArcFeature(aBaseFeature, aFirstPointAttrOfSplit, aSecondPointAttrOfSplit); - //bool aSplitReversed = std::dynamic_pointer_cast(theSplitFeature)->isReversed(); - //theCreatedFeatures.insert(theSplitFeature); - - /// base feature is a left part of the circle - /*theBaseFeatureModified =*/ + /// trim feature FeaturePtr anArcFeature = createArcFeature(aBaseFeature, theStartShapePoint, theLastShapePoint); - //std::dynamic_pointer_cast( - // theBaseFeatureModified)->setReversed(!aSplitReversed); - //theBaseFeatureModified->execute(); theModifiedAttributes.insert( std::make_pair(aBaseFeature->attribute(SketchPlugin_Circle::CENTER_ID()), anArcFeature->attribute(SketchPlugin_Arc::CENTER_ID()))); - //theCreatedFeatures.insert(theBaseFeatureModified); - thePoints.insert(std::dynamic_pointer_cast (anArcFeature->attribute(SketchPlugin_Arc::START_ID()))); thePoints.insert(std::dynamic_pointer_cast (anArcFeature->attribute(SketchPlugin_Arc::END_ID()))); +} + +void SketchPlugin_Trim::arrangePointsOnLine(const AttributePoint2DPtr& theStartPointAttr, + const AttributePoint2DPtr& theEndPointAttr, + std::shared_ptr& theFirstPoint, + std::shared_ptr& theLastPoint) const +{ + if (!theFirstPoint.get() || !theLastPoint.get()) + return; - // additional constraints between split and base features - /*aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID()), - theSplitFeature->attribute(SketchPlugin_Arc::END_ID())); - theCreatedFeatures.insert(aConstraintFeature); - aConstraintFeature = createConstraint(SketchPlugin_ConstraintCoincidence::ID(), - theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID()), - theSplitFeature->attribute(SketchPlugin_Arc::START_ID())); - theCreatedFeatures.insert(aConstraintFeature); - - aConstraintFeature = createConstraintForObjects(SketchPlugin_ConstraintTangent::ID(), - getFeatureResult(theSplitFeature), - getFeatureResult(theBaseFeatureModified)); - theCreatedFeatures.insert(aConstraintFeature);*/ + // if first point is closer to last point, swap first and last values + if (theStartPointAttr->pnt()->distance(theFirstPoint) > + theStartPointAttr->pnt()->distance(theLastPoint)) { + std::shared_ptr aTmpPoint = theFirstPoint; + theFirstPoint = theLastPoint; + theLastPoint = aTmpPoint; + } } -//void SketchPlugin_Trim::arrangePointsOnLine( -// const AttributePoint2DPtr& theStartPointAttr, -// const AttributePoint2DPtr& theEndPointAttr, -// AttributePoint2DPtr& theFirstPointAttr, -// AttributePoint2DPtr& theLastPointAttr) const -//{ -// // if first point is closer to last point, swap first and last values -// if (theStartPointAttr->pnt()->distance(theFirstPointAttr->pnt()) > -// theStartPointAttr->pnt()->distance(theLastPointAttr->pnt())) { -// AttributePoint2DPtr aTmpPoint = theFirstPointAttr; -// theFirstPointAttr = theLastPointAttr; -// theLastPointAttr = aTmpPoint; -// } -//} -// -//void SketchPlugin_Trim::arrangePointsOnArc( -// const FeaturePtr& theArc, -// const AttributePoint2DPtr& theStartPointAttr, -// const AttributePoint2DPtr& theEndPointAttr, -// AttributePoint2DPtr& theFirstPointAttr, -// AttributePoint2DPtr& theSecondPointAttr) const -//{ -// static const double anAngleTol = 1.e-12; -// -// std::shared_ptr aCenter = std::dynamic_pointer_cast( -// theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt(); -// bool isReversed = theArc->boolean(SketchPlugin_Arc::INVERSED_ID())->value(); -// -// // collect directions to each point -// std::shared_ptr aStartDir( -// new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy()))); -// std::shared_ptr aFirstPtDir( -// new GeomAPI_Dir2d(theFirstPointAttr->pnt()->xy()->decreased(aCenter->xy()))); -// std::shared_ptr aSecondPtDir( -// new GeomAPI_Dir2d(theSecondPointAttr->pnt()->xy()->decreased(aCenter->xy()))); -// -// // sort points by their angular values -// double aFirstPtAngle = aStartDir->angle(aFirstPtDir); -// double aSecondPtAngle = aStartDir->angle(aSecondPtDir); -// double aPeriod = isReversed ? -2.0 * PI : 2.0 * PI; -// if (fabs(aFirstPtAngle) > anAngleTol && isReversed == (aFirstPtAngle > 0.)) -// aFirstPtAngle += aPeriod; -// if (fabs(aSecondPtAngle) > anAngleTol && isReversed == (aSecondPtAngle > 0.)) -// aSecondPtAngle += aPeriod; -// -// if (fabs(aFirstPtAngle) > fabs(aSecondPtAngle)) { -// AttributePoint2DPtr aTmpPoint = theFirstPointAttr; -// theFirstPointAttr = theSecondPointAttr; -// theSecondPointAttr = aTmpPoint; -// } -//} +void SketchPlugin_Trim::arrangePointsOnArc(const FeaturePtr& theArc, + const AttributePoint2DPtr& theStartPointAttr, + const AttributePoint2DPtr& theEndPointAttr, + std::shared_ptr& theFirstPoint, + std::shared_ptr& theSecondPoint) const +{ + if (!theFirstPoint.get() || !theSecondPoint.get()) + return; + + static const double anAngleTol = 1.e-12; + + std::shared_ptr aCenter = std::dynamic_pointer_cast( + theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt(); + bool isReversed = theArc->boolean(SketchPlugin_Arc::INVERSED_ID())->value(); + + // collect directions to each point + std::shared_ptr aStartDir( + new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy()))); + std::shared_ptr aFirstPtDir( + new GeomAPI_Dir2d(theFirstPoint->xy()->decreased(aCenter->xy()))); + std::shared_ptr aSecondPtDir( + new GeomAPI_Dir2d(theSecondPoint->xy()->decreased(aCenter->xy()))); + + // sort points by their angular values + double aFirstPtAngle = aStartDir->angle(aFirstPtDir); + double aSecondPtAngle = aStartDir->angle(aSecondPtDir); + double aPeriod = isReversed ? -2.0 * PI : 2.0 * PI; + if (fabs(aFirstPtAngle) > anAngleTol && isReversed == (aFirstPtAngle > 0.)) + aFirstPtAngle += aPeriod; + if (fabs(aSecondPtAngle) > anAngleTol && isReversed == (aSecondPtAngle > 0.)) + aSecondPtAngle += aPeriod; + + if (fabs(aFirstPtAngle) > fabs(aSecondPtAngle)) { + std::shared_ptr aTmpPoint = theFirstPoint; + theFirstPoint = theSecondPoint; + theSecondPoint = aTmpPoint; + } +} void SketchPlugin_Trim::fillPointAttribute(const AttributePtr& theModifiedAttribute, const std::shared_ptr& thePoint) @@ -1544,28 +833,28 @@ void SketchPlugin_Trim::fillAttribute(const AttributePtr& theModifiedAttribute, } } -//FeaturePtr SketchPlugin_Trim::createLineFeature(const FeaturePtr& theBaseFeature, -// const AttributePtr& theFirstPointAttr, -// const AttributePtr& theSecondPointAttr) -//{ -// FeaturePtr aFeature; -// SketchPlugin_Sketch* aSketch = sketch(); -// if (!aSketch || !theBaseFeature.get()) -// return aFeature; -// -// aFeature = aSketch->addFeature(SketchPlugin_Line::ID()); -// -// fillAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), theFirstPointAttr); -// fillAttribute(aFeature->attribute(SketchPlugin_Line::END_ID()), theSecondPointAttr); -// -// fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()), -// theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID())); -// -// aFeature->execute(); // to obtain result -// -// return aFeature; -//} -// +FeaturePtr SketchPlugin_Trim::createLineFeature(const FeaturePtr& theBaseFeature, + const std::shared_ptr& theFirstPoint, + const std::shared_ptr& theSecondPoint) +{ + FeaturePtr aFeature; + SketchPlugin_Sketch* aSketch = sketch(); + if (!aSketch || !theBaseFeature.get()) + return aFeature; + + aFeature = aSketch->addFeature(SketchPlugin_Line::ID()); + + fillPointAttribute(aFeature->attribute(SketchPlugin_Line::START_ID()), theFirstPoint); + fillPointAttribute(aFeature->attribute(SketchPlugin_Line::END_ID()), theSecondPoint); + + fillAttribute(aFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID()), + theBaseFeature->attribute(SketchPlugin_SketchEntity::AUXILIARY_ID())); + + aFeature->execute(); // to obtain result + + return aFeature; +} + FeaturePtr SketchPlugin_Trim::createArcFeature(const FeaturePtr& theBaseFeature, const std::shared_ptr& theFirstPoint, @@ -1659,45 +948,22 @@ FeaturePtr SketchPlugin_Trim::createConstraint(const std::string& theConstraintI return aConstraint; } - // -//FeaturePtr SketchPlugin_Trim::createConstraintForObjects( -// const std::string& theConstraintId, -// const ObjectPtr& theFirstObject, -// const ObjectPtr& theSecondObject) -//{ -// FeaturePtr aConstraint = sketch()->addFeature(theConstraintId); -// AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast( -// aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A())); -// aRefAttr->setObject(theFirstObject); -// -// aRefAttr = std::dynamic_pointer_cast( -// aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B())); -// aRefAttr->setObject(theSecondObject); -// -// return aConstraint; -//} -// -//void SketchPlugin_Trim::updateFeaturesAfterSplit( -// const std::set& theFeaturesToUpdate) -//{ -// std::set::const_iterator anIt = theFeaturesToUpdate.begin(), -// aLast = theFeaturesToUpdate.end(); -// for (; anIt != aLast; anIt++) { -// FeaturePtr aRefFeature = std::dynamic_pointer_cast(*anIt); -// std::string aRefFeatureKind = aRefFeature->getKind(); -// if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) { -// std::shared_ptr aLenghtFeature = -// std::dynamic_pointer_cast(*anIt); -// if (aLenghtFeature.get()) { -// std::shared_ptr aValueAttr = std::dynamic_pointer_cast< -// ModelAPI_AttributeDouble>(aLenghtFeature->attribute(SketchPlugin_Trim::BASE_OBJECT())); -// double aValue; -// if (aLenghtFeature->computeLenghtValue(aValue) && aValueAttr.get()) -// aValueAttr->setValue(aValue); -// } -// } -// } -//} +FeaturePtr SketchPlugin_Trim::createConstraintForObjects( + const std::string& theConstraintId, + const ObjectPtr& theFirstObject, + const ObjectPtr& theSecondObject) +{ + FeaturePtr aConstraint = sketch()->addFeature(theConstraintId); + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast( + aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A())); + aRefAttr->setObject(theFirstObject); + + aRefAttr = std::dynamic_pointer_cast( + aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B())); + aRefAttr->setObject(theSecondObject); + + return aConstraint; +} std::shared_ptr SketchPlugin_Trim::getFeatureResult( const std::shared_ptr& theFeature) @@ -1715,89 +981,6 @@ std::shared_ptr SketchPlugin_Trim::getFeatureResult( return aResult; } -//std::set > SketchPlugin_Trim::getEdgeAttributes( -// const std::shared_ptr& theFeature) -//{ -// std::set > anAttributes; -// -// std::string aFeatureKind = theFeature->getKind(); -// if (aFeatureKind == SketchPlugin_Line::ID()) { -// anAttributes.insert(theFeature->attribute(SketchPlugin_Line::START_ID())); -// anAttributes.insert(theFeature->attribute(SketchPlugin_Line::END_ID())); -// } -// else if (aFeatureKind == SketchPlugin_Arc::ID()) { -// anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::START_ID())); -// anAttributes.insert(theFeature->attribute(SketchPlugin_Arc::END_ID())); -// } -// else if (aFeatureKind == SketchPlugin_Circle::ID()) { -// } -// -// return anAttributes; -//} -// -//#ifdef _DEBUG -//std::string SketchPlugin_Trim::getFeatureInfo( -// const std::shared_ptr& theFeature, -// const bool isUseAttributesInfo) -//{ -// std::string anInfo; -// if (!theFeature.get()) { -// return "none"; -// } -// -// if (theFeature->data()->isValid()) -// anInfo.append(theFeature->data()->name().c_str()); -// -// if (isUseAttributesInfo) { -// std::string aPointsInfo = ModelGeomAlgo_Point2D::getPontAttributesInfo(theFeature, -// getEdgeAttributes(theFeature)); -// /// processing of feature with point 2d attributes, like line, arc, circle -// if (!aPointsInfo.empty()) { -// anInfo += ": "; -// anInfo += "\n"; -// anInfo += aPointsInfo; -// } -// else { /// process constraint coincidence, find points in ref attr attributes -// std::list anAttrs = theFeature->data()->attributes( -// ModelAPI_AttributeRefAttr::typeId()); -// std::list::const_iterator anIt = anAttrs.begin(), aLast = anAttrs.end(); -// std::string anAttributesInfo; -// for(; anIt != aLast; anIt++) { -// if (!anAttributesInfo.empty()) { -// anAttributesInfo.append(", "); -// anAttributesInfo += "\n"; -// } -// AttributePtr anAttr = *anIt; -// std::string aValue = "not defined"; -// std::string aType = anAttr->attributeType(); -// if (aType == ModelAPI_AttributeRefAttr::typeId()) { -// std::shared_ptr aRefAttr = -// std::dynamic_pointer_cast(anAttr); -// if (aRefAttr.get()) { -// if (aRefAttr->isObject()) { -// FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->object()); -// aValue = "" + getFeatureInfo(aFeature, false); -// } -// else { -// AttributePtr anAttribute = aRefAttr->attr(); -// if (anAttribute.get()) { -// FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner()); -// aValue = "" + ModelGeomAlgo_Point2D::getPointAttributeInfo(anAttribute) + -// " [" + getFeatureInfo(aFeature, false) + "]"; -// } -// } -// } -// } -// anAttributesInfo.append(" " + anAttr->id() + ": " + aValue); -// } -// if (!anAttributesInfo.empty()) -// anInfo = anInfo + "\n" + anAttributesInfo; -// } -// } -// return anInfo; -//} -//#endif - //******************************************************************** bool SketchPlugin_Trim::useGraphicIntersection() const { @@ -1810,7 +993,6 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject) PointToRefsMap aPointsInfo; std::set > aShapes; - //std::map > aPointToAttributes; std::map, std::list< AttributePoint2DPtr > > aPointToAttributes; std::map, @@ -1826,12 +1008,9 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject) GeomShapePtr aFeatureShape = (*anEdgeShapes.begin())->shape(); // coincidences to the feature - //std::list > aPoints; - ModelGeomAlgo_Point2D::getPointsOfReference(aFeature, SketchPlugin_ConstraintCoincidence::ID(), aRefAttributes, SketchPlugin_Point::ID(), SketchPlugin_Point::COORD_ID()); // layed on feature coincidences to divide it on several shapes - //CompositeFeaturePtr aSketch = sketch(); SketchPlugin_Sketch* aSketch = sketch(); std::shared_ptr aData = aSketch->data(); std::shared_ptr aC = std::dynamic_pointer_cast( @@ -1843,7 +1022,7 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject) std::shared_ptr aY(new GeomAPI_Dir(aNorm->dir()->cross(aX->dir()))); ModelGeomAlgo_Point2D::getPointsInsideShape(aFeatureShape, aRefAttributes, aC->pnt(), - aX->dir(), aY, aPointsInfo);//aPoints, aPointToAttributes); + aX->dir(), aY, aPointsInfo); // intersection points if (useGraphicIntersection()) { @@ -1853,18 +1032,12 @@ void SketchPlugin_Trim::fillObjectShapes(const ObjectPtr& theObject) if (aFeature.get()) aFeatures.push_back(aFeature); } - ModelGeomAlgo_Point2D::getPointsIntersectedShape(aFeature, aFeatures,// aPoints, - aPointsInfo); + ModelGeomAlgo_Point2D::getPointsIntersectedShape(aFeature, aFeatures, aPointsInfo); } GeomAlgoAPI_ShapeTools::splitShape(aFeatureShape, aPointsInfo, aShapes); - } - myObjectToPoints[theObject] = aPointsInfo; myCashedShapes[theObject] = aShapes; - //myCashedReferences[theObject] = aPointToAttributes; - //if (useGraphicIntersection()) - // myCashedObjects[theObject] = aPointToObjects; } //******************************************************************** diff --git a/src/SketchPlugin/SketchPlugin_Trim.h b/src/SketchPlugin/SketchPlugin_Trim.h index a1e1387f7..70bffe0a8 100644 --- a/src/SketchPlugin/SketchPlugin_Trim.h +++ b/src/SketchPlugin/SketchPlugin_Trim.h @@ -19,33 +19,7 @@ typedef std::pair > IdToPointP /** \class SketchPlugin_Trim * \ingroup Plugins - * \brief Feature for creation of a new constraint splitting object. Entities for split: - * - Linear segment by point(s) on this line - * - Arc by point(s) on this arc - * - Circle by at least 2 split-points on this circle - * - * The following constraints will be applied after split to keep the divided segments geometry: - * - Coincident constraints for both parts of created segments in the point of splitting - * - For linear segments parallel, for circles - tangent constraint, for arc - tangent and equal - * constraints. In case of three segments in result two couple of constraints are created - * - parallel and equal constraints: the first is between 1st and middle entity, the second is - * between 1st and 3rd. - * - tangency constraints: the first between 1st and 2nd, the second between 2nd and 3rd. - * - Constraints assigned to the feature before split operation are assigned after using rules: - * - Coincident constraints are assigned to the segment where they belong to. Segment of split - * has only a coincidence to the neighbor segment. All constraints used in the splitting of - * this segment are moved to point of neighbor segment. If constraint was initially built - * to the point of splitting segment, it stays for this point. - * - Geometrical and dimensional constraints are assigned to one of result segment, not the - * selected for split. In case of 3 result segments, this will be the segment nearest to the - * start point of arc/line. - * - Replication constraint used split feature will be deleted in the same way as it is deleted - * by any of entity delete in sketch which is used in this constraint. - * - * This constraint has three attributes: - * SketchPlugin_Constraint::VALUE() contains reference object to be splitted - * SketchPlugin_Constraint::ENTITY_A() and SketchPlugin_Constraint::ENTITY_B() for the points of split; - * + * \brief Feature for creation of a new constraint trimming object. Entities for split: */ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentable { @@ -76,12 +50,6 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab static const std::string MY_ENTITY_POINT("ConstraintEntityPoint"); return MY_ENTITY_POINT; } - /// End 2D point of the split segment - /*inline static const std::string& ENTITY_B_POINT() - { - static const std::string MY_ENTITY_B_POINT("ConstraintEntityBPoint"); - return MY_ENTITY_B_POINT; - }*/ /// \brief Creates a new part document if needed SKETCHPLUGIN_EXPORT virtual void execute(); @@ -104,11 +72,6 @@ class SketchPlugin_Trim : public SketchPlugin_Feature, public GeomAPI_IPresentab /// \brief Use plugin manager for features creation SketchPlugin_Trim(); - /// \return map of base points and features; - //SKETCHPLUGIN_EXPORT const std::map pointsFeaturesMap() const { - // return myPointFeaturesMap; - //}; - /// Returns the AIS preview SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious); @@ -125,26 +88,12 @@ private: std::shared_ptr& theStartPointAttr, std::shared_ptr& theEndPointAttr); -// FeaturePtr createCoincidenceConstraint(const AttributePtr& theFirstAttribute, -// const AttributePtr& theSecondAttribute); -// -// /// Returns cast of attribute to geometrical point if the attribute is a ref attr attribute -// /// \param theAttribute an attribute -// /// \param geom point 2D or NULL -// std::shared_ptr getPointOfRefAttr(const AttributePtr& theAttribute); - /// Obtains those constraints of the feature that should be modified. output maps contain /// point of coincidence and attribute id to be modified after split /// \param theFeaturesToDelete [out] constrains that will be deleted after split /// \param theFeaturesToUpdate [out] constrains that will be updated after split - /// \param theTangentFeatures [out] tangent feature to be connected to new feature - /// \param theCoincidenceToFeature [out] coincidence to feature to be connected to new feature - /// \param theCoincidenceToPoint [out] coincidence to point be connected to new feature void getConstraints(std::set>& theFeaturesToDelete, - std::set>& theFeaturesToUpdate);//, - //std::map, IdToPointPair>& theTangentFeatures, - //std::map, IdToPointPair>& theCoincidenceToFeature/*, - //std::map, IdToPointPair>& theCoincidenceToPoint*/); + std::set>& theFeaturesToUpdate); /// Obtains references to feature point attributes and to feature, /// e.g. for feature line: 1st container is @@ -157,25 +106,6 @@ private: std::map >& theRefs, std::list& theRefsToFeature); -// /// Move coincidence constraint from feature to point if it is found -// /// \param theCoincidenceToFeature coincidence to feature to be connected to new feature -// /// \param theFurtherCoincidences a list of points where coincidences will be build -// /// \param theFeatureResults created results after split where constaint might be connected -// /// \param theSplitFeature feature created by split, new coincidences to points should be created -// /// if theCoincidenceToFeature contains equal points -// void updateCoincidenceConstraintsToFeature( -// const std::map, IdToPointPair>& theCoincidenceToFeature, -// const std::set >& theFurtherCoincidences, -// const std::set& theFeatureResults, -// const FeaturePtr& theSplitFeature); -// -// /// Move tangency constraint to the nearest split feature that has a coincidence to the tangent -// /// \param theTangentFeatures tangencies to feature to be connected to nearest feature -// /// \param theFurtherCoincidences a list of points where coincidences is built -// void updateTangentConstraintsToFeature( -// const std::map, IdToPointPair>& theTangentFeatures, -// const std::set >& theFurtherCoincidences); - /// Move constraints from base feature to given feature /// \param theFeature a base feature /// \param theRefsToFeature list of attributes referenced to base feature @@ -188,7 +118,8 @@ private: /// at the same place void updateRefAttConstraints( const std::map >& theBaseRefAttributes, - const std::set >& theModifiedAttributes); + const std::set >& theModifiedAttributes, + std::set>& theFeaturesToDelete); // /// Make the base object is splitted by the point attributes // /// \param theSplitFeature a result split feature @@ -198,25 +129,23 @@ private: // /// \param theCreatedFeatures a container of created features // /// \param theModifiedAttributes a container of attribute on base // /// feature to attribute on new feature -// void splitLine(std::shared_ptr& theSplitFeature, -// std::shared_ptr& theBeforeFeature, -// std::shared_ptr& theAfterFeature, -// std::set >& thePoints, -// std::set>& theCreatedFeatures, -// std::set>& theModifiedAttributes); -// -// /// Make the base object is splitted by the point attributes -// /// \param theSplitFeature a result split feature -// /// \param theBeforeFeature a feature between start point and the 1st point of split feature -// /// \param theAfterFeature a feature between last point of split feature and the end point -// /// \param thePoints a list of points where coincidences will be build -// /// \param theCreatedFeatures a container of created features -// void splitArc(std::shared_ptr& theSplitFeature, -// std::shared_ptr& theBeforeFeature, -// std::shared_ptr& theAfterFeature, -// std::set >& thePoints, -// std::set>& theCreatedFeatures, -// std::set>& theModifiedAttributes); + void trimLine(const std::shared_ptr& theStartShapePoint, + const std::shared_ptr& theLastShapePoint, + std::set >& thePoints, + std::set>& theCreatedFeatures, + std::set>& theModifiedAttributes); + + /// Make the base object is splitted by the point attributes + /// \param theSplitFeature a result split feature + /// \param theBeforeFeature a feature between start point and the 1st point of split feature + /// \param theAfterFeature a feature between last point of split feature and the end point + /// \param thePoints a list of points where coincidences will be build + /// \param theCreatedFeatures a container of created features + void trimArc(const std::shared_ptr& theStartShapePoint, + const std::shared_ptr& theLastShapePoint, + std::set >& thePoints, + std::set>& theCreatedFeatures, + std::set>& theModifiedAttributes); /// Make the base object is splitted by the point attributes /// \param theSplitFeature a result split feature @@ -226,38 +155,35 @@ private: /// \param theCreatedFeatures a container of created features void trimCircle(const std::shared_ptr& theStartShapePoint, const std::shared_ptr& theLastShapePoint, - /*std::shared_ptr& theSplitFeature, - std::shared_ptr& theBeforeFeature, - std::shared_ptr& theAfterFeature,*/ std::set >& thePoints, std::set>& theCreatedFeatures, std::set>& theModifiedAttributes); -// /// Correct the first and the second point to provide condition that the first is closer to -// /// the start point and the second point - to the last end of current segment. To rearrange -// /// them if this condition is not satisfied. -// /// \param theStartPointAttr a start point of a segment -// /// \param theEndPointAttr an end point of a segment -// /// \param theFirstPointAttr a start point of a segment -// /// \param theSecondPointAttr an end point of a segment + /// Correct the first and the second point to provide condition that the first is closer to + /// the start point and the second point - to the last end of current segment. To rearrange + /// them if this condition is not satisfied. + /// \param theStartPointAttr a start point of a segment + /// \param theEndPointAttr an end point of a segment + /// \param theFirstPoint a start point of a segment + /// \param theSecondPoint an end point of a segment void arrangePointsOnLine(const std::shared_ptr& theStartPointAttr, const std::shared_ptr& theEndPointAttr, - std::shared_ptr& theFirstPointAttr, - std::shared_ptr& theSecondPointAttr) const; - -// /// Correct the first and the second point to provide condition that the first is closer to -// /// the start point and the second point - to the last end of current segment. To rearrange -// /// them if this condition is not satisfied. -// /// \param theArc an arc to be split -// /// \param theStartPointAttr a start point of a segment -// /// \param theEndPointAttr an end point of a segment -// /// \param theFirstPointAttr a start point of a segment -// /// \param theSecondPointAttr an end point of a segment -// void arrangePointsOnArc(const FeaturePtr& theArc, -// const std::shared_ptr& theStartPointAttr, -// const std::shared_ptr& theEndPointAttr, -// std::shared_ptr& theFirstPointAttr, -// std::shared_ptr& theSecondPointAttr) const; + std::shared_ptr& theFirstPoint, + std::shared_ptr& theSecondPoint) const; + + /// Correct the first and the second point to provide condition that the first is closer to + /// the start point and the second point - to the last end of current segment. To rearrange + /// them if this condition is not satisfied. + /// \param theArc an arc to be split + /// \param theStartPointAttr a start point of a segment + /// \param theEndPointAttr an end point of a segment + /// \param theFirstPoint a start point of a segment + /// \param theSecondPoint an end point of a segment + void arrangePointsOnArc(const FeaturePtr& theArc, + const std::shared_ptr& theStartPointAttr, + const std::shared_ptr& theEndPointAttr, + std::shared_ptr& theFirstPoint, + std::shared_ptr& theSecondPoint) const; /// Fill attribute by value of another attribute. It processes only Point 2D attributes. /// \param theModifiedAttribute an attribute of GeomDataAPI_Point2D on feature to be modified @@ -271,14 +197,14 @@ private: void fillPointAttribute(const AttributePtr& theModifiedAttribute, const std::shared_ptr& thePoint); -// /// Creates a line feature filled by center of base feature and given points -// /// \param theBaseFeature another arc feature -// /// \param theFirstAttribute an attribute with coordinates for the start point -// /// \param theSecondAttribute an attribute with coordinates for the end point -// FeaturePtr createLineFeature(const FeaturePtr& theBaseFeature, -// const AttributePtr& theFirstPointAttr, -// const AttributePtr& theSecondPointAttr); -// + /// Creates a line feature filled by center of base feature and given points + /// \param theBaseFeature another arc feature + /// \param theFirstAttribute an attribute with coordinates for the start point + /// \param theSecondAttribute an attribute with coordinates for the end point + FeaturePtr createLineFeature(const FeaturePtr& theBaseFeature, + const std::shared_ptr& theFirstPoint, + const std::shared_ptr& theSecondPoint); + /// Creates an arc feature filled by center of base feature and given points /// \param theBaseFeature another arc feature /// \param theFirstAttribute an attribute with coordinates for the start point @@ -303,38 +229,20 @@ private: const std::shared_ptr& theFirstAttribute, const std::shared_ptr& theSecondObject); -// /// Add feature coincidence constraint between given attributes -// /// \param theConstraintId a constraint index -// /// \param theFirstAttribute an attribute of further coincidence -// /// \param theFirstAttribute an attribute of further coincidence -// std::shared_ptr createConstraintForObjects(const std::string& theConstraintId, -// const std::shared_ptr& theFirstObject, -// const std::shared_ptr& theSecondObject); -// -// /// Add feature coincidence constraint between given attributes -// /// \param theFeaturesToUpdate a constraint index -// void updateFeaturesAfterSplit(const std::set& theFeaturesToUpdate); -// + /// Add feature coincidence constraint between given attributes + /// \param theConstraintId a constraint index + /// \param theFirstAttribute an attribute of further coincidence + /// \param theFirstAttribute an attribute of further coincidence + std::shared_ptr createConstraintForObjects(const std::string& theConstraintId, + const std::shared_ptr& theFirstObject, + const std::shared_ptr& theSecondObject); + /// Result result of the feature to build constraint with. For arc, circle it is an edge result. /// \param theFeature a feature /// \return result object std::shared_ptr getFeatureResult( const std::shared_ptr& theFeature); -// /// Returns attributes of the feature, used in edge build, for arc it is end and start points -// /// \param theFeature a feature -// /// \return container of attributes -// std::set > getEdgeAttributes( -// const std::shared_ptr& theFeature); -// -//#ifdef _DEBUG -// /// Return feature name, kind, point attribute values united in a string -// /// \param theFeature an investigated feature -// /// \return string value -// std::string getFeatureInfo(const std::shared_ptr& theFeature, -// const bool isUseAttributesInfo = true); -//#endif - private: bool useGraphicIntersection() const; @@ -346,13 +254,8 @@ private: std::shared_ptr convertPoint(const std::shared_ptr& thePoint); private: - //std::shared_ptr myCurrentSubShape; std::map > myCashedShapes; - //typedef std::map, - // std::shared_ptr > PntToAttributesMap; - //std::map myCashedReferences; - typedef std::map, std::pair >, std::list > > > PointToRefsMap; diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 5c33b28cc..50c1a6552 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -569,7 +569,6 @@ -