From ea0d11b57debc8f1953669110cab2eaf790681b1 Mon Sep 17 00:00:00 2001 From: nri Date: Thu, 6 Nov 2003 10:18:40 +0000 Subject: [PATCH] NRI : merge from 1.2c --- adm_local/unix/make_commence.in | 32 +- doc/html/INPUT/HTML/VISU_Gen.html | 372 ++- doc/html/INPUT/doxyfile | 10 +- doc/html/INPUT/sources/Application-About.png | Bin 7684 -> 19226 bytes doc/html/INPUT/sources/Application-About1.jpg | Bin 21548 -> 14327 bytes doc/html/INPUT/sources/application.gif | Bin 2584 -> 2602 bytes doc/html/INPUT/sources/application.jpg | Bin 4664 -> 792 bytes doc/html/INPUT/sources/bg_salome.gif | Bin 0 -> 7598 bytes doc/html/INPUT/sources/bg_salomepro.gif | Bin 17294 -> 0 bytes doc/html/INPUT/sources/static/DataStruct.gif | Bin 0 -> 3404 bytes doc/html/INPUT/sources/static/PrsObj.gif | Bin 0 -> 4732 bytes doc/html/INPUT/sources/static/View.gif | Bin 0 -> 2142 bytes .../INPUT/sources/{ => static}/doxygen.css | 2 +- .../INPUT/sources/static/examples_VISU.html | 1270 ++++++++++ .../INPUT/sources/static/overview_VISU.html | 252 ++ doc/html/INPUT/sources/static/page2.html | 31 + doc/html/INPUT/sources/static/tree.js | 82 + doc/html/INPUT/sources/static/treeview.js | 505 ++++ doc/html/Makefile.in | 17 +- idl/VISU_Gen.idl | 140 +- resources/VISU_en.xml | 3 + resources/VISU_fr.xml | 19 +- src/CONVERTOR/Makefile.in | 10 +- src/Makefile.in | 2 +- src/OBJECT/Makefile.in | 14 +- src/OBJECT/VISU_Actor.cxx | 264 +- src/OBJECT/VISU_Actor.h | 100 +- src/PIPELINE/Makefile.in | 9 +- src/VISUGUI/Makefile.in | 9 +- src/VISUGUI/VISU_msg_en.po | 10 + src/VISUGUI/VisuGUI.cxx | 1273 ++++++---- src/VISUGUI/VisuGUI.h | 77 +- src/VISUGUI/VisuGUI_CutPlanesDlg.cxx | 150 +- src/VISUGUI/VisuGUI_CutPlanesDlg.h | 29 +- src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx | 81 +- src/VISUGUI/VisuGUI_IsoSurfacesDlg.h | 22 +- src/VISUGUI/VisuGUI_MagnitudeDlg.cxx | 12 +- src/VISUGUI/VisuGUI_MagnitudeDlg.h | 6 +- src/VISUGUI/VisuGUI_NonIsometricDlg.cxx | 15 +- src/VISUGUI/VisuGUI_ScalarBarDlg.cxx | 32 +- src/VISUGUI/VisuGUI_ScalarBarDlg.h | 8 +- src/VISUGUI/VisuGUI_Selection.cxx | 44 +- src/VISUGUI/VisuGUI_Selection.h | 4 +- src/VISUGUI/VisuGUI_StreamLinesDlg.cxx | 309 ++- src/VISUGUI/VisuGUI_StreamLinesDlg.h | 27 +- src/VISUGUI/VisuGUI_TimeAnimation.cxx | 17 +- src/VISUGUI/VisuGUI_TimeAnimation.h | 6 +- src/VISUGUI/VisuGUI_VectorsDlg.cxx | 16 +- src/VISUGUI/VisuGUI_VectorsDlg.h | 9 +- src/VISUGUI/VisuGUI_VisuAsDlg.cxx | 11 +- src/VISUGUI/VisuGUI_VisuAsDlg.h | 4 +- src/VISU_I/Makefile.in | 32 +- src/VISU_I/VISUConfig.hh | 65 +- src/VISU_I/VISU_CorbaMedConvertor.cxx | 238 +- src/VISU_I/VISU_CorbaMedConvertor.hxx | 23 +- src/VISU_I/VISU_Gen_i.cc | 529 +--- src/VISU_I/VISU_Gen_i.hh | 21 + src/VISU_I/VISU_PrsObject_i.cc | 2212 +---------------- src/VISU_I/VISU_PrsObject_i.hh | 637 +---- src/VISU_I/VISU_Result_i.cc | 147 +- src/VISU_I/VISU_Result_i.hh | 47 +- src/VISU_I/VISU_Table_i.cc | 154 +- src/VISU_I/VISU_Table_i.hh | 40 +- src/VISU_I/VISU_TimeAnimation.cxx | 45 +- src/VISU_I/VISU_TimeAnimation.h | 13 +- src/VISU_I/VISU_ViewManager_i.cc | 79 +- src/VISU_I/VISU_ViewManager_i.hh | 29 +- src/VISU_SWIG/Makefile.in | 17 +- src/VISU_SWIG/batchmode_visu.py | 61 + src/VISU_SWIG/batchmode_visu_view3d.py | 2 +- src/VISU_SWIG/libVISU_Swig.i | 25 +- src/VISU_SWIG/visu.py | 367 ++- src/VISU_SWIG/visu_med.py | 2 +- src/VISU_SWIG/visu_view3d.py | 2 +- 74 files changed, 5491 insertions(+), 4601 deletions(-) create mode 100644 doc/html/INPUT/sources/bg_salome.gif delete mode 100755 doc/html/INPUT/sources/bg_salomepro.gif create mode 100755 doc/html/INPUT/sources/static/DataStruct.gif create mode 100755 doc/html/INPUT/sources/static/PrsObj.gif create mode 100755 doc/html/INPUT/sources/static/View.gif rename doc/html/INPUT/sources/{ => static}/doxygen.css (97%) create mode 100755 doc/html/INPUT/sources/static/examples_VISU.html create mode 100755 doc/html/INPUT/sources/static/overview_VISU.html create mode 100755 doc/html/INPUT/sources/static/page2.html create mode 100755 doc/html/INPUT/sources/static/tree.js create mode 100644 doc/html/INPUT/sources/static/treeview.js diff --git a/adm_local/unix/make_commence.in b/adm_local/unix/make_commence.in index 2850be76..e106eb05 100644 --- a/adm_local/unix/make_commence.in +++ b/adm_local/unix/make_commence.in @@ -47,9 +47,8 @@ PYTHONHOME = @PYTHONHOME@ PYTHON_INCLUDES = @PYTHON_INCLUDES@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_VERSION = @PYTHON_VERSION@ -PYTHON_SITE = @PYTHON_SITE@ -PYTHON_SITE_INSTALL = @PYTHON_SITE_INSTALL@ - +PYTHON_SITE = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages +PYTHON_SITE_INSTALL = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome # QT QT_ROOT = @QT_ROOT@ @@ -101,13 +100,18 @@ MED2_MT_LIBS=@MED2_MT_LIBS@ OCC_INCLUDES=@CAS_CPPFLAGS@ OCC_CXXFLAGS=@CAS_CXXFLAGS@ -OCC_KERNEL_LIBS=@CAS_KERNEL@ -OCC_OCAF_LIBS=@CAS_OCAF@ -OCC_VIEWER_LIBS=@CAS_VIEWER@ -OCC_MODELER_LIBS=@CAS_MODELER@ -OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@ -OCC_LIBS=@CAS_LDFLAGS@ - +#OCC_KERNEL_LIBS=@CAS_KERNEL@ +#OCC_OCAF_LIBS=@CAS_OCAF@ +#OCC_VIEWER_LIBS=@CAS_VIEWER@ +#OCC_MODELER_LIBS=@CAS_MODELER@ +#OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@ +#OCC_LIBS=@CAS_LDFLAGS@ +CAS_KERNEL=@CAS_KERNEL@ +CAS_OCAF=@CAS_OCAF@ +CAS_VIEWER=@CAS_VIEWER@ +CAS_MODELER=@CAS_MODELER@ +CAS_DATAEXCHANGE=@CAS_DATAEXCHANGE@ +CAS_LDPATH=@CAS_LDPATH@ # MPICH MPICH_INCLUDES=@MPICH_INCLUDES@ @@ -164,6 +168,8 @@ CXXFLAGS+= $(CORBA_CXXFLAGS) #LDFLAGS+= $(CORBA_LIBS) LIBS+=$(CORBA_LIBS) +DOXYGEN = @DOXYGEN@ + ## Shared libraries LT_STATIC_EXEC=@LT_STATIC_EXEC@ DYNAMIC_DIRS=@DYNAMIC_DIRS@ @@ -192,8 +198,9 @@ libdir=@libdir@/salome # warning : if user give this path in configure we could have salome/salome :-( includedir=@includedir@/salome datadir=@datadir@/salome -idldir=$(prefix)/idl/salome +idldir=${prefix}/idl/salome sharedpydir=@libdir@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules +incmakedir=${prefix}/salome_adm/unix docdir=$(datadir)/doc @@ -201,7 +208,7 @@ docdir=$(datadir)/doc # begin of package rules # -.PHONY: all lib bin inc resources tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean +.PHONY: all lib bin inc resources data doc tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean .SUFFIXES: .cxx .cc .c .f .o .lo .idl .py .i .ui .po .qm @@ -212,6 +219,7 @@ all: $(MAKE) lib $(MAKE) bin $(MAKE) resources + $(MAKE) data # # add target to build administrative files diff --git a/doc/html/INPUT/HTML/VISU_Gen.html b/doc/html/INPUT/HTML/VISU_Gen.html index 4ceccd78..13cb79ce 100644 --- a/doc/html/INPUT/HTML/VISU_Gen.html +++ b/doc/html/INPUT/HTML/VISU_Gen.html @@ -125,6 +125,18 @@
+ + + + + + + + + +
interface Prs3d
IDL file
Python
void Destroy ( )
Destroy ( )

+ + @@ -270,6 +282,22 @@ + + + + + + + + + + + + + + + +
interface Mesh
IDL file
double GetScale ( )
return_value = GetScale ( )
boolean IsColored ( )
return_value = IsColored ( )
void ShowColored ( in boolean theColored )
ShowColored ( theColored )
Color GetColor ( )
return_value = GetColor ( )
void SetColor ( in Color theColor )
SetColor ( theColor )

@@ -287,6 +315,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -313,11 +365,171 @@
return_value = GetOrientationType ( )
void SetDisplacement ( in double theDisp )
SetDisplacement ( theDisp )
double GetDisplacement ( )
return_value = GetDisplacement ( )
void SetPlanePosition ( in long thePlaneNumber, in double thePlanePosition )
SetPlanePosition ( thePlaneNumber, thePlanePosition )
void SetDefault ( in long thePlaneNumber )
SetDefault ( thePlaneNumber )
double GetPlanePosition ( in long thePlaneNumber )
return_value = GetPlanePosition ( thePlaneNumber )
boolean IsDefault ( in long thePlaneNumber )
return_value = IsDefault ( thePlaneNumber )
void SetNbPlanes ( in long theNb )
SetNbPlanes ( theNb )

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
interface CutLines
IDL file
Python
void SetOrientationType ( in Orientation theNb )
SetOrientationType ( theNb )
void SetOrientationType2 ( in Orientation theNb )
SetOrientationType2 ( theNb )
Orientation GetOrientationType ( )
return_value = GetOrientationType ( )
Orientation GetOrientationType2 ( )
return_value = GetOrientationType2 ( )
void SetDisplacement ( in double theDisp )
SetDisplacement ( theDisp )
void SetDisplacement2 ( in double theDisp )
SetDisplacement2 ( theDisp )
double GetDisplacement ( )
return_value = GetDisplacement ( )
double GetDisplacement2 ( )
return_value = GetDisplacement2 ( )
void SetBasePlanePosition ( in double thePlanePosition )
SetBasePlanePosition ( thePlanePosition )
double GetBasePlanePosition ( )
return_value = GetBasePlanePosition ( )
void SetLinePosition ( in long thePlaneNumber, in double thePlanePosition )
SetLinePosition ( thePlaneNumber, thePlanePosition )
double GetLinePosition ( in long thePlaneNumber )
return_value = GetLinePosition ( thePlaneNumber )
void SetDefault ( )
SetDefault ( )
boolean IsDefault ( )
return_value = IsDefault ( )
void SetDefaultPosition ( in long thePlaneNumber )
SetDefaultPosition ( thePlaneNumber )
boolean IsDefaultPosition ( in long thePlaneNumber )
return_value = IsDefaultPosition ( thePlaneNumber )
void SetNbLines ( in long theNb )
SetNbLines ( theNb )
long GetNbLines ( )
return_value = GetNbLines ( )
void SetRotateX ( in double theAngle )
SetRotateX ( theAngle )
void SetRotateX2 ( in double theAngle )
SetRotateX2 ( theAngle )
double GetRotateX ( )
return_value = GetRotateX ( )
double GetRotateX2 ( )
return_value = GetRotateX2 ( )
void SetRotateY ( in double theAngle )
SetRotateY ( theAngle )
void SetRotateY2 ( in double theAngle )
SetRotateY2 ( theAngle )
double GetRotateY ( )
return_value = GetRotateY ( )
double GetRotateY2 ( )
return_value = GetRotateY2 ( )

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
interface StreamLines
IDL file
Python
void SetDirection ( in Direction theDirection )
SetDirection ( theDirection )
Direction GetDirection ( )
return_value = GetDirection ( )
void SetStepLength ( in double theStep )
SetStepLength ( theStep )
double GetStepLength ( )
return_value = GetStepLength ( )
void SetPropagationTime ( in double theTime )
SetPropagationTime ( theTime )
double GetPropagationTime ( )
return_value = GetPropagationTime ( )
void SetIntegrationStep ( in double theStep )
SetIntegrationStep ( theStep )
double GetIntegrationStep ( )
return_value = GetIntegrationStep ( )
void SetSource ( in Prs3d thePrs3d )
SetSource ( thePrs3d )
Prs3d GetSource ( )
return_value = GetSource ( )
void SetUsedPoints ( in double thePercents )
SetUsedPoints ( thePercents )
double GetUsedPoints ( )
return_value = GetUsedPoints ( )

@@ -369,11 +581,147 @@

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
interface Animation
IDL file
Python
void addField ( in SObject theObject )
addField ( theObject )
void generatePresentations ( in long theFieldNum )
generatePresentations ( theFieldNum )
boolean generateFrames ( )
return_value = generateFrames ( )
void clearView ( )
clearView ( )
void startAnimation ( )
startAnimation ( )
void stopAnimation ( )
stopAnimation ( )
void nextFrame ( )
nextFrame ( )
void prevFrame ( )
prevFrame ( )
void firstFrame ( )
firstFrame ( )
void lastFrame ( )
lastFrame ( )
void gotoFrame ( in long theFrame )
gotoFrame ( theFrame )
long getNbFields ( )
return_value = getNbFields ( )
long getNbFrames ( )
return_value = getNbFrames ( )
boolean isRunning ( )
return_value = isRunning ( )
long getCurrentFrame ( )
return_value = getCurrentFrame ( )
ScalarMap getPresentation ( in long theField, in long theFrame )
return_value = getPresentation ( theField, theFrame )
void setPresentationType ( in long theFieldNum, in VISUType theType )
setPresentationType ( theFieldNum, theType )
VISUType getPresentationType ( in long theFieldNum )
return_value = getPresentationType ( theFieldNum )
void setSpeed ( in long theSpeed )
setSpeed ( theSpeed )
long getSpeed ( )
return_value = getSpeed ( )
boolean isProportional ( )
return_value = isProportional ( )
void setAnimationRange ( in double theMin, in double theMax )
setAnimationRange ( theMin, theMax )
double getMinRange ( )
return_value = getMinRange ( )
double getMaxRange ( )
return_value = getMaxRange ( )
boolean isRangeDefined ( )
return_value = isRangeDefined ( )
void dumpTo ( in string thePath )
dumpTo ( thePath )
boolean isCycling ( )
return_value = isCycling ( )
double getMinTime ( )
return_value = getMinTime ( )
double getMaxTime ( )
return_value = getMaxTime ( )
void setProportional ( in boolean theProp )
setProportional ( theProp )
void setCycling ( in boolean theCycle )
setCycling ( theCycle )

+ + + + + +
interface Result
IDL file
Python
boolean BuildAll ( )
return_value = BuildAll ( )

@@ -403,16 +751,12 @@ - - - - - - + + - - + + @@ -451,6 +795,10 @@ + + + + @@ -462,6 +810,10 @@ + + + +
return_value = ImportFile ( theFileName )
Result ImportMed ( in FIELD theField )
return_value = ImportMed ( theField )
Result ImportMedMesh ( in MESH theMesh )
return_value = ImportMedMesh ( theMesh )
Result ImportMed ( in SObject theMedSObject )
return_value = ImportMed ( theMedSObject )
Result ImportMedSupport ( in SUPPORT theSupport )
return_value = ImportMedSupport ( theSupport )
Result ImportMedField ( in FIELD theField )
return_value = ImportMedField ( theField )
Mesh MeshOnEntity ( in Result theResult, in string theMeshName, in Entity theEntity )
return_value = CutPlanesOnField ( theResult, theMeshName, theEntity, theFieldName, theIteration )
CutLines CutLinesOnField ( in Result theResult, in string theMeshName, in Entity theEntity, in string theFieldName, in double theIteration )
return_value = CutLinesOnField ( theResult, theMeshName, theEntity, theFieldName, theIteration )
Table CreateTable ( in string theTableEntry )
return_value = CreateTable ( theTableEntry )
Container CreateContainer ( )
return_value = CreateContainer ( )
Animation CreateAnimation ( in View3D theView3d )
return_value = CreateAnimation ( theView3d )

@@ -706,5 +1058,9 @@ + + + +
void Destroy ( in View theView )
Destroy ( theView )
void ProcessEvents ( )
ProcessEvents ( )

diff --git a/doc/html/INPUT/doxyfile b/doc/html/INPUT/doxyfile index d31c61fe..78c2c468 100755 --- a/doc/html/INPUT/doxyfile +++ b/doc/html/INPUT/doxyfile @@ -3,7 +3,7 @@ #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- -PROJECT_NAME = "SALOME PRO - VISU - v.1.2" +PROJECT_NAME = "SALOME - VISU - v.1.2" PROJECT_NUMBER = id#1.1 OUTPUT_DIRECTORY = ../ OUTPUT_LANGUAGE = English @@ -96,11 +96,11 @@ GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO +BINARY_TOC = YES +TOC_EXPAND = YES +DISABLE_INDEX = YES ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO +GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output diff --git a/doc/html/INPUT/sources/Application-About.png b/doc/html/INPUT/sources/Application-About.png index 80e0bcb063acf425fa1001d39beea368bb4497a3..7b58330d50856e28562e8f9ed80dae72d6e6dda3 100755 GIT binary patch literal 19226 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

5r3>=?gKv-6#gF2kVYm^Euk4pDx%bDo{L~m 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 diff --git a/doc/html/INPUT/sources/Application-About1.jpg b/doc/html/INPUT/sources/Application-About1.jpg index b8f2cfb6da8aa2f60922b1c60f642ce9e1eebab5..cf7ab8ba025d6bd9212f8bd5681e77d1aaef8e4f 100755 GIT binary patch literal 14327 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 Ao&W#< literal 21548 zcmeFYbx>T-w=X&bPmtg)2@n$89VR5fgS!p{clQAjNN@=dAV?rsaE9RSu0ew9;6C^O z!_1rSIk)b+b?$q0?(e*M_piIFnxba+?CI6rYwgead{(38QR{%G%JNF`01WiSg~0^? zpq2n{0oa&WSXh|Y=s(!l*f_WZc(~|`_{kG|0uo|UQW9bk5;979Dl&3f3KA0PXVkO| z3`|T+WK_>tpEI)3Gcqy$^AHU5S8;K0iSY1<7|BV<8UN)A)d?WM!vH)oz{GeCctnDM zNrHju1uy{s7})=e76SwD-!6fF6z~WG6Y~*z{AdHvy@SyA0azs1 zq|f+eamX|+aG$%A3w%n<#bbH%yNg0=62>a{!6Ov^F(nl>4K3RX_Lr|XgoH&z#l$7v zzLS$zP*hUZ*3s3|H!w7^w6eCbwX=8d^z!!c_45x1`}`$5A~GsEDfwGUYTEbojJ*7U z!e2$jC8gChwRQCkjZMwnJ-vPX1A{}uQ`0klXXoY@7B`@qTiZLkd;14x=NFe(*EjIn zyMOG$0AT*RS^wR#|6msh+O9|FWx>Mz$1aRVzUYQYf`$EzABR*{6W79>?76@vJn}b* zxxc&cSp>CU6dyb$A5*dlZLppFW7@x2_P=IW=zqzw|8Cg-ZPy}z02950B$y-sAmE-S z`sL3@|EK+bm;;W~mNNTh%0$nygPX*K`NdzizrMoqi(HggKLUnWKVrPdP;Gf8l2>`n zGsgf0MKc0m$8!tbAaX;tPTx3an0HVA;A?C5ryo9(#fnHUy#?_j4B;bCAoZH5;eML0 zgnGmh|A0LmR+3fED?x#CUmWrGNBubXbO~v5e=Mp+*#gE_6>ptDq%VgCi0N)S&Se^! z9}2+OgfmqGmXPH-0&%3s^gfO3Saz1sjsBO7upMIn~Lchel&Dkc~V}369 zXO4)I?TeVQTk7x~3INL8H*bvgc98#}$Ze!=7HovHU8vQR1D{>V>eM}`5mLRG5soQH zJU-&KYD%#LH0fydzGNj>cTeIt_A5H}g@TScFpT|t#2S<;#x7cTbf14oT*74`Fd2x) z>pzL0Xs3*U7zy2@0PlDDKTy(sE^UuF+lNOWgdm?n_Q;^>2;2x1Abt`BAmm&J-C@C# zQ2>k$6kxON+?nEvX@1^p;#7wB!J^+6(Qkf zg<%-Zx7ktQO>ype6!p)L7?XK0>f{|^StMI)z~&W&4TQ2>{t*wjed8S3NWNG_@yFfwxQ)(G&b$W#c3c zLv;-{!JpuCz4eTIu)3Vc+QCZn8m(;?c9#x{NIo0XQqYyY)BEc`a5RAeuqyPR0M{2N zK%u}~{@nNn=91ZOltXp!9OKU=9JSBHU8X_;9>2`{E%7Ltvl9id3yJMm0NTMKKJ%ae zQ0r0On=?^Fz%{?T0;2ZFAZR>nXM8+Xgw`+W{PlJpbbsSja|#oJY!+<23BmURj(|uU zQ)jhQLceYld<$zK-2Tbkux-&oJ=pJQ=KBAzJ}G~DZ+x{@Ox0O$$i$Njtvtq$)KvJT zl9YyC|w!u(yZ zm!7m`?(~_M6d!Kb08U-m#dJ@`bi!DWCk})z;%)A;(IzPPw3=Yo=bHDkcQa|enTtDQ?oAc!p z>Lw0Py|ncSjdBn@Jhi6_N!fZvSwt~9o0=)r+n{StbfZH}@cN*qLwRAjW0mQLzvwZq zRK$jF!rh*`q znET@6JbUKP%(mt~f0HK1X1fuBLrmGb*KS{}QlJ1;V>!rpz;-q zF~(7^nF&108xK~oK+oV4Grt(^=p9ED)$9+(rL_@(r35(4-WF?x&ZM|n*!~U2yw7t& zvzbjUkZ}nim*2~F++ez#^29b%2=(86Iw>4vS-wggP4uV#l_k7N`(ODMd5EP&Ag~oU zOK|5y6D~)sabcwxJd&!1DY0&FA^pDpEr)|M=UeC5ZtT|RE%?&TyfYVl5#CK(a`Qt@y zCKyw-sYfUnU4et=onA70@vm7u!6k3MO8~(ruM*$ zj5?coJf*F!CD-9mu$+zYgx#RzZV9JspOrNyZSPoHIxuu8AZwFmQyQCgtve(_Vj%gt z18@KLtz`W}oNA?K?8&+E$sT{!W|p_`_A2eeFQ>T52~t0wZFZg4tX1CLiB-NymHOu6 zd;%-#Ql5JOxc!juyOzc7c9!Vz9VlNv=U_HPM0uwAaF;pkl3@ z>v15Ez&qBOI-8G*v3t`@sch!0>rEQ|3<2?VFoqx;xi{x2`qOfEIo!RCneyaRrl9=? ze{70|byY%y(k27%JH=lqE|nD41_qpw5o6D^WNGlIFQp|IQ)ZEWR%z6U{f^Y_&7F>f zpLk_ZPyLZ4mH3$S9Q#(CgYF}LtCg?Ji1yz!m$DFTsjGY^ZM=g*KiuqJf28UQ>L{SNQ%WK7tAcz0s>`jAu}` zRdJ+DdcHa8ndCnG46|ybU&mIOxF_W_r(UfPt9dt~_KOnM_3X4s%Tp1GloTDztX;l( zzY~dz1WX8IXph6so2PmX(E$-$uR**mi*eg$0O}(_&y5Y(o13C%XKC28ZAtpb9Sm2Z zIyG=vlRF=^SHQ(#f^vT@2kU?|^TrMtGhw6mLLIH4lgf!zkd?%yt*@_{o%fqs)2{U< zorDvjKRE6oCXPmEc+KCCmwXd=o`eVV9p&N=rP0}qzFTj`4E;NhwP}kVNG<6rO~f=( zG85LTqdz->7^Q@Xe!8Le6YTLrPc>;V5S{@$jR#>}wo&!m$gsmAo1!I6q-V27r#?{) zKk0WfaNf>zXTgrw;US(3HiSGc4NlM?FyL zP^CxW?@a_)*0R#R+NrrZ-8zA*Q$(W7nK{KGg@uJVakT=D0?39C_)Y8mF|^XDZL*FS z^|rA~7^5R?waV3Ag2+x)l^svVDT2Hv#*Kc^rY;o0^Dn7nXMWClNfMgDtAb%Lty*Vn=YQ21_B<_SWtsI7;rh9g^n!hoT?VIMz(|+YSI`yFUJ=K3 z<5ywd1{ps*)tzRgchMTjva)4K1bNvvf1}OLbS$19X02=f!XB<#;3BUv?B-8{XmaPxyH>_!<0tzL9Hic9Z+gXv9astV#hJ!-BEOPo1@h8 zy8QeSJx$&Csi>Iv;*-~xni!(MLTRc1OlR)bsqJzzEpgss#t-WwUMgg%Q(F} z#l+IVwweQwUydz2JrBl2`P{3JzbJs7)bbp~RjW=RgVtmK@4}^*zul1zmi&dcjeF>$AiB`78xFwIIo(76trrKm& zIBz9MHtiA$pfF(i(*_eG65;syAy)~A?TttZ4g@_groiC9o9N)O3!uUP3eb!m#S=vO z*|AR!mXIoEZwR?i5S>xoz3!KRAG>lp0xnBfvEo{I+p_D|l|0S75sWWnh|hjRME0dE z1rO~6Z;qYcoW>=ens3t8OxFd~d9y1k(=9B`AakbDC~cr>44!;O28B-3ouQlggEoJubQ zTZ5gFtcOdJ(^xNcH^rc>c>ng?|MnwoBi+r14oJpnZ%_P&d+!2$8MB8a(Vxyuo#TSB z>t2;6rc%~o5SNu4-;kN(&cB^{nRnItrunXu4AK-vi`ypV*&!0uMDlX}yT#<1a)5uO zQ4D}Tz_k2sI&UOsN9d`d58bVWGV2utwg{Kh-xPk!qIVg`f7C+Du|Ja{{%XL>R_~ib zSGU7{PB!gHa*3T$+jwHx!jNr{!~KhJ+2QQAM&?jF7Ib5!%?JII;fLi!fDMac)SvEC z&Yk^~F;*;4VpL?eEFnl=Y+96m-8Be#dPa5h_rv`b>?W$xd zMo?~j^VeZF4Kke@aN>@WVsLUK$F_pOGj0; zad{Hcr2&cZ??llD)Hr~z#8T%DhohgKNQK#LB?ajB3QgAl6;zc>8Hw*dz&~NvM{U?; zi1_%-@Q~-bzQ%}uPIt1t;}owxEa7`Q+zg7AIQPqh64h0_n`|XpPWd!R^S1XRt8@4k zX>`FZeRAi%$={%HoQSGiYVX5?iLn|k^;vhp;`#-2K-g^w9t>tOM97x3AoJ`TjB68<7_ecANqbdd(Jc!(F*;8jKH0tw=cisvl(iLNds@y7Me^Mj1 zgfar)br3kaEV6&Hwv8s&KEt22F<#G~p-RA=8S{(gM?mM*kRBAca)A_R-eH+ZyQ^o`i=)55 zS8aFim|`3ue8zm{8Yq&?fr0jKHfR^#;w&c!e3 zQ zs~iCxqYqCokcTP=&hs~1>{5vd4tf#yMHeMX0IMt=tLW6h(|=&z;4Cc@{IwkxE#xaSeO zqN@?yJh-r`JyPYgssN)LMHtorO=?A0c1t0R>1>2 z9Tf&1WBZ-^kr{vHxV1e(Bu?DTkC{BAc*P91Q!DvONj`6#vCdejCc1o_nB29w6E`3x zWt&S8cpWu43;aTRjLx<-T~p4RfE`f*y9vYXMrG;()3<3m3AK3{!`?`RTfr@(VguoFxrkpUSR>iuJiutbno5d!i-}1y~AsAYluV5qww;PB@nl z#i-=Sfv4?wBE=`^da`-{3Tahi)iqjw9vmK>WXcd>^Ba0o)L<4?DB7LP_7}nH@9mp! zlIdSr!B(5tc^fKrP~cIHr-$`aR&$B@p6dAR#%{)(>X~pWU2E*(O5?KP8&4V*x;NoG z0&X4$;>YWC*+jMO2Hvj%fZ8U(j0Rjf`BaV$ZA@3@5VOfvUXkQ`alZt!=GE$hF{jB~ zv0f#&Pxx4m@VRzNu$4(xTPM2j-Y=d;);=&|KCj#EerL)eKs}R_ejT4HZ*aNJC>O+j zmbbd32Inr`Pks5Ju0DG4W&X0Ft|1iQIkZ1>VR9SJl3K{2Ql9cah5`tdadux!RhT|} zuWd65DcS+ond0`i-oDJHMH3x$5M;d3?%_|kGa7r4^?(Kjf#4OHrV`MVhj0yhx z3Y32HNS;P8ds!dj{++c9!Qr3+*K99S0ea8J`4UU?`_z7>x22!MKSNrjt*=FX6M>R0 z$HwREYoPCgWr!c3IcU@}iSB(;7t)Oaya0#EQOqG|>uTEJY59u>lvSq2is$&xGx+w_ znmq*Ym@lI5qw6RnJTmtxgI(VwSLg}N>7}iDkn1mqGSa}*nc@09LkX%9TxgdQ#)lP! zS#|eqIFlsYOE`rfRQ)=ZW>A2{oVUpGzeq2zKgb5m6L*3j+_-x0Y$`BMHjOmo)=ua& zV(9%zjAwTsVP$`Yfhe1j5-xmOXb@xfQ_=E0mwO(XghI<*e+cw{eBa^k>*wIFOE7*l zZ2Kvz@D;n4>Mw&xG`vUWpkM-m$1fqQH~+E{(@K0D3eSbEJpwCER|u(;*;G06vnP#1 zSIop23er6cECwDIVSF5Z@H|a9cRfajGB!yy^kNBt?j!;(t25k6BDXV|YouaNYWFt$ z_gf?@671o=XPI5A0wji+kfS)g_q_9`)I2wm@+=|Ew>F*h{9TfAzJG6*OsT>Vo=_Bk zD8_5DRiSvX$F*g+;UcE9r6y-ZMB}{oTq5ggr%mFP)aA0!l^toD@C9nf=5W@Lfda6c z_}Z)nTh7fkB}C(I?1KqQbI9fBo53PeiYlzmtWKIKMl9@)K$&laXD>VTrcDRXSunYo@WWSgk({$4Gs|&{wB-Pqv6(pHL zLjJ6g^m?(W_CIxQzi!wW4R{GrhqJ?W4tsrJj(6WaaMLcD4_3=ln@Qv}lEW+qdl(VL zyKKRsZGIYIS*sBv8&!Y#g()N)^&d>`csrX-7Ky{ToLo|*Mgm_x^NoKqd=yEZm>nh! zEc}3QIx~dr_O!j(8TSdj+j?TG-}8t8d8SoBVg6~Jew~6LfU#aB!t3Rm^*jA>rrNbg zvy0x@c7{;!lEFK+Z2rdJhkp4Z*t}}NQ?b<^sjo6X3^}Mf2eSNrbgH@Ae0!v=JmFax zC8cl1mqo*QBXwWT7d~&XtXHb=#WaW3$>6#H*C7iDJ!3q%#eR7kEPPA3we`!N5;Ep( z%{@~%8X3e%8U3EOH&8_y1gPcjfkkj1pXqKYc_R{p(Hx3s9|~~Eao7RpO+(LX5hPT~ zZlnqP42px>IBkRG@*R)x3hc)9n%hXdlUDh&eK6p2VGnKEw=kn2o$yw zW$8;lcFRk}z7w2g*=)Y9qVA~B+O12!Sjfgb&~3}`)oYeXd5CY-J2!I3CT{-TktDaB z^tAUgkSm|{_%YoGGXZ@IV_*=5@UlBSeYQIY55aTB+D?8po>_*ED6@DOeIXhBoqpq- zDz)?Wn77+_-}mI?ESvT~@!X@si;BYAD;Y?{nb{KI;7xoEPtNwajPXMO zD=ETmE{lHm2nF~@Q(5r^G7_Ce-=SaDl}vZfB{s_T-ToaTfP;Y#2M~D9&O{~976qX6 z(^iAa{+xF(dpXJFl6S9=PS}Ug987Qg8e7K4!W=eXX%;FKxGp>0A56z|Lmq|#L_! z*mUDQYS*1!Q?BIA_=y_DYr-U@PJn)w?jNvdVjetdqeP!BS+C9_JDrT%QYt>{!}j>4 z#H%wl!!dIJm?6xgq6XVdE;eVT>;`tbl~76IjBHBP89=WPG_vl!)*F{cS) zp3wtyt6Saa6{fuGcZ%{*@oNYT{O~M7{*Tw#+n!*W#(TZC7x#w0qSEySwtM*8V+RF4 zk|WBAjwlw_ct%PcJoYv1wGKp+>|yQj3L_uB{$<2)dM8lO1K0CV=P-;o=}p#csq*z+ zfL}Yy4juoVZo>vQ9g}Qd#w9|(Rm&zSQ<^(s>lOqawHNX%{a-V`D){Q>D z(P9tl#VAxPFHS}Bx7cIAR+1k;e|oJZq~f80Q3PK86K~2qfq#hW zG*nHL-=<%YrgL4N?p~1?UTyYF3eRvh!MxvYfbDVP&1+aJAV}Z+7%-8T|Xu9aW z-jkW68A8N?gDKSvij_{bIs{MMzsB-;vry#4AQIvZo8XUM!++-`Pv4;T|8wPyvSv6w z`u$-mhX$+v_Q^e$?R}fN!YxzII&iflBr4eMPQP!FyCbTVx7aQX*TM9irpfM>duYN( zd7mon*o#w#!;r@ zFWNQnr6HSi_QX5L!}v*N;?wwvqazcAtW(P-48o59=1W`L3KwwTKcqm8kr>Ux05T!I zjgijUMDRRFQlI4h%|{uc!;b*mJ0K>qou#ZOGMj}8e92GF(%)j-cvxHuH^DYb=5LDmH_k!16nV(L)Sfl4B&$HH}o`7xU-9|75s;&JqL zyM%$d1?;Vnabn$;A055>Jv;~>648YMv}&Wl(VYzNVHN@hZA~PVmB2LviGG}6s-xi92_%OpN4cC(UaG9npr2PvoKihNURLbD3*(dOr-A z(^x41;0Ze}3P53OBmyZo)T{8$KS(u7X%>$wtZg*Z-~*(vDbaM{GD15f4-a|gH<3#5 z`6z%zddTH_ih=my-0;F<^2z`j7jJDE(1P+SyFgQNO|xg0vU21a82?H$(eDL)L6V*= zuQ|>hyXZYw7_hW9G+HGI>2rT9dg*UN!=XmEA3q!2?9Hxb^2f)<+pfFTpMw)3xC10b zjy6}Dy1>>Vk1DxWmXBsg^8C_R%$GlfW!bXhPk$Q6Whg;l!PD)7*xK6ToQvhZFS)x0 zJ&ilZSXUfgwxuuL@}-|!sMRl0m*^b`1nMI7qyk!{!!nyy1ArGzXF@qxNOpxA1fRk~ zJDMsx8%|S!vu~EwFt^lKPd~PFU96P75X{at2>yN=pHH*Pk`3$^pe^v}`a~$LOeR~!Nt@5&j~O*qJ96xLcFb+&xN%IYU1mms#zC19 ztS64n3~kk{8t-yh;>fY(FaZED0MXwz_kya`+h8;kpes_t{Hfz`K>5NE>M-Y9d=db6 zVxSlDx0mlDPiB3^6z@0))`Y1!2lg6;{|3fb5&F8Fe-31M7N>Np?VkKK|FMJ{?xVJx zql*yFD+-Q9QVia(&2_Nq?cQdl_oSZ zeptN`Oq>>;j_B9x`BgGJcln?urH4rzZ9f}#e9*ztlW=s03!)0ymP7}%xvG82i-mm= zA74=qGgViYL?!nZzRJTtsl-{g60?gSM(w?1t$Y&}nvBNmu^If-!}Fh06axL3yVv>P zdMnh6NY^Xd6!_@|F@lYevvn?H^r;+;YPjXsn+;U9t^LUULGF!SB~-s(rA|I zY*(Kzfa3{VKxtEIbp~dq`GFnj6DUA;C<;)5rZZoyJ=8;%g2&xe8)QUv+37=U(9ojJ z0S)dV+lA*BrDs;3Osxv_zXOc!vJ#QJ;0m~AeBjK7J8l}Z`WCI2^jKeWmeHh`t&IwR zV+9~B4)Kca@$L=FdRP1gaM_t%Rqo^AV>taxmA|QSbn>rF_G<7jGUL0_JzrUD0z=3) zCz?*tON#*7oaMtKRR1Q#2LIuzgf{Vq*f?E?h&i{kPRDN2boB-NN(nfVFXM7(9J>E2 zl~E?f)P%`&tWP)Q?xE+2pt@x^8*<~fFLvHR!-aM)17ZslAc*O#K!V}-!B4c@oQZIp zkl_WtnUNyf(D^HL_{2D-q%vti=8r+1wPDQD07Fi&$%RBhQ4 zr4xE3C+?`n*GJKVTdp7Q*&10HaUV6cLxfcp+v+7{>Qv{hA0uYl7lU?eV}mjL1kG$4 ztK(IP_VNL<1|*b=k5Xe}(QrsLeQ0QC@WR>h+UAT)pQBkJvNonsWQpS2D}jcBy^IDFSstCP#2hruJHyZPmgUxxCqzF9z4-8q=Sc67sb zy9j}~llG8_aEl-;^Fv37M=#KMj&8$7!b0}7w;@;-8e=CiF4|*(kp?!gC6!qz54O0W zCL)&RT;%n}Y3d{?{kU+b=N0qY7GIvj*e8H?*0BFonb{f(wH5Wtmd1t)Yo-V^S1-k| zUQuHo;Je7%A2MAznB;yFG3@rpZCkCgiF(|zc7b{q^Q_VmG*?GHd1^IPo|}!7^d~I$ z5FKL8RqOPpryOv<`#4Q4A0<3|suYia71LAXFIpF$ms}jX+tpjzu3bw;n%@B$mqw z@qr50!i}jZIFJ}UsqYOQ)KPn&8_W7ciG+ggIKg|aEz7&5uAmFm1s@6d# zO;{w2r@>Z6ltlTPILEJ<+G_odWu2;rY+jx;PrvW)1QRmVfkhL>*>rHshbXADpnh^+ zuQ^UDJQ}IIrxuXIY8?m1k?th>x+f`QUUt<;0#6#1Bmn%SpN8{!c|Cj|77Q)@xK}S)E_lZh7fcq? z4JxWnc|=7qb3lcf@RSWZg!_8T8qq_oK_-Nkicvp(`#2GFa)OSM-VC0LP3qB%9PKbj ztQ19o{g6Eu?Md!+;IALlwe~x2n%?sPpz;UAvf78VyM0g8BY)4^n=wrBNWFA%M(^7c z@EJb-u87pS2R<15BLcUBfAa&-b^KPyn>T+0kITybEbCdzDSt zc2+Ul0;LA47Z@7sSD89b{`%Av80o7hD#Pl;kS919e6~6Ldq->w^2)ff#4&i$!Huho z$74H|x6DZ7XfDW0$`(lzh%CxMpb6CL1K>tl$ALfk)u4{9;e+HCmv_|t4w-=So{J!R zIzuKp&`~`7A^{}3}v(dx#KoT>l6gKa@j=?qJR13H1-9kE`{#{jGG-vE7x_s~Bf3-crpk^jH)o3eh z@s8A)(ZJEUR-xsOqhpy#MjXo6OXa=IKbwo*x2JhaK#~F2?mNN=hs`5^{YCN6DY-%K zw+T>lV1?_g(!<(p#w;v3DeFNM@PSoH#z)BG_)@%2MCIKke*zq@&vB&4Xt1lkx@sKH z)ySf*5!a#BDeNSCJVf?2{ja)Tqerauu@60op=u5Vk96eX?N&?`B-1GVnywfx$qebK zE_t3?GF7~8(7R!+9O92h=KKJdYh~=Q{I35RS1cd0C``9E8LBA8;NF4)RJ^9Ph?Js* zg~aH(LW06pU(&b>W;Et}Q=Z$d>oY>?!C-54Qdh0##3d2&GrlLLxGD(){khEs$3` z=djM4#N4hytUz1gt!iVx{BBygwgWRq3HrGk(%$RM(Rv$$RDnu=>`ww!^zOA66HFHM zKP2j(4BY0xAUF@D8W04F{{YYd1y~ebNQG{2l*ZZ@WIy<*H|_4gX%q9#$V#_1>xbtY zf2XjW#v`7s`yn&~q1<+>2ZYx`H6293!%HLn-@jF{mcKJEhQ8m8_qK(J_6Dj0mf>ig zZs4x4Zbl@>iIULUy=4TCzU;TT-fL097R5nKsVuZkLJOAkgo3b?Y%R%?&3fGFuP4h& zam|&#_BHnRd(L>^{(&R&&ocWm!aup^uNvD640t-sPOEN-C5AoIb78V`QChc@{@v#o z{^R|7@%@*pcYF1FZKC{r-SI?4Y_^;p_swm0Z8vQlW#nK@Xqh%wf%4V~cWYL>X9bjr#4oce`{^GcQ($k}>5Iamm|KQTrshz)$q(To zA4XfGn#4^z{75F=_GS~K5o6#wPg;fQF869f@scW+^YdyByp#8GZeq*v_*lskE-6!p z_wc~t!yG~|FZ6*Q>RIIHux$30wM8k4MV}yynic13y@4AJh7@CE0R3cqR@TH6T3o&n zOOaBE-G%_U%ucR5ZjI1@KYgYSLh9$(b7#|02v$e_ZEB06-04>NB$ZnDM@B?aY(2EF zs(_vtDmDYp*(64*#D1nYzk@7`4l=ka`u_ISK4#cq7pUf2^u?%3(bF8H$29ZLTj>h) zwk|aGQ&4Da{ju2)**d2@HQ4)dh^#bJ>6-qU;s{92(`uaWM?0dL*}eF_ohe48)>M`) zeIk+1yj?5hyST0eBi_o%Kt@K@7l|sZXy=9wj?4RIsyBto-#Em^3X+!6%dR?-59cRf zlJID5PqowuXlhDGk(r9qxzPbt=Snj}Vcz-D=mPub$d_O>@%?z^>0TL;S%kf7fnR37 zQCfIbu9Ee)Ox@2|wx)vwmfW3K7Z*gWk9Vb{e>#{6pV2MY(K;8_d?S@o;^fkhe_R3{ z9PPFK#7rrbMfCSC*zAlcy3)nDc7o2&Q6cn1(l=?Q|J)_cN>U{>nS!1F(&=(PY&^T4 zzihaC$u!@4VF{9xo7V8H*i*)u{C=q4^zWU2Kz7u|!c_&ZbCoZCcOW1nQfszbZ+f@3 zmDJ?zxw5Y$@pt}P#Ssyauf!AsdonU-L@BTj7aFF@=es(YM)zEz`U1COk8c%s8O@y% zQo?~t>~&UPp+DYFKm_oFUVXmL(_zGfrce1N_%gU-OcwNqHK#MZ4X3`Uk11&!Gm`9J#N12F!0h)T@N6K-LS5YMb*$C^@ele>Ux%D>t3Su*Hcq&FJJ3#Y zzb=&+@>pB~ozLr(_A9G}rG8BlK6PADYdO86-}$vh(#o=a%-eUoXe@_v%wlFlPds)2Qxp_k@|6N>eY2{#BVl|jA7jtr zJRvqP+p2XkwF{c$t*c<~UUbQ{$iEG7O&#}FzuQ@2+>jbqAH}1?^~|2X=Ea4lq5%C& z3`mB53VavoTH0t2M^(J7W1RvosR@+!@;i*C$zrNfZmIf#AqrYt*E%|ta z#UC4IjE^0590amerj&@hkHnR-#zUr@w>HS|Pq%Z!3*Zt@7OtKJ`XqA~<}4b>T_=1` zS)8W}y+}|ux_4>kX*}z%SZ9h0=KJTk!mE=PGrZ2}E|ckxGJo`bEH4t5U7Kw^`XL_p zE-Aq2TH54JS!QThjpM#zHUhMsLkjlFL^FAnC6!19 zG^y)AeEC|F{eJFWX^yvuN;E_={9JV&%Q37Zv>kK{Zub#HSg%izz}2CUo~=2sg+J6W zu+506rfqttozf7x`lv<(gCHwxoalAuix5V~#Vg3Mf^)vHV@835{omU8u{<-yXB>w( z+Y4FdTU)+EmCnIzhaDs`?0#hT4%4a)$cb6=^Y#I{%2NTmnikK78yx=ltHLunq}s_G zvPVK6`N`F&KWpZjBU`Xiu#I+^YS(ZWxUwK{ZNtip3D#fsD|n_k_>(6zX6bOrxOgW` z>nmTXx3L9(?DkL(Ge7(5T5y@gH;sh3pu|Skyw(rA? z&LaAQ827hS0v}|L3+)DpD7IR(biT^F`3(wBL^*ir?3QjNAiq_5twZ;r3=#n{=y~1e zS;|`LQN@Hd^d1@_)C13`(B+QSKG7myw$+8dz8roRF4i5iZm7Phhh_Vs5bnJRqLH;c zBkMA{uJH`<&D)zhUjpF|CE=U%#Ol4tQy39@_I>*e05Cz{9(M+WGIa;)!MJDB3r?q( ztD=ty67as_i-bqNE?~HC8oG^~0H6h;FL#t>#eQ$0>b-4db7>0G{==`I|z7_`!h5-yW9mc{f&L8tM!dVY2*j{MBw!-3IH4!9fN~5 zPNUK16QraA%lC6g>NpM7zc0zB(N@gve)D(oY>?EqOwLx5=MQTPEb0uQTk$*XEGtRhw)iWaeVqj+<|6Rg1}?U?is58V2G0KBF_%Vh7m6pq}{xy}GOZ>SpW zxO?$tM*)!oaKO*&4s3F@#W>Kr(0GsCnr&%~4 zmhl@#w$rhdne#gMdYUTNS<)n>L2!xbeJ?R`NatCa^=N#ukZ+JNGr8+~_Z;QF zHD{di{nB!}Am%VydS}E#9Ke>C@NjCZ?Mlq@&6>A4J;CK3r`kmKU}oIP^tci|CD?MB zuIy)hwq&H1T@=RwwUuRcv5!y~9;e;B>azc~Tq_gKOzB&Q2zBsVAFDnPnmPhdGM^ixgy# zg%>gQ=Di{1audrg+21f0H08(v|9>@Yt2kEbM2dlYg6ZO)kB_aLLoGw8*X~ECv2>pt zOB|;g(KU&n0B-ceyGEB9xH8VCoA--GE0!P4bP=~>?_mS4M(pSSY?!ch0Zp z9BY@V`*M<>Z%LjkPx zPdb>+WzzH7ou;MOHzZ52^!^->oUn&~wPX$!uCQJIAv0{7I-oJ*oE|=1m+vAiV8DB5PJ5c2M zX}dE}i4UQjs<#6%AQ&pmj7J=cjDm`e^*J%gBU{zN+%?>jIz10Ta`qC06{GlqC#Jo- zjv>VA6Tm{_X4tPx>DENitfjA&PuA(<;S`T6MJgr4kcumu9v3a%prPG)^?B_A*a=9| z|L)s1yaIO35(U<@$vNdrct|bFi4A%32>@SH#JU?+xU5v~4IxCZgm9@{H@qXqB9p}I zvWORh$edAixdMy~hurEjLI(xo8s3F^;ELZ}LmVH>z0ywi7j7kw&lLnm3fabRi*ha} z@)3g2wI}d&19)JsgjuPkuf*aCYiyX<$V+khvoUA=?&gWlm&63COAZ0=eD!W%HBOnM zYqb=MZgk9BqV6WP@nCzXsm-BHMM+S_Qz=O!yg%d<%tspjSBIwG!KcI^$D%z8eOw9O z7Nd|Jrk{%g(Ne%Z-3DAJpW7{V@&H+FwD zh*ch+=|-M9@iv|iOvYHW-CvwanXBWBDS%FK+ROfeX(W~o>d~7;(1{>Yk>Sx(L6h`s zUnyzH$+)$gTiy#!!Z)#Nr&e=U4_?wd2O!D=Mi#1M_-3z>Rl~V!m|}HOV0EvplUQX9lrd^E21q(RppM~~-*l?2^K@=$)} zOgfq@A=esr*Q|J--w-)SN-+C}fqt@ur8A;W&={2^z;a5Gx`+?q!}i)8QQeiUuSMxN zc(TOBuEoB=8!j9om{IVde6t2k=QYQ6|L;1{U)`#@aZJ~n3j8ozduTi#?&A+*4Hu9X ze{JSQw~*=ngY%B13PmoKFHFj?K)`vd24RM#is zGPrDZZo2i8yPhD*TmzB?OSjGw2ge2(f1H7=|8xp`4Il|K3ub5Ug35?FuGo1^_3IX# zq@Sh6ojDN7oO1@LZq-Tbk$^}JmVmebcVBH4XIbWU18{~UnJbaWSeH9?5bn%;_*1y2ixZ(RFq#$sGS zh_OFagces;He6gt^OjE+Hz3;;S{El=Zh#I%QZy38f@1(WceCl-9p0$=oEg z=D{bK*a_WbVb2Q5ntQI~kKb>YAgey};*mVp+H-oZeX~0B8eRLN&-S&6s?S1A*;S`b zNoh8+4^9Q71OVOd;)R_M1q_uMyJ7Kld*)Tz88^XB7w)>rIlS-u-@mM?za7#8rIR&D z`(IWjbl+7QP=lv5Tvn}@J&G9oXdu5@Iq$jle4?xU(hN;)KH$LW&tD5>_gP6k@M$UCe%$KMAuSbI6s?0K2Oq*Fplm3>Cv*l?u@}WyM^yeS z{<_~dnKZ8mQTO(b=<4`eQjnAfaVxxLli^2y3>zdoW7hHT_twDkWlB4hr!C!p@~uaT zfKWy1Lu0+1M@WiA`X#urML%%snTH?3s;nM}C&OT{+~euEvBqOyqC^)|zkY1)LCkw- zs>275eyX!6G*y3S46eOIytmaNOB3aeC+=Fs{@ePt)Gke;?MLtb)y}m?L!HI(DeP39 zVThWh(nAL2{g{xfYT1ZdfTBc~^t-NA>Q%D}O3Ym<@V8|rszumv&oX)mq&*|(r+u!$|@A=+y@BMtf_xt^Pue@hM%R-Iwt6y9w&m zUVQ)j=Rt_^a5^r_So)Ijw#};VSSO=2QXvQT&$mU?yu6`@$)6~D=4}IJ$x(Jv)+92r z8WgMMHGegvS&e8(npT#=HJVsuuZK=>V;gAb1_M*WD9B=0El|u0C*edGt~V$A5?KO% z+DrOjL~eJg8PE#{ZlLdR+7?1Mkr};IO;L3xe0P2I@SWpl)yj=(`y%3LT71h!{YjFK2}`>gQ*8d-^}(G(3qU#oC)&Wk+6*xl6Qj6@c4N3U5nl zZj@J29LYH-q+dPKulT~TQ9pGBVoPpl2o^Kx&#vJ?sf_Ps7$NCd!4+q1^AGeD9^X^` z(!w!1KJIdZ7X6K>-ylMz2-i9cZp-^QH${dev)o{ zwQ!HK3IRpRD9X8n*r@mx11M~MzUS_#cLvEhbz3oEXP|nc&Ke=FOLxKX8ryc<9B@%3 zkM10#zrT7EqkPoxrw1PfyXGiNpSi?lWlXqLjOF;WVFL%n3JBTBSzlkLW}io{xN6mp zR+V@VU42~c6=ZJ8DL6=FS)FT#5T7?sQMoc@l~VJ*!$c@m^`S!AuNvjhv(QaEahpTF zCxT0U8&B4*cBA9>=A9#VJ@&+^s7hY2p`w1UKCHWg)eD>=*=u2FQbUZQ3{z>F%r7bc z&Zb8)w;IBOwCR1XxlXyX3j~9lo_cw^CPg)kN`br9`XnEE)SP>Gpt*U3xIwOD;T9p5 zh|eeu5>UX^@_sJ9B(Dmv(V)1Y7EG9kID5hkamnR^qrEuvEeX!-Y*o zC4N(j?58Ub0LhnL$1-BS1q6*o+$zCNOD9n7viaB=gXj{%#Zl&LzsCwB1kF|C)7pUH z7j!O0R{5u!p_Sx zK>y+G8f%@ECakp=sI%aewgNGf0X_~9Uc`LpLGgoB2vd#VLj@Ahvc}hMi~qLs-;Vva zJO7^rJZ<2qD|MD$hZCM}og{F2TsQ>_#T+}&>{|YII&I=jqH?5ak}o6%s?u1X*Tn?P zJ{GJ-Jj5pp+fK4*UOZyS0Hu2OeY(?pr|=>W<-PTUh2XK%yiAIWBDG_Zz+Ugo-%H8i zH@5*J2<%@NzF+KqmQ;MUT^wo=$%oC9QzV|Vl$4&1Sy-FVeMdjS=Sq~GkeUSJ<_s;{ z32rNpi2dFvD)x4Jx^)9L7R9_m6S*fj8U03*KhD~pX{7CvsQEBiHPs@weSQh?IjBe9 z=vV$u#{H5nkOJnB^eZ0XV}}wbteKSMKy#1};z7Ttx(QIyfo&QhaJ(eTE+9R8owRfh&UOk_dQd^z6v2`jE9JR}*3l>C=OL!D0NxHCf$bDB%L9^%x*49(hi9=H1#F7;x^u?OuDK-}PN#TK}l|{qG7Q|F?0%O6MOs&lWrY diff --git a/doc/html/INPUT/sources/application.gif b/doc/html/INPUT/sources/application.gif index 10da488d2dcf2a063029d868686e1882e45487ab..0b05d5c18ee88779d283508781836e2b151f606f 100644 GIT binary patch literal 2602 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 diff --git a/doc/html/INPUT/sources/application.jpg b/doc/html/INPUT/sources/application.jpg index 6d3b6a0a8c281dca8747fdd34b4d4de0f737c4a3..a6979ab9999552ccb91a0358f75103b09db5246c 100755 GIT binary patch literal 792 zcmex=LJ%Z3brs z4mLJ+HdYRHc6Lrq4lW)MULJ049!Vi#ei2zIc{y1r85so?J#_^o9c39A4RcK$149!N z6M1z@TMHu_J!2CikRgnmoSZz|JQBRT5=M$Libf=Z{|6WZIT%D3%$OOK7?=bZnFSgD zA7PMUU}Rthc>@7h+1MFbn1ONz0t}4I%#5t;OzcouMkZz!23A2KHbq0nKw(j(pu~w6 z3mZjLjGdA<9t7%;U}RuoMwkR-0lADUKp6!=1|~)pMph(AMnRxyib95giG>^g-(uil z25J^$7G$tz*b}$dob931la92ii?S2$h#I_dt2w(?+0U=MwPfirm!)r|%QL=xciqQ* zvhOkDlnJl1?mV9H$SWkchmTWj{f7p#7YBO!PTF5sw@#T`LbrdbWo*ZV_O$5xlkGCE z^PPVyNw8xApK>WbnDiuj&ts=vwm~?+7XwjY*R$0pI#j4 zw{W$hO=am?)v#v=Y$tVvo>o`d(V^*ixTv>ZZDX3QFXcToO*@xTm3CIa<27tEIc#! zWx8M8?h`8_qqEtJR5Yui4EIMazr(xByvXzMzf0?$2CWRax^UXZS*s@%RlmEiXqi&U zv6PDAY{#9wTC9VfKD+s&O=r4T6dx~>x9e7&gdYvo8^51ls#!DPMamTK%`aPJ6?q?+ z%yVDxb^Z406Q4}q)Ma`pwL@9=KH2nE%g+j0$PN+6w!7WCc0S)@-fuIzZ#hkAx*44E xJV2p&e;fZ&&B#yDAuHbPYtLW(<#g|%_lh@oH9azfmdriy#cs<|Z3p)MHvxBP8gc*t literal 4664 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 XJGIWw3pUly>lLb4Wn_sb)B64kGG>E? diff --git a/doc/html/INPUT/sources/bg_salome.gif b/doc/html/INPUT/sources/bg_salome.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7e030685526b7f63c1ea506474d5a2fd0b9082c GIT binary patch literal 7598 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 b)Exq;=*5~7iA{cZH&U`+{}F-#0LT9y;{njm literal 0 HcmV?d00001 diff --git a/doc/html/INPUT/sources/bg_salomepro.gif b/doc/html/INPUT/sources/bg_salomepro.gif deleted file mode 100755 index 677b70468f798fe4fbc20fac3d706e61179ff12b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17294 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 J&Yoe@`v>;3OCA6K literal 0 HcmV?d00001 diff --git a/doc/html/INPUT/sources/static/PrsObj.gif b/doc/html/INPUT/sources/static/PrsObj.gif new file mode 100755 index 0000000000000000000000000000000000000000..a8aa81fe0c959f6ae4684c867b5df6219b48b695 GIT binary patch literal 4732 zcmeH}i8~XHK3jR_kYo1?jB=7=1V z4)-0O93hpYT+R3Q{X2f&*MIPSJq z(@A|&`kAb@KLF_eOHo>x;HdW6whka%jSvA+pF=MvZ z=LWICR$tM*(vrS)?ELn81)=gD>OXn?y^;2d;D<@O?SW+ion1HH#s3mBJXZvNzvZ`=B}QJ%Fkt)tk!$G)K4 z@wb&nrIWkfQMHSQWTy6-ACsrneHyi_)&qPOu=PglN!3=bRCGGM!|487yp!B{M=ew3 z?%X<%`mr&s_y?@`oVSJ_3E4xn=u?6Hnj5D?-);ORT=<|b|b{Zkp+t-`SpV;T>4ths7HkpQ!${I(U-xx;Dcubvs z$eA)&Gemzn&22P1>vM1@vKS(H<=VVEe|z?4N9~#x$Lyr!n0bt(#@+{fEhP4H5p5^- zi=AV8)JRICZC;<0LC=1#ndsmBug@PBRR$c*zm)jcwqd)%uG+^lzlZf^+W+V=J`w-3 z`1Je3mwlpt4~v`bKEQ8}`}X60P4zX!|Cu&Elel|7(l`4+rthX`?azqY z0^j#@gtYL|<=7 zR&Nz#!%g@J3x@(gd2SsGlXdQg$Al`1WJDes`G)K1yL%_gmhace9eBD3W!VEcU zw1q4m6(XO>*(BM9hXSq%-kwyu;p)_h6*xPv$-S@*9xTVBUyg`r8i2` zs!$yb@5Hw;CaN#!X?Da*$4Pv>!ry)%{R*?HIC>NiTsU?g_BL_5LF0lvnNtAq%2S`YH?{ z;JXQKgZb&dY!rv2?_ZeyAjDly`e#VqK8eq^^yyCd4M$(agsFGoSH>uvN#N2`RHtjM z!q0lXo)M^KSia1pR97c0-D6R0Uuo@7Wag-*HtdPC{heAH9zh?*^n`QbP8Gr?$a{6b zr5n&h=gRoHf9d2f`4=x((EBNzP4|xg_we?oQ2LwT zU<2liI~mg8<)a>Uddv-H8`L5*IAQ--l0N1y@@gnSAi_Xou2RFfc`SnsDSp!WB?KEg z7yK<6BRY@Bz{V^GPsS!-=aZ|Qqc<;4#)XQ0g4x`tof>ma#5O)SKi1r#b8r;~$r0y1 zi%UIW^om!e?BPu`t!r%2=7sE6hp7889u~}Nlo#a1$nci#GVc$`w{Nz1peH@E4Cp?; z%YBaKqO&hwd9dcwwje&@qC}S5qDRF0O1U@pxgKa{o2f0yI#2eR&-*4^`F=# z{+uIfESFtou${g^lBf<>keXQV(@`}M%o;U&Z?CW|K=g|h!#Qn^@{$3 z%R^6<3JKdDXu$TKTp}m3cuV8UmSF3LINvFh;rJ&rxN0MMjNaiVu=Yl`V7MgVn_s=b zr`c21Bd&Q@$yaIqmfZoPZah0=+KfNPQG(*2^T;ur@c$UHjtwO6NfDs|Um*>qcR^g0m?nJ2%%s;pw6OdU47R)b#H~oyg0* zk+vE5Nj-B(RfS-41AHH+Ty?PDRL!kzK1ZjvhhtbX5-KT+@FK1c3E zS4Xz~((ArS6mNrmY@FYzb$0ps*f_4fqJ5|NLBcm7)`7_%uMZtZkxc={A|XP?8Vdj; z7x4Lbox7Ah?-OT#u@0{+(`tT(2Q zCM<-5Ex=*@%CPfav_x>vC3nwX`0_l?PwQe!{7Ia!Eck^?i+;&xn7p2_D)7d=u4i&C zFIFsII=G}^9+)l;aFy@5Ax=*n0Z>zUZVY^W8=-#({C_p`!lM5&m-{k6ms&i4oSUNO5;~<|!u_CI-Ku4JSFqJQee> z6@{i!l(%2UcG$;6MqdrMp_8J5;K2A4ziS~%p14KCAPTVvP#xld1tRMS0*gT8^an}4 zM#RP3f$$(l@|9-)Nh@keBg9;PsS@4y+d^qVEen^1Mj&63(@Ol(>d40ZD{y)YC~W!e zU>Twq7s>h^$UYv(gGDa=FfWP{J~;}=xxWnM@RF5TQNYtbp=Bu_|2l=aXriv^YJxFu`BDRbqr5JAffU&YWVpk+8D0*4El zE|WR}+gx>yTJ1;9gE^pa70gIQ#v{{6`=}7Z(TD}7P*MNeq+A5AIhaO0vGXMM2 z9L-qyr%PeC`7M^7BCEyjNHOdJr!Wl;NL&8MZ@YP8`Jw&bu&4aF=e5wzvH9;1L3L$e zN&KeVX*j%a4!y^2e=)riff8H_G{zbyM#%tj@BdiB&gq36q!t8K-twIabswZt(Ec?^Irb%w_R#Uge~1lLQ>f$qh)lxCg4@T#Fs zfKUzNrJa?f*a_5W=u2s~!3Q8m;i0T5Q8x|y~0%ETsNq(QG zx1Tdm8Sr-GY?2oI(YxUQ7zD;f z_u|odO9Y@&S}STg^s!a$m_NEQkd)EyA+655R2ZYZ!2|%H z?#k5X$LMMY^lr)63x$DVdI<%#{dnH?af5{e zv2vp+NM6<)DtZIeK16F5MX?6d+u)$KfWQtTWCuNvwK~XJW0rqE*_k*|8P^9{E9ewx h>pV5vdFHTFP^#+g8|{)6A|`+g872e5gdxkNqy4UiCv#gzaPv3LaVo8JZg ze+9IKk`e$w5a84=^q_G;uB7>^~ zl=_J}w;CuOYL+@l_H7Ae4N%F`WUnp{1ueo;MoY*kEd6X6oy?b9bgN_YDyzVHtNz@Kau<*1ffZ3vbKoiCesN$p9woZ&iaQTz7Jj>dAGb&{p|7xChv{&o8wZHL&Y zGIm~s`zR`ooi1zCruEv1+Luza;$RTqJUFB+OOZ_wJYs({MNdd))81{|Fm;qhe+VZtWk@XGg9JHuO zPA=?e5OKz!F*qRG@S(;0tFW8UA3qGQdC6IZ!+LrRtjZ(TFZ+6>^QsWdxpVXj0%wx!-}Qg|tY&Gemf#m&$? z&R1?bNZ(X7_LQyo@VWDk?ZGg5rj>?CcZT1PanIq?Ok6iMsVQ|;#M0q%<+YGA^AR~CM@=Xv8H&bpDgvEn41P?5&lL@vEX9eo0 zw^WI7_JK91>2Yb?Ja_Pvu#2hJb>eks5B5T%U#D6Kze4}h3eT&$}Onzy9G?L6Z1m;wt;J7<%cLa0( zYn$5QwZvs3JQrgPp`+%g*y=?zS<&JiAW{D(zo?}{xaqJEOaHgya+5I8r!z&kHA058 z^T*t;Q8=+1_(ZNaxGL#8mC>>5%IU`fh0B*$cIWV@qwzb-)1&P>b7h*HD_@H9lD61F zjor_v3wSO%Zf1`r`?K_GZn8{V!q(+)qT?61r?B^J=N7n9(pHk{c^Bj<0TR(sZ`glg zler01JRsOgS<%h%pi7|W?{2z~v;XccnZ2uCXZKyN86^TTVM;v6#ZA0oJcbOEh?F_M z<kuS!XuN&pXH1Mi7DZX8zOp~0pBDU)8 zwu6a!euT>rU7(Qo)+$aRDn6s)sCed`tqwdVMdgY1enzjo6g=#&!IDuOr+%GFFA7Tq zC94Pg93j~J&_~_-bhb%-Zg67^u~I#BpWlGj+Wz7u%HWATjDFuw?s>F_dRnVf1F$9~ zTn9y0*3WP7dX`b?t26$`W3%dlEwl6>e@0?i2Gtg(X-+SOOUS`EBcrSE56h4-ChsEW=7B% t^O*ijj|1h3Jwept&@qg^pjvI1 + + + + + + + Main Page + + + + +   +
+ + + + + + + + +
+ + +
+
+ +

Examples

+      Interfaces:
+
+ VISU::Base

+ VISU::VISU_Gen
+ VISU::PrsObject
+

+ VISU::Result
+
+ VISU::Prs3d

+ VISU::Mesh
+ VISU::ScalarMap
+ VISU::CutPlanes
+ VISU::CutLines
+ VISU::IsoSurfaces
+ VISU::DeformedShape
+ VISU::Vectors
+ VISU::StreamLines
+
+ VISU::Table
+ VISU::Curve
+ VISU::Container
+
+ VISU::ViewManager

+ VISU::View
+ VISU::View3D
+ VISU::TableView
+ VISU::XYPlot
+ +

Base

+ + + + + + + + + + + + +
IdType + VISU::Base::GetID   +
+
+ +

#Returns ID of the object. That is IOR of CORBA representation a VISU +object.
+

+ +

aSObject = myLocalStudy.FindObjectIOR(theResult.GetID())
+

+ + + + + + + + + + + +
VISUType + VISU::Base::GetType   +
+ +

#Returns the type of the presentable object. It can be used for quick +class definition of an VISU object
+
+ if aVISUObject.GetType() == VISU.TSCALARMAP :
+     #do something ...
+

+ +


+

+

VISU_Gen
+

+ + + + + + + + + + + + + +
void VISU::VISU_Gen::SetCurrentStudy + in SALOMEDS::Study   theStudy +
+
+
+ +

+ + + + + + + +
+ + + + + + + + + + + +
SALOMEDS::Study +VISU::VISU_Gen::GetCurrentStudy   +
+
+
+
+ #It is very important to set SALOMEDS::Study for VISU Engine before you +start any work with them.
+ #Every object that you will create will be assigned to the study you set +before.
+ #It can be done like this:
+

+ +

aStudy = myStudyManager.NewStudy("A foo Study")
+ if aStudy is None : raise RuntimeError, "Error"
+ else : print "OK"
+     theVisuGen.SetCurrentStudy(aStudy)
+     #to do every things you like
+     ...
+

+ +

+ + + + + + + +
+ + + + + + + + + + + +
ViewManager +VISU::VISU_Gen::GetViewManager   +
+
+
+ + + + + + + + + +
  +

Gets the ViewManager which is used for creation of post-processing +presentations.

+
+
+ #In order to display any VISU::PrsObject in propriate viewer you must take +VISU::ViewManager interface
+

+ +

aViewManager = myVisuGen.GetViewManager()
+ #to do something for displaing some presentation
+ ...
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + +
SALOMEDS::SObject +VISU::VISU_Gen::ImportTables in string   theFileName +
+
+
+ + + + + + + + + +
  +

Imports tables from a file and create TableAttribute in Sudy +

+
+
+ #It is possible to import some ASCII files that include text table representation. +One file can consist from more than one table.
+

+ +

aSObject = myVisuGen.ImportTables("/MyPresicousFileOfTables.txt")
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + +
Result +VISU::VISU_Gen::ImportFile in string   theFileName +
+
+
+ + + + + + + + + +
  +

Imports data from a file.

+
+
+ #It is possible import a med files to VISU
+

+ +

aResult = myVisuGen.ImportFile("/ItIsDreamOfMyLife.med")
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + +
Result +VISU::VISU_Gen::ImportMed in SALOMEDS::SObject   theMedSObject +
+
+
+ + + + + + + + + +
  +

Imports data from a MED object.

+
+
+ #
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + +
Result +VISU::VISU_Gen::ImportMedField in SALOME_MED::FIELD   theField +
+
+
+ + + + + + + + + +
  +

Imports data from a MED field.

+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mesh +VISU::VISU_Gen::MeshOnEntity in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity

+

+
+
+ + + + + + + + + +
  +

Creates a Mesh on the basis of the data generated in other sources +(MED object or file).

+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mesh +VISU::VISU_Gen::FamilyMeshOnEntity in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFamilyName

+

+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mesh +VISU::VISU_Gen::GroupMesh in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in string   theGroupName

+

+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ScalarMap +VISU::VISU_Gen::ScalarMapOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + + + + + +
  +

Creates a scalar bar presentation.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName  Group of data attributed to the MESH. The data can +be scalar or vector.
theIteration  Number of iteration on the field
+
+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DeformedShape +VISU::VISU_Gen::DeformedShapeOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + + + + + +
  +

Creates a deformed shape presentation.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName  Group of data attributed to the MESH. The data can +be scalar or vector.
theIteration  Number of iteration on the field
+
+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Vectors +VISU::VISU_Gen::VectorsOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + + + + + +
  +

Creates a vector presentation.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName  Group of data attributed to the MESH. The data can +be scalar or vector.
theIteration  Number of iteration on the field
+
+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IsoSurfaces +VISU::VISU_Gen::IsoSurfacesOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + + + + + +
  +

Creates an iso surface presentation.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName  Group of data attributed to the MESH. The data can +be scalar or vector.
theIteration  Number of iteration on the field
+
+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StreamLines +VISU::VISU_Gen::StreamLinesOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + + + + + +
  +

Creates an stream lines presentation.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName  Group of data attributed to the MESH. The data can +be scalar or vector.
theIteration  Number of iteration on the field
+
+
+
+

+ +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CutPlanes +VISU::VISU_Gen::CutPlanesOnField in Result   theResult, +

+

+
in string   theMeshName, +

+

+
in Entity   theEntity, +

+

+
in string   theFieldName, +

+

+
in double   theIteration

+

+
+
+ + + + + +
  +

Creates a presentation of cut planes.

+ +
+
Parameters:
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/html/INPUT/sources/static/overview_VISU.html b/doc/html/INPUT/sources/static/overview_VISU.html new file mode 100755 index 00000000..844abd40 --- /dev/null +++ b/doc/html/INPUT/sources/static/overview_VISU.html @@ -0,0 +1,252 @@ + + + + + + Main Page + + + +  +
theResult  Data generated in other sources. (MED object or file) +
theMeshName  One of the meshes presented in MED file
theEntity  Type of entity where the field is defined
theFieldName 
+ + + + + + +
+
+
+ + +

General overview +

+

Table of contents

+ + +
+

1. Introduction

+

Post-processing module VISU for SALOME is destined for visualization of data + produced by other components. VISU provides various forms of data visualization + including:

+ +
    +
  • Data tables,
  • +
  • XY plots based on data from tables,
  • +
  • 3D presentations,
  • +
      +
    • Scalar Map,
    • +
    • Deformed Shape,
    • +
    • Vectors,
    • +
    • Iso Surfaces,
    • +
    • Cut Planes,
    • +
    • Stream Lines,
    • +
    • Cut Lines.
    • +
    +
+Back to the contents +

2. Defintions

+

The following terms are used for presentation of the VISU module:

+
+
Study
+
manages data produced by various component of SALOME platform. More detailed description of the SALOME Study can be found in the document named "Data Structure and Persistence Specifications".
+
Component
+
a SALOME software module that implements predefined interfaces. +The component provides the data for the SALOME study in a form of links (stored in the Study) +to the specific data stored in the component. All components are CORBA servers and it allows them +to be running on different host stations.
+
Geometry
a coherent set of data produced by component GEOM or any other geometry tool +and imported using geometry exchange interface (like BRep, IGES and so on).
+
Mesh
a collection of elements used as a support for numeric simulation.
+
Field
the set of results of the same type allocated to mesh elements. +Fields can be one of next types: scalars, vectors, tensors, matrices, character strings.
+
+Back to the contents +

3. Forms of data visualization

+

3.1 Data tables

+

Table represents data in spreadsheet-like form. For these purposes the QTable + widget will be provided. This widget can be reused in any module for any dialog + box as a control. For post-processing data visualization needs this widget is + used inside of Table window (based on non-modal window frame). Data represented + in Table window of post-processing module is be editable.

+

3.2 XY plots

+

XY plot represents calculation data in form of 2D (XY) plotting. +XY plot view is shown in a separated view window (non-modal dialog box), which can be moved in any position of the screen for convenience. +The QWT extension of QT toolkit is used for XY plotting. +QWT provides unlimited number of displayed curves (data sets) and supports logarithmic scale, zooming, and selection.

+ +

3.3 3D presentations

+

A 3D presentation shows geometry, mesh and fields in 3D space. +Provides selection, rotation, zooming, scaling, and panning of 3d scene. +Color bar for scalar data presentation is supplied. +For 3D presentation window of the current implementation of VTK viewer in study window is used.

+Back to the contents +

4. Data structure

+

Source data for post-processing module can be imported from MED file or MED object in study data structure (CORBA object) can be used for this purposes.

+

In case of import MED file the data from this file will be converted in form of VTK Data Source format and stored in VISU data structure. In case of using of MED object from study the label in VISU data structure will be created with reference to the corresponded MED object.

+

Available result data is displayed under corresponded MED data label. For every result the number of presentations can be created dependently on result type.

+

Presentation is represented in data structure in form of list of presentation creation parameters. This could be:

+
    +
  • Presentation type (table, XY plot, 3d view);
  • +
  • Presentation subtype (for example for 3d: scalar map, iso-surfaces, combined view and so on);
  • +
  • Parameters of the presentation dependently on its type (number of colors, type of scale, font parameters, grid parameters and so on).
  • +
+

Parameters of presentation are persistent data, which will be stored in study file.

+ + +
+Back to the contents +

5. VISU module features and services

+

The functionality of the VISU module is provided by a set of classes which are combined into +the VISU package. +

The API reference of the VISU component can be found here.

+

5.1 Base class

+

This is a root class for all objects of the VISU module.

+

The API reference for this class can be found here.

+ +

5.2 ViewManager class

+

This class is used for management of the view windows (creation and deletion).

+

The API reference for this class can be found here.

+ +

5.3 View class

+

View class is a base for all other classes, necessary for creation of different views .

+ +
+

The API reference for this class can be found here.

+ +

5.3.1 3dView class

+

This class provides a set of methods for creation of a 3d view window.

+

The API reference for this class can be found here.

+ +

5.3.2 TableView class

+

This class provides a set of methods for creation of a Table view window.

+

The API reference for this class can be found here.

+ +

5.3.3 XYPlotView class

+

This class provides a set of methods for creation of a XYPlot view window.

+

The API reference for this class can be found here.

+ +

5.4 Result class

+

This class serves for inner representation of data generated in other sources. +(MED object or file) This data is needed for further construction of graphical presentations.

+

The API reference for this class can be found here.

+

5.5 PrsObject class

+

It is the root class of all presentable objects.

+
+

The API reference for this class can be found here.

+ +

5.5.1 Curve class

+

Manages presentation parameters of one curve. +This object can be used for presentation of set of curves using Container class.

+

The API reference for this class can be found here.

+ +

5.5.2 Table class

+

Manages presentation parameters of a table.

+

The API reference for this class can be found here.

+ +

5.5.3 Container class

+

This class is provided in order to create one presentation using several presentable objects. This can provide combination of a set of curves to display them in XY plot view. +

+

The API reference for this class can be found here.

+ +

5.5.4 Prs3d class

+

Root class for all 3D presentations.

+

The API reference for this class can be found here.

+ +

5.5.5 Mesh class

+

Manages presentation parameters of a 3D presentattion of a mesh. +This object can be used for presentation of set of curves using Container class.

+

The API reference for this class can be found here.

+ +

5.5.6 ScalarMap class

+

Manages presentation parameters of the scalar bar.

+

The API reference for this class can be found here.

+ +

5.5.7 CutLines class

+

Manages presentation parameters of the cut lines presentation.

+

The API reference for this class can be found here.

+ +

5.5.8 CutPlanes class

+

Manages presentation parameters of the cut planes presentation.

+

The API reference for this class can be found here.

+ +

5.5.9 IsoSurfaces class

+

Manages presentation parameters of the iso surfaces presentation.

+

The API reference for this class can be found here.

+ +

5.5.10 DeformedShape class

+

Manages presentation parameters of the deformed shape presentation.

+

The API reference for this class can be found here.

+ +

5.5.11 Vectors class

+

Manages presentation parameters of the vector presentation.

+

The API reference for this class can be found here.

+ +

5.5.12 StreamLines class

+

Manages presentation parameters of the streamlines presentation.

+

The API reference for this class can be found here.

+ +

5.6 Animation class

+

This class provides a set of methods used for:

+
    +
  • generating different animations,
  • +
  • setting the parameters of the animations,
  • +
  • playing these animations in the VISU module.
  • +
+

The API reference for this class can be found here.

+ +

5.7 VISU_Gen class

+

This is the main clas of the VISU component in SALOME application. It is used for , +using the views provided by ViewManager. This class provides a set of methods used for:

+
    +
  • creation of all types of post-processing presentations from given Result and Table object reference
  • +
  • creation of animations
  • + +
+

The API reference for this class can be found here.

+Back to the contents + + diff --git a/doc/html/INPUT/sources/static/page2.html b/doc/html/INPUT/sources/static/page2.html new file mode 100755 index 00000000..d31cf0c4 --- /dev/null +++ b/doc/html/INPUT/sources/static/page2.html @@ -0,0 +1,31 @@ + + + + + + Main Page + + + +  +
+ + + + + + +
+
+
+ + + + + + + + diff --git a/doc/html/INPUT/sources/static/tree.js b/doc/html/INPUT/sources/static/tree.js new file mode 100755 index 00000000..d6c4c9bf --- /dev/null +++ b/doc/html/INPUT/sources/static/tree.js @@ -0,0 +1,82 @@ +foldersTree = gFld("SALOME v.1.3.0 ", "", "") + insDoc(foldersTree, gLnk("Main Page", "", "main.html")) + +aux1 = insFld(foldersTree, gFld("TUI Reference Guide", "")) + aux2 = insFld(aux1, gFld("Modules", "")) + aux3 = insFld(aux2, gFld("SALOME VISU module", "")) + insDoc(aux3, gLnk("Overview", "", "overview_VISU.html")) + aux4 = insFld(aux3, gFld("Packages", "")) + insDoc(aux4, gLnk("VISU", "", "namespaceVISU.html")) + insDoc(aux3, gLnk("Examples", "", "examples_VISU.html")) + + +/*! Data structures +*/ + insDoc(aux1, gLnk("Data Structures", "", "annotated.html")) + +/*! insDoc(aux1, gLnk("VISU::Animation", "", "interfaceVISU_1_1Animation.html")) + insDoc(aux1, gLnk("VISU::Base", "", "interfaceVISU_1_1Base.html")) + insDoc(aux1, gLnk("VISU::Container", "", "interfaceVISU_1_1Container.html")) + insDoc(aux1, gLnk("VISU::Curve", "", "interfaceVISU_1_1Curve.html")) + insDoc(aux1, gLnk("VISU::CutLines", "", "interfaceVISU_1_1CutLines.html")) + insDoc(aux1, gLnk("VISU::CutPlanes", "", "interfaceVISU_1_1CutPlanes.html")) + insDoc(aux1, gLnk("VISU::DeformedShape", "", "interfaceVISU_1_1DeformedShape.html")) + insDoc(aux1, gLnk("VISU::IsoSurfaces", "", "interfaceVISU_1_1IsoSurfaces.html")) + insDoc(aux1, gLnk("VISU::Mesh", "", "interfaceVISU_1_1Mesh.html")) + insDoc(aux1, gLnk("VISU::Prs3d", "", "interfaceVISU_1_1Prs3d.html")) + insDoc(aux1, gLnk("VISU::PrsObject", "", "interfaceVISU_1_1PrsObject.html")) + insDoc(aux1, gLnk("VISU::Result", "", "interfaceVISU_1_1Result.html")) + insDoc(aux1, gLnk("VISU::ScalarMap", "", "interfaceVISU_1_1ScalarMap.html")) + insDoc(aux1, gLnk("VISU::StreamLines", "", "interfaceVISU_1_1StreamLines.html")) + insDoc(aux1, gLnk("VISU::Table", "", "interfaceVISU_1_1Table.html")) + insDoc(aux1, gLnk("VISU::TableView", "", "interfaceVISU_1_1TableView.html")) + insDoc(aux1, gLnk("VISU::Vectors", "", "interfaceVISU_1_1Vectors.html")) + insDoc(aux1, gLnk("VISU::View", "", "interfaceVISU_1_1View.html")) + insDoc(aux1, gLnk("VISU::View3D", "", "interfaceVISU_1_1View3D.html")) + insDoc(aux1, gLnk("VISU::ViewManager", "", "interfaceVISU_1_1ViewManager.html")) + insDoc(aux1, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html")) + insDoc(aux1, gLnk("VISU::XYPlot", "", "interfaceVISU_1_1XYPlot.html")) +*/ + insDoc(aux1, gLnk("Class Hierarchy", "", "hierarchy.html")) + +/*! + aux2 = insFld(aux1, gFld("VISU::Base", "", "interfaceVISU_1_1Base.html")) + insDoc(aux2, gLnk("VISU::Animation", "", "interfaceVISU_1_1Animation.html")) + aux3 = insFld(aux2, gFld("VISU::PrsObject", "", "interfaceVISU_1_1PrsObject.html")) + insDoc(aux3, gLnk("VISU::Container", "", "interfaceVISU_1_1Container.html")) + insDoc(aux3, gLnk("VISU::Curve", "", "interfaceVISU_1_1Curve.html")) + aux4 = insFld(aux3, gFld("VISU::Prs3d", "", "interfaceVISU_1_1Prs3d.html")) + insDoc(aux4, gLnk("VISU::Mesh", "", "interfaceVISU_1_1Mesh.html")) + aux5 = insFld(aux4, gFld("VISU::ScalarMap", "", "interfaceVISU_1_1ScalarMap.html")) + insDoc(aux5, gLnk("VISU::CutLines", "", "interfaceVISU_1_1CutLines.html")) + insDoc(aux5, gLnk("VISU::CutPlanes", "", "interfaceVISU_1_1CutPlanes.html")) + aux6 = insFld(aux5, gFld("VISU::DeformedShape", "", "interfaceVISU_1_1DeformedShape.html")) + insDoc(aux6, gLnk("VISU::StreamLines", "", "interfaceVISU_1_1StreamLines.html")) + insDoc(aux6, gLnk("VISU::Vectors", "", "interfaceVISU_1_1Vectors.html")) + insDoc(aux5, gLnk("VISU::IsoSurfaces", "", "interfaceVISU_1_1IsoSurfaces.html")) + insDoc(aux3, gLnk("VISU::Table", "", "interfaceVISU_1_1Table.html")) + insDoc(aux2, gLnk("VISU::Result", "", "interfaceVISU_1_1Result.html")) + aux3 = insFld(aux2, gFld("VISU::View", "", "interfaceVISU_1_1View.html")) + insDoc(aux3, gLnk("VISU::TableView", "", "interfaceVISU_1_1TableView.html")) + insDoc(aux3, gLnk("VISU::View3D", "", "interfaceVISU_1_1View3D.html")) + insDoc(aux3, gLnk("VISU::XYPlot", "", "interfaceVISU_1_1XYPlot.html")) + insDoc(aux2, gLnk("VISU::ViewManager", "", "interfaceVISU_1_1ViewManager.html")) + insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html")) + insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html")) + insDoc(aux2, gLnk("VISU::VISU_Gen", "", "interfaceVISU_1_1VISU__Gen.html")) +*/ + insDoc(aux1, gLnk("Class methods list", "", "functions.html")) +/*! +aux1 = insFld(foldersTree, gFld("Namespace List", "", "namespaces.html")) + insDoc(aux1, gLnk("VISU", "", "namespaceVISU.html")) +*/ + insDoc(aux1, gLnk("Namespace Members", "", "namespacemembers.html")) + + insDoc(aux1, gLnk("File List", "", "files.html")) + +/*! + insDoc(aux1, gLnk("VISU_Gen.idl", "", "VISU__Gen_8idl.html")) +*/ + +/*! insDoc(foldersTree, gLnk("Graphical Class Hierarchy", "", "inherits.html")) +*/ diff --git a/doc/html/INPUT/sources/static/treeview.js b/doc/html/INPUT/sources/static/treeview.js new file mode 100644 index 00000000..55eb43d0 --- /dev/null +++ b/doc/html/INPUT/sources/static/treeview.js @@ -0,0 +1,505 @@ +//**************************************************************** +// You are free to copy the "Folder-Tree" script as long as you +// keep this copyright notice: +// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ +// Author: Marcelino Alves Martins (martins@hks.com) December '97. +//**************************************************************** + +//Log of changes: +// 17 Feb 98 - Fix initialization flashing problem with Netscape +// +// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS; +// make the ftien4 a js file +// +// DvH: Dec 2000 - Made some minor changes to support external +// references + +// Definition of class Folder +// ***************************************************************** + +function Folder(folderDescription, tagName, hreference) //constructor +{ + //constant data + this.desc = folderDescription + this.tagName = tagName + this.hreference = hreference + this.id = -1 + this.navObj = 0 + this.iconImg = 0 + this.nodeImg = 0 + this.isLastNode = 0 + + //dynamic data + this.isOpen = true + this.iconSrc = "ftv2folderopen.png" + this.children = new Array + this.nChildren = 0 + + //methods + this.initialize = initializeFolder + this.setState = setStateFolder + this.addChild = addChild + this.createIndex = createEntryIndex + this.hide = hideFolder + this.display = display + this.renderOb = drawFolder + this.totalHeight = totalHeight + this.subEntries = folderSubEntries + this.outputLink = outputFolderLink +} + +function setStateFolder(isOpen) +{ + var subEntries + var totalHeight + var fIt = 0 + var i=0 + + if (isOpen == this.isOpen) + return + + if (browserVersion == 2) + { + totalHeight = 0 + for (i=0; i < this.nChildren; i++) + totalHeight = totalHeight + this.children[i].navObj.clip.height + subEntries = this.subEntries() + if (this.isOpen) + totalHeight = 0 - totalHeight + for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) + indexOfEntries[fIt].navObj.moveBy(0, totalHeight) + } + this.isOpen = isOpen + propagateChangesInState(this) +} + +function propagateChangesInState(folder) +{ + var i=0 + + if (folder.isOpen) + { + if (folder.nodeImg) + if (folder.isLastNode) + folder.nodeImg.src = "ftv2mlastnode.png" + else + folder.nodeImg.src = "ftv2mnode.png" + folder.iconImg.src = "ftv2folderopen.png" + for (i=0; i 0) + auxEv = "" + else + auxEv = "" + + if (level>0) + if (lastNode) //the last 'brother' in the children array + { + this.renderOb(leftSide + auxEv + "") +// leftSide = leftSide + "" + this.isLastNode = 1 + } + else + { + this.renderOb(leftSide + auxEv + "") + leftSide = leftSide + "" + this.isLastNode = 0 + } + else + this.renderOb("") + + if (nc > 0) + { + level = level + 1 + for (i=0 ; i < this.nChildren; i++) + { + if (i == this.nChildren-1) + this.children[i].initialize(level, 1, leftSide) + else + this.children[i].initialize(level, 0, leftSide) + } + } +} + +function drawFolder(leftSide) +{ + if (browserVersion == 2) { + if (!doc.yPos) + doc.yPos=8 + doc.write("") + } + if (browserVersion == 3) + { + doc.write("
") + } + + doc.write("\n") + doc.write("\n\n") + doc.write("\n
") + doc.write(leftSide) + this.outputLink() + doc.write("") + doc.write("") + if (USETEXTLINKS) + { + this.outputLink() + doc.write(this.desc + "") + } + else + doc.write(this.desc) + +/*! + if (this.tagName!="") + { + doc.write(" [external]") + } +*/ + doc.write("
\n") + + if (browserVersion == 2) { + doc.write("") + } + if (browserVersion == 3) { + doc.write("
") + } + + if (browserVersion == 1) { + this.navObj = doc.all["folder"+this.id] + this.iconImg = doc.all["folderIcon"+this.id] + this.nodeImg = doc.all["nodeIcon"+this.id] + } else if (browserVersion == 2) { + this.navObj = doc.layers["folder"+this.id] + this.iconImg = this.navObj.document.images["folderIcon"+this.id] + this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] + doc.yPos=doc.yPos+this.navObj.clip.height + } else if (browserVersion == 3) { + this.navObj = doc.getElementById("folder"+this.id) + this.iconImg = doc.images.namedItem("folderIcon"+this.id) + this.nodeImg = doc.images.namedItem("nodeIcon"+this.id) + } +} + +function outputFolderLink() +{ + if (this.hreference) + { + doc.write(" 0) + doc.write("onClick='javascript:clickOnFolder("+this.id+")'") + doc.write(">") + } + else + doc.write("") +} + +function addChild(childNode) +{ + this.children[this.nChildren] = childNode + this.nChildren++ + return childNode +} + +function folderSubEntries() +{ + var i = 0 + var se = this.nChildren + + for (i=0; i < this.nChildren; i++){ + if (this.children[i].children) //is a folder + se = se + this.children[i].subEntries() + } + + return se +} + + +// Definition of class Item (a document or link inside a Folder) +// ************************************************************* + +function Item(itemDescription, tagName, itemLink) // Constructor +{ + // constant data + this.desc = itemDescription + this.tagName = tagName + this.link = itemLink + this.id = -1 //initialized in initalize() + this.navObj = 0 //initialized in render() + this.iconImg = 0 //initialized in render() + this.iconSrc = "ftv2doc.png" + + // methods + this.initialize = initializeItem + this.createIndex = createEntryIndex + this.hide = hideItem + this.display = display + this.renderOb = drawItem + this.totalHeight = totalHeight +} + +function hideItem() +{ + if (browserVersion == 1 || browserVersion == 3) { + if (this.navObj.style.display == "none") + return + this.navObj.style.display = "none" + } else { + if (this.navObj.visibility == "hidden") + return + this.navObj.visibility = "hidden" + } +} + +function initializeItem(level, lastNode, leftSide) +{ + this.createIndex() + + if (level>0) + if (lastNode) //the last 'brother' in the children array + { + this.renderOb(leftSide + "") + leftSide = leftSide + "" + } + else + { + this.renderOb(leftSide + "") + leftSide = leftSide + "" + } + else + this.renderOb("") +} + +function drawItem(leftSide) +{ + if (browserVersion == 2) + doc.write("") + if (browserVersion == 3) + doc.write("
") + + doc.write("\n\n") + doc.write("\n
") + doc.write(leftSide) + if (this.link!="") + { + doc.write("") + } + doc.write("") + if (this.link!="") + { + doc.write("") + } + doc.write("") + if (USETEXTLINKS && this.link!="") + doc.write("" + this.desc + "") + else + doc.write(this.desc) +/*! + if (this.tagName!="") + { + doc.write(" [external]"); + } +*/ + doc.write("\n
\n") + + if (browserVersion == 2) + doc.write("") + if (browserVersion == 3) + doc.write("
") + + if (browserVersion == 1) { + this.navObj = doc.all["item"+this.id] + this.iconImg = doc.all["itemIcon"+this.id] + } else if (browserVersion == 2) { + this.navObj = doc.layers["item"+this.id] + this.iconImg = this.navObj.document.images["itemIcon"+this.id] + doc.yPos=doc.yPos+this.navObj.clip.height + } else if (browserVersion == 3) { + this.navObj = doc.getElementById("item"+this.id) + this.iconImg = doc.images.namedItem("itemIcon"+this.id) + } +} + + +// Methods common to both objects (pseudo-inheritance) +// ******************************************************** + +function display() +{ + if (browserVersion == 1 || browserVersion == 3) + this.navObj.style.display = "block" + else + this.navObj.visibility = "show" +} + +function createEntryIndex() +{ + this.id = nEntries + indexOfEntries[nEntries] = this + nEntries++ +} + +// total height of subEntries open +function totalHeight() //used with browserVersion == 2 +{ + var h = this.navObj.clip.height + var i = 0 + + if (this.isOpen) //is a folder and _is_ open + for (i=0 ; i < this.nChildren; i++) + h = h + this.children[i].totalHeight() + + return h +} + + +// Events +// ********************************************************* + +function clickOnFolder(folderId) +{ + var clicked = indexOfEntries[folderId] + + if (!clicked.isOpen) + clickOnNode(folderId) + + return + + if (clicked.isSelected) + return +} + +function clickOnNode(folderId) +{ + var clickedFolder = 0 + var state = 0 + + clickedFolder = indexOfEntries[folderId] + state = clickedFolder.isOpen + + clickedFolder.setState(!state) //open<->close +} + +function initializeDocument() +{ + doc = document; + if (doc.all) + browserVersion = 1 //IE4 + else + if (doc.layers) + browserVersion = 2 //NS4 + else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1) + browserVersion = 3 //mozilla + else + browserVersion = 0 //other + + foldersTree.initialize(0, 1, "") + foldersTree.display() + + if (browserVersion > 0) + { + if(browserVersion != 3) + doc.write(" ") + + // close the whole tree + clickOnNode(0) + // open the root folder + clickOnNode(0) + } +} + +// Auxiliary Functions for Folder-Treee backward compatibility +// ********************************************************* + +function gFld(description, tagName, hreference) +{ + folder = new Folder(description, tagName, hreference) + return folder +} + +function gLnk(description, tagName, linkData) +{ + fullLink = "" + + if (linkData!="") + { + fullLink = "'"+linkData+"' target=\"basefrm\"" + } + + linkItem = new Item(description, tagName, fullLink) + return linkItem +} + +function insFld(parentFolder, childFolder) +{ + return parentFolder.addChild(childFolder) +} + +function insDoc(parentFolder, document) +{ + parentFolder.addChild(document) +} + +// Global variables +// **************** + +USETEXTLINKS = 1 +indexOfEntries = new Array +nEntries = 0 +doc = document +browserVersion = 0 +selectedFolder=0 diff --git a/doc/html/Makefile.in b/doc/html/Makefile.in index 6b636a24..812d7cdf 100644 --- a/doc/html/Makefile.in +++ b/doc/html/Makefile.in @@ -1,11 +1,14 @@ -# -* Makefile *- +# Copyright (C) 2003 CEA/DEN, EDF R&D # -# Author : Vasily Rusyaev (Open Cascade NN) -# Date : 13/02/2003 -# $Header: # -# source path +# +# File : Makefile.in +# Author : Vasily Rusyaev (Open Cascade NN) +# Module : doc +# $Header: + top_srcdir=@top_srcdir@ +root_srcdir=@ROOT_SRCDIR@ top_builddir=../.. srcdir=@srcdir@ VPATH=.:@srcdir@ @@ -16,11 +19,11 @@ doxygen=@DOXYGEN@ doc: cp -fr $(srcdir)/INPUT ./; \ cd INPUT; \ - sed 's|../../../share/salome|../$(top_srcdir)|' doxyfile > doxyfile1; \ + sed 's|../../../share/salome|$(root_srcdir)|' doxyfile > doxyfile1; \ mv -f doxyfile1 doxyfile; \ $(doxygen) ./doxyfile; \ cd ..; \ - cp -f $(srcdir)/INPUT/sources/doxygen.css ./html/doxygen.css + cp -fr $(srcdir)/INPUT/sources/static/*.* ./html/ cp -fr $(srcdir)/INPUT/sources/ html/ cp -fr $(srcdir)/INPUT/exemple/ html/ cp -fr $(srcdir)/INPUT/HTML/ html/ diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index b04df244..5d62ff55 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -5,14 +5,11 @@ // File : VISU_Gen.idl // Author : Alexey Petrov -/*! \file VISU_Gen.idl This file conatins a set of interfaces of %VISU module. - This module will provide various forms of data visualization in %SALOME application. +/*! \file VISU_Gen.idl This file conatins a set of interfaces of the %VISU module. + This module provides various forms of data visualization in %SALOME application. These forms include data tables, XY plots, 3d representations and combination of these forms. */ -/*! - \defgroup Visu SALOME VISU module -*/ #ifndef __VISU_GEN__ #define __VISU_GEN__ @@ -23,16 +20,22 @@ #include "SALOMEDS_Attributes.idl" #include "MED.idl" -/*! \ingroup Visu - The main package of interfaces of the module %VISU. +/*! + The main package of interfaces of the post-processing module %VISU. */ module VISU { //------------------------------------------------------- typedef string IdType; - enum Scaling{ LINEAR, LOGARITHMIC}; +/*! + This enumeration contains a set of elements defining the type of the scaling, which +can be applied on different presentations. +*/ + enum Scaling{ LINEAR, /*!< Linear type of scaling. */ + LOGARITHMIC /*!< Logarithmic type of scaling. */ + }; enum Entity{ NODE, EDGE, FACE, CELL}; /*! - This enumeration contains a set of elements defining the type of the module. + This enumeration contains a set of elements defining the type of the %VISU object. */ enum VISUType{ TNONE, TCURVE, TTABLE, TCONTAINER, TMESH, TSCALARMAP, @@ -53,7 +56,7 @@ Returns the type of the presentable object }; /*! \brief Presentable object interface - It is the root class of all presentable objects. +Presentable object interface is the root class of all presentable objects. */ interface PrsObject : Base{ }; @@ -118,29 +121,29 @@ Gets the color of the curve. */ SALOMEDS::Color GetColor(); /*! - This enumeration contains a set of elements defining the representation type of markers (data points) with help of + This enumeration contains a set of elements defining the presentation type of markers (data points) with help of which the curve is constructed on the graphics. */ enum MarkerType{ NONE, CIRCLE, RECTANGLE, DIAMOND, DTRIANGLE, UTRIANGLE, LTRIANGLE, RTRIANGLE, CROSS, XCROSS }; /*! -Sets the representation type of markers (data points) with help of +Sets the presentation type of markers (data points) with help of which the curve is constructed on the graphics. */ void SetMarker(in MarkerType theType); /*! -Gets the representation type of markers (data points) with help of +Gets the presentation type of markers (data points) with help of which the curve is constructed on the graphics. */ MarkerType GetMarker(); /*! This enumeration contains a set of elements defining the - type of representation of curve lines on the graphics. + type of presentation of a curve line on the graphics. */ enum LineType{ VOIDLINE, SOLIDLINE, DASHLINE, DOTLINE, DASHDOTLINE, DASHDOTDOTLINE}; /*! -Sets the type of representation of curve lines on the graphics. +Sets the type of presentation of curve lines on the graphics. */ void SetLine(in LineType theType, in long theLineWidth); /*! @@ -178,17 +181,25 @@ Removes all curves from the container. }; //------------------------------------------------------- +/*! \brief 3D presentation interface + +This is a root class for all 3D presentations, which can be displayed in %VISU module. +*/ interface Prs3d : PrsObject{ +/*! Kills a 3D presentation. +*/ void Destroy(); }; /*! This enumeration contains a set of elements defining the - type of representation of the mesh. + type of presentation of the mesh. */ enum PresentationType{ POINT, WIREFRAME, SHADED, + INSIDEFRAME, + SURFACEFRAME, SHRINK }; /*! \brief Interface of the mesh. @@ -334,7 +345,7 @@ Gets the title of this presentable object. Presentation parameters of the deformed shape presentation. */ - interface DeformedShape : ScalarMap{ + interface DeformedShape : ScalarMap{ /*! Sets the scale of the presentatable object. */ @@ -343,16 +354,24 @@ Sets the scale of the presentatable object. Gets the scale of the presentatable object. */ double GetScale(); + + boolean IsColored(); + void ShowColored(in boolean theColored); + + SALOMEDS::Color GetColor(); + void SetColor(in SALOMEDS::Color theColor); }; //------------------------------------------------------- /*! \brief Cut planes interface -Presentation parameters of Cut planes presentation. +Presentation parameters of Cut planes presentation. This type of presentation consists of +cutting your initial mesh by a definite number of planes. As the result you will see these planes +which will be cutted by the borders of the mesh. */ interface CutPlanes : ScalarMap{ /*! This enumeration contains a set of elements defining the orientation in 3D space - of cut planes presentation. + of the cut planes. */ enum Orientation {XY, YZ, ZX}; /*! @@ -363,9 +382,43 @@ Sets the type of orientation in 3D space of cut planes presentation. Gets the type of orientation in 3D space of cut planes presentation. */ Orientation GetOrientationType(); +/*! +Sets the displacement of the cut planes in 3D space. + +\param theDisp This parameter defines position of the cut planes +in 3D space. It varies from 0 to 1. If the chosen value is 0.5, the cut planes +will be evenly located regarding each other; in other words, the distance between all +of them will equal. If the value is higher or lower than 0.5, the planes will be displaced +to one or another side. +*/ void SetDisplacement(in double theDisp); +/*! +Gets the displacement of the cut planes in 3D space. +*/ double GetDisplacement(); /*! +Sets the position of a definite cut plane +*/ + void SetPlanePosition(in long thePlaneNumber, in double thePlanePosition); + +/*! +Sets the position of the choosen plane to default value +*/ + void SetDefault(in long thePlaneNumber); + +/*! +Gets the position of the choosen plane +*/ + + double GetPlanePosition(in long thePlaneNumber); + +/*! +Determines whether the choosen plane has default position +*/ + + boolean IsDefault(in long thePlaneNumber); + +/*! Sets the number of cut planes. */ void SetNbPlanes(in long theNb); @@ -391,10 +444,6 @@ Sets rotation angle of the cut plane presentation. double GetRotateY(); }; //------------------------------------------------------- - /*! \brief Interface of the stream lines representation - This interface contains presentation parameters of - stream lines presentations. - */ /*! \brief Cut lines interface Presentation parameters of Cut lines presentation. @@ -413,6 +462,18 @@ Presentation parameters of Cut lines presentation. double GetDisplacement(); double GetDisplacement2(); + void SetBasePlanePosition(in double thePlanePosition); + double GetBasePlanePosition(); + + void SetLinePosition(in long thePlaneNumber, in double thePlanePosition); + double GetLinePosition(in long thePlaneNumber); + + void SetDefault(); + boolean IsDefault(); + + void SetDefaultPosition(in long thePlaneNumber); + boolean IsDefaultPosition(in long thePlaneNumber); + void SetNbLines(in long theNb); long GetNbLines(); @@ -428,7 +489,10 @@ Presentation parameters of Cut lines presentation. double GetRotateY(); double GetRotateY2(); }; - + /*! \brief Interface of the stream lines representation + This interface contains presentation parameters of + stream lines presentations. + */ interface StreamLines : DeformedShape{ enum Direction{ FORWARD, BACKWARD, @@ -571,6 +635,7 @@ This interface serves for inner representation of data generated in other source This data is needed for further construction of graphical presentations. */ interface Result : Base { + boolean BuildAll(); }; //------------------------------------------------------- interface ViewManager; @@ -857,26 +922,44 @@ False if the parameters with this name don't exist. //------------------------------------------------------- +/*! \brief Interface of the Table view + +This interface is used for creation of a view necessary for presentation of a table. +*/ interface TableView : View { - + }; //------------------------------------------------------- +/*! \brief Interface of the XY plot view + +This interface is used for creation of a view necessary for presentation of a XY plot generated on the basis +of one or several curve lines. +*/ interface XYPlot : View { +/*! Sets the title of the XY plot +\param theTitle The title of the XY plot +*/ + void SetSubTitle(in string theTitle); +/*! Gets the title of the XY plot +*/ string GetSubTitle(); - +/*! +This enumeration contains a set of elements determining the type of the curve lines, which +will be displayed in your XY plot. +*/ enum CurveType { POINTS, MULTYLINE, SPLINE}; void SetCurveType(in CurveType theType); CurveType GetCurveType(); - + void SetMarkerSize(in long theSize); long GetMarkerSize(); void EnableXGrid(in boolean theMajor, in long theNumMajor, in boolean theMinor, in long theNumMinor); void EnableYGrid(in boolean theMajor, in long theNumMajor, in boolean theMinor, in long theNumMinor); - + void SetHorScaling(in Scaling theScaling); Scaling GetHorScaling(); void SetVerScaling(in Scaling theScaling); @@ -920,6 +1003,7 @@ False if the parameters with this name don't exist. void Destroy(in View theView); + void ProcessEvents(); }; }; #endif diff --git a/resources/VISU_en.xml b/resources/VISU_en.xml index 4f3216ba..9b738601 100644 --- a/resources/VISU_en.xml +++ b/resources/VISU_en.xml @@ -70,6 +70,9 @@ + + + diff --git a/resources/VISU_fr.xml b/resources/VISU_fr.xml index 7ff81e22..9b738601 100644 --- a/resources/VISU_fr.xml +++ b/resources/VISU_fr.xml @@ -15,9 +15,11 @@ + - - + + + @@ -27,7 +29,9 @@ - + + + @@ -66,6 +70,9 @@ + + + @@ -83,13 +90,15 @@ - + - + + + diff --git a/src/CONVERTOR/Makefile.in b/src/CONVERTOR/Makefile.in index 69020189..d5b5d391 100644 --- a/src/CONVERTOR/Makefile.in +++ b/src/CONVERTOR/Makefile.in @@ -25,9 +25,9 @@ # Module : VISU top_srcdir=@top_srcdir@ -top_builddir=../../.. +top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl +VPATH=.:@srcdir@ @COMMENCE@ @@ -44,7 +44,9 @@ LIB_SRC = VISU_Convertor.cxx VISU_Convertor_impl.cxx VISU_ConvertorUtils.cxx \ BIN = VISUConvertor BIN_SRC = -CPPFLAGS+= -ftemplate-depth-32 $(VTK_INCLUDES) $(MED2_INCLUDES) $(QT_INCLUDES) -LDFLAGS+= $(VTK_LIBS) $(MED2_LIBS) $(HDF5_LIBS) $(QT_LIBS) +CPPFLAGS+= -ftemplate-depth-32 $(VTK_INCLUDES) $(MED2_INCLUDES) $(QT_INCLUDES) \ + -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS+= $(VTK_LIBS) $(MED2_LIBS) $(HDF5_LIBS) $(QT_LIBS) \ + -L${KERNEL_ROOT_DIR}/lib/salome @CONCLUDE@ diff --git a/src/Makefile.in b/src/Makefile.in index 2e69db2f..0751cdb2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -32,6 +32,6 @@ VPATH=.:@srcdir@ @COMMENCE@ -SUBDIRS = OBJECT VISU_I VISUGUI VISU_SWIG +SUBDIRS = CONVERTOR PIPELINE OBJECT VISU_I VISUGUI VISU_SWIG @MODULE@ diff --git a/src/OBJECT/Makefile.in b/src/OBJECT/Makefile.in index 66d61f25..310b2725 100644 --- a/src/OBJECT/Makefile.in +++ b/src/OBJECT/Makefile.in @@ -32,13 +32,12 @@ VPATH=.:@srcdir@:@top_srcdir@/idl @COMMENCE@ -EXPORT_HEADERS = VISU_Actor.h VISU_LookupTable.hxx VISU_ScalarBarActor.hxx - +EXPORT_HEADERS = VISU_Actor.h VISU_MeshAct.h VISU_ScalarMapAct.h VISU_VectorsAct.h # Libraries targets LIB = libVisuObject.la -LIB_SRC = VISU_Actor.cxx VISU_LookupTable.cxx VISU_ScalarBarActor.cxx +LIB_SRC = VISU_Actor.cxx VISU_MeshAct.cxx VISU_ScalarMapAct.cxx VISU_VectorsAct.cxx LIB_CLIENT_IDL = @@ -46,13 +45,12 @@ LIB_CLIENT_IDL = BIN = BIN_SRC = -CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) \ - $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS+=$(QT_MT_LIBS) $(VTK_LIBS) $(OGL_LIBS) $(PYTHON_LIBS) \ - -lSalomeObject -L${KERNEL_ROOT_DIR}/lib/salome +CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) \ + -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS+=$(VTK_LIBS) -lSalomeObject \ + -lVisuPipeLine -L${KERNEL_ROOT_DIR}/lib/salome %_moc.cxx: %.h $(MOC) $< -o $@ - @CONCLUDE@ diff --git a/src/OBJECT/VISU_Actor.cxx b/src/OBJECT/VISU_Actor.cxx index 814ef814..6a2ccc10 100644 --- a/src/OBJECT/VISU_Actor.cxx +++ b/src/OBJECT/VISU_Actor.cxx @@ -26,32 +26,27 @@ // Module : VISU // $Header$ -using namespace std; #include "VISU_Actor.h" -#include "VISU_LookupTable.hxx" -#include "VISU_ScalarBarActor.hxx" +#include "VISU_PipeLine.hxx" +#include "SALOME_PassThroughFilter.h" // VTK Includes -#include #include +#include #include -#include #include -static int VISU_POINT_SIZE = 3; +using namespace std; //======================================================================= -VISU_Actor* VISU_Actor::New(){ - vtkObject* ret = vtkObjectFactory::CreateInstance("VISU_Actor"); - if(ret) return (VISU_Actor*)ret; - return new VISU_Actor; -} +vtkStandardNewMacro(VISU_Actor); VISU_Actor::VISU_Actor(){ myIsShrunk = false; myIsShrinkable = false; myParent = this; + myPipeLine = NULL; myPrs3d = NULL; myIO = NULL; @@ -78,35 +73,57 @@ void VISU_Actor::setIO(const Handle(SALOME_InteractiveObject)& theIO){ myName = theIO->getName(); } -void VISU_Actor::setPrs3d(VISU::Prs3d_i* thePrs3d){ +void VISU_Actor::SetPrs3d(VISU::Prs3d_i* thePrs3d){ myPrs3d = thePrs3d; } -void VISU_Actor::SetParent(VISU_Actor* theParent){ - myParent = theParent; +void VISU_Actor::SetPipeLine(VISU_PipeLine* thePipeLine) throw(std::runtime_error&){ + if (myPipeLine != thePipeLine){ + if (myPipeLine != NULL) myPipeLine->UnRegister(this); + myPipeLine = thePipeLine; + if (myPipeLine != NULL) myPipeLine->Register(this); + this->Modified(); + vtkMapper *aMapper = myPipeLine->GetMapper(); + vtkDataSet *aDataSet = aMapper->GetInput(); + if(!aDataSet) + throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no input data"); + aDataSet->Update(); + static float eps = VTK_LARGE_FLOAT * 0.1 ; + if(aDataSet->GetLength() > eps) + throw std::runtime_error("VISU_Actor::SetPipeLine >> Diagonal of the actor is too large"); + if(!aDataSet->GetNumberOfCells()) + throw std::runtime_error("VISU_Actor::SetPipeLine >> There is no visible elements"); + SetShrinkable(aDataSet->GetNumberOfCells() > 10); + + vtkDataSetMapper* aNewMapper = vtkDataSetMapper::New(); + aNewMapper->SetInput(aDataSet); + aMapper->ShallowCopy(aMapper); + SetMapper(aNewMapper); + aNewMapper->Delete(); + } } -void VISU_Actor::SetMapper(vtkMapper* theMapper){ - SALOME_Actor::SetMapper(theMapper); +void VISU_Actor::SetParent(VISU_Actor* theParent){ + myParent = theParent; } void VISU_Actor::SetShrinkable(bool theIsShrinkable){ myIsShrinkable = theIsShrinkable; } -void VISU_Actor::setShrink(float theFactor){ +void VISU_Actor::SetShrink(float theFactor){ if(!myIsShrinkable || myIsShrunk) return; vtkShrinkPolyData *aShrinkFilter = vtkShrinkPolyData::New(); aShrinkFilter->SetShrinkFactor(theFactor); // use for post-filtering aShrinkFilter->SetInput(myPassFilter[2]->GetPolyDataOutput()); myPassFilter[3]->SetInput(aShrinkFilter->GetOutput()); - myPassFilter[3]->Modified(); + aShrinkFilter->Register(myPassFilter[3]); aShrinkFilter->Delete(); myIsShrunk = true; } -void VISU_Actor::unShrink(){ +void VISU_Actor::UnShrink(){ if(!myIsShrunk) return; myPassFilter[3]->SetInput(myPassFilter[2]->GetPolyDataOutput()); myPassFilter[3]->Modified(); @@ -137,16 +154,6 @@ float VISU_Actor::GetLineWidth(){ return GetProperty()->GetLineWidth(); } -void VISU_Actor::SetRepresentation(int theMode) { - GetProperty()->SetRepresentation(theMode); - if(theMode == 0) - GetProperty()->SetPointSize(VISU_POINT_SIZE); -} - -int VISU_Actor::GetRepresentation(){ - return GetProperty()->GetRepresentation(); -} - void VISU_Actor::ShallowCopy(vtkProp *prop){ VISU_Actor *anActor = VISU_Actor::SafeDownCast(prop); if(anActor != NULL){ @@ -165,202 +172,3 @@ void VISU_Actor::highlight(Standard_Boolean highlight) { if(ishighlighted) ishighlighted=false; } } - -//======================================================================= - -VISUScalarMap_Actor* VISUScalarMap_Actor::New(){ - vtkObject* ret = vtkObjectFactory::CreateInstance("VISUScalarMap_Actor"); - if(ret) return (VISUScalarMap_Actor*)ret; - return new VISUScalarMap_Actor; -} - -VISUScalarMap_Actor::VISUScalarMap_Actor(){ - myScalarBar = VISU_ScalarBarActor::New(); - GetProperty()->FrontfaceCullingOff(); - GetProperty()->BackfaceCullingOff(); -} - -VISUScalarMap_Actor::~VISUScalarMap_Actor(){ - myScalarBar->Delete(); -} - -void VISUScalarMap_Actor::AddToRender(vtkRenderer* theRenderer){ - SALOME_Actor::AddToRender(theRenderer); - if(myScalarBar) - theRenderer->AddActor2D(myScalarBar); -} - -void VISUScalarMap_Actor::RemoveFromRender(vtkRenderer* theRenderer){ - SALOME_Actor::RemoveFromRender(theRenderer); - if(myScalarBar) - theRenderer->RemoveActor(myScalarBar); -} - -void VISUScalarMap_Actor::SetVisibility(int theMode){ - SALOME_Actor::SetVisibility(theMode); - if(myScalarBar) myScalarBar->SetVisibility(*myBarVisibility && theMode); -} - -int VISUScalarMap_Actor::GetVisibility(){ - return SALOME_Actor::GetVisibility(); -} - -void VISUScalarMap_Actor::SetBarVisibility(const bool* theMode){ - myBarVisibility = theMode; - if(myScalarBar) myScalarBar->SetVisibility(*myBarVisibility); -} - -//======================================================================= - -VISUMesh_Actor* VISUMesh_Actor::New(){ - vtkObject* ret = vtkObjectFactory::CreateInstance("VISUMesh_Actor"); - if(ret) return (VISUMesh_Actor*)ret; - return new VISUMesh_Actor; -} - -VISUMesh_Actor::VISUMesh_Actor(){ - myEdgeMapper = vtkPolyDataMapper::New(); - mySurfaceActor = VISU_Actor::New(); - mySurfaceActor->SetParent(this); - mySurfaceActor->GetProperty()->SetPointSize(VISU_POINT_SIZE); - mySurfaceActor->GetProperty()->FrontfaceCullingOff(); - mySurfaceActor->GetProperty()->BackfaceCullingOff(); - mySurfaceActor->SetRepresentation(2); - - myEdgeActor = VISU_Actor::New(); - myEdgeActor->SetParent(this); - myEdgeActor->PickableOff(); - myEdgeActor->GetProperty()->SetPointSize(VISU_POINT_SIZE); - myEdgeActor->GetProperty()->FrontfaceCullingOff(); - myEdgeActor->GetProperty()->BackfaceCullingOff(); - myEdgeActor->SetRepresentation(2); - - myRepresentation = 2; //SURFACE - myVisibility = 1; //On -} - -VISUMesh_Actor::~VISUMesh_Actor(){ - myEdgeMapper->Delete(); - mySurfaceActor->Delete(); - myEdgeActor->Delete(); -} - -void VISUMesh_Actor::setIO(const Handle(SALOME_InteractiveObject)& theIO){ - mySurfaceActor->setIO(theIO); - myEdgeActor->setIO(theIO); -} - -void VISUMesh_Actor::setPrs3d(VISU::Prs3d_i* thePrs3d){ - if(thePrs3d){ - VISU_Actor::setPrs3d(thePrs3d); - mySurfaceActor->setPrs3d(thePrs3d); - myEdgeActor->setPrs3d(thePrs3d); - } -} - -void VISUMesh_Actor::AddToRender(vtkRenderer* theRenderer){ - theRenderer->AddActor(mySurfaceActor); - theRenderer->AddActor(myEdgeActor); -} - -void VISUMesh_Actor::RemoveFromRender(vtkRenderer* theRenderer){ - theRenderer->RemoveActor(mySurfaceActor); - theRenderer->RemoveActor(myEdgeActor); -} - -void VISUMesh_Actor::SetMapper(vtkMapper* theMapper){ - VISU_Actor::SetMapper(theMapper); - SALOME_PassThroughFilter* aPassFilter = SALOME_PassThroughFilter::New(); - aPassFilter->SetInput(theMapper->GetInput()); - vtkFeatureEdges *aFeatureEdges = vtkFeatureEdges::New(); - aFeatureEdges->SetInput(aPassFilter->GetPolyDataOutput()); - aFeatureEdges->BoundaryEdgesOn(); - aFeatureEdges->ManifoldEdgesOn(); - myEdgeMapper->SetInput(aFeatureEdges->GetOutput()); - aFeatureEdges->Delete(); - myEdgeMapper->ScalarVisibilityOff(); - myEdgeActor->SetMapper(myEdgeMapper); - mySurfaceActor->SetMapper(theMapper); -} - -void VISUMesh_Actor::SetTransform(SALOME_Transform* theTransform){ - mySurfaceActor->SetTransform(theTransform); - myEdgeActor->SetTransform(theTransform); -} - -void VISUMesh_Actor::SetShrinkable(bool theIsShrinkable){ - myIsShrinkable = theIsShrinkable; - myEdgeActor->SetShrinkable(myIsShrinkable); - mySurfaceActor->SetShrinkable(myIsShrinkable); -} - -vtkProperty* VISUMesh_Actor::GetProperty(){ - mySurfaceActor->GetProperty(); -} - -void VISUMesh_Actor::SetProperty(vtkProperty* theProperty){ - mySurfaceActor->SetProperty(theProperty); -} - -vtkProperty* VISUMesh_Actor::GetEdgeProperty(){ - myEdgeActor->GetProperty(); -} - -void VISUMesh_Actor::SetEdgeProperty(vtkProperty* theProperty){ - myEdgeActor->SetProperty(theProperty); -} - -void VISUMesh_Actor::SetLineWidth(float theLineWidth){ - GetProperty()->SetLineWidth(theLineWidth); - GetEdgeProperty()->SetLineWidth(theLineWidth); -} - -float VISUMesh_Actor::GetLineWidth(){ - return GetProperty()->GetLineWidth(); -} - -void VISUMesh_Actor::setShrink(float theFactor){ - if(!myIsShrinkable || myIsShrunk || myRepresentation == 0) return; - mySurfaceActor->setShrink(theFactor); - myIsShrunk = true; - SetRepresentation(myRepresentation); -} - -void VISUMesh_Actor::unShrink(){ - if(!myIsShrunk) return; - mySurfaceActor->unShrink(); - myIsShrunk = false; - SetRepresentation(myRepresentation); -} - -void VISUMesh_Actor::SetRepresentation(int theMode){ - if(theMode < 0 || theMode >2) return; - myRepresentation = theMode; - myEdgeActor->SetRepresentation(2); - mySurfaceActor->SetRepresentation(myRepresentation); - switch(theMode){ - case 0: //POINTS - myEdgeActor->VisibilityOff(); - mySurfaceActor->VisibilityOn(); - break; - case 1: //WIREFRAME - myEdgeActor->VisibilityOff(); - mySurfaceActor->VisibilityOn(); - break; - case 2: //SURFACE - myEdgeActor->SetVisibility(!myIsShrunk); - mySurfaceActor->VisibilityOn(); - break; - } - myRepresentation = theMode; -} - -void VISUMesh_Actor::SetVisibility(int theMode){ - SetRepresentation(myRepresentation); - myEdgeActor->SetVisibility(theMode); - mySurfaceActor->SetVisibility(theMode); - myVisibility = theMode; -} - -//======================================================================= - diff --git a/src/OBJECT/VISU_Actor.h b/src/OBJECT/VISU_Actor.h index 641a9442..1d8b3418 100644 --- a/src/OBJECT/VISU_Actor.h +++ b/src/OBJECT/VISU_Actor.h @@ -26,23 +26,21 @@ // Module : VISU // $Header$ -using namespace std; - #ifndef VISU_ACTOR_H #define VISU_ACTOR_H #include "SALOME_Actor.h" + +#include #include class vtkProp; -class vtkPolyData; class vtkProperty; -class vtkPolyDataMapper; namespace VISU { class Prs3d_i; } -class VISU_ScalarBarActor; +class VISU_PipeLine; #ifdef _WIN_32 #define VTKOCC_EXPORT __declspec (dllexport) @@ -59,8 +57,11 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor { virtual void setIO(const Handle(SALOME_InteractiveObject)& theIO); - VISU::Prs3d_i* getPrs3d(){ return myPrs3d;} - virtual void setPrs3d(VISU::Prs3d_i* thePrs3d); + VISU::Prs3d_i* GetPrs3d(){ return myPrs3d;} + virtual void SetPrs3d(VISU::Prs3d_i* thePrs3d); + + virtual VISU_PipeLine* GetPipeLine() { return myPipeLine;} + virtual void SetPipeLine(VISU_PipeLine* thePipeLine) throw(std::runtime_error&); VISU_Actor* GetParent(){ return myParent;} virtual void SetParent(VISU_Actor* theParent); @@ -71,14 +72,12 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor { void SetOpacity(float opa) {}; float GetOpacity() { return 0;}; - virtual void SetMapper(vtkMapper* theMapper); - virtual void SetShrinkable(bool theIsShrinkable); virtual bool GetShrinkable() { return myIsShrinkable;} - virtual bool isShrunk() { return myIsShrunk;} - virtual void setShrink(float theFactor = 0.8); - virtual void unShrink(); + virtual bool IsShrunk() { return myIsShrunk;} + virtual void SetShrink(float theFactor = 0.8); + virtual void UnShrink(); virtual void SetVisibility(int theMode); virtual int GetVisibility(); @@ -89,9 +88,6 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor { virtual void SetLineWidth(float theLineWidth); virtual float GetLineWidth(); - virtual void SetRepresentation(int theMode); - virtual int GetRepresentation(); - bool IsHighlighting; std::string myFieldName; @@ -100,82 +96,10 @@ class VTKOCC_EXPORT VISU_Actor : public SALOME_Actor { VISU_Actor* myParent; VISU::Prs3d_i* myPrs3d; + VISU_PipeLine* myPipeLine; vtkProperty* HighlightProperty; bool myIsShrinkable; bool myIsShrunk; }; -//======================================================================= - -class VTKOCC_EXPORT VISUScalarMap_Actor : public VISU_Actor { - public: - vtkTypeMacro(VISUScalarMap_Actor,VISU_Actor); - static VISUScalarMap_Actor* New(); - ~VISUScalarMap_Actor(); - - virtual void AddToRender(vtkRenderer* theRenderer); - virtual void RemoveFromRender(vtkRenderer* theRenderer); - - virtual void SetVisibility(int theMode); - virtual int GetVisibility(); - - virtual VISU_ScalarBarActor* GetScalarBar(){ return myScalarBar;} - - virtual void SetBarVisibility(const bool* theMode); - virtual bool GetBarVisibility(){ return *myBarVisibility;} - - protected: - VISUScalarMap_Actor(); - const bool* myBarVisibility; - VISU_ScalarBarActor* myScalarBar; -}; - -//======================================================================= - -class VTKOCC_EXPORT VISUMesh_Actor : public VISU_Actor { - public: - vtkTypeMacro(VISUMesh_Actor,VISU_Actor); - static VISUMesh_Actor* New(); - ~VISUMesh_Actor(); - - virtual void setIO(const Handle(SALOME_InteractiveObject)& theIO); - virtual void setPrs3d(VISU::Prs3d_i* thePrs3d); - - virtual void AddToRender(vtkRenderer* theRenderer); - virtual void RemoveFromRender(vtkRenderer* theRenderer); - - virtual void SetMapper(vtkMapper* theMapper); - virtual void SetTransform(SALOME_Transform* theTransform); - - virtual vtkProperty* GetProperty(); - virtual void SetProperty(vtkProperty* theProperty); - - virtual vtkProperty* GetEdgeProperty(); - virtual void SetEdgeProperty(vtkProperty* theProperty); - - virtual void SetLineWidth(float theLineWidth); - virtual float GetLineWidth(); - - virtual void SetRepresentation(int theMode); - virtual int GetRepresentation() { return myRepresentation;}; - - virtual void SetVisibility(int theMode); - virtual int GetVisibility() { return myVisibility;} - - virtual void SetShrinkable(bool theIsShrinkable); - - virtual void setShrink(float theFactor = 0.8); - virtual void unShrink(); - - protected: - VISUMesh_Actor(); - int myRepresentation, myVisibility; - vtkPolyDataMapper* myEdgeMapper; - VISU_Actor *mySurfaceActor, *myEdgeActor; -}; - -//======================================================================= - #endif //VISU_ACTOR_H - - diff --git a/src/PIPELINE/Makefile.in b/src/PIPELINE/Makefile.in index ae6728c9..7cdd24fb 100644 --- a/src/PIPELINE/Makefile.in +++ b/src/PIPELINE/Makefile.in @@ -25,9 +25,9 @@ # Module : VISU top_srcdir=@top_srcdir@ -top_builddir=../../.. +top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl +VPATH=.:@srcdir@ @COMMENCE@ @@ -58,7 +58,8 @@ LIB_SRC = VISU_PipeLine.cxx VISU_PipeLineUtils.cxx \ BIN = VISUPipeLine BIN_SRC = -CPPFLAGS+= $(VTK_INCLUDES) -LDFLAGS+= $(VTK_LIBS) -lSalomeVTKFilter -lVisuConvertor +CPPFLAGS+= $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS+= $(VTK_LIBS) -lSalomeVTKFilter -lVisuConvertor \ + -L${KERNEL_ROOT_DIR}/lib/salome @CONCLUDE@ diff --git a/src/VISUGUI/Makefile.in b/src/VISUGUI/Makefile.in index b0f06af9..6757a4ca 100644 --- a/src/VISUGUI/Makefile.in +++ b/src/VISUGUI/Makefile.in @@ -65,7 +65,8 @@ LIB_SRC = VisuGUI.cxx \ VisuGUI_NonIsometricDlg.cxx \ VisuGUI_StreamLinesDlg.cxx \ VisuGUI_TimeAnimation.cxx \ - VisuGUI_CutLinesDlg.cxx + VisuGUI_CutLinesDlg.cxx \ + VisuGUI_FileDlg.cxx LIB_MOC = \ VisuGUI.h \ @@ -86,7 +87,8 @@ LIB_MOC = \ VisuGUI_NonIsometricDlg.h \ VisuGUI_StreamLinesDlg.h \ VisuGUI_TimeAnimation.h \ - VisuGUI_CutLinesDlg.h + VisuGUI_CutLinesDlg.h \ + VisuGUI_FileDlg.h LIB_CLIENT_IDL = SALOME_Exception.idl \ VISU_Gen.idl \ @@ -101,7 +103,8 @@ LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += -ftemplate-depth-32 $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) \ +CPPFLAGS += -ftemplate-depth-32 $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) \ + $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) \ -I${KERNEL_ROOT_DIR}/include/salome CXXFLAGS += -ftemplate-depth-32 $(OCC_CXXFLAGS) \ diff --git a/src/VISUGUI/VISU_msg_en.po b/src/VISUGUI/VISU_msg_en.po index 7dfa1d8a..23a04a9d 100644 --- a/src/VISUGUI/VISU_msg_en.po +++ b/src/VISUGUI/VISU_msg_en.po @@ -121,6 +121,10 @@ msgstr "Iso Surface" msgid "VisuGUI_IsoSurfacesDlg::Number of surfaces" msgstr "" +#: VisuGUI_IsoSurfacesDlg.cxx:170 +msgid "VisuGUI_IsoSurfacesDlg::WRN_LOGARITHMIC_RANGE_ISOSURF" +msgstr "Logarithmic scaling: use range values > 0" + #: VisuGUI_MagnitudeDlg.cxx:43 msgid "VisuGUI_MagnitudeDlg::VISU_BUT_CANCEL" msgstr "Cancel" @@ -345,3 +349,9 @@ msgstr "Can't visualize current object" msgid "WRN_CANT_VISUALIZE_PRS" msgstr "The presentation can't be visualized.\nNull actor is created." + +msgid "LBL_SOURCE_TYPE" +msgstr "Source type" + +msgid "MSG_NO_ANIMATIONDATA" +msgstr "There is no data for animation" diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 244be8bf..7b7a9579 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -26,8 +26,29 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI.h" + +#include "VISU_Gen_i.hh" +#include "VISU_Result_i.hh" +#include "VISU_PrsObject_i.hh" +#include "VISU_ViewManager_i.hh" + +#include "VISU_PipeLine.hxx" + +#include "VISU_Prs3d_i.hh" +#include "VISU_Mesh_i.hh" +#include "VISU_ScalarMap_i.hh" +#include "VISU_IsoSurfaces_i.hh" +#include "VISU_DeformedShape_i.hh" +#include "VISU_CutPlanes_i.hh" +#include "VISU_CutLines_i.hh" +#include "VISU_Vectors_i.hh" +#include "VISU_StreamLines_i.hh" +#include "VISU_Table_i.hh" + +#include "VISU_Actor.h" +#include "VISU_MeshAct.h" + #include "VisuGUI_PhaseDlg.h" #include "VisuGUI_MagnitudeDlg.h" #include "VisuGUI_PhaseMagnitudeDlg.h" @@ -47,14 +68,6 @@ using namespace std; #include "VisuGUI_SelVectCompDlg.h" #include "VisuGUI_NonIsometricDlg.h" -#include "VISU_Gen_i.hh" -#include "VISU_Result_i.hh" -#include "VISU_Extractor.hxx" -#include "VISU_Table_i.hh" -#include "VISU_ViewManager_i.hh" -#include "VISU_LookupTable.hxx" -#include "VISU_ScalarBarActor.hxx" - #include "SALOMEGUI_ImportOperation.h" #include "SALOMEGUI_QtCatchCorbaException.hxx" #include "utilities.h" @@ -81,6 +94,7 @@ using namespace std; #include "Plot2d_SetupPlot2dDlg.h" #include "Plot2d_ViewFrame.h" #include "VTKViewer_ViewFrame.h" +#include "VisuGUI_FileDlg.h" // QT Includes #define INCLUDE_MENUITEM_DEF @@ -122,7 +136,9 @@ static int MYCHECKTIME = 0; #endif #include -#ifdef DEBUG +using namespace std; + +#ifdef _DEBUG_ static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #else @@ -159,6 +175,75 @@ VISU::VISU_Gen_i* VisuGUI::GetVisuGen(){ return VISU::VISU_Gen_i::GetVisuGenImpl(); } +static int ComputeVisiblePropBounds(VTKViewer_ViewFrame* theViewFrame, float allBounds[6], + const char* theActorClassName = "VISU_Actor") +{ + vtkRenderer *aRen = theViewFrame->getRenderer(); + vtkActorCollection *anActColl = aRen->GetActors(); + vtkProp *prop; + float *bounds; + int nothingVisible=1; + + allBounds[0] = allBounds[2] = allBounds[4] = VTK_LARGE_FLOAT; + allBounds[1] = allBounds[3] = allBounds[5] = -VTK_LARGE_FLOAT; + // loop through all props + for (anActColl->InitTraversal(); (prop = anActColl->GetNextProp()); ){ + // if it's invisible, or has no geometry, we can skip the rest + if ( prop->GetVisibility() && prop->IsA(theActorClassName)){ + bounds = prop->GetBounds(); + // make sure we haven't got bogus bounds + if ( bounds != NULL && + bounds[0] > -VTK_LARGE_FLOAT && bounds[1] < VTK_LARGE_FLOAT && + bounds[2] > -VTK_LARGE_FLOAT && bounds[3] < VTK_LARGE_FLOAT && + bounds[4] > -VTK_LARGE_FLOAT && bounds[5] < VTK_LARGE_FLOAT ) + { + nothingVisible = 0; + if (bounds[0] < allBounds[0]) allBounds[0] = bounds[0]; + if (bounds[1] > allBounds[1]) allBounds[1] = bounds[1]; + if (bounds[2] < allBounds[2]) allBounds[2] = bounds[2]; + if (bounds[3] > allBounds[3]) allBounds[3] = bounds[3]; + if (bounds[4] < allBounds[4]) allBounds[4] = bounds[4]; + if (bounds[5] > allBounds[5]) allBounds[5] = bounds[5]; + }//not bogus + } + } + return nothingVisible; +} + +VisuGUI::CameraOrient VisuGUI::SetFitAll(VTKViewer_ViewFrame* theViewFrame){ + static float PRECISION = 0.000001; + static float DEVIATION = 600; + float XYZ_Bnd[6]; + if(ComputeVisiblePropBounds(theViewFrame,XYZ_Bnd)) return e3D; + + float absX = XYZ_Bnd[1]-XYZ_Bnd[0]; + + float absY = XYZ_Bnd[3]-XYZ_Bnd[2]; + + float absZ = XYZ_Bnd[5]-XYZ_Bnd[4]; + + CameraOrient aCameraOrient = e3D; + if(absX <= PRECISION) aCameraOrient = eFront; + else {if(absY <= PRECISION) aCameraOrient = eLeft; + else {if(absZ <= PRECISION) aCameraOrient = eTop;}} + + float dev_abs_XY = absX / absY; + float dev_abs_YZ = absY / absZ; + float dev_abs_XZ = absX / absZ; + if(dev_abs_XY >= DEVIATION || 1./dev_abs_YZ >= DEVIATION) aCameraOrient = eLeft; + else{if(1./dev_abs_XY >= DEVIATION || 1./dev_abs_XZ >= DEVIATION) aCameraOrient = eFront; + else {if(dev_abs_XZ >= DEVIATION || dev_abs_YZ >= DEVIATION) aCameraOrient = eTop;}} + + switch(aCameraOrient){ + case eFront: theViewFrame->onViewFront(); break; + case eLeft: theViewFrame->onViewLeft(); break; + case eTop: theViewFrame->onViewTop(); break; + case e3D: theViewFrame->onViewReset(); break; + } + theViewFrame->getRenderer()->ResetCameraClippingRange(); + theViewFrame->onViewFitAll(); +} + QAD_Desktop* VisuGUI::GetDesktop(){ return QAD_Application::getDesktop() ; } @@ -273,23 +358,6 @@ int GetScalarMode(VISU::Result_i* theResult, const char* theFieldName){ VisuGUI::VisuGUI(){} - -VisuGUI* VisuGUI::GetOrCreateVisuGUI( QAD_Desktop* desktop ){ - if(!visuGUI){ - static VisuGUI VISUGUI; - visuGUI = &VISUGUI; - } - return visuGUI; -} - -/* ********************************************************************************* */ -/* Function to return VisuGUI object */ -/* ********************************************************************************* */ -VisuGUI* VisuGUI::GetVisuGUI( ) -{ - return VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop()); -} - /* ==================================================================================== */ /* ==================================================================================== */ /* ONGUI EVENT */ @@ -303,7 +371,7 @@ static int isStudyLocked(const SALOMEDS::Study_var& theStudy){ static int checkLock(const SALOMEDS::Study_var& theStudy) { if (isStudyLocked(theStudy)) { QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), - QObject::tr("WARNING"), + QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED"), QObject::tr("BUT_OK") ); return true; @@ -316,22 +384,20 @@ static int checkLock(const SALOMEDS::Study_var& theStudy) { bool VisuGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent) { try{ - VisuGUI::GetOrCreateVisuGUI(parent); - QString VisuInputDir = getVisuInputDir(); - QString VisuOutputDir = getVisuOutputDir(); - vtkRenderer *theRenderer = GetRenderer(); - - SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument(); //Document OCAF de l'etude active - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - - switch (theCommandID) - { - /* ======================================================================================== */ - /* Define Selection Mode */ - /* ======================================================================================== */ + QString VisuInputDir = getVisuInputDir(); + QString VisuOutputDir = getVisuOutputDir(); + vtkRenderer *theRenderer = GetRenderer(); + + SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument(); //Document OCAF de l'etude active + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributeIOR_var anIOR; + + switch (theCommandID){ + /* ======================================================================================== */ + /* Define Selection Mode */ + /* ======================================================================================== */ case 101: case 102: case 103: @@ -532,22 +598,22 @@ bool VisuGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent) case 8041 : // Object representation : Wireframe case 9041 : // Object representation : Wireframe - visuGUI->ChangeRepresentation(WIREFRAME); + visuGUI->ChangeRepresentation(VISU::WIREFRAME); break; case 8042 : // Object representation : Surface case 9042 : // Object representation : Surface - visuGUI->ChangeRepresentation(SURFACE); + visuGUI->ChangeRepresentation(VISU::SHADED); break; case 8043 : // Object representation : Points case 9043 : // Object representation : Points - visuGUI->ChangeRepresentation(POINTS); + visuGUI->ChangeRepresentation(VISU::POINT); break; case 8044 : // Object representation : Shrink/Unshrink case 9044 : // Object representation : Shrink/Unshrink - visuGUI->ChangeRepresentation(SHRINK); + visuGUI->ChangeRepresentation(VISU::SHRINK); break; case 8051 : // Change object color @@ -587,7 +653,27 @@ bool VisuGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent) SetSweepingPreferences(); } break; - + +/* ======================================================================================== */ +/* Preferences for Full loading */ +/* ======================================================================================== */ + case 53: + case 54: + { + QMenuData* pp; + QMenuItem* item = parent->menuBar()->findItem(theCommandID,&pp); + bool check = !pp->isItemChecked(theCommandID); + pp->setItemChecked(theCommandID,check); + switch(theCommandID){ + case 53: + QAD_CONFIG->addSetting( "Visu:BuildResult", check ); + break; + case 54: + QAD_CONFIG->addSetting( "Visu:BuildDefaultPrs3d", check ); + break; + } + } + break; case 113: // Load MED using MED component { @@ -636,27 +722,6 @@ bool VisuGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent) } -/* ********************************************************************************* */ -/* Function to find Actor in Viewer */ -/* ********************************************************************************* */ - - -VISU_Actor *VisuGUI::GetActor(int* theSelectionType){ - VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(); - if (!aPrs3d) return NULL; - - VTKViewer_ViewFrame* vf = VisuGUI::GetVtkViewFrame(); - if(!vf) return NULL; - - if(theSelectionType){ - QAD_Study *aStudy = QAD_Application::getDesktop()->getActiveStudy(); - SALOME_Selection *aSel = SALOME_Selection::Selection(aStudy->getSelection()); - *theSelectionType = aSel->SelectionMode(); - } - - return GetActor(aPrs3d,vf); -} - /* ********************************************************************************** */ /* Function ShowTrihedron */ /* ********************************************************************************** */ @@ -675,7 +740,7 @@ void VisuGUI::ShowTrihedron(bool ShowThd){ /* ********************************************************************************** */ VisuGUI::~VisuGUI(){ - MESSAGE("VisuGUI::~VisuGUI"); + if(MYDEBUG) MESSAGE("VisuGUI::~VisuGUI"); } /* ********************************************************************************** */ @@ -684,34 +749,29 @@ VisuGUI::~VisuGUI(){ /* ********************************************************************************** */ void VisuGUI::ChangeViewer(int theType){ - VTKViewer_ViewFrame* vf = GetVtkViewFrame(); - if (!vf) return; - - vtkActor *anActor; - vtkRenderer *aRen = vf->getRenderer(); - vtkActorCollection *anActColl = aRen->GetActors(); - for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){ - if(anActor->IsA("VISU_Actor")){ - VISU_Actor* anVISUActor = VISU_Actor::SafeDownCast(anActor); - if(anVISUActor->GetVisibility() > 0) - if(theType > 0) - anVISUActor->SetRepresentation(theType); - else if(theType == -1) - anVISUActor->VisibilityOff(); - else - anVISUActor->VisibilityOn(); + if(vtkRenderer *aRen = GetRenderer()){ + vtkActor *anActor; + vtkActorCollection *anActColl = aRen->GetActors(); + for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){ + if(anActor->GetVisibility() > 0) + if(VISU_Actor* anVISUActor = VISU_Actor::SafeDownCast(anActor)){ + anVISUActor = anVISUActor->GetParent(); + if(theType >= 0) + anVISUActor->SetRepresentation(theType); + else + anVISUActor->VisibilityOff(); + } } + RepaintCurrentView(); } } - // ----------------------------------------------------------------------------------------- // EVENTS // ----------------------------------------------------------------------------------------- bool VisuGUI::OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - VisuGUI::GetOrCreateVisuGUI(parent); return true; } @@ -719,7 +779,6 @@ bool VisuGUI::OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame bool VisuGUI::OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - VisuGUI::GetOrCreateVisuGUI(parent); return true; } @@ -727,17 +786,16 @@ bool VisuGUI::OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* bool VisuGUI::OnKeyPress (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - VisuGUI::GetOrCreateVisuGUI(parent); if (GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK) // true = Viewer OCC return false; - MESSAGE ( "VisuGUI::onKeyPress : " << pe->key() ) + if(MYDEBUG) MESSAGE( "VisuGUI::onKeyPress : " << pe->key() ) switch ( pe->key() ) { case Key_Escape : { - MESSAGE("--> Key : Escape") + if(MYDEBUG) MESSAGE("--> Key : Escape") return true; } default : @@ -787,7 +845,21 @@ CREATEPRESENTATION(VisuGUI::CreateStreamLines); //===================================================================================== bool VisuGUI::setSettings(QAD_Desktop* parent) { - VisuGUI::GetOrCreateVisuGUI(parent); + int anId = 53; + QMenuData* pp; + QMenuItem* item = parent->menuBar()->findItem(anId,&pp); + QString aValue = QAD_CONFIG->getSetting("Visu:BuildResult"); + + if(aValue.isEmpty()? 0 : aValue.toInt()) + pp->setItemChecked(anId, true); + + anId = 54; + item = parent->menuBar()->findItem(anId,&pp); + aValue = QAD_CONFIG->getSetting("Visu:BuildDefaultPrs3d"); + + if(aValue.isEmpty()? 0 : aValue.toInt()) + pp->setItemChecked(anId, true); + return true; } @@ -796,14 +868,14 @@ bool VisuGUI::setSettings(QAD_Desktop* parent) // purpose : //===================================================================================== void VisuGUI::DisplayPrs() { - MESSAGE("VisuGUI::DisplayPrs"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs"); Handle(SALOME_InteractiveObject) anIO; CORBA::Object_var anObject = GetSelectedObj(&anIO); if ( !CORBA::is_nil( anObject ) ) { // is it Prs3d object ? VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(anObject)); if(aPrsObject){ - MESSAGE("VisuGUI::DisplayPrs : Prs3d object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Prs3d object"); UpdateViewer(aPrsObject); if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) { vf->getRenderer()->ResetCameraClippingRange(); @@ -815,21 +887,21 @@ void VisuGUI::DisplayPrs() { // is it Curve ? VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(anObject)); if(aCurve){ - MESSAGE("VisuGUI::DisplayPrs : Curve object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Curve object"); PlotCurve(aCurve, VISU::eDisplay ); return; } // is it Container ? VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(anObject)); if(aContainer){ - MESSAGE("VisuGUI::DisplayPrs : Container object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Container object"); PlotContainer(aContainer, VISU::eDisplay ); return; } // is it Table ? VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(anObject)); if(aTable){ - MESSAGE("VisuGUI::DisplayPrs : Table object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayPrs : Table object"); PlotTable(aTable, VISU::eDisplay ); return; } @@ -841,13 +913,13 @@ void VisuGUI::DisplayPrs() { // purpose : //===================================================================================== void VisuGUI::DisplayOnlyPrs() { - MESSAGE("VisuGUI::DisplayOnlyPrs"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs"); CORBA::Object_var anObject = GetSelectedObj(); if ( !CORBA::is_nil( anObject ) ) { // is it Prs3d object ? PortableServer::Servant aServant = VISU::GetServant(anObject); if(VISU::Prs3d_i* aPrsObject = dynamic_cast(aServant)){ - MESSAGE("VisuGUI::DisplayOnlyPrs : Prs3d object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Prs3d object"); UpdateViewer(aPrsObject, true); VTKViewer_ViewFrame* vf = GetVtkViewFrame(); if (vf) { @@ -855,13 +927,13 @@ void VisuGUI::DisplayOnlyPrs() { vf->Repaint(); } }else if(VISU::Curve_i* aCurve = dynamic_cast(aServant)){ - MESSAGE("VisuGUI::DisplayOnlyPrs : Curve object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Curve object"); PlotCurve(aCurve, VISU::eDisplayOnly ); }else if(VISU::Container_i* aContainer = dynamic_cast(aServant)){ - MESSAGE("VisuGUI::DisplayOnlyPrs : Container object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Container object"); PlotContainer(aContainer, VISU::eDisplayOnly ); }else if(VISU::Table_i* aTable = dynamic_cast(aServant)){ - MESSAGE("VisuGUI::DisplayOnlyPrs : Table object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyPrs : Table object"); PlotTable(aTable, VISU::eDisplayOnly ); } } @@ -872,13 +944,13 @@ void VisuGUI::DisplayOnlyPrs() { // purpose : //===================================================================================== void VisuGUI::ErasePrs() { - MESSAGE("VisuGUI::ErasePrs"); + if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs"); CORBA::Object_var anObject = GetSelectedObj(); if ( !CORBA::is_nil( anObject ) ) { // is it Prs3d object ? VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(anObject)); if(aPrsObject){ - MESSAGE("VisuGUI::ErasePrs : Prs3d object"); + if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Prs3d object"); ErasePrs(aPrsObject); VTKViewer_ViewFrame* vf = GetVtkViewFrame(); if (vf) { @@ -888,19 +960,19 @@ void VisuGUI::ErasePrs() { // is it Curve ? VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(anObject)); if(aCurve){ - MESSAGE("VisuGUI::ErasePrs : Curve object"); + if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Curve object"); PlotCurve(aCurve, VISU::eErase ); } // is it Container ? VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(anObject)); if(aContainer){ - MESSAGE("VisuGUI::ErasePrs : Container object"); + if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Container object"); PlotContainer(aContainer, VISU::eErase ); } // is it Table ? VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(anObject)); if(aTable){ - MESSAGE("VisuGUI::ErasePrs : Table object"); + if(MYDEBUG) MESSAGE("VisuGUI::ErasePrs : Table object"); PlotTable(aTable, VISU::eErase ); } } @@ -912,7 +984,7 @@ void VisuGUI::ErasePrs() { //===================================================================================== void VisuGUI::DisplayManyPrs() { - MESSAGE("VisuGUI::DisplayManyPrs"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs"); SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); for ( ; It.More(); It.Next() ) { @@ -927,7 +999,7 @@ void VisuGUI::DisplayManyPrs() // is it Prs3d object ? VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aPrsObject){ - MESSAGE("VisuGUI::DisplayManyPrs : Prs3d object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Prs3d object"); UpdateViewer(aPrsObject); VTKViewer_ViewFrame* vf = GetVtkViewFrame(); if (vf) { @@ -940,21 +1012,21 @@ void VisuGUI::DisplayManyPrs() // is it Curve ? VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aCurve){ - MESSAGE("VisuGUI::DisplayManyPrs: Curve object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs: Curve object"); PlotCurve(aCurve, VISU::eDisplay ); continue; } // is it Container ? VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aContainer){ - MESSAGE("VisuGUI::DisplayManyPrs : Container object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Container object"); PlotContainer(aContainer, VISU::eDisplay ); continue; } // is it Table ? VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aTable){ - MESSAGE("VisuGUI::DisplayManyPrs : Table object"); + if(MYDEBUG) MESSAGE("VisuGUI::DisplayManyPrs : Table object"); PlotTable(aTable, VISU::eDisplay ); continue; } @@ -964,13 +1036,85 @@ void VisuGUI::DisplayManyPrs() } } +//===================================================================================== +// function : DisplayOnlyManyPrs() +// purpose : +//===================================================================================== +void VisuGUI::DisplayOnlyManyPrs() { + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs"); + SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); + SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); + bool aFirstElem = true; + for ( ; It.More(); It.Next() ) { + Handle(SALOME_InteractiveObject)& anIO = It.Value(); + if ( anIO->hasEntry() ) { + SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); + SALOMEDS::SObject_var aSObject = aStudy->FindObjectID( anIO->getEntry() ); + VISU::Storable::TRestoringMap pMap; + if( !aSObject->_is_nil() ) { + CORBA::Object_var aCORBAObject = VISU::SObjectToObject(aSObject); + if ( !CORBA::is_nil( aCORBAObject ) ) { + // is it Prs3d object ? + VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(aCORBAObject)); + if(aPrsObject){ + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Prs3d object"); + UpdateViewer(aPrsObject, aFirstElem); + if (aFirstElem) aFirstElem = false; + VTKViewer_ViewFrame* vf = GetVtkViewFrame(); + if (vf) { + vf->getRenderer()->ResetCameraClippingRange(); + vf->Repaint(); + vf->highlight(anIO, 1); + } + continue; + } + // is it Curve ? + VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(aCORBAObject)); + if(aCurve){ + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs: Curve object"); + if (aFirstElem) { + PlotCurve(aCurve, VISU::eDisplayOnly ); + aFirstElem = false; + } + else PlotCurve(aCurve, VISU::eDisplay ); + continue; + } + // is it Container ? + VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(aCORBAObject)); + if(aContainer){ + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Container object"); + if (aFirstElem) { + PlotContainer(aContainer, VISU::eDisplayOnly ); + aFirstElem = false; + } + else PlotContainer(aContainer, VISU::eDisplay ); + continue; + } + // is it Table ? + VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(aCORBAObject)); + if(aTable){ + if(MYDEBUG) MESSAGE("VisuGUI::DisplayOnlyManyPrs : Table object"); + if (aFirstElem) { + PlotTable(aTable, VISU::eDisplayOnly ); + aFirstElem = false; + } + else PlotTable(aTable, VISU::eDisplay ); + continue; + } + } + } + } + } +} + + //===================================================================================== // function : EraseManyPrs() // purpose : //===================================================================================== void VisuGUI::EraseManyPrs() { - MESSAGE("VisuGUI::EraseManyPrs"); + if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs"); SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); SALOME_ListIO LIO; LIO = Sel->StoredIObjects(); SALOME_ListIteratorOfListIO It( LIO ); @@ -986,7 +1130,7 @@ void VisuGUI::EraseManyPrs() // is it Prs3d object ? VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aPrsObject){ - MESSAGE("VisuGUI::EraseManyPrs : Prs3d object"); + if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Prs3d object"); ErasePrs(aPrsObject); VTKViewer_ViewFrame* vf = GetVtkViewFrame(); if (vf) { @@ -997,21 +1141,21 @@ void VisuGUI::EraseManyPrs() // is it Curve ? VISU::Curve_i* aCurve = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aCurve){ - MESSAGE("VisuGUI::EraseManyPrs : Curve object"); + if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Curve object"); PlotCurve(aCurve, VISU::eErase ); continue; } // is it Container ? VISU::Container_i* aContainer = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aContainer){ - MESSAGE("VisuGUI::EraseManyPrs : Container object"); + if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Container object"); PlotContainer(aContainer, VISU::eErase ); continue; } // is it Table ? VISU::Table_i* aTable = dynamic_cast(VISU::GetServant(aCORBAObject)); if(aTable){ - MESSAGE("VisuGUI::EraseManyPrs : Table object"); + if(MYDEBUG) MESSAGE("VisuGUI::EraseManyPrs : Table object"); PlotTable(aTable, VISU::eErase ); continue; } @@ -1027,14 +1171,20 @@ void VisuGUI::EraseManyPrs() //===================================================================================== void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) { QApplication::setOverrideCursor(Qt::waitCursor); - thePrs->Update(); - for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++) - if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){ - QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame(); - if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast(aVFrame)) - if(VISU_Actor* anActor = GetActor(thePrs,aViewFrame)) - thePrs->UpdateActor(anActor); - } + try{ + thePrs->Update(); + for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++) + if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){ + QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame(); + if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast(aVFrame)) + if(VISU_Actor* anActor = GetActor(thePrs,aViewFrame)) + thePrs->UpdateActor(anActor); + } + }catch(std::runtime_error& ex){ + QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("ERR_CANT_BUILD_PRESENTATION"), + tr ("VISU_BUT_OK") ); + } QApplication::restoreOverrideCursor(); } @@ -1048,13 +1198,12 @@ void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) { PrsName* aPrsObject = dynamic_cast(aPrs3d); \ if (aPrsObject) { \ DlgName* aDlg = new DlgName(); \ - aDlg->initFromPrsObject(aPrsObject); \ + aDlg->initFromPrsObject(aPrsObject); \ if ( aDlg->exec() ) { \ aDlg->storeToPrsObject(aPrsObject); \ RecreateActor(aPrsObject); \ /*RepaintCurrentView();*/ \ - VTKViewer_ViewFrame* vf = GetVtkViewFrame(); \ - if (vf) { \ + if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) { \ if ( vf->getRenderer()->GetActors()->GetNumberOfItems () > 0 ) { \ vf->getRenderer()->ResetCameraClippingRange(); \ vf->onViewFitAll(); \ @@ -1066,7 +1215,6 @@ void VisuGUI::RecreateActor(VISU::Prs3d_i* thePrs) { } \ } - void VisuGUI::EditPrs() { VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(); @@ -1099,7 +1247,15 @@ void VisuGUI::EditPrs() { case VISU::TSTREAMLINES: EDITPRS(VISU::StreamLines_i, VisuGUI_StreamLinesDlg); + default: + return; } + + Handle(SALOME_InteractiveObject) anIO; + CORBA::Object_var anObject = GetSelectedObj(&anIO); + if ( !CORBA::is_nil( anObject ) ) + if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) + vf->highlight(anIO, 1); } @@ -1119,7 +1275,14 @@ void VisuGUI::EditScalarBar() { VTKViewer_ViewFrame* vf = GetVtkViewFrame(); if (vf) - vf->Repaint(); + { + vf->Repaint(); + + Handle(SALOME_InteractiveObject) anIO; + CORBA::Object_var anObject = GetSelectedObj(&anIO); + if ( !CORBA::is_nil( anObject ) ) + vf->highlight(anIO, 1); + } if (aDlg->isToSave()) aDlg->storeToResources(); @@ -1158,7 +1321,6 @@ void VisuGUI::CreateMesh() { tr ("VISU_BUT_OK")); return; } - VISU::Storable::TRestoringMap aMap; SALOMEDS::GenericAttribute_var anAttr; if(aSObject->FindAttribute(anAttr, "AttributeComment")) { @@ -1176,20 +1338,24 @@ void VisuGUI::CreateMesh() { Utils_Timer timer; timer.Start(); #endif + VISU::Result_i* pResult = dynamic_cast(VISU::GetServant(aResult.in())); if(aComment == "ENTITY"){ VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt(); - aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity); + if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity)) + aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity); }else if(aComment == "FAMILY"){ VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt(); string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1(); - aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()); + if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),anEntity,aFamilyName.c_str())) + aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()); }else if(aComment == "GROUP"){ string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1(); - aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str()); + if(VISU::Mesh_i::IsPossible(pResult,aMeshName.c_str(),aGroupName.c_str())) + aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str()); } #ifdef CHECKTIME timer.Stop(); - MESSAGE("VisuGUI::CreateMesh() - CREATE MESH"); + cout<<"VisuGUI::CreateMesh() - CREATE MESH\n"; timer.Show(); #endif @@ -1205,92 +1371,90 @@ void VisuGUI::CreateMesh() { } if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){ - VISU_Actor *anActor = pPresent->CreateActor(); - if (! anActor ) { - QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), - tr ("ERR_CANT_CREATE_ACTOR"), - tr ("VISU_BUT_OK") ); - return; - } + try{ + VISU_Actor *anActor = pPresent->CreateActor(); #ifdef CHECKTIME - Utils_Timer timer; - timer.Start(); + Utils_Timer timer; + timer.Start(); #endif - vf->AddActor(anActor); - vf->getRenderer()->ResetCameraClippingRange(); - vf->onViewFitAll(); + vf->AddActor(anActor); + SetFitAll(vf); #ifdef CHECKTIME - timer.Stop(); - MESSAGE("VisuGUI::CreateMesh() - DISPLAY MESH"); - timer.Show(); + timer.Stop(); + cout<<"VisuGUI::CreateMesh() - DISPLAY MESH\n"; + timer.Show(); #endif + //GetActiveStudy()->updateObjBrowser(); //not necessary + GetDesktop()->putInfo("Ready"); + }catch(std::runtime_error& exc){ + QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("ERR_CANT_CREATE_ACTOR"), + tr ("VISU_BUT_OK") ); + } } - //GetActiveStudy()->updateObjBrowser(); //not necessary - GetDesktop()->putInfo("Ready"); } //===================================================================================== // function : CreateManyMesh() // purpose : //===================================================================================== -void VisuGUI::CreateManyMesh() -{ +void VisuGUI::CreateManyMesh(){ if (checkLock(GetStudyDocument())) return; SALOME_Selection* Sel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); for ( ; It.More(); It.Next() ) { - SALOMEDS::SObject_var aSObject = GetActiveStudy()->getStudyDocument()->FindObjectID( It.Value()->getEntry() ); - - SALOMEDS::SObject_var aSObj = aSObject->GetFather(); - aSObj = aSObj->GetFather(); - aSObj = aSObj->GetFather(); - CORBA::Object_var anObject = VISU::SObjectToObject(aSObj); - if(CORBA::is_nil(anObject)) { + SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectID(It.Value()->getEntry()); + SALOMEDS::SObject_var aSObj = aSObject->GetFather(); aSObj = aSObj->GetFather(); - anObject = VISU::SObjectToObject(aSObj); - if(CORBA::is_nil(anObject)) return; - } - VISU::Result_var aResult = VISU::Result::_narrow(anObject); - if(CORBA::is_nil(aResult)) return; - - VISU::Storable::TRestoringMap aMap; - SALOMEDS::GenericAttribute_var anAttr; - if(aSObject->FindAttribute(anAttr, "AttributeComment")) { - SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); - string aComm = aComment->Value(); - QString strIn(aComm.c_str()); - VISU::Storable::StrToMap(strIn,aMap); - } - bool isExist; - string aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist).latin1(); - if(!isExist) return; - CORBA::Object_var aMesh; - string aMeshName = VISU::Storable::FindValue(aMap,"myMeshName").latin1(); - if(aComment == "ENTITY"){ - VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt(); - aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity); - }else if(aComment == "FAMILY"){ - VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt(); - string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1(); - aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()); - }else if(aComment == "GROUP"){ - string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1(); - aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str()); - } - QApplication::restoreOverrideCursor(); - if(CORBA::is_nil(aMesh)) return; - - VISU::Mesh_i* pPresent = dynamic_cast(VISU::GetServant(aMesh)); - VISU_Actor *anActor = pPresent->CreateActor(); - if (! anActor ) return; - if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){ - vf->AddActor(anActor); - vf->getRenderer()->ResetCameraClippingRange(); - vf->onViewFitAll(); - } + aSObj = aSObj->GetFather(); + CORBA::Object_var anObject = VISU::SObjectToObject(aSObj); + if(CORBA::is_nil(anObject)) { + aSObj = aSObj->GetFather(); + anObject = VISU::SObjectToObject(aSObj); + if(CORBA::is_nil(anObject)) return; + } + VISU::Result_var aResult = VISU::Result::_narrow(anObject); + if(CORBA::is_nil(aResult)) return; + + VISU::Storable::TRestoringMap aMap; + SALOMEDS::GenericAttribute_var anAttr; + if(aSObject->FindAttribute(anAttr, "AttributeComment")) { + SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); + string aComm = aComment->Value(); + QString strIn(aComm.c_str()); + VISU::Storable::StrToMap(strIn,aMap); + } + bool isExist; + string aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist).latin1(); + if(!isExist) return; + CORBA::Object_var aMesh; + string aMeshName = VISU::Storable::FindValue(aMap,"myMeshName").latin1(); + if(aComment == "ENTITY"){ + VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt(); + aMesh = GetVisuGen()->MeshOnEntity(aResult,aMeshName.c_str(),anEntity); + }else if(aComment == "FAMILY"){ + VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt(); + string aFamilyName = VISU::Storable::FindValue(aMap,"myName").latin1(); + aMesh = GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.c_str(),anEntity,aFamilyName.c_str()); + }else if(aComment == "GROUP"){ + string aGroupName = VISU::Storable::FindValue(aMap,"myName").latin1(); + aMesh = GetVisuGen()->GroupMesh(aResult,aMeshName.c_str(),aGroupName.c_str()); + } + QApplication::restoreOverrideCursor(); + if(CORBA::is_nil(aMesh)) return; + + VISU::Mesh_i* pPresent = dynamic_cast(VISU::GetServant(aMesh)); + try{ + VISU_Actor *anActor = pPresent->CreateActor(); + if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){ + vf->AddActor(anActor); + SetFitAll(vf); + } + GetDesktop()->putInfo("Ready"); + }catch(std::runtime_error& exc){ + } } - GetDesktop()->putInfo("Ready"); } //===================================================================================== @@ -1299,48 +1463,54 @@ void VisuGUI::CreateManyMesh() //===================================================================================== static void ShrinkMesh(VISU_Actor *theActor){ - if(theActor->isShrunk()) - theActor->unShrink(); + if(theActor->IsShrunk()) + theActor->UnShrink(); else - theActor->setShrink(0.8); + theActor->SetShrink(0.8); } -void VisuGUI::ChangeRepresentation(RepresentType theType) { - if(VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d()){ +void VisuGUI::ChangeRepresentation(VISU::PresentationType theType) { + if(VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d()) if(VISU_Actor* anActor = GetActor(aPrsObject)){ switch (theType) { - case POINTS: - case WIREFRAME: - case SURFACE: - anActor->SetRepresentation(theType); - break; - case SHRINK: + case VISU::SHRINK: ShrinkMesh(anActor); break; + default: + if(VISU::Mesh_i* aMesh = dynamic_cast(aPrsObject)){ + aMesh->SetPresentationType(theType); + RecreateActor(aMesh); + }else + anActor->SetRepresentation(theType); } if (VTKViewer_ViewFrame* vf = GetVtkViewFrame()) vf->Repaint(); } - } } -void VisuGUI::MakeWireframe() { - ChangeRepresentation(WIREFRAME); + +void VisuGUI::MakeSurfaceframe() { + ChangeRepresentation(VISU::SURFACEFRAME); } +void VisuGUI::MakeInsideframe() { + ChangeRepresentation(VISU::INSIDEFRAME); +} -void VisuGUI::MakeSurface() { - ChangeRepresentation(SURFACE); +void VisuGUI::MakeWireframe() { + ChangeRepresentation(VISU::WIREFRAME); } +void VisuGUI::MakeSurface() { + ChangeRepresentation(VISU::SHADED); +} void VisuGUI::MakePoints() { - ChangeRepresentation(POINTS); + ChangeRepresentation(VISU::POINT); } - void VisuGUI::MakeShrink() { - ChangeRepresentation(SHRINK); + ChangeRepresentation(VISU::SHRINK); } @@ -1352,7 +1522,9 @@ void VisuGUI::MakeShrink() { VISU::Prs3d_i* VisuGUI::GetSelectedPrs3d(Handle(SALOME_InteractiveObject)* theIO) { CORBA::Object_var anObject = GetSelectedObj(theIO); if(CORBA::is_nil(anObject)) return NULL; - return dynamic_cast(VISU::GetServant(anObject)); + PortableServer::Servant aServant = VISU::GetServant(anObject); + if(!aServant) return NULL; + return dynamic_cast(aServant); } void VisuGUI::ChageColor() { @@ -1364,13 +1536,13 @@ void VisuGUI::ChageColor() { NewColor(anActor); } -void VisuGUI::ChangeOutlineColor() { +void VisuGUI::ChangeWireframeColor() { VISU::Prs3d_i* aPrsObject = GetSelectedPrs3d(); if(!aPrsObject) return; - VISUMesh_Actor* anActor = dynamic_cast(GetActor(aPrsObject)); + VISU_MeshAct* anActor = dynamic_cast(GetActor(aPrsObject)); if (!anActor) return; - NewOutlineColor(anActor); + NewWireframeColor(anActor); } @@ -1394,7 +1566,6 @@ void VisuGUI::ChangeLines() { } void VisuGUI::PlotTable( VISU::Table_i* table, int theDisplaying ) { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); if ( table && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) { Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame(); if ( theDisplaying == VISU::eDisplayOnly ) @@ -1463,7 +1634,6 @@ void VisuGUI::PlotTable( VISU::Table_i* table, int theDisplaying ) } void VisuGUI::PlotCurve( VISU::Curve_i* theCurve, int theDisplaying ) { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); if ( theCurve && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) { Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame(); // if ( theDisplaying == VISU::eDisplayOnly ) @@ -1519,7 +1689,6 @@ void VisuGUI::PlotCurve( VISU::Curve_i* theCurve, int theDisplaying ) } void VisuGUI::PlotContainer( VISU::Container_i* container, int theDisplaying ) { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); if ( container && GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) { Plot2d_ViewFrame* aPlot = (Plot2d_ViewFrame*)GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame(); if ( theDisplaying == VISU::eDisplayOnly ) @@ -1586,7 +1755,6 @@ void VisuGUI::PlotContainer( VISU::Container_i* container, int theDisplaying ) Slot : opens Table view : for Table object or SObject with table attribute selected */ void VisuGUI::ShowTable() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if( Sel->IObjectCount() !=1 ) return; @@ -1625,7 +1793,6 @@ void VisuGUI::ShowTable() { Slot : opens Table view : for Table object or SObject with table attribute selected */ void VisuGUI::CreateTable() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* aSel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if( aSel->IObjectCount() !=1 ) return; @@ -1652,7 +1819,6 @@ void VisuGUI::CreateTable() { Opens dialog box for curves creation. Acts only for selected SObject with table attribute. */ void VisuGUI::PlotData() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if( Sel->IObjectCount() !=1 ) return; @@ -1809,7 +1975,6 @@ void VisuGUI::PlotData() { Slot : Opens "Setup curve" dialog to set curve properties : for Curve object selected */ void VisuGUI::CurveProperties() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if( Sel->IObjectCount() !=1 ) return; @@ -1867,7 +2032,6 @@ void VisuGUI::CurveProperties() { Slot : Clears container contents : for Container object selected */ void VisuGUI::ClearContainer() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if( Sel->IObjectCount() !=1 ) return; @@ -1899,7 +2063,6 @@ void VisuGUI::DeletePrs() { void VisuGUI::SaveViewParams() { if (checkLock(GetStudyDocument())) return; - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if ( Sel->IObjectCount() > 1 || GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK ) return; @@ -1931,7 +2094,6 @@ void VisuGUI::SaveViewParams() void VisuGUI::RestoreViewParams() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if ( Sel->IObjectCount() > 1 || GetActiveStudy()->getActiveStudyFrame()->getTypeView() != VIEW_VTK ) return; @@ -2053,7 +2215,6 @@ void VisuGUI::TimeAnimation() { void VisuGUI::ImportMedField() { if (checkLock(GetStudyDocument())) return; - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); QApplication::setOverrideCursor( Qt::waitCursor ); @@ -2085,36 +2246,13 @@ void VisuGUI::ImportMedField() { GetActiveStudy()->updateObjBrowser( true ); QApplication::restoreOverrideCursor(); } -/* -void VisuGUI::ImportMedMesh() { - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); - SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); - if ( Sel->IObjectCount() != 1 ) - return; - string aComment; - Handle(SALOME_InteractiveObject) anIO; - CORBA::Object_var anObject = GetSelectedObj( aComment,anIO, GetActiveStudy()); - if ( !CORBA::is_nil( anObject ) ) { - SALOME_MED::MESH_ptr aMesh = SALOME_MED::MESH::_narrow( anObject ); - if( !CORBA::is_nil( aMesh ) ) { - GetVisuGen->ImportMedMesh( aMesh ); - GetActiveStudy()->updateObjBrowser( true ); - } - SALOME_MED::SUPPORT_ptr aSupport = SALOME_MED::SUPPORT::_narrow( anObject ); - if( !CORBA::is_nil( aSupport ) ) { - GetVisuGen->ImportMedSupport( aSupport ); - GetActiveStudy()->updateObjBrowser( true ); - } - } -} -*/ + //===================================================================================== // functions : Rename() // purpose : //===================================================================================== void VisuGUI::Rename() { if (checkLock(GetStudyDocument())) return; - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); if ( Sel->IObjectCount() != 1 ) return; @@ -2154,6 +2292,99 @@ void VisuGUI::Rename() { } } +//===================================================================================== +// functions : RenameTable() +// purpose : +//===================================================================================== +void VisuGUI::RenameTable() { + if (checkLock(GetStudyDocument())) return; + SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); + if ( Sel->IObjectCount() != 1 ) + return; + SALOMEDS::SObject_var aSObj = GetStudyDocument()->FindObjectID( Sel->firstIObject()->getEntry() ); + if( aSObj->_is_nil() ) return; + + VISU::Table_i* table = 0; + CORBA::Object_var anObject = GetSelectedObj(); + if ( !CORBA::is_nil( anObject )) { + VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject); + if (!CORBA::is_nil(aVisuObj) && aVisuObj->GetType() == VISU::TTABLE) { + // Table object + CORBA::Object_ptr aTable = VISU::Table::_narrow( anObject ); + if( !CORBA::is_nil( aTable ) ) { + table = dynamic_cast( VISU::GetServant( aTable ) ); + } + } + } + + //TEST DU PARENT == VISU + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + if ( aSObj->FindAttribute(anAttr, "AttributeName") ) { + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + QString Name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aName->Value() ); + if ( !Name.isEmpty() ) { + QApplication::setOverrideCursor( Qt::waitCursor ); + if ( table ) + table->SetName( Name.latin1() ); + GetActiveStudy()->renameIObject( Sel->firstIObject(), Name ); + QApplication::restoreOverrideCursor(); + + //int TypeMode; bool InViewer; + //VISU_Actor *ActorTmp = ActorSelected(parent,InViewer,&TypeMode); + //ActorTmp->setName((Standard_CString)Name.latin1()); + } + } +} + + + +//===================================================================================== +// functions : RenameContainer() +// purpose : +//===================================================================================== +void VisuGUI::RenameContainer() { + if (checkLock(GetStudyDocument())) return; + SALOME_Selection* Sel = SALOME_Selection::Selection( GetActiveStudy()->getSelection() ); + if ( Sel->IObjectCount() != 1 ) + return; + SALOMEDS::SObject_var aSObj = GetStudyDocument()->FindObjectID( Sel->firstIObject()->getEntry() ); + if( aSObj->_is_nil() ) return; + + VISU::Container_i* container = 0; + CORBA::Object_var anObject = GetSelectedObj(); + if ( !CORBA::is_nil( anObject )) { + VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject); + if (!CORBA::is_nil(aVisuObj) && aVisuObj->GetType() == VISU::TCONTAINER) { + // Curve object + CORBA::Object_ptr aContainer = VISU::Container::_narrow( anObject ); + if( !CORBA::is_nil( aContainer ) ) { + container = dynamic_cast( VISU::GetServant( aContainer ) ); + } + } + } + + //TEST DU PARENT == VISU + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + if ( aSObj->FindAttribute(anAttr, "AttributeName") ) { + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + QString Name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aName->Value() ); + if ( !Name.isEmpty() ) { + QApplication::setOverrideCursor( Qt::waitCursor ); + if ( container ) + container->SetName( Name.latin1() ); + GetActiveStudy()->renameIObject( Sel->firstIObject(), Name ); + QApplication::restoreOverrideCursor(); + + //int TypeMode; bool InViewer; + //VISU_Actor *ActorTmp = ActorSelected(parent,InViewer,&TypeMode); + //ActorTmp->setName((Standard_CString)Name.latin1()); + } + } +} + + //===================================================================================== // function : CopyPresentation() @@ -2237,18 +2468,7 @@ void VisuGUI::CopyPresentation(){ // purpose : //===================================================================================== void VisuGUI::InfoOnPoint(){ - SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); - int aTypeMode = aSel->SelectionMode(); - if ( aTypeMode == SelectionPoint ){ - if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d()){ - vtkDataSet* aDataSet = aPrs3d->GetMapper()->GetInput(); - VisuGUI_Selection::PickingPoint( GetActiveStudy(), aDataSet); - } - }else - QAD_MessageBox::warn1( GetDesktop(), - tr ("WARNING"), - tr ("ERR_WRONG_SELECTION_MODE"), - tr ("VISU_BUT_OK") ); + GetInfo(SelectionPoint,&(VisuGUI_Selection::PickingPoint)); } //===================================================================================== @@ -2256,13 +2476,27 @@ void VisuGUI::InfoOnPoint(){ // purpose : //===================================================================================== void VisuGUI::InfoOnCell(){ + GetInfo(SelectionCell,&(VisuGUI_Selection::PickingCell)); +} + +void VisuGUI::GetInfo(int theSelectionMode, TGetInfoFun theGetInfoFun){ SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); - int aTypeMode = aSel->SelectionMode(); - if( aTypeMode == SelectionCell){ - if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d()){ - vtkDataSet* aDataSet = aPrs3d->GetMapper()->GetInput(); - VisuGUI_Selection::PickingCell( GetActiveStudy(), aDataSet); + if ( aSel->SelectionMode() == theSelectionMode ){ + Handle(SALOME_InteractiveObject) anIO; + if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){ + TColStd_MapOfInteger aMapIndex; + aSel->GetIndex(anIO,aMapIndex); + TColStd_MapIteratorOfMapOfInteger anIter(aMapIndex); + if(anIter.More()){ + vtkDataSet* aDataSet = aPrs3d->GetPipeLine()->GetMapper()->GetInput(); + (*theGetInfoFun)(GetActiveStudy(), aDataSet, anIter.Key()); + return; + } } + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr ("VISU_WARNING"), + tr ("WRN_NO_AVAILABLE_DATA"), + tr ("VISU_BUT_OK")); }else QAD_MessageBox::warn1( GetDesktop(), tr ("WARNING"), @@ -2275,27 +2509,7 @@ void VisuGUI::InfoOnCell(){ // purpose : //===================================================================================== void VisuGUI::SelectPoint(){ - SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); - if ( aSel->SelectionMode() != SelectionPoint ) { - QAD_MessageBox::warn1( GetDesktop(), - tr ("WARNING"), - tr ("ERR_WRONG_SELECTION_MODE"), - tr ("VISU_BUT_OK") ); - return; - } - Handle(SALOME_InteractiveObject) anIO; - if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){ - bool ok = FALSE; - int anId = SALOMEGUI_SetValueDlg::getInteger( tr("Point selection"), - tr("Point number:" ), - 0, - &ok, - GetDesktop()); - vtkDataSet *aDataSet = aPrs3d->GetMapper()->GetInput(); - int aMaxId = aDataSet->GetNumberOfPoints(); - if (ok && 0 < anId && anId <= aMaxId ) - VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId ); - } + Select(SelectionPoint,&vtkDataSet::GetNumberOfPoints,"Point selection","Point number:"); } //===================================================================================== @@ -2303,27 +2517,44 @@ void VisuGUI::SelectPoint(){ // purpose : //===================================================================================== void VisuGUI::SelectCell(){ + Select(SelectionCell,&vtkDataSet::GetNumberOfCells,"Cell selection","Cell number:"); +} + +void VisuGUI::Select(int theSelectionMode, TSelectFun theSelectFun, + const char* theTitle, const char* theRequest) +{ SALOME_Selection *aSel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); - if ( aSel->SelectionMode() != SelectionCell) { + if(aSel->SelectionMode() == theSelectionMode){ + Handle(SALOME_InteractiveObject) anIO; + if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){ + bool ok = FALSE; + int anIndex = 0; + TColStd_MapOfInteger aMapIndex; + aSel->GetIndex(anIO,aMapIndex); + TColStd_MapIteratorOfMapOfInteger anIter(aMapIndex); + if(anIter.More()) anIndex = anIter.Key(); + int anId = SALOMEGUI_SetValueDlg::getInteger( tr(theTitle), + tr(theRequest), + anIndex, + &ok, + GetDesktop()); + if(!ok) return; + vtkDataSet* aDataSet = aPrs3d->GetPipeLine()->GetMapper()->GetInput(); + int aMaxId = (aDataSet->*theSelectFun)(); + if(0 <= anId && anId < aMaxId){ + VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId ); + return; + } + } + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr ("VISU_WARNING"), + tr ("WRN_NO_AVAILABLE_DATA"), + tr ("VISU_BUT_OK")); + }else QAD_MessageBox::warn1( GetDesktop(), tr ("WARNING"), tr ("ERR_WRONG_SELECTION_MODE"), tr ("VISU_BUT_OK") ); - return; - } - Handle(SALOME_InteractiveObject) anIO; - if(VISU::Prs3d_i* aPrs3d = GetSelectedPrs3d(&anIO)){ - bool ok = FALSE; - int anId = SALOMEGUI_SetValueDlg::getInteger( tr("Cell selection"), - tr("Cell number:" ), - 0, - &ok, - GetDesktop()); - vtkDataSet *aDataSet = aPrs3d->GetMapper()->GetInput(); - int aMaxId = aDataSet->GetNumberOfCells(); - if (ok && 0 < anId && anId <= aMaxId ) - VisuGUI_Selection::Highlight( GetActiveStudy(), anIO, anId ); - } } //===================================================================================== @@ -2332,7 +2563,6 @@ void VisuGUI::SelectCell(){ //===================================================================================== void VisuGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject ) { - VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop()); theObject = ""; theContext = ""; } @@ -2449,27 +2679,25 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri const QString & theParent, const QString & theObject) { int isViewer = (theParent.compare("ObjectBrowser") != 0), initId = isViewer? 800: 900; - VisuGUI::GetOrCreateVisuGUI(parent); QAD_ResourceMgr* rmgr = parent->createResourceManager(); bool isVTKViewer = (GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK); thePopup->clear(); - - SALOME_Selection* Sel = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); - if ( Sel->IObjectCount() == 0 ) { + SALOME_Selection* aSelection = SALOME_Selection::Selection(GetActiveStudy()->getSelection()); + if ( aSelection->IObjectCount() == 0 ) { if ( theParent == "Viewer" && isVTKViewer) // Available only for VTK viewer thePopup->insertItem( "Save view parameters", visuGUI, SLOT( SaveViewParams() ) ); return false; } - - if( Sel->IObjectCount() > 1 ) { + if( aSelection->IObjectCount() > 1 ) { int selMode = checkHomoSelection(); - MESSAGE( "VisuGUI::CustomPopup: multiple selection : selMode = "<insertItem( "Erase", visuGUI, SLOT( EraseManyPrs () ) ); + thePopup->insertItem( "Display Only", visuGUI, SLOT( DisplayOnlyManyPrs() ) ); } } else if ( selMode == homoPresentations ) { @@ -2486,16 +2714,15 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri } return true; } - VISU::Storable::TRestoringMap aMap; - Handle(SALOME_InteractiveObject) anIO; + Handle(SALOME_InteractiveObject) anIO; CORBA::Object_var anObject = GetSelectedObj(&anIO,GetActiveStudy(),&aMap); if (!CORBA::is_nil(anObject)) { SALOMEDS::SObject_var aSObject = GetStudyDocument()->FindObjectID(anIO->getEntry()); VISU::Base_var aVisuObj = VISU::Base::_narrow(anObject); if (!CORBA::is_nil(aVisuObj)) { VISU::VISUType aType = aVisuObj->GetType(); - MESSAGE("VisuGUI::CustomPopup - VISU object :: "<insertItem("Import From File", visuGUI, SLOT(ImportFromFile())); @@ -2508,6 +2735,7 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri break; case VISU::TTABLE: + thePopup->insertItem( "Rename...", visuGUI, SLOT( RenameTable() ) ); thePopup->insertItem( "Show Table", visuGUI, SLOT( ShowTable() ) ); thePopup->insertItem( "Create Curves", visuGUI, SLOT( PlotData() ) ); if ( GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) { @@ -2539,8 +2767,10 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri if( !CORBA::is_nil( aCnt ) ) { VISU::Container_i* container = dynamic_cast( VISU::GetServant( aCnt ) ); if ( container && container->GetNbCurves() > 0 ) { - if ( !isStudyLocked( GetActiveStudy()->getStudyDocument() ) ) + if ( !isStudyLocked( GetActiveStudy()->getStudyDocument() ) ) { + thePopup->insertItem( "Rename...", visuGUI, SLOT( RenameContainer() ) ); thePopup->insertItem( "Clear", visuGUI, SLOT( ClearContainer() ) ); + } if ( GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_PLOT2D ) { thePopup->insertItem( "Display", visuGUI, SLOT( DisplayPrs() ) ); thePopup->insertItem( "Erase", visuGUI, SLOT( ErasePrs () ) ); @@ -2555,51 +2785,78 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri { VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(anObject)); if (aPrsObject) { - VISU_Actor* anVISUActor = visuGUI->GetActor(aPrsObject); if (isVTKViewer) { // Add Presentation menu - if ((aType != VISU::TSTREAMLINES) && anVISUActor) { + if (VISU_Actor* anVISUActor = visuGUI->GetActor(aPrsObject)){ QPopupMenu* aPresMenu = new QPopupMenu(GetDesktop()); int aRepresent = anVISUActor->GetRepresentation(); switch(aRepresent){ - case 0: //POINTS + case VISU::POINT : aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe())); aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface())); + if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE) + aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe())); + if (aType == VISU::TMESH) + aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe())); break; - case 1: //WIREFRAME + case VISU::WIREFRAME : + aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints())); aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface())); + if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE) + aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe())); + if (aType == VISU::TMESH) + aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe())); + break; + case VISU::SHADED : aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints())); + aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe())); + if (aType == VISU::TMESH || aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE) + aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe())); + if (aType == VISU::TMESH) + aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe())); break; - case 2: //SURFACE + case VISU::INSIDEFRAME : + aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints())); + aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface())); aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe())); + if (aType == VISU::TMESH) + aPresMenu->insertItem("Surfaceframe", visuGUI, SLOT(MakeSurfaceframe())); + break; + case VISU::SURFACEFRAME : aPresMenu->insertItem("Points", visuGUI, SLOT(MakePoints())); + aPresMenu->insertItem("Surface", visuGUI, SLOT(MakeSurface())); + aPresMenu->insertItem("Wireframe", visuGUI, SLOT(MakeWireframe())); + aPresMenu->insertItem("Insideframe", visuGUI, SLOT(MakeInsideframe())); break; } - if (anVISUActor->GetShrinkable()) { - if (anVISUActor->isShrunk()) - aPresMenu->insertItem("Unshrink", visuGUI, SLOT(MakeShrink())); - else - aPresMenu->insertItem("Shrink", visuGUI, SLOT(MakeShrink())); + if(anVISUActor->GetShrinkable()) + if(aType != VISU::TVECTORS && aType != VISU::TSTREAMLINES){ + if (anVISUActor->IsShrunk()) + aPresMenu->insertItem("Unshrink", visuGUI, SLOT(MakeShrink())); + else + aPresMenu->insertItem("Shrink", visuGUI, SLOT(MakeShrink())); + } + thePopup->insertItem("Representation", aPresMenu); + + // Add Properties + QPopupMenu* aPropMenu = new QPopupMenu(GetDesktop()); + if(aType == VISU::TMESH){ + if(aRepresent == VISU::SURFACEFRAME){ + aPropMenu->insertItem("Cell Color", visuGUI, SLOT(ChageColor())); + aPropMenu->insertItem("Edge Color", visuGUI, SLOT(ChangeWireframeColor())); + }else + aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor())); + }else if(aType == VISU::TDEFORMEDSHAPE) + aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor())); + + if (aType != VISU::TVECTORS && aType != VISU::TSTREAMLINES) + aPropMenu->insertItem("Opacity", visuGUI, SLOT(ChangeOpacity())); + if (aType != VISU::TVECTORS){ + aPropMenu->insertItem("Line width", visuGUI, SLOT(ChangeLines())); + thePopup->insertItem("Properties", aPropMenu); } - thePopup->insertItem("Representation", aPresMenu); + thePopup->insertSeparator(); } - - // Add Properties - QPopupMenu* aPropMenu = new QPopupMenu(GetDesktop()); - if ((aType == VISU::TMESH) || - (aType == VISU::TDEFORMEDSHAPE) || - (aType == VISU::TVECTORS) || - (aType == VISU::TSTREAMLINES)) - aPropMenu->insertItem("Color", visuGUI, SLOT(ChageColor())); - if (aType == VISU::TMESH) - aPropMenu->insertItem("Outline Color", visuGUI, SLOT(ChangeOutlineColor())); - - if ((aType != VISU::TVECTORS) && (aType != VISU::TSTREAMLINES)) - aPropMenu->insertItem("Opacity", visuGUI, SLOT(ChangeOpacity())); - aPropMenu->insertItem("Line width", visuGUI, SLOT(ChangeLines())); - thePopup->insertItem("Properties", aPropMenu); - - thePopup->insertSeparator(); } thePopup->insertItem("Rename...", visuGUI, SLOT(Rename())); if (aType != VISU::TMESH) { @@ -2607,12 +2864,11 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri thePopup->insertItem("Edit...", visuGUI, SLOT(EditPrs())); thePopup->insertItem("Edit Scalar Bar...", visuGUI, SLOT(EditScalarBar())); - if ((aType != VISU::TVECTORS) && (aType != VISU::TSTREAMLINES) - && (aType != VISU::TCUTLINES) && isVTKViewer) - thePopup->insertItem("Sweep", visuGUI, SLOT(Sweep())); - if (aType == VISU::TCUTLINES) thePopup->insertItem( "Create Table", visuGUI, SLOT( CreateTable() ) ); + + thePopup->insertItem("Sweep", visuGUI, SLOT(Sweep())); + } if (isVTKViewer) { if ( theParent == "Viewer" && @@ -2620,18 +2876,24 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri aType == VISU::TSCALARMAP || aType == VISU::TDEFORMEDSHAPE ) ) { thePopup->insertSeparator(); - if ( Sel->SelectionMode() == SelectionPoint ) { - thePopup->insertItem("Results at Point", visuGUI, SLOT(InfoOnPoint())); + TColStd_MapOfInteger aMapIndex; + aSelection->GetIndex(anIO,aMapIndex); + if ( aSelection->SelectionMode() == SelectionPoint ) { + if(aMapIndex.Extent() == 1) + thePopup->insertItem("Results at Point", visuGUI, SLOT(InfoOnPoint())); thePopup->insertItem("Select a Point", visuGUI, SLOT(SelectPoint())); } - else if ( Sel->SelectionMode() == SelectionCell) { - thePopup->insertItem("Results on Cell", visuGUI, SLOT(InfoOnCell())); + else if ( aSelection->SelectionMode() == SelectionCell) { + if(aMapIndex.Extent() == 1) + thePopup->insertItem("Results on Cell", visuGUI, SLOT(InfoOnCell())); thePopup->insertItem("Select a Cell", visuGUI, SLOT(SelectCell())); } } thePopup->insertSeparator(); - if (visuGUI->IsDisplayed(aPrsObject) ) + + if (visuGUI->IsDisplayed(aPrsObject) ){ thePopup->insertItem("Erase", visuGUI, SLOT(ErasePrs())); + } else thePopup->insertItem("Display", visuGUI, SLOT(DisplayPrs())); @@ -2647,8 +2909,9 @@ bool VisuGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* thePopup, const QStri } return false; } + else { - // possibly this is the MED field/mesh and suppot objects + // possibly this is the MED field/mesh and support objects SALOME_MED::MED_ptr aMED = SALOME_MED::MED::_narrow( anObject ); if(!CORBA::is_nil(aMED)) thePopup->insertItem( "Import Structure", visuGUI, SLOT( ImportMedField() ) ); @@ -2734,14 +2997,10 @@ void VisuGUI::BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO) BEGIN_OF("VisuGUI::BuildPresentation"); if (theIO.IsNull()) { - MESSAGE("VisuGUI::BuildPresentation(): null SALOME_InteractiveObject passed"); + if(MYDEBUG) MESSAGE("VisuGUI::BuildPresentation(): null SALOME_InteractiveObject passed"); return; } - /* Create or retrieve an object VisuGUI */ - - VisuGUI::GetOrCreateVisuGUI(QAD_Application::getDesktop()); - SALOMEDS::Study_var aStudy = GetActiveStudy()->getStudyDocument(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); @@ -2752,34 +3011,28 @@ void VisuGUI::BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO) SALOMEDS::SObject_var aSObj = aStudy -> FindObjectID ( theIO->getEntry() ); SCRUTE(aSObj); if (aSObj -> _is_nil() ) { - MESSAGE("No SObject for interacative object is found"); + if(MYDEBUG) MESSAGE("No SObject for interacative object is found"); return; } CORBA::Object_var anObject = VISU::SObjectToObject(aSObj); if(!CORBA::is_nil(anObject)) { - VISU::Prs3d_i* aPrsObject = dynamic_cast(VISU::GetServant(anObject)); if ( !aPrsObject ) { - MESSAGE("The object is not VISU::Prs3d_i"); + if(MYDEBUG) MESSAGE("The object is not VISU::Prs3d_i"); return; } VISU_Actor *SelectedActor = visuGUI->GetActor(aPrsObject); - if ( ! SelectedActor ) - SelectedActor = aPrsObject -> CreateActor(); - SCRUTE(SelectedActor); - if ( SelectedActor == NULL ) { - MESSAGE("VisuGUI::BuildPresentation(): actor doesn't exist in Render"); - return; - } - VTKViewer_ViewFrame* vf = GetVtkViewFrame(); - vf->AddActor(SelectedActor); - } - else { - MESSAGE("CORBA::is_nil(anObject) = true"); - } + if(!SelectedActor) + try{ + SelectedActor = aPrsObject -> CreateActor(); + if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()) + vf->AddActor(SelectedActor); + }catch(std::runtime_error& exc){ + } + }else + if(MYDEBUG) MESSAGE("CORBA::is_nil(anObject) = true"); END_OF("VisuGUI::BuildPresentation"); - } extern "C" @@ -2787,25 +3040,25 @@ extern "C" bool OnGUIEvent(int theCommandID, QAD_Desktop* parent) { - //MESSAGE("VisuGUI::OnGUIEvent "<< theCommandID); + //if(MYDEBUG) MESSAGE("VisuGUI::OnGUIEvent "<< theCommandID); return VisuGUI::OnGUIEvent(theCommandID, parent); } bool OnKeyPress (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - MESSAGE("VisuGUI::OnKeyPress "); + if(MYDEBUG) MESSAGE("VisuGUI::OnKeyPress "); return VisuGUI::OnKeyPress (pe, parent, studyFrame); } bool OnMousePress (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - //MESSAGE("VisuGUI::OnMousePress "); + //if(MYDEBUG) MESSAGE("VisuGUI::OnMousePress "); return VisuGUI::OnMousePress (pe, parent, studyFrame); } bool OnMouseMove (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame) { - //MESSAGE("VisuGUI::OnMouseMove "); + //if(MYDEBUG) MESSAGE("VisuGUI::OnMouseMove "); return VisuGUI::OnMouseMove (pe, parent, studyFrame); } @@ -2853,44 +3106,69 @@ extern "C" // void VisuGUI::NewColor(VISU_Actor *theActor){ - if(VISU::Prs3d_i* aPrs3d = theActor->getPrs3d()){ - SALOMEDS::Color anOldColor = aPrs3d->GetColor(), aNewColor; + if(VISU::Prs3d_i* aPrs3d = theActor->GetPrs3d()){ + VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d); + VISU::DeformedShape_i* aDeformedShape = dynamic_cast(aPrs3d); + SALOMEDS::Color anOldColor, aNewColor; + int aRepresent = theActor->GetRepresentation(); + if(aMesh) + switch(aRepresent){ + case VISU::POINT : + anOldColor = aMesh->GetNodeColor(); + break; + case VISU::WIREFRAME : + case VISU::INSIDEFRAME : + anOldColor = aMesh->GetLinkColor(); + break; + case VISU::SHADED : + case VISU::SURFACEFRAME : + anOldColor = aMesh->GetCellColor(); + break; + } + else if(aDeformedShape) + anOldColor = aDeformedShape->GetColor(); + else + return; QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop()); if(aColorNew.isValid()){ aNewColor.R = aColorNew.red()/255.; aNewColor.G = aColorNew.green()/255.; aNewColor.B = aColorNew.blue()/255.; - aPrs3d->SetColor(aNewColor); - aPrs3d->Update(); - for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++) - if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){ - QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame(); - if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast(aVFrame)) - if(VISU_Actor* anActor = GetActor(aPrs3d,aViewFrame)) - aPrs3d->UpdateActor(anActor); + if(aMesh) + switch(aRepresent){ + case VISU::POINT : + aMesh->SetNodeColor(aNewColor); + break; + case VISU::WIREFRAME : + case VISU::INSIDEFRAME : + aMesh->SetLinkColor(aNewColor); + break; + case VISU::SHADED : + case VISU::SURFACEFRAME : + aMesh->SetCellColor(aNewColor); + break; } + else + aDeformedShape->SetColor(aNewColor); + RecreateActor(aPrs3d); } } } -void VisuGUI::NewOutlineColor(VISUMesh_Actor *theActor){ - if(VISU::Mesh_i* aPrs3d = dynamic_cast(theActor->getPrs3d())){ - SALOMEDS::Color anOldColor = aPrs3d->GetColor(), aNewColor; - QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); - QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop()); - if(aColorNew.isValid()){ - aNewColor.R = aColorNew.red()/255.; - aNewColor.G = aColorNew.green()/255.; - aNewColor.B = aColorNew.blue()/255.; - aPrs3d->SetLinkColor(aNewColor); - for(int i = 0, nbFrames = GetActiveStudy()->getStudyFramesCount(); i < nbFrames; i++) - if(QAD_StudyFrame* aFrame = GetActiveStudy()->getStudyFrame(i)){ - QAD_ViewFrame* aVFrame = aFrame->getRightFrame()->getViewFrame(); - if(VTKViewer_ViewFrame* aViewFrame = dynamic_cast(aVFrame)) - if(VISU_Actor* anActor = GetActor(aPrs3d,aViewFrame)) - aPrs3d->UpdateActor(anActor); - } +void VisuGUI::NewWireframeColor(VISU_MeshAct *theActor){ + if(VISU::Prs3d_i* aPrs3d = theActor->GetPrs3d()){ + if(VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d)){ + SALOMEDS::Color anOldColor = aMesh->GetLinkColor(), aNewColor; + QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); + QColor aColorNew = QColorDialog::getColor(aColor, GetDesktop()); + if(aColorNew.isValid()){ + aNewColor.R = aColorNew.red()/255.; + aNewColor.G = aColorNew.green()/255.; + aNewColor.B = aColorNew.blue()/255.; + aMesh->SetLinkColor(aNewColor); + VisuGUI::RecreateActor(aMesh); + } } } } @@ -3054,7 +3332,6 @@ QString VisuGUI::getVisuOutputDir() /* ======================================================================================== */ VISU::Result_i* VisuGUI::CreatePresent(SALOMEDS::SObject_var theField, VISU::Result_var& theResult){ if(MYDEBUG) MESSAGE("VisuGUI::CreatePresent"); - VisuGUI::GetOrCreateVisuGUI( QAD_Application::getDesktop() ); SALOMEDS::SObject_var aSObj = theField->GetFather(); if (CORBA::is_nil(aSObj)) return NULL; aSObj = aSObj->GetFather(); if (CORBA::is_nil(aSObj)) return NULL; @@ -3074,7 +3351,7 @@ VISU::Result_i* VisuGUI::CreatePresent(SALOMEDS::SObject_var theField, VISU::Res #define CREATEPRS(PRSTYPE, FNAME, FCREATE) \ PRSTYPE* FNAME(SALOMEDS::SObject_var theField, \ const char* theMeshName, VISU::Entity theEntity, \ - const char* theFieldName, double theTimeId) {\ + const char* theFieldName, int theTimeId) {\ VISU::Result_var aResult; \ VISU::Result_i* pResult = CreatePresent(theField,aResult); \ if(pResult != NULL){ \ @@ -3114,23 +3391,26 @@ bool FNAME(SALOMEDS::SObject_var theField) { \ QString aTimeStampId = VISU::Storable::FindValue(aMap,"myTimeStampId",&isExist).latin1(); \ Utils_Timer timer; \ if(MYCHECKTIME) timer.Start(); \ - TYPE* pPresent = FCREATE(theField,aMeshName,(VISU::Entity)anEntity.toInt(),aFieldName,aTimeStampId.toDouble()); \ + TYPE* pPresent = FCREATE(theField,aMeshName,(VISU::Entity)anEntity.toInt(),aFieldName,aTimeStampId.toInt()); \ if(MYCHECKTIME) { \ timer.Stop(); \ - MESSAGE("BUILDPRS(TYPE, FCREATE, FNAME, DLGNAME) - CREATE PRSOBJECT"); \ + cout<<"BUILDPRS(TYPE, FCREATE, FNAME, DLGNAME) - CREATE PRSOBJECT\n"; \ timer.Show(); \ } \ if (pPresent) { \ - DLGNAME* aDlg = new DLGNAME(); \ - aDlg->initFromPrsObject(pPresent); \ - if (aDlg->exec()) { \ - aDlg->storeToPrsObject(pPresent); \ - } else { \ - DeletePresentation(pPresent); \ + QString aValue = QAD_CONFIG->getSetting("Visu:BuildDefaultPrs3d"); \ + if(aValue.isEmpty() || (!aValue.isEmpty() && !aValue.toInt())){ \ + DLGNAME* aDlg = new DLGNAME(); \ + aDlg->initFromPrsObject(pPresent); \ + if (aDlg->exec()) { \ + aDlg->storeToPrsObject(pPresent); \ + } else { \ + DeletePresentation(pPresent); \ + delete aDlg; \ + return false; \ + } \ delete aDlg; \ - return false; \ } \ - delete aDlg; \ CreateActor(pPresent); \ return true; \ } \ @@ -3155,26 +3435,40 @@ void VisuGUI::ImportTablesFromFile(){ flt.append( "Files (*.xls *.txt *.tab)" ); flt.append( "All Files (*.*)" ); QString aDir = getVisuInputDir(); - QString aFile = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), + QFileInfo aFileInfo = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), aDir,flt,tr("Import From File"),true); - if(!aFile.isEmpty()){ - QAD_Application::getDesktop()->putInfo( "Importing From File " + aFile + "..." ); - aDir = QAD_Tools::getDirFromPath(aFile); + + if(aFileInfo.exists()){ + QAD_Application::getDesktop()->putInfo( "Importing From File " + aFileInfo.filePath() + "..." ); + aDir = QAD_Tools::getDirFromPath(aFileInfo.filePath()); QAD_CONFIG->addSetting("Visu:InputDir",aDir); - QApplication::setOverrideCursor( Qt::waitCursor ); - QAD_PyInterp* myPyInterp = GetActiveStudy()->get_PyInterp(); - myPyInterp->run("import VisuGUI"); - myPyInterp->run("reload(VisuGUI)"); - myPyInterp->run("VisuGUI.AddTablesInStudyFromFile('"+aFile+"')"); - // VISU::Result_var aResult = myComponent->ImportFile(aFile.latin1()); - // if(aResult->_is_nil()) - // QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), - // tr ("There is an error in imported file"), - // tr ("VISU_BUT_OK") ); - // else - // QAD_Application::getDesktop()->putInfo(aFile+" imported."); + QAD_WaitCursor wc; + + CORBA::Object_var anObject; +#ifdef CHECKTIME + Utils_Timer timer; + timer.Start(); +#endif + + anObject=GetVisuGen()->ImportTables(aFileInfo.filePath()); + +#ifdef CHECKTIME + timer.Stop(); + cout<<"VisuGUI::ImportTablesFromFile() - IMPORT FILE\n"; + timer.Show(); +#endif + + if(CORBA::is_nil(anObject)) { + wc.stop(); + QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("ERR_ERROR_IN_THE_FILE"), + tr ("VISU_BUT_OK") ); + wc.start(); + } + else { + QAD_Application::getDesktop()->putInfo(aFileInfo.filePath()+" imported."); + } GetActiveStudy()->updateObjBrowser(); //update Object browser - QApplication::restoreOverrideCursor(); } } @@ -3187,32 +3481,46 @@ void VisuGUI::ImportFromFile(){ //flt.append( "Exportable Files (*.med *.dat)" ); //flt.append( "Dat Files (*.dat)" ); flt.append( "Med Files (*.med)" ); - flt.append( "Dat Files (*.xls)" ); QString aDir = getVisuInputDir(); - QFileInfo aFileInfo = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - aDir,flt,tr("Import From File"),true); + QFileInfo aFileInfo = VisuGUI_FileDlg::getFileName(QAD_Application::getDesktop(), + aDir,flt,tr("Import From File"),true); + if(aFileInfo.exists()){ QAD_Application::getDesktop()->putInfo( "Importing From File " + aFileInfo.filePath() + "..." ); aDir = QAD_Tools::getDirFromPath(aFileInfo.filePath()); QAD_CONFIG->addSetting("Visu:InputDir",aDir); QAD_WaitCursor wc; - - CORBA::Object_var anObject; + + VISU::Result_var aResult; + #ifdef CHECKTIME Utils_Timer timer; timer.Start(); #endif - if(aFileInfo.extension(false) == "med") - anObject = GetVisuGen()->ImportFile(aFileInfo.filePath()); - else if(aFileInfo.extension(false) == "xls") - anObject = GetVisuGen()->ImportTables(aFileInfo.filePath()); + if(aFileInfo.extension(false) == "med"){ + QString IsBuild = QAD_CONFIG->getSetting("Visu:BuildResult"); + bool isBuild = (IsBuild.isEmpty()? 0 : IsBuild.toInt()); + + if (VisuGUI_FileDlg::IsBuild) + { + aResult = GetVisuGen()->ImportFile(aFileInfo.filePath()); + if(!CORBA::is_nil(aResult.in())) aResult->BuildAll(); + } + else + { + QAD_CONFIG->addSetting( "Visu:BuildResult", false ); + aResult=GetVisuGen()->ImportFile( aFileInfo.filePath() ); + QAD_CONFIG->addSetting( "Visu:BuildResult", isBuild ); + } + } + #ifdef CHECKTIME timer.Stop(); - MESSAGE("VisuGUI::ImportFromFile() - IMPORT FILE"); + cout<<"VisuGUI::ImportFromFile() - IMPORT FILE\n"; timer.Show(); #endif - if(CORBA::is_nil(anObject)) { + if(CORBA::is_nil(aResult.in())) { wc.stop(); QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), tr ("ERR_ERROR_IN_THE_FILE"), @@ -3265,7 +3573,7 @@ bool VisuGUI::TestObjectBrowser(SALOMEDS::SObject_var& objVisu ){ if(MYDEBUG) MESSAGE("VisuGUI::TestObjectBrowser"); Handle(SALOME_InteractiveObject) anIO; CORBA::Object_var anObject = GetSelectedObj(&anIO); - if(anIO->hasEntry()){ + if(!anIO.IsNull() && anIO->hasEntry()){ objVisu = GetStudyDocument()->FindObjectID(anIO->getEntry()); QString aValue = getValue(objVisu,"myType"); if((VISU::VISUType)aValue.toInt() == VISU::TTIMESTAMP) return true; @@ -3286,7 +3594,7 @@ VISU_Actor* VisuGUI::GetActor(VISU::Prs3d_i* thePrs, VTKViewer_ViewFrame* theVie vtkActorCollection *anActColl = vf->getRenderer()->GetActors(); for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;) if(VISU_Actor* anVISUActor = dynamic_cast(anActor)) - if(thePrs == anVISUActor->getPrs3d()) + if(thePrs == anVISUActor->GetPrs3d()) return anVISUActor->GetParent(); return NULL; } @@ -3309,26 +3617,28 @@ VISU_Actor* VisuGUI::UpdateViewer(VISU::Prs3d_i* thePrs, bool theDispOnly){ for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL; ){ if(anActor->IsA("VISU_Actor")){ anVISUActor = VISU_Actor::SafeDownCast(anActor); - VISU::Prs3d_i* aPrs = anVISUActor->getPrs3d(); + VISU::Prs3d_i* aPrs = anVISUActor->GetPrs3d(); if(aPrs == NULL) continue; if (thePrs == aPrs) { aResActor = anVISUActor->GetParent(); thePrs->UpdateActor(aResActor); aResActor->VisibilityOn(); + } else if (theDispOnly) { - anVISUActor->VisibilityOff(); + anVISUActor->GetParent()->VisibilityOff(); } } } if (aResActor) return aResActor; - anVISUActor = thePrs->CreateActor(); - MESSAGE("UpdateViewer - thePrs->CreateActor() = "<CreateActor(); vf->AddActor(anVISUActor); - } else + }catch(std::runtime_error& exc){ QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), tr ("ERR_CANT_VISUALIZE_OBJECT"), tr ("VISU_BUT_OK") ); + anVISUActor = NULL; + } return anVISUActor; } @@ -3375,27 +3685,26 @@ void VisuGUI::DeletePresentation(VISU::Prs3d_i* thePrs) { * Creates new actor of presentation */ void VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) { - if (!thePrs) return; + if (!thePrs) return; QApplication::setOverrideCursor( Qt::waitCursor ); - VTKViewer_ViewFrame* vf = GetVtkViewFrame(); - if (vf) { + if(VTKViewer_ViewFrame* vf = GetVtkViewFrame()){ #ifdef CHECKTIME - Utils_Timer timer; - timer.Start(); + Utils_Timer timer; + timer.Start(); #endif - VISU_Actor* aActor = thePrs->CreateActor(); - if ( ! aActor ) { + try{ + VISU_Actor* aActor = thePrs->CreateActor(); + vf->AddActor(aActor); + }catch(std::runtime_error& exc){ QApplication::restoreOverrideCursor(); QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), - tr ("WRN_CANT_VISUALIZE_PRS"), - tr ("VISU_BUT_OK") ); - return; + tr ("WRN_CANT_VISUALIZE_PRS"), + tr ("VISU_BUT_OK") ); } - vf->AddActor(aActor); #ifdef CHECKTIME - timer.Stop(); - MESSAGE("VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) - DISPLAY ACTOR"); - timer.Show(); + timer.Stop(); + cout<<"VisuGUI::CreateActor(VISU::Prs3d_i* thePrs) - DISPLAY ACTOR\n"; + timer.Show(); #endif } QApplication::restoreOverrideCursor(); diff --git a/src/VISUGUI/VisuGUI.h b/src/VISUGUI/VisuGUI.h index ad52d84f..1c97bbb9 100644 --- a/src/VISUGUI/VisuGUI.h +++ b/src/VISUGUI/VisuGUI.h @@ -39,31 +39,50 @@ #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) #include "QAD_Desktop.h" -#include "VISU_Actor.h" -#include "VISU_PrsObject_i.hh" -#include "VISU_Table_i.hh" -#include "VISU_ViewManager_i.hh" +class VTKViewer_ViewFrame; + +#include "VISUConfig.hh" +class VISU_Actor; +class VISU_MeshAct; +class VISU_ScalarMapAct; + +#include +class vtkRenderer; #include #include #include "SALOME_ListIteratorOfListIO.hxx" -class vtkRenderer; +namespace VISU{ + class VISU_Gen_i; -enum RepresentType { POINTS, WIREFRAME, SURFACE, SHRINK }; + class Result_i; + class Prs3d_i; + class ScalarMap_i; + class DeformedShape_i; + class IsoSurfaces_i; + class CutPlanes_i; + class CutLines_i; + class Vectors_i; + class StreamLines_i; + class Table_i; + class Curve_i; + class Container_i; +} // ====================================================================== // CLASS VIUSGUI // ====================================================================== // + class VisuGUI : public QObject{ Q_OBJECT; public: VisuGUI(); ~VisuGUI(); - + static VISU::VISU_Gen_i* GetVisuGen(); static QAD_Desktop* GetDesktop(); @@ -74,46 +93,53 @@ class VisuGUI : public QObject{ static SALOMEDS::StudyBuilder_var NewBuilder(); static VISU::Storable::TRestoringMap getMapOfValue(SALOMEDS::SObject_var theSObject); - static VisuGUI* GetOrCreateVisuGUI(QAD_Desktop* desktop); - static VisuGUI* GetVisuGUI() ; - static VISU::Result_i* CreatePresent(SALOMEDS::SObject_var theField, VISU::Result_var& theResult); + enum CameraOrient {e3D, eFront, eLeft, eTop}; + static CameraOrient SetFitAll( VTKViewer_ViewFrame* vf); + bool CreateScalarMap(SALOMEDS::SObject_var theField); static VISU::ScalarMap_i* CreateScalarMapPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateDeformedShape(SALOMEDS::SObject_var theField); static VISU::DeformedShape_i* CreateDeformedShapePrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateVectors(SALOMEDS::SObject_var theField); static VISU::Vectors_i* CreateVectorsPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateIsoSurfaces(SALOMEDS::SObject_var theField); static VISU::IsoSurfaces_i* CreateIsoSurfacesPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateCutPlanes(SALOMEDS::SObject_var theField); static VISU::CutPlanes_i* CreateCutPlanesPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateCutLines(SALOMEDS::SObject_var theField); static VISU::CutLines_i* CreateCutLinesPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool CreateStreamLines(SALOMEDS::SObject_var theField); static VISU::StreamLines_i* CreateStreamLinesPrs(SALOMEDS::SObject_var theField, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theTimeId); + const char* theFieldName, int theTimeId); bool TestObjectBrowser(SALOMEDS::SObject_var& objVisu); + + typedef void (*TGetInfoFun)(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId); + void GetInfo(int theSelectionMode, TGetInfoFun theGetInfoFun); + + typedef int (vtkDataSet::* TSelectFun)(); + void Select(int theSelectionMode, TSelectFun theSelectFun, + const char* theTitle, const char* theRequest); static void ShowTrihedron(bool Show); static void ChangeViewer(int theType); static void NewColor(VISU_Actor *Actor); - static void NewOutlineColor(VISUMesh_Actor *Actor); + static void NewWireframeColor(VISU_MeshAct *Actor); static void NewOpacity(VISU_Actor *Actor); static void NewLinewidth(VISU_Actor *Actor); @@ -135,12 +161,11 @@ class VisuGUI : public QObject{ void ErasePrs(VISU::Prs3d_i* thePrs); static VISU::Prs3d_i* GetSelectedPrs3d(Handle(SALOME_InteractiveObject)* theIO = NULL); - void RecreateActor(VISU::Prs3d_i* thePrs); + static void RecreateActor(VISU::Prs3d_i* thePrs); static void CreateActor(VISU::Prs3d_i* thePrs); - static VISU_Actor *GetActor(int* theSelectionType = NULL); static VISU_Actor* GetActor(VISU::Prs3d_i* thePrs, VTKViewer_ViewFrame* theViewFrame = NULL); - void VisuGUI::ChangeRepresentation(RepresentType theType); + void VisuGUI::ChangeRepresentation(VISU::PresentationType theType); void DeletePresentation(VISU::Prs3d_i* thePrs); void SetState(int aState ); @@ -193,15 +218,18 @@ class VisuGUI : public QObject{ void EditPrs(); void EditScalarBar(); void DisplayManyPrs(); + void DisplayOnlyManyPrs(); void EraseManyPrs(); + void MakeSurfaceframe(); + void MakeInsideframe(); void MakeWireframe(); void MakeSurface(); void MakePoints(); void MakeShrink(); void ChageColor(); - void ChangeOutlineColor(); + void ChangeWireframeColor(); void ChangeOpacity(); void ChangeLines(); @@ -216,6 +244,8 @@ class VisuGUI : public QObject{ void DeletePrs(); void Rename(); + void RenameTable(); + void RenameContainer(); void Sweep(); void TimeAnimation(); @@ -227,9 +257,10 @@ class VisuGUI : public QObject{ void InfoOnPoint(); void InfoOnCell(); + void SelectPoint(); void SelectCell(); - + private : QDialog* myActiveDialogBox; int myState ; diff --git a/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx b/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx index 0e87bf97..5b55f9cd 100644 --- a/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx +++ b/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx @@ -26,12 +26,21 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_CutPlanesDlg.h" -#include +#include "VISU_CutPlanes_i.hh" + #include "QAD_Application.h" #include "QAD_Desktop.h" +#include +#include +#include +#include +#include +#include + +using namespace std; + /*! Constructor */ @@ -68,6 +77,17 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg() nbPlan->setValue( 1 ); nbPlan->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myPosTable = new QTable(this, "Positions of planes" ); + myPosTable->setMaximumHeight( 227 ); + myPosTable->setMinimumWidth( 294 ); + //myPosTable->setGeometry( QRect( 11, 98, 289, 325 ) ); + myPosTable->setNumCols(2); + myPosTable->setNumRows(0); + + QHeader *th = myPosTable->horizontalHeader(); + th->setLabel( 0, "Position" ); + th->setLabel( 1, "Set default" ); + QGroupBox* GBrot = new QGroupBox( tr( "Rotations" ), this, "GBrot" ); GBrot->setColumnLayout(0, Qt::Vertical ); GBrot->layout()->setSpacing( 0 ); @@ -117,26 +137,39 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg() QLabel* aPosLbl = new QLabel(tr( "LBL_POS" ), this); myPosSpn = new QAD_SpinBoxDbl( this, 0, 1, 0.1 ); + th->setStyle("QStyle::CE_PushButton"); + // layouting TopLayout->addMultiCellWidget( SelPlane, 0, 0, 0, 1 ); - TopLayout->addWidget( LabelPosi_3, 1, 0 ); - TopLayout->addWidget( nbPlan, 1, 1 ); - TopLayout->addMultiCellWidget( GBrot, 2, 2, 0, 1 ); - TopLayout->addWidget(aPosLbl, 3, 0 ); - TopLayout->addWidget(myPosSpn, 3, 1 ); - TopLayout->addMultiCellWidget( GroupButtons, 4, 4, 0, 1 ); + TopLayout->addMultiCellWidget( GBrot, 1, 1, 0, 1 ); + TopLayout->addWidget( LabelPosi_3, 2, 0 ); + TopLayout->addWidget( nbPlan, 2, 1 ); + TopLayout->addMultiCellWidget( myPosTable, 3, 3, 0, 1 ); + TopLayout->setRowStretch ( 3, 3 ); + TopLayout->addWidget(aPosLbl, 4, 0 ); + TopLayout->addWidget(myPosSpn, 4, 1 ); + TopLayout->addMultiCellWidget( GroupButtons, 5, 5, 0, 1 ); // signals and slots connections connect( SelPlane, SIGNAL( clicked( int )), this, SLOT( orientationChanged( int ) ) ); - + connect( nbPlan, SIGNAL( valueChanged( int )), this, SLOT( DrawTable( ) ) ); + connect( myPosSpn, SIGNAL( valueChanged( double )), this, SLOT( DrawTable( ) ) ); + connect( RBzx, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) ); + connect( RByz, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) ); + connect( RBxy, SIGNAL( toggled(bool)), this, SLOT( DrawTable( ) ) ); + connect( th, SIGNAL( clicked(int)), this, SLOT( setDefault(int) ) ); + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + myCutPlanes = NULL; + // default values + hasInit = false; X1 = 0; X2 = 0; Y1 = 0; Y2 = 0; Z1 = 0; Z2 = 0; - RBxy->setChecked( true ); + RByz->setChecked( true ); orientationChanged( 0 ); } @@ -145,6 +178,7 @@ VisuGUI_CutPlanesDlg::VisuGUI_CutPlanesDlg() */ VisuGUI_CutPlanesDlg::~VisuGUI_CutPlanesDlg() { + if(myCutPlanes) delete myCutPlanes; } @@ -153,6 +187,11 @@ void VisuGUI_CutPlanesDlg::initFromPrsObject(VISU::CutPlanes_i* thePrs) { setRotation(thePrs->GetRotateX()*180./PI, thePrs->GetRotateY()*180./PI); setPlanePos(thePrs->GetOrientationType()); myPosSpn->setValue(thePrs->GetDisplacement()); + hasInit = true; + // init table + myCutPlanes = new VISU::CutPlanes_i(thePrs->GetResult(),false); + myCutPlanes->SameAs(thePrs); + DrawTable(); } void VisuGUI_CutPlanesDlg::storeToPrsObject(VISU::CutPlanes_i* thePrs) { @@ -161,7 +200,12 @@ void VisuGUI_CutPlanesDlg::storeToPrsObject(VISU::CutPlanes_i* thePrs) { thePrs->SetRotateY(getRotation2()*PI/180.); thePrs->SetOrientationType(getOrientaion()); thePrs->SetDisplacement(myPosSpn->value()); - thePrs->Update(); + for (int i = 0; i < getNbPlanes(); ++i) + { + if (!((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked()) + thePrs->SetPlanePosition( i, ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->text().toDouble() ); + else thePrs->SetDefault(i); + } } /*! @@ -267,3 +311,87 @@ double VisuGUI_CutPlanesDlg::getRotation2() { return Rot2->value(); } + +/*! + Draw the table of planes positions +*/ + +void VisuGUI_CutPlanesDlg::DrawTable() +{ + if (!hasInit) return; + + int aNbRows = myPosTable->numRows(); + int aNbPlanes = getNbPlanes(); + + if (aNbRows>0) + for (int i = 0; i < aNbRows; ++i) + { + if (!((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked()) + myCutPlanes->SetPlanePosition( i, ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->text().toDouble() ); + } + + myCutPlanes->SetNbPlanes(aNbPlanes); + myCutPlanes->SetDisplacement(myPosSpn->value()); + myCutPlanes->SetOrientationType(getOrientaion()); + + if (aNbRows < aNbPlanes) + { + if (aNbRows == 0) myPosTable->setNumRows(aNbPlanes); + else myPosTable->insertRows(aNbRows, aNbPlanes - aNbRows ); + + QHeader *vh = myPosTable->verticalHeader(); + QString str; + + QDoubleValidator *dvalidator = new QDoubleValidator(myPosTable); + dvalidator->setDecimals(32); + + for (int i = aNbRows; i < myPosTable->numRows(); ++i) + { + QLineEdit *editline = new QLineEdit( myPosTable ); + editline->setValidator(dvalidator); + myPosTable->setCellWidget( i, 0, editline ); + + QCheckBox *checkbox = new QCheckBox( myPosTable ); + myPosTable->setCellWidget(i, 1, checkbox ); + connect(checkbox , SIGNAL( clicked() ), this , SLOT( setDefault() ) ); + + str = str.setNum(i+1); + str.prepend ("Plane# "); + vh->setLabel( i, str ); + } + } + else if (aNbRows > aNbPlanes) + for (int i = aNbRows-1; myPosTable->numRows() != aNbPlanes; --i ) + myPosTable->removeRow(i); + + for (int i = 0; i < myPosTable->numRows(); ++i) + { + ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setText( QString::number(myCutPlanes->GetPlanePosition(i)) ); + + if (myCutPlanes->IsDefault(i)) + { + ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->setChecked(true); + ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(false); + } + } +} + +void VisuGUI_CutPlanesDlg::setDefault(int all) +{ + if (all == 0) return; + + if (all == 1) + for (int i = 0; i < getNbPlanes(); ++i) + ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->setChecked(true); + + for (int i = 0; i < getNbPlanes(); ++i) + { + if ( ((QCheckBox*)myPosTable->cellWidget( i, 1 ))->isChecked() ) + { + myCutPlanes->SetDefault(i); + ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setText( QString::number(myCutPlanes->GetPlanePosition(i)) ); + ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(false); + } + else ((QLineEdit*)myPosTable->cellWidget( i, 0 ))->setEnabled(true); + } +} diff --git a/src/VISUGUI/VisuGUI_CutPlanesDlg.h b/src/VISUGUI/VisuGUI_CutPlanesDlg.h index 9432108f..c26532fa 100644 --- a/src/VISUGUI/VisuGUI_CutPlanesDlg.h +++ b/src/VISUGUI/VisuGUI_CutPlanesDlg.h @@ -29,6 +29,9 @@ #ifndef VISUGUI_CUTPLANESDLG_H #define VISUGUI_CUTPLANESDLG_H +#include "QAD_SpinBoxDbl.h" +#include "VisuGUI_ScalarBarDlg.h" + #include #include #include @@ -36,10 +39,13 @@ #include #include #include -#include "QAD_SpinBoxDbl.h" -#include "VISU_PrsObject_i.hh" -#include "VisuGUI_ScalarBarDlg.h" +#include +#include "SALOMEconfig.h" +#include CORBA_CLIENT_HEADER(VISU_Gen) +namespace VISU{ + class CutPlanes_i; +} class VisuGUI_CutPlanesDlg : public QDialog { @@ -62,8 +68,7 @@ public: void initFromPrsObject(VISU::CutPlanes_i* thePrs); void storeToPrsObject(VISU::CutPlanes_i* thePrs); - - + private: QLabel* LabelRot1; QLabel* LabelRot2; @@ -74,22 +79,18 @@ private: QRadioButton* RByz; QRadioButton* RBxy; QAD_SpinBoxDbl* myPosSpn; - + QTable* myPosTable; + VISU::CutPlanes_i* myCutPlanes; double X1, X2; double Y1, Y2; double Z1, Z2; - + bool hasInit; private slots: void editScalarBar(); void orientationChanged( int ); + void DrawTable(); + void setDefault( int all = -1); }; #endif // VISUGUI_CUTPLANESDLG_H - - - - - - - diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx index 3b3f8e3e..5977d5ee 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx @@ -26,25 +26,29 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_IsoSurfacesDlg.h" -#include -#include +#include "VISU_IsoSurfaces_i.hh" + #include "QAD_Application.h" #include "QAD_Desktop.h" -#include #include "QAD_MessageBox.h" +#include + +#include +#include + +using namespace std; /*! Constructor */ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg() - : QDialog( QAD_Application::getDesktop(), "VisuGUI_IsoSurfacesDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + : QDialog( QAD_Application::getDesktop(), "VisuGUI_IsoSurfacesDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) { setCaption( tr( "Iso Surfaces Definition" ) ); setSizeGripEnabled( TRUE ); - + QGridLayout* TopLayout = new QGridLayout( this ); TopLayout->setSpacing( 6 ); TopLayout->setMargin( 11 ); @@ -78,12 +82,21 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg() LabelMax->setBuddy(MaxIso); TopGroupLayout->addWidget( MaxIso, 1, 1 ); + CBUpdate = new QCheckBox ( tr( "Update scalar bar with these values" ), TopGroup); + CBUpdate->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) ); + TopGroupLayout->addMultiCellWidget( CBUpdate, 4, 4, 0, 1); + CBUpdate->setChecked(true); + + CBLog = new QCheckBox ( tr( "Logarithmic scaling" ), TopGroup); + CBLog->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) ); + TopGroupLayout->addMultiCellWidget( CBLog, 3, 3, 0, 1); + QLabel* LabelNbr = new QLabel( tr( "Number of surfaces:" ), TopGroup, "LabelNbr" ); TopGroupLayout->addWidget( LabelNbr, 2, 0 ); NbrIso = new QSpinBox( 1, 100, 1, TopGroup, "NbrIso" ); NbrIso->setValue( 1 ); TopGroupLayout->addWidget( NbrIso, 2, 1 ); - + QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) ); GroupButtons->setColumnLayout(0, Qt::Vertical ); @@ -93,7 +106,7 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg() GroupButtonsLayout->setAlignment( Qt::AlignTop ); GroupButtonsLayout->setSpacing( 6 ); GroupButtonsLayout->setMargin( 11 ); - + QPushButton* buttonOk = new QPushButton( tr( "&OK" ), GroupButtons, "buttonOk" ); buttonOk->setAutoDefault( TRUE ); buttonOk->setDefault( TRUE ); @@ -105,38 +118,66 @@ VisuGUI_IsoSurfacesDlg::VisuGUI_IsoSurfacesDlg() TopLayout->addWidget( TopGroup, 0, 0 ); TopLayout->addWidget( GroupButtons, 1, 0 ); - + // signals and slots connections connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + connect( CBUpdate, SIGNAL( clicked() ), this, SLOT(onCBUpdate() ) ); } /*! - Destructor + Destructor */ VisuGUI_IsoSurfacesDlg::~VisuGUI_IsoSurfacesDlg() { } - void VisuGUI_IsoSurfacesDlg::initFromPrsObject(VISU::IsoSurfaces_i* thePrs) { NbrIso->setValue(thePrs->GetNbSurfaces()); - MinIso->setText(QString::number(thePrs->GetRangeMin())); - MaxIso->setText(QString::number(thePrs->GetRangeMax())); + MinIso->setText(QString::number(thePrs->GetSubMin())); + MaxIso->setText(QString::number(thePrs->GetSubMax())); + switch(thePrs->GetScaling()){ + case VISU::LOGARITHMIC : + CBLog->setChecked(true); + break; + default: + CBLog->setChecked(false); + } } - void VisuGUI_IsoSurfacesDlg::storeToPrsObject(VISU::IsoSurfaces_i* thePrs) { thePrs->SetNbSurfaces(NbrIso->value()); - thePrs->SetRange(MinIso->text().toDouble(), MaxIso->text().toDouble()); - thePrs->Update(); + thePrs->SetSubRange(MinIso->text().toDouble(), MaxIso->text().toDouble()); + if (CBUpdate->isChecked()) + { + thePrs->SetRange(MinIso->text().toDouble(), MaxIso->text().toDouble()); + if (CBLog->isChecked()) + thePrs->SetScaling(VISU::LOGARITHMIC); + else + thePrs->SetScaling(VISU::LINEAR); + } } void VisuGUI_IsoSurfacesDlg::accept() { + if (MinIso->text().toDouble() >= MaxIso->text().toDouble()) QAD_MessageBox::warn1( this,tr("VISU_WARNING"), - tr("MSG_MINMAX_VALUES"), - tr("VISU_BUT_OK")); - else - QDialog::accept(); + tr("MSG_MINMAX_VALUES"), + tr("VISU_BUT_OK")); + else if ( CBUpdate->isChecked() && CBLog->isChecked() && (MinIso->text().toDouble() <=0 || MaxIso->text().toDouble() <=0) ) + { + + QAD_MessageBox::warn1( this, + tr("VISU_WARNING"), + tr("WRN_LOGARITHMIC_RANGE_ISOSURF"), + tr("VISU_BUT_OK")); + } + else QDialog::accept(); +} + +void VisuGUI_IsoSurfacesDlg::onCBUpdate() +{ + if (CBUpdate->isChecked()) + CBLog->setDisabled(false); + else CBLog->setDisabled(true); } diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h index b6658369..24e74cb8 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h @@ -34,9 +34,12 @@ #include #include #include -#include "VISU_PrsObject_i.hh" +#include #include +namespace VISU{ + class IsoSurfaces_i; +} class VisuGUI_IsoSurfacesDlg : public QDialog { @@ -45,17 +48,20 @@ class VisuGUI_IsoSurfacesDlg : public QDialog public: VisuGUI_IsoSurfacesDlg(); ~VisuGUI_IsoSurfacesDlg(); - + void initFromPrsObject(VISU::IsoSurfaces_i* thePrs); void storeToPrsObject(VISU::IsoSurfaces_i* thePrs); - + protected slots: void accept(); - - private: - QLineEdit* MinIso; - QLineEdit* MaxIso; - QSpinBox* NbrIso; + void onCBUpdate(); + +private: + QLineEdit* MinIso; + QLineEdit* MaxIso; + QSpinBox* NbrIso; + QCheckBox* CBUpdate; + QCheckBox* CBLog; }; #endif // VISUGUI_ISOSURFACESDLG_H diff --git a/src/VISUGUI/VisuGUI_MagnitudeDlg.cxx b/src/VISUGUI/VisuGUI_MagnitudeDlg.cxx index 28c0f1af..c8f38d87 100644 --- a/src/VISUGUI/VisuGUI_MagnitudeDlg.cxx +++ b/src/VISUGUI/VisuGUI_MagnitudeDlg.cxx @@ -26,12 +26,16 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_MagnitudeDlg.h" -#include +#include "VISU_DeformedShape_i.hh" + #include "QAD_Application.h" #include "QAD_Desktop.h" +#include + +using namespace std; + /*! Constructor */ @@ -104,12 +108,12 @@ VisuGUI_MagnitudeDlg::~VisuGUI_MagnitudeDlg() void VisuGUI_MagnitudeDlg::initFromPrsObject(VISU::DeformedShape_i* thePrs) { setFactor(thePrs->GetScale()); - UseMagn->setChecked(thePrs->isColored()); + UseMagn->setChecked(thePrs->IsColored()); } void VisuGUI_MagnitudeDlg::storeToPrsObject(VISU::DeformedShape_i* thePrs) { thePrs->SetScale(getFactor()); - thePrs->setColored(isColored()); + thePrs->ShowColored(isColored()); } diff --git a/src/VISUGUI/VisuGUI_MagnitudeDlg.h b/src/VISUGUI/VisuGUI_MagnitudeDlg.h index c1436aea..37c7609c 100644 --- a/src/VISUGUI/VisuGUI_MagnitudeDlg.h +++ b/src/VISUGUI/VisuGUI_MagnitudeDlg.h @@ -34,8 +34,12 @@ #include #include #include + #include "QAD_SpinBoxDbl.h" -#include "VISU_PrsObject_i.hh" + +namespace VISU{ + class DeformedShape_i; +} class VisuGUI_MagnitudeDlg : public QDialog { diff --git a/src/VISUGUI/VisuGUI_NonIsometricDlg.cxx b/src/VISUGUI/VisuGUI_NonIsometricDlg.cxx index df3f1c27..a6c14ba1 100644 --- a/src/VISUGUI/VisuGUI_NonIsometricDlg.cxx +++ b/src/VISUGUI/VisuGUI_NonIsometricDlg.cxx @@ -9,26 +9,29 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_NonIsometricDlg.h" +#include "VISU_Actor.h" +#include "VISU_PipeLine.hxx" -#include -#include -#include -#include #include "QAD_SpinBoxDbl.h" #include "QAD_Application.h" #include "QAD_Desktop.h" #include "QAD_StudyFrame.h" #include "QAD_RightFrame.h" #include "VTKViewer_ViewFrame.h" -#include "VISU_Actor.h" #include "utilities.h" #include "SALOME_Selection.h" #include "SALOME_ListIteratorOfListIO.hxx" #include "SALOME_ListIO.hxx" +#include +#include +#include +#include + +using namespace std; + /*! Constructor */ diff --git a/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx b/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx index 1694a48d..3a2691ce 100644 --- a/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx +++ b/src/VISUGUI/VisuGUI_ScalarBarDlg.cxx @@ -26,17 +26,22 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_ScalarBarDlg.h" -#include -#include -#include +#include "VISU_ScalarMap_i.hh" +#include "VISU_ScalarMapPL.hxx" + #include "QAD_Application.h" #include "QAD_Desktop.h" #include "QAD_Config.h" #include "QAD_MessageBox.h" #include "VISU_Convertor.hxx" +#include +#include +#include + +using namespace std; + /*! Constructor */ @@ -418,6 +423,7 @@ void VisuGUI_ScalarBarDlg::storeToResources() { * Initialise dialog box from presentation object */ void VisuGUI_ScalarBarDlg::initFromPrsObject(VISU::ScalarMap_i* thePrs) { + initFromResources(); myModeCombo->setCurrentItem(thePrs->GetScalarMode()); setPosAndSize( thePrs->GetPosX(), thePrs->GetPosY(), @@ -432,10 +438,10 @@ void VisuGUI_ScalarBarDlg::initFromPrsObject(VISU::ScalarMap_i* thePrs) { setLogarithmic(false); } float aRange[2]; - thePrs->GetFieldRange(aRange); + thePrs->GetScalarMapPL()->GetSourceRange(aRange); Rmin = aRange[0]; Rmax = aRange[1]; setRange( thePrs->GetMin(), thePrs->GetMax(), - 0.0, 0.0, thePrs->isRangeFixed() ); + 0.0, 0.0, thePrs->IsRangeFixed() ); setScalarBarData( thePrs->GetNbColors(), thePrs->GetLabels() ); bool isScalarMode = (thePrs->GetField()->myNbComp > 1); myModeLbl->setEnabled(isScalarMode); @@ -451,19 +457,19 @@ void VisuGUI_ScalarBarDlg::storeToPrsObject(VISU::ScalarMap_i* thePrs) { thePrs->SetPosition(XSpin->value(), YSpin->value()); thePrs->SetSize(WidthSpin->value(), HeightSpin->value()); thePrs->SetOrientation((RBvert->isChecked())? VISU::ScalarMap::VERTICAL : VISU::ScalarMap::HORIZONTAL); - if (RBFrange->isChecked()) { - thePrs->CalculateRange(); - } else { - thePrs->SetRange(MinEdit->text().toDouble(), MaxEdit->text().toDouble()); - } if(isLogarithmic()) thePrs->SetScaling(VISU::LOGARITHMIC); else thePrs->SetScaling(VISU::LINEAR); + + if (RBFrange->isChecked()) { + thePrs->SetSourceRange(); + } else { + thePrs->SetRange(MinEdit->text().toDouble(), MaxEdit->text().toDouble()); + } thePrs->SetNbColors(ColorSpin->value()); thePrs->SetLabels(LabelSpin->value()); - thePrs->Update(); - + if (isToSave()) storeToResources(); } diff --git a/src/VISUGUI/VisuGUI_ScalarBarDlg.h b/src/VISUGUI/VisuGUI_ScalarBarDlg.h index a1706e82..7c2cf9bb 100644 --- a/src/VISUGUI/VisuGUI_ScalarBarDlg.h +++ b/src/VISUGUI/VisuGUI_ScalarBarDlg.h @@ -29,6 +29,8 @@ #ifndef VISUGUI_SCALARBARDLG_H #define VISUGUI_SCALARBARDLG_H +#include "QAD_SpinBoxDbl.h" + #include #include #include @@ -40,9 +42,9 @@ #include #include -#include "QAD_SpinBoxDbl.h" -#include "VISU_PrsObject_i.hh" - +namespace VISU{ + class ScalarMap_i; +} class VisuGUI_ScalarBarDlg : public QDialog { diff --git a/src/VISUGUI/VisuGUI_Selection.cxx b/src/VISUGUI/VisuGUI_Selection.cxx index ff359e22..4bd329a6 100644 --- a/src/VISUGUI/VisuGUI_Selection.cxx +++ b/src/VISUGUI/VisuGUI_Selection.cxx @@ -48,24 +48,6 @@ using namespace std; #include "VisuGUI_PointsResultsDlg.h" #include "VisuGUI_Selection.h" -int PickViewer(QAD_Study *theActiveStudy, int theSelectionMode){ - SALOME_Selection *aSel = SALOME_Selection::Selection(theActiveStudy->getSelection()); - SALOME_ListIteratorOfListIO It(aSel->StoredIObjects()); - for(;It.More(); It.Next()){ - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if (aSel->SelectionMode() == theSelectionMode ){ - if (aSel->HasIndex(IObject)) { - TColStd_MapOfInteger MapIndex ; - aSel->GetIndex(IObject, MapIndex) ; - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - for(;ite.More(); ite.Next()) - return ite.Key(); - } - } - } - return -1; -} - template void SetMessage(TData* theData, int theId, TDialog* theDialog){ // Scalar result QString Msg_1; @@ -90,12 +72,11 @@ template void SetMessage(TData* theData, int theId, // PICKING CELL // // ============================================================================================ // -void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet){ - int id = PickViewer(theActiveStudy,SelectionCell); - if(id >= 0){ +void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId){ + if(theId >= 0){ VisuGUI_CellsResultsDlg *aResultsDlg = new VisuGUI_CellsResultsDlg(QAD_Application::getDesktop(), 0, TRUE, 0); vtkCellData *aData = theDataSet->GetCellData(); - vtkCell *aCell = theDataSet->GetCell(id); + vtkCell *aCell = theDataSet->GetCell(theId); float aPntCoord[12][3]; int aNbOfPoints = aCell->GetNumberOfPoints(); @@ -115,9 +96,9 @@ void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDa QString::number( aPntCoord[i][2] )); } - SetMessage(aData,id,aResultsDlg); + SetMessage(aData,theId,aResultsDlg); - aResultsDlg->IdCell->setText( QString::number( id ) ); + aResultsDlg->IdCell->setText( QString::number( theId ) ); aResultsDlg->NbPoint->setText( QString::number( aNbOfPoints ) ); aResultsDlg->exec(); delete aResultsDlg; @@ -129,20 +110,19 @@ void VisuGUI_Selection::PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDa // PICKING POINT // // ============================================================================================ // -void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet){ - int id = PickViewer(theActiveStudy,SelectionPoint); - if(id >= 0){ +void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId){ + if(theId >= 0){ VisuGUI_PointsResultsDlg *aResultsDlg = new VisuGUI_PointsResultsDlg(QAD_Application::getDesktop(), 0, TRUE, 0); vtkPointData *aData = theDataSet->GetPointData(); float Coord[3]; - theDataSet->GetPoint(id,Coord); + theDataSet->GetPoint(theId,Coord); aResultsDlg->CoordX->setText( QString::number( Coord[0] ) ); aResultsDlg->CoordY->setText( QString::number( Coord[1] ) ); aResultsDlg->CoordZ->setText( QString::number( Coord[2] ) ); - aResultsDlg->IdPoint->setText( QString::number(id) ); + aResultsDlg->IdPoint->setText( QString::number(theId) ); - SetMessage(aData,id,aResultsDlg); + SetMessage(aData,theId,aResultsDlg); aResultsDlg->exec(); delete aResultsDlg; @@ -152,6 +132,6 @@ void VisuGUI_Selection::PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theD void VisuGUI_Selection::Highlight(QAD_Study *theActiveStudy, const Handle(SALOME_InteractiveObject)& theIO, int theId){ MESSAGE("HighlightCell"); SALOME_Selection *aSel = SALOME_Selection::Selection(theActiveStudy->getSelection()); - aSel->AddIObject( theIO, false ); - aSel->AddOrRemoveIndex( theIO, theId, false, true ); + aSel->AddIObject(theIO); + aSel->AddOrRemoveIndex(theIO, theId, false); } diff --git a/src/VISUGUI/VisuGUI_Selection.h b/src/VISUGUI/VisuGUI_Selection.h index 09e43574..0148a53b 100644 --- a/src/VISUGUI/VisuGUI_Selection.h +++ b/src/VISUGUI/VisuGUI_Selection.h @@ -41,8 +41,8 @@ #define SelectionActor 4 namespace VisuGUI_Selection{ - void PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet); - void PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet); + void PickingCell(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId); + void PickingPoint(QAD_Study *theActiveStudy, vtkDataSet *theDataSet, int theId); void Highlight(QAD_Study *theActiveStudy, const Handle(SALOME_InteractiveObject)& theIO, int theId); }; diff --git a/src/VISUGUI/VisuGUI_StreamLinesDlg.cxx b/src/VISUGUI/VisuGUI_StreamLinesDlg.cxx index 44e46939..50334711 100644 --- a/src/VISUGUI/VisuGUI_StreamLinesDlg.cxx +++ b/src/VISUGUI/VisuGUI_StreamLinesDlg.cxx @@ -9,16 +9,26 @@ // Module : VISU #include "VisuGUI_StreamLinesDlg.h" -#include -#include -#include -#include +#include "VISU_StreamLines_i.hh" +#include "VISU_Mesh_i.hh" +#include "VISU_Gen_i.hh" +#include "VISU_StreamLinesPL.hxx" +#include "VISU_Actor.h" + #include "QAD_Application.h" #include "QAD_Desktop.h" #include "QAD_Config.h" +#include "QAD_MessageBox.h" #include "VisuGUI.h" #include "SALOME_Selection.h" +#include "VTKViewer_ViewFrame.h" + +#include +#include +#include +#include +using namespace std; extern VisuGUI *visuGUI; @@ -39,11 +49,18 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg() aSrcLayout->setSpacing( 6 ); aSrcLayout->setMargin( 0 ); - myUseSrcChk = new QCheckBox(tr("Use source presentation"), aSourceBox); - aSrcLayout->addMultiCellWidget(myUseSrcChk, 0, 0, 0, 1); + QLabel* aTypeLbl = new QLabel( tr( "LBL_SOURCE_TYPE" ), aSourceBox); + aSrcLayout->addWidget(aTypeLbl, 0, 0); + + myUseSrcCombo = new QComboBox(aSourceBox); + const char* aChoise[] = { "None", "Entity", "Family", "Group", "Presentation", 0 }; + myUseSrcCombo->insertStrList(aChoise); + aSrcLayout->addWidget(myUseSrcCombo, 0, 1); mySrcCombo = new QComboBox(aSourceBox); - mySrcCombo->setEnabled(myUseSrcChk->isChecked()); + mySrcCombo->setEnabled((myUseSrcCombo->currentItem() == 0)); + + connect(myUseSrcCombo, SIGNAL(activated(int)), this, SLOT(onSourceTypeChange(int))); // Find All prs obj QAD_Study* aActiveStudy = VisuGUI::GetActiveStudy(); @@ -52,21 +69,67 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg() Handle(SALOME_InteractiveObject) aIO = aSel->firstIObject(); if (aIO->hasEntry()){ SALOMEDS::SObject_var aSObject = VisuGUI::GetStudyDocument()->FindObjectID(aIO->getEntry()); - SALOMEDS::SComponent_var aComp = aSObject->GetFatherComponent(); - SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( aComp ); + aSObject = aSObject->GetFather(); + aSObject = aSObject->GetFather(); + aSObject = aSObject->GetFather(); + aSObject = aSObject->GetFather(); + mySelectionObj = aSObject; + CORBA::Object_var anObject = VISU::SObjectToObject(mySelectionObj); + VISU::Result_var aResult; + if (CORBA::is_nil(anObject)) { + mySelectionObj = mySelectionObj->GetFather(); + } + SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( mySelectionObj ); for (aIter->InitEx(true); aIter->More(); aIter->Next() ) { SALOMEDS::SObject_var aChildSObj = aIter->Value(); CORBA::Object_var aChildObject = VISU::SObjectToObject( aChildSObj ); + if(!CORBA::is_nil( aChildObject ) ) { VISU::Prs3d_var aPrsObj = VISU::Prs3d::_narrow( aChildObject ); - if( !CORBA::is_nil( aPrsObj ) ) { - if (aPrsObj->GetType() != VISU::TSTREAMLINES) { + if( !CORBA::is_nil( aPrsObj ) ) { // if this is a Prs object + if ((aPrsObj->GetType() != VISU::TSTREAMLINES) && + (aPrsObj->GetType() != VISU::TMESH)) { SALOMEDS::GenericAttribute_var anAttr; if ( aChildSObj->FindAttribute(anAttr, "AttributeName") ) { SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); - mySrcCombo->insertItem(QString(aName->Value())); + myPrsLst += QString(aName->Value()); myPrsList.append(aPrsObj); + continue; + } + } + } + } + // else { // This is not a Prs object + SALOMEDS::GenericAttribute_var anAttr; + if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) { + SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); + string aComm = aComment->Value(); + QString strIn(aComm.c_str()); + VISU::Storable::TRestoringMap aMap; + VISU::Storable::StrToMap(strIn,aMap); + bool isExist; + VISU::VISUType aType = (VISU::VISUType)VISU::Storable::FindValue(aMap,"myType",&isExist).toInt(); + if (isExist) { + if ((aType == VISU::TFAMILY) || (aType == VISU::TGROUP) || (aType == VISU::TENTITY)) { + SALOMEDS::GenericAttribute_var aNameAttr; + if ( aChildSObj->FindAttribute(aNameAttr, "AttributeName") ) { + SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(aNameAttr); + VISU::Prs3d_var aPrsObj = VISU::Prs3d::_narrow( aChildObject ); + switch(aType) { + case VISU::TFAMILY: + myFamilisLst += QString(aName->Value()); + myFamilyList.append(aPrsObj); + break; + case VISU::TGROUP: + myGroupsLst += QString(aName->Value()); + myGroupList.append(aPrsObj); + break; + case VISU::TENTITY: + myEntitiesLst += QString(aName->Value()); + myEntityList.append(aPrsObj); + break; + } } } } @@ -74,8 +137,7 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg() } } } - - connect(myUseSrcChk, SIGNAL(toggled(bool)), mySrcCombo, SLOT(setEnabled(bool))); + // connect(myUseSrcChk, SIGNAL(toggled(bool)), mySrcCombo, SLOT(setEnabled(bool))); aSrcLayout->addMultiCellWidget(mySrcCombo, 1, 1, 0, 1); QLabel* aPercentLbl = new QLabel( tr( "Used points (0..1)" ), aSourceBox); @@ -92,19 +154,20 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg() myStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1); myStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); TopLayout->addWidget(myStepLen, 1, 1); + connect(myStepLen, SIGNAL(valueChanged(double)), this, SLOT(StepLengthChanged(double))); QLabel* aIntegStepLenLbl = new QLabel( tr( "Integration Step" ), this); TopLayout->addWidget(aIntegStepLenLbl, 2, 0); myIntegStepLen = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 0.1); myIntegStepLen->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); TopLayout->addWidget(myIntegStepLen, 2, 1); + connect(myIntegStepLen, SIGNAL(valueChanged(double)), this, SLOT(IntegrationStepChanged(double))); QLabel* aPropagationLbl = new QLabel( tr( "Propagation Time" ), this); TopLayout->addWidget(aPropagationLbl, 3, 0); myPropTime = new QAD_SpinBoxDbl( this, DBL_MIN, DBL_MAX, 1); myPropTime->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); TopLayout->addWidget(myPropTime, 3, 1); - connect(myPropTime, SIGNAL(valueChanged(double)), this, SLOT(PropagationTimeChanged(double))); QLabel* aDirLbl = new QLabel( tr( "Direction" ), this); @@ -151,9 +214,15 @@ VisuGUI_StreamLinesDlg::VisuGUI_StreamLinesDlg() void VisuGUI_StreamLinesDlg::initFromPrsObject(VISU::StreamLines_i* thePrs) { + myPropTime->setValue(thePrs->GetPropagationTime()); + + myStepLen->setRange(VISU_StreamLinesPL::GetMinStepLength(thePrs->GetIntegrationStep()), + VISU_StreamLinesPL::GetMaxStepLength(thePrs->GetPropagationTime())); myStepLen->setValue(thePrs->GetStepLength()); + + myIntegStepLen->setRange(thePrs->GetMinIntegrationStep(),thePrs->GetMaxIntegrationStep()); myIntegStepLen->setValue(thePrs->GetIntegrationStep()); - myPropTime->setValue(thePrs->GetPropagationTime()); + switch (thePrs->GetDirection()) { case VISU::StreamLines::FORWARD: myDirCombo->setCurrentItem(0); @@ -164,39 +233,48 @@ void VisuGUI_StreamLinesDlg::initFromPrsObject(VISU::StreamLines_i* thePrs) { case VISU::StreamLines::BOTH: myDirCombo->setCurrentItem(2); } - myUseScalar->setChecked(thePrs->isColored()); + myUseScalar->setChecked(thePrs->IsColored()); myPntPercent->setValue(thePrs->GetUsedPoints()); - - myUseSrcChk->setChecked(false); + + mySrcCombo->setEnabled(false); QString aSrcEntry = thePrs->GetSourceEntry(); - if (!aSrcEntry.isEmpty()) { - for (int i = 0; i < myPrsList.count(); i++) { - VISU::Prs3d_i* aPrs = dynamic_cast(VISU::GetServant(myPrsList[i])); - if (aSrcEntry == aPrs->GetEntry()) { - myUseSrcChk->setChecked(true); - mySrcCombo->setCurrentItem(i); - break; - } - } - } - + SALOMEDS::Color anOldColor = thePrs->GetColor(); QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); setColor(aColor); enableSetColor(); + +#define INITPRS(PRSLIST, PRSNUM) \ + for (int i = 0; i < PRSLIST.count(); i++) { \ + VISU::Prs3d_i* aPrs = dynamic_cast(VISU::GetServant(PRSLIST[i])); \ + if (aPrs == NULL) continue; \ + if (aSrcEntry == aPrs->GetEntry()) { \ + onSourceTypeChange(PRSNUM); \ + myUseSrcCombo->setCurrentItem(PRSNUM); \ + mySrcCombo->setEnabled(true); \ + mySrcCombo->setCurrentItem(i); \ + return; \ + } \ + } + + if (!aSrcEntry.isEmpty()) { + INITPRS(myEntityList, 1); + INITPRS(myFamilyList, 2); + INITPRS(myGroupList, 3); + INITPRS(myPrsList, 4); + } + +#undef INITPRS - myIntegStepLen->setMaxValue(thePrs->GetMaxIntegrationStep()); - myIntegStepLen->setMinValue(thePrs->GetMinIntegrationStep()); - myStepLen->setMaxValue(myPropTime->value()); - myStepLen->setMinValue(myPropTime->value()/10000.); } void VisuGUI_StreamLinesDlg::storeToPrsObject(VISU::StreamLines_i* thePrs) { - thePrs->SetStepLength(myStepLen->value()); + //Order of setting of the values are important thePrs->SetIntegrationStep(myIntegStepLen->value()); thePrs->SetPropagationTime(myPropTime->value()); + thePrs->SetStepLength(myStepLen->value()); switch (myDirCombo->currentItem()) { case 0: thePrs->SetDirection(VISU::StreamLines::FORWARD); @@ -207,19 +285,51 @@ void VisuGUI_StreamLinesDlg::storeToPrsObject(VISU::StreamLines_i* thePrs) { case 2: thePrs->SetDirection(VISU::StreamLines::BOTH); } - thePrs->setColored(myUseScalar->isChecked()); - if(!thePrs->isColored()){ + thePrs->ShowColored(myUseScalar->isChecked()); + if(!thePrs->IsColored()){ SALOMEDS::Color aColor; aColor.R = myColor.red()/255.; aColor.G = myColor.green()/255.; aColor.B = myColor.blue()/255.; thePrs->SetColor(aColor); } - if (myUseSrcChk->isChecked() && (myPrsList.count() > 0)) { - thePrs->SetSource(myPrsList[mySrcCombo->currentItem()]); - } else - thePrs->SetSource(VISU::Prs3d::_nil()); thePrs->SetUsedPoints(myPntPercent->value()); + + int aSrcSelection = myUseSrcCombo->currentItem(); + int aSrcItem = (mySrcCombo->count() > 0)? mySrcCombo->currentItem() : -1; + if ((aSrcSelection > 0) && (aSrcItem > -1)) { + VISU::Prs3d_var aPrs; + VISU::VISUType aType; + QString aName; + switch (aSrcSelection){ + case 1: // Entity + aPrs = myEntityList[aSrcItem]; + aType = VISU::TENTITY; + aName = myEntitiesLst[aSrcItem]; + break; + case 2: // Family + aPrs = myFamilyList[aSrcItem]; + aType = VISU::TFAMILY; + aName = myFamilisLst[aSrcItem]; + break; + case 3: // Group + aPrs = myGroupList[aSrcItem]; + aType = VISU::TGROUP; + aName = myGroupsLst[aSrcItem]; + break; + case 4: // Presentation + aPrs = myPrsList[aSrcItem]; + break; + } + if (!CORBA::is_nil( aPrs )) { + thePrs->SetSource(aPrs); + } else if (aSrcSelection == 4) { + thePrs->SetSource(VISU::Prs3d::_nil()); + } else { // Create Mesh presentation + thePrs->SetSource(createMesh(aType, aName)); + } + } else + thePrs->SetSource(VISU::Prs3d::_nil()); } /*! @@ -260,8 +370,121 @@ void VisuGUI_StreamLinesDlg::enableSetColor() SelColor->setEnabled(!myUseScalar->isChecked() ); } +void VisuGUI_StreamLinesDlg::StepLengthChanged(double theValue){ +} + +void VisuGUI_StreamLinesDlg::IntegrationStepChanged(double theValue) { + PropagationTimeChanged(myPropTime->value()); +} + void VisuGUI_StreamLinesDlg::PropagationTimeChanged(double theValue) { - myStepLen->setMaxValue(theValue); - myStepLen->setMinValue(theValue/1000000.); + myStepLen->setMinValue(VISU_StreamLinesPL::GetMinStepLength(myIntegStepLen->value())); + myStepLen->setMaxValue(VISU_StreamLinesPL::GetMaxStepLength(myPropTime->value())); +} + +void VisuGUI_StreamLinesDlg::onSourceTypeChange(int theIndex) { + mySrcCombo->clear(); + if (theIndex == 0) { + mySrcCombo->setEnabled(false); + return; + } else + mySrcCombo->setEnabled(true); + + switch(theIndex) { + case 1: // Entity + mySrcCombo->insertStringList(myEntitiesLst); + return; + case 2: // Family + mySrcCombo->insertStringList(myFamilisLst); + return; + case 3: // Group + mySrcCombo->insertStringList(myGroupsLst); + return; + case 4: // Presentation + mySrcCombo->insertStringList(myPrsLst); + return; + } } + +VISU::Mesh_var VisuGUI_StreamLinesDlg::createMesh(VISU::VISUType theType, QString theName) { + CORBA::Object_var anObject = VISU::SObjectToObject(mySelectionObj); + VISU::Result_var aResult; + if (!CORBA::is_nil(anObject)) { + aResult = VISU::Result::_narrow(anObject); + } + if(CORBA::is_nil(aResult)) { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("WRN_NO_AVAILABLE_DATA"), + tr ("VISU_BUT_OK")); + return VISU::Mesh::_nil(); + } + SALOMEDS::ChildIterator_var aIter = VisuGUI::GetStudyDocument()->NewChildIterator( mySelectionObj ); + VISU::Storable::TRestoringMap aMap; + + for (aIter->InitEx(true); aIter->More(); aIter->Next() ) { + SALOMEDS::SObject_var aChildSObj = aIter->Value(); + SALOMEDS::GenericAttribute_var anAttr; + if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) { + SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr); + CORBA::String_var aComm = aComment->Value(); + QString strIn(aComm.in()); + aMap.clear(); + VISU::Storable::StrToMap(strIn,aMap); + bool isExist; + VISU::VISUType aType = (VISU::VISUType)VISU::Storable::FindValue(aMap,"myType",&isExist).toInt(); + if (isExist) { + if (aType != theType) continue; + + SALOMEDS::GenericAttribute_var aNameAttr; + if ( aChildSObj->FindAttribute(aNameAttr, "AttributeName") ) { + SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(aNameAttr); + if (QString(aName->Value()) == theName) break; //use current map + } + } + } + } + CORBA::Object_var aMesh; + QString aMeshName = VISU::Storable::FindValue(aMap,"myMeshName"); + switch (theType) { + case VISU::TFAMILY: + { + VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myEntityId").toInt(); + aMesh = VisuGUI::GetVisuGen()->FamilyMeshOnEntity(aResult,aMeshName.latin1(),anEntity,theName.latin1()); + } + break; + case VISU::TGROUP: + { + aMesh = VisuGUI::GetVisuGen()->GroupMesh(aResult,aMeshName.latin1(), theName.latin1()); + } + break; + case VISU::TENTITY: + { + VISU::Entity anEntity = (VISU::Entity)VISU::Storable::FindValue(aMap,"myId").toInt(); + aMesh = VisuGUI::GetVisuGen()->MeshOnEntity(aResult,aMeshName.latin1(),anEntity); + } + break; + } + VISU::Mesh_i* pPresent = NULL; + if(!CORBA::is_nil(aMesh)) + pPresent = dynamic_cast(VISU::GetServant(aMesh)); + if (pPresent == NULL) { + QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("ERR_CANT_BUILD_PRESENTATION"), + tr ("VISU_BUT_OK") ); + return VISU::Mesh::_nil(); + } + // Create Actor + if(VTKViewer_ViewFrame* vf = visuGUI->GetVtkViewFrame()){ + try{ + pPresent->SetPresentationType(VISU::POINT); + VISU_Actor *anActor = pPresent->CreateActor(); + vf->AddActor(anActor); + }catch(std::runtime_error& exc){ + QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("VISU_WARNING"), + tr ("ERR_CANT_CREATE_ACTOR"), + tr ("VISU_BUT_OK") ); + } + } + return pPresent->_this(); +} diff --git a/src/VISUGUI/VisuGUI_StreamLinesDlg.h b/src/VISUGUI/VisuGUI_StreamLinesDlg.h index 1e1d9788..0b9c78b6 100644 --- a/src/VISUGUI/VisuGUI_StreamLinesDlg.h +++ b/src/VISUGUI/VisuGUI_StreamLinesDlg.h @@ -11,12 +11,19 @@ #ifndef VISUGUI_STREAMLINESDLG_H #define VISUGUI_STREAMLINESDLG_H +#include "QAD_SpinBoxDbl.h" + #include #include #include -#include "QAD_SpinBoxDbl.h" -#include "VISU_PrsObject_i.hh" +#include +#include "SALOMEconfig.h" +#include CORBA_CLIENT_HEADER(VISU_Gen) + +namespace VISU{ + class StreamLines_i; +} class VisuGUI_StreamLinesDlg: public QDialog { @@ -32,9 +39,14 @@ public: private slots: void onSelectionActive(bool theActive); + void StepLengthChanged(double theValue); + void IntegrationStepChanged(double theValue); void PropagationTimeChanged(double theValue); + void onSourceTypeChange(int theIndex); private: + VISU::Mesh_var createMesh(VISU::VISUType theType, QString theName); + QAD_SpinBoxDbl* myStepLen; QAD_SpinBoxDbl* myIntegStepLen; QAD_SpinBoxDbl* myPropTime; @@ -42,10 +54,19 @@ private: QCheckBox* myUseScalar; QPushButton* SelColor; QColor myColor; - QCheckBox* myUseSrcChk; + //QCheckBox* myUseSrcChk; + QComboBox* myUseSrcCombo; QAD_SpinBoxDbl* myPntPercent; QComboBox* mySrcCombo; QValueList myPrsList; + QValueList myEntityList; + QValueList myFamilyList; + QValueList myGroupList; + QStringList myEntitiesLst; + QStringList myFamilisLst; + QStringList myGroupsLst; + QStringList myPrsLst; + SALOMEDS::SObject_var mySelectionObj; private slots: void setVColor(); diff --git a/src/VISUGUI/VisuGUI_TimeAnimation.cxx b/src/VISUGUI/VisuGUI_TimeAnimation.cxx index 2c971c41..3d1f175d 100644 --- a/src/VISUGUI/VisuGUI_TimeAnimation.cxx +++ b/src/VISUGUI/VisuGUI_TimeAnimation.cxx @@ -35,8 +35,15 @@ #include "VisuGUI_StreamLinesDlg.h" #include "VISU_TimeAnimation.h" -static double MAXVALUE = 1.0E+300; +#include "VISU_ScalarMap_i.hh" +#include "VISU_IsoSurfaces_i.hh" +#include "VISU_DeformedShape_i.hh" +#include "VISU_CutPlanes_i.hh" +#include "VISU_CutLines_i.hh" +#include "VISU_Vectors_i.hh" +#include "VISU_StreamLines_i.hh" +static double MAXVALUE = 1.0E+300; SetupDlg::SetupDlg(QWidget* theParent, VISU_TimeAnimation* theAnimator) @@ -632,6 +639,12 @@ void VisuGUI_TimeAnimationDlg::createFrames() { if (myAnimator->getFieldData(i).myPrs == 0) myAnimator->generatePresentations(i); } + if (myAnimator->getNbFrames() == 0) { + myPlayFrame->setEnabled(false); + QApplication::restoreOverrideCursor(); + QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_NO_ANIMATIONDATA")); + return; + } mySlider->setMaxValue(myAnimator->getNbFrames()-1); myPlayFrame->setEnabled(true); if (!myAnimator->generateFrames()) { @@ -648,7 +661,7 @@ void VisuGUI_TimeAnimationDlg::createFrames() { //************************************************************************ void VisuGUI_TimeAnimationDlg::onPlayPressed() { - if (myPlayBtn->isOn()) { + if (myPlayBtn->isOn() && (!myAnimator->running())) { myPlayBtn->setIconSet(MYpausePixmap); if (mySaveCheck->isChecked()) myAnimator->dumpTo(myPathEdit->text()); diff --git a/src/VISUGUI/VisuGUI_TimeAnimation.h b/src/VISUGUI/VisuGUI_TimeAnimation.h index 9ae881e7..35f0d625 100644 --- a/src/VISUGUI/VisuGUI_TimeAnimation.h +++ b/src/VISUGUI/VisuGUI_TimeAnimation.h @@ -19,8 +19,12 @@ #include "VisuGUI_ScalarBarDlg.h" -class VISU_TimeAnimation; +#include "SALOMEconfig.h" +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include CORBA_CLIENT_HEADER(VISU_Gen) +class VISU_TimeAnimation; /** * Auxilliary class for presentations definition diff --git a/src/VISUGUI/VisuGUI_VectorsDlg.cxx b/src/VISUGUI/VisuGUI_VectorsDlg.cxx index 174ee491..2e471d3f 100644 --- a/src/VISUGUI/VisuGUI_VectorsDlg.cxx +++ b/src/VISUGUI/VisuGUI_VectorsDlg.cxx @@ -26,13 +26,17 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_VectorsDlg.h" -#include -#include +#include "VISU_Vectors_i.hh" + #include "QAD_Application.h" #include "QAD_Desktop.h" +#include +#include + +using namespace std; + /*! Constructor */ @@ -178,7 +182,7 @@ VisuGUI_VectorsDlg::~VisuGUI_VectorsDlg() void VisuGUI_VectorsDlg::initFromPrsObject(VISU::Vectors_i* thePrs) { setScaleFactor(thePrs->GetScale()); setLineWidth((int)thePrs->GetLineWidth()); - setUseMagnColor(thePrs->isColored()); + setUseMagnColor(thePrs->IsColored()); SALOMEDS::Color anOldColor = thePrs->GetColor(); QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); setColor(aColor); @@ -197,8 +201,8 @@ void VisuGUI_VectorsDlg::initFromPrsObject(VISU::Vectors_i* thePrs) { void VisuGUI_VectorsDlg::storeToPrsObject(VISU::Vectors_i* thePrs) { thePrs->SetScale(getScaleFactor()); thePrs->SetLineWidth(getLineWidth()); - thePrs->setColored(getUseMagnColor()); - if(!thePrs->isColored()){ + thePrs->ShowColored(getUseMagnColor()); + if(!thePrs->IsColored()){ SALOMEDS::Color aColor; aColor.R = myColor.red()/255.; aColor.G = myColor.green()/255.; diff --git a/src/VISUGUI/VisuGUI_VectorsDlg.h b/src/VISUGUI/VisuGUI_VectorsDlg.h index 68f560f8..d66af017 100644 --- a/src/VISUGUI/VisuGUI_VectorsDlg.h +++ b/src/VISUGUI/VisuGUI_VectorsDlg.h @@ -29,6 +29,8 @@ #ifndef VISUGUI_VECTORSDLG_H #define VISUGUI_VECTORSDLG_H +#include "QAD_SpinBoxDbl.h" + #include #include #include @@ -37,9 +39,12 @@ #include #include #include -#include "QAD_SpinBoxDbl.h" -#include "VISU_PrsObject_i.hh" +#include "SALOMEconfig.h" +#include CORBA_CLIENT_HEADER(VISU_Gen) +namespace VISU{ + class Vectors_i; +} class VisuGUI_VectorsDlg : public QDialog { diff --git a/src/VISUGUI/VisuGUI_VisuAsDlg.cxx b/src/VISUGUI/VisuGUI_VisuAsDlg.cxx index 3de24794..9b0341c4 100644 --- a/src/VISUGUI/VisuGUI_VisuAsDlg.cxx +++ b/src/VISUGUI/VisuGUI_VisuAsDlg.cxx @@ -26,15 +26,20 @@ // Module : VISU // $Header$ -using namespace std; #include "VisuGUI_VisuAsDlg.h" -#include "VISU_PrsObject_i.hh" + +#include "VISU_Actor.h" +#include "VISU_Prs3d_i.hh" + #include "QAD_Application.h" #include "QAD_Desktop.h" #include "QAD_RightFrame.h" #include "VTKViewer_ViewFrame.h" + #include +using namespace std; + /*! Constructor */ @@ -175,7 +180,7 @@ void VisuGUI_VisuAsDlg::RefreshListActors( const QString &VAType ) */ bool VisuGUI_VisuAsDlg::ActorTypeIsValid( VISU_Actor* Actor, int test ) { - VISU::Prs3d_i* aPrs3d = Actor->getPrs3d(); + VISU::Prs3d_i* aPrs3d = Actor->GetPrs3d(); if(!aPrs3d) return false; if(test == -1) { switch(aPrs3d->GetType()){ diff --git a/src/VISUGUI/VisuGUI_VisuAsDlg.h b/src/VISUGUI/VisuGUI_VisuAsDlg.h index 62fa0ff7..d166aace 100644 --- a/src/VISUGUI/VisuGUI_VisuAsDlg.h +++ b/src/VISUGUI/VisuGUI_VisuAsDlg.h @@ -29,8 +29,6 @@ #ifndef VISUGUI_VISUASDLG_H #define VISUGUI_VISUASDLG_H -#include "VISU_Actor.h" - #include #include #include @@ -38,6 +36,8 @@ #include #include +class VISU_Actor; + class VisuGUI_VisuAsDlg : public QDialog { Q_OBJECT diff --git a/src/VISU_I/Makefile.in b/src/VISU_I/Makefile.in index 3be2f51f..823e58c5 100644 --- a/src/VISU_I/Makefile.in +++ b/src/VISU_I/Makefile.in @@ -17,12 +17,13 @@ VPATH=.:@srcdir@:@top_srcdir@/idl # Libraries targets LIB = libVISUEngine.la -LIB_SRC = VISU_Gen_i.cc VISU_Result_i.cc \ - VISU_PrsObject_i.cc VISU_ViewManager_i.cc VISU_Table_i.cc \ - VISU_Extractor.cxx VISU_FieldTransform.cxx \ - VISU_Convertor.cxx VISU_MedConvertor.cxx VISU_DatConvertor.cxx \ - VISU_Convertor_impl.cxx VISU_CorbaMedConvertor.cxx \ - VISU_TimeAnimation.cxx +LIB_SRC = VISUConfig.cc VISU_Gen_i.cc VISU_Result_i.cc \ + VISU_ViewManager_i.cc VISU_PrsObject_i.cc VISU_Table_i.cc \ + VISU_Prs3d_i.cc VISU_Mesh_i.cc VISU_ScalarMap_i.cc \ + VISU_IsoSurfaces_i.cc VISU_DeformedShape_i.cc \ + VISU_CutPlanes_i.cc VISU_CutLines_i.cc \ + VISU_Vectors_i.cc VISU_StreamLines_i.cc \ + VISU_TimeAnimation.cxx VISU_CorbaMedConvertor.cxx LIB_MOC = VISU_TimeAnimation.h @@ -30,33 +31,34 @@ LIB_SERVER_IDL = VISU_Gen.idl SALOME_Component.idl SALOME_Exception.idl SALOME_S LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl # Executables targets -BIN = VISU_Convertor -BIN_SRC = VISU_Convertor_impl.cxx VISU_MedConvertor.cxx +BIN = +BIN_SRC = BIN_CLIENT_IDL = BIN_SERVER_IDL = EXPORT_HEADERS = VISUConfig.hh VISU_Gen_i.hh VISU_Result_i.hh \ VISU_PrsObject_i.hh VISU_ViewManager_i.hh VISU_Table_i.hh \ - VISU_Extractor.hxx VISU_FieldTransform.hxx VISU_Convertor.hxx \ + VISU_Prs3d_i.hh VISU_Mesh_i.hh VISU_ScalarMap_i.hh \ + VISU_IsoSurfaces_i.hh VISU_DeformedShape_i.hh \ + VISU_CutPlanes_i.hh VISU_CutLines_i.hh \ + VISU_Vectors_i.hh VISU_StreamLines_i.hh \ VISU_TimeAnimation.h + # additionnal information to compil and link file CPPFLAGS += -ftemplate-depth-32 $(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) \ $(MED2_INCLUDES) $(HDF5_INCLUDES) $(QWT_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += $(QT_MT_LIBS) $(VTK_LIBS) $(QWT_LIBS) -lSalomeNS -lSalomeDS -lTOOLSDS -lSalomeHDFPersist \ - -lSalomeContainer -lOpUtil -lSalomeGUI -lVTKViewer -lVisuObject \ +LDFLAGS += $(QT_MT_LIBS) $(VTK_LIBS) $(QWT_LIBS) -lSalomeNS -lTOOLSDS -lSalomeHDFPersist \ + -lSalomeContainer -lOpUtil -lSalomeGUI -lVTKViewer \ + -lVisuConvertor -lVisuPipeLine -lVisuObject \ -L${KERNEL_ROOT_DIR}/lib/salome LIBS+= $(PYTHON_LIBS) $(MED2_LIBS) $(HDF5_LIBS) -lPlot2d -lSalomeHDFPersist -lSalomeLoggerServer -lRegistry -lqsplitterP -lSalomeLifeCycleCORBA -lSalomeObject -lSalomeNotification -L${KERNEL_ROOT_DIR}/lib/salome - # additional file to be cleaned MOSTLYCLEAN = CLEAN = DISTCLEAN = @CONCLUDE@ - - - diff --git a/src/VISU_I/VISUConfig.hh b/src/VISU_I/VISUConfig.hh index 3b5dcd8d..68f5d16c 100644 --- a/src/VISU_I/VISUConfig.hh +++ b/src/VISU_I/VISUConfig.hh @@ -1,8 +1,26 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // -// File : VISU_Common.hh +// File : VISUConfig.hh // Author : Alexey PETROV // Module : VISU @@ -18,10 +36,8 @@ #include #include -using namespace std; - // IDL headers -#include +#include "SALOMEconfig.h" #include CORBA_SERVER_HEADER(VISU_Gen) #include CORBA_SERVER_HEADER(MED) #include CORBA_SERVER_HEADER(SALOMEDS) @@ -37,6 +53,7 @@ using namespace std; namespace VISU{ //=========================================================================== class VISU_Gen_i; + class Base_i : public virtual POA_VISU::Base, public virtual PortableServer::RefCountServantBase { @@ -57,8 +74,9 @@ namespace VISU{ static SALOME_NamingService* GetNS() { return myNamingService;} static SALOME_LifeCycleCORBA* GetLCC() { return myEnginesLifeCycle;} static VISU_Gen_i* GetVisuGenImpl() { return myVisuGenImpl;} - static VISU_Gen_var GetVisuGenInter(); }; + + //=========================================================================== class Mutex{ QMutex* myMutex; @@ -68,22 +86,24 @@ namespace VISU{ Mutex(QMutex* theMutex, QApplication* theQApp, int theDelay = 0); ~Mutex(); }; + + //=========================================================================== class Storable : public virtual Base_i { protected: virtual void ToStream(std::ostringstream& theStr) = 0; public: - string ToString(); + std::string ToString(); virtual const char* GetComment() const = 0; - typedef map TRestoringMap; + typedef std::map TRestoringMap; typedef Storable* (*TStorableEngine)(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const TRestoringMap& theMap); - typedef map TCallbackMap; + const std::string& thePrefix, const TRestoringMap& theMap); + typedef std::map TCallbackMap; static void Registry(const char* theComment, TStorableEngine theEngine) throw(std::logic_error&); - static Storable* Create(SALOMEDS::SObject_ptr, const string& thePrefix, const string& theString) + static Storable* Create(SALOMEDS::SObject_ptr, const std::string& thePrefix, const std::string& theString) throw(std::runtime_error&); - static const QString& FindValue(const TRestoringMap& theMap, const string& theArg, bool* isFind = NULL) + static const QString& FindValue(const TRestoringMap& theMap, const std::string& theArg, bool* isFind = NULL) throw(std::logic_error&); static void StrToMap(const QString& theStr, VISU::Storable::TRestoringMap& theMap); static SALOMEDS::SObject_ptr GetResultSO(SALOMEDS::SObject_ptr theSObject); @@ -91,18 +111,25 @@ namespace VISU{ static void DataToStream(std::ostringstream& theStr, const QString& theName, const int theVal); static void DataToStream(std::ostringstream& theStr, const QString& theName, const double theVal); }; + + //=========================================================================== const CORBA::Boolean IsMultifile(); + QString GenerateName(const string& theFmt, int theId); + PortableServer::Servant GetServant(CORBA::Object_ptr theObject); CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject); + SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument); - string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, - const char* theFatherEntry, const char* theRefFatherEntry, - const char* theIOR, const char* theName, - const char* thePersistentRef, const char* theComment, - CORBA::Boolean theCreateNew = true); - string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry, - const char* theComment, int IsAllLevels = true); + + std::string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, + const char* theFatherEntry, const char* theRefFatherEntry, + const char* theIOR, const char* theName, + const char* thePersistentRef, const char* theComment, + CORBA::Boolean theCreateNew = true); + + std::string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry, + const char* theComment, int IsAllLevels = true); } #endif diff --git a/src/VISU_I/VISU_CorbaMedConvertor.cxx b/src/VISU_I/VISU_CorbaMedConvertor.cxx index 1b879710..09a46503 100644 --- a/src/VISU_I/VISU_CorbaMedConvertor.cxx +++ b/src/VISU_I/VISU_CorbaMedConvertor.cxx @@ -1,20 +1,43 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // // File : VISU_CorbaMedConvertor.cxx // Author : Alexey PETROV // Module : VISU +// $Header$ +// Copyright (C) 2003 CEA/DEN, EDF R&D -using namespace std; #include "VISU_CorbaMedConvertor.hxx" -using namespace VISU; + #include #include +using namespace VISU; +using namespace std; + #define USER_INTERLACE MED_FULL_INTERLACE -#ifdef DEBUG +#ifdef _DEBUG_ static int MYDEBUG = 0; #else static int MYDEBUG = 0; @@ -58,8 +81,8 @@ static int CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = { SALOME_MED::MED_TETRA4, SALOME_MED::MED_PYRA5, SALOME_MED::MED_PENTA6, - SALOME_MED::MED_TETRA10, SALOME_MED::MED_HEXA8, + SALOME_MED::MED_TETRA10, SALOME_MED::MED_PYRA13, SALOME_MED::MED_PENTA15, SALOME_MED::MED_HEXA20 @@ -129,8 +152,8 @@ static SalomeMed2vtk salome_med2vtk[SALOME_MED::MED_ALL_ELEMENTS] = { CORBAMED2VTK(MED_TETRA4,VTK_TETRA,4), CORBAMED2VTK(MED_PYRA5,VTK_PYRAMID,5), CORBAMED2VTK(MED_PENTA6,VTK_WEDGE,6), - CORBAMED2VTK(MED_TETRA10,VTK_TETRA,4), CORBAMED2VTK(MED_HEXA8,VTK_HEXAHEDRON,8), + CORBAMED2VTK(MED_TETRA10,VTK_TETRA,4), CORBAMED2VTK(MED_PYRA13,VTK_PYRAMID,5), CORBAMED2VTK(MED_PENTA15,VTK_WEDGE,6), CORBAMED2VTK(MED_HEXA20,VTK_HEXAHEDRON,8) @@ -153,6 +176,74 @@ string GetName(SALOMEDS::SObject_ptr aSObject){ return ""; } + +static void GetCellsSize(vtkIdType& theNbCells, vtkIdType& theCellsSize, + SALOME_MED::MESH_ptr theMEDMesh, + const VISU::TEntity& theEntity) +{ + int iGeomElemEnd; + int* aGeomElemVector; + GetEntity2Geom(theEntity,aGeomElemVector,&iGeomElemEnd); + theNbCells = theCellsSize = 0; + const SALOME_MED::medEntityMesh& aMedEntity = aVisu2MedEntity[theEntity]; + if(MYDEBUG) MESSAGE("GetCellsSize - theEntity = "<getNumberOfElements(aMedEntity,aMedType); + if(iNumElemEnd > 0){ + if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<getTypes(); + med_int iGeomElemEnd = aGeom->length(); + theNbCells = theCellsSize = 0; + if(MYDEBUG) MESSAGE("GetCellsSize - iGeomElemEnd = "<getNumber(aGeomType); + int medId = GetIdMEDType(aGeomType); + med_int iNumElemEnd = aCellNumForType->length(); + if(iNumElemEnd > 0){ + if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<getNumberOfNodes(); + aMeshOnEntity.myNbCells = theMesh.myNbPoints; + aMeshOnEntity.myCellsSize = 2*theMesh.myNbPoints; + vtkIdType aNbCells, aCellsSize; + GetCellsSize(aNbCells,aCellsSize,theMEDMesh,VISU::CELL_ENTITY); + if(aNbCells > 0){ + VISU::TMeshOnEntity& aMeshOnCells = theMesh.myMeshOnEntityMap[VISU::CELL_ENTITY]; + aMeshOnCells.myEntity = VISU::CELL_ENTITY; + aMeshOnCells.myMeshName = theMesh.myName; + aMeshOnCells.myNbCells = aNbCells; + aMeshOnCells.myCellsSize = aCellsSize; + } + }else + GetCellsSize(aMeshOnEntity.myNbCells,aMeshOnEntity.myCellsSize,theMEDMesh,theEntity); +} + + VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){ if(myField->_is_nil()) throw std::runtime_error("VISU_MEDFieldConvertor::Build >> myField->_is_nil() !!!"); @@ -180,11 +271,9 @@ VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){ aMeshOnEntity.myMeshName = aMeshName.in(); VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity]; aMeshOnEntity2.mySupport = aMEDSupport; - if(anEntity == VISU::NODE_ENTITY){ - aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myEntity = VISU::CELL_ENTITY; - aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myMeshName = aMeshName.in(); + if(anEntity == VISU::NODE_ENTITY) aMesh2.myMeshOnEntityMap[VISU::CELL_ENTITY].mySupport = aMEDSupport; - } + GetCellsSize(aMesh,aMEDMesh,anEntity); VISU::TField& aField = aMeshOnEntity.myFieldMap[aFieldName.in()]; aField.myId = myField->getOrderNumber(); @@ -192,6 +281,8 @@ VISU_Convertor* VISU_MEDFieldConvertor::Build() throw (std::runtime_error&){ aField.myEntity = anEntity; aField.myMeshName = aMeshName.in(); aField.myNbComp = myField->getNumberOfComponents(); + aField.myNbValField = 1; + aField.myDataSize = aMeshOnEntity.myNbCells * aField.myNbComp; aField.myCompNames.resize(aField.myNbComp); aField.myUnitNames.resize(aField.myNbComp); if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<> Cann't find MEDMESH label !!!"); + if(!aMedCompSObj->FindSubObject(aTag+1,aMeshSObj)) + throw std::runtime_error("VISU_MEDConvertor::Build >> Cann't find MEDMESH label !!!"); if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - MEDMESH found."); SALOMEDS::ChildIterator_var aMeshIterator = aStudy->NewChildIterator(aMeshSObj); for(; aMeshIterator->More(); aMeshIterator->Next()){ @@ -246,50 +337,49 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){ if(CORBA::is_nil(aMedSupport)) continue; SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); if(aMEDSupport->_is_nil()) continue; + SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh(); SALOME_MED::medEntityMesh aMEDEntity = aMEDSupport->getEntity(); VISU::TEntity anEntity = aMed2VisuEntity[aMEDEntity]; CORBA::String_var aSupportName = aMEDSupport->getName(); - bool isDataPresent = false; if(aMEDSupport->isOnAllElements()){ if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - Support isOnAllElements = '"<FindSubObject(aTag+2,aFieldSObj); - if(aBool){ + if(aMedCompSObj->FindSubObject(aTag+2,aFieldSObj)){ if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - MEDFIELD found."); SALOMEDS::ChildIterator_var aFieldIterator = aStudy->NewChildIterator(aFieldSObj); for(int iField = 0; aFieldIterator->More(); aFieldIterator->Next(), iField++){ aFieldSObj = aFieldIterator->Value(); if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFieldName = '"<<::GetName(aFieldSObj)<<"'"); SALOMEDS::ChildIterator_var aTimeStampIterator = aStudy->NewChildIterator(aFieldSObj); - for(; aTimeStampIterator->More(); aTimeStampIterator->Next()){ + for(int iTimeStamp = 1; aTimeStampIterator->More(); aTimeStampIterator->Next(), iTimeStamp++){ SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value(); if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<<::GetName(aTimeStampSObj)<<"'"); CORBA::Object_var aMedField = SObjectToObject(aTimeStampSObj); @@ -377,11 +464,9 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){ aMeshOnEntity.myMeshName = aMeshName.in(); VISUMED::TMeshOnEntity& aMeshOnEntity2 = aMesh2.myMeshOnEntityMap[anEntity]; aMeshOnEntity2.mySupport = aMEDSupport; - if(anEntity == VISU::NODE_ENTITY){ - aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myEntity = VISU::CELL_ENTITY; - aMesh.myMeshOnEntityMap[VISU::CELL_ENTITY].myMeshName = aMeshName.in(); + if(anEntity == VISU::NODE_ENTITY) aMesh2.myMeshOnEntityMap[VISU::CELL_ENTITY].mySupport = aMEDSupport; - } + GetCellsSize(aMesh,aMEDMesh,anEntity); VISU::TField& aField = aMeshOnEntity.myFieldMap[aFieldName.in()]; aField.myId = iField; @@ -389,20 +474,23 @@ VISU_Convertor* VISU_MEDConvertor::Build() throw (std::runtime_error&){ aField.myEntity = anEntity; aField.myMeshName = aMeshName.in(); aField.myNbComp = aMEDField->getNumberOfComponents(); + aField.myNbValField = iTimeStamp; + aField.myDataSize = aMeshOnEntity.myNbCells * aField.myNbComp; + if(MYDEBUG && !iTimeStamp) + MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity.myNbCells = "<getOrderNumber(); - int iTimeStamp = aMEDField->getIterationNumber(); - VISU::TField::TValForTime& aValForTime = aField.myValField[iTimeStamp]; - aValForTime.myId = iTimeStamp; - double dt = aMEDField->getTime(); - aValForTime.myTime = VISU::TField::TTime(dt,""); + int anId = aMEDField->getIterationNumber(); + VISU::TField::TValForTime& aValForTime = aField.myValField[anId]; + aValForTime.myId = anId; + aValForTime.myTime = VISU::TField::TTime(aMEDField->getTime(),""); VISUMED::TField& aField2 = aMeshOnEntity2.myFieldMap[aFieldName.in()]; - VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[iTimeStamp]; + VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[anId]; aValForTime2.myField = aMEDField; if(MYDEBUG) - MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<getSpaceDimension(); aMesh.myName = aMeshName.in(); + aMesh.myNbPoints = aMEDMesh->getNumberOfNodes(); VISUMED::TMesh &aMesh2 = myMeshMap2[aMeshName.in()]; aMesh2.myMesh = aMEDMesh; if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aMeshName = "<getIterationNumber(); + VISU::TField::TValForTime& aValForTime = aField.myValField[anId]; + aValForTime.myId = anId; + aValForTime.myTime = VISU::TField::TTime(aMEDField->getTime(),""); VISUMED::TField& aField2 = aMeshOnEntity2.myFieldMap[aFieldName.in()]; - VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[iTimeStamp]; + VISUMED::TField::TValForTime& aValForTime2 = aField2.myValField[anId]; aValForTime2.myField = aMEDField; if(MYDEBUG) - MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"< #include #include -#include -#include #include #include CORBA_SERVER_HEADER(SALOME_Session) @@ -30,17 +56,17 @@ using namespace std; #include #include + +using namespace std; + static QFileInfo aFileInfo; -#ifdef DEBUG +#ifdef _DEBUG_ static int MYDEBUG = 0; #else static int MYDEBUG = 0; #endif -#include - -//static int IS_LOADED = (cout<<"\n----------------- VisuEngine_factory is loaded -----------------\n", 1); extern "C" { PortableServer::ObjectId * VISUEngine_factory(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId * contId, @@ -51,205 +77,22 @@ extern "C" { return pVISU_Gen->getId() ; } VISU::VISU_Gen_ptr - GetVisuGen(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, - SALOME_NamingService* theNamingService, QMutex* theMutex) - { - if(MYDEBUG) MESSAGE("extern \"C\" GetVisuGen"); - VISU::VISU_Gen_i *aVISU_Gen = new VISU::VISU_Gen_i(theORB,thePOA,theNamingService,theMutex); - return VISU::VISU_Gen::_duplicate(aVISU_Gen->_this()); - //return aVISU_Gen->_this(); - } -} - -namespace VISU{ - //=========================================================================== - //apo - static QMutex VISUMutex; - QMutex* Base_i::myMutex = NULL; //apo - &VISUMutex; - CORBA::ORB_var Base_i::myOrb; - PortableServer::POA_var Base_i::myPOA; - SALOME_NamingService* Base_i::myNamingService; - SALOME_LifeCycleCORBA* Base_i::myEnginesLifeCycle; - VISU_Gen_i* Base_i::myVisuGenImpl; - VISU_Gen_var Base_i::GetVisuGenInter() { return myVisuGenImpl->_this();} - Base_i::~Base_i() {} - char* Base_i::GetID(){ - //CORBA::Object_var anObject = _this(); - //return CORBA::string_dup(myOrb->object_to_string(anObject)); - return CORBA::string_dup(myOrb->object_to_string(_this())); - } - //=========================================================================== - static int mySCnt = 0; - static int myQCnt = 0; - static int myIsBatchMode = 0; - - static int QApp_Counter = 0; - static int Session_Counter = 0; - static int COUNTER = 0; - - Mutex::Mutex(QMutex* theMutex, QApplication* theQApp, int theDelay) : - myQApp(theQApp), isQAppLocked(theQApp->locked()), myDelay(theDelay), - myMutex(theMutex), isSessionLocked(theMutex->locked()) + GetVisuGen(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, + SALOME_NamingService* theNamingService, QMutex* theMutex) { - if(MYDEBUG) MESSAGE("Mutex::Mutex : "<<(!isQAppLocked && !myQCnt)<<" "<<(!isSessionLocked && !mySCnt)); - if(!myIsBatchMode && isQAppLocked) myIsBatchMode++; - if(!isSessionLocked && !mySCnt) { myMutex->lock();}; mySCnt++; - if(!isQAppLocked && !myQCnt) { - myQApp->lock(); - myQApp->syncX(); - }; - myQCnt++; - } - Mutex::~Mutex(){ - myQCnt--; - if(!isQAppLocked && !myQCnt) { - myQApp->flushX(); - //if(myDelay > 0) - myQApp->processEvents(myDelay+3); - myQApp->unlock(); - } - mySCnt--; if(!isSessionLocked && !mySCnt) { myMutex->unlock();} - if(MYDEBUG) MESSAGE("Mutex::~Mutex : "<<(!isQAppLocked && !myQCnt)<<" "<<(!isSessionLocked && !mySCnt)); - } - //=========================================================================== - static Storable::TCallbackMap VisuStoreMap; - string Storable::ToString(){ - ostringstream strOut; - Storable::DataToStream( strOut, "myComment", GetComment() ); - ToStream(strOut); - strOut< aRet(strOut.str()); - return strOut.str(); + if(MYDEBUG) MESSAGE("extern \"C\" GetVisuGen"); + VISU::VISU_Gen_i *aVISU_Gen = new VISU::VISU_Gen_i(theORB,thePOA,theNamingService,theMutex); + return VISU::VISU_Gen::_duplicate(aVISU_Gen->_this()); + //return aVISU_Gen->_this(); } +} - void Storable::Registry(const char* theComment, TStorableEngine theEngine) - throw(std::logic_error&) - { - if(!VisuStoreMap.insert(TCallbackMap::value_type(theComment,theEngine)).second){ - if(MYDEBUG) MESSAGE("Storable::Registry >> dupliacte registring !!!"); - throw std::logic_error("Storable::Registry >> dupliacte registring !!!"); - } - } - - void RegistryStorable() throw(std::logic_error&) { - //Storable::Registry(View3D_i::myComment.c_str(),&View3DRestore); - Storable::Registry(Result_i::myComment.c_str(),&ResultRestore); - Storable::Registry(Mesh_i::myComment.c_str(),&MeshRestore); - Storable::Registry(ScalarMap_i::myComment.c_str(),&ScalarMapRestore); - Storable::Registry(DeformedShape_i::myComment.c_str(),&DeformedShapeRestore); - Storable::Registry(CutPlanes_i::myComment.c_str(),&CutPlanesRestore); - Storable::Registry(CutLines_i::myComment.c_str(),&CutLinesRestore); - Storable::Registry(IsoSurfaces_i::myComment.c_str(),&IsoSurfacesRestore); - Storable::Registry(StreamLines_i::myComment.c_str(),&StreamLinesRestore); - Storable::Registry(Vectors_i::myComment.c_str(),&VectorsRestore); - Storable::Registry(Table_i::myComment.c_str(),&TableRestore); - Storable::Registry(Curve_i::myComment.c_str(),&CurveRestore); - Storable::Registry(Container_i::myComment.c_str(),&ContainerRestore); - } +namespace VISU{ + static string VisuTmpDir; - void Storable::StrToMap(const QString& theStr, VISU::Storable::TRestoringMap& theMap){ - if(0 && MYDEBUG) MESSAGE("Storable::StrToMap : string="<GetID()); - //aMap.insert(TRestoringMap::value_type("ResultID", strdup(aResultID))); - bool isExist; - QString aComment = VISU::Storable::FindValue(aMap,"myComment",&isExist); - if ( isExist ) { - TCallbackMap::const_iterator i = VisuStoreMap.find(aComment.latin1()); - if(MYDEBUG) MESSAGE("Storable::Create - "<second)(theSObject,thePrefix,aMap); - } - }catch(std::logic_error& exc){ - MESSAGE("Follow exception was accured :\n"<> there is no value for "<> there is no value for ") + theArg); - static QString BAD_VALUE("NULL"); - return BAD_VALUE; - } - if(isFind != NULL) *isFind = true; - return i->second; - } + static CORBA::Boolean myIsMultiFile; + const CORBA::Boolean IsMultifile() { return myIsMultiFile;} - //=========================================================================== - PortableServer::Servant GetServant(CORBA::Object_ptr theObject){ - PortableServer::POA_ptr aPOA = Base_i::GetPOA(); - if(CORBA::is_nil(theObject)) - if(MYDEBUG) MESSAGE("GetServant - CORBA::is_nil(theObject)"); - return aPOA->reference_to_servant(theObject); - } - //=========================================================================== - CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject){ - SALOMEDS::GenericAttribute_var anAttr; - CORBA::Object_var anObj; - try{ - if(theSObject->FindAttribute(anAttr, "AttributeIOR")){ - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var aValue = anIOR->Value(); - CORBA::ORB_ptr anORB = Base_i::GetORB(); - if(strcmp(aValue,"") != 0) - anObj = anORB->string_to_object(aValue); - } - }catch(...){ - MESSAGE("SObjectToObject - Unknown exception was accured!"); - } - return anObj; - } //=========================================================================== SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument){ SALOMEDS::SComponent_var aSComponent = theStudyDocument->FindComponent("VISU"); @@ -276,82 +119,31 @@ namespace VISU{ SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" ); - VISU_Gen_var aVisuGen = Base_i::GetVisuGenInter(); + VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this(); aStudyBuilder->DefineComponentInstance(aSComponent,aVisuGen); if (aLocked) theStudyDocument->GetProperties()->SetLocked(true); aStudyBuilder->CommitCommand(); } return aSComponent; } - //=========================================================================== - string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry, - const char* theComment, int IsAllLevels) - { - if(0 && MYDEBUG) MESSAGE("FindEntryWithComment - '"<NewChildIterator(theStudyDocument->FindObjectID(theStartEntry)); - anIter->InitEx(IsAllLevels); - SALOMEDS::SObject_var aFieldSO; - for(;anIter->More();anIter->Next()) { - SALOMEDS::GenericAttribute_var anAttr; - if (anIter->Value()->FindAttribute(anAttr,"AttributeComment")) { - SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr); - CORBA::String_var aString = aCmnt->Value(); - string aValue(aString); - if (aValue == theComment) { - aFieldSO = anIter->Value(); - aString = aFieldSO->GetID(); - aValue = aString; - return aValue; - } - } - } - return ""; - } - //=========================================================================== - string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument, - const char* theFatherEntry, const char* theRefFatherEntry, - const char* theIOR, const char* theName, - const char* thePersistentRef, const char* theComment, - CORBA::Boolean theCreateNew) - { - if(0 && MYDEBUG) - MESSAGE("CreateAttributes - theName = "<SetValue(theIOR); - anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName"); - SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(theName); - anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributePersistentRef"); - SALOMEDS::AttributePersistentRef_var aPRef = SALOMEDS::AttributePersistentRef::_narrow(anAttr); - aPRef->SetValue(thePersistentRef); - anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment"); - SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr); - aCmnt->SetValue(theComment); - if(strcmp(theRefFatherEntry,"") != 0){ - SALOMEDS::SObject_var aRefFather = theStudyDocument->FindObjectID(theRefFatherEntry); - SALOMEDS::SObject_var anObj = aStudyBuilder->NewObject(aRefFather); - aStudyBuilder->Addreference(anObj,newObj); - } - CORBA::String_var anEntry = newObj->GetID(); - string aRet(anEntry); - if(0 && MYDEBUG) MESSAGE("CreateAttributes - anEntry = "<_is_nil())); + char* VISU_Gen_i::GetID(){ if(myMutex) - myStudyDocument = SALOMEDS::Study::_duplicate(theStudy); - else - myVisuGen->SetCurrentStudy(theStudy); + return Base_i::GetID(); + return myVisuGen->GetID(); + } + + void VISU_Gen_i::SetCurrentStudy(SALOMEDS::Study_ptr theStudy){ + if(myMutex){ + if(!CORBA::is_nil(theStudy)) + myStudyDocument = SALOMEDS::Study::_duplicate(theStudy); + }else + myVisuGen->SetCurrentStudy(SALOMEDS::Study::_duplicate(theStudy)); } SALOMEDS::Study_ptr VISU_Gen_i::GetCurrentStudy(){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::GetCurrentStudy : "<GetCurrentStudy(); @@ -616,11 +414,12 @@ namespace VISU{ if(myMutex){ if(myStudyDocument->GetProperties()->IsLocked()) return Result::_nil(); Mutex mt(myMutex,qApp); + VISU::Result_var aResult; aFileInfo.setFile(theFileName); Result_i* pResult = new Result_i(myStudyDocument); if(pResult->Create(theFileName) != NULL) - return Result::_duplicate(pResult->_this()); - return Result::_nil(); + aResult = pResult->_this(); + return aResult._retn(); } return myVisuGen->ImportFile(theFileName); } @@ -697,124 +496,51 @@ namespace VISU{ } ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::ScalarMapOnField : "<GetProperties()->IsLocked()) return ScalarMap::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(ScalarMap_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - ScalarMap_i* aPresent = new ScalarMap_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL){ - //Base_i::myPOA->activate_object(aPresent); - //aPresent->_remove_ref(); - return aPresent->_this(); - } - } - return ScalarMap::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->ScalarMapOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::DeformedShapeOnField : "<GetProperties()->IsLocked()) return DeformedShape::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(DeformedShape_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - DeformedShape_i* aPresent = new DeformedShape_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return DeformedShape::_duplicate(aPresent->_this()); - } - return DeformedShape::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->DeformedShapeOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::VectorsOnField : "<GetProperties()->IsLocked()) return Vectors::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(Vectors_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - Vectors_i* aPresent = new Vectors_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return Vectors::_duplicate(aPresent->_this()); - } - return Vectors::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->VectorsOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::IsoSurfacesOnField : "<GetProperties()->IsLocked()) return IsoSurfaces::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(IsoSurfaces_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - IsoSurfaces_i* aPresent = new IsoSurfaces_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return IsoSurfaces::_duplicate(aPresent->_this()); - } - return IsoSurfaces::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->IsoSurfacesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::StreamLinesOnField : "<GetProperties()->IsLocked()) return StreamLines::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(StreamLines_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - StreamLines_i* aPresent = new StreamLines_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return StreamLines::_duplicate(aPresent->_this()); - } - return StreamLines::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->StreamLinesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::CutPlanesOnField : "<GetProperties()->IsLocked()) return CutPlanes::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(CutPlanes_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - CutPlanes_i* aPresent = new CutPlanes_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return CutPlanes::_duplicate(aPresent->_this()); - } - return CutPlanes::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->CutPlanesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - if(MYDEBUG) MESSAGE("VISU_Gen_i::CutLinesOnField : "<GetProperties()->IsLocked()) return CutLines::_nil(); - Mutex mt(myMutex,qApp); - Result_i* pResult = dynamic_cast(GetServant(theResult)); - if(CutLines_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,theIteration)){ - CutLines_i* aPresent = new CutLines_i(pResult); - if(aPresent->Create(theMeshName,theEntity,theFieldName,theIteration) != NULL) - return CutLines::_duplicate(aPresent->_this()); - } - return CutLines::_nil(); - } + const char* theFieldName, CORBA::Double theIteration) + { + if(myMutex) return Prs3dOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); return myVisuGen->CutLinesOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } @@ -953,7 +679,7 @@ namespace VISU{ } } } catch (...) { - MESSAGE("Unknown exception was accured!"); + INFOS("Unknown exception was accured!"); } return false; } @@ -1023,6 +749,9 @@ namespace VISU{ // Assign an ID = 1 the the type VISU::Result theObjectID = 1; + + + SALOMEDS::SComponent_var aSComponent = theObject->GetStudy()->FindComponent("VISU"); return aStreamFile._retn(); } return myVisuGen->CopyFrom(theObject, theObjectID); @@ -1044,7 +773,7 @@ namespace VISU{ Mutex mt(myMutex,qApp); SALOMEDS::SObject_var aResultSO; if (theObjectID != 1) return aResultSO._retn(); - + CORBA::String_var aTmpDir = (const char*)SALOMEDS_Tool::GetTmpDir(); SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false); @@ -1057,25 +786,31 @@ namespace VISU{ stmIn.read(aString, aLength); aString[aLength] = 0; myIsMultiFile = true; - + string aFileName(aTmpDir.in()); if(aSeq->length() > 1) aFileName += aSeq[1].in(); - Storable* aStorable = Storable::Create(theObject,aFileName,aString); - - SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames; - aSeqToRm->length(1); - aSeqToRm[0] = "copy_persistent"; - SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeqToRm.in(), true); SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent(); SALOMEDS::Study_var aStudy = theObject->GetStudy(); SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); CORBA::String_var aComponentID(aComponent->GetID()), aSObjID(theObject->GetID()); + if (strcmp(aComponentID, aSObjID) == 0) //create the new result SObject aResultSO = aStudyBuilder->NewObject(aComponent); else aResultSO = SALOMEDS::SObject::_duplicate(theObject); - SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR"); + + //Just for Result::Restore to find the Comment attribute :( + SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment"); + + Storable* aStorable = Storable::Create(aResultSO,aFileName,aString); + + SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames; + aSeqToRm->length(1); + aSeqToRm[0] = "copy_persistent"; + SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeqToRm.in(), true); + + anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR"); SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); CORBA::String_var anIORValue(aStorable->GetID()); anIOR->SetValue(anIORValue); diff --git a/src/VISU_I/VISU_Gen_i.hh b/src/VISU_I/VISU_Gen_i.hh index 9604f498..08c4010c 100644 --- a/src/VISU_I/VISU_Gen_i.hh +++ b/src/VISU_I/VISU_Gen_i.hh @@ -16,6 +16,7 @@ #include "SALOME_NamingService.hxx" namespace VISU{ + class Result_i; class VISU_Gen_i : public virtual POA_VISU::VISU_Gen, public virtual ::Engines_Component_i, public virtual Base_i @@ -33,10 +34,13 @@ namespace VISU{ const char *instanceName, const char *interfaceName); virtual ~VISU_Gen_i(); + + virtual char* GetID(); virtual VISU::VISUType GetType() { return VISU::TVISUGEN;}; virtual void SetCurrentStudy(SALOMEDS::Study_ptr theStudy); virtual SALOMEDS::Study_ptr GetCurrentStudy(); + virtual ViewManager_ptr GetViewManager(); virtual SALOMEDS::SObject_ptr ImportTables(const char* theFileName); @@ -53,6 +57,23 @@ namespace VISU{ virtual Mesh_ptr GroupMesh(Result_ptr theResult, const char* theMeshName, const char* theGroupName); //Create 3D collored Presentation Of Different Types + template typename TPrs3d_i::TInterface::_ptr_type + Prs3dOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, + const char* theFieldName, CORBA::Double theIteration) + { + typedef typename TPrs3d_i::TInterface TPrs3d; + if(myStudyDocument->GetProperties()->IsLocked()) return TPrs3d::_nil(); + Mutex mt(myMutex,qApp); + Result_i* pResult = dynamic_cast(GetServant(theResult)); + if(TPrs3d_i::IsPossible(pResult,theMeshName,theEntity,theFieldName,int(theIteration))){ + TPrs3d_i* aPresent = new TPrs3d_i(pResult); + if(aPresent->Create(theMeshName,theEntity,theFieldName,int(theIteration)) != NULL){ + return aPresent->_this(); + } + } + return TPrs3d::_nil(); + } + virtual ScalarMap_ptr ScalarMapOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, const char* theFieldName, CORBA::Double theIteration); virtual DeformedShape_ptr DeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, diff --git a/src/VISU_I/VISU_PrsObject_i.cc b/src/VISU_I/VISU_PrsObject_i.cc index a021b42c..5ba1f599 100644 --- a/src/VISU_I/VISU_PrsObject_i.cc +++ b/src/VISU_I/VISU_PrsObject_i.cc @@ -1,103 +1,41 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // File : VISU_PrsObject_i.cxx // Author : Alexey PETROV // Module : VISU -using namespace std; #include "VISU_PrsObject_i.hh" -#include "VISU_Extractor.hxx" -#include "VISU_FieldTransform.hxx" -#include "VISU_LookupTable.hxx" -#include "VISU_ScalarBarActor.hxx" -#include "VISU_Actor.h" using namespace VISU; +using namespace std; -#include "QAD_Config.h" - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef DEBUG +#ifdef _DEBUG_ static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #else static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #endif -static float EPS = 1.0E-3; -const float PI2 = 2.0*PI; - -void WriteToFile(vtkPolyData* theDataSet, const string& theFileName){ - vtkPolyDataWriter* aWriter = vtkPolyDataWriter::New(); - aWriter->SetFileName(theFileName.c_str()); - aWriter->SetInput(theDataSet); - aWriter->Write(); - aWriter->Delete(); -} - -//============================================================================== -void SetIOR(SALOMEDS::SObject_var& theSObject, const char* theIOR){ - SALOMEDS::GenericAttribute_var anAttr; - theSObject->FindAttribute(anAttr, "AttributeIOR"); - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var aValue(theIOR); - anIOR->SetValue(aValue); -} - -float CalcScaleFactor(float theBound[6], int theNbElem){ - float aVolume = 1, vol, idim = 0; - for(int i = 0; i < 6; i += 2){ - vol = fabs(theBound[i+1] - theBound[i]); - if(vol > 0) { - idim++; - aVolume *= vol; - } - } - aVolume /= theNbElem; - float aFactor = pow(aVolume,(float)1./idim); - return aFactor; -} - -VISU::Result_i* GetResult(SALOMEDS::SObject_ptr theSObject){ - VISU::Result_var aResult = FindResult(theSObject); - if(!aResult->_is_nil()) - return dynamic_cast(VISU::GetServant(aResult.in())); - return NULL; -} - -//---------------------------------------------------------------- -// PrsObject -//---------------------------------------------------------------- void VISU::PrsObject_i::SetName( const char* theName ) { myName = theName; @@ -115,2111 +53,3 @@ QString VISU::PrsObject_i::GetEntry() { CORBA::String_var anEntry = aSObject->GetID(); return anEntry.in(); } - - -//---------------------------------------------------------------- -// Prs3d Object -//---------------------------------------------------------------- -VISU::Prs3d_i::Prs3d_i(Result_i* theResult) : - PrsObject_i(theResult->GetStudyDocument()), - myResult(theResult) -{ - myMapper = MapperType::New(); - myGeomFilter = vtkGeometryFilter::New(); - myGeomFilter->PointClippingOff(); - myGeomFilter->CellClippingOff(); - myGeomFilter->ExtentClippingOff(); - myGeomFilter->MergingOff(); - myColor.R = 0.5; - myColor.G = 0.5; - myColor.B = 0.5; - myAddToStudy = true; -} - -void VISU::Prs3d_i::SameAs(const Prs3d_i* theOrigin) -{ - Prs3d_i* aOrigin = const_cast(theOrigin); - SetColor(aOrigin->GetColor()); - myMapper->ShallowCopy(aOrigin->GetMapper()); -} - -void VISU::Prs3d_i::SetColor(const SALOMEDS::Color& theColor){ - myColor = theColor; -} - -VISU::Prs3d_i::~Prs3d_i() { - CORBA::release(myStudy); - myMapper->Delete(); - myGeomFilter->Delete(); -} - -void VISU::Prs3d_i::Destroy() { - CORBA::Object_var anObj = _this(); - PortableServer::POA_ptr aPOA = Base_i::GetPOA(); - PortableServer::ObjectId_var anId = aPOA->reference_to_id(anObj); - aPOA->deactivate_object(anId.in()); - //this->_remove_ref(); -} - - -/** - * Create Actor referred on existing IO - */ -bool VISU::Prs3d_i::CreateActor(VISU_Actor* theActor, const Handle(SALOME_InteractiveObject)& theIO){ - //MESSAGE("Prs3d_i::CreateActor"); - Update(); - myMapper->Update(); - static float eps = VTK_LARGE_FLOAT * 0.1 ; - float aLength = myMapper->GetInput()->GetLength(); - if(aLength > eps){ - MESSAGE("Prs3d_i::CreateActor >> Diagonal of the actor is too large : "<SetShrinkable(myMapper->GetInput()->GetNumberOfCells() > 10); - myMapper->SetResolveCoincidentTopologyToShiftZBuffer(); - myMapper->SetResolveCoincidentTopologyZShift(0.02); - theActor->SetMapper(myMapper); - if (myAddToStudy) { - if (theIO.IsNull()){ - //Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(GetEntry(),"VISU",GetName()); - //There is a bug in gcc compiler - const Standard_CString is mapping as char * const not as const char * - //(where Standard_CString is defined as typedef char* Standard_CString) - Handle(SALOME_InteractiveObject) anIO = - new SALOME_InteractiveObject(strdup(GetEntry()),"VISU",(const Standard_CString)GetName()); - theActor->setIO(anIO); - }else - theActor->setIO(theIO); - } - theActor->setPrs3d(this); - return true; -} - -void VISU::Prs3d_i::UpdateActor(VISU_Actor* theActor) { - if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActor"); - myMapper->Update(); - theActor->Modified(); -} - -VISU::Storable* VISU::Prs3d_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - if(MYDEBUG) MESSAGE(GetComment()); - myName = (const char*)(VISU::Storable::FindValue(theMap,"myName")); - myColor.R = VISU::Storable::FindValue(theMap,"myColor.R").toDouble(); - myColor.G = VISU::Storable::FindValue(theMap,"myColor.G").toDouble(); - myColor.B = VISU::Storable::FindValue(theMap,"myColor.B").toDouble(); - return this; -} - -void VISU::Prs3d_i::ToStream(std::ostringstream& theStr){ - Storable::DataToStream( theStr, "myName", myName.c_str() ); - Storable::DataToStream( theStr, "myColor.R", myColor.R ); - Storable::DataToStream( theStr, "myColor.G", myColor.G ); - Storable::DataToStream( theStr, "myColor.B", myColor.B ); -} - -void VISU::Prs3d_i::Update(){ - myMapper->Modified(); -} - - -//---------------------------------------------------------------- -// Mesh Object -//---------------------------------------------------------------- -int VISU::Mesh_i::myNbPresent = 0; - -QString VISU::Mesh_i::GenerateName() { return VISU::GenerateName("Mesh",myNbPresent++);} - -const string VISU::Mesh_i::myComment = "MESH"; - -const char* VISU::Mesh_i::GetComment() const { return myComment.c_str();} - - -VISU::Mesh_i::Mesh_i(Result_i* theResult) : - PrsObject_i(theResult->GetStudyDocument()), - Prs3d_i(theResult) -{ - myInput = NULL; - SALOMEDS::Color aColor = {0,1,1}; - SetCellColor(aColor); - SetNodeColor(aColor); - SALOMEDS::Color aLinkColor = {83/255.,83/255.,83/255.}; - SetLinkColor(aLinkColor); -} - -void VISU::Mesh_i::SameAs(const Mesh_i* theOrigin) -{ - return; // Same as command for mesh is not valid in current architecture -// VISU::Prs3d_i::SameAs(theOrigin); -// Mesh_i* aMesh = (Mesh_i*) theOrigin; -// SetCellColor(aMesh->GetCellColor()); -// SetNodeColor(aMesh->GetNodeColor()); -// SetLinkColor(aMesh->GetLinkColor()); -// SetPresentationType(aMesh->GetPresentationType()); -// Build(false); -} - -void VISU::Mesh_i::Destroy(){ - SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(GetEntry()); - if(!aSObj->_is_nil()){ - SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); - aStudyBuilder->RemoveAttribute(aSObj,"AttributeIOR"); - } - Prs3d_i::Destroy(); -} - -VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, int theEntity){ - myMeshName = theMeshName; - myEntity = theEntity; - mySubMeshName = ""; - return Build(false); -} - -VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, int theEntity, const char* theFamilyName){ - myMeshName = theMeshName; - myEntity = theEntity; - mySubMeshName = theFamilyName; - return Build(false); -} -VISU::Storable* VISU::Mesh_i::Create(const char* theMeshName, const char* theGroupName){ - myMeshName = theMeshName; - myEntity = -1; - mySubMeshName = theGroupName; - return Build(false); -} - -VISU::Storable* VISU::Mesh_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - Prs3d_i::Restore(theMap,false); - - myMeshName = VISU::Storable::FindValue(theMap,"myMeshName").latin1(); - myEntity = VISU::Storable::FindValue(theMap,"myEntity").toInt(); - mySubMeshName = VISU::Storable::FindValue(theMap,"mySubMeshName").latin1(); - - myColor.R = VISU::Storable::FindValue(theMap,"myCellColor.R").toDouble(); - myColor.G = VISU::Storable::FindValue(theMap,"myCellColor.G").toDouble(); - myColor.B = VISU::Storable::FindValue(theMap,"myCellColor.B").toDouble(); - - myNodeColor.R = VISU::Storable::FindValue(theMap,"myNodeColor.R").toDouble(); - myNodeColor.G = VISU::Storable::FindValue(theMap,"myNodeColor.G").toDouble(); - myNodeColor.B = VISU::Storable::FindValue(theMap,"myNodeColor.B").toDouble(); - - myLinkColor.R = VISU::Storable::FindValue(theMap,"myLinkColor.R").toDouble(); - myLinkColor.G = VISU::Storable::FindValue(theMap,"myLinkColor.G").toDouble(); - myLinkColor.B = VISU::Storable::FindValue(theMap,"myLinkColor.B").toDouble(); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::Mesh_i::ToStream(std::ostringstream& theStr){ - Prs3d_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myMeshName", myMeshName.c_str() ); - Storable::DataToStream( theStr, "myEntity", myEntity ); - Storable::DataToStream( theStr, "mySubMeshName", mySubMeshName.c_str() ); - - Storable::DataToStream( theStr, "myCellColor.R", myColor.R ); - Storable::DataToStream( theStr, "myCellColor.G", myColor.G ); - Storable::DataToStream( theStr, "myCellColor.B", myColor.B ); - - Storable::DataToStream( theStr, "myNodeColor.R", myNodeColor.R ); - Storable::DataToStream( theStr, "myNodeColor.G", myNodeColor.G ); - Storable::DataToStream( theStr, "myNodeColor.B", myNodeColor.B ); - - Storable::DataToStream( theStr, "myLinkColor.R", myLinkColor.R ); - Storable::DataToStream( theStr, "myLinkColor.G", myLinkColor.G ); - Storable::DataToStream( theStr, "myLinkColor.B", myLinkColor.B ); -} - -VISU::Storable* VISU::MeshRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::Mesh_i* pResent = new VISU::Mesh_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::Mesh_i::~Mesh_i(){ - if(MYDEBUG) MESSAGE("Mesh_i::~Mesh_i()"); -} - - -VISU::Storable* VISU::Mesh_i::Build(int theRestoring){ - try{ - if(myResult->GetInput() == NULL) - throw std::runtime_error("Mesh_i::Build - myResult->GetInput() == NULL !!!"); - if(!theRestoring) myName = (const char*)(GenerateName()); - if(myEntity >= 0) - if(mySubMeshName == "") - myType = VISU::TENTITY; - else - myType = VISU::TFAMILY; - else - myType = VISU::TGROUP; - if(MYDEBUG) MESSAGE("Mesh_i::Build - myType = "<GetInput()->GetMeshOnEntity(myMeshName,(VISU::TEntity)myEntity); - aComment.sprintf("myComment=ENTITY;myType=%d;myMeshName=%s;myId=%d", - VISU::TENTITY,myMeshName.c_str(),myEntity); - break; - case VISU::TFAMILY : - myInput = myResult->GetInput()->GetMeshOnEntity(myMeshName,(VISU::TEntity)myEntity,mySubMeshName); - aComment.sprintf("myComment=FAMILY;myType=%d;myMeshName=%s;myEntityId=%d;myName=%s", - VISU::TFAMILY,myMeshName.c_str(),myEntity,mySubMeshName.c_str()); - break; - case VISU::TGROUP : - myInput = myResult->GetInput()->GetMeshOnGroup(myMeshName,mySubMeshName); - aComment.sprintf("myComment=GROUP;myType=%d;myMeshName=%s;myName=%s", - VISU::TGROUP,myMeshName.c_str(),mySubMeshName.c_str()); - break; - } - if(myInput == NULL) throw std::runtime_error("Mesh_i::Build - myInput == NULL !!!"); - //Binding pipeline - vtkUnstructuredGrid *aDataSet = myInput->GetOutput(); - //Avoid selection points that don't belong any of cells - myGeomFilter->SetInput(aDataSet); - myMapper->SetInput(myGeomFilter->GetOutput()); - myMapper->ScalarVisibilityOff(); - //Setting IOR on the label - if(!theRestoring) { - string aResultEntry = myResult->GetEntry(); - string anEntry = FindEntryWithComment(myStudy,aResultEntry.c_str(),aComment.latin1()); - if(anEntry == "") throw std::runtime_error("Mesh_i::Build - anEntry was not found !!!"); - SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(anEntry.c_str()); - SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aSObj,"AttributeIOR"); - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var aString = GetID(); - anIOR->SetValue(aString); - } - aDataSet->GetBounds(myBounds); - if(MYDEBUGWITHFILES){ - string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER"); - aFileName += "-Mesh.vtk"; - ::WriteToFile(myGeomFilter->GetOutput(),aFileName.c_str()); - } - return this; - }catch(std::runtime_error& exc){ - MESSAGE("Follow exception was accured :\n"<Delete(); - return NULL; - } -} - -void VISU::Mesh_i::UpdateActor(VISU_Actor* theActor) { - if(VISUMesh_Actor* anActor = dynamic_cast(theActor)){ - if(MYDEBUG) MESSAGE("Mesh_i::UpdateActor"); - VISU::Prs3d_i::UpdateActor(theActor); - vtkProperty* aSurfaceProperty = anActor->GetProperty(); - aSurfaceProperty->SetColor(myColor.R, myColor.G, myColor.B); - vtkProperty* anEdgeProperty = anActor->GetEdgeProperty(); - anEdgeProperty->SetColor(myLinkColor.R, myLinkColor.G, myLinkColor.B); - } -} - - - -//============================================================================== -int VISU::ScalarMap_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - try{ - const VISU::TField& aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName); - const VISU::TField::TValField& aValField = aField.myValField; - bool aRes = aValField.find((int)theIteration) != aValField.end(); - if(MYDEBUG) MESSAGE("ScalarMap_i::IsPossible = "<GetStudyDocument()), - Prs3d_i(theResult) -{ - myAddToStudy = theAddToStudy; - myInput = VISU_Extractor::New(); - myFieldTransform = VISU_FieldTransform::New(); - myMapperTable = VISU_LookupTable::New(); - myBarTable = VISU_LookupTable::New(); - myIsColored = true; - myMapScale = 1.0; -} - -void VISU::ScalarMap_i::Destroy(){ - if(myAddToStudy){ - SALOMEDS::SObject_var aSObj = myStudy->FindObjectID(GetEntry()); - if(!aSObj->_is_nil()){ - SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); - aStudyBuilder->RemoveObject(aSObj); - } - } - Prs3d_i::Destroy(); -} - -void VISU::ScalarMap_i::SameAs(const ScalarMap_i* theOrigin) -{ - ScalarMap_i* aScalarMap = const_cast(theOrigin); - VISU::Prs3d_i::SameAs(aScalarMap); - myField = aScalarMap->GetField(); - myMeshName = myField->myMeshName; - myEntity = myField->myEntity; - myIteration = aScalarMap->GetIteration(); - myFieldName = aScalarMap->GetFieldName(); - - SetScalarMode(aScalarMap->GetScalarMode()); - SetRange(aScalarMap->GetMin(), aScalarMap->GetMax()); - SetScaling(aScalarMap->GetScaling()); - SetOrientation(aScalarMap->GetOrientation()); - SetPosition(aScalarMap->GetPosX(), aScalarMap->GetPosY()); - SetSize(aScalarMap->GetWidth(), aScalarMap->GetHeight()); - SetNbColors(aScalarMap->GetNbColors()); - SetLabels(aScalarMap->GetLabels()); - SetTitle(aScalarMap->GetTitle()); - Build(-1); - Update(); -} - - -/** - * Creates Scalar Map and initialises it from resources - */ -VISU::Storable* VISU::ScalarMap_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, CORBA::Double theIteration){ - myIsFixedRange = false; - // Orientation - QString aOrient = QAD_CONFIG->getSetting("Visu:SBOrientation"); - if ( !aOrient.isEmpty() ) - myOrientation = (VISU::ScalarMap::Orientation) aOrient.toInt(); - else - myOrientation = VISU::ScalarMap::VERTICAL; - - // Scalar Bar origin - QString aXorigin = QAD_CONFIG->getSetting("Visu:SBXorigin"); - if ( !aXorigin.isEmpty() ) - myPosition[0] = aXorigin.toFloat(); - else { - if(myOrientation == VISU::ScalarMap::VERTICAL) { - myPosition[0] = 0.03; - } else { - myPosition[0] = 0.2; - } - } - - QString aYorigin = QAD_CONFIG->getSetting("Visu:SBYorigin"); - if ( !aYorigin.isEmpty() ) - myPosition[1] = aYorigin.toFloat(); - else { - if(myOrientation == VISU::ScalarMap::VERTICAL) { - myPosition[1] = 0.1; - } else { - myPosition[1] = 0.012; - } - } - - // Scalar Bar size - QString aWidth = QAD_CONFIG->getSetting("Visu:SBWidth"); - if ( !aWidth.isEmpty() ) - myWidth = aWidth.toFloat(); - else { - myWidth =(myOrientation == VISU::ScalarMap::VERTICAL)? 0.17:0.6; - } - QString aHeight = QAD_CONFIG->getSetting("Visu:SBHeight"); - if ( !aHeight.isEmpty() ) - myHeight = aHeight.toFloat(); - else { - myHeight =(myOrientation == VISU::ScalarMap::VERTICAL)? 0.8:0.12; - } - - // Nb of Colors - QString aColors = QAD_CONFIG->getSetting("Visu:SBNumberOfColors"); - myNumberOfColors = (aColors.isEmpty())? 64 : aColors.toInt(); - if (myNumberOfColors > 64) - myNumberOfColors = 64; - - // Nb of Labels - QString aLabels = QAD_CONFIG->getSetting("Visu:SBNumberOfLabels"); - myNumberOfLabels = (aLabels.isEmpty())? 5 : aLabels.toInt(); - if (myNumberOfLabels > 65) - myNumberOfLabels = 65; - - // Scalar Range - QString aFixRange = QAD_CONFIG->getSetting("Visu:SBImposeRange"); - myIsFixedRange = (aFixRange.compare("true") == 0); - - QString aRangeMin = QAD_CONFIG->getSetting("Visu:SBMinimumValue"); - myScalarRange[0] = (aRangeMin.isEmpty())? 0 : aRangeMin.toFloat(); - - QString aRangeMax = QAD_CONFIG->getSetting("Visu:SBMaximumValue"); - myScalarRange[1] = (aRangeMax.isEmpty())? 0 : aRangeMax.toFloat(); - - QString aScaling = QAD_CONFIG->getSetting("Visu:SBScaling"); - if(aScaling.compare("LOGARITHMIC") == 0) - myScaling = VISU::LOGARITHMIC; - else - myScaling = VISU::LINEAR; - -// myName = GenerateName(); - myMeshName = theMeshName; - myEntity = theEntity; - myFieldName =theFieldName; - myScalarMode = 0; - myIteration = theIteration; - return Build(false); -} - - - -VISU::Storable* VISU::ScalarMap_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - Prs3d_i::Restore(theMap,false); - - myAddToStudy = false; //SRN Added 21/06/2003 SAL2983: to avoid addition of the new ScalarMap to study. - - myMeshName = (const char*)(VISU::Storable::FindValue(theMap,"myMeshName")); - myEntity = VISU::Storable::FindValue(theMap,"myEntity").toInt(); - myFieldName = (const char*)(VISU::Storable::FindValue(theMap,"myFieldName")); - myIteration = VISU::Storable::FindValue(theMap,"myIteration").toInt(); - - myScalarMode = VISU::Storable::FindValue(theMap,"myScalarMode").toInt(); - myScalarRange[0] = VISU::Storable::FindValue(theMap,"myScalarRange[0]").toDouble(); - myScalarRange[1] = VISU::Storable::FindValue(theMap,"myScalarRange[1]").toDouble(); - myIsFixedRange = VISU::Storable::FindValue(theMap,"myIsFixedRange").toInt(); - myScaling = (VISU::Scaling)VISU::Storable::FindValue(theMap,"myScaling").toInt(); - - myTitle = (const char*)(VISU::Storable::FindValue(theMap,"myTitle")); - myOrientation = (VISU::ScalarMap::Orientation)VISU::Storable::FindValue(theMap,"myOrientation").toInt(); - myNumberOfColors = VISU::Storable::FindValue(theMap,"myNumberOfColors").toInt(); - myNumberOfLabels = VISU::Storable::FindValue(theMap,"myNumberOfLabels").toInt(); - myPosition[0] = VISU::Storable::FindValue(theMap,"myPosition[0]").toDouble(); - myPosition[1] = VISU::Storable::FindValue(theMap,"myPosition[1]").toDouble(); - myWidth = VISU::Storable::FindValue(theMap,"myWidth").toDouble(); - myHeight = VISU::Storable::FindValue(theMap,"myHeight").toDouble(); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::ScalarMap_i::ToStream(std::ostringstream& theStr){ - Prs3d_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myMeshName", myMeshName.c_str() ); - Storable::DataToStream( theStr, "myEntity", myEntity ); - Storable::DataToStream( theStr, "myFieldName", myFieldName.c_str() ); - Storable::DataToStream( theStr, "myIteration", myIteration ); - - Storable::DataToStream( theStr, "myScalarMode", myScalarMode ); - Storable::DataToStream( theStr, "myScalarRange[0]", myScalarRange[0] ); - Storable::DataToStream( theStr, "myScalarRange[1]", myScalarRange[1] ); - Storable::DataToStream( theStr, "myIsFixedRange", myIsFixedRange ); - Storable::DataToStream( theStr, "myScaling", myScaling ); - - Storable::DataToStream( theStr, "myTitle", myTitle.c_str() ); - Storable::DataToStream( theStr, "myOrientation", myOrientation ); - Storable::DataToStream( theStr, "myNumberOfColors", myNumberOfColors ); - Storable::DataToStream( theStr, "myNumberOfLabels", myNumberOfLabels ); - Storable::DataToStream( theStr, "myPosition[0]", myPosition[0] ); - Storable::DataToStream( theStr, "myPosition[1]", myPosition[1] ); - Storable::DataToStream( theStr, "myWidth", myWidth ); - Storable::DataToStream( theStr, "myHeight", myHeight ); -} - -void VISU::ScalarMap_i::SetScaling(VISU::Scaling theScaling){ - VISU_FieldTransform::TTransformFun aFun; - if(MYDEBUG) MESSAGE("ScalarMap_i::SetScaling - theScaling = "<GetUnstructuredGridOutput(); - myFieldTransform->SetInput(aDataSet); - myFieldTransform->SetTransformFunction(aFun); - myFieldTransform->SetScalarRange(myScalarRange); - if(MYDEBUGWITHFILES){ - string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER"); - aFileName += "-PrsScaling.vtk"; - WriteToFile(myFieldTransform->GetUnstructuredGridOutput(),aFileName.c_str()); - } -} - -VISU::Scaling VISU::ScalarMap_i::GetScaling(){ - return myScaling; -} - - -void VISU::ScalarMap_i::SetRange(CORBA::Double theMin, CORBA::Double theMax) { - if(theMin > theMax) return; - myScalarRange[0] = theMin; - myScalarRange[1] = theMax; - myFieldTransform->SetScalarRange(myScalarRange); - myIsFixedRange = true; - if(MYDEBUG) MESSAGE("ScalarMap_i::SetRange = "<Update(); - myInput->GetUnstructuredGridOutput()->GetScalarRange(theRange); -} - -void VISU::ScalarMap_i::SetScalarMode(CORBA::Long theScalarMode){ - myScalarMode = theScalarMode; - vtkUnstructuredGridReader* aReader = - myResult->GetInput()->GetFieldOnMesh(myMeshName,(VISU::TEntity)myEntity,myFieldName,(int)myIteration); - if(aReader != NULL) { - if( MYDEBUG) MESSAGE("ScalarMap_i::SetScalarMode = "<Extract(aReader,aFieldName,myScalarMode,myField->myNbComp,myField->myEntity); - if(MYDEBUGWITHFILES){ - string aFileName = string("/users/")+getenv("USER")+"/"+getenv("USER"); - aFileName += "-ScalarMode.vtk"; - WriteToFile(myInput->GetUnstructuredGridOutput(),aFileName.c_str()); - } - } -} - -VISU::Storable* VISU::ScalarMapRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::ScalarMap_i* pResent = new VISU::ScalarMap_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::ScalarMap_i::~ScalarMap_i(){ - if(MYDEBUG) MESSAGE("ScalarMap_i::~ScalarMap_i()"); - myInput->Delete(); - myFieldTransform->Delete(); - myMapperTable->Delete(); - myBarTable->Delete(); -} - - -VISU::Storable* VISU::ScalarMap_i::Build(int theRestoring){ - if(MYDEBUG) - MESSAGE("ScalarMap_i::Build - "<GetInput() == NULL !!!"); - myField = &(myResult->GetInput()->GetField(myMeshName,(VISU::TEntity)myEntity,myFieldName)); - if(myField == NULL) throw std::runtime_error("There is no Field with the parameters !!!"); - SetScalarMode(myScalarMode); - if(myInput->GetInput() == NULL) throw std::runtime_error("Can't build build vtk representation !!!"); - vtkUnstructuredGrid *aDataSet = myInput->GetUnstructuredGridOutput(); - SetScaling(myScaling); - aDataSet->GetBounds(myBounds); - CORBA::String_var anIOR = GetID(); - const VISU::TField::TValField& aValField = myField->myValField; - const VISU::TField::TValForTime& aValForTime = aValField.find((int)myIteration)->second; - const VISU::TField::TTime& aTime = aValForTime.myTime; - QString aComment; - myName = "NoName"; - if(theRestoring == 0){ - if (!myIsFixedRange) aDataSet->GetScalarRange(myScalarRange); - aComment.sprintf("%s %s",myFieldName.c_str(),VISU_Convertor::GenerateName(aValForTime.myTime).c_str()); - //aComment.sprintf("%s, %g",myFieldName.c_str(),aTime.first); - myTitle = (const char*)(aComment.simplifyWhiteSpace()); - } - if (myAddToStudy) { - myName = (const char*)(GenerateName()); - aComment.sprintf("myComment=TIMESTAMP;myType=%d;myMeshName=%s;myEntityId=%d;myFieldName=%s;myTimeStampId=%d;myNumComponent=%d", - VISU::TTIMESTAMP,myMeshName.c_str(),myEntity,myFieldName.c_str(),(int)myIteration,myField->myNbComp); - string aResultEntry = myResult->GetEntry(); - string aRefFatherEntry = myResult->GetRefFatherEntry(); - string anEntry = FindEntryWithComment(myStudy,aResultEntry.c_str(),aComment.latin1()); - if(anEntry == "") throw std::runtime_error("There is no Entry for binding the presentation !!!"); - aComment.sprintf("myComment=%s;myMeshName=%s;myEntityId=%d;myFieldName=%s;myTimeStampId=%d;myNumComponent=%d;myComponentId=%d", - GetComment(),myMeshName.c_str(),myEntity,myFieldName.c_str(),(int)myIteration,myField->myNbComp,myScalarMode); - CreateAttributes(myStudy,anEntry.c_str(),aRefFatherEntry.c_str(), - anIOR,myName.c_str(),"",aComment.latin1(),true); - } - if(MYDEBUG) - MESSAGE("ScalarMap_i::Build - myFieldName = "<ScalarVisibilityOn(); - Update(); - return myFieldTransform->GetUnstructuredGridOutput(); -} - -void VISU::ScalarMap_i::Update() { - if (!myIsFixedRange) CalculateRange(); - - int aScaling = GetScaling() == VISU::LOGARITHMIC? VTK_SCALE_LOG10: VTK_SCALE_LINEAR; - float aScalarRange[2] = {myScalarRange[0], myScalarRange[1]}; - myMapperTable->SetScale(VTK_SCALE_LINEAR); - if(aScaling == VTK_SCALE_LOG10) - VISU_LookupTable::ComputeLogRange(myScalarRange,aScalarRange); - myMapperTable->SetRange(aScalarRange); - myMapper->SetScalarRange(aScalarRange); - myMapperTable->SetHueRange(0.667,0.0); - myMapperTable->SetNumberOfColors(myNumberOfColors); - myMapperTable->SetMapScale(myMapScale); - myMapperTable->Build(); - myMapper->SetLookupTable(myMapperTable); - myMapper->MapScalars(1.0f); - - myBarTable->SetHueRange(0.667,0.0); - myBarTable->SetNumberOfColors(myNumberOfColors); - myBarTable->SetRange(myScalarRange); - myBarTable->SetScale(aScaling); - myBarTable->Build(); - - VISU::Prs3d_i::Update(); -} - -void VISU::ScalarMap_i::SetMapScale(double theMapScale){ - if(MYDEBUG) MESSAGE("ScalarMap_i::SetMapScale() - theMapScale = "<SetBarVisibility(&myIsColored); - anActor->myFieldName = myFieldName; - anActor->GetProperty()->EdgeVisibilityOn(); - UpdateActor(anActor); - return anActor; - }else{ - anActor->Delete(); - return NULL; - } -} - -void VISU::ScalarMap_i::UpdateActor(VISU_Actor* theActor) { - if(VISUScalarMap_Actor* anActor = dynamic_cast(theActor)){ - VISU::Prs3d_i::UpdateActor(theActor); - theActor->SetVisibility(theActor->GetVisibility()); - VISU_ScalarBarActor * aScalarBar = anActor->GetScalarBar(); - aScalarBar->SetLookupTable(myBarTable); - aScalarBar->SetTitle(myTitle.c_str()); - aScalarBar->SetOrientation(myOrientation); - aScalarBar->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport(); - aScalarBar->GetPositionCoordinate()->SetValue(myPosition[0],myPosition[1]); - aScalarBar->SetWidth(myWidth); - aScalarBar->SetHeight(myHeight); - aScalarBar->SetNumberOfLabels(myNumberOfLabels); - aScalarBar->Modified(); - } -} - -//============================================================================== -int VISU::DeformedShape_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - try{ - if(!VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration)) return 0; - const VISU::TField& aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName); - return aField.myNbComp > 1; - }catch(std::runtime_error& exc){ - MESSAGE("Follow exception was accured :\n"<GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("DeformedShape_i::DeformedShape_i"); - myWarpVector = vtkWarpVector::New(); -} - -void VISU::DeformedShape_i::Destroy(){ - ScalarMap_i::Destroy(); -} - -void VISU::DeformedShape_i::SameAs(const DeformedShape_i* theOrigin) -{ - DeformedShape_i* aDefShape = const_cast(theOrigin); - setColored(aDefShape->isColored()); - SetScale(aDefShape->GetScale()); - VISU::ScalarMap_i::SameAs(theOrigin); -} - - -VISU::Storable* VISU::DeformedShape_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - myIsColored = false; - return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -VISU::Storable* VISU::DeformedShape_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - ScalarMap_i::Restore(theMap,false); - - myFactor = VISU::Storable::FindValue(theMap,"myFactor").toDouble(); - myIsColored = VISU::Storable::FindValue(theMap,"myIsColored").toInt(); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::DeformedShape_i::ToStream(std::ostringstream& theStr){ - ScalarMap_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myFactor", myFactor ); - Storable::DataToStream( theStr, "myIsColored", myIsColored ); -} - -VISU::Storable* VISU::DeformedShapeRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::DeformedShape_i* pResent = new VISU::DeformedShape_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::DeformedShape_i::~DeformedShape_i(){ - if(MYDEBUG) MESSAGE("DeformedShape_i::~DeformedShape_i()"); - myWarpVector->Delete(); -} - - -VISU::ScalarMap_i::DataType* VISU::DeformedShape_i::DoHook(int theRestoring){ - if(theRestoring == 0) - myFactor = ScaleFactor()/GetMax(); - if(MYDEBUG) MESSAGE("DeformedShape_i::DoHook() - myFactor = "<GetOutput(); -} - - -float VISU::DeformedShape_i::ScaleFactor() { - vtkUnstructuredGrid *aDataSet = myInput->GetUnstructuredGridOutput(); - aDataSet->Update(); - int nbCells = aDataSet->GetNumberOfCells(), nbPoints = aDataSet->GetNumberOfPoints(); - return ::CalcScaleFactor(myBounds, nbCells? nbCells: nbPoints); -} - -void VISU::DeformedShape_i::Update(){ - if(myField->myNbComp > 1){ - if(myField->myEntity == VISU::CELL_ENTITY){ - vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New(); - aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - aFilter->PassCellDataOn(); - myWarpVector->SetInput(aFilter->GetUnstructuredGridOutput()); - aFilter->Delete(); - }else - myWarpVector->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - myWarpVector->SetScaleFactor(myFactor*myMapScale); - myMapper->SetScalarVisibility(myIsColored); - } - ScalarMap_i::Update(); -} - -void VISU::DeformedShape_i::SetColor(const SALOMEDS::Color& theColor){ - VISU::Prs3d_i::SetColor(theColor); - myIsColored = false; -} - -void VISU::DeformedShape_i::SetMapScale(double theMapScale){ - myMapScale = theMapScale; - Update(); -} - -VISU_Actor* VISU::DeformedShape_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) { - VISU_Actor* anActor = VISU::ScalarMap_i::CreateActor(theIO); - anActor->SetRepresentation(1); - return anActor; -} - -void VISU::DeformedShape_i::UpdateActor(VISU_Actor* theActor) { - VISU::ScalarMap_i::UpdateActor(theActor); - if(!myIsColored) - theActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B); -} - -//============================================================================== -int VISU::CutPlanes_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration); -} - -int VISU::CutPlanes_i::myNbPresent = 0; -QString VISU::CutPlanes_i::GenerateName() { return VISU::GenerateName("CutPlanes",myNbPresent++);} - -const string VISU::CutPlanes_i::myComment = "CUTPLANES"; -const char* VISU::CutPlanes_i::GetComment() const { return myComment.c_str();} - -VISU::CutPlanes_i::CutPlanes_i(Result_i* theResult, bool theAddToStudy) : - PrsObject_i(theResult->GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("CutPlanes_i::CutPlanes_i"); - myAppendPolyData = vtkAppendPolyData::New(); -} - -void VISU::CutPlanes_i::Destroy(){ - ScalarMap_i::Destroy(); -} - -void VISU::CutPlanes_i::SameAs(const CutPlanes_i* theOrigin) -{ - CutPlanes_i* aCutPlanes = const_cast(theOrigin); - SetNbPlanes(aCutPlanes->GetNbPlanes()); - SetDisplacement(aCutPlanes->GetDisplacement()); - SetOrientationType(aCutPlanes->GetOrientationType()); - SetRotateX(aCutPlanes->GetRotateX()); - SetRotateY(aCutPlanes->GetRotateY()); - VISU::ScalarMap_i::SameAs(theOrigin); -} - -VISU::Storable* VISU::CutPlanes_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -VISU::Storable* VISU::CutPlanes_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - ScalarMap_i::Restore(theMap,false); - - myNbPlanes = VISU::Storable::FindValue(theMap,"myNbPlanes").toInt(); - myDisplacement = VISU::Storable::FindValue(theMap,"myDisplacement").toDouble(); - myBasePlane = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane").toInt(); - SetOrientationType(myBasePlane); - float aRot[2]; - aRot[0] = VISU::Storable::FindValue(theMap,"aRot[0]").toDouble(); - SetRotateX(aRot[0]); - aRot[1] = VISU::Storable::FindValue(theMap,"aRot[1]").toDouble(); - SetRotateY(aRot[1]); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::CutPlanes_i::ToStream(std::ostringstream& theStr){ - ScalarMap_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myNbPlanes", myNbPlanes ); - Storable::DataToStream( theStr, "myDisplacement", myDisplacement ); - Storable::DataToStream( theStr, "myBasePlane", myBasePlane ); - Storable::DataToStream( theStr, "aRot[0]", GetRotateX() ); - Storable::DataToStream( theStr, "aRot[1]", GetRotateY() ); -} - -VISU::Storable* VISU::CutPlanesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::CutPlanes_i* pResent = new VISU::CutPlanes_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::CutPlanes_i::~CutPlanes_i(){ - if(MYDEBUG) MESSAGE("CutPlanes_i::~CutPlanes_i()"); - myAppendPolyData->Delete(); -} - - -float* GetIdent(float theR[3][3]){ - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++) - theR[i][j] = (i==j? 1.0: 0.0); - return theR[0]; -} - - -float* GetRx(float theRx[3][3], float thaAng){ - theRx[0][0] = 1.0; theRx[0][1] = 0.0; theRx[0][2] = 0.0; - theRx[1][0] = 0.0; theRx[1][1] = cos(thaAng); theRx[1][2] = -sin(thaAng); - theRx[2][0] = 0.0; theRx[2][1] = sin(thaAng); theRx[2][2] = cos(thaAng); - return theRx[0]; -} - - -float* GetRy(float theRy[3][3], float thaAng){ - theRy[0][0] = cos(thaAng); theRy[0][1] = 0.0; theRy[0][2] = sin(thaAng); - theRy[1][0] = 0.0; theRy[1][1] = 1.0; theRy[1][2] = 0.0; - theRy[2][0] = -sin(thaAng); theRy[2][1] = 0.0; theRy[2][2] = cos(thaAng); - return theRy[0]; -} - - -float* GetRz(float theRz[3][3], float thaAng){ - theRz[0][0] = cos(thaAng); theRz[0][1] = -sin(thaAng); theRz[0][2] = 0.0; - theRz[1][0] = sin(thaAng); theRz[1][1] = cos(thaAng); theRz[1][2] = 0.0; - theRz[2][0] = 0.0; theRz[2][1] = 0.0; theRz[2][2] = 1.0; - return theRz[0]; -} - - -void MulMatrix(float C[3][3], const float A[3][3], const float B[3][3]){ // C = A*B; - for(int i = 0; i < 3; i++) - for(int j = 0; j < 3; j++){ - C[i][j] = 0.0; - for(int k = 0; k < 3; k++) - C[i][j] += A[i][k]*B[k][j]; - } -} - - -void Sub(float C[3], const float A[3], float B[3]){ // AxB; - for(int i = 0; i < 3; i++) C[i] = B[i] - A[i]; -} - -float DotMul(const float A[3], const float B[3]){ // A*B; - float C = 0.0; - for(int i = 0; i < 3; i++) C += A[i]*B[i]; - return C; -} - -void Mul(float C[3], const float A[3], float B[3]){ // AxB; - C[0] = A[1]*B[2] - A[2]*B[1]; - C[1] = A[2]*B[0] - A[0]*B[2]; - C[2] = A[0]*B[1] - A[1]*B[0]; -} - -void Mul(float C[3], const float A[3], float B){ // A*B; - for(int i = 0; i < 3; i++) C[i] = A[i]*B; -} - -void CorrectPnt(float thePnt[3], const float BoundPrj[3]){ - for(int i = 0, j = 0; i < 3; ++i, j=2*i){ - if(thePnt[i] < BoundPrj[j]) thePnt[i] = BoundPrj[j]; - if(thePnt[i] > BoundPrj[j+1]) thePnt[i] = BoundPrj[j+1]; - } -} - -void GetBoundProject(float BoundPrj[3], const float BoundBox[6], const float Dir[3]){ - float BoundPoints[8][3] = { {BoundBox[0],BoundBox[2],BoundBox[4]}, - {BoundBox[1],BoundBox[2],BoundBox[4]}, - {BoundBox[0],BoundBox[3],BoundBox[4]}, - {BoundBox[1],BoundBox[3],BoundBox[4]}, - {BoundBox[0],BoundBox[2],BoundBox[5]}, - {BoundBox[1],BoundBox[2],BoundBox[5]}, - {BoundBox[0],BoundBox[3],BoundBox[5]}, - {BoundBox[1],BoundBox[3],BoundBox[5]}}; - BoundPrj[0] = DotMul(Dir,BoundPoints[0]), BoundPrj[1] = BoundPrj[0]; - float tmp; - for(int i = 1; i < 8; i++){ - tmp = DotMul(Dir,BoundPoints[i]); - if(BoundPrj[1] < tmp) BoundPrj[1] = tmp; - if(BoundPrj[0] > tmp) BoundPrj[0] = tmp; - } - BoundPrj[2] = BoundPrj[1] - BoundPrj[0]; - BoundPrj[1] = BoundPrj[0] + (1.0 - EPS)*BoundPrj[2]; - BoundPrj[0] = BoundPrj[0] + EPS*BoundPrj[2]; - BoundPrj[2] = BoundPrj[1] - BoundPrj[0]; -} - -void VISU::CutPlanes_i::SetRotateX(CORBA::Double theAng){ - if(myBasePlane == VISU::CutPlanes::XY) - myAng[0] = theAng; - else if(myBasePlane == VISU::CutPlanes::YZ) - myAng[1] = theAng; - else if(myBasePlane == VISU::CutPlanes::ZX) - myAng[2] = theAng; -} - -CORBA::Double VISU::CutPlanes_i::GetRotateX(){ - if(myBasePlane == VISU::CutPlanes::XY) - return myAng[0]; - else if(myBasePlane == VISU::CutPlanes::YZ) - return myAng[1]; - else if(myBasePlane == VISU::CutPlanes::ZX) - return myAng[2]; -} - -void VISU::CutPlanes_i::SetRotateY(CORBA::Double theAng){ - if(myBasePlane == VISU::CutPlanes::XY) - myAng[1] = theAng; - else if(myBasePlane == VISU::CutPlanes::YZ) - myAng[2] = theAng; - else if(myBasePlane == VISU::CutPlanes::ZX) - myAng[0] = theAng; -} - -CORBA::Double VISU::CutPlanes_i::GetRotateY(){ - if(myBasePlane == VISU::CutPlanes::XY) - return myAng[1]; - else if(myBasePlane == VISU::CutPlanes::YZ) - return myAng[2]; - else if(myBasePlane == VISU::CutPlanes::ZX) - return myAng[0]; -} - -void GetDir(float theDir[3], float theAng[3], - const VISU::CutPlanes::Orientation& theBasePlane) -{ - int iPlane = 0; - float aRx[3][3], aRy[3][3], aRz[3][3], aRotation[3][3]; - if(theBasePlane == VISU::CutPlanes::XY){ // X-Y - if(fabs(theAng[0]) > EPS) ::GetRx(aRx,theAng[0]); else ::GetIdent(aRx); - if(fabs(theAng[1]) > EPS) ::GetRy(aRy,theAng[1]); else ::GetIdent(aRy); - ::MulMatrix(aRotation,aRx,aRy); - iPlane = 2; - }else if(theBasePlane == VISU::CutPlanes::YZ){ // Y-Z - if(fabs(theAng[1]) > EPS) ::GetRy(aRy,theAng[1]); else ::GetIdent(aRy); - if(fabs(theAng[2]) > EPS) ::GetRz(aRz,theAng[2]); else ::GetIdent(aRz); - ::MulMatrix(aRotation,aRy,aRz); - iPlane = 0; - }else if(theBasePlane == VISU::CutPlanes::ZX){ // Z-X - if(fabs(theAng[2]) > EPS) ::GetRz(aRz,theAng[2]); else ::GetIdent(aRz); - if(fabs(theAng[0]) > EPS) ::GetRx(aRx,theAng[0]); else ::GetIdent(aRx); - ::MulMatrix(aRotation,aRz,aRx); - iPlane = 1; - } - for(int i = 0; i < 3; i++) theDir[i] = aRotation[i][iPlane]; -} - -void CutWithPlane(vtkAppendPolyData* theAppendPolyData, vtkDataSet* theDataSet, - float theDir[3], float theOrig[3]) -{ - vtkCutter *aCutPlane = vtkCutter::New(); - aCutPlane->SetInput(theDataSet); - vtkPlane *aPlane = vtkPlane::New(); - aPlane->SetOrigin(theOrig); - - aPlane->SetNormal(theDir); - aCutPlane->SetCutFunction(aPlane); - aPlane->Delete(); - theAppendPolyData->AddInput(aCutPlane->GetOutput()); - aCutPlane->Delete(); -} - -void CutWithPlanes(vtkAppendPolyData* theAppendPolyData, vtkDataSet* theDataSet, - int theNbPlanes, float theDir[3], float theBounds[6], float theDisplacement) -{ - float aInvDir[3], aBoundPrj[3], aOrig[3], aPosition; - ::Mul(aInvDir,theDir,-1.0); - ::GetBoundProject(aBoundPrj, theBounds, theDir); - if(theNbPlanes > 1){ - float aDBoundPrj = aBoundPrj[2]/(theNbPlanes - 1); - float aDisplacement = aDBoundPrj*theDisplacement; - float aStartPosition = aBoundPrj[0] - 0.5*aDBoundPrj + aDisplacement; - for (int i = 0; i < theNbPlanes; i++){ - aPosition = aStartPosition + i*aDBoundPrj; - float aDelta = (aBoundPrj[0] - aPosition) / aBoundPrj[2]; - if(aDelta > 0) - aPosition = aBoundPrj[0]; - //if(fabs(aDelta) < EPS) aPosition = aBoundPrj[0]; else continue; - aDelta = (aBoundPrj[2] - aPosition) / aBoundPrj[2]; - if(aDelta < 0) - aPosition = aBoundPrj[2]; - //if(fabs(aDelta) < EPS) aPosition = aBoundPrj[2]; else continue; - Mul(aOrig,theDir,aPosition); - if(i != 0) - CutWithPlane(theAppendPolyData,theDataSet,theDir,aOrig); - else - CutWithPlane(theAppendPolyData,theDataSet,aInvDir,aOrig); - } - }else{ - aPosition = aBoundPrj[0] + aBoundPrj[2]*theDisplacement; - Mul(aOrig,theDir,aPosition); - CutWithPlane(theAppendPolyData,theDataSet,theDir,aOrig); - } -} - -VISU::ScalarMap_i::DataType* VISU::CutPlanes_i::DoHook(int theRestoring){ - if(theRestoring == 0){ - myNbPlanes = 10; - myDisplacement = 0.5; - myBasePlane = VISU::CutPlanes::XY; - myAng[0] = myAng[1] = myAng[2] = 0.0; - } - if(MYDEBUG) - MESSAGE("CutPlanes_i::DoHook() - myNbPlanes = "<GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("CutLines_i::CutLines_i"); - myAppendPolyData = vtkAppendPolyData::New(); -} - -void VISU::CutLines_i::Destroy(){ - ScalarMap_i::Destroy(); -} - -void VISU::CutLines_i::SameAs(const CutLines_i* theOrigin) -{ - CutLines_i* aCutLines = const_cast(theOrigin); - SetNbLines(aCutLines->GetNbLines()); - SetDisplacement(aCutLines->GetDisplacement()); - SetDisplacement2(aCutLines->GetDisplacement2()); - SetOrientationType(aCutLines->GetOrientationType()); - SetOrientationType2(aCutLines->GetOrientationType2()); - SetRotateX(aCutLines->GetRotateX()); - SetRotateY(aCutLines->GetRotateY()); - SetRotateX2(aCutLines->GetRotateX2()); - SetRotateY2(aCutLines->GetRotateY2()); - VISU::ScalarMap_i::SameAs(theOrigin); -} - -VISU::Storable* VISU::CutLines_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -VISU::Storable* VISU::CutLines_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - ScalarMap_i::Restore(theMap,false); - myNbLines = VISU::Storable::FindValue(theMap,"myNbLines").toInt(); - myDisplacement[0] = VISU::Storable::FindValue(theMap,"myDisplacement[0]").toDouble(); - myDisplacement[1] = VISU::Storable::FindValue(theMap,"myDisplacement[1]").toDouble(); - myBasePlane[0] = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane[0]").toInt(); - myBasePlane[1] = (VISU::CutPlanes::Orientation)VISU::Storable::FindValue(theMap,"myBasePlane[1]").toInt(); - SetOrientationType(myBasePlane[0]); - SetOrientationType2(myBasePlane[1]); - float aRot[2]; - aRot[0] = VISU::Storable::FindValue(theMap,"aRot[0][0]").toDouble(); - SetRotateX(aRot[0]); - aRot[1] = VISU::Storable::FindValue(theMap,"aRot[0][1]").toDouble(); - SetRotateY(aRot[1]); - aRot[0] = VISU::Storable::FindValue(theMap,"aRot[1][0]").toDouble(); - SetRotateX2(aRot[0]); - aRot[1] = VISU::Storable::FindValue(theMap,"aRot[1][1]").toDouble(); - SetRotateY2(aRot[1]); - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::CutLines_i::ToStream(std::ostringstream& theStr){ - ScalarMap_i::ToStream(theStr); - Storable::DataToStream( theStr, "myNbLines", myNbLines ); - Storable::DataToStream( theStr, "myDisplacement[0]", myDisplacement[0] ); - Storable::DataToStream( theStr, "myDisplacement[1]", myDisplacement[1] ); - Storable::DataToStream( theStr, "myBasePlane[0]", myBasePlane[0] ); - Storable::DataToStream( theStr, "myBasePlane[1]", myBasePlane[1] ); - Storable::DataToStream( theStr, "aRot[0][0]", GetRotateX() ); - Storable::DataToStream( theStr, "aRot[0][1]", GetRotateY() ); - Storable::DataToStream( theStr, "aRot[1][0]", GetRotateX2() ); - Storable::DataToStream( theStr, "aRot[1][1]", GetRotateY2() ); -} - -VISU::Storable* VISU::CutLinesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::CutLines_i* pResent = new VISU::CutLines_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::CutLines_i::~CutLines_i(){ - if(MYDEBUG) MESSAGE("CutLines_i::~CutLines_i()"); - myAppendPolyData->Delete(); -} - -void VISU::CutLines_i::SetRotateX(CORBA::Double theAng){ - if(myBasePlane[0] == VISU::CutPlanes::XY) - myAng[0][0] = theAng; - else if(myBasePlane[0] == VISU::CutPlanes::YZ) - myAng[0][1] = theAng; - else if(myBasePlane[0] == VISU::CutPlanes::ZX) - myAng[0][2] = theAng; -} - -CORBA::Double VISU::CutLines_i::GetRotateX(){ - if(myBasePlane[0] == VISU::CutPlanes::XY) - return myAng[0][0]; - else if(myBasePlane[0] == VISU::CutPlanes::YZ) - return myAng[0][1]; - else if(myBasePlane[0] == VISU::CutPlanes::ZX) - return myAng[0][2]; -} - -void VISU::CutLines_i::SetRotateY(CORBA::Double theAng){ - if(myBasePlane[0] == VISU::CutPlanes::XY) - myAng[0][1] = theAng; - else if(myBasePlane[0] == VISU::CutPlanes::YZ) - myAng[0][2] = theAng; - else if(myBasePlane[0] == VISU::CutPlanes::ZX) - myAng[0][0] = theAng; -} - -CORBA::Double VISU::CutLines_i::GetRotateY(){ - if(myBasePlane[0] == VISU::CutPlanes::XY) - return myAng[0][1]; - else if(myBasePlane[0] == VISU::CutPlanes::YZ) - return myAng[0][2]; - else if(myBasePlane[0] == VISU::CutPlanes::ZX) - return myAng[0][0]; -} - -void VISU::CutLines_i::SetRotateX2(CORBA::Double theAng){ - if(myBasePlane[1] == VISU::CutPlanes::XY) - myAng[1][0] = theAng; - else if(myBasePlane[1] == VISU::CutPlanes::YZ) - myAng[1][1] = theAng; - else if(myBasePlane[1] == VISU::CutPlanes::ZX) - myAng[1][2] = theAng; -} - -CORBA::Double VISU::CutLines_i::GetRotateX2(){ - if(myBasePlane[1] == VISU::CutPlanes::XY) - return myAng[1][0]; - else if(myBasePlane[1] == VISU::CutPlanes::YZ) - return myAng[1][1]; - else if(myBasePlane[1] == VISU::CutPlanes::ZX) - return myAng[1][2]; -} - -void VISU::CutLines_i::SetRotateY2(CORBA::Double theAng){ - if(myBasePlane[1] == VISU::CutPlanes::XY) - myAng[1][1] = theAng; - else if(myBasePlane[1] == VISU::CutPlanes::YZ) - myAng[1][2] = theAng; - else if(myBasePlane[1] == VISU::CutPlanes::ZX) - myAng[1][0] = theAng; -} - -CORBA::Double VISU::CutLines_i::GetRotateY2(){ - if(myBasePlane[1] == VISU::CutPlanes::XY) - return myAng[1][1]; - else if(myBasePlane[1] == VISU::CutPlanes::YZ) - return myAng[1][2]; - else if(myBasePlane[1] == VISU::CutPlanes::ZX) - return myAng[1][0]; -} - -VISU::ScalarMap_i::DataType* VISU::CutLines_i::DoHook(int theRestoring){ - if(theRestoring == 0){ - myNbLines = 10; - myDisplacement[0] = myDisplacement[1] = 0.5; - myAng[0][0] = myAng[0][1] = myAng[0][2] = 0.0; - myAng[1][0] = myAng[1][1] = myAng[1][2] = 0.0; - myBasePlane[0] = VISU::CutPlanes::ZX; - myBasePlane[1] = VISU::CutPlanes::XY; - } - Update(); - return myAppendPolyData->GetOutput(); -} - -void ClearAppendPolyData(vtkAppendPolyData *theAppendPolyData){ - int iEnd = theAppendPolyData->GetNumberOfInputs(); - for(int i = iEnd-1; i >= 0; i--) - theAppendPolyData->RemoveInput(theAppendPolyData->GetInput(i)); -} - -void VISU::CutLines_i::Update(){ - ::ClearAppendPolyData(myAppendPolyData); - vtkAppendPolyData *anAppendPolyData = vtkAppendPolyData::New(); - //Build base plane - float aDir[2][3]; - ::GetDir(aDir[0],myAng[0],myBasePlane[0]); - ::CutWithPlanes(anAppendPolyData,myFieldTransform->GetUnstructuredGridOutput(),1,aDir[0],myBounds,myDisplacement[0]); - anAppendPolyData->Update(); - vtkPolyData *aPolyData = anAppendPolyData->GetOutput(); - if(MYDEBUG) MESSAGE("CutPlanes_i::Update - aPolyData->GetNumberOfCells() = "<GetNumberOfCells()); - if(aPolyData->GetNumberOfCells() == 0){ - ::ClearAppendPolyData(anAppendPolyData); - vtkGeometryFilter *aGeomFilter = vtkGeometryFilter::New(); - aGeomFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - anAppendPolyData->AddInput(aGeomFilter->GetOutput()); - aGeomFilter->Delete(); - anAppendPolyData->Update(); - } - //Build lines - float aBounds[6]; - aPolyData = anAppendPolyData->GetOutput(); - aPolyData->GetBounds(aBounds); - ::GetDir(aDir[1],myAng[1],myBasePlane[1]); - ::CutWithPlanes(myAppendPolyData,aPolyData,GetNbLines(),aDir[1],aBounds,myDisplacement[1]); - anAppendPolyData->Delete(); - //Calculate values for building of table - ::Mul(myDirLn,aDir[0],aDir[1]); - ::GetBoundProject(myBoundPrjLn, myBounds, myDirLn); - Mul(myBasePnt,myDirLn,myBoundPrjLn[0]); - CorrectPnt(myBasePnt,myBounds); - myMapper->ScalarVisibilityOn(); - VISU::ScalarMap_i::Update(); -} - -void VISU::CutLines_i::BuildTableOfReal(SALOMEDS::SObject_ptr theSObject){ - if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal"); - Update(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); - anAttr = aStudyBuilder->FindOrCreateAttribute(theSObject, "AttributeTableOfReal"); - SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr); - - typedef set TLineCont; - typedef map TXMap; - typedef map TXYMap; - typedef vector TCurveVect; - - const VISU::TField::TValField& aValField = myField->myValField; - const VISU::TField::TValForTime& aValForTime = aValField.find((int)myIteration)->second; - const VISU::TField::TTime& aTime = aValForTime.myTime; - QString aTitle; - //aTitle.sprintf("%s %s",myTitle.c_str(),aTime.second.c_str()); - aTitle.sprintf("%s",myTitle.c_str()); - aTitle = aTitle.simplifyWhiteSpace(); - aTableOfReal->SetTitle(aTitle.latin1()); - - myAppendPolyData->Update(); - int iLineEnd = myAppendPolyData->GetNumberOfInputs(); - if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal iLineEnd = "<GetInput(iLine); - aDataSet->Update(); - int aNbPoints = aDataSet->GetNumberOfPoints(); - if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal iLine = "< 2){ - TXYMap::const_iterator aXYMapIter[2] = {aXYMap.begin(), ++aXYMap.begin()}; - aNewXYMap[aXYMapIter[0]->first] = aXYMapIter[0]->second; - for(; aXYMapIter[1] != aXYMap.end(); aXYMapIter[0]++, aXYMapIter[1]++){ - float aY[3] = {aXYMapIter[0]->second, aXYMapIter[1]->second, 0.0}; - aY[2] = (aY[0] + aY[1])/2.0; - float aX[3] = {aXYMapIter[0]->first, aXYMapIter[1]->first, 0.0}; - aX[2] = (aX[0] + aX[1])/2.0; - aNewXYMap[aX[2]] = aY[2]; - aXMap[aX[2]].insert(iLine); - } - aNewXYMap[aXYMapIter[0]->first] = aXYMapIter[0]->second; - aXYMap = aNewXYMap; - } - } - QString aString; - aTableOfReal->SetNbColumns(aXMap.size()); - TXMap::const_iterator aXMapIter = aXMap.begin(); - for(long i = 0; aXMapIter != aXMap.end(); aXMapIter++, i++){ - float aDist = aXMapIter->first; - aTableOfReal->PutValue(aDist,1,i+1); - aString.sprintf("%d",i); - aTableOfReal->SetColumnTitle(i+1,aString.latin1()); - const TLineCont& aLineCont = aXMapIter->second; - long jEnd = aLineCont.size(); - if(0&& MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal aDist = "<myUnitNames[0].c_str(); - if(myScalarMode != 0) - aUnitName = myField->myUnitNames[myScalarMode-1].c_str(); - aUnitName = aUnitName.simplifyWhiteSpace(); - for(long i = 0; aLineContIter != aLineCont.end(); aLineContIter++, i++){ - long iLine = *aLineContIter; - aString.sprintf("Y%d",iLine); - aTableOfReal->SetRowTitle(i+2,aString.latin1()); - aTableOfReal->SetRowUnit(i+2,aUnitName.latin1()); - } -} - -//============================================================================== -int VISU::IsoSurfaces_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration); -} - -int VISU::IsoSurfaces_i::myNbPresent = 0; -QString VISU::IsoSurfaces_i::GenerateName() { return VISU::GenerateName("IsoSurfaces",myNbPresent++);} - -const string VISU::IsoSurfaces_i::myComment = "ISOSURFACES"; -const char* VISU::IsoSurfaces_i::GetComment() const { return myComment.c_str();} - -VISU::IsoSurfaces_i::IsoSurfaces_i(Result_i* theResult, bool theAddToStudy) : - PrsObject_i(theResult->GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("IsoSurfaces_i::IsoSurfaces_i"); - myContourFilter = vtkContourFilter::New(); -} - -void VISU::IsoSurfaces_i::Destroy(){ - ScalarMap_i::Destroy(); -} - -void VISU::IsoSurfaces_i::SameAs(const IsoSurfaces_i* theOrigin) { - IsoSurfaces_i* aIsoSurfaces = const_cast(theOrigin); - SetNbSurfaces(aIsoSurfaces->GetNbSurfaces()); - SetRange(aIsoSurfaces->GetRangeMin(), aIsoSurfaces->GetRangeMax()); - VISU::ScalarMap_i::SameAs(theOrigin); -} - -VISU::Storable* VISU::IsoSurfaces_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - myNbSurface = 10; - myRange[0] = 0; - myRange[1] = 0; - return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -VISU::Storable* VISU::IsoSurfaces_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - ScalarMap_i::Restore(theMap,false); - - myNbSurface = VISU::Storable::FindValue(theMap,"myNbSurface").toInt(); - myRange[0] = VISU::Storable::FindValue(theMap,"myRange[0]").toDouble(); - myRange[1] = VISU::Storable::FindValue(theMap,"myRange[1]").toDouble(); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::IsoSurfaces_i::ToStream(std::ostringstream& theStr){ - ScalarMap_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myNbSurface", myNbSurface ); - Storable::DataToStream( theStr, "myRange[0]", myRange[0] ); - Storable::DataToStream( theStr, "myRange[1]", myRange[1] ); -} - -VISU::Storable* VISU::IsoSurfacesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::IsoSurfaces_i* pResent = new VISU::IsoSurfaces_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::IsoSurfaces_i::~IsoSurfaces_i(){ - if(MYDEBUG) MESSAGE("IsoSurfaces_i::~IsoSurfaces_i()"); - myContourFilter->Delete(); -} - -void VISU::IsoSurfaces_i::SetRange(float theMin, float theMax){ - if(theMin <= theMax){ - myRange[0] = theMin; myRange[1] = theMax; - } -} - -VISU::ScalarMap_i::DataType* VISU::IsoSurfaces_i::DoHook(int theRestoring){ - if(MYDEBUG) MESSAGE("IsoSurfaces_i::DoHook() - myNbSurface = "<GetOutput(); -} - - -void VISU::IsoSurfaces_i::Update(){ - if(myField->myEntity == VISU::CELL_ENTITY){ - vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New(); - aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - aFilter->PassCellDataOn(); - myContourFilter->SetInput(aFilter->GetOutput()); - aFilter->Delete(); - } else - myContourFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - int aNbSurface = (int)(myMapScale*myNbSurface); - if(aNbSurface < 1) aNbSurface = 1; - if(GetScaling() == VISU::LOGARITHMIC){ - float aLogRange[2]; - VISU_LookupTable::ComputeLogRange(myRange,aLogRange); - myContourFilter->GenerateValues(aNbSurface,aLogRange); - }else - myContourFilter->GenerateValues(aNbSurface,myRange); - myMapper->ScalarVisibilityOn(); - VISU::ScalarMap_i::Update(); -} - -void VISU::IsoSurfaces_i::SetMapScale(double theMapScale){ - myMapScale = theMapScale; - Update(); -} - -//============================================================================== -int VISU::StreamLines_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return DeformedShape_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration); -} - -int VISU::StreamLines_i::myNbPresent = 0; -QString VISU::StreamLines_i::GenerateName() { return VISU::GenerateName("StreamLines",myNbPresent++);} - -const string VISU::StreamLines_i::myComment = "STREAMLINES"; -const char* VISU::StreamLines_i::GetComment() const { return myComment.c_str();} - -VISU::StreamLines_i::StreamLines_i(Result_i* theResult, bool theAddToStudy) : - PrsObject_i(theResult->GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy), - DeformedShape_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("StreamLines_i::StreamLines_i"); - myStream = vtkStreamLine::New(); -} - -void VISU::StreamLines_i::Destroy(){ - DeformedShape_i::Destroy(); -} - -VISU::Storable* VISU::StreamLines_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration) -{ - return DeformedShape_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -void VISU::StreamLines_i::SameAs(const StreamLines_i* theOrigin) { - myPrs3di = NULL; - StreamLines_i* aIsoLines = const_cast(theOrigin); - SetDirection(aIsoLines->GetDirection()); - SetStepLength(aIsoLines->GetStepLength()); - SetIntegrationStep(aIsoLines->GetIntegrationStep()); - SetPropagationTime(aIsoLines->GetPropagationTime()); - VISU::DeformedShape_i::SameAs(theOrigin); - SetUsedPoints(aIsoLines->GetUsedPoints()); -} - -VISU::Storable* VISU::StreamLines_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - DeformedShape_i::Restore(theMap,false); - - myStepLength = VISU::Storable::FindValue(theMap,"myStepLength").toDouble(); - myIntegrationStep = VISU::Storable::FindValue(theMap,"myIntegrationStep").toDouble(); - myPropagationTime = VISU::Storable::FindValue(theMap,"myPropagationTime").toDouble(); - myDirection = (VISU::StreamLines::Direction) VISU::Storable::FindValue(theMap,"myDirection").toInt(); - mySourceEntry = VISU::Storable::FindValue(theMap,"mySourceEntry").latin1(); - myPercents = VISU::Storable::FindValue(theMap,"myPercents").toDouble(); - myPrs3di = NULL; - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::StreamLines_i::ToStream(std::ostringstream& theStr){ - DeformedShape_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myStepLength", myStepLength ); - Storable::DataToStream( theStr, "myIntegrationStep", myIntegrationStep ); - Storable::DataToStream( theStr, "myPropagationTime", myPropagationTime ); - Storable::DataToStream( theStr, "myDirection", (int)myDirection ); - Storable::DataToStream( theStr, "mySourceEntry", mySourceEntry.c_str()); - Storable::DataToStream( theStr, "myPercents", myPercents ); - -} - -VISU::Storable* VISU::StreamLinesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::StreamLines_i* pResent = new VISU::StreamLines_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::StreamLines_i::~StreamLines_i(){ - if(MYDEBUG) MESSAGE("StreamLines_i::~StreamLines_i()"); - myStream->Delete(); -} - -void VISU::StreamLines_i::SetSource(VISU::Prs3d_ptr thePrs3d){ - if(thePrs3d->_is_nil()) { - myPrs3di = NULL; - mySourceEntry = ""; - } else { - myPrs3di = dynamic_cast(GetServant(thePrs3d)); - CORBA::String_var aString = thePrs3d->GetID(); - SALOMEDS::SObject_var aSObject = myStudy->FindObjectIOR(aString); - aString = aSObject->GetID(); - mySourceEntry = aString.in(); - } -} - -VISU::Prs3d_ptr VISU::StreamLines_i::GetSource(){ - VISU::Prs3d_var aPrs3d; - if(MYDEBUG) MESSAGE("StreamLines_i::GetSource() mySourceEntry = '"<FindObjectID(mySourceEntry.c_str()); - CORBA::Object_var anObj = SObjectToObject(aSObject); - if(!CORBA::is_nil(anObj)){ - aPrs3d = VISU::Prs3d::_narrow(anObj); - if(!aPrs3d->_is_nil()) - myPrs3di = dynamic_cast(GetServant(aPrs3d.in())); - } - } - return aPrs3d._retn(); -} - -// in this method we calculate minimal width of the dataset -// at least three integration steps could be in this width -float VISU::StreamLines_i::GetMaxIntegrationStep() { - float aMaxSizeY = fabs(myBounds[2] - myBounds[3]); - float aMaxSizeZ = fabs(myBounds[4] - myBounds[5]); - float aMinMax = fabs(myBounds[0] - myBounds[1]); - if (aMinMax < 1.0e-20 || (aMaxSizeY < aMinMax && aMaxSizeY > 1.0e-20)) aMinMax = aMaxSizeY; - if (aMinMax < 1.0e-20 || (aMaxSizeZ < aMinMax && aMaxSizeZ > 1.0e-20)) aMinMax = aMaxSizeZ; - return aMinMax / 2.0; -} - -float VISU::StreamLines_i::GetMinIntegrationStep() { - float aVolume = 1; - float degree = 0; - if (fabs(myBounds[0] - myBounds[1]) > 1.0e-20 ) { - aVolume *= fabs(myBounds[0] - myBounds[1]); - degree+=1.0; - } - if (fabs(myBounds[2] - myBounds[3]) > 1.0e-20 ) { - aVolume *= fabs(myBounds[2] - myBounds[3]); - degree+=1.0; - } - if (fabs(myBounds[4] - myBounds[5]) > 1.0e-20 ) { - aVolume *= fabs(myBounds[4] - myBounds[5]); - degree+=1.0; - } - if (degree < 0.5) return 0.0; // absolutely empty object - float anAverageVolume = aVolume / 1.0e+8; // we have to use no more, than 1GB memory (approx) - return pow((double)(anAverageVolume), (double)(1.0 / degree)); -} - -float VISU::StreamLines_i::GetBasePropagationTime() { - return myFieldTransform->GetUnstructuredGridOutput()->GetLength() / (GetMax() + GetMin()) * 2.0; -} - -VISU::ScalarMap_i::DataType* VISU::StreamLines_i::DoHook(int theRestoring){ - if(theRestoring == 0){ - myDirection = VISU::StreamLines::BOTH; - vtkDataSet *aDataSet = myFieldTransform->GetUnstructuredGridOutput(); - aDataSet->Update(); - - myIntegrationStep = GetMaxIntegrationStep() / 10.0; - float aMinMax = aDataSet->GetLength() / - (sqrt((float)(aDataSet->GetNumberOfPoints() + aDataSet->GetNumberOfCells()))+1.0); - if (aMinMax > myIntegrationStep) myIntegrationStep = (myIntegrationStep * 9.0 + aMinMax) / 10.0; - if (myIntegrationStep < GetMinIntegrationStep()) myIntegrationStep = GetMinIntegrationStep(); - - myPropagationTime = GetBasePropagationTime(); - myStepLength = myPropagationTime / 20.; - if (myStepLength > myIntegrationStep * 2) myStepLength = myIntegrationStep * 2; - if (myStepLength < myPropagationTime / 100.) myStepLength = myPropagationTime / 100.; - - myPrs3di = NULL; - myPercents = 0.3; - } - Update(); - return myStream->GetOutput(); -} - - -void SetStreamerSource(vtkStreamer *theStreamer, vtkDataSet* theDataSet, - VISU::Prs3d_i* thePrs3di, float thePercents) -{ - if(thePrs3di) - theDataSet = thePrs3di->GetMapper()->GetInput(); - theDataSet->Modified(); - theDataSet->Update(); - vtkMaskPoints *aMaskPoints = vtkMaskPoints::New(); - aMaskPoints->SetInput(theDataSet); - //aMaskPoints->RandomModeOn(); - int aNbPoints = (int)(theDataSet->GetNumberOfPoints()*thePercents); - if(MYDEBUG) MESSAGE("SetStreamerSource aNbPoints = "<GetNumberOfPoints()<<";\t"<SetMaximumNumberOfPoints(aNbPoints); - theStreamer->SetSource(aMaskPoints->GetOutput()); - aMaskPoints->Delete(); -} - -void VISU::StreamLines_i::Update(){ - //apo - myStream->DebugOn(); - VISU::Prs3d_var aPrs3d = GetSource(); - if(myField->myNbComp > 1){ - myStream->SetStepLength(myStepLength); - myStream->SetIntegrationStepLength(myIntegrationStep); - myStream->SetMaximumPropagationTime(myPropagationTime); - if(myField->myEntity == VISU::CELL_ENTITY){ - vtkCellDataToPointData *aFilter = vtkCellDataToPointData::New(); - aFilter->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - aFilter->PassCellDataOn(); - myStream->SetInput(aFilter->GetOutput()); - aFilter->Delete(); - vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells - centers->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - centers->VertexCellsOn(); - //myStream->SetSource(centers->GetOutput()); - SetStreamerSource(myStream,centers->GetOutput(),myPrs3di,myPercents); - centers->Delete(); - }else{ - myStream->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - //myStream->SetSource(myFieldTransform->GetUnstructuredGridOutput()); - SetStreamerSource(myStream,myFieldTransform->GetUnstructuredGridOutput(),myPrs3di,myPercents); - } - switch (myDirection) { - case VISU::StreamLines::FORWARD: - myStream->SetIntegrationDirectionToForward(); - break; - case VISU::StreamLines::BACKWARD: - myStream->SetIntegrationDirectionToBackward(); - break; - case VISU::StreamLines::BOTH: - myStream->SetIntegrationDirectionToIntegrateBothDirections(); - } - } - myStream->Modified(); - VISU::DeformedShape_i::Update(); -} - -//============================================================================== -int VISU::Vectors_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - return DeformedShape_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration); -} - -int VISU::Vectors_i::myNbPresent = 0; -QString VISU::Vectors_i::GenerateName() { return VISU::GenerateName("Vectors",myNbPresent++);} - -const string VISU::Vectors_i::myComment = "VECTORS"; -const char* VISU::Vectors_i::GetComment() const { return myComment.c_str();} - -VISU::Vectors_i::Vectors_i(Result_i* theResult, bool theAddToStudy) : - PrsObject_i(theResult->GetStudyDocument()), - Prs3d_i(theResult), - ScalarMap_i(theResult, theAddToStudy), - DeformedShape_i(theResult, theAddToStudy) -{ - if(MYDEBUG) MESSAGE("Vectors_i::Vectors_i"); - myGlyph = vtkGlyph3D::New(); - myHog = vtkHedgeHog::New(); -} - -void VISU::Vectors_i::Destroy(){ - DeformedShape_i::Destroy(); -} - -void VISU::Vectors_i::SameAs(const VISU::Vectors_i* theOrigin) { - Vectors_i* aVectors = const_cast(theOrigin); - SetLineWidth(aVectors->GetLineWidth()); - SetGlyphType(aVectors->GetGlyphType()); - SetGlyphPos(aVectors->GetGlyphPos()); - VISU::DeformedShape_i::SameAs(theOrigin); -} - -VISU::Storable* VISU::Vectors_i::Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration){ - myLineWidth = 1.0; - myTypeGlyph = VISU::Vectors::ARROW; - myPosGlyph = VISU::Vectors::CENTER; - return DeformedShape_i::Create(theMeshName,theEntity,theFieldName,theIteration); -} - -VISU::Storable* VISU::Vectors_i::Restore(const Storable::TRestoringMap& theMap, int theBuilding) - throw(std::logic_error&) -{ - DeformedShape_i::Restore(theMap,false); - - myTypeGlyph = (VISU::Vectors::GlyphType)VISU::Storable::FindValue(theMap,"myTypeGlyph").toInt(); - myLineWidth = VISU::Storable::FindValue(theMap,"myLineWidth").toDouble(); - myPosGlyph = (VISU::Vectors::GlyphPos)VISU::Storable::FindValue(theMap,"myPosGlyph").toInt(); - - if(theBuilding) - return Build(true); - return NULL; -} - -void VISU::Vectors_i::ToStream(std::ostringstream& theStr){ - DeformedShape_i::ToStream(theStr); - - Storable::DataToStream( theStr, "myTypeGlyph", myTypeGlyph ); - Storable::DataToStream( theStr, "myLineWidth", myLineWidth ); - Storable::DataToStream( theStr, "myPosGlyph", myPosGlyph ); -} - -VISU::Storable* VISU::VectorsRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&) -{ - VISU::Result_i* pResult = GetResult(theSObject); - if(pResult != NULL){ - VISU::Vectors_i* pResent = new VISU::Vectors_i(pResult); - return pResent->Restore(theMap); - } - return NULL; -} - - -VISU::ScalarMap_i::DataType* VISU::Vectors_i::DoHook(int theRestoring){ - if(theRestoring == 0){ - myTypeGlyph = VISU::Vectors::ARROW; - myLineWidth = 1; - myPosGlyph = VISU::Vectors::TAIL; - myFactor = ScaleFactor()/GetMax(); - } - if(MYDEBUG) - MESSAGE("Vectors_i::DoHook() - myFactor = "<Delete(); - myHog->Delete(); -} - -void VISU::Vectors_i::Update() { - switch (myTypeGlyph) { - case VISU::Vectors::ARROW: - { - vtkGlyphSource2D *aGlyphSource = vtkGlyphSource2D::New(); - aGlyphSource->SetGlyphTypeToArrow(); - aGlyphSource->SetFilled(0); - if(myPosGlyph == VISU::Vectors::TAIL) - aGlyphSource->SetCenter(0.5, 0.0, 0.0); - else if(myPosGlyph == VISU::Vectors::HEAD) - aGlyphSource->SetCenter(-0.5, 0.0, 0.0); - myGlyph->SetSource(aGlyphSource->GetOutput()); - aGlyphSource->Delete(); - } - break; - - case VISU::Vectors::CONE2: - case VISU::Vectors::CONE6: - { - vtkConeSource *aGlyphSource = vtkConeSource::New(); //by default - if (myTypeGlyph == VISU::Vectors::CONE6) - aGlyphSource->SetResolution(7); - else - aGlyphSource->SetResolution(3); - aGlyphSource->SetHeight(1.0); - aGlyphSource->SetRadius(.1); - vtkTransform *aTransform = vtkTransform::New(); - - if(myPosGlyph == VISU::Vectors::TAIL) - aGlyphSource->SetCenter(0.5, 0.0, 0.0); - else if(myPosGlyph == VISU::Vectors::HEAD) - aGlyphSource->SetCenter(-0.5, 0.0, 0.0); - - vtkTransformPolyDataFilter *aFilter = vtkTransformPolyDataFilter::New(); - aFilter->SetInput(aGlyphSource->GetOutput()); - aGlyphSource->Delete(); - aFilter->SetTransform(aTransform); - aTransform->Delete(); - myGlyph->SetSource(aGlyphSource->GetOutput()); - aFilter->Delete(); - } - break; - case VISU::Vectors::NONE: - { - if(myField->myEntity == VISU::CELL_ENTITY){ - vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells - centers->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - centers->VertexCellsOn(); - myHog->SetInput(centers->GetOutput()); - centers->Delete(); - }else - myHog->SetInput(myFieldTransform->GetInput()); - - myHog->SetScaleFactor(myFactor); - myHog->Update(); - myMapper->SetInput(myHog->GetOutput()); - myMapper->Update(); - return; - } - } - if(myField->myNbComp > 1){ - if(myField->myEntity == VISU::CELL_ENTITY){ - vtkCellCenters *centers = vtkCellCenters::New(); // for vectors on cells - centers->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - centers->VertexCellsOn(); - myGlyph->SetInput(centers->GetOutput()); - centers->Delete(); - }else - myGlyph->SetInput(myFieldTransform->GetUnstructuredGridOutput()); - myGlyph->SetVectorModeToUseVector(); - myGlyph->SetScaleModeToScaleByVector(); - //myGlyph->SetColorModeToColorByVector(); - myGlyph->SetColorModeToColorByScalar(); - myGlyph->SetScaleFactor(2*myFactor); - } - myGlyph->Modified(); - VISU::DeformedShape_i::Update(); -} - -VISU_Actor* VISU::Vectors_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO) { - VISU_Actor* anActor = VISU::DeformedShape_i::CreateActor(theIO); - return anActor; -} - -void VISU::Vectors_i::UpdateActor(VISU_Actor* theActor) { - VISU::DeformedShape_i::UpdateActor(theActor); - theActor->GetProperty()->SetLineWidth(myLineWidth); - theActor->GetProperty()->SetRepresentation(2); - theActor->SetShrinkable(false); -} - -//============================================================================== - diff --git a/src/VISU_I/VISU_PrsObject_i.hh b/src/VISU_I/VISU_PrsObject_i.hh index cd623019..304df61b 100644 --- a/src/VISU_I/VISU_PrsObject_i.hh +++ b/src/VISU_I/VISU_PrsObject_i.hh @@ -1,5 +1,23 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // File : VISU_PrsObject_i.hxx @@ -9,48 +27,20 @@ #ifndef VISU_PrsObject_i_HeaderFile #define VISU_PrsObject_i_HeaderFile -#include "VISU_Result_i.hh" -//#include "VISU_Convertor.hxx" -#include "Handle_SALOME_InteractiveObject.hxx" - -class VISU_Extractor; -class VISU_FieldTransform; -class VISU_ScalarBarActor; -class VISU_LookupTable; -class VISU_Actor; - -class vtkDataSetMapper; -class vtkDataSet; -class vtkProperty; - -class vtkPolyDataMapper; -class vtkPolyData; -class vtkGeometryFilter; - -class vtkWarpVector; -class vtkContourFilter; -class vtkAppendPolyData; - -class vtkGlyph3D; -class vtkHedgeHog; -class vtkPolyDataSource; -class vtkStreamLine; +#include "VISUConfig.hh" namespace VISU{ - struct TField; - //============================================================================== class PrsObject_i : public virtual POA_VISU::PrsObject, public virtual Storable { PrsObject_i(const PrsObject_i&); public: - PrsObject_i(SALOMEDS::Study_ptr theStudy) : - myStudy(SALOMEDS::Study::_duplicate(theStudy)) {}; + PrsObject_i(SALOMEDS::Study_ptr theStudy) : myStudy(SALOMEDS::Study::_duplicate(theStudy)) {}; virtual ~PrsObject_i() {} protected: - string myName; + std::string myName; SALOMEDS::Study_var myStudy; public: @@ -59,589 +49,8 @@ namespace VISU{ const SALOMEDS::Study_var& GetStudyDocument() const { return myStudy;} QString GetEntry(); }; - - - //============================================================================== - class Prs3d_i : public virtual POA_VISU::Prs3d, - public virtual PrsObject_i - { - Prs3d_i(); - Prs3d_i(const Prs3d_i&); - public: - Prs3d_i(Result_i* theResult); - virtual void SameAs(const Prs3d_i* theOrigin); - virtual ~Prs3d_i(); - virtual void Destroy(); - - typedef vtkPolyDataMapper MapperType; - typedef vtkDataSet DataType; - - virtual SALOMEDS::Color GetColor() { return myColor;} - virtual void SetColor(const SALOMEDS::Color& theColor); - - protected: - Result_i* myResult; - MapperType *myMapper; - vtkGeometryFilter *myGeomFilter; - float myBounds[6]; - struct SALOMEDS::Color myColor; - - bool myAddToStudy; - bool CreateActor(VISU_Actor* theActor, const Handle(SALOME_InteractiveObject)& theIO = NULL); - - public: - virtual void Update(); - virtual const char* GetComment() const = 0; - virtual QString GenerateName() = 0; - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - virtual void ToStream(std::ostringstream& theStr); - virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL) = 0; - virtual void UpdateActor(VISU_Actor* theActor); - MapperType* GetMapper() const { return myMapper;} - Result_i* GetResult() const { return myResult; } - }; - - - //============================================================================== - class Mesh_i : public virtual POA_VISU::Mesh, - public virtual Prs3d_i - { - static int myNbPresent; - Mesh_i(); - Mesh_i(const Mesh_i&); - public: - Mesh_i(Result_i* theResult); - virtual void SameAs(const Mesh_i* theOrigin); - virtual ~Mesh_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TMESH;}; - - virtual void SetCellColor(const SALOMEDS::Color& theColor) { SetColor(theColor);} - virtual SALOMEDS::Color GetCellColor() { return GetColor();} - - virtual void SetNodeColor(const SALOMEDS::Color& theColor) { myNodeColor = theColor;} - virtual SALOMEDS::Color GetNodeColor() { return myNodeColor;} - - virtual void SetLinkColor(const SALOMEDS::Color& theColor) { myLinkColor = theColor;} - virtual SALOMEDS::Color GetLinkColor() { return myLinkColor;} - - virtual void SetPresentationType(VISU::PresentationType theType) { myPresentType = theType;} - virtual PresentationType GetPresentationType() { return myPresentType;} - - typedef VISU::Mesh InterfaceType; - typedef vtkUnstructuredGridReader InputType; - - protected: - Storable* Build(int theRestoring); - - InputType *myInput; - VISU::VISUType myType; - string myMeshName; - int myEntity; - string mySubMeshName; - struct SALOMEDS::Color myNodeColor, myLinkColor; - VISU::PresentationType myPresentType; - - public: - virtual Storable* Create(const char* theMeshName, int theEntity); - virtual Storable* Create(const char* theMeshName, int theEntity, const char* theFamilyName); - virtual Storable* Create(const char* theMeshName, const char* theGroupName); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - virtual void ToStream(std::ostringstream& theStr); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL); - virtual void UpdateActor(VISU_Actor* theActor); - virtual InputType* GetInput() const { return myInput;} - }; - Storable* MeshRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - //============================================================================== - class ScalarMap_i : public virtual POA_VISU::ScalarMap, - public virtual Prs3d_i - { - static int myNbPresent; - ScalarMap_i(); - ScalarMap_i(const ScalarMap_i&); - - public: - ScalarMap_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const ScalarMap_i* theOrigin); - virtual ~ScalarMap_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TSCALARMAP;}; - - virtual void SetScalarMode(CORBA::Long theScalarMode); - virtual CORBA::Long GetScalarMode() { return myScalarMode;} - - virtual void SetScaling(VISU::Scaling theScaling); - virtual VISU::Scaling GetScaling(); - - virtual void SetRange(CORBA::Double theMin, CORBA::Double theMax); - virtual CORBA::Double GetMin() { return myScalarRange[0];} - virtual CORBA::Double GetMax() { return myScalarRange[1];} - - virtual void SetOrientation(VISU::ScalarMap::Orientation theOrientation) { - myOrientation = theOrientation; - } - virtual VISU::ScalarMap::Orientation GetOrientation() { return myOrientation;} - - virtual void SetPosition(CORBA::Double X, CORBA::Double Y) { myPosition[0] = X; myPosition[1] = Y;} - virtual CORBA::Double GetPosX() { return myPosition[0];} - virtual CORBA::Double GetPosY() { return myPosition[1];} - - virtual void SetSize(CORBA::Double theWidth, CORBA::Double theHeight) { - myWidth = theWidth; myHeight = theHeight; - } - virtual CORBA::Double GetWidth() { return myWidth;} - virtual CORBA::Double GetHeight() { return myHeight;} - - virtual void SetNbColors(CORBA::Long theNbColors) { myNumberOfColors = theNbColors;} - virtual CORBA::Long GetNbColors() { return myNumberOfColors;} - - virtual void SetLabels(CORBA::Long theNbLabels) { myNumberOfLabels = theNbLabels;} - virtual CORBA::Long GetLabels() { return myNumberOfLabels;} - - virtual void SetTitle(const char* theName) { myTitle = theName;} - virtual char* GetTitle() { return CORBA::string_dup(myTitle.c_str());} - - virtual void CalculateRange(); - virtual void GetFieldRange(float theRange[2]); - virtual bool isRangeFixed() { return myIsFixedRange; } - - virtual double GetIteration() { return myIteration; } - - typedef VISU::ScalarMap InterfaceType; - typedef VISU_Extractor InputType; - - protected: - Storable* Build(int theRestoring); - virtual DataType* DoHook(int theRestoring); - - InputType *myInput; - - string myMeshName; - int myEntity; - string myFieldName; - int myScalarMode; - double myIteration; - VISU_LookupTable *myMapperTable, *myBarTable; - VISU_FieldTransform *myFieldTransform; - const TField* myField; - - float myScalarRange[2]; - bool myIsFixedRange; - bool myIsColored; - VISU::Scaling myScaling; - float myMapScale; - - string myTitle; - VISU::ScalarMap::Orientation myOrientation; - int myNumberOfColors, myNumberOfLabels; - float myPosition[2], myWidth, myHeight; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - InputType* GetInput() { return myInput;} - - virtual void Update(); - const VISU::TField* GetField() const { return myField;} - const string& GetFieldName() const { return myFieldName;} - int GetScalarMode() const { return myScalarMode;} - virtual void SetMapScale(double theMapScale = 1.0); - - virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL); - virtual void UpdateActor(VISU_Actor* theActor); - }; - Storable* ScalarMapRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - //============================================================================== - class DeformedShape_i : public virtual POA_VISU::DeformedShape, - public virtual ScalarMap_i - { - static int myNbPresent; - DeformedShape_i(); - DeformedShape_i(const DeformedShape_i&); - public: - DeformedShape_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const DeformedShape_i* theOrigin); - virtual ~DeformedShape_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TDEFORMEDSHAPE;}; - - virtual void SetScale(CORBA::Double theScale) { myFactor = theScale;} - virtual CORBA::Double GetScale() { return myFactor;} - - typedef VISU::DeformedShape InterfaceType; - - virtual bool isColored() { return myIsColored; } - virtual void setColored(bool theColor) { myIsColored = theColor; } - virtual void SetColor(const SALOMEDS::Color& theColor); - - protected: - virtual DataType* DoHook(int theRestoring); - float myFactor; - vtkWarpVector *myWarpVector; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void Update(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - float ScaleFactor(); - virtual void SetMapScale(double theMapScale = 1.0); - - virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL); - virtual void UpdateActor(VISU_Actor* theActor); - }; - Storable* DeformedShapeRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - - - //============================================================================== - class CutPlanes_i : public virtual POA_VISU::CutPlanes, - public virtual ScalarMap_i - { - static int myNbPresent; - CutPlanes_i(); - CutPlanes_i(const CutPlanes_i&); - public: - CutPlanes_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const CutPlanes_i* theOrigin); - virtual ~CutPlanes_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TCUTPLANES;}; - - virtual void SetOrientationType(VISU::CutPlanes::Orientation theOrient) { - myBasePlane = theOrient; - } - virtual VISU::CutPlanes::Orientation GetOrientationType() { return myBasePlane;} - - virtual void SetDisplacement(CORBA::Double theDisp) { myDisplacement = theDisp;} - virtual CORBA::Double GetDisplacement() { return myDisplacement;} - - virtual void SetNbPlanes(CORBA::Long theNb) { myNbPlanes = theNb;} - virtual CORBA::Long GetNbPlanes() { return myNbPlanes;} - - virtual void SetRotateX(CORBA::Double theAngle); - virtual CORBA::Double GetRotateX(); - virtual void SetRotateY(CORBA::Double theAngle); - virtual CORBA::Double GetRotateY(); - - typedef VISU::CutPlanes InterfaceType; - - protected: - virtual DataType* DoHook(int theRestoring); - - int myNbPlanes; - float myAng[3], myDisplacement; - vtkAppendPolyData *myAppendPolyData; - VISU::CutPlanes::Orientation myBasePlane; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void Update(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - void SetPlane(int theId); - }; - Storable* CutPlanesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - - //============================================================================== - class CutLines_i : public virtual POA_VISU::CutLines, - public virtual ScalarMap_i - { - static int myNbPresent; - CutLines_i(); - CutLines_i(const CutPlanes_i&); - public: - CutLines_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const CutLines_i* theOrigin); - virtual ~CutLines_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TCUTLINES;}; - - virtual void SetOrientationType(VISU::CutPlanes::Orientation theOrient) { - myBasePlane[0] = theOrient; - } - virtual VISU::CutPlanes::Orientation GetOrientationType() { return myBasePlane[0];} - - virtual void SetOrientationType2(VISU::CutPlanes::Orientation theOrient) { - myBasePlane[1] = theOrient; - } - virtual VISU::CutPlanes::Orientation GetOrientationType2() { return myBasePlane[1];} - - virtual void SetDisplacement(CORBA::Double theDisp) { myDisplacement[0] = theDisp;} - virtual CORBA::Double GetDisplacement() { return myDisplacement[0];} - virtual void SetDisplacement2(CORBA::Double theDisp) { myDisplacement[1] = theDisp;} - virtual CORBA::Double GetDisplacement2() { return myDisplacement[1];} - - virtual void SetNbLines(CORBA::Long theNb) { myNbLines = theNb;} - virtual CORBA::Long GetNbLines() { return myNbLines;} - - virtual void SetRotateX(CORBA::Double theAngle); - virtual CORBA::Double GetRotateX(); - virtual void SetRotateY(CORBA::Double theAngle); - virtual CORBA::Double GetRotateY(); - - virtual void SetRotateX2(CORBA::Double theAngle); - virtual CORBA::Double GetRotateX2(); - virtual void SetRotateY2(CORBA::Double theAngle); - virtual CORBA::Double GetRotateY2(); - - typedef VISU::CutLines InterfaceType; - - protected: - virtual DataType* DoHook(int theRestoring); - - int myNbLines; - vtkAppendPolyData *myAppendPolyData; - float myAng[2][3], myDisplacement[2]; - VISU::CutPlanes::Orientation myBasePlane[2]; - float myDirLn[3], myBoundPrjLn[3], myBasePnt[3]; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - void BuildTableOfReal(SALOMEDS::SObject_ptr theSObject); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void Update(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - }; - Storable* CutLinesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - - //============================================================================== - class IsoSurfaces_i : public virtual POA_VISU::IsoSurfaces, - public virtual ScalarMap_i - { - static int myNbPresent; - IsoSurfaces_i(); - IsoSurfaces_i(const IsoSurfaces_i&); - public: - IsoSurfaces_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const IsoSurfaces_i* theOrigin); - virtual ~IsoSurfaces_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TISOSURFACE;}; - - virtual void SetNbSurfaces(CORBA::Long theNb) { myNbSurface = theNb;} - virtual CORBA::Long GetNbSurfaces() { return myNbSurface;} - - virtual void SetRange(float theMin, float theMax); - virtual float GetRangeMin() { return myRange[0]; } - virtual float GetRangeMax() { return myRange[1]; } - - typedef VISU::IsoSurfaces InterfaceType; - - protected: - virtual DataType* DoHook(int theRestoring); - - vtkContourFilter *myContourFilter; - int myNbSurface; - float myRange[2]; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void Update(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual void SetMapScale(double theMapScale = 1.0); - }; - Storable* IsoSurfacesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - - //============================================================================== - class StreamLines_i : public virtual POA_VISU::StreamLines, - public virtual DeformedShape_i - { - static int myNbPresent; - StreamLines_i(); - StreamLines_i(const StreamLines_i&); - public: - StreamLines_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const StreamLines_i* theOriginal); - virtual ~StreamLines_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TSTREAMLINES;} - - typedef VISU::StreamLines InterfaceType; - - virtual void SetDirection(VISU::StreamLines::Direction theDirection) - { myDirection = theDirection; } - virtual VISU::StreamLines::Direction GetDirection() { return myDirection;} - - virtual void SetStepLength(CORBA::Double theStep) { myStepLength = theStep; } - virtual CORBA::Double GetStepLength() { return myStepLength; } - - virtual void SetPropagationTime(CORBA::Double theTime) { myPropagationTime = theTime; } - virtual CORBA::Double GetPropagationTime() { return myPropagationTime; } - - virtual void SetIntegrationStep(CORBA::Double theStep) { myIntegrationStep = theStep; } - virtual CORBA::Double GetIntegrationStep() { return myIntegrationStep; } - - virtual void SetSource(VISU::Prs3d_ptr thePrs3d); - virtual VISU::Prs3d_ptr GetSource(); - - virtual void SetUsedPoints(CORBA::Double thePercents) { myPercents = thePercents; } - virtual CORBA::Double GetUsedPoints() { return myPercents; } - - protected: - virtual DataType* DoHook(int theRestoring); - vtkStreamLine* myStream; - - VISU::StreamLines::Direction myDirection; - float myStepLength; - float myIntegrationStep; - float myPropagationTime; - string mySourceEntry; - VISU::Prs3d_i* myPrs3di; - float myPercents; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - - virtual float GetMinIntegrationStep(); - virtual float GetMaxIntegrationStep(); - virtual float GetBasePropagationTime(); - - virtual void Update(); - virtual QString GetSourceEntry() { return QString(mySourceEntry.c_str()); } - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - }; - Storable* StreamLinesRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - - - //============================================================================== - class Vectors_i : public virtual POA_VISU::Vectors, - public virtual DeformedShape_i - { - static int myNbPresent; - Vectors_i(); - Vectors_i(const Vectors_i&); - public: - Vectors_i(Result_i* theResult, bool theAddToStudy = true); - virtual void SameAs(const Vectors_i* theOrigin); - virtual ~Vectors_i(); - virtual void Destroy(); - - virtual VISU::VISUType GetType() { return VISU::TVECTORS;}; - - virtual void SetLineWidth(CORBA::Double theWidth) { myLineWidth = theWidth;} - virtual CORBA::Double GetLineWidth() { return myLineWidth;} - - virtual void SetGlyphType(VISU::Vectors::GlyphType theType) { myTypeGlyph = theType;} - virtual VISU::Vectors::GlyphType GetGlyphType() { return myTypeGlyph;} - - virtual void SetGlyphPos(VISU::Vectors::GlyphPos thePos) { myPosGlyph = thePos;} - virtual VISU::Vectors::GlyphPos GetGlyphPos() { return myPosGlyph;} - - typedef VISU::Vectors InterfaceType; - - protected: - virtual DataType* DoHook(int theRestoring); - - float myLineWidth; - VISU::Vectors::GlyphType myTypeGlyph; - VISU::Vectors::GlyphPos myPosGlyph; - vtkGlyph3D *myGlyph; - vtkHedgeHog *myHog; - - public: - virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual Storable* Restore(const Storable::TRestoringMap& theMap, int theBuilding = true) - throw(std::logic_error&); - static const string myComment; - virtual const char* GetComment() const; - virtual QString GenerateName(); - virtual void Update(); - virtual void ToStream(std::ostringstream& theStr); - static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity, - const char* theFieldName, double theIteration); - virtual VISU_Actor* CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL); - virtual void UpdateActor(VISU_Actor* theActor); - }; - Storable* VectorsRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); - //============================================================================== } + #endif diff --git a/src/VISU_I/VISU_Result_i.cc b/src/VISU_I/VISU_Result_i.cc index 28fecf2b..5b7a705b 100644 --- a/src/VISU_I/VISU_Result_i.cc +++ b/src/VISU_I/VISU_Result_i.cc @@ -1,18 +1,34 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // File : VISU_Result_i.cc // Author : Alexey PETROV // Module : VISU -using namespace std; #include "VISU_Result_i.hh" #include "VISU_Convertor_impl.hxx" #include "VISU_CorbaMedConvertor.hxx" -#include "VISU_Extractor.hxx" -using namespace VISU; +#include "QAD_Config.h" #include "SALOMEDS_Tool.hxx" #include "HDFascii.hxx" @@ -24,9 +40,10 @@ using namespace VISU; #include #include +using namespace VISU; using namespace std; -#ifdef DEBUG +#ifdef _DEBUG_ static int MYDEBUG = 0; static int MYDEBUGWITHFILES = 0; #else @@ -51,23 +68,6 @@ VISU::Result_var VISU::FindResult(SALOMEDS::SObject_ptr theSObject){ return aResult; } -QString VISU::GenerateName(const string& theFmt, int theId){ - static QString aName; - if(theId > 0) - aName.sprintf("%s:%d",theFmt.c_str(),theId); - else - aName.sprintf("%s",theFmt.c_str()); - return aName; -} - -void VISU::WriteToFile(vtkUnstructuredGrid* theDataSet, const string& theFileName){ - vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); - aWriter->SetFileName(theFileName.c_str()); - aWriter->SetInput(theDataSet); - aWriter->Write(); - aWriter->Delete(); -} - QString GenerateName(const char* theName){ typedef map TNameMap; static TNameMap aMap; @@ -118,6 +118,71 @@ const char* VISU::Result_i::GetComment() const { return myComment.c_str();} VISU::Result_i::Result_i(SALOMEDS::Study_ptr theStudy) { myStudyDocument = SALOMEDS::Study::_duplicate(theStudy); myInput = NULL; + myIsDone = 0; +} + +CORBA::Boolean VISU::Result_i::BuildAll(){ + if(MYDEBUG) MESSAGE("Result_i::Build - myIsDone = "<GetMeshMap(); + VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); + for(; aMeshMapIter != aMeshMap.end(); aMeshMapIter++){ + const string& aMeshName = aMeshMapIter->first; + const VISU::TMesh& aMesh = aMeshMapIter->second; + const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh.myMeshOnEntityMap; + VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter; + //Import fields + aMeshOnEntityMapIter = aMeshOnEntityMap.begin(); + for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){ + const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first; + const VISU::TMeshOnEntity& aMeshOnEntity = aMeshOnEntityMapIter->second; + const VISU::TFieldMap& aFieldMap = aMeshOnEntity.myFieldMap; + VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.begin(); + for(; aFieldMapIter != aFieldMap.end(); aFieldMapIter++){ + const string& aFieldName = aFieldMapIter->first; + const VISU::TField& aField = aFieldMapIter->second; + const VISU::TField::TValField& aValField = aField.myValField; + VISU::TField::TValField::const_iterator aValFieldIter = aValField.begin(); + for(; aValFieldIter != aValField.end(); aValFieldIter++){ + int aTimeStamp = aValFieldIter->first; + myInput->GetTimeStampOnMesh(aMeshName,anEntity,aFieldName,aTimeStamp); + } + } + } + //Importing groups + const VISU::TGroupMap& aGroupMap = aMesh.myGroupMap; + VISU::TGroupMap::const_iterator aGroupMapIter = aGroupMap.begin(); + for(; aGroupMapIter != aGroupMap.end(); aGroupMapIter++){ + const string& aGroupName = aGroupMapIter->first; + myInput->GetMeshOnGroup(aMeshName,aGroupName); + } + //Import families + aMeshOnEntityMapIter = aMeshOnEntityMap.begin(); + for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){ + const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first; + const VISU::TMeshOnEntity& aMeshOnEntity = aMeshOnEntityMapIter->second; + const VISU::TFamilyMap& aFamilyMap = aMeshOnEntity.myFamilyMap; + VISU::TFamilyMap::const_iterator aFamilyMapIter = aFamilyMap.begin(); + for(; aFamilyMapIter != aFamilyMap.end(); aFamilyMapIter++){ + const string& aFamilyName = aFamilyMapIter->first; + myInput->GetMeshOnEntity(aMeshName,anEntity,aFamilyName); + } + } + //Import mesh on entity + aMeshOnEntityMapIter = aMeshOnEntityMap.begin(); + for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++){ + const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first; + myInput->GetMeshOnEntity(aMeshName,anEntity); + } + } + myIsDone = 1; + }catch(std::runtime_error& exc){ + INFOS("Follow exception was accured :\n"<FindObjectID(aResultEntry.c_str()); if(mySObject->_is_nil()) throw std::runtime_error("Build - There is no SObject for the Result !!!"); - if(theSObject != NULL){ + if(!CORBA::is_nil(theSObject)){ CORBA::String_var aString = theSObject->GetID(); CreateReference(myStudyDocument,aResultEntry,aString.in()); } @@ -250,6 +315,8 @@ VISU::Storable* VISU::Result_i::Build(SALOMEDS::SObject_ptr theSObject) } } } + QString aIsBuild = QAD_CONFIG->getSetting("Visu:BuildResult"); + if(aIsBuild.isEmpty()? 0 : aIsBuild.toInt()) BuildAll(); return this; } @@ -259,13 +326,13 @@ VISU::Storable* VISU::Result_i::Create(const char* theFileName){ myInput = CreateConvertor(theFileName); if(myInput == NULL) return NULL; myFileInfo.setFile(theFileName); - myName = (const char*)(::GenerateName(myFileInfo.fileName().latin1())); + myName = ::GenerateName(myFileInfo.fileName()).latin1(); VISU::Storable* aStorable = Build(); return aStorable; }catch(std::runtime_error& exc){ - MESSAGE("Follow exception was accured :\n"<SetValue(aComment.latin1()); } + QString aIsBuild = QAD_CONFIG->getSetting("Visu:BuildResult"); + if(aIsBuild.isEmpty()? 0 : aIsBuild.toInt()) BuildAll(); return this; }catch(std::runtime_error& exc){ - MESSAGE("Follow exception was accured :\n"<GetStudy(); VISU::Result_i* pResult = new VISU::Result_i(aStudy); if(pResult == NULL) return NULL; - return pResult->Restore(theSObject,thePrefix,theMap); + return pResult->Restore(theSObject,theMap,thePrefix); } string VISU::Result_i::GetRefFatherEntry() { diff --git a/src/VISU_I/VISU_Result_i.hh b/src/VISU_I/VISU_Result_i.hh index d796d86c..163231ec 100644 --- a/src/VISU_I/VISU_Result_i.hh +++ b/src/VISU_I/VISU_Result_i.hh @@ -1,5 +1,23 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // File : VISU_Result_i.hh @@ -11,11 +29,7 @@ #include "VISUConfig.hh" -class vtkUnstructuredGridReader; -class vtkUnstructuredGrid; class VISU_Convertor; -class FieldInfo; -class QAD_Study; namespace VISU{ class Result_i : public virtual POA_VISU::Result, @@ -27,30 +41,34 @@ namespace VISU{ Result_i(SALOMEDS::Study_ptr theStudy); virtual ~Result_i(); - virtual VISU::VISUType GetType() { return VISU::TRESULT;}; + virtual VISU::VISUType GetType() { return VISU::TRESULT;} + virtual CORBA::Boolean BuildAll(); - typedef VISU_Convertor InputType; - typedef vtkUnstructuredGridReader OutputType; + typedef VISU_Convertor TInput; enum TSourceId {eRestoredComponent = -2, eRestoredFile = -1, eFile = 1, eComponent = 2}; private: TSourceId mySourceId; - InputType *myInput; + TInput *myInput; + CORBA::Boolean myIsDone; string myName; QFileInfo myFileInfo; protected: - virtual Storable* Build(SALOMEDS::SObject_ptr theSObject = NULL) + virtual Storable* Build(SALOMEDS::SObject_ptr theSObject = SALOMEDS::SObject::_nil()) throw (std::runtime_error&); public: virtual Storable* Create(const char* theFileName); virtual Storable* Create(SALOMEDS::SObject_ptr theMedSObject); virtual Storable* Create(SALOME_MED::FIELD_ptr theField); virtual Storable* Restore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) + const Storable::TRestoringMap& theMap, const string& thePrefix) + throw(std::logic_error&); + static Storable* Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) throw(std::logic_error&); virtual void ToStream(std::ostringstream& theStr); virtual const char* GetComment() const; static const string myComment; - InputType* GetInput(); + TInput* GetInput(); const string& GetName() const { return myName;} const QFileInfo& GetFileInfo() const { return myFileInfo;} Result_i::TSourceId GetSourceId() const { return mySourceId;} @@ -65,11 +83,6 @@ namespace VISU{ const SALOMEDS::Study_var& GetStudyDocument() const; const SALOMEDS::SComponent_var& GetSComponent() const; }; - Storable* ResultRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) - throw(std::logic_error&); Result_var FindResult(SALOMEDS::SObject_ptr theSObject); - QString GenerateName(const string& theFmt, int theId); - void WriteToFile(vtkUnstructuredGrid* theDataSet, const string& theFileName); } #endif diff --git a/src/VISU_I/VISU_Table_i.cc b/src/VISU_I/VISU_Table_i.cc index 5d01988c..12d15ee4 100644 --- a/src/VISU_I/VISU_Table_i.cc +++ b/src/VISU_I/VISU_Table_i.cc @@ -1,25 +1,47 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // File : VISU_Table_i.cc // Author : Vadim SANDLER // Module : VISU -using namespace std; #include "VISU_Table_i.hh" #include "QAD_Application.h" #include "QAD_Desktop.h" #include "QAD_Study.h" + +#include "VISU_CutLines_i.hh" + +#include #include #include + #include -#include -#include -#ifdef DEBUG -static int MYDEBUG = 1; +using namespace std; + +#ifdef _DEBUG_ +static int MYDEBUG = 0; #else static int MYDEBUG = 0; #endif @@ -183,8 +205,9 @@ void VISU::Table_i::ToStream( std::ostringstream& theStr ) /*! Called from engine to restore table from the file */ -VISU::Storable* VISU::TableRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) +VISU::Storable* VISU::Table_i::Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&) { SALOMEDS::Study_var aStudy = theSObject->GetStudy(); VISU::Table_i* pResent = new VISU::Table_i( aStudy, "" ); @@ -590,8 +613,9 @@ const char* VISU::Curve_i::GetTableID() { /*! Called from engine to restore curve from the file */ -VISU::Storable* VISU::CurveRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) +VISU::Storable* VISU::Curve_i::Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&) { SALOMEDS::Study_var aStudy = theSObject->GetStudy(); VISU::Table_i* pTable = GetTable( aStudy, theMap ); @@ -854,8 +878,9 @@ void VISU::Container_i::ToStream( std::ostringstream& theStr ) /*! Called from engine to restore container from the file */ -VISU::Storable* VISU::ContainerRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap) +VISU::Storable* VISU::Container_i::Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&) { SALOMEDS::Study_var aStudy = theSObject->GetStudy(); VISU::Container_i* pResent = new VISU::Container_i( aStudy ); @@ -865,7 +890,8 @@ VISU::Storable* VISU::ContainerRestore(SALOMEDS::SObject_ptr theSObject, //------------------------------------------------------------- // Implementation of reading from file //------------------------------------------------------------- -typedef vector TValues; +typedef double TValue; +typedef vector TValues; struct TRow{ string myTitle; @@ -888,7 +914,8 @@ struct TTable2D{ if(myColumnUnits.size() != iEnd) myColumnUnits.resize(iEnd); int jEnd = myRows.size(); for(int j = 0; j < jEnd; j++) - if(myRows[j].myValues.size() != iEnd) return 0; + if(myRows[j].myValues.size() != iEnd) + return 0; return 1; } void getColumns(TTable2D& theTable2D) const { @@ -928,12 +955,12 @@ int getLine(ifstream& theStmIn, QString& theString){ if(tmp == '\n') break; } aStrOut< aRet(aStrOut.str()); - theString = aRet.get(); + theString = aStrOut.str(); return !theStmIn.eof(); } void ImportTables(const char* theFileName, TTableCont& theTableCont){ + static int STRPRECISION = 12; ifstream aStmIn; QFileInfo aFileInfo(theFileName); if(!aFileInfo.isFile() || !aFileInfo.isReadable() || !aFileInfo.size()) return; @@ -942,73 +969,75 @@ void ImportTables(const char* theFileName, TTableCont& theTableCont){ do{ //Find beginning of Table while(getLine(aStmIn,aTmp) && aTmp == "\n"); - //cout<<"\n There is new Table2D with Title = "; + if(MYDEBUG) cout<<"\n There is new Table2D with Title = "; TTable2D aTable2D; while(!aStmIn.eof() && aTmp != "\n"){ if(aTmp.find("#TITLE:") == 0){ int aLen = aTmp.find(":") + 1; aTmp.remove(0,aLen); QString aTitle = aTmp.stripWhiteSpace(); - aTable2D.myTitle = (const char*)aTitle; - //cout< 0){ QStringList aStrList = QStringList::split("#TITLE:",aTmp); QString aTitle = aStrList[1].stripWhiteSpace(); TRow aRow; - aRow.myTitle = (const char*)aTitle; - //cout<>aVal){ aRow.myValues.push_back(aVal); - //cout<<"\t"< 0) + aTable2D.myRows.push_back(aRow); + if(MYDEBUG) cout<SetValue(aFileInfo.fileName().latin1()); int iEnd = aTableCont.size(); - /* for(int i = 0, iEnd = aTableCont.size(); i < iEnd; i++){ const TTable2D& aTable2D = aTableCont[i]; SALOMEDS::SObject_var aRealObject = aStudyBuilder->NewObject(aFileObject); anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); - cout<<"aTable2D.myTitle = "<SetValue(aTable2D.myTitle.c_str()); - else{ - QString aNewName; - aNewName.sprintf("Table:%d",i); - aName->SetValue(aNewName.latin1()); - } - anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeTableOfReal"); - SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr); - aTableOfReal->SetTitle(aTable2D.myTitle.c_str()); - const TRows& aRows = aTable2D.myRows; - //aTable2D.getColumns(aRows); - int kEnd = aRows[0].myValues.size(); - aTableOfReal->SetNbColumns(kEnd); - for(int j = 0, jEnd = aRows.size(); j < jEnd; j++){ - cout<<"j = "<length(kEnd); - cout<<"kEnd = "<AddRow(aDoubleSeq.in()); - aTableOfReal->SetRowTitle(j+1,aRow.myTitle.c_str()); - aTableOfReal->SetRowUnit(j+1,aRow.myUnit.c_str()); - } - for(int k = 0; k < kEnd; k++){ - aTableOfReal->SetColumnTitle(k+1,aTable2D.myColumnTitles[k].c_str()); - //aTableOfReal->SetColumnUnit(k+1,aTable2D.myColumnUnits[k].c_str()); - } - } - */ - for(int i = 0, iEnd = aTableCont.size(); i < iEnd; i++){ - const TTable2D& aTable2D = aTableCont[i]; - SALOMEDS::SObject_var aRealObject = aStudyBuilder->NewObject(aFileObject); - anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - //cout<<"aTable2D.myTitle = "<SetValue(aTable2D.myTitle.c_str()); else{ @@ -1084,19 +1074,17 @@ SALOMEDS::SObject_var VISU::ImportTables(const char* theFileName, SALOMEDS::Stud int kEnd = aNewTable2D.myRows[0].myValues.size(); aTableOfReal->SetNbColumns(kEnd); for(int j = 0, jEnd = aNewTable2D.myRows.size(); j < jEnd; j++){ - //cout<<"j = "< #include "Plot2d_Curve.h" +#include + namespace VISU{ //============================================================================== class Table_i : public virtual POA_VISU::Table, @@ -47,6 +66,9 @@ namespace VISU{ virtual Storable* Create(); virtual Storable* Restore( const Storable::TRestoringMap& theMap ) throw(std::logic_error&); + static Storable* Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&); virtual void ToStream( std::ostringstream& theStr ); static const string myComment; virtual const char* GetComment() const; @@ -55,8 +77,6 @@ namespace VISU{ virtual char* GetObjectEntry() { return CORBA::string_dup( myObjectEntry.c_str() ); } }; - Storable* TableRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap); SALOMEDS::SObject_var ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy); //============================================================================== @@ -103,6 +123,9 @@ namespace VISU{ virtual Storable* Create(); virtual Storable* Restore( const Storable::TRestoringMap& theMap ) throw(std::logic_error&); + static Storable* Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&); virtual void ToStream( std::ostringstream& theStr ); static const string myComment; virtual const char* GetComment() const; @@ -119,8 +142,6 @@ namespace VISU{ virtual Plot2d_Curve* CreatePresentation(); }; - Storable* CurveRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap); //============================================================================== class Container_i : public virtual POA_VISU::Container, @@ -150,6 +171,9 @@ namespace VISU{ virtual Storable* Create(); virtual Storable* Restore( const Storable::TRestoringMap& theMap ) throw(std::logic_error&); + static Storable* Restore(SALOMEDS::SObject_ptr theSObject, + const string& thePrefix, const Storable::TRestoringMap& theMap) + throw(std::logic_error&); virtual void ToStream( std::ostringstream& theStr ); static const string myComment; virtual const char* GetComment() const; @@ -159,9 +183,7 @@ namespace VISU{ VISU::Curve_i* GetCurve( CORBA::Long theIndex ); }; - Storable* ContainerRestore(SALOMEDS::SObject_ptr theSObject, - const string& thePrefix, const Storable::TRestoringMap& theMap); } -#endif // (#ifndef VISU_Table_i_HeaderFile) +#endif diff --git a/src/VISU_I/VISU_TimeAnimation.cxx b/src/VISU_I/VISU_TimeAnimation.cxx index d5f4cc64..49cd78fa 100644 --- a/src/VISU_I/VISU_TimeAnimation.cxx +++ b/src/VISU_I/VISU_TimeAnimation.cxx @@ -7,7 +7,25 @@ // Module : VISU #include "VISU_TimeAnimation.h" +#include "VISU_Result_i.hh" +#include "VISU_Prs3d_i.hh" +#include "VISU_Mesh_i.hh" +#include "VISU_ScalarMap_i.hh" +#include "VISU_IsoSurfaces_i.hh" +#include "VISU_DeformedShape_i.hh" +#include "VISU_CutPlanes_i.hh" +#include "VISU_CutLines_i.hh" +#include "VISU_Vectors_i.hh" +#include "VISU_StreamLines_i.hh" +#include "VISU_ViewManager_i.hh" #include "VISU_ScalarBarActor.hxx" +#include "VISU_Actor.h" + +#include "VTKViewer_ViewFrame.h" + +#include "QAD_Config.h" + +using namespace std; //QWaitCondition myCondition; static int MYDELAY = 1; @@ -136,7 +154,7 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { QString aMeshName = VISU::Storable::FindValue(aTimeMap,"myMeshName"); VISU::Entity anEntity = (VISU::Entity) VISU::Storable::FindValue(aTimeMap,"myEntityId").toInt(); QString aFieldName = VISU::Storable::FindValue(aTimeMap,"myFieldName"); - double aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toDouble(); + int aTimeStampId = VISU::Storable::FindValue(aTimeMap,"myTimeStampId").toInt(); switch (aData.myPrsType) { case VISU::TSCALARMAP: // ScalarMap @@ -186,7 +204,7 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { case VISU::TVECTORS: // Vectors { VISU::Vectors_i* aPresent = new VISU::Vectors_i(pResult, false); - aPresent->Create(aMeshName.latin1(), anEntity, + aPresent->Create(aMeshName.latin1(), anEntity, aFieldName.latin1(), aTimeStampId); //VISU::Vectors_var aTmp = aPresent->_this(); //aPresent->_remove_ref(); @@ -210,8 +228,11 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { i++; } aData.myNbFrames = i; - for (i = 0; i < aData.myNbFrames; i++) - aData.myPrs[i]->SetRange(aMin, aMax); + QString aFixRange = QAD_CONFIG->getSetting("Visu:SBImposeRange"); + if (aFixRange.compare("true") != 0) { + for (i = 0; i < aData.myNbFrames; i++) + aData.myPrs[i]->SetRange(aMin, aMax); + } } @@ -230,17 +251,17 @@ CORBA::Boolean VISU_TimeAnimation::generateFrames() { FieldData& aData = myFieldsLst[i]; aData.myActors = (VISU_Actor**) malloc(aData.myNbFrames * sizeof(VISU_Actor*)); for (long j = 0; j < aData.myNbFrames; j++) { - VISU_Actor* aActor = aData.myPrs[j]->CreateActor(); - if (aActor == NULL) { - aNoError = false; - aActor = 0; - myLastError += QString("%1 ").arg(aData.myTiming[j]); - } else { + VISU_Actor* aActor = NULL; + try{ + aActor = aData.myPrs[j]->CreateActor(); myView->AddActor(aActor); - if (j == 0) { + if(j == 0) aActor->VisibilityOn(); - } else + else aActor->VisibilityOff(); + }catch(std::runtime_error& exc){ + aNoError = false; + myLastError += QString("%1 ").arg(aData.myTiming[j]); } aData.myActors[j] = aActor; } diff --git a/src/VISU_I/VISU_TimeAnimation.h b/src/VISU_I/VISU_TimeAnimation.h index 34af55dc..0331f2f7 100644 --- a/src/VISU_I/VISU_TimeAnimation.h +++ b/src/VISU_I/VISU_TimeAnimation.h @@ -9,14 +9,19 @@ #ifndef VISU_TIMEANIMATION_H #define VISU_TIMEANIMATION_H +#include "VISUConfig.hh" + +class VTKViewer_ViewFrame; +class VISU_Actor; + #include #include #include -#include "VISU_Actor.h" -#include "VISU_PrsObject_i.hh" -#include "VISU_ViewManager_i.hh" -#include "VTKViewer_ViewFrame.h" +namespace VISU{ + class Result_i; + class ScalarMap_i; +} struct FieldData { diff --git a/src/VISU_I/VISU_ViewManager_i.cc b/src/VISU_I/VISU_ViewManager_i.cc index f93106df..1035f51f 100644 --- a/src/VISU_I/VISU_ViewManager_i.cc +++ b/src/VISU_I/VISU_ViewManager_i.cc @@ -1,14 +1,44 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // -// File : VISU_ViewManager_i.cxx +// File : VISU_ViewManager_i.cc // Author : Alexey PETROV // Module : VISU -using namespace std; #include "VISU_ViewManager_i.hh" + #include "VISU_PrsObject_i.hh" +#include "VISU_Result_i.hh" + +#include "VISU_Prs3d_i.hh" +#include "VISU_Mesh_i.hh" +#include "VISU_ScalarMap_i.hh" +#include "VISU_IsoSurfaces_i.hh" +#include "VISU_DeformedShape_i.hh" +#include "VISU_CutPlanes_i.hh" +#include "VISU_CutLines_i.hh" +#include "VISU_Vectors_i.hh" +#include "VISU_StreamLines_i.hh" + #include "VISU_Table_i.hh" #include "VISU_ScalarBarActor.hxx" #include "VISU_Actor.h" @@ -19,24 +49,25 @@ using namespace std; #include "QAD_Study.h" #include "QAD_RightFrame.h" #include "QAD_StudyFrame.h" -#include -#include +#include "VTKViewer_ViewFrame.h" #include "SALOMEGUI_TableDlg.h" #include "Plot2d_CurveContainer.h" #include "Plot2d_ViewFrame.h" -//#include "SALOMEGUI_SetupCurveDlg.h" -//#include "SALOMEGUI_SetupPlot2dDlg.h" -#include "VTKViewer_ViewFrame.h" +#include + +#include +#include + #include #include #include #include -#include +using namespace std; -#ifdef DEBUG +#ifdef _DEBUG_ static int MYDEBUG = 0; #else static int MYDEBUG = 0; @@ -72,7 +103,7 @@ namespace VISU{ for(anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;){ if(anActor->IsA("VISU_Actor")){ anVISUActor = VISU_Actor::SafeDownCast(anActor); - if (thePrs == anVISUActor->getPrs3d()) { + if (thePrs == anVISUActor->GetPrs3d()) { aResActor = anVISUActor->GetParent(); if(theDisplaing < eErase) aResActor->VisibilityOn(); @@ -91,11 +122,11 @@ namespace VISU{ return aResActor; } if(thePrs != NULL && theDisplaing < eErase){ - anVISUActor = thePrs->CreateActor(); - if(anVISUActor) + try{ + anVISUActor = thePrs->CreateActor(); vf->AddActor(anVISUActor); - else{ - MESSAGE ("Null actor is created"); + }catch(std::runtime_error& exc){ + INFOS("Null actor is created"); return NULL; } } @@ -289,6 +320,20 @@ namespace VISU{ return; } } + + + void ViewManager_i::ProcessEvents() { + while (true) { + qApp->lock(); + qApp->syncX(); + qApp->flushX(); + qApp->processEvents(); + qApp->unlock(); + //sleep(1); + } + } + + //=========================================================================== View_i::View_i(SALOMEDS::Study_ptr theStudy) { if(MYDEBUG) MESSAGE("View_i::View_i"); @@ -348,7 +393,7 @@ namespace VISU{ void XYPlot_i::Update() { if(MYDEBUG) MESSAGE("XYPlot_i::Update"); Mutex mt(myMutex,qApp,MYDELAY); - myName = myStudyFrame->title(); + myName = (const char*)(myStudyFrame->title()); myView->Repaint(); } void XYPlot_i::Close(){ @@ -767,7 +812,7 @@ namespace VISU{ vtkActor *actor; while(actor = theActors->GetNextActor()){ if(VISU_Actor* anActor = dynamic_cast(actor)){ - VISU::Prs3d_i* aPrs3d = anActor->getPrs3d(); + VISU::Prs3d_i* aPrs3d = anActor->GetPrs3d(); if(anActor->GetVisibility() && aPrs3d){ aPrs3d->Update(); aPrs3d->UpdateActor(anActor); diff --git a/src/VISU_I/VISU_ViewManager_i.hh b/src/VISU_I/VISU_ViewManager_i.hh index 0ba52167..9463e754 100644 --- a/src/VISU_I/VISU_ViewManager_i.hh +++ b/src/VISU_I/VISU_ViewManager_i.hh @@ -1,8 +1,26 @@ -// Copyright (C) 2003 CEA/DEN, EDF R&D +// VISU OBJECT : interactive object for VISU entities implementation // +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // -// File : VISU_ViewManager_i.hxx +// File : VISU_ViewManager_i.hh // Author : Alexey PETROV // Module : VISU @@ -10,12 +28,16 @@ #define VISU_ViewManager_i_HeaderFile #include "VISUConfig.hh" + class QAD_Study; class QAD_StudyFrame; + class VTKViewer_ViewFrame; -class Plot2d_ViewFrame; class SALOMEGUI_TableDlg; +class Plot2d_ViewFrame; + class VISU_Actor; + class vtkRenderer; class vtkCamera; @@ -34,6 +56,7 @@ namespace VISU{ virtual TableView_ptr CreateTableView(VISU::Table_ptr theTable); virtual XYPlot_ptr CreateXYPlot(); virtual void Destroy(View_ptr theView); + virtual void ProcessEvents(); protected: SALOMEDS::Study_var myStudyDocument; diff --git a/src/VISU_SWIG/Makefile.in b/src/VISU_SWIG/Makefile.in index 8c99d8ca..85f7c17d 100644 --- a/src/VISU_SWIG/Makefile.in +++ b/src/VISU_SWIG/Makefile.in @@ -37,17 +37,20 @@ VPATH=.:@srcdir@:@top_srcdir@/idl # Libraries targets LIB = libVISU_Swigcmodule.la -LIB_SRC = +LIB_SRC = VISU_Gen_s.cc +SWIG_FLAGS += -#SWIG_DEF = libVisuGUI_Swig.i -#EXPORT_PYSCRIPTS = libVisuGUI_Swig.py visu.py visu_view3d.py batchmode_visu.py -EXPORT_PYSCRIPTS = batchmode_visu.py batchmode_visu_table.py batchmode_visu_view3d.py \ +SWIG_DEF = libVISU_Swig.i +EXPORT_PYSCRIPTS = libVISU_Swig.py batchmode_visu.py batchmode_visu_table.py batchmode_visu_view3d.py \ visu_med.py visu_view3d.py visu.py visu_gui.py visu_prs_example.py\ - visu_table.py visu_big_table.py visu_view.py + visu_table.py visu_big_table.py visu_view.py \ + visu_swig_test.py LIB_CLIENT_IDL = -CPPFLAGS += $(PYTHON_INCLUDES) -DHAVE_CONFIG_H -LDFLAGS += $(PYTHON_LIBS) -lVISUGUI +CPPFLAGS += -ftemplate-depth-32 $(PYTHON_INCLUDES) $(QT_INCLUDES) \ + $(VTK_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) +LDFLAGS += $(PYTHON_LIBS) -lVisuConvertor -lVisuPipeLine @CONCLUDE@ + diff --git a/src/VISU_SWIG/batchmode_visu.py b/src/VISU_SWIG/batchmode_visu.py index a63e6350..559a3eb4 100644 --- a/src/VISU_SWIG/batchmode_visu.py +++ b/src/VISU_SWIG/batchmode_visu.py @@ -13,3 +13,64 @@ import visu myVisu = visu.Initialize(orb,naming_service,lcc,myStudyManager,myStudy,10) if myVisu is None: raise RuntimeError, "myVisu is none, VISU component is not loaded or found" + +def try_mesh_parameters(theMeshPattern): + aResult = [] + if theMeshPattern is None : return aResult ; + theMeshPattern = theMeshPattern._narrow(VISU.Mesh) + if theMeshPattern is None : return aResult ; + + aTYPES = [VISU.POINT, VISU.WIREFRAME, VISU.SHADED, VISU.INSIDEFRAME, VISU.SHRINK] + import copy; import os; + for ind in aTYPES: + aNewMesh = copy.deepcopy(theMeshPattern); + aNewMesh.SetPresentationType(ind) + aResult.append(aNewMesh) + + return aResult + +def try_scalarmap_parameters(thePattern, theNum): + aList = [] + if thePattern is None : return aList + thePattern = thePattern._narrow(VISU.ScalarMap) + if thePattern is None : return aList + SCALING = [VISU.LINEAR, VISU.LOGARITHMIC] + import copy + import random + for ind in range(0,theNum): + anObj = copy.deepcopy(thePattern); + if ind%2 : + #try incorrect value deliberately (but allowed by idl description) + #try SetScalarMode(long) + mode = random.randint(-100000,100000); #incorrect value deliberately + else: + #correct value of ScalarMode + mode = random.randint(0, 3) + + print "\tSetScalarMode(" + str(mode) +")" + anObj.SetScalarMode(mode) + + # --- SCALING --- + scal = random.randint(0,1) + print "\tSetScaling(" + str(SCALING[scal]) +")" + anObj.SetScaling(SCALING[scal]) + + # --- BOUNDARIES --- + if ind%2 : + alfa = random.random()*random.randint(-100000,100000) + betta = random.random()*random.randint(-100000,100000) + aMin = alfa; aMax = betta + else: + #more correct set + aPMin = thePattern.GetMin() + aPMax = thePattern.GetMax() + aLen = aPMax - aPMin + alfa = random.random()%0.5 + betta = random.random()%0.5 + aMin = alfa*aLen*random.randint(-1,1) + aPMin + aMax = betta*aLen*random.randint(-1,1) + aPMax + print "\tSetRange(" + str(aMin) + ", " + str(aMax) + ")" + anObj.SetRange(aMin, aMax) + aList.append(anObj) + + return aList diff --git a/src/VISU_SWIG/batchmode_visu_view3d.py b/src/VISU_SWIG/batchmode_visu_view3d.py index 21468ec0..47396189 100644 --- a/src/VISU_SWIG/batchmode_visu_view3d.py +++ b/src/VISU_SWIG/batchmode_visu_view3d.py @@ -24,7 +24,7 @@ myFieldName = "VITESSE"; #medFile = "brideResultats.dat" #myFieldName = "VM_Elem."; -medFile = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/' + medFile +medFile = os.getenv('SALOME_ROOT_DIR') + '/data/' + medFile myResult = myVisu.ImportFile(medFile) diff --git a/src/VISU_SWIG/libVISU_Swig.i b/src/VISU_SWIG/libVISU_Swig.i index ee17ad91..1f9a4de7 100644 --- a/src/VISU_SWIG/libVISU_Swig.i +++ b/src/VISU_SWIG/libVISU_Swig.i @@ -27,5 +27,28 @@ // $Header$ %module libVISU_Swig +%{ +#include "VISU_Gen_s.hh" +%} -//%include "VisuGUI_Swig.i" + +class Convertor{ +public: + Convertor(){}; + Convertor(const char* theFileName); +}; + + +class ScalarMap{ +public: + ScalarMap(){}; + ScalarMap(Convertor* theConvertor, const char* theMeshName, int theEntity, + const char* theFieldName, int theIteration); +}; + +class View3D{ +public: + View3D(); + void Display(ScalarMap* theScalarMap); + void SetPosition(int theX, int theY); +}; \ No newline at end of file diff --git a/src/VISU_SWIG/visu.py b/src/VISU_SWIG/visu.py index b991d217..b36b04e6 100644 --- a/src/VISU_SWIG/visu.py +++ b/src/VISU_SWIG/visu.py @@ -11,6 +11,11 @@ import os import re from time import sleep +# NRI : temporary added because interface is declared into Engines module. +import MED_idl +import Med_Gen_idl +# + import VISU import SALOME import SALOMEDS @@ -271,6 +276,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi anAttr = aMeshSObj.FindAttribute("AttributeName")[1] anAttr = anAttr._narrow(SALOMEDS.AttributeName); aMeshName = anAttr.Value() + aMeshNamePic = re.sub(".","_",aMeshName) print " ", aMeshName aFolderIter = myLocalStudy.NewChildIterator(aMeshSObj); @@ -306,13 +312,13 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi anEntityId = "3" if HasValue(thePrsTypeList,VISU.TMESH) : - print " ", anEntityName, + print " ", anEntityName, aMeshName, aMesh = theVisu.MeshOnEntity(theResult,aMeshName,anEntity) if aMesh is None : print "Error" else : print ",OK" theView.DisplayOnly(aMesh) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName); theView.SavePicture(aPictureName) aVISUObjList.append(aMesh) @@ -331,7 +337,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aMesh) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + anFamilyName + "." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + anFamilyName + "." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName); theView.SavePicture(aPictureName) aVISUObjList.append(aMesh) @@ -351,7 +357,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aMesh) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + aGroupName + "." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + aGroupName + "." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName); theView.SavePicture(aPictureName) aVISUObjList.append(aMesh) @@ -399,7 +405,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSCALARMAP." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSCALARMAP." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName); theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -411,7 +417,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TISOSURFACE." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TISOSURFACE." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName); theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -424,7 +430,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi aPrsObj.SetOrientationType(VISU.CutPlanes.ZX) theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTPLANES." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTPLANES." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -438,7 +444,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi aPrsObj.SetOrientationType2(VISU.CutPlanes.ZX) theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTLINES." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TCUTLINES." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -452,19 +458,19 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TDEFORMEDSHAPE." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TDEFORMEDSHAPE." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) if HasValue(thePrsTypeList,VISU.TVECTORS) : print " Creating VectorsOnField", - aPrsObj = theVisu.VectorsOnField(theResult,aMeshName,anEntity,aFieldName,aTimeStampId) + aPrsObj = theVisu.VectorsOnField(theResult,aMeshNamePic,anEntity,aFieldName,aTimeStampId) if aPrsObj is None : print "Error" else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TVECTORS." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TVECTORS." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -476,7 +482,7 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshName + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSTREAMLINES." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSTREAMLINES." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) aVISUObjList.append(aPrsObj) @@ -491,3 +497,340 @@ def generateName(prefix = None): return "Study" + str(int) else : return prefix + str(int) + + + +# ---------------------- +# MESH +# ---------------------- +def try_mesh_parameters(theMeshPattern): + aResult = [] + if theMeshPattern is None : return aResult ; + theMeshPattern = theMeshPattern._narrow(VISU.Mesh) + if theMeshPattern is None : return aResult ; + + aTYPES = [VISU.POINT, VISU.WIREFRAME, VISU.SHADED, VISU.INSIDEFRAME, VISU.SHRINK] + import copy; import os; + for ind in aTYPES: + aNewMesh = copy.deepcopy(theMeshPattern); + aNewMesh.SetPresentationType(ind) + aResult.append(aNewMesh) + + return aResult + + +# ---------------------------- +# SCALAR MAP +# ---------------------------- +ind=1 #try safe way +def try_scalarmap_parameters(thePattern, dump = 0): + + if thePattern is None : return None + + SCALING = [VISU.LINEAR, VISU.LOGARITHMIC] + import copy + import random + + anObj = thePattern#copy.deepcopy(thePattern); + #ind = random.randint(1,2) + if ind%2 : + #try incorrect value deliberately (but allowed by idl description) + #try SetScalarMode(long) + mode = random.randint(-100000,100000); #incorrect value deliberately + else: + #correct value of ScalarMode + mode = random.randint(0, 3) + + if dump : print "\tSetScalarMode(" + str(mode) +")" + anObj.SetScalarMode(mode) + + # --- SCALING --- + scal = random.randint(0,1) + if dump : print "\tSetScaling(" + str(SCALING[scal]) +")" + anObj.SetScaling(SCALING[scal]) + + # --- BOUNDARIES --- + if ind%2 : + alfa = random.random()*random.randint(-100000,100000) + betta = random.random()*random.randint(-100000,100000) + aMin = alfa; aMax = betta + else: + #more correct set + aPMin = thePattern.GetMin() + aPMax = thePattern.GetMax() + aLen = aPMax - aPMin + alfa = random.random()%0.5 + betta = random.random()%0.5 + aMin = alfa*aLen*random.randint(-1,1) + aPMin + aMax = betta*aLen*random.randint(-1,1) + aPMax + if dump : print "\tSetRange(" + str(aMin) + ", " + str(aMax) + ")" + anObj.SetRange(aMin, aMax) + + # --- POSITION --- + if ind%2: + X=random.random()*random.randint(-100000,100000) + Y=random.random()*random.randint(-100000,100000) + else : + X=random.random() + Y=random.random() + if dump : print "SetPosition("+ str(X) + ", " + str(Y) + " )" + anObj.SetPosition(X, Y) + + # --- SCALAR BAR SIZE --- + if ind%2: + aWidth=random.random()*random.randint(-100000,100000) + aHeight=random.random()*random.randint(-100000,100000) + else : + aWidth=random.random() + aHeight=random.random() + if dump : print " SCALAR BAR Width = " + str(aWidth) + " Height = ", str(aHeight) + anObj.SetSize(aWidth, aHeight) + + return anObj + + +def dump_scalarmap_parameters(anObj): + + print "\tGetScalarMode() = " + str(anObj.GetScalarMode()) + print "\tGetScaling() = " + str(anObj.GetScaling()) + print "\tGetMin() = " + str(anObj.GetMin()) + " GetMax() = " + str (anObj.GetMax()) + print "\tGetOrientation() = " + str(anObj.GetOrientation()) + print "\tGetPosX() = ", str(anObj.GetPosX()) + " GetPosY() = ", str(anObj.GetPosY()) + print "\tGetWidth() = ", str ( anObj.GetWidth()) + " GetHeight() = " + str(anObj.GetHeight()) + +# ---------------------- +# DEFORMED SHAPE +# ---------------------- +def try_deformedshape_parameters(thePattern) : + + if thePattern is None : return None + import copy + import random + + anObj = try_scalarmap_parameters(thePattern) + + # --- SCALING --- + if ind%2: + anObj.SetScale( random.random()*random.randint(-100000, 100000)) + else : + anObj.SetScale( anObj.GetScale()*random.random()) + + return anObj + + +def dump_deformedshape_parameters(theObject): + dump_scalarmap_parameters(theObject) + print "GetScale() = ", theObject.GetScale() + +# ---------------------- +# CUT PLANES +# ---------------------- +def try_cutplanes_parameters(thePattern) : + + if thePattern is None : return aList + import copy + import random + + ORIENT = [VISU.CutPlanes.XY, VISU.CutPlanes.YZ, VISU.CutPlanes.ZX] + + ind = random.randint(1,2) + anObj = try_scalarmap_parameters(thePattern) + + # --- ORIENTATION --- + anObj.SetOrientationType(ORIENT[random.randint(0,2)]) + + # --- NUMBER OF PLANES --- + if ind%2 : anObj.SetNbPlanes(random.randint(-40,40)) + else : anObj.SetNbPlanes(random.randint(0,10)) #try behaivor if NbPlanes=0 + + # --- DISPLACEMENT --- + anObj.SetDisplacement(random.randint(-100000,100000)) + + # --- PLANE POSITION --- + if ind%2: + PlaneNb = random.randint(-100000,100000) #incorrect value is possible + else : PlaneNb = random.randint(0, anObj.GetNbPlanes()) + + anObj.SetPlanePosition(PlaneNb, random.random()*random.randint(-100000,100000)) + + # --- SET DEFAULT --- + anObj.SetDefault(PlaneNb) + + # --- SET X,Y,Z ROTATION --- + if ind%2 : + angle1 = random.random()*random.randint(-100000,100000) + angle2 = random.random()*random.randint(-100000,100000) + else : + angle1 = random.random()*3.14 + angle2 = random.random()*3.14 + + anObj.SetRotateX(angle1) + anObj.SetRotateY(angle2) + + return anObj + +def dump_cutplanes_parameters(theObject): + dump_saclarmap_parameters(theObject) + + print "GetOrientationType = " + str(theObject.GetOrientationType()) + PlanesNb = theObject.GetNbPlanes() + print "GetNbPlanes() = ", str(PlanesNb) + for i in range(0,PlanesNb+1): + if theObject.IsDefault(i) : + print "Default plane : "+str(i); break + print "GetPlanePosition(" + str(i) + ") = ", theObject.GetPlanePosition(i) + print "GetDisplacement() = ", str(theObject.GetDisplacement()) + print "GetRotateX() = ", str(theObject.GetRotateX()) + print "GetRotateY() = ", str(theObject.GetRotateY()) + print "GetRotateZ() = ", str(theObject.GetRotateZ()) + +# ---------------------- +# CUT LINES +# ---------------------- +def try_cutlines_parameters(thePattern): + + if thePattern is None : return None + import copy + import random + + ORIENT = [VISU.CutPlanes.XY, VISU.CutPlanes.YZ, VISU.CutPlanes.ZX] + ind = random.randint(1,2) + anObj = try_scalarmap_parameters(thePattern) + + # --- ORIENTATION --- + anObj.SetOrientationType(ORIENT[random.randint(0,2)]) + anObj.SetOrientationType2(ORIENT[random.randint(0,2)]) + + # --- Base Plane Position --- + anObj.SetBasePlanePosition( random.random()*random.randint(-100000,100000)) + + # --- NUMBER OF LINES --- + if ind%2: + anObj.SetNbLines(random.randint(-5, 50)) + + # --- ROTATION --- + anObj.SetRotateX(random.randint(-100,100)*random.random()) + anObj.SetRotateX2(random.randint(-100,100)*random.random()) + anObj.SetRotateY(random.randint(-100,100)*random.random()) + anObj.SetRotateY2(random.randint(-100,100)*random.random()) + + return anObj + +def dump_cutlines_parameters(theObject): + dump_scalarmap_parameters(theObject) + + print "GetOrientationType() = " + str(theObject.GetOrientationType()) + print "GetOrientationType2() = " + str(theObject.GetOrientationType2()) + print "GetBasePlanePosition() = "+ str(theObject.GetBasePlanePosition()) + print "GetNbLines() = " + str(theObject.GetNbLines()) + print "GetRotateX() = ", str(theObject.GetRotateX()) + print "GetRotateX2() = ", str(theObject.GetRotateX2()) + print "GetRotateY() = ", str(theObject.GetRotateY()) + print "GetRotateY2() = ", str(theObject.GetRotateY2()) + +# ---------------------- +# STREAM LINES +# ---------------------- +def try_streamlines_parameters(thePattern): + + if thePattern is None : return None + import copy + import random + + DIRECTION = [VISU.StreamLines.FORWARD, VISU.StreamLines.BACKWARD, VISU.StreamLines.BOTH] + + ind = random.randint(1,2) + anObj = (try_deformedshape_parameters(thePattern))[0] + + # --- DIREACTION --- + anObj.SetDirection(DIRECTION[random.randint(0,2)]) + + # --- STEP LENGTH --- + if ind%2 : anObj.SetStepLength(random.random()*random.randint(-1000,1000)) + else : + aLen = anObj.GetMax() - anObj.GetMin() + anObj.SetStepLength(aLen/random.randint(1,100)) + + # --- PROPAGATION TIME --- + anObj.SetPropagationTime(random.random()*random.randint(1,100)) + + # --- INTEGRATION STEP --- + if ind%2 : + anObj.SetIntegrationStep(random.random()*random.randint(-1000,1000)) + else: + anObj.SetIntegrationStep(random.random()) + + # --- USED POINT --- + anObj.SetUsedPoints(random.random()*random.randint(-10000,10000)) + + return anObj + +def dump_streamlines_parameters(theObject): + + dump_deformedshape_parameters(theObject) + + print "GetDirection() = " + str(theObject.GetDirection()) + print "GetStepLength() = " + str(theObject.GetStepLength()) + print "GetPropagationTime() =" + str(theObject.GetPropagationTime()) + print "GetIntegrationStep() =" + str(theObject.GetIntegrationStep()) + print "GetUsedPoints() =" + str(theObject.GetUsedPoints()) + +# ---------------------- +# VECTORS +# ---------------------- +def try_vectors_parameters(thePattern, theNum): + + if thePattern is None : return None + import copy + import random + GLIPH_TYPE = [VISU.Vectors.ARROW, VISU.Vectors.CONE2, VISU.Vectors.CONE6, VISU.Vectors.NONE] + GLIPH_POS = [VISU.Vectors.CENTER, VISU.Vectors.TAIL, VISU.Vectors.HEAD] + ind = random.randint(1,2) + anObj = (try_deformedshape_parameters(thePattern))[0] + + # --- LINE WIDTH --- + if ind%2 : + anObj.SetLineWidth(random.random()*random.randint(-10000,10000)) + else : + anObj.SetLineWidth(random.randint(1, 10)) + + # --- GLIPH TYPE --- + anObj.SetGlyphType(GLIPH_TYPE[random.randint(0, len(GLIPH_TYPE)-1)]) + + # --- GLIPH POS --- + anObj.SetGlyphPos(GLIPH_POS[random.randint(0, len(GLIPH_POS)-1)]) + + return anObj + +def dump_vetctors_parameters(theObject): + + dump_deformedshape_parameters(theObject) + + print "GetLineWidth() = " +str(theObject.GetLineWidth()) + print "GetGlyphType() = " +str(theObject.GetGlyphType()) + print "GetGlyphPos() = " +str(theObject.GetGlyphPos()) + + +# ---------------------- +# ISO SURFACES +# ---------------------- + +def try_isosurfaces_parameters(thePattern) : + if thePattern is None : return None + import copy + import random + + anObj = try_scalarmap_parameters(thePattern) + ind = random.randint(1,2) + # --- SURFACES NUMBER --- + if ind%2 : + anObj.SetNbSurfaces(random.randint(-100000,100000)) + else: + anObj.SetNbSurfaces(random.randint(1, 50)) + + return anObj + +def dump_isosurfaces_parameters(theObject): + + dump_scalarmap_parameters(theObject) + print "GetNbSurfaces() = "+ str(theObject.GetNbSurfaces()) diff --git a/src/VISU_SWIG/visu_med.py b/src/VISU_SWIG/visu_med.py index dda0c4e8..2a75f06a 100644 --- a/src/VISU_SWIG/visu_med.py +++ b/src/VISU_SWIG/visu_med.py @@ -42,7 +42,7 @@ def getFieldObjectFromStudy(number,subnumber): med_comp = salome.lcc.FindOrLoadComponent("FactoryServer", "MED") -medDir = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/' +medDir = os.getenv('SALOME_ROOT_DIR') + '/data/' def importMedFrom(medDir,medFile): medFile = medDir + medFile diff --git a/src/VISU_SWIG/visu_view3d.py b/src/VISU_SWIG/visu_view3d.py index f94f29ee..1248289f 100644 --- a/src/VISU_SWIG/visu_view3d.py +++ b/src/VISU_SWIG/visu_view3d.py @@ -20,7 +20,7 @@ myVisu = visu_gui.myVisu medFile = "fra.med" myFieldName = "VITESSE"; -medFile = os.getenv('SALOME_ROOT_DIR') + '/../SALOME_ROOT/data/' + medFile +medFile = os.getenv('SALOME_ROOT_DIR') + '/data/' + medFile myResult = myVisu.ImportFile(medFile) aMeshName ="LE VOLUME" -- 2.39.2