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);
        }
Example #2
0
        /// <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
        }