static void Main(string[] args) { if (args.Length < 1) { Console.WriteLine("No IIfc or xBim file specified"); return; } var fileName = args[0]; Console.WriteLine("Reading " + fileName); using (var model = GetModel(fileName)) { if (model == null) { Console.WriteLine("No model to process. Press any key to exit"); Console.Read(); return; } var context = new Xbim3DModelContext(model); context.CreateContext(); var wexBimFilename = Path.ChangeExtension(fileName, "wexBIM"); using (var wexBiMfile = new FileStream(wexBimFilename, FileMode.Create, FileAccess.Write)) { using (var wexBimBinaryWriter = new BinaryWriter(wexBiMfile)) { Console.WriteLine("Creating " + wexBimFilename); model.SaveAsWexBim(wexBimBinaryWriter); wexBimBinaryWriter.Close(); } wexBiMfile.Close(); } //now do COBieExpress var cobie = new MemoryModel(new EntityFactory()); var cobieExpressFile = Path.ChangeExtension(fileName, ".cobie"); var cobieExpressXmlFile = Path.ChangeExtension(fileName, ".cobieXml"); var cobieExpressZipFile = Path.ChangeExtension(fileName, ".cobieZip"); var w = new Stopwatch(); using (var txn = cobie.BeginTransaction("IFC data in")) { var exchanger = new IfcToCoBieExpressExchanger(model, cobie); w.Start(); exchanger.Convert(); w.Stop(); txn.Commit(); } Console.WriteLine("COBieExpress model created in {0}ms", w.ElapsedMilliseconds); cobie.SaveAsStep21(File.Create(cobieExpressFile)); cobie.SaveAsStep21Zip(File.Create(cobieExpressZipFile)); cobie.SaveAsXml(File.Create(cobieExpressXmlFile), new XmlWriterSettings { Indent = true, IndentChars = "\t" }); //now do the DPoW files var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); var fileDirectoryName = Path.GetDirectoryName(fileName); var facilities = new List <Facility>(); var ifcToCoBieLiteUkExchanger = new IfcToCOBieLiteUkExchanger(model, facilities); facilities = ifcToCoBieLiteUkExchanger.Convert(); var facilityNumber = 0; foreach (var facility in facilities) { var dpow = "DPoW"; if (facilities.Count > 1) { dpow += ++facilityNumber; } // ReSharper disable AssignNullToNotNullAttribute var dPoWFile = Path.Combine(fileDirectoryName, fileNameWithoutExtension + "_" + dpow); // ReSharper restore AssignNullToNotNullAttribute dPoWFile = Path.ChangeExtension(dPoWFile, "json"); Console.WriteLine("Creating " + dPoWFile); facility.WriteJson(dPoWFile); string cobieFile = Path.ChangeExtension(dPoWFile, "Xlsx"); Console.WriteLine("Creating " + cobieFile); string error; facility.WriteCobie(cobieFile, out error); if (!string.IsNullOrWhiteSpace(error)) { Console.WriteLine("COBie Errors: " + error); } dPoWFile = Path.ChangeExtension(dPoWFile, "xml"); Console.WriteLine("Creating " + dPoWFile); // facility.WriteXml(dPoWFile); var req = Facility.ReadJson(@"..\..\Tests\ValidationFiles\Lakeside_Restaurant-stage6-COBie.json"); var validator = new FacilityValidator(); var result = validator.Validate(req, facility); var verificationResults = Path.ChangeExtension(dPoWFile, "verified.xlsx"); Console.WriteLine("Creating " + verificationResults); //create report using (var stream = File.Create(verificationResults)) { var report = new ExcelValidationReport(); report.Create(result, stream, ExcelValidationReport.SpreadSheetFormat.Xlsx); stream.Close(); } facility.ValidateUK2012(Console.Out, true); string cobieValidatedFile = Path.ChangeExtension(dPoWFile, "Validated.Xlsx"); facility.WriteCobie(cobieValidatedFile, out error); dPoWFile = Path.ChangeExtension(dPoWFile, "xbim"); var credentials = new XbimEditorCredentials() { ApplicationDevelopersName = "XbimTeam", ApplicationFullName = "Xbim.Exchanger", EditorsOrganisationName = "Xbim Development Team", EditorsFamilyName = "Xbim Tester", ApplicationVersion = "3.0" }; Console.WriteLine("Creating " + dPoWFile); using ( var ifcModel = IfcStore.Create(credentials, IfcSchemaVersion.Ifc2X3, XbimStoreType.EsentDatabase)) { using (var txn = ifcModel.BeginTransaction("Convert from COBieLiteUK")) { var coBieLiteUkToIIfcExchanger = new CoBieLiteUkToIfcExchanger(facility, ifcModel); coBieLiteUkToIIfcExchanger.Convert(); txn.Commit(); //var err = model.Validate(model.Instances, Console.Out); } dPoWFile = Path.ChangeExtension(dPoWFile, "ifc"); Console.WriteLine("Creating " + dPoWFile); ifcModel.SaveAs(dPoWFile, IfcStorageType.Ifc); ifcModel.Close(); } } model.Close(); } Console.WriteLine("Press any key to exit"); Console.Read(); }
public void IfcPolygonalBoundedHalfspace_Test() { using (var m = new MemoryModel(new Ifc4.EntityFactoryIfc4())) { using (var txn = m.BeginTransaction("")) { var polygonalBoundedHalfspace = m.Instances.New <IfcPolygonalBoundedHalfSpace>(); polygonalBoundedHalfspace.AgreementFlag = false; var plane = m.Instances.New <IfcPlane>(); plane.Position = m.Instances.New <IfcAxis2Placement3D>(); plane.Position.Location = m.Instances.New <IfcCartesianPoint>(c => c.SetXYZ(0, 0, 0)); polygonalBoundedHalfspace.BaseSurface = plane; //create the polygonal bound var polyLine = m.Instances.New <IfcPolyline>(); polyLine.Points.Add(m.Instances.New <IfcCartesianPoint>(c => c.SetXY(0, 2.5))); polyLine.Points.Add(m.Instances.New <IfcCartesianPoint>(c => c.SetXY(5, 2.5))); polyLine.Points.Add(m.Instances.New <IfcCartesianPoint>(c => c.SetXY(5, -2.5))); polyLine.Points.Add(m.Instances.New <IfcCartesianPoint>(c => c.SetXY(0, -2.5))); polyLine.Points.Add(m.Instances.New <IfcCartesianPoint>(c => c.SetXY(0, 2.5))); polygonalBoundedHalfspace.PolygonalBoundary = polyLine; var basePos = m.Instances.New <IfcAxis2Placement3D>(); basePos.Location = m.Instances.New <IfcCartesianPoint>(c => c.SetXYZ(0, 0, 0)); polygonalBoundedHalfspace.Position = basePos; //make an extrusion var profile = IfcModelBuilder.MakeRectangleProfileDef(m, 20, 10); var extrude = IfcModelBuilder.MakeExtrudedAreaSolid(m, profile, 40); var solid = geomEngine.CreateSolid(extrude, logger); var halfSpaceSolid = geomEngine.CreateSolid(polygonalBoundedHalfspace, logger); var cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(cut.Count > 0); Assert.IsTrue(Math.Abs((solid.Volume) - cut.First.Volume - 1000) < 1e-5); //reverse halfspace agreement polygonalBoundedHalfspace.AgreementFlag = true; halfSpaceSolid = geomEngine.CreateSolid(polygonalBoundedHalfspace, logger); cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(Math.Abs(solid.Volume - cut.First.Volume) < 1e-5); //move the plane up plane.Position.Location.Z = 20; halfSpaceSolid = geomEngine.CreateSolid(polygonalBoundedHalfspace, logger); cut = solid.Cut(halfSpaceSolid, 1e-5); Assert.IsTrue(Math.Abs(solid.Volume - cut.First.Volume - 500) < 1e-5); //some realistic data polyLine.Points[0].SetXY(0, 0); polyLine.Points[1].SetXY(0, 2850); polyLine.Points[2].SetXY(-350, 2850); polyLine.Points[3].SetXY(-350, 0); polyLine.Points[4].SetXY(0, 0); plane.Position.Location.SetXYZ(-5240.7742616303667, -33052.9790707385, 0.0); plane.Position.Axis = m.Instances.New <IfcDirection>(d => d.SetXYZ(0, -1, 0)); plane.Position.RefDirection = m.Instances.New <IfcDirection>(d => d.SetXYZ(1, 0, 0)); basePos.Location.SetXYZ(-5240.7742616303667, -33052.9790707385, 0); basePos.Axis = plane.Position.Axis; basePos.RefDirection = plane.Position.RefDirection; halfSpaceSolid = geomEngine.CreateSolid(polygonalBoundedHalfspace, logger); profile.XDim = 350; profile.YDim = 125; profile.Position.Location.SetXY(-5415.7742616303676, -32932.529070738507); extrude.Depth = 2850; solid = geomEngine.CreateSolid(extrude, logger); cut = solid.Cut(halfSpaceSolid, 1e-5); //everything should be cut Assert.IsTrue(cut.Count == 0); } } }