Skip to content

ProSnippets ParcelFabric

UmaHarano edited this page Nov 12, 2025 · 13 revisions
Language:              C#  
Subject:               ParcelFabric  
Contributor:           ArcGIS Pro SDK Team <[email protected]>  
Organization:          Esri, http://www.esri.com  
Date:                  11/7/2025  
ArcGIS Pro:            3.6  
Visual Studio:         2022  

Parcel Fabric

Add a Parcel Layer to the map

string path = @"C:\MyTestData\MyFileGeodatabase.gdb\MyFeatureDS\MyFabric";
await QueuedTask.Run(() =>
{
  var lyrCreateParams = new ParcelLayerCreationParams(new Uri(path));
  try
  {
    var parcelLayer = LayerFactory.Instance.CreateLayer<ParcelLayer>(
      lyrCreateParams, MapView.Active.Map);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, "Add Parcel Fabric Layer");
  }
});

Get the active record

string errorMessage = await QueuedTask.Run(() =>
  {
    try
    {
      var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
      //if there is no fabric in the map then bail
      if (myParcelFabricLayer == null)
        return "There is no fabric in the map.";
      var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
      if (theActiveRecord == null)
        return "There is no Active Record. Please set the active record and try again.";
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get Active Record.");

Set the active record

string errorMessage = await QueuedTask.Run(async () =>
  {
    try
    {
      string sExistingRecord = "MyRecordName";
      var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
      //if there is no fabric in the map then bail
      if (myParcelFabricLayer == null)
        return "There is no fabric in the map.";

      bool bSuccess = await myParcelFabricLayer.SetActiveRecordAsync(sExistingRecord);
      if (!bSuccess)
        return "No record called " + sExistingRecord + " was found.";
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Set Active Record.");

Create a new record

string errorMessage = await QueuedTask.Run(async () =>
{
  Dictionary<string, object> RecordAttributes = [];
  string sNewRecord = "MyRecordName";
  try
  {
    var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    //if there is no fabric in the map then bail
    if (myParcelFabricLayer == null)
      return "There is no fabric in the map.";
    var recordsLayer = await myParcelFabricLayer.GetRecordsLayerAsync();
    var editOper = new EditOperation()
    {
      Name = "Create Parcel Fabric Record",
      ProgressMessage = "Create Parcel Fabric Record...",
      ShowModalMessageAfterFailure = true,
      SelectNewFeatures = false,
      SelectModifiedFeatures = false
    };
    RecordAttributes.Add("Name", sNewRecord);
    var editRowToken = editOper.Create(recordsLayer.FirstOrDefault(), RecordAttributes);
    if (!editOper.Execute())
      return editOper.ErrorMessage;

    var defOID = -1;
    var lOid = editRowToken.ObjectID ?? defOID;
    await myParcelFabricLayer.SetActiveRecordAsync(lOid);
  }
  catch (Exception ex)
  {
    return ex.Message;
  }
  return "";
});
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Create New Record.");

Copy standard line features into a parcel type

string errorMessage = await QueuedTask.Run(async () =>
     {
 // check for selected layer
 if (MapView.Active.GetSelectedLayers().Count == 0)
   return "Please select a target parcel polygon layer in the table of contents.";
 //get the feature layer that's selected in the table of contents
 var destPolygonL = MapView.Active.GetSelectedLayers().OfType<FeatureLayer>().FirstOrDefault();
 try
 {
   var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
   //if there is no fabric in the map then bail
   if (myParcelFabricLayer == null)
     return "There is no fabric in the map.";
   var pRec = myParcelFabricLayer.GetActiveRecord();
   if (pRec == null)
     return "There is no Active Record. Please set the active record and try again.";
   string ParcelTypeName = "";
   IEnumerable<string> parcelTypeNames = await myParcelFabricLayer.GetParcelTypeNamesAsync();
   foreach (string parcelTypeNm in parcelTypeNames)
   {
     var polygonLyrParcelTypeEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(parcelTypeNm);
     foreach (FeatureLayer lyr in polygonLyrParcelTypeEnum)
       if (lyr == destPolygonL)
       {
         ParcelTypeName = parcelTypeNm;
         break;
       }
   }
   if (String.IsNullOrEmpty(ParcelTypeName))
     return "Please select a target parcel polygon layer in the table of contents.";
   var srcFeatLyr = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(l => l.Name.Contains("MySourceLines") && l.IsVisible);
   if (srcFeatLyr == null)
     return "Looking for a layer named 'MySourceLines' in the table of contents.";
   //now get the line layer for this parcel type
   var destLineLyrEnum = await myParcelFabricLayer.GetParcelLineLayerByTypeNameAsync(ParcelTypeName);
   if (destLineLyrEnum.Count == 0) //make sure there is one in the map
     return ParcelTypeName + " not found.";
   var destLineL = destLineLyrEnum.FirstOrDefault();
   if (destLineL == null || destPolygonL == null)
     return "";
   var editOper = new EditOperation()
   {
     Name = "Copy Line Features To Parcel Type",
     ProgressMessage = "Copy Line Features To Parcel Type...",
     ShowModalMessageAfterFailure = true,
     SelectNewFeatures = true,
     SelectModifiedFeatures = false
   };
   var ids = new List<long>((srcFeatLyr as FeatureLayer).GetSelection().GetObjectIDs());
   if (ids.Count == 0)
     return "No selected lines were found. Please select line features and try again.";
   editOper.CopyLineFeaturesToParcelType(srcFeatLyr, ids, destLineL, destPolygonL);
   if (!editOper.Execute())
     return editOper.ErrorMessage;
 }
 catch (Exception ex)
 {
   return ex.Message;
 }
 return "";
     });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Copy Line Features To Parcel Type.");

Copy parcel lines to a parcel type

string errorMessage = await QueuedTask.Run(async () =>
 {
   // check for selected layer
   if (MapView.Active.GetSelectedLayers().Count == 0)
     return "Please select a source parcel polygon feature layer in the table of contents.";
   try
   {
     var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
     if (myParcelFabricLayer == null)
       return "No parcel layer found in the map.";

     //get the feature layer that's selected in the table of contents
     var srcParcelFeatLyr = MapView.Active.GetSelectedLayers().OfType<FeatureLayer>().FirstOrDefault();
     string sTargetParcelType = "Tax";
     var destLineLEnum = await myParcelFabricLayer.GetParcelLineLayerByTypeNameAsync(sTargetParcelType);
     if (destLineLEnum.Count == 0)
       return "";
     var destLineL = destLineLEnum.FirstOrDefault();
     var destPolygonLEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(sTargetParcelType);
     if (destPolygonLEnum.Count == 0)
       return "";
     var destPolygonL = destPolygonLEnum.FirstOrDefault();
     if (destLineL == null || destPolygonL == null)
       return "";
     var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
     if (theActiveRecord == null)
       return "There is no Active Record. Please set the active record and try again.";
     var editOper = new EditOperation()
     {
       Name = "Copy Lines To Parcel Type",
       ProgressMessage = "Copy Lines To Parcel Type ...",
       ShowModalMessageAfterFailure = true,
       SelectNewFeatures = true,
       SelectModifiedFeatures = false
     };
     var ids = new List<long>(srcParcelFeatLyr.GetSelection().GetObjectIDs());
     if (ids.Count == 0)
       return "No selected parcels found. Please select parcels and try again.";
     //add the standard feature line layers source, and their feature ids to a new Dictionary
     var sourceParcelFeatures = new Dictionary<MapMember, List<long>>
     {
       { srcParcelFeatLyr, ids }
     };
     editOper.CopyParcelLinesToParcelType(myParcelFabricLayer, SelectionSet.FromDictionary(sourceParcelFeatures), destLineL, destPolygonL, true, false, true);
     if (!editOper.Execute())
       return editOper.ErrorMessage;
   }
   catch (Exception ex)
   {
     return ex.Message;
   }
   return "";
 });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Copy Parcel Lines To Parcel Type.");

Assign features to active record

string errorMessage = await QueuedTask.Run(() =>
 {
   //check for selected layer
   if (MapView.Active.GetSelectedLayers().Count == 0)
     return "Please select a source feature layer in the table of contents.";
   //first get the feature layer that's selected in the table of contents
   var srcFeatLyr = MapView.Active.GetSelectedLayers().OfType<FeatureLayer>().FirstOrDefault();
   var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
   if (myParcelFabricLayer == null)
     return "No parcel layer found in the map.";
   try
   {
     var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
     if (theActiveRecord == null)
       return "There is no Active Record. Please set the active record and try again.";
     var editOper = new EditOperation()
     {
       Name = "Assign Features to Record",
       ProgressMessage = "Assign Features to Record...",
       ShowModalMessageAfterFailure = true,
       SelectNewFeatures = true,
       SelectModifiedFeatures = false
     };
     //add parcel type layers and their feature ids to a new Dictionary
     var ids = new List<long>(srcFeatLyr.GetSelection().GetObjectIDs());
     var sourceFeatures = new Dictionary<MapMember, List<long>>
     {
       { srcFeatLyr, ids }
     };
     editOper.AssignFeaturesToRecord(myParcelFabricLayer,
       SelectionSet.FromDictionary(sourceFeatures), theActiveRecord);
     if (!editOper.Execute())
       return editOper.ErrorMessage;
   }
   catch (Exception ex)
   {
     return ex.Message;
   }
   return "";
 });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Assign Features To Record.");

Create parcel seeds

try
{
  var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
  if (theActiveRecord == null)
    return "There is no Active Record. Please set the active record and try again.";

  var guid = theActiveRecord.Guid;
  var editOper = new EditOperation()
  {
    Name = "Create Parcel Seeds",
    ProgressMessage = "Create Parcel Seeds...",
    ShowModalMessageAfterFailure = true,
    SelectNewFeatures = true,
    SelectModifiedFeatures = false
  };
  editOper.CreateParcelSeedsByRecord(myParcelFabricLayer, guid, MapView.Active.Extent);
  if (!editOper.Execute())
    return editOper.ErrorMessage;
}
catch (Exception ex)
{
  return ex.Message;
}
return "";

Build parcels

try
{
  var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
  if (myParcelFabricLayer == null)
    return "Parcel layer not found in map.";

  var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
  var guid = theActiveRecord.Guid;
  var editOper = new EditOperation()
  {
    Name = "Build Parcels",
    ProgressMessage = "Build Parcels...",
    ShowModalMessageAfterFailure = true,
    SelectNewFeatures = true,
    SelectModifiedFeatures = true
  };
  editOper.BuildParcelsByRecord(myParcelFabricLayer, guid);
  if (!editOper.Execute())
    return editOper.ErrorMessage;
}
catch (Exception ex)
{
  return ex.Message;
}
return "";

Duplicate parcels

var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
if (myParcelFabricLayer == null)
  return "Parecl layer not found in the map.";
//get the source polygon layer from the parcel fabric layer type, in this case a layer called Lot
var srcFeatLyrEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync("Lot");
if (srcFeatLyrEnum.Count == 0)
  return "";
var sourcePolygonL = srcFeatLyrEnum.FirstOrDefault();
//get the target polygon layer from the parcel fabric layer type, in this case a layer called Tax
var targetFeatLyrEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync("Tax");
if (targetFeatLyrEnum.Count == 0)
  return "";
var targetFeatLyr = targetFeatLyrEnum.FirstOrDefault();
var ids = new List<long>(sourcePolygonL.GetSelection().GetObjectIDs());
if (ids.Count == 0)
  return "No selected parcels found. Please select parcels and try again.";
//add polygon layers and the feature ids to be duplicated to a new Dictionary
var sourceFeatures = new Dictionary<MapMember, List<long>>
{
  { sourcePolygonL, ids }
};
try
{
  var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
  if (theActiveRecord == null)
    return "There is no Active Record. Please set the active record and try again.";
  var editOper = new EditOperation()
  {
    Name = "Duplicate Parcels",
    ProgressMessage = "Duplicate Parcels...",
    ShowModalMessageAfterFailure = true,
    SelectNewFeatures = true,
    SelectModifiedFeatures = false
  };
  editOper.DuplicateParcels(myParcelFabricLayer,
    SelectionSet.FromDictionary(sourceFeatures), theActiveRecord, targetFeatLyr);
  if (!editOper.Execute())
    return editOper.ErrorMessage;
}
catch (Exception ex)
{
  return ex.Message;
}

Set parcels historic

string errorMessage = await QueuedTask.Run(async () =>
  {
    var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    if (myParcelFabricLayer == null)
      return "Please add a parcel fabric to the map";
    try
    {
      FeatureLayer destPolygonL = null;
      //find the first layer that is a parcel type, is non-historic, and has a selection
      bool bFound = false;
      var ParcelTypesEnum = await myParcelFabricLayer.GetParcelTypeNamesAsync();
      foreach (FeatureLayer mapFeatLyr in MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>())
      {
        foreach (string ParcelType in ParcelTypesEnum)
        {
          var layerEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(ParcelType);
          foreach (FeatureLayer flyr in layerEnum)
          {
            if (flyr == mapFeatLyr)
            {
              bFound = mapFeatLyr.SelectionCount > 0;
              destPolygonL = mapFeatLyr;
              break;
            }
          }
          if (bFound) break;
        }
        if (bFound) break;
      }
      if (!bFound)
        return "Please select parcels to set as historic.";

      var theActiveRecord = myParcelFabricLayer.GetActiveRecord();
      if (theActiveRecord == null)
        return "There is no Active Record. Please set the active record and try again.";

      var ids = new List<long>(destPolygonL.GetSelection().GetObjectIDs());
      //can do multi layer selection but using single per code above
      var sourceFeatures = new Dictionary<MapMember, List<long>>
      {
        { destPolygonL, ids }
      };
      var editOper = new EditOperation()
      {
        Name = "Set Parcels Historic",
        ProgressMessage = "Set Parcels Historic...",
        ShowModalMessageAfterFailure = true,
        SelectNewFeatures = true,
        SelectModifiedFeatures = false
      };
      editOper.SetParcelHistoryRetired(myParcelFabricLayer,
        SelectionSet.FromDictionary(sourceFeatures), theActiveRecord);
      if (!editOper.Execute())
        return editOper.ErrorMessage;
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Set Parcels Historic.");

Shrink parcels to seeds

string errorMessage = await QueuedTask.Run(async () =>
  {
    var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    if (myParcelFabricLayer == null)
      return "Please add a parcel fabric to the map";
    try
    {
      FeatureLayer parcelPolygonLyr = null;
      //find the first layer that is a polygon parcel type, is non-historic, and has a selection
      bool bFound = false;
      var ParcelTypesEnum = await myParcelFabricLayer.GetParcelTypeNamesAsync();
      foreach (FeatureLayer mapFeatLyr in MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>())
      {
        foreach (string ParcelType in ParcelTypesEnum)
        {
          var layerEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(ParcelType);
          foreach (FeatureLayer flyr in layerEnum)
          {
            if (flyr == mapFeatLyr)
            {
              bFound = mapFeatLyr.SelectionCount > 0;
              parcelPolygonLyr = mapFeatLyr;
              break;
            }
          }
          if (bFound) break;
        }
        if (bFound) break;
      }
      if (!bFound)
        return "Please select parcels to shrink to seeds.";
      var editOper = new EditOperation()
      {
        Name = "Shrink Parcels To Seeds",
        ProgressMessage = "Shrink Parcels To Seeds...",
        ShowModalMessageAfterFailure = true,
        SelectNewFeatures = true,
        SelectModifiedFeatures = false
      };
      var ids = new List<long>(parcelPolygonLyr.GetSelection().GetObjectIDs());
      var sourceParcelFeatures = new Dictionary<MapMember, List<long>>
      {
        { parcelPolygonLyr, ids }
      };
      editOper.ShrinkParcelsToSeeds(myParcelFabricLayer, SelectionSet.FromDictionary(sourceParcelFeatures));
      if (!editOper.Execute())
        return editOper.ErrorMessage;
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Shrink Parcels To Seeds.");

Change parcel type

//add polygon layers and the feature ids to change the type on to a new Dictionary
var ids = new List<long>(sourcePolygonL.GetSelection().GetObjectIDs());
var sourceFeatures = new Dictionary<MapMember, List<long>>
{
  { sourcePolygonL, ids }
};
try
{
  var editOper = new EditOperation()
  {
    Name = "Change Parcel Type",
    ProgressMessage = "Change Parcel Type...",
    ShowModalMessageAfterFailure = true,
    SelectNewFeatures = true,
    SelectModifiedFeatures = false
  };
  editOper.ChangeParcelType(myParcelFabricLayer, SelectionSet.FromDictionary(sourceFeatures), targetFeatLyr);
  if (!editOper.Execute())
    return editOper.ErrorMessage;
}
catch (Exception ex)
{
  return ex.Message;
}
return "";

Get parcel features

string sReportResult = "Polygon Information --" + Environment.NewLine;
  string sParcelTypeName = "tax";
  string errorMessage = await QueuedTask.Run(async () =>
  {
    var myParcelFabricLayer =
      MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    //if there is no fabric in the map then bail
    if (myParcelFabricLayer == null)
      return "There is no fabric layer in the map.";

    //first get the parcel type feature layer
    var featSrcLyr = myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(sParcelTypeName).Result.FirstOrDefault();

    if (featSrcLyr.SelectionCount == 0)
      return "There is no selection on the " + sParcelTypeName + " layer.";

    sReportResult += " Parcel Type: " + sParcelTypeName + Environment.NewLine;
    sReportResult += " Poygons: " + featSrcLyr.SelectionCount + Environment.NewLine + Environment.NewLine;

    try
    {
      // ------- get the selected parcels ---------
      var ids = new List<long>((featSrcLyr as FeatureLayer).GetSelection().GetObjectIDs());
      var sourceParcels = new Dictionary<MapMember, List<long>>
      {
        { featSrcLyr, ids }
      };
      //---------------------------------------------
      ParcelFeatures parcFeatures =
                      await myParcelFabricLayer.GetParcelFeaturesAsync(SelectionSet.FromDictionary(sourceParcels));
      //since we know that we want to report on Tax lines only, and for this functionality 
      // we can use any of the Tax line layer instances (if there happens to be more than one)
      // we can get the first instance as follows
      FeatureLayer myLineFeatureLyr =
          myParcelFabricLayer.GetParcelLineLayerByTypeNameAsync(sParcelTypeName).Result.FirstOrDefault();
      if (myLineFeatureLyr == null)
        return sParcelTypeName + " line layer not found";

      FeatureLayer myPointFeatureLyr =
          myParcelFabricLayer.GetPointsLayerAsync().Result.FirstOrDefault();
      if (myPointFeatureLyr == null)
        return "fabric point layer not found";

      var LineInfo = parcFeatures.Lines; //then get the line information from the parcel features object
                                         //... and then do some work for each of the lines
      int iRadiusAttributeCnt = 0;
      int iDistanceAttributeCnt = 0;
      sReportResult += "Line Information --";
      foreach (KeyValuePair<string, List<long>> kvp in LineInfo)
      {
        if (!kvp.Key.Equals(sParcelTypeName, StringComparison.CurrentCultureIgnoreCase))
          continue; // ignore any other lines from different parcel types

        foreach (long oid in kvp.Value)
        {
          var insp = myLineFeatureLyr.Inspect(oid);
          var dRadius = insp["RADIUS"];
          var dDistance = insp["DISTANCE"];

          if (dRadius != DBNull.Value)
            iRadiusAttributeCnt++;
          if (dDistance != DBNull.Value)
            iDistanceAttributeCnt++;
          //Polyline poly = (Polyline)insp["SHAPE"];
        }
        sReportResult += Environment.NewLine + " Distance attributes: " + iDistanceAttributeCnt.ToString();
        sReportResult += Environment.NewLine + " Radius attributes: " + iRadiusAttributeCnt.ToString();
      }

      var PointInfo = parcFeatures.Points; //get the point information from the parcel features object
                                           //... and then do some work for each of the points
      sReportResult += Environment.NewLine + Environment.NewLine + "Point Information --";
      int iFixedPointCnt = 0;
      int iNonFixedPointCnt = 0;
      foreach (long oid in PointInfo)
      {
        var insp = myPointFeatureLyr.Inspect(oid);
        var isFixed = insp["ISFIXED"];
        if (isFixed == DBNull.Value || (int)isFixed == 0)
          iNonFixedPointCnt++;
        else
          iFixedPointCnt++;
        // var pt = insp["SHAPE"];

      }
      sReportResult += Environment.NewLine + " Fixed Points: " + iFixedPointCnt.ToString();
      sReportResult += Environment.NewLine + " Non-Fixed Points: " + iNonFixedPointCnt.ToString();
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get Parcel Features");
  else
    MessageBox.Show(sReportResult, "Get Parcel Features");

Get parcel fabric dataset controller from parcel layer

string errorMessage = await QueuedTask.Run(() =>
  {
    try
    {
      var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
      //if there is no fabric in the map then bail
      if (myParcelFabricLayer == null)
        return "There is no fabric in the map.";
      var myParcelFabricDataset = myParcelFabricLayer.GetParcelFabric();
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get Parcel Fabric Dataset from layer.");

Get parcel topology of parcel fabric dataset

string errorMessage = await QueuedTask.Run(() =>
  {
    try
    {
      var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
      //if there is no fabric in the map then bail
      if (myParcelFabricLayer == null)
        return "There is no fabric in the map.";
      var myParcelFabricDataset = myParcelFabricLayer.GetParcelFabric();
      var myTopology = myParcelFabricDataset.GetParcelTopology();
    }
    catch (Exception ex)
    {
      return ex.Message;
    }
    return "";
  });
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get Parcel Fabric Topology.");

Get point, connection, and record feature classes from the parcel fabric dataset

string errorMessage = await QueuedTask.Run(() =>
{
  try
  {
    var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    //if there is no fabric in the map then bail
    if (myParcelFabricLayer == null)
      return "There is no fabric in the map.";
    var myParcelFabricDataset = myParcelFabricLayer.GetParcelFabric();
    FeatureClass myPointsFC = myParcelFabricDataset.GetSystemTable(SystemTableType.Points) as FeatureClass;
    FeatureClass myCoonectionsFC = myParcelFabricDataset.GetSystemTable(SystemTableType.Connections) as FeatureClass;
    FeatureClass myRecordsFC = myParcelFabricDataset.GetSystemTable(SystemTableType.Records) as FeatureClass;
  }
  catch (Exception ex)
  {
    return ex.Message;
  }
  return "";
});
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get point, connection, and record feature classes.");

Get parcel type feature classes from the parcel fabric dataset

string errorMessage = await QueuedTask.Run(() =>
{
  try
  {
    var myParcelFabricLayer = MapView.Active.Map.GetLayersAsFlattenedList().OfType<ParcelLayer>().FirstOrDefault();
    //if there is no fabric in the map then bail
    if (myParcelFabricLayer == null)
      return "There is no fabric in the map.";
    string myParcelTypeName = "Tax";
    var myParcelFabricDataset = myParcelFabricLayer.GetParcelFabric();
    var typeInfo = myParcelFabricDataset.GetParcelTypeInfo();
    FeatureClass lineFCType = null;
    FeatureClass polyFCType = null;
    foreach (var info in typeInfo)
    {
      if (info.Name.Equals(myParcelTypeName, StringComparison.CurrentCultureIgnoreCase))
      {
        lineFCType = info.LineFeatureTable as FeatureClass;
        polyFCType = info.PolygonFeatureTable as FeatureClass;
        break;
      }
    }
  }
  catch (Exception ex)
  {
    return ex.Message;
  }
  return "";
});
  if (!string.IsNullOrEmpty(errorMessage))
    MessageBox.Show(errorMessage, "Get Parcel Type feature classes.");

Get parcel type name from feature layer

var theparcelTypeName = await QueuedTask.Run(async () =>
  {
    IEnumerable<string> parcelTypeNames = await myParcelFabricLayer.GetParcelTypeNamesAsync();
    foreach (string parcelTypeName in parcelTypeNames)
    {
      if (geomType == GeometryType.Polygon)
      {
        var polygonLyrParcelTypeEnum = await myParcelFabricLayer.GetParcelPolygonLayerByTypeNameAsync(parcelTypeName);
        foreach (FeatureLayer lyr in polygonLyrParcelTypeEnum)
          if (lyr == featLayer)
            return parcelTypeName;

        polygonLyrParcelTypeEnum = await myParcelFabricLayer.GetHistoricParcelPolygonLayerByTypeNameAsync(parcelTypeName);
        foreach (FeatureLayer lyr in polygonLyrParcelTypeEnum)
          if (lyr == featLayer)
            return parcelTypeName;
      }
      if (geomType == GeometryType.Polyline)
      {
        var lineLyrParcelTypeEnum = await myParcelFabricLayer.GetParcelLineLayerByTypeNameAsync(parcelTypeName);
        foreach (FeatureLayer lyr in lineLyrParcelTypeEnum)
          if (lyr == featLayer)
            return parcelTypeName;

        lineLyrParcelTypeEnum = await myParcelFabricLayer.GetHistoricParcelLineLayerByTypeNameAsync(parcelTypeName);
        foreach (FeatureLayer lyr in lineLyrParcelTypeEnum)
          if (lyr == featLayer)
            return parcelTypeName;
      }
    }
    return String.Empty;
  });

Get parcel fabric from table

var parcelFabricDataset = await QueuedTask.Run(() =>
  {
    ParcelFabric myParcelFabricDataset = null;
    if (table.IsControllerDatasetSupported())
    {
      // Tables can belong to multiple controller datasets, but at most one of them will be a parcel fabric

      IReadOnlyList<Dataset> controllerDatasets = table.GetControllerDatasets();
      foreach (Dataset controllerDataset in controllerDatasets)
      {
        if (controllerDataset is ParcelFabric)
        {
          myParcelFabricDataset = controllerDataset as ParcelFabric;
        }
        else
        {
          controllerDataset.Dispose();
        }
      }
    }
    return myParcelFabricDataset;
  });

Check if layer is controlled by parcel fabric

var layer = activeMap.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault(l => l.Name == "Records");
  bool isProFabric = await layer.IsControlledByParcelFabricAsync(ParcelFabricType.ParcelFabric);
  bool isArcMapFabric = await layer.IsControlledByParcelFabricAsync(ParcelFabricType.ParcelFabricForArcMap);
Clone this wiki locally