def execute(self, parameters, messages):

        arcpy.AddMessage("Log file location: " +
                         inlineinspection.GetLogFileLocation())
        inlineinspection.AddMessage("Starting Anomaly Compare process...")

        try:
            ili_prior_anomaly_fc = parameters[0].valueAsText
            ili_recent_anomaly_fc = parameters[1].valueAsText

            if (arcpy.Exists(ili_prior_anomaly_fc)):
                ilicount = int(
                    arcpy.GetCount_management(ili_prior_anomaly_fc).getOutput(
                        0))
                #inlineinspection.AddMessage("Record count for ILI Pressure Calculator {}".format(ilicount))
                if (ilicount > 0):
                    self.ILIAnomalyComparer(parameters)
                else:
                    inlineinspection.AddWarning(
                        "There is no records to perform Anomaly Compare.")
            else:
                inlineinspection.AddWarning(
                    "There is no feature class for Anomaly Compare.")
            inlineinspection.AddMessage("Completed Anomaly Compare process.")
            return

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" %
                                      tb.tb_lineno)
            inlineinspection.AddError(str(e))
    def ILIAnomalyComparer(self, parameters):
        try:

            inputPriorAnomalyFC = parameters[0].valueAsText
            inputRecentAnomalyFC = parameters[1].valueAsText
            searchTolarance = parameters[5].valueAsText

            arcpy.env.overwriteOutput = True
            #Checking Near by features which are in specificed Tolarance
            AnomalyNearTable = fr"{arcpy.env.scratchGDB}\AnomalyNearTable"
            arcpy.analysis.GenerateNearTable(inputPriorAnomalyFC,
                                             inputRecentAnomalyFC,
                                             AnomalyNearTable, searchTolarance,
                                             "LOCATION", "ANGLE", "CLOSEST", 0,
                                             "GEODESIC")
            inlineinspection.AddMessage("Near Analysis is performed ")
            #Perform Statistics table to check what is the relation ship
            AnomalyStatisticsTable = fr"{arcpy.env.scratchGDB}\AnomalyStatisticsTable"
            arcpy.analysis.Statistics(AnomalyNearTable, AnomalyStatisticsTable,
                                      "NEAR_FID COUNT;IN_FID RANGE",
                                      "NEAR_FID")
            inlineinspection.AddMessage("Statistics Analysis is performed")

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" %
                                      tb.tb_lineno)
            inlineinspection.AddError(str(e))
            inlineinspection.AddError(
                "Issue in ILI Anomaly 2 Geography.\n{}".format(
                    arcpy.GetMessages(2)))
            return False
Beispiel #3
0
    def execute(self, parameters, messages):

        arcpy.AddMessage("Log file location: " +
                         inlineinspection.GetLogFileLocation())
        inlineinspection.AddMessage(
            "Starting Anomaly Growth Calculator process...")

        try:
            ili_inputpoint_fc = parameters[0].valueAsText
            is_grid_line = parameters[14].value
            is_weld_line = parameters[16].value

            if (arcpy.Exists(ili_inputpoint_fc)):
                ilicount = int(
                    arcpy.GetCount_management(ili_inputpoint_fc).getOutput(0))
                if (ilicount > 0):
                    inlineinspection.AddMessage(
                        "Record count for ILI {}".format(ilicount))
                else:
                    inlineinspection.AddWarning(
                        "There is no records to perform Anomaly Growth.")
            else:
                inlineinspection.AddWarning(
                    "There is no feature class for Anomaly Growth.")
            inlineinspection.AddMessage(
                "Completed Anomaly Growth Calculator process.")
            return

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" %
                                      tb.tb_lineno)
            inlineinspection.AddError(str(e))
def get_field_names(inlayer):
    # get the fields names (uppercase) list
    import arcpy
    try:
        return [f.name.upper() for f in arcpy.ListFields(inlayer)]
    except Exception as e:
        inlineinspection.AddError("Error getting fields names.")
        raise
