/// <summary> /// Adapts alignment to given IFC4 placement aggregation. /// </summary> /// <param name="placement">The current placement</param> /// <param name="align">The alignment</param> /// <returns>A modified placement</returns> public static IfcLocalPlacement ChangeIfc4ObjectPlacementTo(this IfcLocalPlacement placement, IfcAlignReferenceAxis align, bool newAxisInstances) { var s = placement.Model; var refAxis = placement.RelativePlacement as IfcAxis2Placement3D; if (null == refAxis) { refAxis = s.Instances.New <IfcAxis2Placement3D>(); if (null != placement.RelativePlacement) { s.Logger.LogWarning($"Leaving potentially orphan instance '{placement.RelativePlacement}'"); } } if (!newAxisInstances && refAxis.Axis is IfcDirection d1) { d1.DirectionRatios.Clear(); d1.DirectionRatios.AddRange(align.ReferenceAxis.ToIfcReal4()); } else { refAxis.Axis = s.NewIfcDirection <IfcDirection>(align.ReferenceAxis); } if (!newAxisInstances && refAxis.RefDirection is IfcDirection d2) { d2.DirectionRatios.Clear(); d2.DirectionRatios.AddRange(align.AlignToAxis.ToIfcReal4()); } else { refAxis.RefDirection = s.NewIfcDirection <IfcDirection>(align.AlignToAxis); } if (!newAxisInstances && refAxis.Location is IfcCartesianPoint p1) { p1.Coordinates.Clear(); p1.Coordinates.AddRange(align.Offset.ToXbimVector3D().ToIfcLengthMeasure4(s.ModelFactors)); } else { refAxis.Location = s.NewIfcPoint <IfcCartesianPoint>(align.Offset.ToXbimVector3D(), true); } placement.RelativePlacement = refAxis; return(placement); }
/// <summary> /// Creates a new local placement based on alignment reference /// </summary> /// <param name="s">The store</param> /// <param name="align">The aligment</param> /// <returns>A new local placement</returns> public static IfcLocalPlacement NewIfc4ObjectPlacementTo(this IModel s, IfcAlignReferenceAxis align) { var localPlacement = s.Instances.New <IfcLocalPlacement>(); return(ChangeIfc4ObjectPlacementTo(localPlacement, align, true)); }