public static Surface ExtractSurface(Autodesk.Revit.DB.PlanarFace face, IEnumerable<PolyCurve> edgeLoops) { edgeLoops = edgeLoops.ToList(); var x = face.get_Vector(0).ToVector(false); var y = face.get_Vector(1).ToVector(false); // Construct planar surface larger than the biggest edge loop var or = edgeLoops.First().StartPoint; // don't use origin provided by revit, could be anywhere var maxLength = edgeLoops.Max(pc => pc.Length); var bigx = x.Scale(maxLength * 2); var bigy = y.Scale(maxLength * 2); return Surface.ByPerimeterPoints(new[] { or.Subtract(bigx).Subtract(bigy), or.Add(bigx).Subtract(bigy), or.Add(bigx).Add(bigy), or.Subtract(bigx).Add(bigy) }); }