Salome HOME
Fix possible problems with custom SALOME modules (resources folder does not include...
[modules/kernel.git] / bin / runSalome.py
index 98ff0a19fe5369b9677d5d09d3f29ede95ef21a4..722629ad4694265738e3dee09443f937a813f01c 100755 (executable)
@@ -1,11 +1,30 @@
 #!/usr/bin/env python
 
+# Copyright (C) 2005  OPEN CASCADE, CEA, EDF R&D, LEG
+#           PRINCIPIA R&D, EADS CCR, Lip6, BV, CEDRAT
+# 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+# 
+
 import sys, os, string, glob, time, pickle
 import orbmodule
 
 process_id = {}
 
-# salome_subdir variable is used for composing paths like $KERNEL_ROOT_DIR/share/salome/resources, etc.
+# salome_subdir variable is used for composing paths like $KERNEL_ROOT_DIR/share/salome/resources/kernel, etc.
 # before moving to SUIT-based gui, instead of salome_subdir there was args['appname'] used.
 # but after - 'appname'  = "SalomeApp", so using it in making the subdirectory is an error.
 salome_subdir = "salome"
@@ -56,8 +75,9 @@ def get_config():
     modules_list = []
     if args.has_key("modules"):
         modules_list += args["modules"]
-    # KERNEL must be last in the list to locate it at the first place in PATH 
-    modules_list[:0] = ["GUI"]
+    # KERNEL must be last in the list to locate it at the first place in PATH
+    if args["gui"] :
+        modules_list[:0] = ["GUI"]
     modules_list[:0] = ["KERNEL"]
     modules_list.reverse()
 
@@ -103,7 +123,8 @@ def set_env(args, modules_list, modules_root_dir):
     
     python_version="python%d.%d" % sys.version_info[0:2]
     modules_root_dir_list = []
-    modules_list = modules_list[:] + ["GUI"] 
+    if args["gui"] :
+        modules_list = modules_list[:] + ["GUI"] 
     modules_list = modules_list[:] + ["KERNEL"] 
     for module in modules_list :
         if modules_root_dir.has_key(module):
@@ -151,7 +172,7 @@ def set_env(args, modules_list, modules_root_dir):
         os.environ["SMESH_MeshersList"]="StdMeshers"
         if not os.environ.has_key("SALOME_StdMeshersResources"):
             os.environ["SALOME_StdMeshersResources"] \
-            = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources"
+            = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources/smesh"
             pass
         if args.has_key("SMESH_plugins"):
             for plugin in args["SMESH_plugins"]:
@@ -169,7 +190,7 @@ def set_env(args, modules_list, modules_root_dir):
                     = os.environ["SMESH_MeshersList"]+":"+plugin
                     if not os.environ.has_key("SALOME_"+plugin+"Resources"):
                         os.environ["SALOME_"+plugin+"Resources"] \
-                        = plugin_root+"/share/"+args["appname"]+"/resources"
+                        = plugin_root+"/share/"+args["appname"]+"/resources/"+plugin.lower()
                     add_path(os.path.join(plugin_root,"lib",python_version,
                                           "site-packages",salome_subdir),
                              "PYTHONPATH")
@@ -187,30 +208,29 @@ def set_env(args, modules_list, modules_root_dir):
     # set environment for SUPERV module
     os.environ["ENABLE_MACRO_NODE"]="1"
     # set resources variables if not yet set
-    if os.getenv("GUI_ROOT_DIR"):
-        if not os.getenv("SUITRoot"): os.environ["SUITRoot"] =  os.getenv("GUI_ROOT_DIR") + "/share/salome"
-        if not os.getenv("SalomeAppConfig"): os.environ["SalomeAppConfig"] =  os.getenv("GUI_ROOT_DIR") + "/share/salome/resources"
-        pass   
+    # Done now by launchConfigureParser.py
+    #if os.getenv("GUI_ROOT_DIR"):
+        #if not os.getenv("SalomeAppConfig"): os.environ["SalomeAppConfig"] =  os.getenv("GUI_ROOT_DIR") + "/share/salome/resources/gui"
 
     # set CSF_PluginDefaults variable only if it is not customized
     # by the user
     if not os.getenv("CSF_PluginDefaults"):
         os.environ["CSF_PluginDefaults"] \
         = os.path.join(modules_root_dir["KERNEL"],"share",
-                       salome_subdir,"resources")
+                       salome_subdir,"resources","kernel")
     os.environ["CSF_SALOMEDS_ResourcesDefaults"] \
     = os.path.join(modules_root_dir["KERNEL"],"share",
-                   salome_subdir,"resources")
+                   salome_subdir,"resources","kernel")
 
     if "GEOM" in modules_list:
         print "GEOM OCAF Resources"
         os.environ["CSF_GEOMDS_ResourcesDefaults"] \
         = os.path.join(modules_root_dir["GEOM"],"share",
-                       salome_subdir,"resources")
+                       salome_subdir,"resources","geom")
        print "GEOM Shape Healing Resources"
         os.environ["CSF_ShHealingDefaults"] \
         = os.path.join(modules_root_dir["GEOM"],"share",
-                       salome_subdir,"resources")
+                       salome_subdir,"resources","geom")
 
 # -----------------------------------------------------------------------------
 
