mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-11-14 17:48:34 +05:00
IMP 0016175: EDF455: Save GUIState don't redisplay the objects.
This commit is contained in:
parent
6787806440
commit
ecfa128381
@ -122,14 +122,20 @@
|
||||
|
||||
// VTK includes
|
||||
#include <vtkScalarBarActor.h>
|
||||
#include <vtkCamera.h>
|
||||
#include <vtkRenderer.h>
|
||||
#include <vtkPlane.h>
|
||||
|
||||
// SALOME KERNEL includes
|
||||
#include <SALOMEDS_Study.hxx>
|
||||
#include <SALOMEDSClient_StudyBuilder.hxx>
|
||||
#include <SALOMEDSClient_SComponent.hxx>
|
||||
#include <SALOMEDSClient_ClientFactory.hxx>
|
||||
#include <SALOMEDSClient_IParameters.hxx>
|
||||
|
||||
// OCCT includes
|
||||
#include <Standard_ErrorHandler.hxx>
|
||||
#include <NCollection_DataMap.hxx>
|
||||
|
||||
//namespace{
|
||||
// Declarations
|
||||
@ -236,14 +242,14 @@
|
||||
|
||||
// update Object browser
|
||||
SMESHGUI::GetSMESHGUI()->updateObjBrowser();
|
||||
|
||||
|
||||
// show Error message box if there were errors
|
||||
if ( errors.count() > 0 ) {
|
||||
SUIT_MessageBox::critical( SMESHGUI::desktop(),
|
||||
QObject::tr( "SMESH_ERROR" ),
|
||||
QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) );
|
||||
}
|
||||
|
||||
|
||||
// show warning message box, if some imported mesh is empty
|
||||
if ( isEmpty ) {
|
||||
SUIT_MessageBox::warning( SMESHGUI::desktop(),
|
||||
@ -916,7 +922,7 @@
|
||||
(SMESHGUI::desktop(),
|
||||
QObject::tr("SMESH_WRN_WARNING"),
|
||||
QObject::tr("SMESH_REALLY_DELETE"),
|
||||
SUIT_MessageBox::Yes | SUIT_MessageBox::No,
|
||||
SUIT_MessageBox::Yes | SUIT_MessageBox::No,
|
||||
SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
|
||||
return;
|
||||
|
||||
@ -941,7 +947,7 @@
|
||||
|
||||
_PTR(SObject) refobj;
|
||||
if ( aSO && aSO->ReferencedObject( refobj ) )
|
||||
continue; // skip references
|
||||
continue; // skip references
|
||||
|
||||
// put the whole hierarchy of sub-objects of the selected SO into a list and
|
||||
// then treat them all starting from the deepest objects (at list back)
|
||||
@ -2185,7 +2191,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
|
||||
case 4043: { // CLEAR_MESH
|
||||
|
||||
if(checkLock(aStudy)) break;
|
||||
|
||||
|
||||
SALOME_ListIO selected;
|
||||
if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
|
||||
aSel->selectedObjects( selected );
|
||||
@ -3737,3 +3743,410 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReser
|
||||
|
||||
return aSColor;
|
||||
}
|
||||
|
||||
const char gSeparator = '_'; // character used to separate parameter names
|
||||
const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
|
||||
|
||||
/*!
|
||||
* \brief Store visual parameters
|
||||
*
|
||||
* This method is called just before the study document is saved.
|
||||
* Store visual parameters in AttributeParameter attribue(s)
|
||||
*/
|
||||
void SMESHGUI::storeVisualParameters (int savePoint)
|
||||
{
|
||||
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
|
||||
if (!appStudy || !appStudy->studyDS())
|
||||
return;
|
||||
_PTR(Study) studyDS = appStudy->studyDS();
|
||||
|
||||
// componentName is used for encoding of entries when storing them in IParameters
|
||||
std::string componentName = myComponentSMESH->ComponentDataType();
|
||||
//_PTR(SComponent) aSComponent = studyDS->FindComponent("SMESH");
|
||||
//if (!aSComponent) return;
|
||||
|
||||
// IParameters
|
||||
_PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
|
||||
componentName.c_str(),
|
||||
savePoint);
|
||||
_PTR(IParameters) ip = ClientFactory::getIParameters(ap);
|
||||
|
||||
// viewers counters are used for storing view_numbers in IParameters
|
||||
int vtkViewers = 0;
|
||||
|
||||
// main cycle to store parameters of displayed objects
|
||||
QList<SUIT_ViewManager*> lst;
|
||||
QList<SUIT_ViewManager*>::Iterator it;
|
||||
getApp()->viewManagers(lst);
|
||||
for (it = lst.begin(); it != lst.end(); it++)
|
||||
{
|
||||
SUIT_ViewManager* vman = *it;
|
||||
QString vType = vman->getType();
|
||||
|
||||
// saving VTK actors properties
|
||||
if (vType == SVTK_Viewer::Type())
|
||||
{
|
||||
QVector<SUIT_ViewWindow*> views = vman->getViews();
|
||||
for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++)
|
||||
{
|
||||
if (SVTK_ViewWindow* vtkView = dynamic_cast<SVTK_ViewWindow*>(views[i]))
|
||||
{
|
||||
vtkActorCollection* allActors = vtkView->getRenderer()->GetActors();
|
||||
allActors->InitTraversal();
|
||||
while (vtkActor* actor = allActors->GetNextActor())
|
||||
{
|
||||
if (actor->GetVisibility()) // store only visible actors
|
||||
{
|
||||
SMESH_Actor* aSmeshActor = 0;
|
||||
if (actor->IsA("SMESH_Actor"))
|
||||
aSmeshActor = SMESH_Actor::SafeDownCast(actor);
|
||||
if (aSmeshActor && aSmeshActor->hasIO())
|
||||
{
|
||||
Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO();
|
||||
if (io->hasEntry())
|
||||
{
|
||||
// entry is "encoded" = it does NOT contain component adress,
|
||||
// since it is a subject to change on next component loading
|
||||
std::string entry = ip->encodeEntry(io->getEntry(), componentName);
|
||||
|
||||
std::string param, vtkParam = vType.toLatin1().data();
|
||||
vtkParam += gSeparator;
|
||||
vtkParam += QString::number(vtkViewers).toLatin1().data();
|
||||
vtkParam += gSeparator;
|
||||
|
||||
// Visibility
|
||||
param = vtkParam + "Visibility";
|
||||
ip->setParameter(entry, param, "On");
|
||||
|
||||
// Representation
|
||||
param = vtkParam + "Representation";
|
||||
ip->setParameter(entry, param, QString::number
|
||||
((int)aSmeshActor->GetRepresentation()).toLatin1().data());
|
||||
|
||||
// IsShrunk
|
||||
param = vtkParam + "IsShrunk";
|
||||
ip->setParameter(entry, param, QString::number
|
||||
((int)aSmeshActor->IsShrunk()).toLatin1().data());
|
||||
|
||||
// Displayed entities
|
||||
unsigned int aMode = aSmeshActor->GetEntityMode();
|
||||
bool isE = aMode & SMESH_Actor::eEdges;
|
||||
bool isF = aMode & SMESH_Actor::eFaces;
|
||||
bool isV = aMode & SMESH_Actor::eVolumes;
|
||||
|
||||
QString modeStr ("e");
|
||||
modeStr += gDigitsSep; modeStr += QString::number(isE);
|
||||
modeStr += gDigitsSep; modeStr += "f";
|
||||
modeStr += gDigitsSep; modeStr += QString::number(isF);
|
||||
modeStr += gDigitsSep; modeStr += "v";
|
||||
modeStr += gDigitsSep; modeStr += QString::number(isV);
|
||||
|
||||
param = vtkParam + "Entities";
|
||||
ip->setParameter(entry, param, modeStr.toLatin1().data());
|
||||
|
||||
// Colors (surface:edge:)
|
||||
vtkFloatingPointType r, g, b;
|
||||
|
||||
aSmeshActor->GetSufaceColor(r, g, b);
|
||||
QString colorStr ("surface");
|
||||
colorStr += gDigitsSep; colorStr += QString::number(r);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(g);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(b);
|
||||
|
||||
aSmeshActor->GetBackSufaceColor(r, g, b);
|
||||
colorStr += gDigitsSep; colorStr += "backsurface";
|
||||
colorStr += gDigitsSep; colorStr += QString::number(r);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(g);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(b);
|
||||
|
||||
aSmeshActor->GetEdgeColor(r, g, b);
|
||||
colorStr += gDigitsSep; colorStr += "edge";
|
||||
colorStr += gDigitsSep; colorStr += QString::number(r);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(g);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(b);
|
||||
|
||||
aSmeshActor->GetNodeColor(r, g, b);
|
||||
colorStr += gDigitsSep; colorStr += "node";
|
||||
colorStr += gDigitsSep; colorStr += QString::number(r);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(g);
|
||||
colorStr += gDigitsSep; colorStr += QString::number(b);
|
||||
|
||||
param = vtkParam + "Colors";
|
||||
ip->setParameter(entry, param, colorStr.toLatin1().data());
|
||||
|
||||
// Sizes of lines and points
|
||||
QString sizeStr ("line");
|
||||
sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetLineWidth());
|
||||
sizeStr += gDigitsSep; sizeStr += "node";
|
||||
sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetNodeSize());
|
||||
sizeStr += gDigitsSep; sizeStr += "shrink";
|
||||
sizeStr += gDigitsSep; sizeStr += QString::number(aSmeshActor->GetShrinkFactor());
|
||||
|
||||
param = vtkParam + "Sizes";
|
||||
ip->setParameter(entry, param, sizeStr.toLatin1().data());
|
||||
|
||||
// Opacity
|
||||
param = vtkParam + "Opacity";
|
||||
ip->setParameter(entry, param,
|
||||
QString::number(aSmeshActor->GetOpacity()).toLatin1().data());
|
||||
|
||||
// Clipping
|
||||
param = vtkParam + "ClippingPlane";
|
||||
int nPlanes = aSmeshActor->GetNumberOfClippingPlanes();
|
||||
if (!nPlanes)
|
||||
ip->setParameter(entry, param, "Off");
|
||||
for (int ipl = 0; ipl < nPlanes; ipl++) {
|
||||
//vtkPlane* plane = aSmeshActor->GetClippingPlane(ipl);
|
||||
SMESH::Orientation anOrientation;
|
||||
double aDistance;
|
||||
vtkFloatingPointType anAngle[2];
|
||||
SMESHGUI_ClippingDlg::GetPlaneParam(aSmeshActor, ipl, anOrientation, aDistance, anAngle);
|
||||
std::string planeValue = QString::number((int)anOrientation).toLatin1().data();
|
||||
planeValue += gDigitsSep; planeValue += QString::number(aDistance).toLatin1().data();
|
||||
planeValue += gDigitsSep; planeValue += QString::number(anAngle[0]).toLatin1().data();
|
||||
planeValue += gDigitsSep; planeValue += QString::number(anAngle[1]).toLatin1().data();
|
||||
|
||||
ip->setParameter(entry, param + QString::number(ipl+1).toLatin1().data(), planeValue);
|
||||
}
|
||||
} // if (io->hasEntry())
|
||||
} // SMESH_Actor && hasIO
|
||||
} // isVisible
|
||||
} // while.. actors traversal
|
||||
} // if (vtkView)
|
||||
} // for (views)
|
||||
vtkViewers++;
|
||||
} // if (SVTK view model)
|
||||
} // for (viewManagers)
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Restore visual parameters
|
||||
*
|
||||
* This method is called after the study document is opened.
|
||||
* Restore visual parameters from AttributeParameter attribue(s)
|
||||
*/
|
||||
void SMESHGUI::restoreVisualParameters (int savePoint)
|
||||
{
|
||||
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
|
||||
if (!appStudy || !appStudy->studyDS())
|
||||
return;
|
||||
_PTR(Study) studyDS = appStudy->studyDS();
|
||||
|
||||
// componentName is used for encoding of entries when storing them in IParameters
|
||||
std::string componentName = myComponentSMESH->ComponentDataType();
|
||||
//_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
|
||||
//if (!aSComponent) return;
|
||||
|
||||
// IParameters
|
||||
_PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
|
||||
componentName.c_str(),
|
||||
savePoint);
|
||||
_PTR(IParameters) ip = ClientFactory::getIParameters(ap);
|
||||
|
||||
std::vector<std::string> entries = ip->getEntries();
|
||||
|
||||
for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
|
||||
{
|
||||
// entry is a normal entry - it should be "decoded" (setting base adress of component)
|
||||
QString entry (ip->decodeEntry(*entIt).c_str());
|
||||
|
||||
// Check that the entry corresponds to a real object in the Study
|
||||
// as the object may be deleted or modified after the visual state is saved.
|
||||
_PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
|
||||
if (!so) continue; //Skip the not existent entry
|
||||
|
||||
std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
|
||||
std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
|
||||
|
||||
std::vector<std::string>::iterator namesIt = paramNames.begin();
|
||||
std::vector<std::string>::iterator valuesIt = paramValues.begin();
|
||||
|
||||
// actors are stored in a map after displaying of them for
|
||||
// quicker access in the future: map < viewID to actor >
|
||||
NCollection_DataMap<int, SMESH_Actor*> vtkActors;
|
||||
|
||||
for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
|
||||
{
|
||||
// visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
|
||||
// '_' is used as separator and should not be used in viewer type or parameter names.
|
||||
QStringList lst = QString((*namesIt).c_str()).split(gSeparator, QString::SkipEmptyParts);
|
||||
if (lst.size() != 3)
|
||||
continue;
|
||||
|
||||
QString viewerTypStr = lst[0];
|
||||
QString viewIndexStr = lst[1];
|
||||
QString paramNameStr = lst[2];
|
||||
|
||||
bool ok;
|
||||
int viewIndex = viewIndexStr.toUInt(&ok);
|
||||
if (!ok) // bad conversion of view index to integer
|
||||
continue;
|
||||
|
||||
// viewers
|
||||
if (viewerTypStr == SVTK_Viewer::Type())
|
||||
{
|
||||
SMESH_Actor* aSmeshActor = 0;
|
||||
if (vtkActors.IsBound(viewIndex))
|
||||
aSmeshActor = vtkActors.Find(viewIndex);
|
||||
|
||||
if (paramNameStr == "Visibility")
|
||||
{
|
||||
if (!aSmeshActor && displayer())
|
||||
{
|
||||
QList<SUIT_ViewManager*> lst;
|
||||
getApp()->viewManagers(viewerTypStr, lst);
|
||||
|
||||
// SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
|
||||
if (viewIndex >= 0 && viewIndex < lst.count()) {
|
||||
SUIT_ViewManager* vman = lst.at(viewIndex);
|
||||
SUIT_ViewModel* vmodel = vman->getViewModel();
|
||||
// SVTK view model can be casted to SALOME_View
|
||||
displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
|
||||
|
||||
// store displayed actor in a temporary map for quicker
|
||||
// access later when restoring other parameters
|
||||
SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
|
||||
vtkRenderer* Renderer = vtkView->getRenderer();
|
||||
vtkActorCollection* theActors = Renderer->GetActors();
|
||||
theActors->InitTraversal();
|
||||
bool isFound = false;
|
||||
vtkActor *ac = theActors->GetNextActor();
|
||||
for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) {
|
||||
if (ac->IsA("SMESH_Actor")) {
|
||||
SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
|
||||
if (aGeomAc->hasIO()) {
|
||||
Handle(SALOME_InteractiveObject) io =
|
||||
Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO());
|
||||
if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) {
|
||||
isFound = true;
|
||||
vtkActors.Bind(viewIndex, aGeomAc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if (paramNameStr == "Visibility")
|
||||
else
|
||||
{
|
||||
// the rest properties "work" with SMESH_Actor
|
||||
if (aSmeshActor)
|
||||
{
|
||||
QString val ((*valuesIt).c_str());
|
||||
|
||||
// Representation
|
||||
if (paramNameStr == "Representation") {
|
||||
aSmeshActor->SetRepresentation((SMESH_Actor::EReperesent)val.toInt());
|
||||
}
|
||||
// IsShrunk
|
||||
else if (paramNameStr == "IsShrunk") {
|
||||
if (val.toInt()) {
|
||||
if (!aSmeshActor->IsShrunk())
|
||||
aSmeshActor->SetShrink();
|
||||
}
|
||||
else {
|
||||
if (aSmeshActor->IsShrunk())
|
||||
aSmeshActor->UnShrink();
|
||||
}
|
||||
}
|
||||
// Displayed entities
|
||||
else if (paramNameStr == "Entities") {
|
||||
QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
|
||||
if (mode.count() == 6) {
|
||||
if (mode[0] != "e" || mode[2] != "f" || mode[4] != "v") {
|
||||
MESSAGE("Invalid order of data in Entities, must be: "
|
||||
"e:0/1:f:0/1:v:0/1");
|
||||
}
|
||||
else {
|
||||
unsigned int aMode = aSmeshActor->GetEntityMode();
|
||||
unsigned int aNewMode =
|
||||
(int(SMESH_Actor::eEdges ) * mode[1].toInt()) |
|
||||
(int(SMESH_Actor::eFaces ) * mode[3].toInt()) |
|
||||
(int(SMESH_Actor::eVolumes) * mode[5].toInt());
|
||||
if (aNewMode != aMode)
|
||||
aSmeshActor->SetEntityMode(aNewMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Colors
|
||||
else if (paramNameStr == "Colors") {
|
||||
QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
|
||||
if (colors.count() == 16) {
|
||||
if (colors[0] != "surface" || colors[4] != "backsurface" ||
|
||||
colors[8] != "edge" || colors[12] != "node") {
|
||||
MESSAGE("Invalid order of data in Colors, must be: "
|
||||
"surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b");
|
||||
}
|
||||
else {
|
||||
aSmeshActor->SetSufaceColor(colors[1].toFloat(), colors[2].toFloat(), colors[3].toFloat());
|
||||
aSmeshActor->SetBackSufaceColor(colors[5].toFloat(), colors[6].toFloat(), colors[7].toFloat());
|
||||
aSmeshActor->SetEdgeColor(colors[9].toFloat(), colors[10].toFloat(), colors[11].toFloat());
|
||||
aSmeshActor->SetNodeColor(colors[13].toFloat(), colors[14].toFloat(), colors[15].toFloat());
|
||||
}
|
||||
}
|
||||
}
|
||||
// Sizes of lines and points
|
||||
else if (paramNameStr == "Sizes") {
|
||||
QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts);
|
||||
if (sizes.count() == 6) {
|
||||
if (sizes[0] != "line" || sizes[2] != "node" || sizes[4] != "shrink") {
|
||||
MESSAGE("Invalid order of data in Sizes, must be: "
|
||||
"line:int:node:int:shrink:float");
|
||||
}
|
||||
else {
|
||||
aSmeshActor->SetLineWidth(sizes[1].toInt());
|
||||
aSmeshActor->SetNodeSize(sizes[3].toInt());
|
||||
aSmeshActor->SetShrinkFactor(sizes[5].toFloat());
|
||||
}
|
||||
}
|
||||
}
|
||||
// Opacity
|
||||
else if (paramNameStr == "Opacity") {
|
||||
aSmeshActor->SetOpacity(val.toFloat());
|
||||
}
|
||||
// Clipping
|
||||
else if (paramNameStr.startsWith("ClippingPlane")) {
|
||||
cout << "$$$ ClippingPlane 1" << endl;
|
||||
if (paramNameStr == "ClippingPlane1" || val == "Off")
|
||||
aSmeshActor->RemoveAllClippingPlanes();
|
||||
if (val != "Off") {
|
||||
cout << "$$$ ClippingPlane 2" << endl;
|
||||
QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts);
|
||||
if (vals.count() == 4) { // format check: 4 values
|
||||
cout << "$$$ ClippingPlane 3" << endl;
|
||||
SMESH::Orientation anOrientation = (SMESH::Orientation)vals[0].toInt();
|
||||
double aDistance = vals[1].toFloat();
|
||||
vtkFloatingPointType anAngle[2];
|
||||
anAngle[0] = vals[2].toFloat();
|
||||
anAngle[1] = vals[3].toFloat();
|
||||
|
||||
QList<SUIT_ViewManager*> lst;
|
||||
getApp()->viewManagers(viewerTypStr, lst);
|
||||
// SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
|
||||
if (viewIndex >= 0 && viewIndex < lst.count()) {
|
||||
SUIT_ViewManager* vman = lst.at(viewIndex);
|
||||
SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
|
||||
SMESHGUI_ClippingDlg::AddPlane(aSmeshActor, vtkView,
|
||||
anOrientation, aDistance, anAngle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if (aSmeshActor)
|
||||
} // other parameters than Visibility
|
||||
}
|
||||
} // for names/parameters iterator
|
||||
} // for entries iterator
|
||||
|
||||
// update all VTK views
|
||||
QList<SUIT_ViewManager*> lst;
|
||||
getApp()->viewManagers(lst);
|
||||
for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
|
||||
SUIT_ViewModel* vmodel = (*it)->getViewModel();
|
||||
if (vmodel && vmodel->getType() == SVTK_Viewer::Type()) {
|
||||
SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
|
||||
vtkView->getRenderer()->ResetCameraClippingRange();
|
||||
vtkView->Repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ public :
|
||||
virtual LightApp_Selection* createSelection() const;
|
||||
|
||||
virtual void BuildPresentation ( const Handle(SALOME_InteractiveObject)&,
|
||||
SUIT_ViewWindow* = 0 );
|
||||
SUIT_ViewWindow* = 0 );
|
||||
|
||||
/* Non modal dialog boxes management */
|
||||
void EmitSignalDeactivateDialog();
|
||||
@ -106,11 +106,14 @@ public :
|
||||
virtual void contextMenuPopup( const QString&, QMenu*, QString& );
|
||||
virtual void createPreferences();
|
||||
virtual void preferencesChanged( const QString&, const QString& );
|
||||
|
||||
|
||||
virtual void update( const int );
|
||||
|
||||
static SALOMEDS::Color getUniqueColor( const QList<SALOMEDS::Color>& );
|
||||
|
||||
virtual void storeVisualParameters (int savePoint);
|
||||
virtual void restoreVisualParameters(int savePoint);
|
||||
|
||||
public slots:
|
||||
virtual bool deactivateModule( SUIT_Study* );
|
||||
virtual bool activateModule( SUIT_Study* );
|
||||
@ -129,17 +132,17 @@ signals:
|
||||
void SignalCloseAllDialogs();
|
||||
|
||||
protected:
|
||||
void createSMESHAction( const int,
|
||||
const QString&,
|
||||
const QString& = QString(),
|
||||
const int = 0,
|
||||
const bool = false );
|
||||
void createPopupItem( const int,
|
||||
const QString&,
|
||||
const QString&,
|
||||
const QString& = QString(),
|
||||
const int = -1 );
|
||||
|
||||
void createSMESHAction( const int,
|
||||
const QString&,
|
||||
const QString& = QString(),
|
||||
const int = 0,
|
||||
const bool = false );
|
||||
void createPopupItem( const int,
|
||||
const QString&,
|
||||
const QString&,
|
||||
const QString& = QString(),
|
||||
const int = -1 );
|
||||
|
||||
virtual LightApp_Operation* createOperation( const int ) const;
|
||||
|
||||
virtual bool isSelectionCompatible();
|
||||
|
@ -194,6 +194,133 @@ struct TSetVisiblity {
|
||||
int myIsVisible;
|
||||
};
|
||||
|
||||
//=================================================================================
|
||||
// used in SMESHGUI::restoreVisualParameters() to avoid
|
||||
// declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx
|
||||
//=================================================================================
|
||||
void SMESHGUI_ClippingDlg::AddPlane (SMESH_Actor* theActor,
|
||||
SVTK_ViewWindow* theViewWindow,
|
||||
SMESH::Orientation theOrientation,
|
||||
double theDistance,
|
||||
vtkFloatingPointType theAngle[2])
|
||||
{
|
||||
OrientedPlane* aPlane = OrientedPlane::New(theViewWindow);
|
||||
|
||||
aPlane->myAngle[0] = theAngle[0];
|
||||
aPlane->myAngle[1] = theAngle[1];
|
||||
|
||||
aPlane->SetOrientation(theOrientation);
|
||||
aPlane->SetDistance(theDistance);
|
||||
|
||||
vtkFloatingPointType aNormal[3];
|
||||
vtkFloatingPointType aDir[2][3] = {{0, 0, 0}, {0, 0, 0}};
|
||||
{
|
||||
static double aCoeff = vtkMath::Pi()/180.0;
|
||||
|
||||
vtkFloatingPointType anU[2] = {cos(aCoeff * theAngle[0]), cos(aCoeff * theAngle[1])};
|
||||
vtkFloatingPointType aV[2] = {sqrt(1.0 - anU[0]*anU[0]), sqrt(1.0 - anU[1]*anU[1])};
|
||||
aV[0] = theAngle[0] > 0? aV[0]: -aV[0];
|
||||
aV[1] = theAngle[1] > 0? aV[1]: -aV[1];
|
||||
|
||||
switch (theOrientation) {
|
||||
case SMESH::XY:
|
||||
aDir[0][1] = anU[0];
|
||||
aDir[0][2] = aV[0];
|
||||
|
||||
aDir[1][0] = anU[1];
|
||||
aDir[1][2] = aV[1];
|
||||
|
||||
break;
|
||||
case SMESH::YZ:
|
||||
aDir[0][2] = anU[0];
|
||||
aDir[0][0] = aV[0];
|
||||
|
||||
aDir[1][1] = anU[1];
|
||||
aDir[1][0] = aV[1];
|
||||
|
||||
break;
|
||||
case SMESH::ZX:
|
||||
aDir[0][0] = anU[0];
|
||||
aDir[0][1] = aV[0];
|
||||
|
||||
aDir[1][2] = anU[1];
|
||||
aDir[1][1] = aV[1];
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
vtkMath::Cross(aDir[1],aDir[0],aNormal);
|
||||
vtkMath::Normalize(aNormal);
|
||||
vtkMath::Cross(aNormal,aDir[1],aDir[0]);
|
||||
}
|
||||
|
||||
// ???
|
||||
theActor->SetPlaneParam(aNormal, theDistance, aPlane);
|
||||
|
||||
vtkDataSet* aDataSet = theActor->GetInput();
|
||||
vtkFloatingPointType *aPnt = aDataSet->GetCenter();
|
||||
|
||||
vtkFloatingPointType* anOrigin = aPlane->GetOrigin();
|
||||
vtkFloatingPointType aDel = aDataSet->GetLength()/2.0;
|
||||
|
||||
vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel},
|
||||
{aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}};
|
||||
vtkFloatingPointType aParam, aPnt0[3], aPnt1[3], aPnt2[3];
|
||||
|
||||
vtkFloatingPointType aPnt01[3] = {aPnt[0] - aDelta[0][0] - aDelta[1][0],
|
||||
aPnt[1] - aDelta[0][1] - aDelta[1][1],
|
||||
aPnt[2] - aDelta[0][2] - aDelta[1][2]};
|
||||
vtkFloatingPointType aPnt02[3] = {aPnt01[0] + aNormal[0],
|
||||
aPnt01[1] + aNormal[1],
|
||||
aPnt01[2] + aNormal[2]};
|
||||
vtkPlane::IntersectWithLine(aPnt01,aPnt02,aNormal,anOrigin,aParam,aPnt0);
|
||||
|
||||
vtkFloatingPointType aPnt11[3] = {aPnt[0] - aDelta[0][0] + aDelta[1][0],
|
||||
aPnt[1] - aDelta[0][1] + aDelta[1][1],
|
||||
aPnt[2] - aDelta[0][2] + aDelta[1][2]};
|
||||
vtkFloatingPointType aPnt12[3] = {aPnt11[0] + aNormal[0],
|
||||
aPnt11[1] + aNormal[1],
|
||||
aPnt11[2] + aNormal[2]};
|
||||
vtkPlane::IntersectWithLine(aPnt11,aPnt12,aNormal,anOrigin,aParam,aPnt1);
|
||||
|
||||
vtkFloatingPointType aPnt21[3] = {aPnt[0] + aDelta[0][0] - aDelta[1][0],
|
||||
aPnt[1] + aDelta[0][1] - aDelta[1][1],
|
||||
aPnt[2] + aDelta[0][2] - aDelta[1][2]};
|
||||
vtkFloatingPointType aPnt22[3] = {aPnt21[0] + aNormal[0],
|
||||
aPnt21[1] + aNormal[1],
|
||||
aPnt21[2] + aNormal[2]};
|
||||
vtkPlane::IntersectWithLine(aPnt21,aPnt22,aNormal,anOrigin,aParam,aPnt2);
|
||||
|
||||
vtkPlaneSource* aPlaneSource = aPlane->myPlaneSource;
|
||||
aPlaneSource->SetNormal(aNormal[0],aNormal[1],aNormal[2]);
|
||||
aPlaneSource->SetOrigin(aPnt0[0],aPnt0[1],aPnt0[2]);
|
||||
aPlaneSource->SetPoint1(aPnt1[0],aPnt1[1],aPnt1[2]);
|
||||
aPlaneSource->SetPoint2(aPnt2[0],aPnt2[1],aPnt2[2]);
|
||||
|
||||
theActor->AddClippingPlane(aPlane);
|
||||
aPlane->Delete();
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// used in SMESHGUI::restoreVisualParameters() to avoid
|
||||
// declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx
|
||||
//=================================================================================
|
||||
void SMESHGUI_ClippingDlg::GetPlaneParam (SMESH_Actor* theActor,
|
||||
int thePlaneIndex,
|
||||
SMESH::Orientation& theOrientation,
|
||||
double& theDistance,
|
||||
vtkFloatingPointType* theAngle)
|
||||
{
|
||||
if (vtkPlane* aPln = theActor->GetClippingPlane(thePlaneIndex)) {
|
||||
if (OrientedPlane* aPlane = OrientedPlane::SafeDownCast(aPln)) {
|
||||
theOrientation = aPlane->GetOrientation();
|
||||
theDistance = aPlane->GetDistance();
|
||||
theAngle[0] = aPlane->myAngle[0];
|
||||
theAngle[1] = aPlane->myAngle[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=================================================================================
|
||||
// class : SMESHGUI_ClippingDlg()
|
||||
// purpose :
|
||||
|
@ -29,6 +29,9 @@
|
||||
// SMESH includes
|
||||
#include "SMESH_SMESHGUI.hxx"
|
||||
|
||||
// SALOME includes
|
||||
#include <SVTK_ViewWindow.h>
|
||||
|
||||
// Qt includes
|
||||
#include <QDialog>
|
||||
|
||||
@ -76,6 +79,20 @@ public:
|
||||
void setRotation( const double, const double );
|
||||
void Sinchronize();
|
||||
|
||||
// used in SMESHGUI::restoreVisualParameters() to avoid
|
||||
// declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx
|
||||
static void AddPlane (SMESH_Actor* theActor,
|
||||
SVTK_ViewWindow* theViewWindow,
|
||||
SMESH::Orientation theOrientation,
|
||||
double theDistance,
|
||||
vtkFloatingPointType theAngle[2]);
|
||||
|
||||
static void GetPlaneParam (SMESH_Actor* theActor,
|
||||
int thePlaneIndex,
|
||||
SMESH::Orientation& theOrientation,
|
||||
double& theDistance,
|
||||
vtkFloatingPointType* theAngle);
|
||||
|
||||
protected:
|
||||
void keyPressEvent( QKeyEvent* );
|
||||
|
||||
|
@ -437,7 +437,7 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy,
|
||||
// Add trace of API methods calls and replace study entries by names
|
||||
TCollection_AsciiString aScript =
|
||||
"### This file is generated by SALOME automatically by dump python functionality of SMESH component\n\n";
|
||||
aScript += DumpPython_impl(aStudy->StudyId(), aMap, aMapNames,
|
||||
aScript += DumpPython_impl(aStudy, aMap, aMapNames,
|
||||
isPublished, isValidScript, aSavedTrace);
|
||||
|
||||
int aLen = aScript.Length();
|
||||
@ -598,13 +598,15 @@ namespace {
|
||||
*/
|
||||
//=============================================================================
|
||||
TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
|
||||
(int theStudyID,
|
||||
(SALOMEDS::Study_ptr theStudy,
|
||||
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
|
||||
Resource_DataMapOfAsciiStringAsciiString& theNames,
|
||||
bool isPublished,
|
||||
bool& aValidScript,
|
||||
const TCollection_AsciiString& theSavedTrace)
|
||||
{
|
||||
int aStudyID = theStudy->StudyId();
|
||||
|
||||
TCollection_AsciiString helper; // to comfortably concatenate C strings
|
||||
TCollection_AsciiString aSmeshpy( SMESH_2smeshpy::SmeshpyName() );
|
||||
TCollection_AsciiString aSMESHGen( SMESH_2smeshpy::GenName() );
|
||||
@ -655,7 +657,7 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
|
||||
}
|
||||
|
||||
// Dump trace of API methods calls
|
||||
TCollection_AsciiString aNewLines = GetNewPythonLines(theStudyID);
|
||||
TCollection_AsciiString aNewLines = GetNewPythonLines(aStudyID);
|
||||
if (aNewLines.Length() > 0) {
|
||||
aScript += helper + "\n" + aNewLines;
|
||||
}
|
||||
@ -750,14 +752,13 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
|
||||
anUpdatedScript += aScript.SubString(aSeq->Value(aLen) + 1, aScriptLength);
|
||||
|
||||
|
||||
SMESH_Gen_i* aSMESHGenI = SMESH_Gen_i::GetSMESHGen();
|
||||
SALOMEDS::Study_ptr aStudy = aSMESHGenI->GetCurrentStudy();
|
||||
if( !CORBA::is_nil(aStudy) )
|
||||
//SMESH_Gen_i* aSMESHGenI = SMESH_Gen_i::GetSMESHGen();
|
||||
if( !CORBA::is_nil(theStudy) )
|
||||
{
|
||||
SALOMEDS::SObject_var aComp = aStudy->FindComponent(ComponentDataType());
|
||||
SALOMEDS::SObject_var aComp = theStudy->FindComponent(ComponentDataType());
|
||||
if( !CORBA::is_nil(aComp) )
|
||||
{
|
||||
SALOMEDS::ChildIterator_var Itr = aStudy->NewChildIterator(aComp);
|
||||
SALOMEDS::ChildIterator_var Itr = theStudy->NewChildIterator(aComp);
|
||||
for( Itr->InitEx(true); Itr->More(); Itr->Next() )
|
||||
{
|
||||
SALOMEDS::SObject_var aSObj = Itr->Value();
|
||||
@ -841,6 +842,21 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl
|
||||
}
|
||||
anUpdatedScript += "\n\n\t\tsalome.sg.updateObjBrowser(0)";
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
// store visual properties of displayed objects
|
||||
// -----------------------------------------------------------------
|
||||
|
||||
if (isPublished)
|
||||
{
|
||||
//Output the script that sets up the visual parameters.
|
||||
char* script = theStudy->GetDefaultScript(ComponentDataType(), "\t");
|
||||
if (script && strlen(script) > 0) {
|
||||
anUpdatedScript += "\n\n\t### Store presentation parameters of displayed objects\n";
|
||||
anUpdatedScript += script;
|
||||
CORBA::string_free(script);
|
||||
}
|
||||
}
|
||||
|
||||
anUpdatedScript += "\n\n\tpass\n";
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
|
@ -370,7 +370,7 @@ public:
|
||||
|
||||
void SavePython (SALOMEDS::Study_ptr theStudy);
|
||||
|
||||
TCollection_AsciiString DumpPython_impl (int theStudyID,
|
||||
TCollection_AsciiString DumpPython_impl (SALOMEDS::Study_ptr theStudy,
|
||||
Resource_DataMapOfAsciiStringAsciiString& theObjectNames,
|
||||
Resource_DataMapOfAsciiStringAsciiString& theNames,
|
||||
bool isPublished,
|
||||
|
Loading…
Reference in New Issue
Block a user