def get_utmfrom_point(inpoint):
    try:
        utmzone = str(int(inpoint.X + 186.0) // 6) + ('S' if
                                                      (inpoint.Y < 0) else 'N')
        return ("WGS 1984 UTM Zone " + utmzone)

    except Exception as e:
        inlineinspection.AddError("Error getting UTM Zone.")
        raise
 def createtempgdb(self, output_dir, output_gdb):
     try:
         # Check for folder, if not create the folder
         if (not os.path.exists(output_dir)):
             os.makedirs(output_dir)
         gdbpath = os.path.join(output_dir, output_gdb)
         inlineinspection.AddMessage("Creating Intermediate GDB")
         if (not os.path.exists(gdbpath)):
             arcpy.management.CreateFileGDB(output_dir, output_gdb,
                                            "CURRENT")
         else:
             arcpy.management.Delete(gdbpath, None)
             arcpy.management.CreateFileGDB(output_dir, output_gdb,
                                            "CURRENT")
     except Exception as e:
         tb = sys.exc_info()[2]
         inlineinspection.AddError("An error occurred on line %i" %
                                   tb.tb_lineno)
         inlineinspection.AddError(str(e))
         inlineinspection.AddError(
             "Issue in intermediate output folder creation, Please check and try again.\n{}"
             .format(arcpy.GetMessages(2)))
         return False
    def execute(self, parameters, messages):
               
        arcpy.AddMessage("Log file location: " + inlineinspection.GetLogFileLocation())
        inlineinspection.AddMessage("Starting Anomaly Growth Calculator process...")

        try:          
            ili_inputpoint_fc = parameters[0].valueAsText 
            is_grid_line = parameters[14].value
            is_weld_line = parameters[16].value
            
            if(arcpy.Exists(ili_inputpoint_fc)):                  
                ilicount = int(arcpy.GetCount_management(ili_inputpoint_fc).getOutput(0))  
                #inlineinspection.AddMessage("Record count for ILI Pressure Calculator {}".format(ilicount))
                if (ilicount > 0):                      
                    #with arcpy.EnvManager(scratchWorkspace=r"C:\G2\UnitedBrine\Anomaly Comparison\Anomaly Comparison.gdb", workspace=r"C:\G2\UnitedBrine\Anomaly Comparison\Anomaly Comparison.gdb"): 
                    
                    #Generate Output point,llipse, Envelop for the Anamalies
                    self.ILIAnomaly2Geography(parameters)    
                    
                    #Genrate Grid lines only if the option is selected
                    if(is_grid_line):
                        self.iliGrid2Geography(parameters)
                    
                    #Genrate Weld lines only if the option is selected
                    if(is_weld_line):
                        self.iliWeld2Geography(parameters)
                else:
                    inlineinspection.AddWarning("There is no records to perform Anomaly Conversion.")
            else:
                    inlineinspection.AddWarning("There is no feature class for Anomaly Conversion.")
            inlineinspection.AddMessage("Completed Anomaly growth Calculator process.")
            return

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" % tb.tb_lineno)
            inlineinspection.AddError(str(e))
def get_gdb_name(workspace):
    try:
        dir_name = os.path.dirname(workspace)
        base_name = os.path.basename(workspace)
        base_name_no_gdb = base_name
        index = base_name.rfind(".")
        if index > 0:
            base_name_no_gdb = base_name[0:index]

        base_name_gdb = base_name_no_gdb + ".gdb"
        return dir_name, base_name_gdb

    except Exception as e:
        inlineinspection.AddError("Failed to run get_gdb_name.")
        raise