@@ -324,15 +344,30 @@ class CatalogServer(Server):
         cata_path=[]
         list_modules = modules_list[:]
         list_modules.reverse()
-        for module in ["KERNEL", "GUI"] + list_modules:
+        if self.args["gui"] :
+            list_modules = ["KERNEL", "GUI"] + list_modules
+        else :
+            list_modules = ["KERNEL"] + list_modules
+        for module in list_modules:
             if modules_root_dir.has_key(module):
                 module_root_dir=modules_root_dir[module]
                 module_cata=module+"Catalog.xml"
                 #print "   ", module_cata
-                cata_path.extend(
-                    glob.glob(os.path.join(module_root_dir,
-                                           "share",salome_subdir,
-                                           "resources",module_cata)))
+                if os.path.exists(os.path.join(module_root_dir,
+                                               "share",salome_subdir,
+                                               "resources",module.lower(),
+                                               module_cata)):
+                    cata_path.extend(
+                        glob.glob(os.path.join(module_root_dir,
+                                               "share",salome_subdir,
+                                               "resources",module.lower(),
+                                               module_cata)))
+                else:
+                    cata_path.extend(
+                        glob.glob(os.path.join(module_root_dir,
+                                               "share",salome_subdir,
+                                               "resources",
+                                               module_cata)))
                 pass
             pass
         self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
@@ -389,7 +424,10 @@ class LoggerServer(Server):
 
 class SessionServer(Server):
     def __init__(self,args):
-        self.args=args
+        self.args = args.copy()
+        # Bug 11512 (Problems with runSalome --xterm on Mandrake and Debian Sarge)
+        self.args['xterm']=0
+        #
         self.initArgs()
         self.SCMD1=['SALOME_Session_Server']
         self.SCMD2=[]
@@ -417,7 +455,7 @@ class SessionServer(Server):
             self.SCMD2+=['SUPERV']
         if self.args['gui']:
             self.SCMD2+=['GUI']
-        if self.args['splash']:
+        if self.args['splash'] and self.args['gui']:
             self.SCMD2+=['SPLASH']
         if self.args['noexcepthandler']:
             self.SCMD2+=['noexcepthandler']
@@ -431,15 +469,29 @@ class SessionServer(Server):
         cata_path=[]
         list_modules = modules_list[:]
         list_modules.reverse()
