X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FKERNEL_PY%2Fkernel%2Fstudyedit.py;h=091dcf2e0ddc91706d3f6f5e78a6edbbf0012d70;hb=a4874256219c549a9b1ff740d549391c4bf2f25f;hp=6ea5a386dabc1ffbaf4005fade3ee61de278d630;hpb=95dc0659dad5ce5ae4fdc9177fb34108c4d902e7;p=modules%2Fkernel.git diff --git a/src/KERNEL_PY/kernel/studyedit.py b/src/KERNEL_PY/kernel/studyedit.py index 6ea5a386d..091dcf2e0 100644 --- a/src/KERNEL_PY/kernel/studyedit.py +++ b/src/KERNEL_PY/kernel/studyedit.py @@ -1,4 +1,4 @@ -# Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -31,118 +31,84 @@ This module provides a new class :class:`StudyEditor` to complement import re -import salome -from salome.kernel.logger import Logger from salome.kernel import termcolor -logger = Logger("salome.kernel.studyedit", color = termcolor.PURPLE) +from salome.kernel.logger import Logger -_editors = {} -_DEFAULT_CONTAINER = "FactoryServer" -# The codec to use for strings that are displayed in Salome study tree is UTF-8 -ENCODING_FOR_SALOME_STUDY = "utf-8" +logger = Logger("salome.kernel.studyedit", color=termcolor.PURPLE) + +_DEFAULT_CONTAINER = "FactoryServer" -## Return the ID of the active study. In GUI mode, this function is equivalent -# to salome.sg.getActiveStudyId(). Outside GUI, it returns salome.myStudyId -# variable. -# \ingroup studyedit -def getActiveStudyId(): - """ - Return the ID of the active study. In GUI mode, this function is equivalent - to ``salome.sg.getActiveStudyId()``. Outside GUI, it returns - ``salome.myStudyId`` variable. - """ - salome.salome_init() - # Warning: we don't use salome.getActiveStudy() here because it doesn't - # work properly when called from Salome modules (multi-study interpreter - # issue) - if salome.hasDesktop(): - return salome.sg.getActiveStudyId() - else: - return salome.myStudyId - -def getActiveStudy(): - return getStudyFromStudyId(getActiveStudyId()) - -def getStudyFromStudyId(studyId): - salome.salome_init() - study = salome.myStudyManager.GetStudyByID(studyId) - return study - -def getStudyIdFromStudy(study): - studyId = study._get_StudyId() - return studyId - -## Return a \b StudyEditor instance to edit the study with ID studyId. -# If \b studyId is \b None, return an editor for the current study. -# \ingroup studyedit -def getStudyEditor(studyId = None): - """ - Return a :class:`StudyEditor` instance to edit the study with ID - `studyId`. If `studyId` is :const:`None`, return an editor for the current - study. - """ - if studyId is None: - studyId = getActiveStudyId() - if not _editors.has_key(studyId): - _editors[studyId] = StudyEditor(studyId) - return _editors[studyId] ## This class provides utility methods to complement \b Study and # \b StudyBuilder classes. Those methods may be moved in those classes -# in the future. The parameter \b studyId defines the ID of the study to -# edit. If it is \em None, the edited study will be the current study. +# in the future. # The preferred way to get a StudyEditor object is through the method -# \b getStudyEditor which allows to reuse existing instances. +# \b getStudyEditor which allows to reuse existing instance or through +# the global module attribute \b EDITOR. # -# \param studyId This instance attribute contains the ID of the edited study. -# This attribute should not be modified. +# \param lcc This instance attribute provides access to the SALOME life cycle +# CORBA service. # -# \param study This instance attribute contains the underlying \b Study object. -# It can be used to access the study but the attribute itself should not +# \param study This instance attribute provides access to the \b Study object. +# It can be used to access the study but the attribute itself cannot # be modified. # -# \param builder This instance attribute contains the underlying \b StudyBuilder +# \param builder This instance attribute provides access to the \b StudyBuilder # object. It can be used to edit the study but the attribute itself -# should not be modified. +# cannot be modified. # \ingroup studyedit class StudyEditor: """ This class provides utility methods to complement :class:`Study` and :class:`StudyBuilder` classes. Those methods may be moved in those classes - in the future. The parameter `studyId` defines the ID of the study to - edit. If it is :const:`None`, the edited study will be the current study. + in the future. The preferred way to get a StudyEditor object is through the method :meth:`getStudyEditor` which allows to reuse existing instances. - .. attribute:: studyId + .. attribute:: lcc - This instance attribute contains the ID of the edited study. This - attribute should not be modified. + This instance attribute provides access to the SALOME life cycle + CORBA service. .. attribute:: study - This instance attribute contains the underlying :class:`Study` object. - It can be used to access the study but the attribute itself should not + This instance attribute provides access to the :class:`Study` object. + It can be used to access the study but the attribute itself cannot be modified. .. attribute:: builder - This instance attribute contains the underlying :class:`StudyBuilder` + This instance attribute provides access to the :class:`StudyBuilder` object. It can be used to edit the study but the attribute itself - should not be modified. + cannot be modified. """ - def __init__(self, studyId = None): + + @property + def study(self): + """Attribute that provides access to the study.""" + import salome salome.salome_init() - if studyId is None: - studyId = getActiveStudyId() - self.studyId = studyId - self.study = salome.myStudyManager.GetStudyByID(studyId) - if self.study is None: - raise Exception("Can't create StudyEditor object: " - "Study %d doesn't exist" % studyId) - self.builder = self.study.NewBuilder() + if salome.myStudy is None: + raise Exception("Study doesn't exist") + return salome.myStudy + + @property + def builder(self): + """Attribute that provides access to the study builder.""" + import salome + salome.salome_init() + if salome.myStudy is None: + raise Exception("Study doesn't exist") + return salome.myStudy.NewBuilder() + + @property + def lcc(self): + """Attribute that providess access to the SALOME life cycle CORBA service.""" + import salome + salome.salome_init() + return salome.lcc ## Find a component corresponding to the Salome module \b moduleName in # the study. If none is found, create a new component and associate it @@ -221,7 +187,7 @@ class StudyEditor: #attr = self.builder.FindOrCreateAttribute( sComponent, "AttributeParameter" ) #attr.SetString( "ENGINE_NAME", engineName ) - engine = salome.lcc.FindOrLoadComponent(containerName, moduleName) + engine = self.lcc.FindOrLoadComponent(containerName, moduleName) if engine is None: raise Exception("Cannot load engine %s in container %s. See " "logs of container %s for more details." % @@ -244,8 +210,8 @@ class StudyEditor: # engine name will be stored separately from the module name. #attr = self.builder.FindOrCreateAttribute( sComponent, "AttributeParameter" ) #engineName = attr.GetString( "ENGINE_NAME" ) - engine = salome.lcc.FindOrLoadComponent(containerName, - sComponent.GetComment()) + engine = self.lcc.FindOrLoadComponent(containerName, + sComponent.GetComment()) if engine is None: raise Exception("Cannot load component %s in container %s. See " "logs of container %s for more details." % @@ -339,19 +305,19 @@ class StudyEditor: # \return new SObject created in the study. # # See \b setItem() for the description of the other parameters. - def createItem(self, fatherItem, name, fileType = None, fileName = None, - comment = None, icon = None, IOR = None, typeId = None): + def createItem(self, fatherItem, name, fileType=None, fileName=None, + comment=None, icon=None, IOR=None, typeId=None): """ Create a new object named `name` under `fatherItem` in the study, with the given attributes. If an object named `name` already exists under the father object, the new object is created with a new name `name_X` where X is the first available index. - + :type fatherItem: SObject :param fatherItem: item under which the new item will be added. - + :return: new SObject created in the study - + See :meth:`setItem` for the description of the other parameters. """ aSObject = self.builder.NewObject(fatherItem) @@ -366,11 +332,10 @@ class StudyEditor: aSObj = aChildIterator.Value() aChildIterator.Next() aName = aSObj.GetName() - if re.match(aNameRE,aName): + if re.match(aNameRE, aName): aTmp = aName[aLength:] - if re.match(anIdRE,aTmp): - import string - anId = string.atol(aTmp[1:]) + if re.match(anIdRE, aTmp): + anId = int(aTmp[1:]) if aMaxId < anId: aMaxId = anId pass @@ -380,16 +345,16 @@ class StudyEditor: pass pass pass - + aMaxId = aMaxId + 1 aName = name if aMaxId > 0: aName = aName + aDelim + str(aMaxId) pass - + self.setItem(aSObject, aName, fileType, fileName, comment, icon, IOR, typeId) - + return aSObject ## Modify the attributes of an item in the study. Unspecified attributes @@ -496,7 +461,7 @@ class StudyEditor: else: self.builder.RemoveObject(item) ok = True - except: + except Exception: ok = False return ok @@ -540,21 +505,19 @@ class StudyEditor: ## Return the name of the object sObject def getName(self, sObject): - val = sObject.GetName() - return unicode(val, ENCODING_FOR_SALOME_STUDY) + return sObject.GetName() ## Set the name of the object sObject def setName(self, sObject, name): - self.builder.SetName(sObject, name.encode(ENCODING_FOR_SALOME_STUDY)) + self.builder.SetName(sObject, name) ## Return the comment of the object sObject def getComment(self, sObject): - val = sObject.GetComment() - return unicode(val, ENCODING_FOR_SALOME_STUDY) + return sObject.GetComment() ## Set the comment of the object sObject def setComment(self, sObject, comment): - self.builder.SetComment(sObject, comment.encode(ENCODING_FOR_SALOME_STUDY)) + self.builder.SetComment(sObject, comment) ## Return the value of the attribute named \b attributeName on the object # sObject, or \b default if the attribute doesn't exist. @@ -604,8 +567,7 @@ class StudyEditor: Return the value of the attribute "AttributeFileType" of the object `sObject`, or an empty string if it is not set. """ - val = self.getAttributeValue(sObject, "AttributeFileType", "") - return unicode(val, ENCODING_FOR_SALOME_STUDY) + return self.getAttributeValue(sObject, "AttributeFileType", "") ## Set the attribute "AttributeFileType" of the object sObject to the # value value. @@ -615,7 +577,7 @@ class StudyEditor: value `value`. """ self.setAttributeValue(sObject, "AttributeFileType", - value.encode(ENCODING_FOR_SALOME_STUDY)) + value) ## Return the value of the attribute "AttributeExternalFileDef" of the # object sObject, or an empty string if it is not set. @@ -624,8 +586,7 @@ class StudyEditor: Return the value of the attribute "AttributeExternalFileDef" of the object `sObject`, or an empty string if it is not set. """ - val = self.getAttributeValue(sObject, "AttributeExternalFileDef", "") - return unicode(val, ENCODING_FOR_SALOME_STUDY) + return self.getAttributeValue(sObject, "AttributeExternalFileDef", "") ## Set the attribute "AttributeExternalFileDef" of the object sObject # to the value value. @@ -635,7 +596,7 @@ class StudyEditor: to the value `value`. """ self.setAttributeValue(sObject, "AttributeExternalFileDef", - value.encode(ENCODING_FOR_SALOME_STUDY)) + value) ## Return the value of the attribute "AttributePixMap" of the object # sObject, or an empty string if it is not set. @@ -648,7 +609,7 @@ class StudyEditor: found, attr = self.builder.FindAttribute(sObject, "AttributePixMap") if found and attr.HasPixMap(): value = attr.GetPixMap() - return unicode(value, ENCODING_FOR_SALOME_STUDY) + return value ## Set the attribute "AttributePixMap" of the object sObject to the # value value. @@ -658,4 +619,19 @@ class StudyEditor: value `value`. """ attr = self.builder.FindOrCreateAttribute(sObject, "AttributePixMap") - attr.SetPixMap(value.encode(ENCODING_FOR_SALOME_STUDY)) + attr.SetPixMap(value) + +## Singleton study editor instance. +# \ingroup studyedit +EDITOR = StudyEditor() +"""Singleton study editor instance.""" + +## Return a \b StudyEditor instance to edit the study. +# \deprecated This function is kept for backward compatibility. Use \a EDITOR instead. +# \ingroup studyedit +def getStudyEditor(): + """ + Return a :class:`StudyEditor` instance to edit the study. + """ + global EDITOR + return EDITOR