diff --git a/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/ContainersMappingHelper.java b/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/ContainersMappingHelper.java index bde9226226b..966f77e2970 100644 --- a/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/ContainersMappingHelper.java +++ b/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/ContainersMappingHelper.java @@ -93,7 +93,10 @@ private String getPowerFactorySubstationId(Set ids) { Set elmTerms = elmTermsAssociatedTo(ids); Set elmSubstats = elmSubstatsAssociatedTo(elmTerms); + Set elmTrfstats = elmTrfstatsAssociatedTo(elmTerms); + Set elmSites = elmSitesAssociatedTo(elmSubstats); + elmSites.addAll(elmSitesAssociatedTo(elmTrfstats)); if (elmSites.size() != 1) { return null; @@ -107,22 +110,38 @@ private String getPowerFactorySubstationId(Set ids) { return elmSubstats.equals(dataObjects) ? elmSite.getLocName() : null; } - // Find an ElmSubstat with same ElmTerms (Nodes) as defined by the ids argument + // Find an ElmSubstat or an ElmTrfstat with same ElmTerms (Nodes) as defined by the ids argument private String getPowerFactoryVoltageLevelId(Set ids) { Set elmTerms = elmTermsAssociatedTo(ids); Set elmSubstats = elmSubstatsAssociatedTo(elmTerms); - if (elmSubstats.size() != 1) { - return null; + if (elmSubstats.size() == 1) { + DataObject elmSubstat = elmSubstats.iterator().next(); + + Set dataObjects = elmSubstat.getChildren().stream() + .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMTERM)) + .collect(Collectors.toSet()); + + if (elmTerms.equals(dataObjects)) { + return elmSubstat.getLocName(); + } } - DataObject elmSubstat = elmSubstats.iterator().next(); - Set dataObjects = elmSubstat.getChildren().stream() - .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMTERM)) - .collect(Collectors.toSet()); + Set elmTrfstats = elmTrfstatsAssociatedTo(elmTerms); + if (elmTrfstats.size() == 1) { + DataObject elmTrfstat = elmTrfstats.iterator().next(); + + Set dataObjects = elmTrfstat.getChildren().stream() + .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMTERM)) + .collect(Collectors.toSet()); - return elmTerms.equals(dataObjects) ? elmSubstat.getLocName() : null; + if (elmTerms.equals(dataObjects)) { + return elmTrfstat.getLocName(); + } + } + + return null; } private Set elmTermsAssociatedTo(Set ids) { @@ -132,12 +151,19 @@ private Set elmTermsAssociatedTo(Set ids) { .collect(Collectors.toSet()); } + private Set elmTrfstatsAssociatedTo(Set elmTerms) { + return elmTerms.stream().map(DataObject::getParent) + .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMTRFSTAT)) + .collect(Collectors.toSet()); + } + private Set elmSubstatsAssociatedTo(Set elmTerms) { return elmTerms.stream().map(DataObject::getParent) .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMSUBSTAT)) .collect(Collectors.toSet()); } + // valid for elmSubstats and elmTrfstats private Set elmSitesAssociatedTo(Set elmSubstats) { return elmSubstats.stream().map(DataObject::getParent) .filter(dataObject -> dataObject.getDataClassName().equals(DataAttributeNames.ELMSITE)) diff --git a/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/DataAttributeNames.java b/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/DataAttributeNames.java index 548cdbebabc..76cc0c20863 100644 --- a/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/DataAttributeNames.java +++ b/powerfactory/powerfactory-converter/src/main/java/com/powsybl/powerfactory/converter/DataAttributeNames.java @@ -19,6 +19,7 @@ private DataAttributeNames() { static final String TYP_ID = "typ_id"; static final String ELMTERM = "ElmTerm"; + static final String ELMTRFSTAT = "ElmTrfstat"; static final String ELMSUBSTAT = "ElmSubstat"; static final String ELMSITE = "ElmSite"; static final String OBJ_ID = "obj_id"; diff --git a/powerfactory/powerfactory-converter/src/test/resources/VoltageLevelsAndSubstations.dgs b/powerfactory/powerfactory-converter/src/test/resources/VoltageLevelsAndSubstations.dgs index 164b84fee98..6ae6c3f66d0 100644 --- a/powerfactory/powerfactory-converter/src/test/resources/VoltageLevelsAndSubstations.dgs +++ b/powerfactory/powerfactory-converter/src/test/resources/VoltageLevelsAndSubstations.dgs @@ -78,8 +78,10 @@ $$TypTr2;ID(a:40);loc_name(a:40);for_name(a:50);fold_id(p);nt2ph(i);strn(r);frno $$ElmSubstat;ID(a:40);loc_name(a:40);for_name(a:50);fold_id(p);sShort(a:6);sType(a:80);GPSlat(r);GPSlon(r) 31;VoltageLevel1-400;;34;;;49,95646302;11,45051847 32;VoltageLevel2-400;;35;;;49,95646302;11,45051847 - 33;VoltageLevel2-20;;35;;;49,95646302;11,45051847 - + +$$ElmTrfstat;ID(a:40);loc_name(a:40);for_name(a:50);fold_id(p) + 33;VoltageLevel2-20;;35 + $$ElmSite;ID(a:40);loc_name(a:40);for_name(a:50);fold_id(p);sType(a:80);GPSlat(r);GPSlon(r) 34;Substation1;;8;;49,95646302;11,45051847 35;Substation2;;8;;50,89789337;11,01545826