#include <ModelAPI_Tools.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_PlanarEdges.h>
-#include <Events_Error.h>
+#include <Events_InfoMessage.h>
#include <TNaming_Selector.hxx>
#include <TNaming_NamedShape.hxx>
(theSubShape == anOldShape || (theSubShape && anOldShape && theSubShape->isEqual(anOldShape)));
if (isOldShape) return; // shape is the same, so context is also unchanged
// update the referenced object if needed
- if (!isOldContext)
- myRef.setValue(theContext);
+ if (!isOldContext) {
+ myRef.setValue(theContext);
+ }
// do noth use naming if selected shape is result shape itself, but not sub-shape
TDF_Label aSelLab = selectionLabel();
std::shared_ptr<GeomAPI_Shape> Model_AttributeSelection::value()
{
+ GeomShapePtr aResult;
if (myTmpContext.get() || myTmpSubShape.get()) {
- return myTmpSubShape;
+ ResultConstructionPtr aResulConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(myTmpContext);
+ if(aResulConstruction.get()) {
+ // it is just reference to construction.
+ return myTmpSubShape;
+ }
+ return myTmpSubShape.get() ? myTmpSubShape : myTmpContext->shape();
}
- std::shared_ptr<GeomAPI_Shape> aResult;
TDF_Label aSelLab = selectionLabel();
if (aSelLab.IsAttribute(kINVALID_SELECTION))
return aResult;
return std::shared_ptr<GeomAPI_Shape>(); // postponed naming needed
Handle(TDataStd_Integer) anIndex;
if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) {
- return aPart->selectionValue(anIndex->Get());
- }
- /*
- Handle(TDataStd_Name) aName;
- if (!selectionLabel().FindAttribute(TDataStd_Name::GetID(), aName)) {
- return std::shared_ptr<GeomAPI_Shape>(); // something is wrong
+ if (anIndex->Get()) { // special selection attribute was created, use it
+ return aPart->selectionValue(anIndex->Get());
+ } else { // face with name is already in the data model, so try to take it by name
+ Handle(TDataStd_Name) aName;
+ if (selectionLabel().FindAttribute(TDataStd_Name::GetID(), aName)) {
+ std::string aSubShapeName(TCollection_AsciiString(aName->Get()).ToCString());
+ std::size_t aPartEnd = aSubShapeName.find('/');
+ if (aPartEnd != string::npos && aPartEnd != aSubShapeName.rfind('/')) {
+ string aNameInPart = aSubShapeName.substr(aPartEnd + 1);
+ int anIndex;
+ std::string aType; // to reuse already existing selection the type is not needed
+ return aPart->shapeInPart(aNameInPart, aType, anIndex);
+ }
+ }
+ }
}
- return aPart->shapeInPart(TCollection_AsciiString(aName->Get()).ToCString());
- */
}
Handle(TNaming_NamedShape) aSelection;
aCompositeOwnerOwner = ModelAPI_Tools::compositeOwner(aCompositeOwner);
}
}
+ // for group Scope is not limitet: this is always up to date objects
+ bool isGroup = aFeature.get() && aFeature->getKind() == "Group";
for(; aFIter != allFeatures.end(); aFIter++) {
if (*aFIter == owner()) { // the left features are created later (except subs of composite)
aMePassed = true;
continue;
}
+ if (isGroup) aMePassed = false;
bool isInScope = !aMePassed;
if (!isInScope && aComposite.get()) { // try to add sub-elements of composite if this is composite
if (aComposite->isSub(*aFIter))
std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
aShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aComp));
selectConstruction(aContext, aShape);
+ } else {
+ // For correct naming selection, put the shape into the naming structure.
+ // It seems sub-shapes are not needed: only this shape is (and can be ) selected.
+ TNaming_Builder aBuilder(aSelLab);
+ aBuilder.Generated(aContext->shape()->impl<TopoDS_Shape>());
+ std::shared_ptr<Model_Document> aMyDoc =
+ std::dynamic_pointer_cast<Model_Document>(owner()->document());
+ std::string aName = aContext->data()->name();
+ aMyDoc->addNamingName(aSelLab, aName);
+ TDataStd_Name::Set(aSelLab, aName.c_str());
}
return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull());
}
if (aSelLab.IsAttribute(kPART_REF_ID)) { // it is reference to the part object
std::shared_ptr<GeomAPI_Shape> aNoSelection;
- return setInvalidIfFalse(aSelLab, selectPart(aContext, aNoSelection, true));
+ bool aResult = selectPart(aContext, aNoSelection, true);
+ aResult = setInvalidIfFalse(aSelLab, aResult);
+ if (aResult) {
+ owner()->data()->sendAttributeUpdated(this);
+ }
+ return aResult;
}
if (aContext->groupName() == ModelAPI_ResultBody::group()) {
// body: just a named shape, use selection mechanism from OCCT
TNaming_Selector aSelector(aSelLab);
bool aResult = aSelector.Solve(scope()) == Standard_True;
+ aResult = setInvalidIfFalse(aSelLab, aResult); // must be before sending of updated attribute (1556)
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, aResult);
+ return aResult;
} else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) {
// construction: identification by the results indexes, recompute faces and
// take the face that more close by the indexes
return setInvalidIfFalse(aSelLab, false);
}
- if (aShapeType == TopAbs_FACE) { // compound is for the whole sketch selection
- // If this is a wire with plane defined thin it is a sketch-like object
+ if (aShapeType == TopAbs_FACE || aShapeType == TopAbs_WIRE) { // compound is for the whole sketch selection
+ // If this is a wire with plane defined then it is a sketch-like object
if (!aConstructionContext->facesNum()) // no faces, update can not work correctly
return setInvalidIfFalse(aSelLab, false);
// if there is no edges indexes, any face can be used: take the first
}
}
if (aNewSelected) { // store this new selection
+ if (aShapeType == TopAbs_WIRE) { // just get a wire from face to have wire
+ TopExp_Explorer aWireExp(aNewSelected->impl<TopoDS_Shape>(), TopAbs_WIRE);
+ if (aWireExp.More()) {
+ aNewSelected.reset(new GeomAPI_Shape);
+ aNewSelected->setImpl<TopoDS_Shape>(new TopoDS_Shape(aWireExp.Current()));
+ }
+ }
selectConstruction(aContext, aNewSelected);
+ setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, true);
+ return true;
} else { // if the selection is not found, put the empty shape: it's better to have disappeared shape, than the old, the lost one
TNaming_Builder anEmptyBuilder(selectionLabel());
return setInvalidIfFalse(aSelLab, false);
std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(*aResIter);
if (aRes && aRes->shape() && aRes->shape()->isEdge()) { // found!
selectConstruction(aContext, aRes->shape());
+ setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, true);
+ return true;
}
}
}
if (aRes && aRes->shape()) {
if (aRes->shape()->isVertex() && aVertexNum == 0) { // found!
selectConstruction(aContext, aRes->shape());
+ setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, true);
+ return true;
} else if (aRes->shape()->isEdge() && aVertexNum > 0) {
const TopoDS_Shape& anEdge = aRes->shape()->impl<TopoDS_Shape>();
int aVIndex = 1;
std::shared_ptr<GeomAPI_Shape> aVertex(new GeomAPI_Shape);
aVertex->setImpl(new TopoDS_Shape(aVExp.Current()));
selectConstruction(aContext, aVertex);
+ setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, true);
+ return true;
}
aVIndex++;
}
}
} else { // simple construction element: the selected is that needed
selectConstruction(aContext, aContext->shape());
+ setInvalidIfFalse(aSelLab, true);
owner()->data()->sendAttributeUpdated(this);
- return setInvalidIfFalse(aSelLab, true);
+ return true;
}
}
return setInvalidIfFalse(aSelLab, false); // unknown case
if (aResult) {
aContext = aResult->shape()->impl<TopoDS_Shape>();
} else {
- Events_Error::send("A result with shape is expected");
+ Events_InfoMessage("Model_AttributeSelection", "A result with shape is expected").send();
return;
}
}
if (!theAdditionalName.empty())
aName<<theAdditionalName<<"/";
if (theShape.ShapeType() == TopAbs_FACE) aName<<"Face";
+ else if (theShape.ShapeType() == TopAbs_WIRE) aName<<"Wire";
else if (theShape.ShapeType() == TopAbs_EDGE) aName<<"Edge";
else if (theShape.ShapeType() == TopAbs_VERTEX) aName<<"Vertex";
int Model_AttributeSelection::Id()
{
+ int anID = 0;
std::shared_ptr<GeomAPI_Shape> aSelection = value();
std::shared_ptr<GeomAPI_Shape> aContext = context()->shape();
- const TopoDS_Shape& aMainShape = aContext->impl<TopoDS_Shape>();
+ // support for compsolids:
+ if (context().get() && ModelAPI_Tools::compSolidOwner(context()).get())
+ aContext = ModelAPI_Tools::compSolidOwner(context())->shape();
+
+
+ TopoDS_Shape aMainShape = aContext->impl<TopoDS_Shape>();
const TopoDS_Shape& aSubShape = aSelection->impl<TopoDS_Shape>();
- int anID = 0;
+ // searching for the latest main shape
if (aSelection && !aSelection->isNull() &&
aContext && !aContext->isNull())
{
+ std::shared_ptr<Model_Document> aDoc =
+ std::dynamic_pointer_cast<Model_Document>(context()->document());
+ if (aDoc.get()) {
+ Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aMainShape, aDoc->generalLabel());
+ if (!aNS.IsNull()) {
+ aMainShape = TNaming_Tool::CurrentShape(aNS);
+ }
+ }
+
TopTools_IndexedMapOfShape aSubShapesMap;
TopExp::MapShapes(aMainShape, aSubShapesMap);
anID = aSubShapesMap.FindIndex(aSubShape);
}
return anID;
}
+
+void Model_AttributeSelection::setId(int theID)
+{
+ const ResultPtr& aContext = context();
+ std::shared_ptr<GeomAPI_Shape> aSelection;
+
+ std::shared_ptr<GeomAPI_Shape> aContextShape = aContext->shape();
+ // support for compsolids:
+ if (aContext.get() && ModelAPI_Tools::compSolidOwner(aContext).get())
+ aContextShape = ModelAPI_Tools::compSolidOwner(aContext)->shape();
+
+ TopoDS_Shape aMainShape = aContextShape->impl<TopoDS_Shape>();
+ // searching for the latest main shape
+ if (theID > 0 &&
+ aContextShape && !aContextShape->isNull())
+ {
+ std::shared_ptr<Model_Document> aDoc =
+ std::dynamic_pointer_cast<Model_Document>(aContext->document());
+ if (aDoc.get()) {
+ Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aMainShape, aDoc->generalLabel());
+ if (!aNS.IsNull()) {
+ aMainShape = TNaming_Tool::CurrentShape(aNS);
+ }
+ }
+
+ TopTools_IndexedMapOfShape aSubShapesMap;
+ TopExp::MapShapes(aMainShape, aSubShapesMap);
+ const TopoDS_Shape& aSelShape = aSubShapesMap.FindKey(theID);
+
+ std::shared_ptr<GeomAPI_Shape> aResult(new GeomAPI_Shape);
+ aResult->setImpl(new TopoDS_Shape(aSelShape));
+
+ aSelection = aResult;
+ }
+
+ setValue(aContext, aSelection);
+}
+