#include <ModelAPI_Feature.h>
#include <ModelAPI_ResultBody.h>
#include <ModelAPI_ResultConstruction.h>
+#include <ModelAPI_ResultPart.h>
#include <ModelAPI_CompositeFeature.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_PlanarEdges.h>
static const int kSTART_VERTEX_DELTA = 1000000;
// identifier that there is simple reference: selection equals to context
Standard_GUID kSIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb29");
+// simple reference in the construction
Standard_GUID kCONSTUCTION_SIMPLE_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb28");
+// reference to Part sub-object
+Standard_GUID kPART_REF_ID("635eacb2-a1d6-4dec-8348-471fae17cb27");
// on this label is stored:
// TNaming_NamedShape - selected shape
// TDataStd_IntPackedMap - indexes of edges in composite element (for construction)
// TDataStd_Integer - type of the selected shape (for construction)
// TDF_Reference - from ReferenceAttribute, the context
-#define DDDD 1
void Model_AttributeSelection::setValue(const ResultPtr& theContext,
const std::shared_ptr<GeomAPI_Shape>& theSubShape)
{
}
if (theContext->groupName() == ModelAPI_ResultBody::group()) {
// do not select the whole shape for body:it is already must be in the data framework
- if (theContext->shape().get() && theContext->shape()->isEqual(theSubShape)) {
+ // equal and null selected objects mean the same: object is equal to context,
+ // TODO: synchronize with GUI later that it must be null always
+ if (theContext->shape().get() &&
+ (theContext->shape()->isEqual(theSubShape) || !theSubShape.get())) {
aSelLab.ForgetAllAttributes(true);
TDataStd_UAttribute::Set(aSelLab, kSIMPLE_REF_ID);
} else {
} else {
selectConstruction(theContext, theSubShape);
}
+ } else if (theContext->groupName() == ModelAPI_ResultPart::group()) {
+ aSelLab.ForgetAllAttributes(true);
+ TDataStd_UAttribute::Set(aSelLab, kPART_REF_ID);
+ selectPart(theContext, theSubShape);
}
//the attribute initialized state should be changed by sendAttributeUpdated only
//myIsInitialized = true;
std::string aSelName = namingName();
if(!aSelName.empty())
TDataStd_Name::Set(selectionLabel(), aSelName.c_str()); //set name
-#ifdef DDDD
- //####
- //selectSubShape("FACE", "Extrusion_1/LateralFace_3");
- //selectSubShape("FACE", "Extrusion_1/TopFace");
- //selectSubShape("EDGE", "Extrusion_1/TopFace|Extrusion_1/LateralFace_1");
- //selectSubShape("EDGE", "Sketch_1/Edge_6");
-#endif
}
std::shared_ptr<GeomAPI_Shape> Model_AttributeSelection::value()
if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value
return aResult; // empty result
}
+ if (aSelLab.IsAttribute(kPART_REF_ID)) {
+ /* TODO: implement used text here
+ ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(context());
+ if (!aPart.get() || !aPart->isActivated())
+ 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
+ }
+ return aPart->shapeInPart(TCollection_AsciiString(aName).ToCString());
+ */
+ }
Handle(TNaming_NamedShape) aSelection;
if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) {
TDF_Label aSelLab = selectionLabel();
if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape
ResultPtr aContext = context();
- if (!aContext.get())
- return false;
+ return aContext.get();
}
if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value
return true;
return 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 selectPart(aContext, aNoSelection, true);
+ }
+
if (aContext->groupName() == ModelAPI_ResultBody::group()) {
// body: just a named shape, use selection mechanism from OCCT
TNaming_Selector aSelector(aSelLab);
registerSubShape(selectionLabel(), aSubShape, 0, aContextFeature, aMyDoc, "", aRefs);
}
+bool Model_AttributeSelection::selectPart(
+ const ResultPtr& theContext, const std::shared_ptr<GeomAPI_Shape>& theSubShape,
+ const bool theUpdate)
+{
+ ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(theContext);
+ if (!aPart.get() || !aPart->isActivated())
+ return true; // postponed naming
+ if (theUpdate) {
+ Handle(TDataStd_Integer) anIndex;
+ if (selectionLabel().FindAttribute(TDataStd_Integer::GetID(), anIndex)) { // by internal selection
+ if (anIndex->Get() > 0) {
+ // update the selection by index
+ return aPart->updateInPart(anIndex->Get());
+ } else {
+ return true; // nothing to do, referencing just by name
+ }
+ }
+ return true; // nothing to do, referencing just by name
+ }
+ // store the shape (in case part is not loaded it should be usefull
+ TopoDS_Shape aShape;
+ std::string aName = theContext->data()->name();
+ if (theSubShape->isNull()) {// the whole part shape is selected
+ aShape = theContext->shape()->impl<TopoDS_Shape>();
+ } else {
+ aShape = theSubShape->impl<TopoDS_Shape>();
+ int anIndex;
+ aName += "/" + aPart->nameInPart(theSubShape, anIndex);
+ TDataStd_Integer::Set(selectionLabel(), anIndex);
+ }
+ TNaming_Builder aBuilder(selectionLabel());
+ aBuilder.Select(aShape, aShape);
+ // identify by name in the part
+ TDataStd_Name::Set(selectionLabel(), aName.c_str());
+ return !aName.empty();
+}
+
TDF_Label Model_AttributeSelection::selectionLabel()
{
return myRef.myRef->Label().FindChild(1);