-        for module in ["KERNEL", "GUI"] + list_modules:
+        if self.args["gui"] :
+            list_modules = ["KERNEL", "GUI"] + list_modules
+        else :
+            list_modules = ["KERNEL"] + list_modules
+        for module in list_modules:
             module_root_dir=modules_root_dir[module]
             module_cata=module+"Catalog.xml"
             #print "   ", module_cata
-            cata_path.extend(
-                glob.glob(os.path.join(module_root_dir,"share",
-                                       salome_subdir,"resources",
-                                       module_cata)))
-        if 'moduleCatalog' in self.args['embedded']:
+            if os.path.exists(os.path.join(module_root_dir,
+                                           "share",salome_subdir,
+                                           "resources",module.lower(),
+                                           module_cata)):
+                cata_path.extend(
+                    glob.glob(os.path.join(module_root_dir,"share",
+                                           salome_subdir,"resources",
+                                           module.lower(),module_cata)))
+            else:
+                cata_path.extend(
+                    glob.glob(os.path.join(module_root_dir,"share",
+                                           salome_subdir,"resources",
+                                           module_cata)))
+            pass
+        if (self.args["gui"]) & ('moduleCatalog' in self.args['embedded']):
             self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
         else:
             self.CMD=self.SCMD1 + self.SCMD2
@@ -452,34 +504,46 @@ class ContainerManagerServer(Server):
         self.initArgs()
         self.SCMD1=['SALOME_ContainerManagerServer']
         self.SCMD2=[]
