' Name : SpiderMCLP.ave ' Title : Diagrama Spider ' ' Topics: Analysis ' ' Description: Shows the location-allocation solution of a maximal covering location ' problem. Reads the file containing the solution of the problem and ' creates the themes medianas.shp, which indicates the location of the ' facilities, and solucao.shp, a spider-based diagram showing the ' allocation solution of the problem. ' ' Requires: DmatMCLPAV.exe, PmedMCLP.exe ' ' Self: ' ' Returns: Tema Solução.shp, Medianas.shp ListaMedianas = {} ListaPontos = {} ListaDistancias = {} viewAtivo = av.GetActiveDoc ' Escolha do numero de medianas while (true) selMedianas = MsgBox.Input("Entre com o número de facilidades:", "Número de facilidades", "1") if (selMedianas = nil) then exit else if (selMedianas.IsNumber) then numMedianas = selMedianas.AsNumber break else MsgBox.Info("Deve ser um valor numérico.", "ERRO") end end end ' Escolha do tema de pontos listaTemas = viewAtivo.GetThemes tema = MsgBox.Choice(listaTemas, "Selecione um tema para ser usado como pontos:", "Selecione um tema") if ( tema = NIL ) then exit end temaPontos = viewAtivo.FindTheme(tema.AsString) distanciaMax = MsgBox.Input("Entre com a distância máxima de atendimento (em metros):", "Distância Máxima", "1") if (distanciaMax = NIL) then exit else if (distanciaMax.IsNumber.Not) then MsgBox.Info("Deve ser um valor numérico.", "ERRO") end end 'else ' Estabelece os campos para obtencao de dados na tabela do tema de pontos projecao = viewAtivo.GetProjection pontosFTab = temaPontos.GetFTab numPontos = temaPontos.GetFTab.GetNumRecords tipoFldP = temaPontos.GetFTab.FindField("Shape") demandaFldP = temaPontos.GetFTab.FindField("Numimovpre") ' Criacao dos arquivos de dados PmedDMax.txt e Demanda.txt arqCoord = LineFile.Make("coord.txt".AsFileName, #FILE_PERM_WRITE) if ( arqCoord = NIL ) then MsgBox.Error("Erro na criação do arquivo: coord.txt", "") exit end arqDemanda = LineFile.Make("demanda.txt".AsFileName, #FILE_PERM_WRITE) if ( arqDemanda = NIL ) then MsgBox.Error("Erro na criação do arquivo: demanda.txt", "") exit end ' Escreve o numero de pontos, de medianas e as coordenadas no arquivo de dados arqCoord.WriteElt(numPontos.AsString++numMedianas.AsString++distanciaMax.AsString) for each r in pontosFTab ponto = temaPontos.GetFTab.ReturnValue(tipoFldP, r) demanda = temaPontos.GetFTab.ReturnValue(demandaFldP, r) if ( demanda.IsNull or (demanda = 0) ) then demanda = 1 end coordX = ponto.GetX coordY = ponto.GetY arqCoord.WriteElt(coordX.AsString++coordY.AsString) arqDemanda.WriteElt(demanda.AsString) end arqCoord.Close arqDemanda.Close ' Execução do programa em linguagem C Dmatrix.exe System.ExecuteSynchronous("DmatMCLPAV.exe") ' Execução do programa em linguagem C Pmedian.exe System.ExecuteSynchronous("MaxCov.exe -a dmatrix.txt") ' Leitura do arquivo de solucao gerado por "MaxCov.exe" arqSolucao = TextFile.Make("SolucaoR.txt".AsFileName, #FILE_PERM_READ) for each i in 1..numMedianas idMediana = arqSolucao.Read(5).AsNumber ListaMedianas.Add(idMediana) end arqSolucao.SkipLine while (true) idMediana = arqSolucao.Read(7).AsNumber if (idMediana = 9999999) then break end idponto = arqSolucao.Read(7).AsNumber distancia = arqSolucao.Read(11) tipoCentro = temaPontos.GetFtab.ReturnValue(tipoFldP, idMediana) tipoPonto = temaPontos.GetFtab.ReturnValue(tipoFldP, idponto) projecao.ProjectPt(tipoCentro) projecao.ProjectPt(tipoPonto) ListaPontos.Add(tipoCentro) ListaPontos.Add(tipoPonto) ListaDistancias.Add(distancia) arqSolucao.SkipLine end arqSolucao.SkipLine status = arqSolucao.Read(1) arqSolucao.close ListaMedianas.Sort(true) 'Utilização do Spider para visualização da resposta 'Criação do tema com as medianas class = Point temaMedianas = av.GetProject.MakeFileName("Medianas", "shp") if (temaMedianas <> nil) then teste = Ftab.MakeNew(temaMedianas, class) campo = Field.Make("Ponto", #FIELD_DECIMAL, 8, 0) campo.setEditable(true) campo.SetVisible(true) teste.AddFields({campo}) resposta = Ftheme.Make(teste) k = 0 h = 0 for each r in pontosFtab if (k <= (nummedianas - 1)) then g = ListaMedianas.Get(k) if (g = (r)) then p = temaPontos.GetFtab.ReturnValue(tipoFldP, r) h = resposta.GetFtab.FindField("shape") resposta.GetFtab.SetValue(h, k, p) f = resposta.GetFtab.FindField("Ponto") resposta.GetFtab.AddRecord k = k + 1 end end end viewAtivo.AddTheme(resposta) resposta.SetActive(true) resposta.SetVisible(true) viewAtivo.SetEditableTheme(resposta) av.GetProject.SetModified(true) end projecao = viewAtivo.GetProjection TcFtab = resposta.GetFtab ShpFldC = resposta.GetFtab.FindField("shape") av.GetActiveDoc.GetDisplay 'make a new theme class = PolyLine temaSolucao = av.GetProject.MakeFileName("Solucao", "shp") if (temaSolucao <> nil) then tabela = Ftab.MakeNew(temaSolucao, class) campo1 = Field.Make("ID", #FIELD_DECIMAL, 8, 0) campo2 = Field.Make("Distancia", #FIELD_DOUBLE, 8, 0) campo1.SetVisible(false) tabela.AddFields({campo1}) temaSpider = FTheme.Make(tabela) viewAtivo.AddTheme(temaSpider) temaSpider.SetActive(true ) temaSpider.SetVisible(false ) viewAtivo.SetEditableTheme(temaSpider) av.GetProject.SetModified(true) end listaTemas = viewAtivo.GetThemes listaTemas.Shuffle(listaTemas.Get(0), (listaTemas.Count - 1)) viewAtivo.InvalidateTOC(nil) 'Desenha o diagrama Spider total = ListaPontos.Count for each num in 1..total by 2 tipoCentro = ListaPontos.Get(num - 1) tipoPonto = ListaPontos.Get(num) linha = PolyLine.Make({{tipoCentro, tipoPonto}}) viewAtivo.GetEditableTheme if ( linha <> NIL ) then if (temaSpider <> NIL) then if (projecao.IsNull.Not) then linha = linha.ReturnUnprojected(projecao) end campo = temaSpider.GetFtab.FindField("Shape") registro = temaSpider.GetFtab.AddRecord temaSpider.GetFtab.SetValue(campo, registro, linha) temaSpider.GetFtab.GetSelection.ClearAll temaSpider.GetFtab.GetSelection.Set(registro) temaSpider.GetFtab.UpdateSelection else grafico = GraphicShape.Make(linha) viewAtivo.GetGraphics.UnselectAll grafico.SetSelected(true) viewAtivo.GetGraphics.Add(grafico) end av.GetProject.SetModified(true) end 'if end 'for 'Add the distance field and distances to the Ftab novoFtab = temaSpider.GetFtab coluna = Field.Make("Distancia", #FIELD_FLOAT, 12, 2) novoFtab.SetEditable(true) novoFtab.AddFields({coluna}) campoDistancia = novoFTab.FindField("Distancia") for each r in novoFTab distancia = ListaDistancias.Get(r) novoFTab.SetValue(campoDistancia, r, distancia) end novoFTab.SetEditable(false) temaSpider.SetVisible(true) 'Avaliação se a solução é ótima ou não idStatus = status.AsNumber if (idStatus = 2) then msg = "Solução não ótima" else if (idStatus = 0) then msg = "Solução ótima do dual" else msg = "Solução ótima do primal" end end MsgBox.Info(msg,"Status da Solução")