Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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));
        }