+QString activeOwners(Handle(AIS_InteractiveContext)& theContext, const bool theShapeInfoOnly = true)
+{
+ if (theContext.IsNull())
+ return "";
+ Handle(AIS_LocalContext) aLContext = theContext->LocalContext();
+ TCollection_AsciiString aSelectionName = aLContext->SelectionName();
+ aLContext->UnhilightPicked(Standard_False);
+
+ NCollection_List<Handle(SelectBasics_EntityOwner)> anActiveOwners;
+ aLContext->MainSelector()->ActiveOwners(anActiveOwners);
+ NCollection_List<Handle(SelectBasics_EntityOwner)>::Iterator anOwnersIt (anActiveOwners);
+ Handle(SelectMgr_EntityOwner) anOwner;
+ QStringList anObjects;
+ for (; anOwnersIt.More(); anOwnersIt.Next()) {
+ anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anOwnersIt.Value());
+ Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner);
+ if (theShapeInfoOnly && BROwnr.IsNull())
+ continue;
+
+ QString anInfo = "Owner";
+ std::ostringstream aPtrStr;
+ aPtrStr << "[" << anOwner.Access() << "]";
+ anInfo += aPtrStr.str().c_str();
+
+ Handle(AIS_InteractiveObject) aAISObj =
+ Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
+ if (!aAISObj.IsNull()) {
+ std::ostringstream aPtrStr;
+ aPtrStr << "[" << aAISObj.Access() << "]";
+ anInfo += QString(", selectable(IO): %1").arg(aPtrStr.str().c_str());
+ }
+
+ if (!BROwnr.IsNull() && BROwnr->HasShape()) {
+ const TopoDS_Shape& aShape = BROwnr->Shape();
+ if (aShape.IsNull()) {
+ //Events_Error::throwException("An empty AIS presentation");
+ }
+ else
+ anInfo += QString(", shape type: %1").arg(getShapeTypeInfo(aShape.ShapeType()));
+ }
+ anObjects += anInfo;
+ }
+ QString aValue = QString("activeOwners[%1]").arg(anObjects.size());
+ if (anObjects.size() > 0)
+ aValue += QString(":\n %1").arg(anObjects.join("\n "));
+ return aValue;
+}
+
+QString selectedOwners(Handle(AIS_InteractiveContext)& theContext,
+ const bool theShapeInfoOnly = true)
+{
+ QStringList anObjects;
+ if (theContext.IsNull())
+ return "";
+
+ QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
+ for (theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected()) {
+ Handle(SelectMgr_EntityOwner) anOwner = theContext->SelectedOwner();
+ Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner);
+ if (theShapeInfoOnly && BROwnr.IsNull())
+ continue;
+
+ if (aSelectedIds.contains((long)anOwner.Access()))
+ continue;
+ aSelectedIds.append((long)anOwner.Access());
+
+ QString anInfo = "Owner";
+ std::ostringstream aPtrStr;
+ aPtrStr << "[" << anOwner.Access() << "]";
+ anInfo += aPtrStr.str().c_str();
+
+ if (!BROwnr.IsNull() && BROwnr->HasShape()) {
+ const TopoDS_Shape& aShape = BROwnr->Shape();
+ anInfo += QString(", shape type = %1").arg(getShapeTypeInfo(aShape.ShapeType()));
+ }
+ anObjects += anInfo;
+ }
+ QString aValue = QString("selectedOwners[%1]").arg(anObjects.size());
+ if (anObjects.size() > 0)
+ aValue += QString(":\n %1").arg(anObjects.join("\n "));
+ return aValue;
+}
+#endif
+
+void selectionInfo(Handle(AIS_InteractiveContext)& theContext, const std::string& thePrefix)
+{
+#ifdef DEBUG_SELECTION_INFO
+ QString aValue = QString("\n\n\nDEBUG_SELECTION_INFO for '%1'\n%2\n%3\n%4")
+ .arg(thePrefix.c_str())
+ .arg(displayedInteractiveObjects(theContext))
+ .arg(activeOwners(theContext))
+ .arg(selectedOwners(theContext));
+ qDebug(aValue.toStdString().c_str());
+#endif