From dca038eeea6678c0b464df296f9e2dea740bb137 Mon Sep 17 00:00:00 2001 From: asamoukin Date: Sun, 16 Nov 2008 13:32:49 +0000 Subject: [PATCH] git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@499 c91db197-33c1-4113-bf15-f8a5c547ca64 --- pym/cl_profile.py | 87 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/pym/cl_profile.py b/pym/cl_profile.py index 3383dd2..7d269f5 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -1850,6 +1850,8 @@ class profile(_file, _terms): varStart = "#-" varEnd = "-#" self._reVar = re.compile(("%s[a-zA-Z0-9_-]+%s")%(varStart,varEnd),re.M) + self._reFunc = re.compile(("%s[a-zA-Z0-9_\-\+\(\)\,]+%s")\ + %(varStart,varEnd),re.M) self._deltVarStart = len(varStart) self._deltVarEnd = len(varEnd) # Условия @@ -1902,12 +1904,82 @@ class profile(_file, _terms): resS = self._reVar.search(textProfileTmp) return textProfileTmp - #def applyFuncProfile(self, textProfile, nameProfile): - #""" Применяет функции к тексту профиля - #""" - - #def profSum(varName,insertRes, varValue): - #"""Cуммирует и""" + def applyFuncProfile(self, textProfile): + """ Применяет функции к тексту профиля + """ + def equalTerm(term, sNum, localVars): + """Локальная функция для вычисления выражения""" + terms = sNum.findall(term) + if terms: + strNumers = [] + for n in terms: + strNum = n.strip() + try: + num = int(strNum) + except: + if localVars.has_key(strNum): + num = localVars[strNum] + elif self.objVar.exists(strNum): + try: + num = int(self.objVar.Get(strNum)) + except: + print _("error var %s not int")%str(strNum) + exit(1) + else: + print _("error local var %s not defined")\ + %str(strNum) + exit(1) + strNumers.append(num) + return sum(strNumers) + print _("error profile term %s, incorrect data")%str(term) + exit(1) + + def funcSum(resS,localVars,textProfileTmp): + """локальная функция вычисляет первую функцию sum() в профиле""" + terms = varName[4:-1].split(",") + # Название локальной переменной + nameLocVar = terms[0].strip() + if not localVars.has_key(nameLocVar): + localVars[nameLocVar] = 0 + if len(terms) == 2: + if terms[1].strip(): + localVars[nameLocVar] = equalTerm(terms[1],sNum, + localVars) + replace = str(localVars[nameLocVar]) + else: + replace = "" + textProfileTmp = textProfileTmp[:resS.start()] + replace +\ + textProfileTmp[resS.end():] + elif len(terms) == 3: + if terms[1].strip(): + replaceInt = equalTerm(terms[1],sNum,localVars) + replace = str(replaceInt) + else: + replaceInt = localVars[nameLocVar] + replace = "" + localVars[nameLocVar] = replaceInt + equalTerm(terms[2], + sNum, localVars) + textProfileTmp = textProfileTmp[:resS.start()] + replace +\ + textProfileTmp[resS.end():] + else: + print _("error profile term %s")%str(varName) + exit(1) + return textProfileTmp + + # Локальные переменные + localVars = {} + sNum = re.compile("\-[^\-\+]+|[^\-\+]+") + resS = self._reFunc.search(textProfile) + textProfileTmp = textProfile + while resS: + mark = textProfileTmp[resS.start():resS.end()] + varName = mark[self._deltVarStart:-self._deltVarEnd] + if varName[:4] == "sum(": + textProfileTmp = funcSum(resS, localVars, textProfileTmp) + resS = self._reFunc.search(textProfileTmp) + else: + resS = False + return textProfileTmp def applyTermsProfile(self, textProfile, nameProfile): """ Применяет условия, к условным блокам текста @@ -2197,7 +2269,10 @@ class profile(_file, _terms): self.newProfile = self.applyTermsProfile(self.newProfile, newFile) #print "|%s|" %(self.newProfile) + # Заменяем переменные на их значения self.newProfile = self.applyVarsProfile(self.newProfile) + # Вычисляем функции + self.newProfile = self.applyFuncProfile(self.newProfile) objHeadNew = self.__getApplyHeadProfile(newFile, oldFile) if not objHeadNew: