def __load_from_xmcda(self, xmcda_file): tree = ElementTree.parse(xmcda_file) root = tree.getroot() # ElementTree.dump(root) xmcda_formatversion = root.find('.//formatversion') xmcda_crit = root.find('.//criteria') xmcda_critval = root.find('.//criteriaValues') xmcda_b = root.find('.//alternatives') xmcda_pt = root.findall('.//performanceTable') xmcda_lbda = root.find('.//methodParameters/parameter/value/real') # Update criteria direction criteria = Criteria().from_xmcda(xmcda_crit) for c in criteria: if c.id in self.criteria: self.criteria[c.id].disabled = c.disabled self.criteria[c.id].direction = c.direction # Remove criteria values that are not in the vector layer cvs = CriteriaValues() cvs.from_xmcda(xmcda_critval) for cv in cvs: if cv.id not in self.criteria: cvs.remove(cv.id) for c in self.criteria: # Disable criteria for which there are no weights if c.id not in cvs: c.disabled = True cvs.append(CriterionValue(c.id, 0)) balternatives = Alternatives() balternatives.from_xmcda(xmcda_b) bpt = PerformanceTable() qpt, ppt, vpt = None, None, None for xmcda in xmcda_pt: if xmcda.get('id') is None: bpt.from_xmcda(xmcda) for bp, c in product(bpt, self.criteria.get_active()): perfs = bp.performances if c.id not in perfs or perfs[c.id] is None: perfs[c.id] = 0 elif xmcda.get('id') == 'q': qpt = PerformanceTable(id = 'q') qpt.from_xmcda(xmcda) elif xmcda.get('id') == 'p': ppt = PerformanceTable(id = 'p') ppt.from_xmcda(xmcda) elif xmcda.get('id') == 'v': vpt = PerformanceTable(id = 'v') vpt.from_xmcda(xmcda) if qpt is not None and len(qpt) == 0 and len(ppt) > 0: qpt = ppt.copy() qpt.id = "q" if ppt is not None and len(ppt) == 0 and len(qpt) > 0: ppt = qpt.copy() ppt.id = "p" lbda = float(xmcda_lbda.text) self.__check_params_consistency(bpt, qpt, ppt, vpt) # Everything is fine self.cv = cvs self.balternatives = balternatives self.bpt = bpt self.qpt = qpt self.ppt = ppt self.vpt = vpt self.lbda = lbda # Categories Profiles self.categories = generate_categories(len(self.bpt) + 1, prefix = "") self.cat_profiles = generate_categories_profiles(self.categories)