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); }
/// <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 }