Commit bb0c3e92c222a3c48ce4eb9584db8d7f6e354b3f

Authored by Edmar Moretti
1 parent 91f5b278

-

ferramentas/melhorcaminho/dicionario.js
@@ -21,7 +21,7 @@ i3GEOF.melhorcaminho.dicionario = { @@ -21,7 +21,7 @@ i3GEOF.melhorcaminho.dicionario = {
21 es : "" 21 es : ""
22 } ], 22 } ],
23 'temas' : [ { 23 'temas' : [ {
24 - pt : "Escolha o tema que ser&aacute; utilizado para obter o ponto inicial e final. No caso de tema pontual, ser&atilde;o considerados o primeiro e o &uacute;ltimo ponto. No caso de tema linear, ser&atilde;o considerados o primeiro e o &uacute;ltimo n&oacute;. No caso de tema poligonal, ser&atilde;o considerados o primeiro n&oacute; e o centr&oacute;ide. <br>Voc&ecirc; pode pular essa etapa caso queira escolher os pontos clicando no mapa.", 24 + pt : "(Opcional) Escolha o tema que ser&aacute; utilizado para obter o ponto inicial e final. Ser&aacute; considerada a sele&ccedil;&atilde;o, se houver. No caso de tema pontual, ser&atilde;o considerados o primeiro e o &uacute;ltimo ponto. No caso de tema linear, ser&atilde;o considerados o primeiro e o &uacute;ltimo n&oacute;. No caso de tema poligonal, ser&atilde;o considerados o primeiro n&oacute; e o centr&oacute;ide. <br>Voc&ecirc; pode pular essa etapa caso queira escolher os pontos clicando no mapa.",
25 en : "", 25 en : "",
26 es : "" 26 es : ""
27 } ], 27 } ],
@@ -66,7 +66,7 @@ i3GEOF.melhorcaminho.dicionario = { @@ -66,7 +66,7 @@ i3GEOF.melhorcaminho.dicionario = {
66 es : "" 66 es : ""
67 } ], 67 } ],
68 'menorque' : [ { 68 'menorque' : [ {
69 - pt : "menor que", 69 + pt : "igual ou menor que",
70 en : "", 70 en : "",
71 es : "" 71 es : ""
72 } ], 72 } ],
@@ -94,5 +94,10 @@ i3GEOF.melhorcaminho.dicionario = { @@ -94,5 +94,10 @@ i3GEOF.melhorcaminho.dicionario = {
94 pt : "Erro ao calcular as coordenadas dos pontos A e B", 94 pt : "Erro ao calcular as coordenadas dos pontos A e B",
95 en : "", 95 en : "",
96 es : "" 96 es : ""
  97 + } ],
  98 + 'buffer' : [ {
  99 + pt : "(Opcional) Valor em Km do entorno da linha reta entre A e B que ser&aacute; considerada como &aacute;rea onde o caminho poder&aacute; ser tra&ccedil;ado",
  100 + en : "",
  101 + es : ""
97 } ] 102 } ]
98 }; 103 };
ferramentas/melhorcaminho/exec.php
@@ -9,18 +9,21 @@ switch (strtoupper($funcao)) @@ -9,18 +9,21 @@ switch (strtoupper($funcao))
9 case "SHAPE2PONTOS": 9 case "SHAPE2PONTOS":
10 $mapa = ms_newMapObj($map_file); 10 $mapa = ms_newMapObj($map_file);
11 $layer = $mapa->getlayerbyname($tema); 11 $layer = $mapa->getlayerbyname($tema);
12 - $shapes = retornaShapesMapext($layer,$mapa); 12 + $shapes = retornaShapesSelecionados($layer,$map_file,$mapa);
13 13
  14 + if(count($shapes) == 0){
  15 + $shapes = retornaShapesMapext($layer,$mapa);
  16 + }
