#include <AIS_InteractiveContext.hxx>
-#include <SelectMgr_Selection.hxx>
-#include <SelectMgr_EntityOwner.hxx>
-
-#include <SelectBasics_SensitiveEntity.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <StdSelect_BRepOwner.hxx>
{
}
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected() const
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(const SelectionPlace& thePlace) const
{
- QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
-
QList<ModuleBase_ViewerPrs> aPresentations;
- XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+ switch (thePlace) {
+ case Browser:
+ getSelectedInBrowser(aPresentations);
+ break;
+ case Viewer:
+ getSelectedInViewer(aPresentations);
+ break;
+ case AllControls:
+ getSelectedInViewer(aPresentations);
+ getSelectedInBrowser(aPresentations);
+ break;
+ }
+ return aPresentations;
+}
+
+Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& thePrs)
+{
+ Handle(AIS_InteractiveObject) anIO = thePrs.interactive();
+ if (anIO.IsNull()) {
+ Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner();
+ if (!anOwner.IsNull())
+ anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
+
+ if (anIO.IsNull() && thePrs.object()) {
+ XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+ AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs.object());
+ if (anAISObject.get())
+ anIO = anAISObject->impl<Handle(AIS_InteractiveObject)>();
+ }
+ }
+ return anIO;
+}
+
+void XGUI_Selection::getSelectedInViewer(QList<ModuleBase_ViewerPrs>& thePresentations) const
+{
Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
if (aContext.IsNull())
- return aPresentations;
+ return;
if (aContext->HasOpenedContext()) {
+ QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
ModuleBase_ViewerPrs aPrs;
Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
fillPresentation(aPrs, anOwner);
- aPresentations.append(aPrs);
+ if (!thePresentations.contains(aPrs)) // TODO: check whether the presentation in a list
+ thePresentations.append(aPrs);
}
}
- /* else {
- for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) {
- ModuleBase_ViewerPrs aPrs;
- Handle(AIS_InteractiveObject) anIO = aContext->Current();
- if (aSelectedIds.contains((long)anIO.Access()))
- continue;
-
- aSelectedIds.append((long)anIO.Access());
- aPrs.setInteractive(anIO);
+}
+
+void XGUI_Selection::getSelectedInBrowser(QList<ModuleBase_ViewerPrs>& thePresentations) const
+{
+ // collect the objects of the parameter presentation to avoid a repeted objects in the result
+ QObjectPtrList aPresentationObjects;
+ QList<ModuleBase_ViewerPrs>::const_iterator aPrsIt = thePresentations.begin(),
+ aPrsLast = thePresentations.end();
+ for (; aPrsIt != aPrsLast; aPrsIt++) {
+ aPresentationObjects.push_back((*aPrsIt).object());
+ }
- ObjectPtr aFeature = aDisplayer->getObject(anIO);
- aPrs.setFeature(aFeature);
- aPresentations.append(aPrs);
+ QObjectPtrList anObjects = selectedObjects();
+ QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end();
+ for (; anIt != aLast; anIt++) {
+ ObjectPtr anObject = *anIt;
+ if (anObject.get() != NULL && !aPresentationObjects.contains(anObject)) {
+ thePresentations.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
}
- }*/
- return aPresentations;
+ }
}
void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
// we should not check the appearance of this feature because there can be some selected shapes
// for one feature
Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
- if( !aBRO.IsNull() ) {
+ if( !aBRO.IsNull() && aBRO->HasShape() ) {
// the located method is called in the context to obtain the shape by the SelectedShape() method,
// so the shape is located by the same rules
TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
XGUI_Displayer* aDisplayer = myWorkshop->displayer();
ObjectPtr aFeature = aDisplayer->getObject(anIO);
- thePrs.setFeature(aFeature);
+ thePrs.setObject(aFeature);
}
QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted() const
ObjectPtr aResult = aDisplayer->getObject(anIO);
// we should not check the appearance of this feature because there can be some selected shapes
// for one feature
- aPrs.setFeature(aResult);
+ aPrs.setObject(aResult);
if (aContext->HasOpenedContext()) {
TopoDS_Shape aShape = aContext->DetectedShape();
if (!aShape.IsNull())
return myWorkshop->objectBrowser()->selectedObjects();
}
+void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const
+{
+ return myWorkshop->objectBrowser()->setObjectsSelected( theObjects );
+}
+
QObjectPtrList XGUI_Selection::selectedPresentations() const
{
QObjectPtrList aSelectedList;
theList.Append(aContext->SelectedInteractive());
}
+//**************************************************************
+ObjectPtr XGUI_Selection::getSelectableObject(const Handle(SelectMgr_EntityOwner)& theOwner) const
+{
+ ObjectPtr anObject;
+
+ Handle(SelectMgr_EntityOwner) aEO = theOwner;
+ if (!aEO.IsNull()) {
+ Handle(AIS_InteractiveObject) anObj =
+ Handle(AIS_InteractiveObject)::DownCast(aEO->Selectable());
+ anObject = myWorkshop->displayer()->getObject(anObj);
+ }
+ return anObject;
+}
+
//**************************************************************
void XGUI_Selection::selectedShapes(NCollection_List<TopoDS_Shape>& theList,
std::list<ObjectPtr>& theOwners) const
Handle(SelectMgr_Selection) aSelection = theObject->Selection(aMode);
for (aSelection->Init(); aSelection->More(); aSelection->Next()) {
- Handle(SelectBasics_SensitiveEntity) anEntity = aSelection->Sensitive();
+ Handle(SelectMgr_SensitiveEntity) anEntity = aSelection->Sensitive();
if (anEntity.IsNull())
continue;
Handle(SelectMgr_EntityOwner) anOwner =
- Handle(SelectMgr_EntityOwner)::DownCast(anEntity->OwnerId());
+ Handle(SelectMgr_EntityOwner)::DownCast(anEntity->BaseSensitive()->OwnerId());
if (!anOwner.IsNull())
theOwners.Add(anOwner);
}