def get_unique_values(intable, infield):
    """
        Gets unique values in the table for given field name
        :param intable: input table
        :param infield: input field name
        :return: list of unique values
    """
    import arcpy
    try:
        with arcpy.da.SearchCursor(intable, [infield]) as cursor:
            return sorted({row[0] for row in cursor})

    except Exception as e:
        inlineinspection.AddError("Failed to process {}. \n{} ".format(
            "get_unique_values", arcpy.GetMessages(2)))
        raise
    def iliGrid2Geography(self,parameters):
        try:
            Input_ILI_Pipe_Tally_Table = parameters[0].valueAsText
            Input_ILI_Pipe_Tally_Odometer_Field = parameters[1].valueAsText
            Input_Pipeline_Diameter_Value =parameters[2].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Width_Field = parameters[3].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Length_Field =parameters[4].valueAsText
            Input_ILI_Pipe_Tally_Clock_Position_Field =parameters[5].valueAsText
            Input_Clock_Position_Offset="\""+parameters[6].valueAsText+"\""
            Input_Y_Axis_Clock_Orientation= "\""+parameters[7].valueAsText+"\"" 
            Spatial_Reference_for_Output_Features= parameters[8].valueAsText 
            Input_False_Northing_Value=parameters[9].valueAsText
            Input_False_Easting_Value=parameters[10].valueAsText            
            Output_Anomaly_Point_Features=parameters[11].valueAsText
            Output_Anomaly_Ellipse_Features=parameters[12].valueAsText 
            Output_Anomaly_Envelope_Features=parameters[13].valueAsText
            Output_Grid_Features=parameters[15].valueAsText 
            Input_is_weld_value = parameters[16].value
            Input_ILI_Weld_Table = parameters[17].valueAsText
            Input_ILI_Weld_Odometer_Field=parameters[18].valueAsText
            Output_Weld_Features=parameters[20].valueAsText

            # To allow overwriting outputs change overwriteOutput option to True.
            arcpy.env.overwriteOutput = True
            
            # Process: Copy Rows (Copy Rows) (management)
            Pipe_GridTally_Table = fr"{arcpy.env.scratchGDB}\PipeGridTally"
            arcpy.management.CopyRows(in_rows=Input_ILI_Weld_Table, out_table=Pipe_GridTally_Table, config_keyword="")
            inlineinspection.AddMessage("Grid Rows copy is done")

            field_to_find_x_max = Input_ILI_Pipe_Tally_Odometer_Field
            field_to_find_y_max = Input_Pipeline_Diameter_Value
           
            x_max_AnamalyValue = arcpy.da.SearchCursor(Input_ILI_Pipe_Tally_Table, field_to_find_x_max, "{} IS NOT NULL".format(field_to_find_x_max), sql_clause = (None, "ORDER BY {} DESC".format(field_to_find_x_max))).next()[0]
            x_max_value =0.0
            x_max_WeldValue = 0.0
            if(Input_is_weld_value):
                x_max_WeldValue = arcpy.da.SearchCursor(Pipe_GridTally_Table, Input_ILI_Weld_Odometer_Field, "{} IS NOT NULL".format(Input_ILI_Weld_Odometer_Field), sql_clause = (None, "ORDER BY {} DESC".format(Input_ILI_Weld_Odometer_Field))).next()[0]
            x_max_value=x_max_WeldValue if x_max_AnamalyValue < x_max_WeldValue else x_max_AnamalyValue
            
            y_max_value = arcpy.da.SearchCursor(Pipe_GridTally_Table, field_to_find_y_max, "{} IS NOT NULL".format(field_to_find_y_max), sql_clause = (None, "ORDER BY {} DESC".format(field_to_find_y_max))).next()[0]
            
            if ("6:00 Centered" in Input_Y_Axis_Clock_Orientation):                 
                ymin_coord = (((0 / 12) + (0 / 60 / 12)) * (y_max_value / 12 * math.pi)) + float(Input_False_Northing_Value)               
                ymax_coord = (((12 / 12) + (0 / 60 / 12)) * (y_max_value / 12 * math.pi)) + float(Input_False_Northing_Value)
               
            else:                
                ymin_coord = (-1) * ((((6 / 12) + (0 / 60 / 12)) * (y_max_value / 12 * math.pi)) + float(Input_False_Northing_Value))               
                ymax_coord = ((1 - ((6 / 12) + (0 / 60 / 12))) * (y_max_value / 12 * math.pi)) + float(Input_False_Northing_Value)
                


            x_min_value = 0           
            split_interval =5           
            grid_interval =round((ymax_coord-ymin_coord)/(split_interval-1),6)

            inlineinspection.AddMessage(" ymin_coord {} ,ymax_coord {}, grid_interval {} ".format(ymin_coord,ymax_coord,grid_interval))
            
            grid_id=["6:00","3:00","12:00","9:00","6:00"]            
            if ("6:00 Centered" in Input_Y_Axis_Clock_Orientation):
                grid_id=["12:00","3:00","6:00","9:00","12:00"]
                                            
            fc_name = os.path.basename(Output_Grid_Features)
            wspace = os.path.dirname(Output_Grid_Features)
           
            GridLable_Column="ClockPosition"
            Output_Grid_FeatureClass = arcpy.management.CreateFeatureclass(wspace, fc_name, "POLYLINE", None, "DISABLED", "DISABLED", Spatial_Reference_for_Output_Features)
            arcpy.management.AddFields(Output_Grid_FeatureClass, GridLable_Column+" TEXT # 255 # #;GridXMinCoord DOUBLE # # # #;GridYMinCoord DOUBLE # # # #;GridXMaxCoord DOUBLE # # # #;GridYMaxCoord DOUBLE # # # #")

            # Inserting into polyline logic           
            point = arcpy.Point()
            array = arcpy.Array()

            featureList = []
            cursor = arcpy.InsertCursor(Output_Grid_FeatureClass,["SHAPE@",GridLable_Column])
            feat = cursor.newRow()

            for interval in range(0,split_interval):
                # Set X and Y for start and end points
                point.X = x_min_value
                point.Y = ymin_coord+(interval*grid_interval)
                array.add(point)
                point.X = x_max_value
                point.Y = ymin_coord+(interval*grid_interval)
                array.add(point)   
                # Create a Polyline object based on the array of points
                polyline = arcpy.Polyline(array)
                # Clear the array for future use
                array.removeAll()
                # Append to the list of Polyline objects
                featureList.append(polyline)
                # Insert the feature
                feat.shape = polyline
                feat.setValue(GridLable_Column,grid_id[interval])
                feat.setValue("GridXMinCoord",x_min_value)
                feat.setValue("GridYMinCoord",ymin_coord+(interval*grid_interval))
                feat.setValue("GridXMaxCoord",x_max_value)
                feat.setValue("GridYMaxCoord",ymin_coord+(interval*grid_interval))
                cursor.insertRow(feat)
            del feat
            del cursor

            inlineinspection.AddMessage("Grid Line Features are created")

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" % tb.tb_lineno)
            inlineinspection.AddError(str(e))
            inlineinspection.AddError("Error in Grid Line Features creation")
    def iliWeld2Geography(self,parameters):
        try:
           
            Input_ILI_Pipe_Tally_Table = parameters[0].valueAsText
            Input_ILI_Pipe_Tally_Odometer_Field = parameters[1].valueAsText
            Input_Pipeline_Diameter_Value =parameters[2].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Width_Field = parameters[3].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Length_Field =parameters[4].valueAsText
            Input_ILI_Pipe_Tally_Clock_Position_Field =parameters[5].valueAsText
            Input_Clock_Position_Offset="\""+parameters[6].valueAsText+"\""
            Input_Y_Axis_Clock_Orientation= "\""+parameters[7].valueAsText+"\"" 
            Spatial_Reference_for_Output_Features= parameters[8].valueAsText 
            Input_False_Northing_Value=parameters[9].valueAsText
            Input_False_Easting_Value=parameters[10].valueAsText            
            Output_Anomaly_Point_Features=parameters[11].valueAsText
            Output_Anomaly_Ellipse_Features=parameters[12].valueAsText 
            Output_Anomaly_Envelope_Features=parameters[13].valueAsText
            Input_ILI_Weld_Table = parameters[17].valueAsText
            Input_ILI_Weld_Odometer_Field=parameters[18].valueAsText
            Input_Weld_Pipeline_Diameter_Value =parameters[19].valueAsText
            Output_Weld_Features=parameters[20].valueAsText

                        
            # To allow overwriting outputs change overwriteOutput option to True.
            arcpy.env.overwriteOutput = True
            
            # Process: Copy Rows (Copy Rows) (management)
            Pipe_WeldTally_Table = fr"{arcpy.env.scratchGDB}\PipeWeldTally"
            arcpy.management.CopyRows(in_rows=Input_ILI_Weld_Table, out_table=Pipe_WeldTally_Table, config_keyword="")
            inlineinspection.AddMessage("Rows copy is done")
           
            arcpy.management.AddFields(Pipe_WeldTally_Table, "WeldXMinCoord DOUBLE # # # #;WeldYMinCoord DOUBLE # # # #;WeldXMaxCoord DOUBLE # # # #;WeldYMaxCoord DOUBLE # # # #")
            inlineinspection.AddMessage("Weld Tally Fields are added")
            
            if ("6:00 Centered" in Input_Y_Axis_Clock_Orientation):                 
                    #ymin_coord = (((0 / 12) + (0 / 60 / 12)) * (pipe_od / 12 * math.pi)) + false_northing                
                    #ymax_coord = (((12 / 12) + (0 / 60 / 12)) * (pipe_od / 12 * math.pi)) + false_northing

                    arcpy.management.CalculateFields(Pipe_WeldTally_Table, "PYTHON3", "WeldXMinCoord !"+Input_ILI_Weld_Odometer_Field+"!;WeldYMinCoord  \'(((0 / 12) + (0 / 60 / 12)) * (!"+Input_Weld_Pipeline_Diameter_Value+"!/ 12 * math.pi)) +float("+str(Input_False_Northing_Value)+")\';WeldXMaxCoord !"+Input_ILI_Pipe_Tally_Odometer_Field+"!;WeldYMaxCoord \'(((12 / 12) + (0 / 60 / 12)) * (!"+Input_Weld_Pipeline_Diameter_Value+"!/ 12) * math.pi) + float("+str(Input_False_Northing_Value)+")\'", '')
                    #                arcpy.management.CalculateFields("PipeWeldTally", "PYTHON3", "WeldXMinCoord !AbsoluteOdometer!;WeldYMinCoord 0;WeldXMaxCoord !AbsoluteOdometer!" +
                    #";WeldYMaxCoord \'(!PipeDiameter!/12)*math.pi+float(str(\"0.0\"))\'", '')
                    inlineinspection.AddMessage("Weld Tally Fields are Calculated with 6:00 Centered")
            else:
                    ##if 1 <= clock_hours < 6:
                    #    ymin_coord = (-1) * ((((6 / 12) + (0 / 60 / 12)) * (pipe_od / 12 * math.pi)) + false_northing)
                    ##else:  # 6 <= clock_hours <= 11
                    #    ymax_coord = ((1 - ((6 / 12) + (0 / 60 / 12))) * (pipe_od / 12 * math.pi)) + false_northing
                    arcpy.management.CalculateFields(Pipe_WeldTally_Table, "PYTHON3", "WeldXMinCoord !"+Input_ILI_Weld_Odometer_Field+"!;WeldYMinCoord \'(-1)*((((6 / 12) + (0 / 60 / 12)) * (!"+Input_Weld_Pipeline_Diameter_Value+"!/ 12 * math.pi)) + float("+str(Input_False_Northing_Value)+"))\';WeldXMaxCoord !"+Input_ILI_Weld_Odometer_Field+"!;WeldYMaxCoord \'(0.5 * (!"+Input_Weld_Pipeline_Diameter_Value+"!/12 * math.pi)) + float("+str(Input_False_Northing_Value)+")\'", '')
                    inlineinspection.AddMessage("Weld Tally Fields are Calculated with 12:00 Centered")

            #arcpy.management.CalculateFields(Pipe_WeldTally_Table, "PYTHON3", "WeldXMinCoord !"+Input_ILI_Weld_Odometer_Field+"!;WeldYMinCoord 0.0;WeldXMaxCoord !"+Input_ILI_Pipe_Tally_Odometer_Field+"!;WeldYMaxCoord !"+Input_Pipeline_Diameter_Value+"!", '')
            #inlineinspection.AddMessage("Weld Tally Fields are Calculated")

            arcpy.management.XYToLine(Pipe_WeldTally_Table, Output_Weld_Features, "WeldXMinCoord", "WeldYMinCoord", "WeldXMaxCoord", "WeldYMaxCoord", "GEODESIC", "WeldNumber",Spatial_Reference_for_Output_Features, "ATTRIBUTES")
            inlineinspection.AddMessage("Weld Line Features are Created")

        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" % tb.tb_lineno)
            inlineinspection.AddError(str(e))
            inlineinspection.AddError("Error in Weld Line Features Creation")
    def ILIAnomaly2Geography(self,parameters):
        try:

            Input_ILI_Pipe_Tally_Table = parameters[0].valueAsText
            Input_ILI_Pipe_Tally_Odometer_Field = parameters[1].valueAsText
            Input_Pipeline_Diameter_Value =parameters[2].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Width_Field = parameters[3].valueAsText
            Input_ILI_Pipe_Tally_Anomaly_Length_Field =parameters[4].valueAsText
            Input_ILI_Pipe_Tally_Clock_Position_Field =parameters[5].valueAsText
            Input_Clock_Position_Offset="\""+parameters[6].valueAsText+"\""
            Input_Y_Axis_Clock_Orientation= "\""+parameters[7].valueAsText+"\"" 
            Spatial_Reference_for_Output_Features= parameters[8].valueAsText 
            Input_False_Northing_Value=parameters[9].valueAsText
            Input_False_Easting_Value=parameters[10].valueAsText            
            Output_Anomaly_Point_Features=parameters[11].valueAsText
            Output_Anomaly_Ellipse_Features=parameters[12].valueAsText 
            Output_Anomaly_Envelope_Features=parameters[13].valueAsText

            # Convert ILI Anomalies to Point, Envelope and Ellipse Features
            # To allow overwriting outputs change overwriteOutput option to True.
            arcpy.env.overwriteOutput = True

            #Select all the features which have clock position value            
            Input_ILI_Pipe_Tally_Table_View = arcpy.management.SelectLayerByAttribute(Input_ILI_Pipe_Tally_Table, "NEW_SELECTION", Input_ILI_Pipe_Tally_Clock_Position_Field +" IS NOT NULL",None)

            # Process: Copy Rows (Copy Rows) (management)
            Pipe_Tally_Table = fr"{arcpy.env.scratchGDB}\PipeTally"
            arcpy.management.CopyRows(in_rows=Input_ILI_Pipe_Tally_Table_View, out_table=Pipe_Tally_Table, config_keyword="")
            inlineinspection.AddMessage("Rows copy is done")
            # Process: Make Table View (Make Table View) (management)
            Pipe_Tally_Table_View = "PipeTally_View"
            arcpy.management.MakeTableView(in_table=Pipe_Tally_Table, out_view=Pipe_Tally_Table_View, where_clause="", workspace="", field_info="")
            inlineinspection.AddMessage("Make Table View is done")
            # Process: Add Anomaly X Coord Field (Add Field) (management)
            Anomaly_X_Coord_Field_Added = arcpy.management.AddField(in_table=Pipe_Tally_Table_View, field_name="AnomalyXCoord", field_type="DOUBLE", field_precision=15, field_scale=7, field_length=None, field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")[0]
            inlineinspection.AddMessage("Anomaly X Coord Field Added")
            # Process: Calculate Anomaly X Coord Field (Calculate Field) (management)
            Anomaly_X_Coord_Field_Calculated = arcpy.management.CalculateField(in_table=Anomaly_X_Coord_Field_Added, field="AnomalyXCoord", expression=f"!{Input_ILI_Pipe_Tally_Odometer_Field}! - {Input_False_Easting_Value}", expression_type="PYTHON_9.3", code_block="", field_type="")[0]
            inlineinspection.AddMessage("Anomaly X Coord Field Calculated")
            # Process: Add Anomaly Y Coord Field (Add Field) (management)
            Anomaly_Y_Coord_Field_Added = arcpy.management.AddField(in_table=Pipe_Tally_Table_View, field_name="AnomalyYCoord", field_type="DOUBLE", field_precision=15, field_scale=7, field_length=None, field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")[0]
            inlineinspection.AddMessage("Anomaly Y Coord Field Added")
            # Process: Calculate Anomaly Y Coord Field (Calculate Field) (management)
            #arcpy.management.CalculateField(Pipe_Tally_Table_View, "AnomalyYCoord", 'calc_anomaly_y_coord(!'+Input_ILI_Pipe_Tally_Clock_Position_Field +'!, !'+Input_Pipeline_Diameter_Value +'!, 0, '+Input_Clock_Position_Offset +','+Input_Y_Axis_Clock_Orientation +')', "PYTHON3", "def calc_anomaly_y_coord(clock_pos, pipe_od, false_northing, clock_offset, y_axis" +
            arcpy.management.CalculateField(Pipe_Tally_Table_View, "AnomalyYCoord", 'calc_anomaly_y_coord(!'+Input_ILI_Pipe_Tally_Clock_Position_Field +'!, !'+Input_Pipeline_Diameter_Value +'!, '+str(Input_False_Northing_Value)+', '+Input_Clock_Position_Offset +','+Input_Y_Axis_Clock_Orientation +')', "PYTHON3", "def calc_anomaly_y_coord(clock_pos, pipe_od, false_northing, clock_offset, y_axis" +
    "_clock):\n    clock_parts = clock_pos.split(\':\')\n    clock_hours = float(clock_pa" +
    "rts[0])\n    clock_minutes = float(clock_parts[1])\n    pipe_od = float(pipe_od)\n " +
    "   offset_parts = clock_offset.split(\':\')\n    offset_hours = float(offset_parts[" +
    "0])\n    offset_minutes = float(offset_parts[1])\n\n    false_northing = float(false_northing)\n\n  # Correct clock minutes for" +
    " the clock minutes offset\n    if offset_hours < 0:\n        offset_minutes = offs" +
    "et_minutes * (-1)\n    clock_minutes = clock_minutes + offset_minutes\n    if cloc" +
    "k_minutes > 59:\n        clock_minutes = clock_minutes - 60\n        clock_hours =" +
    " clock_hours + 1\n    elif clock_minutes < 0:\n        clock_minutes = clock_minut" +
    "es + 60\n        clock_hours = clock_hours - 1\n\n    # Correct clock hours for the" +
    " clock hours offset\n    clock_hours = clock_hours + offset_hours\n    if clock_ho" +
    "urs > 12:\n        clock_hours = clock_hours - 12\n    elif clock_hours <=0:\n     " +
    "   clock_hours = clock_hours + 12\n\n    # Calculate y-coordinate\n    if y_axis_cl" +
    "ock == \"6:00 Centered\":\n        if clock_hours == 12:\n            y_coord = ((cl" +
    "ock_minutes / 60 / 12) * (pipe_od / 12 * math.pi)) + false_northing\n        else" +
    ":\n            y_coord = (((clock_hours / 12) + (clock_minutes / 60 / 12)) * (pip" +
    "e_od / 12 * math.pi)) + false_northing\n    else:  # y_axis_clock = \"12:00 Center" +
    "ed\"\n        if clock_hours == 12:\n            y_coord = (-1) * (((clock_minutes " +
    "/ 60 / 12) * (pipe_od / 12 * math.pi)) + false_northing)\n        elif 1 <= clock" +
    "_hours < 6:\n            y_coord = (-1) * ((((clock_hours / 12) + (clock_minutes " +
    "/ 60 / 12)) * (pipe_od / 12 * math.pi)) + false_northing)\n        else:  # 6 <= " +
    "clock_hours <= 11\n            y_coord = ((1 - ((clock_hours / 12) + (clock_minut" +
    "es / 60 / 12))) * (pipe_od / 12 * math.pi)) + false_northing\n    return y_coord\n" +
    "", "TEXT")

            inlineinspection.AddMessage("Anomaly Y Coord Field Calculated")
            # Process: Add Anomaly Major Axis Field (Add Field) (management)
            Anomaly_Major_Axis_Field_Added = arcpy.management.AddField(in_table=Pipe_Tally_Table_View, field_name="AnomalyMajorAxisFt", field_type="DOUBLE", field_precision=15, field_scale=3, field_length=None, field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")[0]
            inlineinspection.AddMessage("Anomaly Major Axis Field Added")
            # Process: Calculate Anomaly Major Axis Field (Calculate Field) (management)
            Anomaly_Major_Axis_Field_Calculated = arcpy.management.CalculateField(in_table=Pipe_Tally_Table_View, field="AnomalyMajorAxisFt", expression=f"!{Input_ILI_Pipe_Tally_Anomaly_Width_Field}! / 12", expression_type="PYTHON_9.3", code_block="", field_type="TEXT")[0]
            inlineinspection.AddMessage("Anomaly Major Axis Field Calculated")
            # Process: Add Anomaly Minor Axis Field (Add Field) (management)
            Anomaly_Minor_Axis_Field_Added = arcpy.management.AddField(in_table=Pipe_Tally_Table_View, field_name="AnomalyMinorAxisFt", field_type="DOUBLE", field_precision=15, field_scale=3, field_length=None, field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")[0]
            inlineinspection.AddMessage("Anomaly Minor Axis Field Added")
            # Process: Calculate Anomaly Minor Axis Field (Calculate Field) (management)
            Anomaly_Minor_Axis_Field_Calculated = arcpy.management.CalculateField(in_table=Pipe_Tally_Table_View, field="AnomalyMinorAxisFt", expression=f"!{Input_ILI_Pipe_Tally_Anomaly_Length_Field}! / 12", expression_type="PYTHON_9.3", code_block="", field_type="TEXT")[0]
            inlineinspection.AddMessage("Anomaly Minor Axis Field Calculated")
            # Process: Add Azimuth Field (Add Field) (management)
            Azimuth_Field_Added = arcpy.management.AddField(in_table=Pipe_Tally_Table_View, field_name="Azimuth", field_type="DOUBLE", field_precision=15, field_scale=2, field_length=None, field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")[0]
            inlineinspection.AddMessage("Azimuth Field Added")
            # Process: Calculate Azimuth Field (Calculate Field) (management)
            Azimuth_Field_Calculated = arcpy.management.CalculateField(in_table=Pipe_Tally_Table_View, field="Azimuth", expression="0.1", expression_type="PYTHON_9.3", code_block="", field_type="TEXT")[0]
            inlineinspection.AddMessage("Azimuth Field Calculated")
            # Process: Make XY Event Layer (Make XY Event Layer) (management)          
            Anomaly_Point_Events = "AnomalyEvents_Layer"  
            #Anomaly_Point_Events = fr"{arcpy.env.scratchGDB}\AnomalyEvents_Layer",
            #arcpy.CopyRows_management(Pipe_Tally_Table_View, "Pipe_Tally_Table_View")
            #inlineinspection.AddMessage("Pipe_Tally_Table_View copy done")
            arcpy.management.MakeXYEventLayer(table=Pipe_Tally_Table_View, in_x_field="AnomalyXCoord", in_y_field="AnomalyYCoord", out_layer=Anomaly_Point_Events, spatial_reference=Spatial_Reference_for_Output_Features, in_z_field="")
            #arcpy.MakeXYEventLayer_management(Pipe_Tally_Table_View, "AnomalyXCoord", "AnomalyYCoord", Anomaly_Point_Events, Spatial_Reference_for_Output_Features)
            inlineinspection.AddMessage("Make XY Event Layer Created")
            #Process: Copy Features (Copy Features) (management)
            #Output_Anomaly_Point_Features = "AnomalyPoint"
            arcpy.management.CopyFeatures(in_features=Anomaly_Point_Events, out_feature_class=Output_Anomaly_Point_Features, config_keyword="", spatial_grid_1=0, spatial_grid_2=0, spatial_grid_3=0)
            inlineinspection.AddMessage("Copy Features to Anomaly Point Events")
            # Process: Table To Ellipse (Table To Ellipse) (management)
            Anomaly_Ellipse_Polylines = "AnomalyEllipsePolyline"
            #arcpy.management.TableToEllipse(in_table=Output_Anomaly_Point_Features, out_featureclass=Anomaly_Ellipse_Polylines, x_field="AnomalyXCoord", y_field="AnomalyYCoord", major_field="AnomalyMajorAxisFt", minor_field="AnomalyMinorAxisFt", distance_units="9003", azimuth_field="Azimuth", azimuth_units="9102", id_field="", spatial_reference=Spatial_Reference_for_Output_Features, attributes="NO_ATTRIBUTES")
            arcpy.management.TableToEllipse(Output_Anomaly_Point_Features, Anomaly_Ellipse_Polylines, "AnomalyXCoord", "AnomalyYCoord", "AnomalyMajorAxisFt", "AnomalyMinorAxisFt", "FEET", "Azimuth", "DEGREES", None, Spatial_Reference_for_Output_Features, "NO_ATTRIBUTES")
            inlineinspection.AddMessage("Converted from Table To Ellipse")            

            # Process: Feature To Polygon (Feature To Polygon) (management)
            #arcpy.management.FeatureToPolygon([Anomaly_Ellipse_Polylines], Output_Anomaly_Ellipse_Features, None, "ATTRIBUTES", None)
            
            arcpy.management.FeatureToPolygon(in_features=[Anomaly_Ellipse_Polylines], out_feature_class=Output_Anomaly_Ellipse_Features, cluster_tolerance="", attributes="ATTRIBUTES", label_features=Output_Anomaly_Point_Features)
            inlineinspection.AddMessage("Converted Feature To Polygon")
            
            # Process: Feature Envelope To Polygon (Feature Envelope To Polygon) (management)
            arcpy.management.FeatureEnvelopeToPolygon(in_features=Output_Anomaly_Ellipse_Features, out_feature_class=Output_Anomaly_Envelope_Features, single_envelope="SINGLEPART")
            inlineinspection.AddMessage("Converted Feature Envelope To Polygon")
            
        except Exception as e:
            tb = sys.exc_info()[2]
            inlineinspection.AddError("An error occurred on line %i" % tb.tb_lineno)
            inlineinspection.AddError(str(e))
            inlineinspection.AddError("Issue in ILI Anomaly 2 Geography.\n{}".format(arcpy.GetMessages(2)))
            return False