14 //quando ponto 0 17 //quando ponto 0
15 if($layer->type == 0){ 18 if($layer->type == 0){
16 - $objLine = $shapes[0]->line;  
17 - $pontoA = $objLine0(0);  
18 - $objLine = $shapes[count($shapes) - 1]->line;  
19 - $pontoB = $objLine(0); 19 + $objLine = $shapes[0]->line(0);
  20 + $pontoA = $objLine->point(0);
  21 + $objLine = $shapes[count($shapes) - 1]->line(0);
  22 + $pontoB = $objLine->point(0);
20 } 23 }
21 //quando linha 1 24 //quando linha 1
22 if($layer->type == 1){ 25 if($layer->type == 1){
23 - $objLine = $shapes[0]->line; 26 + $objLine = $shapes[0]->line(0);
24 $pontoA = $objLine->point(0); 27 $pontoA = $objLine->point(0);
25 $pontoB = $objLine->point($objLine->numpoints - 1); 28 $pontoB = $objLine->point($objLine->numpoints - 1);
26 } 29 }
@@ -50,7 +53,7 @@ switch (strtoupper($funcao)) @@ -50,7 +53,7 @@ switch (strtoupper($funcao))
50 mkdir ($pathresult,0777); 53 mkdir ($pathresult,0777);
51 54
52 $best = array( 55 $best = array(
53 - " p1"=> array( 56 + "p1"=> array(
54 "calculation_type" =>"best_path", 57 "calculation_type" =>"best_path",
55 "file_prefix" => $prefixo, 58 "file_prefix" => $prefixo,
56 "start_coord" => "[$pta]", 59 "start_coord" => "[$pta]",
@@ -58,7 +61,7 @@ switch (strtoupper($funcao)) @@ -58,7 +61,7 @@ switch (strtoupper($funcao))
58 ) 61 )
59 ); 62 );
60 $cart = array( 63 $cart = array(
61 - " p2"=> array( 64 + "p2"=> array(
62 "calculation_type" =>"cartesian_straight_line_cost", 65 "calculation_type" =>"cartesian_straight_line_cost",
63 "file_prefix" => $prefixo, 66 "file_prefix" => $prefixo,
64 "start_coord" => "[$pta]", 67 "start_coord" => "[$pta]",
@@ -68,6 +71,39 @@ switch (strtoupper($funcao)) @@ -68,6 +71,39 @@ switch (strtoupper($funcao))
68 71
69 $processos = array($best,$cart); 72 $processos = array($best,$cart);
70 73
  74 + if($buffer > 0){
  75 + $buf = array(
  76 + "p3"=> array(
  77 + "calculation_type" =>"best_path_within_buffer",
  78 + "buffer_km" => $buffer,
  79 + "file_prefix" => $prefixo,
  80 + "start_coord" => "[$pta]",
  81 + "stop_coord" => "[$ptb]"
  82 + )
  83 + );
  84 + $processos[] = $buf;
  85 + }
  86 +
  87 + if($lut != ""){
  88 + //pega os valores da lut
  89 + $lista = explode("|",$lut);
  90 + $novaLut = array();
  91 + foreach($lista as $li){
  92 + $v = explode(",",$li);
  93 + $novaLut[] = "- {min: $v[0], max: $v[1], nv: $v[2]}";
  94 + }
  95 + $lut = array(
  96 + "p4"=> array(
  97 + "calculation_type" =>"best_path_lut",
  98 + "lut" => implode("\n",$novaLut),
  99 + "file_prefix" => $prefixo,
  100 + "start_coord" => "[$pta]",
  101 + "stop_coord" => "[$ptb]"
  102 + )
  103 + );
  104 + $processos[] = $lut;
  105 + }
  106 +
71 $a = array( 107 $a = array(
72 "cost_surface_path" => $cost_surface_path, 108 "cost_surface_path" => $cost_surface_path,
73 "pathresult" => $pathresult, 109 "pathresult" => $pathresult,
@@ -78,9 +114,11 @@ switch (strtoupper($funcao)) @@ -78,9 +114,11 @@ switch (strtoupper($funcao))
78 //adapta o formato YAML para que o Python entenda 114 //adapta o formato YAML para que o Python entenda
79 $yaml = str_replace("---","",$yaml); 115 $yaml = str_replace("---","",$yaml);
80 $yaml = str_replace("...","",$yaml); 116 $yaml = str_replace("...","",$yaml);
81 - $yaml = str_replace("- ","",$yaml); 117 + $yaml = str_replace("- p"," p",$yaml);
82 $yaml = str_replace("'","",$yaml); 118 $yaml = str_replace("'","",$yaml);
  119 + $yaml = str_replace('"',"",$yaml);
83 $yaml = trim($yaml)."\n"; 120 $yaml = trim($yaml)."\n";
  121 + $yaml = str_replace('|-',"",$yaml);
84 //salva o arquivo com os parametros 122 //salva o arquivo com os parametros
85 $fp = fopen($y,"w"); 123 $fp = fopen($y,"w");
86 fwrite($fp,$yaml); 124 fwrite($fp,$yaml);
@@ -114,6 +152,41 @@ switch (strtoupper($funcao)) @@ -114,6 +152,41 @@ switch (strtoupper($funcao))
114 $cor->setRGB(255,0,255); 152 $cor->setRGB(255,0,255);
115 $estilo->set("width",2); 153 $estilo->set("width",2);
116 } 154 }
  155 + if(file_exists($pathresult."/".$prefixo."_best_path_within_buffer.shp")){
  156 + //best_path_within_buffer
  157 + $retorno = $m->adicionaTemaSHP($pathresult."/".$prefixo."_best_path_within_buffer.shp");
  158 + $layer = $m->mapa->getlayerbyname($prefixo."_best_path_within_buffer.shp");
  159 + $layer->setmetadata("TEMA","Caminho restrito ao buffer $prefixo");
  160 + $layer->setmetadata("DOWNLOAD","SIM");
  161 + $layer->setmetadata("TEMALOCAL","SIM");
  162 + $classe = $layer->getclass(0);
  163 + $estilo = $classe->getstyle(0);
  164 + $cor = $estilo->color;
  165 + $cor->setRGB(255,255,0);
  166 + //buffer
  167 + $retorno = $m->adicionaTemaSHP($pathresult."/".$prefixo."_buffer_best_path_within_buffer.shp");
  168 + $layer = $m->mapa->getlayerbyname($prefixo."_buffer_best_path_within_buffer.shp");
  169 + $layer->setmetadata("TEMA","Buffer $prefixo");
  170 + $layer->setmetadata("DOWNLOAD","SIM");
  171 + $layer->setmetadata("TEMALOCAL","SIM");
  172 + $classe = $layer->getclass(0);
  173 + $estilo = $classe->getstyle(0);
  174 + $cor = $estilo->color;
  175 + $cor->setRGB(-1,-1,-1);
  176 + $estilo->set("width",2);
  177 + }
  178 + if(file_exists($pathresult."/".$prefixo."_best_path_lut.shp")){
  179 + //cartesian_straight_line_cost
  180 + $retorno = $m->adicionaTemaSHP($pathresult."/".$prefixo."_best_path_lut.shp");
  181 + $layer = $m->mapa->getlayerbyname($prefixo."_best_path_lut.shp");
  182 + $layer->setmetadata("TEMA","Caminho mais curto reclassificado $prefixo");
  183 + $layer->setmetadata("DOWNLOAD","SIM");
  184 + $layer->setmetadata("TEMALOCAL","SIM");
  185 + $classe = $layer->getclass(0);
  186 + $estilo = $classe->getstyle(0);
  187 + $cor = $estilo->color;
  188 + $cor->setRGB(0,255,255);
  189 + }
117 $m->salva(); 190 $m->salva();
118 } 191 }
119 else{ 192 else{
ferramentas/melhorcaminho/index.js
@@ -127,8 +127,8 @@ i3GEOF.melhorcaminho = { @@ -127,8 +127,8 @@ i3GEOF.melhorcaminho = {
127 i3GEO.janela.minimiza("i3GEOF.melhorcaminho"); 127 i3GEO.janela.minimiza("i3GEOF.melhorcaminho");
128 }; 128 };
129 janela = i3GEO.janela.cria( 129 janela = i3GEO.janela.cria(
130 - "400px",  
131 - "190px", 130 + "430px",
  131 + "210px",
132 "", 132 "",
133 "", 133 "",
134 "", 134 "",
@@ -175,7 +175,10 @@ i3GEOF.melhorcaminho = { @@ -175,7 +175,10 @@ i3GEOF.melhorcaminho = {
175 i3GEOF.melhorcaminho.comboTemas(); 175 i3GEOF.melhorcaminho.comboTemas();
176 }, 176 },
177 t3: function(){ 177 t3: function(){
178 - var ins = "<p class='paragrafo'><b>"+$trad('pti',i3GEOF.melhorcaminho.dicionario)+"</b>"; 178 + var ins,
  179 + retorno = i3GEOF.melhorcaminho.COORDENADASTEMA;
  180 +
  181 + ins = "<p class='paragrafo'><b>"+$trad('pti',i3GEOF.melhorcaminho.dicionario)+"</b>";
179 ins += "<p class='paragrafo'>X (long): "; 182 ins += "<p class='paragrafo'>X (long): ";
180 ins += $trad('grau',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('minuto',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('segundo',i3GEOF.melhorcaminho.dicionario)+"</p>"; 183 ins += $trad('grau',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('minuto',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('segundo',i3GEOF.melhorcaminho.dicionario)+"</p>";
181 ins += "<div class='i3geoForm100 i3geoFormIconeEdita' style='float:left;' ><input id='i3GEOmelhorcaminhoxg' title='grau' type=text value='1'/></div>"; 184 ins += "<div class='i3geoForm100 i3geoFormIconeEdita' style='float:left;' ><input id='i3GEOmelhorcaminhoxg' title='grau' type=text value='1'/></div>";
@@ -193,18 +196,22 @@ i3GEOF.melhorcaminho = { @@ -193,18 +196,22 @@ i3GEOF.melhorcaminho = {
193 i3GEO.eventos.removeEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoB()"]); 196 i3GEO.eventos.removeEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoB()"]);
194 i3GEO.eventos.adicionaEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoA()"]); 197 i3GEO.eventos.adicionaEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoA()"]);
195 //calcula as coordenadas em DD 198 //calcula as coordenadas em DD
196 - dms = i3GEO.calculo.dd2dms(retorno.data.ax,retorno.data.ay);  
197 - dmsx = dms[0].split(" ");  
198 - dmsy = dms[1].split(" ");  
199 - $i("i3GEOmelhorcaminhoxg").value = dmsx[0];  
200 - $i("i3GEOmelhorcaminhoxm").value = dmsx[1];  
201 - $i("i3GEOmelhorcaminhoxs").value = dmsx[2];  
202 - $i("i3GEOmelhorcaminhoyg").value = dmsy[0];  
203 - $i("i3GEOmelhorcaminhoym").value = dmsy[1];  
204 - $i("i3GEOmelhorcaminhoys").value = dmsy[2]; 199 + if(retorno != ""){
  200 + dms = i3GEO.calculo.dd2dms(retorno.data.ax,retorno.data.ay);
  201 + dmsx = dms[0].split(" ");
  202 + dmsy = dms[1].split(" ");
  203 + $i("i3GEOmelhorcaminhoxg").value = dmsx[0];
  204 + $i("i3GEOmelhorcaminhoxm").value = dmsx[1];
  205 + $i("i3GEOmelhorcaminhoxs").value = dmsx[2];
  206 + $i("i3GEOmelhorcaminhoyg").value = dmsy[0];
  207 + $i("i3GEOmelhorcaminhoym").value = dmsy[1];
  208 + $i("i3GEOmelhorcaminhoys").value = dmsy[2];
  209 + }
205 }, 210 },
206 t4: function(){ 211 t4: function(){
207 - var ins = "<p class='paragrafo'><b>"+$trad('ptf',i3GEOF.melhorcaminho.dicionario)+"</b>"; 212 + var ins,
  213 + retorno = i3GEOF.melhorcaminho.COORDENADASTEMA;
  214 + ins = "<p class='paragrafo'><b>"+$trad('ptf',i3GEOF.melhorcaminho.dicionario)+"</b>";
208 ins += "<p class='paragrafo'>X (long): "; 215 ins += "<p class='paragrafo'>X (long): ";
209 ins += $trad('grau',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('minuto',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('segundo',i3GEOF.melhorcaminho.dicionario)+"</p>"; 216 ins += $trad('grau',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('minuto',i3GEOF.melhorcaminho.dicionario)+" - "+$trad('segundo',i3GEOF.melhorcaminho.dicionario)+"</p>";
210 ins += "<div class='i3geoForm100 i3geoFormIconeEdita' style='float:left;' ><input id='i3GEOmelhorcaminhoixg' title='grau' type=text value='1'/></div>"; 217 ins += "<div class='i3geoForm100 i3geoFormIconeEdita' style='float:left;' ><input id='i3GEOmelhorcaminhoixg' title='grau' type=text value='1'/></div>";
@@ -223,15 +230,17 @@ i3GEOF.melhorcaminho = { @@ -223,15 +230,17 @@ i3GEOF.melhorcaminho = {
223 i3GEO.eventos.removeEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoA()"]); 230 i3GEO.eventos.removeEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoA()"]);
224 i3GEO.eventos.adicionaEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoB()"]); 231 i3GEO.eventos.adicionaEventos("MOUSECLIQUE",["i3GEOF.melhorcaminho.capturaPontoB()"]);
225 //calcula as coordenadas em DD 232 //calcula as coordenadas em DD
226 - dms = i3GEO.calculo.dd2dms(retorno.data.bx,retorno.data.by);  
227 - dmsx = dms[0].split(" ");  
228 - dmsy = dms[1].split(" ");  
229 - $i("i3GEOmelhorcaminhoixg").value = dmsx[0];  
230 - $i("i3GEOmelhorcaminhoixm").value = dmsx[1];  
231 - $i("i3GEOmelhorcaminhoixs").value = dmsx[2];  
232 - $i("i3GEOmelhorcaminhoiyg").value = dmsy[0];  
233 - $i("i3GEOmelhorcaminhoiym").value = dmsy[1];  
234 - $i("i3GEOmelhorcaminhoiys").value = dmsy[2]; 233 + if(retorno != ""){
  234 + dms = i3GEO.calculo.dd2dms(retorno.data.bx,retorno.data.by);
  235 + dmsx = dms[0].split(" ");
  236 + dmsy = dms[1].split(" ");
  237 + $i("i3GEOmelhorcaminhoixg").value = dmsx[0];
  238 + $i("i3GEOmelhorcaminhoixm").value = dmsx[1];
  239 + $i("i3GEOmelhorcaminhoixs").value = dmsx[2];
  240 + $i("i3GEOmelhorcaminhoiyg").value = dmsy[0];
  241 + $i("i3GEOmelhorcaminhoiym").value = dmsy[1];
  242 + $i("i3GEOmelhorcaminhoiys").value = dmsy[2];
  243 + }
235 }, 244 },
236 t5: function(){ 245 t5: function(){
237 var b, ins = "<p class='paragrafo'>"+$trad('lut',i3GEOF.melhorcaminho.dicionario); 246 var b, ins = "<p class='paragrafo'>"+$trad('lut',i3GEOF.melhorcaminho.dicionario);
@@ -244,6 +253,8 @@ i3GEOF.melhorcaminho = { @@ -244,6 +253,8 @@ i3GEOF.melhorcaminho = {
244 ins += "</tr></table>"; 253 ins += "</tr></table>";
245 ins += "<br>"; 254 ins += "<br>";
246 ins += "<div id='i3GEOmelhorcaminhoLut' ></div>"; 255 ins += "<div id='i3GEOmelhorcaminhoLut' ></div>";
  256 + ins += "<br><br>&nbsp;<p class='paragrafo'>"+$trad('buffer',i3GEOF.melhorcaminho.dicionario)+"<br><div class='i3geoForm i3geoFormIconeEdita'><input id='i3GEOmelhorcaminhoBuffer' type=text value='0' /></div>";
  257 +
247 i3GEO.util.proximoAnterior("i3GEOF.melhorcaminho.t4()","i3GEOF.melhorcaminho.t6()",ins,"i3GEOF.melhorcaminho.t5","i3GEOmelhorcaminhoresultado",true,"i3GEOF.melhorcaminho_rodape"); 258 i3GEO.util.proximoAnterior("i3GEOF.melhorcaminho.t4()","i3GEOF.melhorcaminho.t6()",ins,"i3GEOF.melhorcaminho.t5","i3GEOmelhorcaminhoresultado",true,"i3GEOF.melhorcaminho_rodape");
248 b = new YAHOO.widget.Button( 259 b = new YAHOO.widget.Button(
249 "i3GEOmelhorcaminhoLut4", 260 "i3GEOmelhorcaminhoLut4",
@@ -267,7 +278,7 @@ i3GEOF.melhorcaminho = { @@ -267,7 +278,7 @@ i3GEOF.melhorcaminho = {
267 v1 = $i("i3GEOmelhorcaminhoLut1").value; 278 v1 = $i("i3GEOmelhorcaminhoLut1").value;
268 v2 = $i("i3GEOmelhorcaminhoLut2").value; 279 v2 = $i("i3GEOmelhorcaminhoLut2").value;
269 v3 = $i("i3GEOmelhorcaminhoLut3").value; 280 v3 = $i("i3GEOmelhorcaminhoLut3").value;
270 - v = ">= " + v1 + "e < " + v2 + " = " + v3; 281 + v = ">= " + v1 + "e <= " + v2 + " = " + v3;
271 n = v1 + "," + v2 + "," + v3; 282 n = v1 + "," + v2 + "," + v3;
272 onde = $i("i3GEOmelhorcaminhoLut"); 283 onde = $i("i3GEOmelhorcaminhoLut");
273 novo = "<div class='i3geoForm150 i3geoFormTag' style='float:left;margin-left:2px;margin-top:2px;' onclick='i3GEOF.melhorcaminho.removeLut(this)'>" 284 novo = "<div class='i3geoForm150 i3geoFormTag' style='float:left;margin-left:2px;margin-top:2px;' onclick='i3GEOF.melhorcaminho.removeLut(this)'>"
@@ -319,7 +330,7 @@ i3GEOF.melhorcaminho = { @@ -319,7 +330,7 @@ i3GEOF.melhorcaminho = {
319 retorno = function(retorno) { 330 retorno = function(retorno) {
320 var dms,dmsx,dmsy; 331 var dms,dmsx,dmsy;
321 i3GEO.janela.fechaAguarde("shape2pontos"); 332 i3GEO.janela.fechaAguarde("shape2pontos");
322 - i3GEOF.melhorcaminho.COORDENADASTEMA = retorno.data; 333 + i3GEOF.melhorcaminho.COORDENADASTEMA = retorno;
323 i3GEOF.melhorcaminho.t3(); 334 i3GEOF.melhorcaminho.t3();
324 }; 335 };
325 i3GEO.janela.abreAguarde("shape2pontos", $trad("o1")); 336 i3GEO.janela.abreAguarde("shape2pontos", $trad("o1"));
@@ -388,7 +399,7 @@ i3GEOF.melhorcaminho = { @@ -388,7 +399,7 @@ i3GEOF.melhorcaminho = {
388 $i("i3GEOmelhorcaminhoresultadoFim").innerHTML = retorno.data; 399 $i("i3GEOmelhorcaminhoresultadoFim").innerHTML = retorno.data;
389 }; 400 };
390 p = i3GEO.configura.locaplic+"/ferramentas/melhorcaminho/exec.php?g_sid="+i3GEO.configura.sid 401 p = i3GEO.configura.locaplic+"/ferramentas/melhorcaminho/exec.php?g_sid="+i3GEO.configura.sid
391 - +"&funcao=melhorcaminho&pta="+pta+"&ptb="+ptb+"&lut="+lut+"&raster="+raster; 402 + +"&funcao=melhorcaminho&pta="+pta+"&ptb="+ptb+"&lut="+lut+"&raster="+raster+"&buffer="+$i("i3GEOmelhorcaminhoBuffer").value;
392 cp = new cpaint(); 403 cp = new cpaint();
393 cp.set_response_type("JSON"); 404 cp.set_response_type("JSON");
394 cp.call(p,"melhorcaminho",fim); 405 cp.call(p,"melhorcaminho",fim);