/// <summary> /// Copy constructor using the specification of another alignment /// </summary> /// <param name="axisAlignment"></param> public IfcAxisAlignment(IfcAxisAlignment axisAlignment) { if (null == axisAlignment) { throw new ArgumentNullException(nameof(axisAlignment)); } SourceReferenceAxis = new IfcAlignReferenceAxis(axisAlignment.SourceReferenceAxis); TargetReferenceAxis = new IfcAlignReferenceAxis(axisAlignment.TargetReferenceAxis); }
/// <summary> /// Changes an existing local placement to be aligned to target axis. /// </summary> /// <param name="placement">A placement to be aligned</param> /// <param name="transform">The associated transform in model units</param> /// <returns>The given placement with (possible) additional axis components</returns> public IIfcLocalPlacement ChangeIfcLocalPlacement(IIfcLocalPlacement placement, XbimMatrix3D transform) { // Compute delta alignment var virtualParent = SourceReferenceAxis.TransformAxisTo(TargetReferenceAxis); // Multiply out with selected placement var unitsPerMeter = placement.Model.ModelFactors.OneMeter; var finalAlignment = new IfcAlignReferenceAxis(transform * virtualParent.To3D(unitsPerMeter), unitsPerMeter); switch (placement.Model.SchemaVersion) { case Xbim.Common.Step21.XbimSchemaVersion.Ifc2X3: return((placement as Xbim.Ifc2x3.GeometricConstraintResource.IfcLocalPlacement).ChangeIfc2x3ObjectPlacementTo(finalAlignment, true)); case Xbim.Common.Step21.XbimSchemaVersion.Ifc4: case Xbim.Common.Step21.XbimSchemaVersion.Ifc4x1: return((placement as Xbim.Ifc4.GeometricConstraintResource.IfcLocalPlacement).ChangeIfc4ObjectPlacementTo(finalAlignment, true)); default: throw new ArgumentException($"Unhandled schema version {placement.Model.SchemaVersion}"); } }