<commit_before>__author__ = 'DYEDEN'
import time
tempo = time.clock()

from arcpy import Array , SelectLayerByLocation_management, MakeFeatureLayer_management, da, SelectLayerByAttribute_management, CopyFeatures_management, AddField_management, \
        Point, Polyline, Polygon, Describe, Extent, SpatialReference, CreateFeatureclass_management, Exists, Dissolve_management, Delete_management, env, ListFields
from math import sqrt
from os import path, mkdir
from shutil import rmtree
from sys import argv
env.outputMFlag = "Disabled"
env.outputZFlag = "Disabled"

class DefinirLargura():
    def __init__(self):
        diretorio = path.dirname(path.dirname(argv[0]))
        self.diretorio_saida = diretorio + "/SAIDA"
        self.diretorio_entrada = diretorio + "/ENTRADA"
        self.spatial_geo_sirgas_2000 = 'GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]'
        self.spatial_proj_lambert = 'PROJCS["SIRGAS_2000_Lambert_Conformal_Conic_PA",GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-52.5],PARAMETER["Standard_Parallel_1",-0.5],PARAMETER["Standard_Parallel_2",-6.833333333333333],PARAMETER["Latitude_Of_Origin",-3.666667],UNIT["Meter",1.0]]'
        self.raio = 50
        self.primeiro_teste_circ = True
        self.raio_pr = self.raio
        self.compri_linha_largura_x1 = self.raio_pr*0.75
        self.compri_linha_largura_x2 = self.raio_pr*0.85

    def funcao_multipart(self, linha):
        list_partes = []
        if linha.isMultipart:
            for n in range(linha.partCount):
                list_partes.append(linha.getPart(n))
        return list_partes
    def validar_circulo(self,tipo_circulo, dict_descricao):
        teste_validacao = False
        if tipo_circulo == "meio":
            linha_largura = dict_descricao["linha_largura"]
            linha_circulo = dict_descricao["linha_circulo"]
            compri_linha_largura = linha_largura.projectAs(self.spatial_proj_lambert).length
            compri_linha_circulo = linha_circulo.projectAs(self.spatial_proj_lambert).length
            porc_raio_largura = (compri_linha_largura/compri_linha_circulo)*100
            print compri_linha_largura, "compri_linha_largura", compri_linha_circulo, "compri_linha_circulo", porc_raio_largura, "porc_raio_largura"
            if 75 < porc_raio_largura < 85:
                teste_validacao = True
            else:
                # if self.primeiro_teste_circ:

                if porc_raio_largura <= 80:
                    self.compri_linha_raio_x2 = self.raio
                else:
                    self.compri_linha_raio_x1 = self.raio
                print self.compri_linha_raio_x1, "self.compri_linha_raio_x1", self.compri_linha_raio_x2, "self.compri_linha_raio_x2"
                self.raio = (self.compri_linha_raio_x1 + self.compri_linha_raio_x2)/2
            print teste_validacao
        return teste_validacao



    def ponto_meio(self, list_partes, ponto):
        self.dict_partes = {}
        self.buffer_poligono_borda
        self.x_b
        self.y_b
        self.ptc_x = None
        self.ptc_y = None
        print "ponto_meio"
        for parte in list_partes:
            parte_linha = Polyline(parte, self.spatial_geo_sirgas_2000)
            if parte_linha.disjoint(ponto):
                pontos_inte_linha_poligono = self.buffer_poligono_borda.intersect(parte_linha,1)
                self.pt1_x = pontos_inte_linha_poligono.getPart(0).X
                self.pt1_y = pontos_inte_linha_poligono.getPart(0).Y
                self.pt2_x = pontos_inte_linha_poligono.getPart(1).X
                self.pt2_y = pontos_inte_linha_poligono.getPart(1).Y
                self.ptc_x, self.ptc_y, self.ptc_x_inv, self.ptc_y_inv = PtCircBorda(self.x_b,self.y_b,self.pt1_x,self.pt1_y,self.pt2_x,self.pt2_y).ponto_circ_borda()
        return self.ptc_x, self.ptc_y


    def circulo_de_borda_filtro(self, linha_buffer_inter, ponto):
        list_partes = self.funcao_multipart(linha_buffer_inter)
        tipo_circulo = None
        dict_circulo = {}
        if list_partes:
            if list_partes.__len__() == 2:
                ptc_x, ptc_y = self.ponto_meio(list_partes,ponto)
                tipo_circulo = "meio"
                dict_circulo = {"ptc_x": ptc_x, "ptc_y": ptc_y}
        else:
            contador_raio = 0
            while contador_raio < 3:
                self.raio += 10
                buffer_ponto_borda = ponto.projectAs(self.spatial_proj_lambert).buffer(self.raio).projectAs(self.spatial_geo_sirgas_2000)
                contador_raio += 1
            tipo_circulo = "extremidade"
            # if contador_raio == 3:
        return tipo_circulo, dict_circulo




    def ponto_buffer(self,ponto):
        self.x_b = ponto.getPart().X
        self.y_b = ponto.getPart().Y
        teste_validacao = False
        dict_descricao = {}
        loops_validacao = 0
        while teste_validacao == False:
            self.buffer_poligono_borda = ponto.projectAs(self.spatial_proj_lambert).buffer(self.raio).projectAs(self.spatial_geo_sirgas_2000)
            dict_descricao = {}
            linha_buffer_inter = self.buffer_poligono_borda.intersect(self.linha_ma_sirgas,2)
            tipo_circulo, dict_circulo = self.circulo_de_borda_filtro(linha_buffer_inter, ponto)
            if tipo_circulo == "meio":
                dict_descricao["tipo"] = "meio"
                dict_descricao["ptc_x"] = dict_circulo["ptc_x"]
                dict_descricao["ptc_y"] = dict_circulo["ptc_y"]
                linha_largura, linha_circulo = self.linha_de_largura(dict_descricao, ponto)
                dict_descricao["linha_largura"] = linha_largura
                dict_descricao["linha_circulo"] = linha_circulo
            teste_validacao = self.validar_circulo(tipo_circulo, dict_descricao)
            CopyFeatures_management(linha_largura, self.diretorio_saida + "/linha_largura" + str(loops_validacao) + ".shp")
            CopyFeatures_management(linha_circulo, self.diretorio_saida + "/linha_circulo" + str(loops_validacao) + ".shp")
            CopyFeatures_management(self.buffer_poligono_borda, self.diretorio_saida + "/buffer_poligono_borda" + str(loops_validacao) + ".shp")
            loops_validacao += 1
        return dict_descricao

    def linha_de_largura(self, dict_descricao, ponto):
        if dict_descricao["tipo"] == "meio":
            point_circ = Point()
            point_circ.X = dict_descricao["ptc_x"]
            point_circ.Y = dict_descricao["ptc_y"]
            array = Array([point_circ, ponto.getPart(0)])
            linha_circulo = Polyline(array,self.spatial_geo_sirgas_2000)
            if linha_circulo.disjoint(self.poligono_ma_geo):
                array.removeAll()
                point_circ = Point()
                point_circ.X = self.ptc_x_inv
                point_circ.Y = self.ptc_y_inv
                array = Array([point_circ, ponto.getPart(0)])
                linha_circulo = Polyline(array,self.spatial_geo_sirgas_2000)
                linha_largura = linha_circulo.intersect(self.poligono_ma_geo, 2)
                array.removeAll()
            else:
                linha_largura = linha_circulo.intersect(self.poligono_ma_geo, 2)
                array.removeAll()

            return linha_largura, linha_circulo


    def pontos_aolongo_linha(self):
        self.linha_ma_sirgas = self.poligono_ma_geo.boundary()
        linha_lambert = self.linha_ma_sirgas.projectAs(self.spatial_proj_lambert)
        compri_total = linha_lambert.length
        compri_linha_largura = self.raio*0.8
        distancia_pt0 = 0
        list_pts = []
        while distancia_pt0 < compri_total:
            bool_extremid_poligono = False
            compri_ok = False
            self.compri_linha_raio_x1 = compri_linha_largura/1.1
            self.compri_linha_raio_x2 = compri_linha_largura/0.5
            while compri_ok == False:
                self.distancia_pt0 = distancia_pt0
                ponto = linha_lambert.positionAlongLine(distancia_pt0).projectAs(self.spatial_geo_sirgas_2000)
                self.ponto_5m = ponto.projectAs(self.spatial_proj_lambert).buffer(5).projectAs(self.spatial_geo_sirgas_2000)
                dict_descricao = self.ponto_buffer(ponto)
                CopyFeatures_management(dict_descricao["linha_largura"], self.diretorio_saida + "/linha_largura_pt" + str(distancia_pt0) + ".shp")


                print dict_descricao
                break
            break

    def selecionar_poligono(self, layer_massa_dagua):
        with da.SearchCursor(layer_massa_dagua,["OID@","SHAPE@"],"FID = 35") as cursor:
            for row in cursor:<commit_msg>largura<commit_after>__author__ = 'DYEDEN'