-        if 'registry' in self.args['embedded']:
-            self.SCMD1+=['--with','Registry',
-                         '(','--salome_session','theSession',')']
-        if 'moduleCatalog' in self.args['embedded']:
-            self.SCMD1+=['--with','ModuleCatalog','(','-common']
-            self.SCMD2+=['-personal',
-                         '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
-        if 'study' in self.args['embedded']:
-            self.SCMD2+=['--with','SALOMEDS','(',')']
-        if 'cppContainer' in self.args['embedded']:
-            self.SCMD2+=['--with','Container','(','FactoryServer',')']
+        if args["gui"] :
+            if 'registry' in self.args['embedded']:
+                self.SCMD1+=['--with','Registry',
+                             '(','--salome_session','theSession',')']
+            if 'moduleCatalog' in self.args['embedded']:
+                self.SCMD1+=['--with','ModuleCatalog','(','-common']
+                self.SCMD2+=['-personal',
+                             '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
+            if 'study' in self.args['embedded']:
+                self.SCMD2+=['--with','SALOMEDS','(',')']
+            if 'cppContainer' in self.args['embedded']:
+                self.SCMD2+=['--with','Container','(','FactoryServer',')']
         
     def setpath(self,modules_list,modules_root_dir):
         cata_path=[]
         list_modules = modules_list[:]
         list_modules.reverse()
-        for module in ["KERNEL", "GUI"] + list_modules:
+        if self.args["gui"] :
+            list_modules = ["GUI"] + list_modules
+        for module in ["KERNEL"] + list_modules:
             if modules_root_dir.has_key(module):
                 module_root_dir=modules_root_dir[module]
                 module_cata=module+"Catalog.xml"
                 #print "   ", module_cata
-                cata_path.extend(
-                    glob.glob(os.path.join(module_root_dir,"share",
-                                           self.args['appname'],"resources",
-                                           module_cata)))
+                if os.path.exists(os.path.join(module_root_dir,
+                                               "share",salome_subdir,
+                                               "resources",module.lower(),
+                                               module_cata)):
+                    cata_path.extend(
+                        glob.glob(os.path.join(module_root_dir,"share",
+                                               self.args['appname'],"resources",
+                                               module.lower(),module_cata)))
+                else:
+                    cata_path.extend(
+                        glob.glob(os.path.join(module_root_dir,"share",
+                                               self.args['appname'],"resources",
+                                               module_cata)))
                 pass
             pass
-        if 'moduleCatalog' in self.args['embedded']:
+        if (self.args["gui"]) & ('moduleCatalog' in self.args['embedded']):
             self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
         else:
             self.CMD=self.SCMD1 + self.SCMD2
@@ -491,7 +555,7 @@ class NotifyServer(Server):
         self.modules_root_dir=modules_root_dir
         myLogName = os.environ["LOGNAME"]
         self.CMD=['notifd','-c',
-                  self.modules_root_dir["KERNEL"] +'/share/salome/resources/channel.cfg',
+                  self.modules_root_dir["KERNEL"] +'/share/salome/resources/kernel/channel.cfg',
                   '-DFactoryIORFileName=/tmp/'+myLogName+'_rdifact.ior',
                   '-DChannelIORFileName=/tmp/'+myLogName+'_rdichan.ior',
                   '-DReportLogFile=/tmp/'+myLogName+'_notifd.report',
@@ -503,7 +567,13 @@ class NotifyServer(Server):
 
 def startGUI():
     """Salome Session Graphic User Interface activation"""
+    import Engines
     import SALOME
+    import SALOMEDS
+    import SALOME_ModuleCatalog
+    reload(Engines)
+    reload(SALOME)
+    reload(SALOMEDS)
     import SALOME_Session_idl
     session=clt.waitNS("/Kernel/Session",SALOME.Session)
     session.GetInterface()
@@ -539,12 +609,20 @@ def startSalome(args, modules_list, modules_root_dir):
     myServer=NotifyServer(args,modules_root_dir)
     myServer.run()
 
+    # Lancement Session Server (to show splash ASAP)
+    #
+
+    if args["gui"]:
+        mySessionServ = SessionServer(args)
+        mySessionServ.setpath(modules_list,modules_root_dir)
+        mySessionServ.run()
+
     #
     # Lancement Registry Server,
     # attente de la disponibilite du Registry dans le Naming Service
     #
 
-    if 'registry' not in args['embedded']:
+    if ('registry' not in args['embedded']) | (args["gui"] == 0) :
         myServer=RegistryServer(args)
         myServer.run()
         clt.waitNSPID("/Registry",myServer.PID)
@@ -555,7 +633,7 @@ def startSalome(args, modules_list, modules_root_dir):
     #
     
 
-    if 'moduleCatalog' not in args['embedded']:
+    if ('moduleCatalog' not in args['embedded']) | (args["gui"] == 0):
         cataServer=CatalogServer(args)
         cataServer.setpath(modules_list,modules_root_dir)
         cataServer.run()
@@ -568,7 +646,7 @@ def startSalome(args, modules_list, modules_root_dir):
     #
 
     #print "ARGS = ",args
-    if 'study' not in args['embedded']:
+    if ('study' not in args['embedded']) | (args["gui"] == 0):
         print "RunStudy"
         myServer=SalomeDSServer(args)
         myServer.run()
@@ -626,20 +704,20 @@ def startSalome(args, modules_list, modules_root_dir):
         clt.waitNSPID("/Containers/" + theComputer + "/SuperVisionContainer",myServer.PID)
 
     #
-    # Lancement Session Server
-    #
-
-    mySessionServ = SessionServer(args)
-    mySessionServ.setpath(modules_list,modules_root_dir)
-    mySessionServ.run()
-##----------------        
-
     # Attente de la disponibilite du Session Server dans le Naming Service
     #
-
-    import SALOME
-    import SALOME_Session_idl
-    session=clt.waitNSPID("/Kernel/Session",mySessionServ.PID,SALOME.Session)
+    
+    if args["gui"]:
+##----------------        
+        import Engines
+        import SALOME
+        import SALOMEDS
+        import SALOME_ModuleCatalog
+        reload(Engines)
+        reload(SALOME)
+        reload(SALOMEDS)
+        import SALOME_Session_idl
+        session=clt.waitNSPID("/Kernel/Session",mySessionServ.PID,SALOME.Session)
 
     end_time = os.times()
     print