private static void WriteXml(IModel model, string path) { using (var xml = XmlWriter.Create(path, new XmlWriterSettings { Indent = true })) { var writer = new XbimXmlWriter4(configuration.IFC4Add1); var project = model.Instances.OfType <IfcProject>(); var products = model.Instances.OfType <IfcObject>(); var relations = model.Instances.OfType <IfcRelationship>(); var all = new IPersistEntity[] {} //start from root .Concat(project) //add all products not referenced in the project tree .Concat(products) //add all relations which are not inversed .Concat(relations) //make sure all other objects will get written .Concat(model.Instances); writer.Write(model, xml, all); xml.Close(); } }
public virtual void SaveAsXml(Stream stream, XmlWriterSettings xmlSettings, XbimXmlSettings xbimSettings = null, configuration configuration = null, ReportProgressDelegate progress = null) { var schema = Header.FileSchema.Schemas.FirstOrDefault(); using (var xmlWriter = XmlWriter.Create(stream, xmlSettings)) { switch (SchemaVersion) { case XbimSchemaVersion.Ifc2X3: var writer3 = new IfcXmlWriter3(); writer3.Write(this, xmlWriter, GetXmlOrderedEntities(schema)); break; case XbimSchemaVersion.Ifc4: var writer4 = new XbimXmlWriter4(XbimXmlSettings.IFC4Add2); writer4.Write(this, xmlWriter, GetXmlOrderedEntities(schema)); break; default: if (xbimSettings == null) { Logger.LogWarning("No xbimsettings set. Defaulting to Ifc4 Add2"); xbimSettings = XbimXmlSettings.IFC4Add2; } var writer = new XbimXmlWriter4(xbimSettings); writer.Write(this, xmlWriter); break; } } }
public virtual void SaveAsXml(Stream stream, XmlWriterSettings xmlSettings, XbimXmlSettings xbimSettings = null, configuration configuration = null, ReportProgressDelegate progress = null) { using (var xmlWriter = XmlWriter.Create(stream, xmlSettings)) { var schema = _entityFactory.SchemasIds.FirstOrDefault(); switch (schema) { case "IFC2X3": var writer3 = new IfcXmlWriter3(); writer3.Write(this, xmlWriter, GetXmlOrderedEntities(schema)); break; case "IFC4": var writer4 = new XbimXmlWriter4(configuration.IFC4Add1, XbimXmlSettings.IFC4Add1); writer4.Write(this, xmlWriter, GetXmlOrderedEntities(schema)); break; case "COBIE_EXPRESS": var writerCobie = new XbimXmlWriter4(configuration.COBieExpress, XbimXmlSettings.COBieExpress); writerCobie.Write(this, xmlWriter, GetXmlOrderedEntities(schema)); break; default: var writer = new XbimXmlWriter4(configuration, xbimSettings); writer.Write(this, xmlWriter); break; } xmlWriter.Close(); } }
public void Ifc4HeaderSerialization() { const string outPath = "..\\..\\HeaderSampleIfc4.xml"; using (var model = new IO.Memory.MemoryModel(new EntityFactory())) { model.Header.FileName.Name = "Sample model"; model.Header.FileName.AuthorName.Add("Martin"); model.Header.FileName.AuthorizationMailingAddress.Add("*****@*****.**"); model.Header.FileName.AuthorizationName = "Martin Cerny, xBIM Team"; model.Header.FileName.Organization.Add("xBIM Team"); model.Header.FileName.OriginatingSystem = "xBIM Toolkit"; model.Header.FileName.PreprocessorVersion = "4.0"; model.Header.FileName.TimeStamp = DateTime.Now.ToString("s"); model.Header.FileDescription.Description.Add("xBIM Team Model View Definition"); model.Header.FileDescription.ImplementationLevel = "1.0"; using (var xml = XmlWriter.Create(outPath, new XmlWriterSettings { Indent = true })) { var writer = new XbimXmlWriter4(configuration.IFC4Add1); writer.Write(model, xml); xml.Close(); } var errs = ValidateIfc4(outPath); Assert.AreEqual(0, errs); } //read it back and validate it is the same using (var model = new IO.Memory.MemoryModel(new EntityFactory())) { model.LoadXml(outPath); Assert.IsTrue(model.Header.FileName.Name == "Sample model"); Assert.IsTrue(model.Header.FileName.OriginatingSystem == "xBIM Toolkit"); Assert.IsTrue(model.Header.FileName.PreprocessorVersion == "4.0"); } //check version info using (var file = File.OpenRead(outPath)) { var header = XbimXmlReader4.ReadHeader(file); Assert.AreEqual("IFC4, IFC4Add1", header.SchemaVersion); } }
//public static string GetPathInSamples(string directory, string name) //{ // var dir = Path.Combine(@"..\..\..\..\SampleFiles", directory); // if (!Directory.Exists(dir)) // Directory.CreateDirectory(dir); // return Path.Combine(dir, name); //} /// <summary> /// Writes IFC4 XML file with prefered root types. For example IfcProject or IfcProjectLibrary are usually /// used as roots. But if for the purpose of an example there is other main entity that should be used as /// a root so that the general structure of the XML file is most clear for this entity. /// </summary> /// <param name="model">xBIM Model</param> /// <param name="path">XML output path</param> /// <param name="rootTypes">Prefered types. Orded is used for the preference.</param> public static void SaveXmlWithRoots(IModel model, string path, params Type[] rootTypes) { using (var xml = XmlWriter.Create(path, new XmlWriterSettings { Indent = true, IndentChars = " " })) { var w = new XbimXmlWriter4(XbimXmlSettings.IFC4Add2); // by defining order we can say what will be used as the root object IEnumerable <IPersistEntity> entities = new IPersistEntity[0]; foreach (var t in rootTypes) { entities = entities.Concat(model.Instances.OfType(t.Name, false)); } // add everything. Duplicated entities will be written only once. entities = entities.Concat(model.Instances); w.Write(model, xml, entities); xml.Close(); } }
/// <summary> /// Saves a model as IfcXML file /// </summary> /// <param name="model"></param> /// <param name="stream"></param> /// <param name="progDelegate"></param> public static void SaveAsIfcXml(this IModel model, Stream stream, ReportProgressDelegate progDelegate = null) { var settings = new XmlWriterSettings { Indent = true }; var schema = model.SchemaVersion; using (var xmlWriter = XmlWriter.Create(stream, settings)) { if (schema == XbimSchemaVersion.Ifc2X3) { var writer = new IfcXmlWriter3(); writer.Write(model, xmlWriter, model.Instances); } else if (schema == XbimSchemaVersion.Ifc4 || schema == XbimSchemaVersion.Ifc4x1) { var writer = new XbimXmlWriter4(XbimXmlSettings.IFC4Add2); var project = model.Instances.OfType <Ifc4.Kernel.IfcProject>(); var products = model.Instances.OfType <Ifc4.Kernel.IfcObject>(); var relations = model.Instances.OfType <Ifc4.Kernel.IfcRelationship>(); var all = new IPersistEntity[] { } //start from root .Concat(project) //add all products not referenced in the project tree .Concat(products) //add all relations which are not inversed .Concat(relations) //make sure all other objects will get written .Concat(model.Instances); writer.Write(model, xmlWriter, all); } xmlWriter.Close(); } }
public static void ComplexProperty() { var credentials = new XbimEditorCredentials { ApplicationDevelopersName = "xBIM Team", ApplicationFullName = "xBIM Toolkit", ApplicationIdentifier = "xBIM", ApplicationVersion = "4.0", EditorsFamilyName = "Cerny", EditorsGivenName = "Martin", EditorsOrganisationName = "CAS" }; using (var model = IfcStore.Create(credentials, XbimSchemaVersion.Ifc4, XbimStoreType.InMemoryModel)) //using (var model = new MemoryModel(new Xbim.Ifc4.EntityFactoryIfc4())) { ComplexPropertiesExample.model = model; using (var txn = model.BeginTransaction("Example")) { var lib = New <IfcProjectLibrary>(l => l.Name = "Declaration of Performance"); var mm = New <IfcSIUnit>(u => { u.Name = Xbim.Ifc4.Interfaces.IfcSIUnitName.METRE; u.Prefix = Xbim.Ifc4.Interfaces.IfcSIPrefix.MILLI; u.UnitType = Xbim.Ifc4.Interfaces.IfcUnitEnum.LENGTHUNIT; }); lib.UnitsInContext = New <IfcUnitAssignment>(ua => { ua.Units.Add(mm); }); var declarations = New <IfcRelDeclares>(rel => { rel.RelatingContext = lib; }).RelatedDefinitions; var psetTemplate = New <IfcPropertySetTemplate>(ps => { ps.Name = "dimensions"; ps.ApplicableEntity = nameof(IfcElement); }); declarations.Add(psetTemplate); var lengthTemplate = New <IfcComplexPropertyTemplate>(c => { c.Name = "length"; c.HasPropertyTemplates.AddRange(new[] { New <IfcSimplePropertyTemplate>(v => { v.Name = "Value"; v.TemplateType = Xbim.Ifc4.Interfaces.IfcSimplePropertyTemplateTypeEnum.P_SINGLEVALUE; v.PrimaryUnit = mm; v.PrimaryMeasureType = nameof(IfcLengthMeasure); }), New <IfcSimplePropertyTemplate>(v => { v.Name = "ReferenceDocument"; v.TemplateType = Xbim.Ifc4.Interfaces.IfcSimplePropertyTemplateTypeEnum.P_REFERENCEVALUE; v.PrimaryMeasureType = nameof(IfcDocumentReference); }) }); }); psetTemplate.HasPropertyTemplates.Add(lengthTemplate); var brick = New <IfcBuildingElementPart>(b => { b.Name = "Porotherm 50 EKO+ Profi R"; b.PredefinedType = Xbim.Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.USERDEFINED; b.ObjectType = "BRICK"; }); declarations.Add(brick); var pset = New <IfcPropertySet>(ps => { ps.Name = psetTemplate.Name; ps.HasProperties.Add(New <IfcComplexProperty>(c => { c.Name = lengthTemplate.Name?.ToString(); c.HasProperties.AddRange(new IfcProperty[] { New <IfcPropertySingleValue>(v => { v.Name = "Value"; v.Unit = mm; v.NominalValue = new IfcLengthMeasure(300); }), New <IfcPropertyReferenceValue>(v => { v.Name = "ReferenceDocument"; v.PropertyReference = New <IfcDocumentReference>(d => { d.Identification = "EN 772-1"; }); }) }); })); }); New <IfcRelDefinesByTemplate>(r => { r.RelatedPropertySets.Add(pset); r.RelatingTemplate = psetTemplate; }); New <IfcRelDefinesByProperties>(r => { r.RelatingPropertyDefinition = pset; r.RelatedObjects.Add(brick); }); txn.Commit(); } //model.SaveAs("complex_length.ifcxml"); model.SaveAs("complex_length.ifc"); var w = new XbimXmlWriter4(XbimXmlSettings.IFC4Add2); var xml = XmlWriter.Create("complex_length.ifcxml", new XmlWriterSettings { Indent = true, IndentChars = " " }); var entities = new IPersistEntity[0] .Concat(model.Instances.OfType <IfcProjectLibrary>()) .Concat(model.Instances); w.Write(model, xml, entities); xml.Close(); } }