/// <summary> /// Get wall face /// </summary> /// <param name="faces"></param> /// <returns></returns> private List <Edge> GetWallFace(List <List <Edge> > faces) { LocationCurve location = m_dataProfile.Location as LocationCurve; Curve curve = location.Curve; List <XYZ> xyzs = curve.Tessellate() as List <XYZ>; Vector4 zAxis = new Vector4(0, 0, 1); if (xyzs.Count == 2) { return(faces[0]); } foreach (List <Edge> face in faces) { foreach (Edge edge in face) { List <XYZ> edgexyzs = edge.Tessellate() as List <XYZ>; if (xyzs.Count == edgexyzs.Count) { Vector4 normal = GetFaceNormal(face); Vector4 cross = Vector4.CrossProduct(zAxis, normal); cross.Normalize(); if (cross.Length() == 1) { return(face); } } } } return(faces[0]); }
/// <summary> /// Wall matrix /// </summary> /// <returns></returns> public Matrix4 WallMatrix() { //get the location curve LocationCurve location = m_dataProfile.Location as LocationCurve; Vector4 xAxis = new Vector4(1, 0, 0); Vector4 yAxis = new Vector4(0, 1, 0); Vector4 zAxis = new Vector4(0, 0, 1); Vector4 origin = new Vector4(0, 0, 0); if (location != null) { Curve curve = location.Curve; Autodesk.Revit.DB.XYZ start = curve.GetEndPoint(0); Autodesk.Revit.DB.XYZ end = curve.GetEndPoint(1); xAxis = new Vector4((float)(end.X - start.X), (float)(end.Y - start.Y), (float)(end.Z - start.Z)); xAxis.Normalize(); yAxis = new Vector4(0, 0, 1); zAxis = Vector4.CrossProduct(xAxis, yAxis); zAxis.Normalize(); origin = new Vector4((float)(end.X + start.X) / 2, (float)(end.Y + start.Y) / 2, (float)(end.Z + start.Z) / 2); } return(new Matrix4(xAxis, yAxis, zAxis, origin)); }
/// <summary> /// Get Face Normal /// </summary> /// <param name="face">Edges in a face</param> private Vector4 GetFaceNormal(List <Edge> face) { Edge eg0 = face[0]; Edge eg1 = face[1]; List <XYZ> points = eg0.Tessellate() as List <XYZ>; Autodesk.Revit.DB.XYZ start = points[0]; Autodesk.Revit.DB.XYZ end = points[1]; Vector4 vStart = new Vector4((float)start.X, (float)start.Y, (float)start.Z); Vector4 vEnd = new Vector4((float)end.X, (float)end.Y, (float)end.Z); Vector4 vSub = vEnd - vStart; points = eg1.Tessellate() as List <XYZ>; start = points[0]; end = points[1]; vStart = new Vector4((float)start.X, (float)start.Y, (float)start.Z); vEnd = new Vector4((float)end.X, (float)end.Y, (float)end.Z); Vector4 vSub2 = vEnd - vStart; Vector4 result = vSub.CrossProduct(vSub2); result.Normalize(); return(result); }
/// <summary> /// Get a matrix which can transform points to 2D /// </summary> public Matrix4 To2DMatrix() { if (m_dataProfile is Wall) { return(WallMatrix()); } List <XYZ> eg0 = m_face[0].Tessellate() as List <XYZ>; List <XYZ> eg1 = m_face[1].Tessellate() as List <XYZ>; Vector4 v1 = new Vector4((float)eg0[0].X, (float)eg0[0].Y, (float)eg0[0].Z); Vector4 v2 = new Vector4((float)eg0[1].X, (float)eg0[1].Y, (float)eg0[1].Z); Vector4 v21 = v1 - v2; v21.Normalize(); Vector4 v3 = new Vector4((float)eg1[0].X, (float)eg1[0].Y, (float)eg1[0].Z); Vector4 v4 = new Vector4((float)eg1[1].X, (float)eg1[1].Y, (float)eg1[1].Z); Vector4 v43 = v4 - v3; v43.Normalize(); Vector4 vZAxis = Vector4.CrossProduct(v43, v21); Vector4 vYAxis = Vector4.CrossProduct(vZAxis, v43); vYAxis.Normalize(); vZAxis.Normalize(); Vector4 vOrigin = (v4 + v1) / 2; Matrix4 result = new Matrix4(v43, vYAxis, vZAxis, vOrigin); return(result); }