public EsentGeometryStoreReader(EsentModel esentModel) { _esentModel = esentModel; _shapeGeometryCursor = _esentModel.GetShapeGeometryTable(); _shapeInstanceCursor = _esentModel.GetShapeInstanceTable(); _shapeGeometryTransaction = _shapeGeometryCursor.BeginReadOnlyTransaction(); _shapeInstanceTransaction = _shapeInstanceCursor.BeginReadOnlyTransaction(); _regionsList = new XbimContextRegionCollection(); IXbimShapeGeometryData regions = new XbimRegionCollection(); if (_shapeGeometryCursor.TryMoveFirstRegion(ref regions)) { do { _regionsList.Add((XbimRegionCollection)regions); regions = new XbimRegionCollection(); } while (_shapeGeometryCursor.TryMoveNextRegion(ref regions)); } if (!_regionsList.Any()) //we might have an old xbim database regions were stored in the geometry table { var legacyCursor = _esentModel.GetGeometryTable(); using (var txn = legacyCursor.BeginReadOnlyTransaction()) { foreach (var regionData in legacyCursor.GetGeometryData(Xbim.Common.Geometry.XbimGeometryType.Region)) { _regionsList.Add(XbimRegionCollection.FromArray(regionData.ShapeData)); } } _esentModel.FreeTable(legacyCursor); } _contextIds = new HashSet <int>(ContextIds); }
public void IfcStoreGeometryStoreAddTest() { using (var model = IfcStore.Open("TestFiles\\SampleHouse4.ifc")) { var geomStore = model.GeometryStore; using (var txn = geomStore.BeginInit()) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel, StyleLabel = 5, RepresentationContext = 50 }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection(); regions.ContextLabel = 50; var bb = new XbimRect3D(new XbimPoint3D(1, 1, 1), new XbimVector3D(10, 20, 30)); regions.Add(new XbimRegion("region1", bb, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } model.SaveAs("SampleHouse4.xbim", StorageType.Xbim); model.Close(); } using (var model = IfcStore.Open(@"SampleHouse4.xbim")) { var geomStore = model.GeometryStore; Assert.IsFalse(geomStore.IsEmpty); using (var reader = geomStore.BeginRead()) { Assert.IsTrue(reader.ContextIds.Any()); Assert.IsTrue(reader.ContextRegions.First().ContextLabel == 50); Assert.IsTrue(reader.ShapeGeometries.Count() == 1); Assert.IsTrue(reader.ShapeInstances.Count() == 1); Assert.IsTrue(reader.StyleIds.Count == 1); } model.Close(); } }
public void EsentGeometryStoreReopenAddTest() { var db = Guid.NewGuid().ToString() + ".xbim"; var ifc = "TestFiles\\4walls1floorSite.ifc"; var p = new EsentModelProvider { DatabaseFileName = db }; var s = p.GetXbimSchemaVersion(ifc); using (var m = p.Open(ifc, s)) { p.Close(m); } using (var model = IfcStore.Open(db, accessMode: XbimDBAccess.ReadWrite)) { var geomStore = model.GeometryStore; using (var txn = geomStore.BeginInit()) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel, StyleLabel = 5, RepresentationContext = 50 }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; var bb = new XbimRect3D(new XbimPoint3D(1, 1, 1), new XbimVector3D(10, 20, 30)); regions.Add(new XbimRegion("region1", bb, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } model.SaveAs("SampleHouse4.xbim", StorageType.Xbim); model.Close(); } }
public void EsentGeometryStoreMultiThreadTest() { using (var model = IfcStore.Create(null, XbimSchemaVersion.Ifc4, XbimStoreType.EsentDatabase)) { var store = model.GeometryStore; using (var txn = store.BeginInit()) { Parallel.For(0, 100, i => { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); }); Parallel.For(0, 100, i => { //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var instanceId = txn.AddShapeInstance(shapeInstance, i + 1); }); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } model.Close(); } }
public int AddRegions(XbimRegionCollection regions) { lock (_shapeGeometryCursor) { SetGeometryContext(); try { _geometryCount++; return(_shapeGeometryCursor.AddGeometry(regions)); } finally { ResetGeometryContext(); } } }
public void ResourceReleaseTest() { using (var model = IfcStore.Open("TestFiles\\SampleHouse4.ifc", null, 0)) { using (var txn = model.GeometryStore.BeginInit()) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel, StyleLabel = 5, RepresentationContext = 50 }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection(); regions.ContextLabel = 50; var bb = new XbimRect3D(new XbimPoint3D(1, 1, 1), new XbimVector3D(10, 20, 30)); regions.Add(new XbimRegion("region1", bb, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } int c = model.Instances.OfType <IfcDoor>().Count(); model.Close(); } Thread.SpinWait(200); // TODO:: ISSUE HERE... when the whole suite of tests is run then the count could be greater than, // even if they are reduced correctly Assert.IsTrue(IO.Esent.EsentModel.ModelOpenCount == 0); }
public void InMemoryGeometryStoreMultiThreadTest() { using (var model = new IO.Memory.MemoryModel(new EntityFactory())) { var store = model.GeometryStore; using (var txn = store.BeginInit()) { Parallel.For(0, 100, i => { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); }); Parallel.For(0, 100, i => { //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var instanceId = txn.AddShapeInstance(shapeInstance, i + 1); }); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100)); txn.AddRegions(regions); txn.Commit(); } } }
/// <summary> /// Works only on models version 1. /// </summary> /// <param name="model"></param> /// <returns></returns> private static XbimRegion GetLargestRegion(XbimModel model) { //get the region data should only be one var project = model.IfcProject; var projectId = 0; if (project != null) { projectId = project.EntityLabel; } // in version 1.0 there should be only 1 record in the database for the project (storing multiple regions). var regionData = model.GetGeometryData(projectId, XbimGeometryType.Region).FirstOrDefault(); if (regionData == null) { return(null); } var regions = XbimRegionCollection.FromArray(regionData.ShapeData); return(regions.MostPopulated()); // this then returns }
public void IfcStoreRegionWorldCoordTest() { XbimMatrix3D WorldCoord = new XbimMatrix3D(-0.228171504575237, -0.973620955248947, 0, 0, 0.973620955248947, -0.228171504575237, 0, 0, 0, 0, 1, 0, 543188712, 259041729, 16000, 1); var creds = new XbimEditorCredentials(); using (IfcStore model = IfcStore.Create(@"RegionTest.xbim", creds, XbimSchemaVersion.Ifc2X3)) { var geomStore = model.GeometryStore; using (var txn = geomStore.BeginInit()) { //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection(); regions.ContextLabel = 50; var bb = new XbimRect3D(new XbimPoint3D(1, 1, 1), new XbimVector3D(10, 20, 30)); regions.Add(new XbimRegion("region1", bb, 100, WorldCoord)); txn.AddRegions(regions); txn.Commit(); } model.Close(); } using (var model = IfcStore.Open(@"RegionTest.xbim")) { var geomStore = model.GeometryStore; Assert.IsFalse(geomStore.IsEmpty); using (var reader = geomStore.BeginRead()) { Assert.IsTrue(reader.ContextIds.Any()); var regioncoll = reader.ContextRegions.First(); var region = regioncoll.FirstOrDefault(); Assert.AreEqual(WorldCoord.OffsetX, region.WorldCoordinateSystem.OffsetX, 1.0); Assert.AreEqual(WorldCoord.OffsetY, region.WorldCoordinateSystem.OffsetY, 1.0); Assert.AreEqual(WorldCoord.OffsetZ, region.WorldCoordinateSystem.OffsetZ, 1.0); } model.Close(); } }
public void EsentGeometryStoreReadTest() { using (var model = IO.Esent.EsentModel.CreateTemporaryModel(ef4)) { var store = model.GeometryStore; using (var txn = store.BeginInit()) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD300, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel, RepresentationContext = 50 }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //ADD 2 REGIONCOLLECTIONS var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); regions = new XbimRegionCollection { ContextLabel = 51 }; regions.Add(new XbimRegion("region2", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } //start to read using (var reader = store.BeginRead()) { Assert.IsTrue(reader.ContextRegions.Count() == 2, "Incorrect number of regions retrieved"); var regionsList = reader.ContextRegions.ToList(); var contextIds = reader.ContextIds.ToList(); for (int i = 0; i < reader.ContextRegions.Count(); i++) { Assert.IsTrue(regionsList[i].ContextLabel == 50 + i); Assert.IsTrue(contextIds[i] == 50 + i); } Assert.IsTrue(reader.ShapeGeometries.Count() == 1, "Should have returned one shape geometry"); Assert.IsTrue(reader.ShapeGeometries.First().LOD == XbimLOD.LOD300); Assert.IsTrue(reader.ShapeInstances.Count() == 1, "Should have returned one shape instance"); Assert.IsTrue(reader.ShapeInstances.First().RepresentationContext == 50); Assert.IsTrue(reader.ShapeInstancesOfContext(50).Count() == 1); } model.Close(); } }
public void IfcStoreGeometryGeometryClearTest() { using (var model = new IO.Esent.EsentModel(ef4)) { model.CreateFrom("SampleHouse4.ifc", null, null, true); var store = model.GeometryStore; using (var txn = store.BeginInit()) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } //now redo which should clear the geoemtry using (var txn = store.BeginInit()) { Assert.IsNotNull(txn); //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = shapeGeomLabel }; var instanceId = txn.AddShapeInstance(shapeInstance, shapeGeomLabel); Assert.IsTrue(instanceId == 1); //if this is 2 it has failed to clear //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } model.Close(); } }
public void EsentGeometryStoreBatchTest() { using (var model = new IO.Esent.EsentModel(ef4)) { model.CreateFrom("SampleHouse4.ifc", null, null, true); var store = model.GeometryStore; using (var txn = store.BeginInit()) { for (int i = 0; i < 100; i++) { //ADD A GEOMETRY SHAPE var geomData = new XbimShapeGeometry() { IfcShapeLabel = 1, Format = XbimGeometryType.BoundingBox, GeometryHash = 0, LOD = XbimLOD.LOD100, ReferenceCount = 1, ShapeData = "2123", BoundingBox = XbimRect3D.Empty }; var shapeGeomLabel = txn.AddShapeGeometry(geomData); } for (int i = 0; i < 100; i++) { //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var instanceId = txn.AddShapeInstance(shapeInstance, i + 1); Assert.IsTrue(instanceId == i + 1); } for (int i = 0; i < 100; i++) { //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var instanceId = txn.AddShapeInstance(shapeInstance, i + 1); Assert.IsTrue(instanceId == i + 101); } for (int i = 0; i < 100; i++) { //ADD A SHAPE INSTANCE var shapeInstance = new XbimShapeInstance() { ShapeGeometryLabel = i + 1 }; var instanceId = txn.AddShapeInstance(shapeInstance, i + 1); Assert.IsTrue(instanceId == i + 201); } //ADD A REGIONCOLLECTION var regions = new XbimRegionCollection { ContextLabel = 50 }; regions.Add(new XbimRegion("region1", XbimRect3D.Empty, 100, XbimMatrix3D.Identity)); txn.AddRegions(regions); txn.Commit(); } model.Close(); } }
public int AddRegions(XbimRegionCollection regions) { return(_inMemoryGeometryStore.AddRegions(regions)); }
internal int AddRegions(XbimRegionCollection regions) { _regions.Add(regions); return(_regions.Count - 1); }
private static XbimRegionCollection PartitionWorld(XbimModel model, XbimRect3D bounds) { float metre = (float)model.ModelFactors.OneMetre; XbimRegionCollection regions = new XbimRegionCollection(); if (bounds.Length() / metre <= MaxWorldSize) { regions.Add(new XbimRegion("All", bounds, -1)); } else //need to partition the model { List<XbimBBoxClusterElement> ElementsToCluster = new List<XbimBBoxClusterElement>(); foreach (var geomData in model.GetGeometryData(XbimGeometryType.BoundingBox)) { XbimRect3D bound = XbimRect3D.FromArray(geomData.ShapeData); XbimMatrix3D m3D = geomData.Transform; bound = XbimRect3D.TransformBy(bound, m3D); ElementsToCluster.Add(new XbimBBoxClusterElement(geomData.GeometryLabel, bound)); } // the XbimDBSCAN method adopted for clustering produces clusters of contiguous elements. // if the maximum size is a problem they could then be split using other algorithms that divide spaces equally // var v = XbimDBSCAN.GetClusters(ElementsToCluster, 5 * metre); // .OrderByDescending(x => x.GeometryIds.Count); int i = 1; foreach (var item in v) { regions.Add(new XbimRegion("Region " + i++, item.Bound, item.GeometryIds.Count)); } } return regions; }