Example #1
0
        private void TransformPlacements()
        {
            var toRemove = new List <IfcLocalPlacement>();

            foreach (var alignment in _alignments)
            {
                var segments = alignment.Segments.ToList();
                foreach (var element in alignment.Elements)
                {
                    // only transform local placements
                    var lPlacement = element.ObjectPlacement as IfcLocalPlacement;
                    if (lPlacement == null)
                    {
                        continue;
                    }

                    // get placement aggregated to the level of site (excluding site)
                    var matrix = GetMatrixRelativeToSite(element);

                    var position     = matrix.Transform(new XbimPoint3D(0, 0, 0));
                    var intersection = GetIntersection2D(segments, position);
                    if (intersection == null)
                    {
                        Log.Warning($"Object placement for {element} could not be created because intersection was not found.");
                        continue;
                    }

                    // invert the matrix for the directions
                    matrix.Invert();
                    var vertDir = matrix.Transform(new XbimVector3D(0, 0, 1)).Normalized();
                    var xDir    = matrix.Transform(new XbimVector3D(1, 0, 0)).Normalized();

                    _model.Delete(element.ObjectPlacement);
                    element.ObjectPlacement = i.New <IfcLinearPlacement>(lp =>
                    {
                        lp.Distance = i.New <IfcDistanceExpression>(d =>
                        {
                            d.AlongHorizontal = true;
                            d.OffsetVertical  = position.Z;
                            d.DistanceAlong   = intersection.DistanceAlong;
                            d.OffsetLateral   = intersection.OffsetLateral;
                        });
                        lp.PlacementRelTo         = SitePlacement;
                        lp.PlacementMeasuredAlong = alignment.Alignment.Axis;
                        lp.Orientation            = i.New <IfcOrientationExpression>(o =>
                        {
                            o.VerticalAxisDirection = i.New <IfcDirection>(d => d.SetXYZ(vertDir.X, vertDir.Y, vertDir.Z));
                            o.LateralAxisDirection  = i.New <IfcDirection>(d => d.SetXYZ(xDir.X, xDir.Y, xDir.Z));
                        });
                    });
                    toRemove.Add(lPlacement);
                }
            }

            // remove unused local placements from the model
            if (toRemove.Any())
            {
                _model.Delete(toRemove);
            }
        }