Example #1
0
        private static XbimMatrix3D ConvertCartesianTransform3D(IIfcCartesianTransformationOperator3D ct3D)
        {
            XbimVector3D u3; //Z Axis Direction
            XbimVector3D u2; //X Axis Direction
            XbimVector3D u1; //Y axis direction

            if (ct3D.Axis3 != null)
            {
                var dir = ct3D.Axis3;
                u3 = new XbimVector3D(dir.X, dir.Y, dir.Z);
                u3 = u3.Normalized();
            }
            else
            {
                u3 = new XbimVector3D(0, 0, 1);
            }
            if (ct3D.Axis1 != null)
            {
                var dir = ct3D.Axis1;
                u1 = new XbimVector3D(dir.X, dir.Y, dir.Z);
                u1 = u1.Normalized();
            }
            else
            {
                var defXDir = new XbimVector3D(1, 0, 0);
                u1 = u3 != defXDir ? defXDir : new XbimVector3D(0, 1, 0);
            }
            var xVec  = XbimVector3D.Multiply(XbimVector3D.DotProduct(u1, u3), u3);
            var xAxis = XbimVector3D.Subtract(u1, xVec);

            xAxis = xAxis.Normalized();

            if (ct3D.Axis2 != null)
            {
                var dir = ct3D.Axis2;
                u2 = new XbimVector3D(dir.X, dir.Y, dir.Z);
                u2 = u2.Normalized();
            }
            else
            {
                u2 = new XbimVector3D(0, 1, 0);
            }

            var tmp   = XbimVector3D.Multiply(XbimVector3D.DotProduct(u2, u3), u3);
            var yAxis = XbimVector3D.Subtract(u2, tmp);

            tmp   = XbimVector3D.Multiply(XbimVector3D.DotProduct(u2, xAxis), xAxis);
            yAxis = XbimVector3D.Subtract(yAxis, tmp);
            yAxis = yAxis.Normalized();
            u2    = yAxis;
            u1    = xAxis;

            var lo = new XbimPoint3D(ct3D.LocalOrigin.X, ct3D.LocalOrigin.Y, ct3D.LocalOrigin.Z); //local origin

            return(new XbimMatrix3D(u1.X, u1.Y, u1.Z, 0,
                                    u2.X, u2.Y, u2.Z, 0,
                                    u3.X, u3.Y, u3.Z, 0,
                                    lo.X, lo.Y, lo.Z, 1));
        }
Example #2
0
        public override string WhereRule()
        {
            string baseErr = base.WhereRule();

            if (_extrudedDirection != null &&
                XbimVector3D.DotProduct(_extrudedDirection.XbimVector3D(), new XbimVector3D(0, 0, 1)) == 0)
            {
                baseErr +=
                    "WR31 ExtrudedAreaSolid : The ExtrudedDirection shall not be perpendicular to the local z-axis.\n";
            }
            return(baseErr);
        }
Example #3
0
        /// <summary>
        /// returns the area of the polyloop
        /// </summary>
        /// <param name="loop"></param>
        /// <returns></returns>
        public static double Area(this IfcPolyLoop loop)
        {
            XbimVector3D sum = new XbimVector3D(0, 0, 0);
            IList <IfcCartesianPoint> pts = loop.Polygon;

            for (int i = 0; i < pts.Count - 1; i++)
            {
                XbimVector3D a = new XbimVector3D(pts[i].X, pts[i].Y, pts[i].Z);
                XbimVector3D b = new XbimVector3D(pts[i + 1].X, pts[i + 1].Y, pts[i + 1].Z);
                sum = sum + a.CrossProduct(b);
            }
            XbimVector3D n = loop.NewellsNormal();

            return(n.DotProduct(sum) / 2);
        }
        private static XbimMatrix3D ConvertCartesianTransformationOperator3DnonUniform(IfcCartesianTransformationOperator3DnonUniform ct3D)
        {
            XbimVector3D u3; //Z Axis Direction
            XbimVector3D u2; //X Axis Direction
            XbimVector3D u1; //Y axis direction

            if (ct3D.Axis3 != null)
            {
                IfcDirection dir = ct3D.Axis3;
                u3 = new XbimVector3D(dir.DirectionRatios[0], dir.DirectionRatios[1], dir.DirectionRatios[2]);
                u3.Normalize();
            }
            else
            {
                u3 = new XbimVector3D(0, 0, 1);
            }
            if (ct3D.Axis1 != null)
            {
                IfcDirection dir = ct3D.Axis1;
                u1 = new XbimVector3D(dir.DirectionRatios[0], dir.DirectionRatios[1], dir.DirectionRatios[2]);
                u1.Normalize();
            }
            else
            {
                XbimVector3D defXDir = new XbimVector3D(1, 0, 0);
                u1 = u3 != defXDir ? defXDir : new XbimVector3D(0, 1, 0);
            }
            XbimVector3D xVec  = XbimVector3D.Multiply(XbimVector3D.DotProduct(u1, u3), u3);
            XbimVector3D xAxis = XbimVector3D.Subtract(u1, xVec);

            xAxis.Normalize();

            if (ct3D.Axis2 != null)
            {
                IfcDirection dir = ct3D.Axis2;
                u2 = new XbimVector3D(dir.DirectionRatios[0], dir.DirectionRatios[1], dir.DirectionRatios[2]);
                u2.Normalize();
            }
            else
            {
                u2 = new XbimVector3D(0, 1, 0);
            }

            XbimVector3D tmp   = XbimVector3D.Multiply(XbimVector3D.DotProduct(u2, u3), u3);
            XbimVector3D yAxis = XbimVector3D.Subtract(u2, tmp);

            tmp   = XbimVector3D.Multiply(XbimVector3D.DotProduct(u2, xAxis), xAxis);
            yAxis = XbimVector3D.Subtract(yAxis, tmp);
            yAxis.Normalize();
            u2 = yAxis;
            u1 = xAxis;

            XbimPoint3D lo = ct3D.LocalOrigin.XbimPoint3D(); //local origin

            XbimMatrix3D matrix = new XbimMatrix3D(u1.X, u1.Y, u1.Z, 0,
                                                   u2.X, u2.Y, u2.Z, 0,
                                                   u3.X, u3.Y, u3.Z, 0,
                                                   lo.X, lo.Y, lo.Z, 1);

            matrix.Scale(new XbimVector3D(ct3D.Scl, ct3D.Scl2, ct3D.Scl3));

            return(matrix);
        }