' Name : Spiderpmed_Rede.ave ' Title : Create spider diagrams ' ' Topics: Analysis ' ' Description: Cria matriz de distâncias a partir de dados obtidos de um tema ' de rede. Gera spider. PointList = {} TpList = {} TpListAux = { 0 , 0 } Listamedianas = {} DistanceList = {} ' Testa se documento ativo é uma view v = av.GetActiveDoc if (not (v.Is(View))) then msgBox.Error("Documento ativo não é uma view.","") exit end ' Escolha do numero de medianas themeList = v.GetThemes while (true) smedianas= msgbox.input("Número de medianas:", "Selecione o numero de medianas", "1") if ( smedianas = nil) then exit else if ( smedianas.IsNumber) then nummedianas = smedianas.asnumber break else resposta=msgbox.info("Deve ser um valor numérico.","ERRO") end end end ' Escolha do tema da rede urbana p = Msgbox.Choice (themeList, "Selecione o tema a ser usado como rede.", "Selecione um tema") if (p = nil) then exit end if (NetDef.CanMakeFromTheme(p)) then aNetTheme = p else msgBox.Error("Tema não é rede","") exit end ' Escolha do tema a ser usado como pontos p = Msgbox.Choice (themeList, "Selecione o tema a ser usado como pontos.", "Selecione um tema") if (p = nil) then exit end Tp = v.FindTheme(p.AsString) ' Cria o NetDef e checa se tem erro aNetDef = NetDef.Make(aNetTheme.GetFTab) if (aNetDef.HasError) then msgBox.Error("NetDef has error.","") exit end ' Cria objeto Network aNetwork = Network.Make(aNetDef) ' Cria uma lista com os pontos, valida os pontos e seta o nome ' de cada ponto Proj = v.GetProjection TpFTab = Tp.GetFTab ShpFldP = TpFTab.FindField("Shape") ' LabelField = Field.Make("Label", #FIELD_CHAR, 8, 0) ' TpFTab.AddFields({labelField}) pointLabelField = Tp.GetLabelField for each rec in TpFTab p = TpFTab.ReturnValue(ShpFldP, rec) if (aNetwork.IsPointOnNetwork(p)) then p.SetName(TpFTab.ReturnValueString(pointLabelField, rec)) TpList.Add(p) end end ' MsgBox.ListAsString(TpList,"","") npontos = TpList.Count ' Abre arquivo Pmedian.dat lf = LineFile.Make("Pmedian.dat".AsFileName,#file_perm_write) if (lf = nil) then MsgBox.Error("Não pode abrir arquivo: Pmedian.dat","") exit end ' Grava o numero de pontos e numero de medianas lf.writeElt(npontos.AsString++smedianas) ' Calcula o custo e grava no arquivo Pmedian.dat FindBestOrder = False ReturnToOrigin = False n = npontos - 1 nmenosum = n - 1 for each i in 0..nmenosum aux = TpList.Get(i) TpListAux.Set(0,aux) k = i + 1 for each j in k..n aux1 = TpList.Get(j) TpListAux.Set(1,aux1) PathCost = aNetWork.FindPathCost(TpListAux,FindBestOrder,ReturnToOrigin) ' if (PathCost = 0) then ' MsgBox.ListAsString(TpListAux,"","") ' end lf.WriteElt(PathCost.AsString) end end lf.Close ' Executa o programa em linguagem C pmedian.exe system.executeSynchronous("pmedian.exe") ' Le arquivo solução gerado por pmedian.exe solucao = textfile.make("solucao.txt".asfilename,#file_perm_read) aux = -1 while (true) med = solucao.read(7).Asnumber if (med = 9999999) then break end ponto = solucao.read(7).Asnumber dist = solucao.read(11) shpC = Tp.GetFtab.ReturnValue(ShpFldP,med) if ( med <> aux) then aux = med Listamedianas.add(med) end shpP = Tp.GetFtab.ReturnValue(ShpFldP,ponto) Proj.Projectpt(shpC) Proj.Projectpt(shpP) PointList.Add(shpC) PointList.Add(shpP) DistanceList.Add(dist) solucao.skipline end solucao.skipline status = solucao.read(1) solucao.close Listamedianas.sort(true) ' Utilização do spider para visualização da resposta ' Criação do tema com as medianas class = point def = av.GetProject.MakeFileName("Medianas", "shp") if (def <> nil) then test = Ftab.MakeNew(def, class) fld1 = Field.Make("ponto", #field_decimal, 8, 0) fld1.seteditable(true) fld1.SetVisible(true) test.AddFields({fld1}) resp = Ftheme.Make(test) k = 0 h = 0 for each r in TpFtab if (k <= (nummedianas-1)) then g = Listamedianas.get(k) if (g = (r)) then pont = Tp.GetFtab.ReturnValue(ShpFldP, r) h = resp.getftab.findfield("shape") resp.getftab.SetValue (h, k, pont) f = resp.getftab.findfield("ponto") resp.getftab.addrecord k = k+1 end end end v.AddTheme(resp) resp.setactive(true) resp.setvisible(true) v.SetEditableTheme(resp) av.GetProject.SetModified(true) end Proj = v.GetProjection TcFtab = resp.GetFtab ShpFldC = resp.GetFtab.FindField("shape") d = av.getactivedoc.getdisplay ' Cria novo tema chamado solução class = PolyLine def = av.GetProject.MakeFileName("solução", "shp") if (def <> nil) then tbl = Ftab.MakeNew(def, class) fld = Field.Make("ID", #field_decimal, 8, 0) fld2 = Field.Make("Distance", #field_double, 8, 0) fld.SetVisible( false ) tbl.AddFields({fld}) SpiderTheme = FTheme.Make(tbl) v.AddTheme(SpiderTheme) SpiderTheme.SetActive(true) SpiderTheme.SetVisible(false) v.SetEditableTheme(SpiderTheme) av.GetProject.SetModified(true) end themeList = v.GetThemes themeList.Shuffle( themeList.Get(0), (themeList.Count - 1)) v.InvalidateTOC ( nil ) ' Desenha o diagrama spider ln = PointList.Count for each num in 1..ln by 2 shpC = PointList.get(num-1) shpP = PointList.get(num) spiderline = PolyLine.make( {{shpC, shpP}} ) theTheme = v.GetEditableTheme if (spiderline <> nil) then if (SpiderTheme <> nil) then if (Proj.IsNull.Not) then spiderline = spiderline.ReturnUnprojected(Proj) end theField = SpiderTheme.GetFtab.FindField("Shape") rec = SpiderTheme.GetFtab.AddRecord SpiderTheme.GetFtab.SetValue(theField, rec, spiderline) SpiderTheme.GetFtab.GetSelection.ClearAll SpiderTheme.GetFtab.GetSelection.Set(rec) SpiderTheme.GetFtab.UpdateSelection else gl = GraphicShape.Make(spiderline) v.GetGraphics.UnselectAll gl.SetSelected(true) v.GetGraphics.Add(gl) end av.GetProject.SetModified(true) end end '(FOR) ' Adiciona o campo distância e as distâncias na Ftab theFtab = SpiderTheme.GetFtab f1 = Field.Make ("Distance",#field_float,12,2) theFtab.SetEditable(true) theFtab.AddFields ({f1}) DistanceFld = theFTab.FindField("Distance") for each r in theFTab Dist = DistanceList.get(r) theFTab.SetValue (DistanceFld,r,Dist) end theFTab.SetEditable(false) SpiderTheme.SetVisible(true) ' Avalia se a solução é ótima ou não nstatus = status.asnumber if (nstatus = 2) then msg = "Solução não ótima" else if (nstatus = 0) then msg = "Soluçào ótima do dual" else msg = "Solução ótima do primal" end end msgbox.info(msg,"Solução")