class criteria_layer(QgsVectorLayer): def __init__(self, layer): self.layer = layer self.criteria = None self.alternatives = None self.pt = None self.get_criteria() self.get_alternatives_and_pt() def get_criteria(self): provider = self.layer.dataProvider() fields = provider.fields() self.criteria = Criteria([]) for field in fields: ftype = field.type() if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \ and (ftype != QVariant.Int) \ and (ftype != QVariant.LongLong): continue name = str(field.name()) crit = Criterion(name, name) self.criteria.append(crit) def get_alternatives_and_pt(self): provider = self.layer.dataProvider() self.alternatives = Alternatives([]) self.pt = PerformanceTable([]) for feat in provider.getFeatures(): featid = str(feat.id()) perfs = {} for criterion in self.criteria: try: perfs[criterion.id] = float(feat[criterion.id]) except: perfs[criterion.id] = feat[criterion.id].toDouble()[0] self.alternatives.append(Alternative(featid, featid)) self.pt.append(AlternativePerformances(featid, perfs)) def get_features_ids(self, aids): provider = self.layer.dataProvider() self.alternatives = Alternatives([]) self.pt = PerformanceTable([]) features = [] for feat in provider.getFeatures(): featid = str(feat.id()) if featid in aids: features.append(feat.id()) return features
def get_criteria(self): provider = self.layer.dataProvider() fields = provider.fields() self.criteria = Criteria([]) for field in fields: ftype = field.type() if (ftype != QVariant.Bool) and (ftype != QVariant.Double) \ and (ftype != QVariant.Int) \ and (ftype != QVariant.LongLong): continue name = str(field.name()) crit = Criterion(name, name) self.criteria.append(crit)
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)
import sys sys.path.insert(0, "..") from mcda.types import Criteria from xml.etree import ElementTree from data_ticino_new import * crit = c.to_xmcda() ElementTree.dump(crit) crit2 = Criteria() crit2.from_xmcda(crit) print crit2 xmcda = a.to_xmcda() ElementTree.dump(xmcda[0]) ElementTree.dump(xmcda[1])