import time
tempo = time.clock()

from arcpy import Array , SelectLayerByLocation_management, MakeFeatureLayer_management, da, SelectLayerByAttribute_management, CopyFeatures_management, AddField_management, \
        Point, Polyline, Polygon, Describe, Extent, SpatialReference, CreateFeatureclass_management, Exists, Dissolve_management, Delete_management, env, ListFields
from math import sqrt
from os import path, mkdir
from shutil import rmtree
from sys import argv
env.outputMFlag = "Disabled"
env.outputZFlag = "Disabled"

class DefinirLargura():
    def __init__(self):
        diretorio = path.dirname(path.dirname(argv[0]))
        self.diretorio_saida = diretorio + "/SAIDA"
        self.diretorio_entrada = diretorio + "/ENTRADA"
        self.spatial_geo_sirgas_2000 = 'GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]'
        self.spatial_proj_lambert = 'PROJCS["SIRGAS_2000_Lambert_Conformal_Conic_PA",GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-52.5],PARAMETER["Standard_Parallel_1",-0.5],PARAMETER["Standard_Parallel_2",-6.833333333333333],PARAMETER["Latitude_Of_Origin",-3.666667],UNIT["Meter",1.0]]'
        self.raio = 50
        self.primeiro_teste_circ = True
        self.raio_pr = self.raio
        self.compri_linha_largura_x1 = self.raio_pr*0.75
        self.compri_linha_largura_x2 = self.raio_pr*0.85
        self.dict_partes = {}

    def funcao_multipart(self, linha, ponto):
        list_partes = []
        if linha.isMultipart:
            for n in range(linha.partCount):
                parte = linha.getPart(n)
                linha_parte = Polyline(parte,self.spatial_geo_sirgas_2000)
                list_partes.append(parte)
                if linha_parte.disjoint(ponto):
                    self.dict_partes["parte" + str(n)] = {"linha_array":parte, "cruza_ponto":False, "linha_geometria":linha_parte}
                else:
                    self.dict_partes["parte" + str(n)] = {"linha_array":parte, "cruza_ponto":True, "linha_geometria":linha_parte}
        print self.dict_partes
        return list_partes
    def validar_circulo(self,tipo_circulo, dict_descricao):
        teste_validacao = False
        if tipo_circulo == "meio":
            linha_largura = dict_descricao["linha_largura"]
            linha_circulo = dict_descricao["linha_circulo"]
            compri_linha_largura = linha_largura.projectAs(self.spatial_proj_lambert).length
            compri_linha_circulo = linha_circulo.projectAs(self.spatial_proj_lambert).length
            porc_raio_largura = (compri_linha_largura/compri_linha_circulo)*100
            print compri_linha_largura, "compri_linha_largura", compri_linha_circulo, "compri_linha_circulo", porc_raio_largura, "porc_raio_largura"
            if 75 < porc_raio_largura < 85:
                teste_validacao = True
            else:
                if porc_raio_largura <= 80:
                    self.compri_linha_raio_x2 = self.raio
                else:
                    self.compri_linha_raio_x1 = self.raio
                print self.compri_linha_raio_x1, "self.compri_linha_raio_x1", self.compri_linha_raio_x2, "self.compri_linha_raio_x2"
                self.raio = (self.compri_linha_raio_x1 + self.compri_linha_raio_x2)/2
            print teste_validacao
        return teste_validacao



    def ponto_meio(self, list_partes, ponto):
        self.buffer_poligono_borda
        self.x_b
        self.y_b
        self.ptc_x = None
        self.ptc_y = None
        print "ponto_meio"
        for parte in list_partes:
            parte_linha = Polyline(parte, self.spatial_geo_sirgas_2000)
            if parte_linha.disjoint(ponto):
                pontos_inte_linha_poligono = self.buffer_poligono_borda.intersect(parte_linha,1)
                self.pt1_x = pontos_inte_linha_poligono.getPart(0).X
                self.pt1_y = pontos_inte_linha_poligono.getPart(0).Y
                self.pt2_x = pontos_inte_linha_poligono.getPart(1).X
                self.pt2_y = pontos_inte_linha_poligono.getPart(1).Y
                self.ptc_x, self.ptc_y, self.ptc_x_inv, self.ptc_y_inv = PtCircBorda(self.x_b,self.y_b,self.pt1_x,self.pt1_y,self.pt2_x,self.pt2_y).ponto_circ_borda()
        return self.ptc_x, self.ptc_y


    def circulo_de_borda_filtro(self, linha_buffer_inter, ponto):
        list_partes = self.funcao_multipart(linha_buffer_inter, ponto)

        tipo_circulo = None
        dict_circulo = {}
        if list_partes:
            if list_partes.__len__() == 2:
                ptc_x, ptc_y = self.ponto_meio(list_partes,ponto)
                tipo_circulo = "meio"
                dict_circulo = {"ptc_x": ptc_x, "ptc_y": ptc_y}
        else:
            contador_raio = 0
            while contador_raio < 3:
                self.raio += 10
                buffer_ponto_borda = ponto.projectAs(self.spatial_proj_lambert).buffer(self.raio).projectAs(self.spatial_geo_sirgas_2000)
                contador_raio += 1
            tipo_circulo = "extremidade"
            # if contador_raio == 3:
        return tipo_circulo, dict_circulo


    def ponto_buffer(self,ponto):
        self.x_b = ponto.getPart().X
        self.y_b = ponto.getPart().Y
        teste_validacao = False
        dict_descricao = {}
        loops_validacao = 0
        while teste_validacao == False:
            self.buffer_poligono_borda = ponto.projectAs(self.spatial_proj_lambert).buffer(self.raio).projectAs(self.spatial_geo_sirgas_2000)
            dict_descricao = {}
            linha_buffer_inter = self.buffer_poligono_borda.intersect(self.linha_ma_sirgas,2)
            tipo_circulo, dict_circulo = self.circulo_de_borda_filtro(linha_buffer_inter, ponto)
            if tipo_circulo == "meio":
                dict_descricao["tipo"] = "meio"
                dict_descricao["ptc_x"] = dict_circulo["ptc_x"]
                dict_descricao["ptc_y"] = dict_circulo["ptc_y"]
                linha_largura, linha_circulo = self.linha_de_largura(dict_descricao, ponto)
                dict_descricao["linha_largura"] = linha_largura
                dict_descricao["linha_circulo"] = linha_circulo
            teste_validacao = self.validar_circulo(tipo_circulo, dict_descricao)
            CopyFeatures_management(linha_largura, self.diretorio_saida + "/linha_largura" + str(loops_validacao) + ".shp")
            CopyFeatures_management(linha_circulo, self.diretorio_saida + "/linha_circulo" + str(loops_validacao) + ".shp")
            CopyFeatures_management(self.buffer_poligono_borda, self.diretorio_saida + "/buffer_poligono_borda" + str(loops_validacao) + ".shp")
            loops_validacao += 1
        return dict_descricao

    def linha_de_largura(self, dict_descricao, ponto):
        if dict_descricao["tipo"] == "meio":
            point_circ = Point()
            point_circ.X = dict_descricao["ptc_x"]
            point_circ.Y = dict_descricao["ptc_y"]
            array = Array([point_circ, ponto.getPart(0)])
            linha_circulo = Polyline(array,self.spatial_geo_sirgas_2000)
            if linha_circulo.disjoint(self.poligono_ma_geo):
                array.removeAll()
                point_circ = Point()
                point_circ.X = self.ptc_x_inv
                point_circ.Y = self.ptc_y_inv
                array = Array([point_circ, ponto.getPart(0)])
                linha_circulo = Polyline(array,self.spatial_geo_sirgas_2000)
                linha_largura = linha_circulo.intersect(self.poligono_ma_geo, 2)
                array.removeAll()
            else:
                linha_largura = linha_circulo.intersect(self.poligono_ma_geo, 2)
                array.removeAll()

            return linha_largura, linha_circulo


    def pontos_aolongo_linha(self):
        self.linha_ma_sirgas = self.poligono_ma_geo.boundary()
        linha_lambert = self.linha_ma_sirgas.projectAs(self.spatial_proj_lambert)
        compri_total = linha_lambert.length
        compri_linha_largura = self.raio*0.8
        distancia_pt0 = 0
        list_pts = []
        while distancia_pt0 < compri_total:
            bool_extremid_poligono = False
            compri_ok = False
            self.compri_linha_raio_x1 = compri_linha_largura/1.1
            self.compri_linha_raio_x2 = compri_linha_largura/0.5
            while compri_ok == False:
                self.distancia_pt0 = distancia_pt0
                ponto = linha_lambert.positionAlongLine(distancia_pt0).projectAs(self.spatial_geo_sirgas_2000)
                self.ponto_5m = ponto.projectAs(self.spatial_proj_lambert).buffer(5).projectAs(self.spatial_geo_sirgas_2000)
                dict_descricao = self.ponto_buffer(ponto)
                CopyFeatures_management(dict_descricao["linha_largura"], self.diretorio_saida + "/linha_largura_pt" + str(distancia_pt0) + ".shp")

                print dict_descricao
                break
            break

    def selecionar_poligono(self, layer_massa_dagua):
        with da.SearchCursor(layer_massa_dagua,["OID@","SHAPE@"],"FID = 35") as cursor:
            for row in cursor:
{'fraction_non_alphanumeric': 0.09378580391728954, 'fraction_numerical': 0.02738829177805663, 'mean_word_length': 2.7871900826446283, 'pattern_counts': {'":': 16, '<': 13, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5964329', 'n_tokens_mistral': 7068, 'n_tokens_neox': 6552, 'n_words': 796}