There are many ways to access the surfaces objects in a drawing. All the surfaces contained by a Document can be obtained using the CivilDocument.GetSurfaceIds() method, which returns an ObjectIdCollection.
ObjectIdCollection SurfaceIds = doc.GetSurfaceIds();
foreach (ObjectId surfaceId in SurfaceIds)
{
CivSurface oSurface = surfaceId.GetObject(OpenMode.ForRead) as CivSurface;
editor.WriteMessage("Surface: {0} \n Type: {1}", oSurface.Name, oSurface.GetType().ToString());
}
Note that there is also a Surface class in the Autodesk.AutoCAD.DatabaseServices namespace, which will conflict with Autodesk.Civil.DatabaseServices.Surface if you use both namespaces. In this case you can fully qualify the Surface object, or use a "using" alias directive to disambiguate the reference. For example:
using CivSurface = Autodesk.Civil.DatabaseServices.Surface;
And then use the alias like this:
CivSurface oSurface = surfaceId.GetObject(OpenMode.ForRead) as CivSurface;
You can also prompt a user to select a specific surface type, such as a TIN Surface, and then get the surface ID from the selection:
private ObjectId promptForTinSurface(String prompt)
{
PromptEntityOptions options = new PromptEntityOptions(
String.Format("\n{0}: ", prompt));
options.SetRejectMessage(
"\nThe selected object is not a TIN Surface.");
options.AddAllowedClass(typeof(TinSurface), true);
PromptEntityResult result = editor.GetEntity(options);
if (result.Status == PromptStatus.OK)
{
// We have the correct object type
return result.ObjectId;
}
return ObjectId.Null; // Indicating error.
}