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)); }
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); }
/// <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); }