#include <SketchPlugin_Circle.h>
#include <SketchPlugin_ConstraintCoincidence.h>
#include <SketchPlugin_ConstraintEqual.h>
-#include <SketchPlugin_ConstraintParallel.h>
+//#include <SketchPlugin_ConstraintParallel.h>
#include <SketchPlugin_ConstraintTangent.h>
#include <SketchPlugin_ConstraintLength.h>
#include <SketchPlugin_ConstraintMirror.h>
+#include <SketchPlugin_ConstraintCollinear.h>
#include <SketchPlugin_Line.h>
#include <SketchPlugin_MultiRotation.h>
#include <SketchPlugin_MultiTranslation.h>
#include <iostream>
#endif
-//#define DEBUG_SPLIT
-#ifdef DEBUG_SPLIT
-#include <iostream>
-#endif
-
-//static const double PI = 3.141592653589793238463;
+static const double PI = 3.141592653589793238463;
static const std::string OPERATION_HIGHLIGHT_COLOR() { return "128, 0, 0"; }
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<GeomAPI_Pnt>& aStartPoint,
std::shared_ptr<GeomAPI_Pnt>& aLastPoint)
{
AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
data()->attribute(SketchPlugin_Trim::BASE_OBJECT()));
ObjectPtr aBaseObject = aBaseObjectAttr->value();
- //std::map<ObjectPtr, PointToRefsMap> myObjectToPoints;
if (myObjectToPoints.find(aBaseObject) == myObjectToPoints.end())
return aPoint;
}
}
}
- if (!aFound)
- return aPoint;
- //if (aRefsMap.find(thePoint) == aRefsMap.end())
- // return aPoint;
-
- //const std::pair<std::list<AttributePoint2DPtr >,
- // std::list<ObjectPtr > >& anInfo = aRefsMap.at(thePoint);
-
- //const std::list<AttributePoint2DPtr >& anAttributes = anInfo.first;
- //if (!anAttributes.empty())
- // aPoint = anAttributes.front()->pnt();
- //else {
- // std::shared_ptr<GeomAPI_Pln> 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<GeomAPI_Pln> 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
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<GeomAPI_Pnt2d>, std::shared_ptr<GeomAPI_Pnt> > aPntMap;
-
std::shared_ptr<GeomAPI_Pnt> aStartShapePoint, aLastShapePoint;
findShapePoints(aStartShapePoint, aLastShapePoint);
std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint2d = convertPoint(aStartShapePoint);
- //aPntMap[aStartShapePoint2d] = aStartShapePoint;
std::shared_ptr<GeomAPI_Pnt2d> 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<FeaturePtr> aFeaturesToDelete, aFeaturesToUpdate;
- //std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
- //std::map<FeaturePtr, IdToPointPair> aCoincidenceToFeature;
- getConstraints(aFeaturesToDelete, aFeaturesToUpdate);//, aTangentFeatures, aCoincidenceToFeature);
+ getConstraints(aFeaturesToDelete, aFeaturesToUpdate);
std::map<AttributePtr, std::list<AttributePtr> > aBaseRefAttributes;
std::list<AttributePtr> aRefsToFeature;
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
std::shared_ptr<GeomAPI_Pnt2d> aPoint2d = aPointAttribute->pnt();
std::shared_ptr<GeomAPI_Pnt> 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<AttributePoint2DPtr >, std::list<ObjectPtr > > anInfo;
}
}
- /*AttributePoint2DPtr anAPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aData->attribute(ENTITY_A_POINT()));
- std::shared_ptr<GeomAPI_Pnt2d> anAttributeStartPnt2d = anAPoint->pnt();
-
- AttributePoint2DPtr aBPoint = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aData->attribute(ENTITY_B_POINT()));
- std::shared_ptr<GeomAPI_Pnt2d> anAttributeEndPnt2d = aBPoint->pnt();
-
-
- AttributeRefAttrPtr anARefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
- aData->attribute(SketchPlugin_Constraint::ENTITY_A()));
- AttributeRefAttrPtr aBRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
- 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<AttributePoint2DPtr > aNewCoincidencesToSplitFeature;
- AttributePoint2DPtr aFeatureStartPointAttr, aFeatureEndPointAttr;
- getFeaturePoints(aBaseFeature, aFeatureStartPointAttr, aFeatureEndPointAttr);
-
- if (aFeatureStartPointAttr.get() && aFeatureStartPointAttr.get()) { // line or arc
- AttributePoint2DPtr aStartPointAttribute =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aFeatureStartPointAttr);
- std::shared_ptr<GeomAPI_Pnt2d> aFeatureStartPnt2d = aStartPointAttribute->pnt();
- AttributePoint2DPtr anEndPointAttribute =
- std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
- aFeatureEndPointAttr);
- std::shared_ptr<GeomAPI_Pnt2d> 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<FeaturePtr> aFeaturesToDelete, aFeaturesToUpdate;
-//
-// std::map<FeaturePtr, IdToPointPair> aTangentFeatures;
-// std::map<FeaturePtr, IdToPointPair> aCoincidenceToFeature;
-// getConstraints(aFeaturesToDelete, aFeaturesToUpdate, aTangentFeatures, aCoincidenceToFeature);
-//
-//std::map<AttributePtr, std::list<AttributePtr> > aBaseRefAttributes;
-//std::list<AttributePtr> aRefsToFeature;
-//getRefAttributes(aBaseFeature, aBaseRefAttributes, aRefsToFeature);
-//
-// std::map<AttributePtr, AttributePtr> 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<FeaturePtr, IdToPointPair>::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<FeaturePtr, IdToPointPair>::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<AttributePtr, std::list<AttributePtr> >::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<AttributePtr> aRefAttributes = aRefIt->second;
-// std::string aRefsInfo;
-// std::list<AttributePtr>::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<GeomDataAPI_Point2D>(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<AttributePtr>::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<AttributePoint2DPtr> aFurtherCoincidences;
-// std::set<FeaturePtr> aCreatedFeatures;
-// std::set<std::pair<AttributePtr, AttributePtr>> 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<FeaturePtr>::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<AttributePoint2DPtr>::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<std::pair<AttributePtr, AttributePtr> >::const_iterator
-// aPIt = aModifiedAttributes.begin(), aPLast = aModifiedAttributes.end();
-// std::string aResInfo;
-// for (; aPIt != aPLast; aPIt++) {
-// if (!aResInfo.empty())
-// aResInfo += "\n";
-//
-// std::pair<AttributePtr, AttributePtr> 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<ResultPtr> 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<FeaturePtr>::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<FeaturePtr>::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
}
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<std::shared_ptr<GeomAPI_Pnt> > aPoints;
-
- std::shared_ptr<GeomAPI_Pnt2d> aStartPnt2d = aFirstPointAttrOfSplit->pnt();
- std::shared_ptr<GeomAPI_Pnt> aStartPoint = sketch()->to3D(aStartPnt2d->x(), aStartPnt2d->y());
- aPoints.push_back(aStartPoint);
-
- std::shared_ptr<GeomAPI_Pnt2d> aSecondPnt2d = aSecondPointAttrOfSplit->pnt();
- std::shared_ptr<GeomAPI_Pnt> aSecondPoint =
- sketch()->to3D(aSecondPnt2d->x(), aSecondPnt2d->y());
- aPoints.push_back(aSecondPoint);
-
- std::set<std::shared_ptr<GeomAPI_Shape> > aSplitShapes;
-
- GeomAlgoAPI_ShapeTools::splitShape(aBaseShape, aPoints, aSplitShapes);
- std::shared_ptr<GeomAPI_Shape> aShape =
- GeomAlgoAPI_ShapeTools::findShape(aPoints, aSplitShapes);
-
- AISObjectPtr anAIS = thePrevious;
- if (aShape) {
- if (!anAIS)
- anAIS = AISObjectPtr(new GeomAPI_AISObject);
- anAIS->createShape(aShape);
- std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
- aBaseFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
-
- bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
-
- std::vector<int> 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<ModelAPI_AttributeRefAttr>(theAttribute);
-// if (aRefAttr.get() && aRefAttr->isInitialized()) {
-// AttributePtr anAttribute = aRefAttr->attr();
-// if (anAttribute.get() && anAttribute->attributeType() == GeomDataAPI_Point2D::typeId())
-// aPointAttribute = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttribute);
-// }
-// }
-// return aPointAttribute;
-//}
-//
-
void SketchPlugin_Trim::getFeaturePoints(const FeaturePtr& theFeature,
AttributePoint2DPtr& theStartPointAttr,
AttributePoint2DPtr& theEndPointAttr)
}
void SketchPlugin_Trim::getConstraints(std::set<FeaturePtr>& theFeaturesToDelete,
- std::set<FeaturePtr>& theFeaturesToUpdate//,
- //std::map<FeaturePtr, IdToPointPair>& theTangentFeatures,
- //std::map<FeaturePtr, IdToPointPair>& theCoincidenceToFeature
- )
+ std::set<FeaturePtr>& theFeaturesToUpdate)
{
std::shared_ptr<ModelAPI_Data> aData = data();
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<GeomDataAPI_Point2D>(anAttribute);
- }
- //if (aCoincidentPoint.get() && isToFeature)
- // theCoincidenceToFeature[aRefFeature] = std::make_pair(anAttributeToBeModified,
- // aCoincidentPoint);
- }*/
}
}
}
}
-//void SketchPlugin_Trim::updateCoincidenceConstraintsToFeature(
-// const std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
-// const std::set<AttributePoint2DPtr >& theFurtherCoincidences,
-// const std::set<ResultPtr>& theFeatureResults,
-// const FeaturePtr& theSplitFeature)
-//{
-// if (theCoincidenceToFeature.empty())
-// return;
-//
-// // we should build coincidence constraints to end of the split feature
-// std::set<AttributePoint2DPtr > 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<FeaturePtr, IdToPointPair>::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<AttributePoint2DPtr>::const_iterator aFCIt = theFurtherCoincidences.begin(),
-// aFCLast = theFurtherCoincidences.end();
-// std::shared_ptr<GeomAPI_Pnt2d> 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<AttributePoint2DPtr>::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<GeomAPI_Pnt2d> aPnt2d = aCoincPoint->pnt();
-// std::shared_ptr<GeomAPI_Pnt> aPoint = sketch()->to3D(aPnt2d->x(), aPnt2d->y());
-//
-// std::shared_ptr<GeomAPI_Pnt> 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<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
-// const std::set<AttributePoint2DPtr >& theFurtherCoincidences)
-//{
-// if (theTangentFeatures.empty())
-// return;
-//
-// std::map<FeaturePtr, IdToPointPair>::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<AttributePoint2DPtr>::const_iterator aFCIt = theFurtherCoincidences.begin(),
-// aFCLast = theFurtherCoincidences.end();
-// std::shared_ptr<GeomAPI_Pnt2d> 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<ModelAPI_Feature>(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<AttributePtr>& theRefsToFeature)
void SketchPlugin_Trim::updateRefAttConstraints(
const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
- const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes)
+ const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes,
+ std::set<FeaturePtr>& theFeaturesToDelete)
{
-#ifdef DEBUG_SPLIT
+#ifdef DEBUG_TRIM
std::cout << "SketchPlugin_Trim::updateRefAttConstraints" << std::endl;
#endif
for (; aRefIt != aRLast; aRefIt++) {
AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*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<AttributePoint2DPtr>& thePoints,
-// std::set<FeaturePtr>& theCreatedFeatures,
-// std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
-//{
-// std::set<FeaturePtr> aCreatedFeatures;
-// FeaturePtr aConstraintFeature;
-// theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-//
-// SketchPlugin_Sketch* aSketch = sketch();
-// if (!aSketch)
-// return;
-//
-// AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-// 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<GeomDataAPI_Point2D>
-// (aFeature->attribute(SketchPlugin_Line::START_ID())));
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (aFeature->attribute(SketchPlugin_Line::END_ID())));
-//
-// if (!theBaseFeatureModified.get())
-// theBaseFeatureModified = aFeature;
-// else
-// theAfterFeature = aFeature;
-// }
-// else {
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (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<GeomDataAPI_Point2D>
-// (theBaseFeatureModified->attribute(SketchPlugin_Line::START_ID())));
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (theBaseFeatureModified->attribute(SketchPlugin_Line::END_ID())));
-// }
-// else
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (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<AttributePoint2DPtr>& thePoints,
-// std::set<FeaturePtr>& theCreatedFeatures,
-// std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
-//{
-// std::set<FeaturePtr> aCreatedFeatures;
-// FeaturePtr aConstraintFeature;
-// theBaseFeatureModified = FeaturePtr(); // it will contain modified base feature
-//
-// SketchPlugin_Sketch* aSketch = sketch();
-// if (!aSketch)
-// return;
-//
-// AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
-// 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<GeomDataAPI_Point2D>
-// (aFeature->attribute(SketchPlugin_Arc::START_ID())));
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (aFeature->attribute(SketchPlugin_Arc::END_ID())));
-//
-// if (!theBaseFeatureModified.get())
-// theBaseFeatureModified = aFeature;
-// else
-// theAfterFeature = aFeature;
-// }
-// else {
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (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<GeomDataAPI_Point2D>
-// (theBaseFeatureModified->attribute(SketchPlugin_Arc::START_ID())));
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (theBaseFeatureModified->attribute(SketchPlugin_Arc::END_ID())));
-// }
-// else
-// thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
-// (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<GeomAPI_Pnt2d>& theStartShapePoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+ std::set<AttributePoint2DPtr>& thePoints,
+ std::set<FeaturePtr>& theCreatedFeatures,
+ std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
+{
+ // Check the base objects are initialized.
+ AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
+ 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<GeomAPI_Pnt2d> aStartFeaturePoint = aStartPointAttrOfBase->pnt();
+ std::shared_ptr<GeomAPI_Pnt2d> aLastFeaturePoint = anEndPointAttrOfBase->pnt();
+
+ std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint = theStartShapePoint;
+ std::shared_ptr<GeomAPI_Pnt2d> 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<GeomAPI_Pnt2d> 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<GeomDataAPI_Point2D>
+ (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<GeomDataAPI_Point2D>
+ (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<GeomDataAPI_Point2D>
+ (aBaseFeature->attribute(aModifiedAttribute)));
+
+ // Collinear constraint for lines
+ createConstraintForObjects(SketchPlugin_ConstraintCollinear::ID(),
+ getFeatureResult(aBaseFeature),
+ getFeatureResult(anNewFeature));
+
+ }
+}
+
+void SketchPlugin_Trim::trimArc(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+ std::set<AttributePoint2DPtr>& thePoints,
+ std::set<FeaturePtr>& theCreatedFeatures,
+ std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
+{
+ // Check the base objects are initialized.
+ AttributeReferencePtr aBaseObjectAttr = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(
+ 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<GeomAPI_Pnt2d> aStartArcPoint = aStartPointAttrOfBase->pnt();
+ std::shared_ptr<GeomAPI_Pnt2d> aLastArcPoint = anEndPointAttrOfBase->pnt();
+
+ std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint = theStartShapePoint;
+ std::shared_ptr<GeomAPI_Pnt2d> 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<GeomAPI_Pnt2d> 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<GeomDataAPI_Point2D>
+ (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<GeomDataAPI_Point2D>
+ (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<GeomDataAPI_Point2D>
+ (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<GeomAPI_Pnt2d>& theStartShapePoint,
const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
- /*FeaturePtr& theSplitFeature,
- FeaturePtr& theBaseFeatureModified,
- FeaturePtr& theAfterFeature,*/
std::set<AttributePoint2DPtr>& thePoints,
std::set<FeaturePtr>& theCreatedFeatures,
std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes)
FeaturePtr aBaseFeature = ModelAPI_Feature::feature(aBaseObjectAttr->value());
/// points of trim
- //std::shared_ptr<GeomAPI_Pnt> aStartShapePoint, aLastShapePoint;
- //findShapePoints(aStartShapePoint, aLastShapePoint);
- //std::shared_ptr<GeomAPI_Pnt2d> aStartShapePoint2d = convertPoint(aStartShapePoint);
- //std::shared_ptr<GeomAPI_Pnt2d> aLastShapePoint2d = convertPoint(aLastShapePoint);
AttributePoint2DPtr aStartPointAttrOfBase, anEndPointAttrOfBase;
getFeaturePoints(aBaseFeature, aStartPointAttrOfBase, anEndPointAttrOfBase);
- //std::set<FeaturePtr> 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<SketchPlugin_Arc>(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<SketchPlugin_Arc>(
- // 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<GeomDataAPI_Point2D>
(anArcFeature->attribute(SketchPlugin_Arc::START_ID())));
thePoints.insert(std::dynamic_pointer_cast<GeomDataAPI_Point2D>
(anArcFeature->attribute(SketchPlugin_Arc::END_ID())));
+}
+
+void SketchPlugin_Trim::arrangePointsOnLine(const AttributePoint2DPtr& theStartPointAttr,
+ const AttributePoint2DPtr& theEndPointAttr,
+ std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+ std::shared_ptr<GeomAPI_Pnt2d>& 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<GeomAPI_Pnt2d> 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<GeomAPI_Pnt2d> aCenter = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-// theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt();
-// bool isReversed = theArc->boolean(SketchPlugin_Arc::INVERSED_ID())->value();
-//
-// // collect directions to each point
-// std::shared_ptr<GeomAPI_Dir2d> aStartDir(
-// new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy())));
-// std::shared_ptr<GeomAPI_Dir2d> aFirstPtDir(
-// new GeomAPI_Dir2d(theFirstPointAttr->pnt()->xy()->decreased(aCenter->xy())));
-// std::shared_ptr<GeomAPI_Dir2d> 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<GeomAPI_Pnt2d>& theFirstPoint,
+ std::shared_ptr<GeomAPI_Pnt2d>& theSecondPoint) const
+{
+ if (!theFirstPoint.get() || !theSecondPoint.get())
+ return;
+
+ static const double anAngleTol = 1.e-12;
+
+ std::shared_ptr<GeomAPI_Pnt2d> aCenter = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ theArc->attribute(SketchPlugin_Arc::CENTER_ID()))->pnt();
+ bool isReversed = theArc->boolean(SketchPlugin_Arc::INVERSED_ID())->value();
+
+ // collect directions to each point
+ std::shared_ptr<GeomAPI_Dir2d> aStartDir(
+ new GeomAPI_Dir2d(theStartPointAttr->pnt()->xy()->decreased(aCenter->xy())));
+ std::shared_ptr<GeomAPI_Dir2d> aFirstPtDir(
+ new GeomAPI_Dir2d(theFirstPoint->xy()->decreased(aCenter->xy())));
+ std::shared_ptr<GeomAPI_Dir2d> 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<GeomAPI_Pnt2d> aTmpPoint = theFirstPoint;
+ theFirstPoint = theSecondPoint;
+ theSecondPoint = aTmpPoint;
+ }
+}
void SketchPlugin_Trim::fillPointAttribute(const AttributePtr& theModifiedAttribute,
const std::shared_ptr<GeomAPI_Pnt2d>& thePoint)
}
}
-//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<GeomAPI_Pnt2d>& theFirstPoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& 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<GeomAPI_Pnt2d>& theFirstPoint,
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<ModelAPI_AttributeRefAttr>(
-// aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()));
-// aRefAttr->setObject(theFirstObject);
-//
-// aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-// aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
-// aRefAttr->setObject(theSecondObject);
-//
-// return aConstraint;
-//}
-//
-//void SketchPlugin_Trim::updateFeaturesAfterSplit(
-// const std::set<FeaturePtr>& theFeaturesToUpdate)
-//{
-// std::set<FeaturePtr>::const_iterator anIt = theFeaturesToUpdate.begin(),
-// aLast = theFeaturesToUpdate.end();
-// for (; anIt != aLast; anIt++) {
-// FeaturePtr aRefFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*anIt);
-// std::string aRefFeatureKind = aRefFeature->getKind();
-// if (aRefFeatureKind == SketchPlugin_ConstraintLength::ID()) {
-// std::shared_ptr<SketchPlugin_ConstraintLength> aLenghtFeature =
-// std::dynamic_pointer_cast<SketchPlugin_ConstraintLength>(*anIt);
-// if (aLenghtFeature.get()) {
-// std::shared_ptr<ModelAPI_AttributeDouble> 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<ModelAPI_AttributeRefAttr>(
+ aConstraint->attribute(SketchPlugin_Constraint::ENTITY_A()));
+ aRefAttr->setObject(theFirstObject);
+
+ aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+ aConstraint->attribute(SketchPlugin_Constraint::ENTITY_B()));
+ aRefAttr->setObject(theSecondObject);
+
+ return aConstraint;
+}
std::shared_ptr<ModelAPI_Result> SketchPlugin_Trim::getFeatureResult(
const std::shared_ptr<ModelAPI_Feature>& theFeature)
return aResult;
}
-//std::set<std::shared_ptr<ModelAPI_Attribute> > SketchPlugin_Trim::getEdgeAttributes(
-// const std::shared_ptr<ModelAPI_Feature>& theFeature)
-//{
-// std::set<std::shared_ptr<ModelAPI_Attribute> > 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<ModelAPI_Feature>& 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<AttributePtr> anAttrs = theFeature->data()->attributes(
-// ModelAPI_AttributeRefAttr::typeId());
-// std::list<AttributePtr>::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<ModelAPI_AttributeRefAttr> aRefAttr =
-// std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(anAttr);
-// if (aRefAttr.get()) {
-// if (aRefAttr->isObject()) {
-// FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->object());
-// aValue = "<object:>" + getFeatureInfo(aFeature, false);
-// }
-// else {
-// AttributePtr anAttribute = aRefAttr->attr();
-// if (anAttribute.get()) {
-// FeaturePtr aFeature = ModelAPI_Feature::feature(anAttribute->owner());
-// aValue = "<attr:>" + 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
{
PointToRefsMap aPointsInfo;
std::set<std::shared_ptr<GeomAPI_Shape> > aShapes;
- //std::map<AttributePoint2DPtr, std::shared_ptr<GeomAPI_Pnt> > aPointToAttributes;
std::map<std::shared_ptr<GeomAPI_Pnt>,
std::list< AttributePoint2DPtr > > aPointToAttributes;
std::map<std::shared_ptr<GeomAPI_Pnt>,
GeomShapePtr aFeatureShape = (*anEdgeShapes.begin())->shape();
// coincidences to the feature
- //std::list<std::shared_ptr<GeomAPI_Pnt> > 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<ModelAPI_Data> aData = aSketch->data();
std::shared_ptr<GeomDataAPI_Point> aC = std::dynamic_pointer_cast<GeomDataAPI_Point>(
std::shared_ptr<GeomAPI_Dir> 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()) {
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;
}
//********************************************************************
/** \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
{
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();
/// \brief Use plugin manager for features creation
SketchPlugin_Trim();
- /// \return map of base points and features;
- //SKETCHPLUGIN_EXPORT const std::map<AttributePtr, FilletFeatures> pointsFeaturesMap() const {
- // return myPointFeaturesMap;
- //};
-
/// Returns the AIS preview
SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious);
std::shared_ptr<GeomDataAPI_Point2D>& theStartPointAttr,
std::shared_ptr<GeomDataAPI_Point2D>& 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<GeomDataAPI_Point2D> 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<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToDelete,
- std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToUpdate);//,
- //std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
- //std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature/*,
- //std::map<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToPoint*/);
+ std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToUpdate);
/// Obtains references to feature point attributes and to feature,
/// e.g. for feature line: 1st container is
std::map<AttributePtr, std::list<AttributePtr> >& theRefs,
std::list<AttributePtr>& 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<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theCoincidenceToFeature,
-// const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences,
-// const std::set<ResultPtr>& 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<std::shared_ptr<ModelAPI_Feature>, IdToPointPair>& theTangentFeatures,
-// const std::set<std::shared_ptr<GeomDataAPI_Point2D> >& theFurtherCoincidences);
-
/// Move constraints from base feature to given feature
/// \param theFeature a base feature
/// \param theRefsToFeature list of attributes referenced to base feature
/// at the same place
void updateRefAttConstraints(
const std::map<AttributePtr, std::list<AttributePtr> >& theBaseRefAttributes,
- const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes);
+ const std::set<std::pair<AttributePtr, AttributePtr> >& theModifiedAttributes,
+ std::set<std::shared_ptr<ModelAPI_Feature>>& theFeaturesToDelete);
// /// Make the base object is splitted by the point attributes
// /// \param theSplitFeature a result split feature
// /// \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<ModelAPI_Feature>& theSplitFeature,
-// std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
-// std::shared_ptr<ModelAPI_Feature>& theAfterFeature,
-// std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
-// std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
-// std::set<std::pair<AttributePtr, AttributePtr>>& 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<ModelAPI_Feature>& theSplitFeature,
-// std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
-// std::shared_ptr<ModelAPI_Feature>& theAfterFeature,
-// std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
-// std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
-// std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes);
+ void trimLine(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+ std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
+ std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
+ std::set<std::pair<AttributePtr, AttributePtr>>& 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<GeomAPI_Pnt2d>& theStartShapePoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
+ std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
+ std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
+ std::set<std::pair<AttributePtr, AttributePtr>>& theModifiedAttributes);
/// Make the base object is splitted by the point attributes
/// \param theSplitFeature a result split feature
/// \param theCreatedFeatures a container of created features
void trimCircle(const std::shared_ptr<GeomAPI_Pnt2d>& theStartShapePoint,
const std::shared_ptr<GeomAPI_Pnt2d>& theLastShapePoint,
- /*std::shared_ptr<ModelAPI_Feature>& theSplitFeature,
- std::shared_ptr<ModelAPI_Feature>& theBeforeFeature,
- std::shared_ptr<ModelAPI_Feature>& theAfterFeature,*/
std::set<std::shared_ptr<GeomDataAPI_Point2D> >& thePoints,
std::set<std::shared_ptr<ModelAPI_Feature>>& theCreatedFeatures,
std::set<std::pair<AttributePtr, AttributePtr>>& 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<GeomDataAPI_Point2D>& theStartPointAttr,
const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
- std::shared_ptr<GeomDataAPI_Point2D>& theFirstPointAttr,
- std::shared_ptr<GeomDataAPI_Point2D>& 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<GeomDataAPI_Point2D>& theStartPointAttr,
-// const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
-// std::shared_ptr<GeomDataAPI_Point2D>& theFirstPointAttr,
-// std::shared_ptr<GeomDataAPI_Point2D>& theSecondPointAttr) const;
+ std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+ std::shared_ptr<GeomAPI_Pnt2d>& 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<GeomDataAPI_Point2D>& theStartPointAttr,
+ const std::shared_ptr<GeomDataAPI_Point2D>& theEndPointAttr,
+ std::shared_ptr<GeomAPI_Pnt2d>& theFirstPoint,
+ std::shared_ptr<GeomAPI_Pnt2d>& 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
void fillPointAttribute(const AttributePtr& theModifiedAttribute,
const std::shared_ptr<GeomAPI_Pnt2d>& 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<GeomAPI_Pnt2d>& theFirstPoint,
+ const std::shared_ptr<GeomAPI_Pnt2d>& 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
const std::shared_ptr<ModelAPI_Attribute>& theFirstAttribute,
const std::shared_ptr<ModelAPI_Object>& 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<ModelAPI_Feature> createConstraintForObjects(const std::string& theConstraintId,
-// const std::shared_ptr<ModelAPI_Object>& theFirstObject,
-// const std::shared_ptr<ModelAPI_Object>& theSecondObject);
-//
-// /// Add feature coincidence constraint between given attributes
-// /// \param theFeaturesToUpdate a constraint index
-// void updateFeaturesAfterSplit(const std::set<FeaturePtr>& 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<ModelAPI_Feature> createConstraintForObjects(const std::string& theConstraintId,
+ const std::shared_ptr<ModelAPI_Object>& theFirstObject,
+ const std::shared_ptr<ModelAPI_Object>& 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<ModelAPI_Result> getFeatureResult(
const std::shared_ptr<ModelAPI_Feature>& 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<std::shared_ptr<ModelAPI_Attribute> > getEdgeAttributes(
-// const std::shared_ptr<ModelAPI_Feature>& 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<ModelAPI_Feature>& theFeature,
-// const bool isUseAttributesInfo = true);
-//#endif
-
private:
bool useGraphicIntersection() const;
std::shared_ptr<GeomAPI_Pnt2d> convertPoint(const std::shared_ptr<GeomAPI_Pnt>& thePoint);
private:
- //std::shared_ptr<ModuleBase_ViewerPrs> myCurrentSubShape;
std::map<ObjectPtr, std::set<GeomShapePtr> > myCashedShapes;
- //typedef std::map<std::shared_ptr<GeomDataAPI_Point2D>,
- // std::shared_ptr<GeomAPI_Pnt> > PntToAttributesMap;
- //std::map<ObjectPtr, PntToAttributesMap> myCashedReferences;
-
typedef std::map<std::shared_ptr<GeomAPI_Pnt>,
std::pair<std::list<std::shared_ptr<GeomDataAPI_Point2D> >,
std::list<std::shared_ptr<ModelAPI_Object> > > > PointToRefsMap;