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
+ 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).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))
}
}
}
- double aBestFound = 0; // best percentage of found edges
+ int aBestFound = 0; // best number of found edges (not percentage: issue 1019)
int aBestOrient = 0; // for the equal "BestFound" additional parameter is orientation
for(int aFaceIndex = 0; aFaceIndex < aConstructionContext->facesNum(); aFaceIndex++) {
int aFound = 0, aNotFound = 0, aSameOrientation = 0;
}
}
if (aFound + aNotFound != 0) {
- double aSum = aFound + aNotFound;
- // aSameOrientation: if edges are same, take where orientation is better
- double aPercentage = double(aFound) / double(aFound + aNotFound);
- if (aPercentage > aBestFound ||
- (aPercentage == aBestFound && aSameOrientation > aBestOrient)) {
- aBestFound = aPercentage;
+ if (aFound > aBestFound ||
+ (aFound == aBestFound && aSameOrientation > aBestOrient)) {
+ aBestFound = aFound;
aBestOrient = aSameOrientation;
aNewSelected = aConstructionContext->face(aFaceIndex);
}
{
if(theSubShapeName.empty() || theType.empty()) return;
+ // check this is Part-name: 2 delimiters in the name
+ std::size_t aPartEnd = theSubShapeName.find('/');
+ if (aPartEnd != string::npos && aPartEnd != theSubShapeName.rfind('/')) {
+ std::string aPartName = theSubShapeName.substr(0, aPartEnd);
+ ObjectPtr aFound = owner()->document()->objectByName(ModelAPI_ResultPart::group(), aPartName);
+ if (aFound.get()) { // found such part, so asking it for the name
+ ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aFound);
+ string aNameInPart = theSubShapeName.substr(aPartEnd + 1);
+ int anIndex;
+ std::shared_ptr<GeomAPI_Shape> aSelected = aPart->shapeInPart(aNameInPart, theType, anIndex);
+ if (aSelected.get()) {
+ setValue(aPart, aSelected);
+ TDataStd_Integer::Set(selectionLabel(), anIndex);
+ return;
+ }
+ }
+ }
+
Model_SelectionNaming aSelNaming(selectionLabel());
std::shared_ptr<Model_Document> aDoc =
std::dynamic_pointer_cast<Model_Document>(owner()->document());
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>();
+ 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);