// attempting to load the shapeGeometry from the database; // internal static WpfMeshGeometry3D GetRepresentationGeometry(Material mat, IEnumerable<IIfcProduct> productContexts, IEnumerable<int> representationLabels, IModel selModel, XbimMatrix3D modelTransform, bool wcsAdjust) { var placementTree = new XbimPlacementTree(selModel, wcsAdjust); var tgt = new WpfMeshGeometry3D(mat, mat); tgt.BeginUpdate(); using (var geomstore = selModel.GeometryStore) using (var geomReader = geomstore.BeginRead()) { var matchingGeometries = geomReader.ShapeGeometries.Where(x => representationLabels.Contains(x.IfcShapeLabel)); foreach (var contextualProduct in productContexts) { var trsf = placementTree[contextualProduct.ObjectPlacement.EntityLabel]; foreach (IXbimShapeGeometryData shapegeom in matchingGeometries) { if (shapegeom.Format != (byte)XbimGeometryType.PolyhedronBinary) continue; // Debug.WriteLine($"adding {shapegeom.ShapeLabel} at {DateTime.Now.ToLongTimeString()}"); var transform = trsf * modelTransform; tgt.Add( shapegeom.ShapeData, 453, // shapeInstance.IfcTypeId, contextualProduct.EntityLabel, // shapeInstance.IfcProductLabel, -1, // shapeInstance.InstanceLabel, transform, (short)contextualProduct.Model.UserDefinedId ); } } } tgt.EndUpdate(); return tgt; }
protected XbimMatrix3D PlacementOf(IIfcProduct p) { XbimPlacementTree tree; if (!Placements.TryGetValue(p.Model, out tree)) { tree = new XbimPlacementTree(p.Model, false); Placements.Add(p.Model, tree); } return(XbimPlacementTree.GetTransform(p, tree, Engine)); }
// attempting to load the shapeGeometry from the database; // public static WpfMeshGeometry3D GetGeometry(IIfcShapeRepresentation rep, XbimModelPositioningCollection positions, Material mat) { var placementTree = new XbimPlacementTree(rep.Model); var tgt = new WpfMeshGeometry3D(mat, mat); tgt.BeginUpdate(); var prodShapes = rep.OfProductRepresentation.OfType <IIfcProductDefinitionShape>(); foreach (var prodShape in prodShapes) { if (prodShape?.ShapeOfProduct == null) { continue; } foreach (var contextualProduct in prodShape?.ShapeOfProduct) { var trsf = placementTree[contextualProduct.ObjectPlacement.EntityLabel]; var modelTransform = positions[rep.Model].Transform; using (var geomstore = rep.Model.GeometryStore) using (var geomReader = geomstore.BeginRead()) { var dispitems = rep.Items.Select(x => x.EntityLabel); var r2 = geomReader.ShapeGeometries.Where(x => dispitems.Contains(x.IfcShapeLabel)); foreach (IXbimShapeGeometryData shapegeom in r2) { if (shapegeom.Format != (byte)XbimGeometryType.PolyhedronBinary) { continue; } // Debug.WriteLine($"adding {shapegeom.ShapeLabel} at {DateTime.Now.ToLongTimeString()}"); var transform = trsf * modelTransform; tgt.Add( shapegeom.ShapeData, 453, // shapeInstance.IfcTypeId, contextualProduct.EntityLabel, // shapeInstance.IfcProductLabel, -1, // shapeInstance.InstanceLabel, transform, (short)rep.Model.UserDefinedId ); } } } } tgt.EndUpdate(); return(tgt); }
internal void Prepare(CancelableProgressing cancelableProgress) { PlacementTree = new XbimPlacementTree(Source, false); SourceRootPlacementsLabels = Source.Instances .OfType <IIfcLocalPlacement>() .Where(p => p.PlacementRelTo == null).Select(p => p.EntityLabel).ToArray(); Array.Sort(SourceRootPlacementsLabels); switch (AppliedPlacementStrategy) { case IfcPlacementStrategy.NewRootPlacement: if (Source.SchemaVersion == Xbim.Common.Step21.XbimSchemaVersion.Ifc2X3) { throw new NotSupportedException("IFC2x3 doesn't support new placements without object context. Consider using 'IfcPlacementStrategy.ChangeRootPlacements'"); } // Shift is absorbed by new placement SingletonShift = XbimVector3D.Zero; break; case IfcPlacementStrategy.ChangeRootPlacements: if (SourceRootPlacementsLabels.Length > 1) { // Mean, if more than one var entireTranslation = SourceRootPlacementsLabels.Select(l => PlacementTree[l].Translation).Aggregate((a, b) => a + b); SingletonShift = entireTranslation * (1.0 / SourceRootPlacementsLabels.Length); } else { // Precise offset of singleton root SingletonShift = PlacementTree[SourceRootPlacementsLabels[0]].Translation; } AppliedAxisAlignment.SourceReferenceAxis.Translate(SingletonShift, -UnitsPerMeterSource); break; default: throw new NotImplementedException($"Missing '{AppliedPlacementStrategy}'"); } }
internal static WpfMeshGeometry3D GetRepresentationGeometry2(Material mat, IEnumerable <int> representationLabels, IModel selModel, XbimMatrix3D modelTransform, bool wcsAdjust, XbimShapeGeometry shapegeom, IIfcProduct contextualProduct) { var placementTree = new XbimPlacementTree(selModel, wcsAdjust); var trsf = placementTree[contextualProduct.ObjectPlacement.EntityLabel]; var tgt = new WpfMeshGeometry3D(mat, mat); tgt.BeginUpdate(); if (shapegeom.Format == XbimGeometryType.PolyhedronBinary) { // Debug.WriteLine($"adding {shapegeom.ShapeLabel} at {DateTime.Now.ToLongTimeString()}"); var transform = trsf * modelTransform; tgt.Add( ((IXbimShapeGeometryData)shapegeom).ShapeData, contextualProduct.ExpressType.TypeId, // shapeInstance.IfcTypeId, contextualProduct.EntityLabel, // shapeInstance.IfcProductLabel, -1, // shapeInstance.InstanceLabel, transform, (short)contextualProduct.Model.UserDefinedId ); } tgt.EndUpdate(); return(tgt); }