public KonstantCimArchiveWriter(IEnumerable <PhysicalNetworkModel.IdentifiedObject> cimObjects, string outputFolder, string archiveName, Guid modelRdfId, bool highVoltageOnly = false)
        {
            System.IO.Directory.CreateDirectory(outputFolder);
            System.IO.Directory.CreateDirectory(outputFolder + "\\files");

            CimContext initialContext = CimContext.Create(cimObjects);

            string eqTempFileName = outputFolder + @"\files\" + archiveName + "_eq.xml";
            string glTempFileName = outputFolder + @"\files\" + archiveName + "_gl.xml";
            string aiTempFileName = outputFolder + @"\files\" + archiveName + "_ai.xml";
            string peTempFileName = outputFolder + @"\files\" + archiveName + "_pe.xml";


            Dictionary <string, string> assetToEqRefs = new Dictionary <string, string>();

            var filtered = FilterHelper.Filter(initialContext, new FilterRule()
            {
                MinVoltageLevel = highVoltageOnly ? 20000 : 10000,
            });


            var mappingContext = new MappingContext();

            // Reinitialize cim context to filtered objects
            CimContext _context = CimContext.Create(filtered);


            var converter = new PNM2PowerFactoryCimConverter(filtered,
                                                             new List <IPreProcessor> {
                new ACLSMerger(mappingContext),
                new TransformerCableMerger(mappingContext),
                new KonstantBigEnergyConsumerHandler(mappingContext),
                new KonstantPowerFactoryDataPrepareAndFix(mappingContext)
            });

            // Reinitialize cim context to converted objects
            var outputCimObjects = converter.GetCimObjects().ToList();


            // We need to reinitialize context, because converter has modified objects
            _context = CimContext.Create(outputCimObjects);

            var eqWriter = new EQ_Writer(eqTempFileName, _context, mappingContext, modelRdfId, archiveName);

            eqWriter.ForceThreePhases = true;

            var glWriter = new GL_Writer(glTempFileName);
            var aiWriter = new AI_Writer(aiTempFileName, _context, mappingContext);
            var peWriter = new PE_Writer(peTempFileName, _context, mappingContext);


            //////////////////////
            // do the lines
            var lineContext = new LineInfoContext(_context);
            //lineContext.CreateLineInfo();
            Dictionary <SimpleLine, string> lineToGuid = new Dictionary <SimpleLine, string>();


            foreach (var line in lineContext.GetLines())
            {
                var lineGuid = GUIDHelper.CreateDerivedGuid(Guid.Parse(line.Children[0].Equipment.mRID), 678, true).ToString();
                lineToGuid.Add(line, lineGuid);

                //eqWriter.AddLine(lineGuid, line.Name);
            }

            //////////////////////
            // do the general cim objects
            foreach (var cimObject in _context.GetAllObjects())
            {
                if (cimObject.name != null && cimObject.name.Contains("571313124501006982"))
                {
                }

                if (!(cimObject is Location) && !(cimObject is VoltageLevel && ((VoltageLevel)cimObject).BaseVoltage < 400))
                {
                    if (cimObject is ACLineSegment)
                    {
                        var acls = cimObject as ACLineSegment;

                        var lines = lineContext.GetLines().Where(l => l.Children.Exists(c => c.Equipment == acls)).ToList();

                        if (lines.Count == 1)
                        {
                            var line = lines[0];
                            eqWriter.AddPNMObject(acls, lineToGuid[line]);
                        }
                        else
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);
                        }
                    }
                    else
                    {
                        // Don't add things that goes into asset and protectionn file
                        if (!(
                                (cimObject is PhysicalNetworkModel.Asset) ||
                                (cimObject is PhysicalNetworkModel.AssetInfo) ||
                                (cimObject is PhysicalNetworkModel.ProductAssetModel) ||
                                (cimObject is PhysicalNetworkModel.Manufacturer) ||
                                (cimObject is CurrentTransformerExt) ||
                                (cimObject is PotentialTransformer) ||
                                (cimObject is ProtectionEquipmentExt)
                                ))
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);
                        }
                    }
                }

                if (cimObject is PowerSystemResource)
                {
                    var psrObj = cimObject as PowerSystemResource;

                    if (psrObj.Location != null && psrObj.Location.@ref != null && psrObj.PSRType != "InternalCable")
                    {
                        var loc = _context.GetObject <PhysicalNetworkModel.LocationExt>(psrObj.Location.@ref);
                        glWriter.AddLocation(Guid.Parse(psrObj.mRID), loc);
                    }
                    if (psrObj.Assets != null && psrObj.Assets.@ref != null)
                    {
                        assetToEqRefs.Add(psrObj.Assets.@ref, psrObj.mRID);
                    }
                }
            }

            //////////////////////
            // do the asset object
            foreach (var cimObject in _context.GetAllObjects())
            {
                if (cimObject is PhysicalNetworkModel.Asset)
                {
                    if (assetToEqRefs.ContainsKey(cimObject.mRID))
                    {
                        var eqMrid = assetToEqRefs[cimObject.mRID];
                        aiWriter.AddPNMObject((dynamic)cimObject, eqMrid);
                    }
                }

                if (cimObject is PhysicalNetworkModel.AssetInfo)
                {
                    aiWriter.AddPNMObject((dynamic)cimObject);
                }

                if (cimObject is PhysicalNetworkModel.ProductAssetModel)
                {
                    aiWriter.AddPNMObject((dynamic)cimObject);
                }

                if (cimObject is PhysicalNetworkModel.Manufacturer)
                {
                    aiWriter.AddPNMObject((dynamic)cimObject);
                }
            }

            //////////////////////
            // do the projection object
            foreach (var cimObject in _context.GetAllObjects())
            {
                if (cimObject is PhysicalNetworkModel.ProtectionEquipment)
                {
                    peWriter.AddPNMObject((dynamic)cimObject);
                }
                if (cimObject is PhysicalNetworkModel.PotentialTransformer)
                {
                    peWriter.AddPNMObject((dynamic)cimObject);
                }
                if (cimObject is PhysicalNetworkModel.CurrentTransformer)
                {
                    peWriter.AddPNMObject((dynamic)cimObject);
                }
            }

            eqWriter.Close();
            glWriter.Close();
            aiWriter.Close();
            peWriter.Close();

            string startPath = outputFolder + "\\files";
            string zipPath   = outputFolder + "\\" + archiveName + ".zip";

            File.Delete(zipPath);

            ZipFile.CreateFromDirectory(startPath, zipPath);
        }
        public void TestEngumEQWriter()
        {
            bool includeAll = false;

            var mappingContext = new MappingContext();

            var converter = new PNM2PowerFactoryCimConverter(_context.GetAllObjects(),
                                                             new List <IPreProcessor> {
                new ACLSMerger(mappingContext),
                new KonstantPowerFactoryDataPrepareAndFix(mappingContext)
            });

            var outputCimObjects = converter.GetCimObjects().ToList();

            // We need to reinitialize context, because converter has modified objects
            _context = CimContext.Create(outputCimObjects);

            var eqWriter = new EQ_Writer(eqTempFileName, _context, mappingContext, Guid.Parse("48acc999-f45c-475a-b61c-09e7d1001fc1"), "Engum");

            var glWriter = new GL_Writer(glTempFileName);

            HashSet <PhysicalNetworkModel.ConnectivityNode> cnAlreadyWritten = new HashSet <PhysicalNetworkModel.ConnectivityNode>();

            foreach (var cimObject in _context.GetAllObjects())
            {
                if ((cimObject is PhysicalNetworkModel.ConductingEquipment && ((PhysicalNetworkModel.ConductingEquipment)cimObject).BaseVoltage > 5000) ||
                    !(cimObject is PhysicalNetworkModel.ConductingEquipment) ||
                    cimObject is PhysicalNetworkModel.PowerTransformer
                    )
                {
                    if (
                        cimObject is PhysicalNetworkModel.ACLineSegment ||
                        cimObject is PhysicalNetworkModel.BusbarSection ||
                        cimObject is PhysicalNetworkModel.LoadBreakSwitch ||
                        cimObject is PhysicalNetworkModel.Breaker ||
                        cimObject is PhysicalNetworkModel.Disconnector ||
                        cimObject is PhysicalNetworkModel.Fuse ||
                        cimObject is PhysicalNetworkModel.Terminal ||
                        (cimObject is PhysicalNetworkModel.ConnectivityNode && cimObject.IsInsideSubstation()) ||
                        cimObject is PhysicalNetworkModel.Substation ||
                        cimObject is PhysicalNetworkModel.VoltageLevel ||
                        cimObject is PhysicalNetworkModel.Bay ||
                        cimObject is PhysicalNetworkModel.PowerTransformer ||
                        cimObject is PhysicalNetworkModel.PowerTransformerEnd
                        )
                    {
                        // Add substations
                        if (cimObject is PhysicalNetworkModel.Substation && (cimObject.name == "BRB" || cimObject.name == "30904" || includeAll))
                        {
                            var st = cimObject as PhysicalNetworkModel.Substation;

                            if (st.PSRType == "PrimarySubstation" || st.PSRType == "SecondarySubstation" || st.PSRType == "Junction")
                            {
                                eqWriter.AddPNMObject((dynamic)cimObject);

                                // Add location
                                var loc = _context.GetObject <PhysicalNetworkModel.LocationExt>(st.Location.@ref);
                                glWriter.AddLocation(Guid.Parse(st.mRID), loc);
                            }
                        }

                        // Add voltage levels
                        if (cimObject is PhysicalNetworkModel.VoltageLevel && (cimObject.GetSubstation().name == "BRB" || cimObject.GetSubstation().name == "30904" || includeAll))
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);
                        }

                        // Power transformer
                        if (cimObject is PhysicalNetworkModel.PowerTransformer && (cimObject.GetSubstation().name == "BRB" || cimObject.GetSubstation().name == "30904" || includeAll))
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);

                            // Add terminals
                            var ci = cimObject as PhysicalNetworkModel.ConductingEquipment;
                            foreach (var tc in _context.GetConnections(ci))
                            {
                                tc.Terminal.phases = PhysicalNetworkModel.PhaseCode.ABCN;
                                tc.Terminal.name   = ci.name + "_T" + tc.Terminal.sequenceNumber;
                                eqWriter.AddPNMObject((dynamic)tc.Terminal);
                            }
                        }

                        // Power transformer end
                        if (cimObject is PhysicalNetworkModel.PowerTransformerEnd && (cimObject.GetSubstation().name == "BRB" || cimObject.GetSubstation().name == "30904" || includeAll))
                        {
                            PhysicalNetworkModel.PowerTransformerEnd ptend = cimObject as PhysicalNetworkModel.PowerTransformerEnd;


                            ptend.r = new PhysicalNetworkModel.Resistance()
                            {
                                Value = 0.1
                            };
                            ptend.r0 = new PhysicalNetworkModel.Resistance()
                            {
                                Value = 0.2
                            };
                            ptend.x = new PhysicalNetworkModel.Reactance()
                            {
                                Value = 0.3
                            };
                            //ptend.x0 = new PhysicalNetworkModel.Reactance() { Value = 0.4 };
                            ptend.b = new PhysicalNetworkModel.Susceptance {
                                Value = 0.5
                            };
                            ptend.b0 = new PhysicalNetworkModel.Susceptance {
                                Value = 0.6
                            };
                            ptend.g = new PhysicalNetworkModel.Conductance {
                                Value = 0.7
                            };
                            ptend.g0 = new PhysicalNetworkModel.Conductance {
                                Value = 0.8
                            };
                            ptend.rground = new PhysicalNetworkModel.Resistance {
                                Value = 0.9
                            };
                            ptend.xground = new PhysicalNetworkModel.Reactance {
                                Value = 0.91
                            };
                            ptend.phaseAngleClock = "11";
                            ptend.grounded        = false;

                            eqWriter.AddPNMObject((dynamic)cimObject);
                        }


                        // Add bays
                        if (cimObject is PhysicalNetworkModel.Bay && (cimObject.GetSubstation().name == "BRB" || cimObject.GetSubstation().name == "30904" || includeAll))
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);
                        }


                        // Add ACLS
                        if (cimObject is PhysicalNetworkModel.ACLineSegment && cimObject.name != null && (cimObject.name.Contains("BRB-30904") || includeAll))
                        {
                            eqWriter.AddPNMObject((dynamic)cimObject);

                            // Add terminals
                            var ci = cimObject as PhysicalNetworkModel.ConductingEquipment;
                            foreach (var tc in _context.GetConnections(ci))
                            {
                                eqWriter.AddPNMObject((dynamic)tc.Terminal);
                            }

                            // Add location
                            if (ci.PSRType != "InternalCable")
                            {
                                var loc = _context.GetObject <PhysicalNetworkModel.LocationExt>(ci.Location.@ref);
                                glWriter.AddLocation(Guid.Parse(ci.mRID), loc);
                            }
                        }

                        // Add stuff inside substation
                        if (!(cimObject is PhysicalNetworkModel.PowerTransformer) && cimObject.IsInsideSubstation() && (cimObject.GetSubstation().name == "BRB" || cimObject.GetSubstation().name == "30904" || includeAll))
                        {
                            // fix busbar voltage level ref
                            if (cimObject is PhysicalNetworkModel.BusbarSection)
                            {
                                var busbar = cimObject as PhysicalNetworkModel.BusbarSection;
                                busbar.EquipmentContainer.@ref = busbar.GetSubstation().GetVoltageLevel(busbar.BaseVoltage).mRID;
                            }

                            eqWriter.AddPNMObject((dynamic)cimObject);
                            if (cimObject is PhysicalNetworkModel.ConductingEquipment)
                            {
                                var ci = cimObject as PhysicalNetworkModel.ConductingEquipment;
                                foreach (var tc in _context.GetConnections(ci))
                                {
                                    eqWriter.AddPNMObject((dynamic)tc.Terminal);

                                    if (!cnAlreadyWritten.Contains(tc.ConnectivityNode))
                                    {
                                        eqWriter.AddPNMObject((dynamic)tc.ConnectivityNode);
                                    }

                                    cnAlreadyWritten.Add(tc.ConnectivityNode);
                                }
                            }
                        }
                    }
                }
            }

            // Add peterson coil

            var coil = new PhysicalNetworkModel.PetersenCoil();

            var priTrafo = outputCimObjects.Find(o => o is PhysicalNetworkModel.PowerTransformer && o.GetSubstation().name == "BRB");
            var coilSt   = priTrafo.GetSubstation();

            coil.mRID               = Guid.NewGuid().ToString();
            coil.name               = "Test coil";
            coil.BaseVoltage        = 10000;
            coil.EquipmentContainer = new PhysicalNetworkModel.EquipmentEquipmentContainer()
            {
                @ref = coilSt.GetVoltageLevel(10000).mRID
            };
            coil.mode     = PhysicalNetworkModel.PetersenCoilModeKind.@fixed;
            coil.nominalU = new PhysicalNetworkModel.Voltage()
            {
                Value = 10000
            };
            coil.positionCurrent = new PhysicalNetworkModel.CurrentFlow()
            {
                Value = 99.99
            };
            coil.offsetCurrent = new PhysicalNetworkModel.CurrentFlow {
                Value = 9.99
            };
            coil.r = new PhysicalNetworkModel.Resistance()
            {
                Value = 9.99
            };
            coil.xGroundMin = new PhysicalNetworkModel.Reactance {
                Value = 0.99
            };
            coil.xGroundMax = new PhysicalNetworkModel.Reactance {
                Value = 9.99
            };
            coil.xGroundNominal = new PhysicalNetworkModel.Reactance {
                Value = 4.99
            };



            var trafoCons = _context.GetConnections(priTrafo);

            var secTer = trafoCons.Find(o => o.Terminal.sequenceNumber == "1");

            var coilTer = new PhysicalNetworkModel.Terminal();

            coilTer.mRID = Guid.NewGuid().ToString();
            coilTer.ConductingEquipment = new PhysicalNetworkModel.TerminalConductingEquipment()
            {
                @ref = coil.mRID
            };
            coilTer.ConnectivityNode = new PhysicalNetworkModel.TerminalConnectivityNode()
            {
                @ref = secTer.ConnectivityNode.mRID
            };
            coilTer.phases = PhysicalNetworkModel.PhaseCode.N;



            eqWriter.AddPNMObject(coil);
            eqWriter.AddPNMObject(coilTer);

            eqWriter.Close();
            glWriter.Close();

            string startPath = folder + "\\files";
            string zipPath   = folder + "\\export.zip";

            File.Delete(zipPath);

            ZipFile.CreateFromDirectory(startPath, zipPath);
        }