#include <QGridLayout>
#include <QListWidget>
#include <QMainWindow>
+#include <QTimer>
static const int LayoutMargin = 3;
return theGroupFeature.get() && theResGroup.get();
}
+//********************************************************************
+void updateHiddenShapes(Handle(ModuleBase_ResultPrs) thePrs, const TopoDS_ListOfShape& theShapes)
+{
+ TopoDS_ListOfShape aAlreadyHidden = thePrs->hiddenSubShapes();
+ TopoDS_ListOfShape::Iterator aShPIt(theShapes);
+ for (; aShPIt.More(); aShPIt.Next()) {
+ if (aAlreadyHidden.Contains(aShPIt.Value()))
+ aAlreadyHidden.Remove(aShPIt.Value());
+ }
+ thePrs->setSubShapeHidden(aAlreadyHidden);
+}
+
//********************************************************************
XGUI_FacesPanel::XGUI_FacesPanel(QWidget* theParent, XGUI_Workshop* theWorkshop)
: QDockWidget(theParent), myIsActive(false), myWorkshop(theWorkshop)
myListView->getControl()->setFocusPolicy(Qt::StrongFocus);
myListView->getControl()->viewport()->installEventFilter(this);
+
+ XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+ connect(aDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)),
+ SLOT(onObjectDisplay(ObjectPtr, AISObjectPtr)));
}
//********************************************************************
std::map<ObjectPtr, TopoDS_ListOfShape> anObjectToShapes;
std::map<ObjectPtr, Handle(ModuleBase_ResultPrs) > anObjectToPrs;
- QMap<int, std::shared_ptr<ModuleBase_ViewerPrs> >::const_iterator aIt;
+ QMap<int, ModuleBase_ViewerPrsPtr >::const_iterator aIt;
for (aIt = myItems.cbegin(); aIt != myItems.cend(); aIt++) {
getObjectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs);
}
aObjects.insert(aPrsIt->first);
aPrsIt->second->setSubShapeHidden(anEmpty);
}
- std::set<std::shared_ptr<ModelAPI_Object> >::const_iterator aGrpIt;
+ std::set<ObjectPtr >::const_iterator aGrpIt;
for (aGrpIt = myHiddenGroups.cbegin(); aGrpIt != myHiddenGroups.cend(); aGrpIt++)
(*aGrpIt)->setDisplayed(true);
myHiddenGroups.clear();
}
// remove from myItes container
- for (std::set<int>::const_iterator aToBeRemovedIt = anIndicesToBeRemoved.begin();
- aToBeRemovedIt != anIndicesToBeRemoved.end(); aToBeRemovedIt++)
- {
- myItems.remove(*aToBeRemovedIt);
- }
+ removeItems(anIndicesToBeRemoved);
if (!anIndicesToBeRemoved.empty()) // means that myItems has been changed
updateProcessedObjects(myItems, myItemObjects);
- myListView->removeItems(anIndicesToBeRemoved);
// remove from container of hidden objects
for (std::set<ObjectPtr>::const_iterator aHiddenIt = theHiddenObjects.begin();
void XGUI_FacesPanel::processSelection()
{
QList<ModuleBase_ViewerPrsPtr> aSelected =
- myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::AllControls);
+ myWorkshop->selector()->selection()->getSelected(ModuleBase_ISelection::Viewer);
if (aSelected.size() == 0)
return;
}
// Remove duplicate items
- if (aToRemove.size() > 0) {
- myListView->removeItems(aToRemove);
- std::set<int>::const_iterator aIntIt;
- for (aIntIt = aToRemove.cbegin(); aIntIt != aToRemove.cend(); aIntIt++)
- myItems.remove(*aIntIt);
- }
+ removeItems(aToRemove);
if (isModified) {
updateProcessedObjects(myItems, myItemObjects);
flushRedisplay();
ResultGroupPtr aResGroup;
FeaturePtr aGroupFeature;
if (getGroup((*aIt), aResGroup, aGroupFeature)) {
- std::set<std::shared_ptr<ModelAPI_Object> >::iterator aGrpIt = myHiddenGroups.find(aResGroup);
+ std::set<ObjectPtr >::iterator aGrpIt = myHiddenGroups.find(aResGroup);
if (aGrpIt != myHiddenGroups.end()) {
aResGroup->setDisplayed(true);
myHiddenGroups.erase(aGrpIt);
//********************************************************************
bool XGUI_FacesPanel::redisplayObjects(
- const std::set<std::shared_ptr<ModelAPI_Object> >& theObjects)
+ const std::set<ObjectPtr >& theObjects)
{
if (theObjects.empty())
return false;
for (QMap<int, ModuleBase_ViewerPrsPtr>::const_iterator anIt = theItems.begin();
anIt != theItems.end(); anIt++) {
ModuleBase_ViewerPrsPtr aPrs = anIt.value();
- ObjectPtr anObject = aPrs.get() ? aPrs->object() : ObjectPtr();
- if (anObject.get()) {
- ResultGroupPtr aResGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(anObject);
- if (aResGroup.get()) {
- FeaturePtr aGroupFeature = ModelAPI_Feature::feature(aResGroup);
- AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list");
- for (int i = 0; i < aSelectionList->size(); i++) {
- AttributeSelectionPtr aSelection = aSelectionList->value(i);
- ResultPtr aRes = aSelection->context();
- if (theObjects.find(aRes) == theObjects.end())
- theObjects.insert(aRes);
- }
- }
- else {
- if (theObjects.find(anObject) == theObjects.end())
- theObjects.insert(anObject);
+ ResultGroupPtr aResGroup;
+ FeaturePtr aGroupFeature;
+ if (getGroup(aPrs, aResGroup, aGroupFeature)) {
+ AttributeSelectionListPtr aSelectionList = aGroupFeature->selectionList("group_list");
+ for (int i = 0; i < aSelectionList->size(); i++) {
+ AttributeSelectionPtr aSelection = aSelectionList->value(i);
+ ResultPtr aRes = aSelection->context();
+ if (theObjects.find(aRes) == theObjects.end())
+ theObjects.insert(aRes);
}
}
+ else {
+ if (theObjects.find(aPrs->object()) == theObjects.end())
+ theObjects.insert(aPrs->object());
+ }
}
}
{
std::map<ObjectPtr, TopoDS_ListOfShape> anObjectToShapes;
std::map<ObjectPtr, Handle(ModuleBase_ResultPrs) > anObjectToPrs;
- QMap<int, std::shared_ptr<ModuleBase_ViewerPrs> >::const_iterator aIt;
+ QMap<int, ModuleBase_ViewerPrsPtr >::const_iterator aIt;
for (aIt = myItems.cbegin(); aIt != myItems.cend(); aIt++) {
getObjectsMapFromPrs(aIt.value(), anObjectToShapes, anObjectToPrs);
}
anObjectBrowser->updateAllIndexes();
myWorkshop->viewer()->update();
}
+
+
+//********************************************************************
+void XGUI_FacesPanel::onObjectDisplay(ObjectPtr theObject, AISObjectPtr theAIS)
+{
+ bool aContains = false;
+ QMap<int, ModuleBase_ViewerPrsPtr>::iterator aIt;
+ for (aIt = myItems.begin(); aIt != myItems.end(); aIt++) {
+ ModuleBase_ViewerPrsPtr aPrs = aIt.value();
+ if (aPrs->object() == theObject) {
+ aContains = true;
+ break;
+ }
+ }
+ if (aContains) {
+ ResultGroupPtr aResGroup;
+ FeaturePtr aGroupFeature;
+ std::map<ObjectPtr, TopoDS_ListOfShape> aObjectToShapes;
+ std::map<ObjectPtr, Handle(ModuleBase_ResultPrs)> aObjectToPrs;
+ std::set<ObjectPtr> aObjects;
+ std::set<int> aIdsToRem;
+
+ TopoDS_ListOfShape aHideShapes;
+ std::map<ObjectPtr, TopoDS_ListOfShape>::const_iterator aSIt;
+ for (aIt = myItems.begin(); aIt != myItems.end(); aIt++) {
+ ModuleBase_ViewerPrsPtr aPrs = aIt.value();
+ if (getGroup(aPrs, aResGroup, aGroupFeature)) {
+ getObjectsMapFromResult(aResGroup, aGroupFeature, aObjectToShapes, aObjectToPrs);
+ if (aResGroup == theObject) {
+ // If group is displayed it means that it has to be deleted from the Faces list and all
+ // corresponded faces have been restored
+ for (aSIt = aObjectToShapes.begin(); aSIt != aObjectToShapes.end(); aSIt++) {
+ TopoDS_ListOfShape aShapes = aSIt->second;
+ Handle(ModuleBase_ResultPrs) aPrs = aObjectToPrs[aSIt->first];
+ TopoDS_ListOfShape aAlreadyHidden = aPrs->hiddenSubShapes();
+ TopoDS_ListOfShape::Iterator aShPIt(aShapes);
+ for (; aShPIt.More(); aShPIt.Next()) {
+ if (aAlreadyHidden.Contains(aShPIt.Value()))
+ aAlreadyHidden.Remove(aShPIt.Value());
+ }
+ aPrs->setSubShapeHidden(aAlreadyHidden);
+ aObjects.insert(aSIt->first);
+ }
+ aIdsToRem.insert(aIt.key());
+ }
+ else {
+ std::map<ObjectPtr, Handle(ModuleBase_ResultPrs)>::iterator aPIt = aObjectToPrs.find(theObject);
+ if (aPIt != aObjectToPrs.end()) {
+ ObjectPtr aObj = aPIt->first;
+ if (aObj == theObject) {
+ Handle(ModuleBase_ResultPrs) aPrs = aPIt->second;
+ TopoDS_ListOfShape aShapes = aObjectToShapes[aObj];
+ aHideShapes.Append(aShapes);
+ aObjects.insert(aObj);
+ }
+ }
+ }
+ }
+ else {
+ if (aPrs->object() == theObject) {
+ TopoDS_Shape aShape = aPrs->shape()->impl<TopoDS_Shape>();
+ if (!aShape.IsNull())
+ aHideShapes.Append(aShape);
+ aPrs->setInteractive(theAIS->impl<Handle(AIS_InteractiveObject)>());
+ }
+ }
+ }
+ double aTransp = transparency();
+ if (aHideShapes.Size() > 0) {
+ Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast(
+ theAIS->impl<Handle(AIS_InteractiveObject)>());
+ if (!aResultPrs.IsNull()) {
+ aResultPrs->setSubShapeHidden(aHideShapes);
+ aResultPrs->setHiddenSubShapeTransparency(aTransp);
+ aObjects.insert(theObject);
+ }
+ }
+ removeItems(aIdsToRem);
+ myWorkshop->selector()->clearSelection();
+ if (redisplayObjects(aObjects))
+ QTimer::singleShot(50, this, SLOT(flushRedisplay()));
+ }
+}
+
+void XGUI_FacesPanel::removeItems(std::set<int> theIds)
+{
+ if (theIds.empty())
+ return;
+ myListView->removeItems(theIds);
+ std::set<int>::const_iterator aRIt;
+ for (aRIt = theIds.begin(); aRIt != theIds.end(); aRIt++)
+ myItems.remove(*aRIt);
+}
#include <ModelAPI_ResultGroup.h>
#include <ModelAPI_Feature.h>
+#include <GeomAPI_AISObject.h>
+
#include <SelectMgr_ListOfFilter.hxx>
#include <TopoDS_Shape.hxx>
/// Returns true if the object is in internal container of hidden objects by this panel
/// \param theObject a checked object
/// \return boolean value
- bool isObjectHiddenByPanel(const std::shared_ptr<ModelAPI_Object>& theObject) const
+ bool isObjectHiddenByPanel(const ObjectPtr& theObject) const
{ return myHiddenObjects.find(theObject) != myHiddenObjects.end(); }
/// Removed faces of the objects from the panel
/// \param container of objects
- void restoreObjects(const std::set<std::shared_ptr<ModelAPI_Object> >& theHiddenObjects);
+ void restoreObjects(const std::set<ObjectPtr >& theHiddenObjects);
/// Returns true if the event is processed. The default implementation is empty, returns false.
virtual bool processAction(ModuleBase_ActionType theActionType);
XGUI_Workshop* workshop() const { return myWorkshop; }
+public slots:
+ /// Slot called on an object erase
+ void onObjectDisplay(ObjectPtr theObject, AISObjectPtr theAIS);
protected:
/// Reimplementation to emit a signal about the panel close
/// Redisplay objects.
/// \param theObjects container of objects
/// \return true if some of objects was redisplayed
- static bool redisplayObjects(const std::set<std::shared_ptr<ModelAPI_Object> >& theObjects);
+ static bool redisplayObjects(const std::set<ObjectPtr>& theObjects);
/// Container of objects participating in the panel, it is filled by internal container
/// \param theItems container of selected values
/// \param theObjects [out] container of objects
- static void updateProcessedObjects(QMap<int, std::shared_ptr<ModuleBase_ViewerPrs> > theItems,
- std::set<std::shared_ptr<ModelAPI_Object> >& theObjects);
+ static void updateProcessedObjects(QMap<int, ModuleBase_ViewerPrsPtr> theItems,
+ std::set<ObjectPtr>& theObjects);
/// Returns maps of shapes and presentations. If object is a body result then it returns
/// its ruslts. If it is a group then it returns result of shapes included into the gropup
double transparency() const;
+ void removeItems(std::set<int> theIds);
+
protected slots:
/// Deletes element in list of items
void onDeleteItem();
/// Closes faces panel restore all hidden faces by calling reset()
void onClosed();
-private:
/// Flushes redisplay event and perform update of object browser icons
/// (objects might be hidden/shown)
void flushRedisplay() const;
-protected:
+private:
+
QCheckBox* myHiddenOrTransparent; ///< if checked - transparent, else hidden
ModuleBase_ListView* myListView; ///< list control of processed faces
XGUI_Workshop* myWorkshop; ///< workshop
int myLastItemIndex; ///< last index to be used in the map of items for the next added item
QMap<int, ModuleBase_ViewerPrsPtr> myItems; ///< selected face items
- std::set<std::shared_ptr<ModelAPI_Object> > myItemObjects; ///< cached objects of myItems
- std::set<std::shared_ptr<ModelAPI_Object> > myHiddenObjects; ///< hidden objects
- std::set<std::shared_ptr<ModelAPI_Object> > myHiddenGroups; ///< hidden objects
+ std::set<ObjectPtr > myItemObjects; ///< cached objects of myItems
+ std::set<ObjectPtr > myHiddenObjects; ///< hidden objects
+ std::set<ObjectPtr > myHiddenGroups; ///< hidden objects
};
#endif
\ No newline at end of file