0

グラフィックインターフェイスの場所を計算するこの計算があります。これは完全に動的であり、各アイテムを別の場所に配置する必要があります。計算と割り当ての一度は完全に機能しますが、アイテム間のリンクを作成できるように、計算された x 軸と y 軸の数値を各アイテムに永続的に割り当てる必要があるという問題があります。

この式は、最初に計算を割り当て、各項目に ax と y の位置があることを確認できます。問題は、各項目を指定された x 軸と y 軸に設定して、さらに下に移動したい場合は item1 が接続するリンクを作成することです。 item2、item1とitem2の間の線で接続を作成する必要があります。線の部分は、最初に割り当てられたx軸とy軸を各アイテムに保持する方法を見つけたいだけです。

これがどのように機能するかです。どのアイテムが他のアイテムに接続されているか、およびそれらがどこにあるかを示すデータベースがあります。

    Item1..........Item1_location....Item2..........Item2_location
    Router.........Storeroom1........Switch.........2nd_floor_west
    WiFi_route.....Reception.........switch.........Storeroom1

わかりましたので、グラフィカル GUI で、このような計算を行うことで事前にプロットされた位置を作成します。

    open (MYFILE, '>>Output.xml');
        $book = ReadData ("INPUT.xlsx");

        @rows = Spreadsheet::Read::rows ($book->[1]);

        my $X_initial = "160"; #specify the initial x axes
        my $Y_initial = "80";  #specify initial y axes
        my $MAX_X = 1120;      #maximum pixels allowed for x axes.
        my ($cur_x, $cur_y) = ($X_initial, $Y_initial);

    foreach my $tab(@rows) {
    my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
    $count++;
    push @array, $row[1], $row[3];
      }
    my %precious = ();                    # this section will deduplicate the locations
                                          # in order for each location to be created
                                          # once only, the underlying items will be assigned
    foreach (@array)                      # below them.
      {
    $precious{$_} = 1;
      }
    my @deduped = keys %precious;
        chomp(@deduped);
         foreach my $country(@deduped) {
            if($country ne '') {


    if ($cur_x > $MAX_X) {
        $cur_x = $X_initial;
        $cur_y += $Y_initial;
    }
    if ($location =~  m/NONE/i) {
                }

    else {
    push @fixed_location, $location;

    push @location_clause, ("<icon name=\"$location\" label=\"$location\" x=\"$cur_x\" y=\"$cur_y\" image="\devices.png>");

         }
        $cur_y += $Y_initial;
         }
         }
       $count = 1;
       my $start2;
       foreach $start(@location_clause) {

       my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
       $count++;

       push @array, $row[3];
       print MYFILE $start;

これは完全なスクリプトではないことに注意してください。試してみると、適切な xml が出力されません。しかし、出力は次のようになります。

    <methodCall>
    <method methodName="map.createOrReplaceMapVisual">
    <map name="NSA-South-Africa">
    <icon name="Storeroom1" label="Storeroom1" x="160" y="80" image="Devices.png"/>
    <icon name="2nd_floor_west" label="2nd_floor_west" x="320" y="80" image="Devices.png"/>
    <icon name="Reception" label="Reception" x="480" y="80" image="Devices.png"/>
    <map>
    </method>
    </methodCall>

ご覧のとおり、場所を複数回作成しないように出力の重複を排除し、両方のデバイスの場所もチェックインします。x と y は正常に作成されます。

しかし、後で Storeroom1 と 2 階西の間にリンクを作成したいと考えています。同じ計算を実行すると、指定された順序で場所が作成され、追加された新しいデバイスも並べ替えられます。したがって、後で参照できるように各場所に X と Y を割り当てたいので、何らかの形で保存して、受付と物置の間にリンクを作成すると、x480 y80 から x160 および y80 に線が引かれることを認識できるはずです。 .

それらを配列に割り当てて配列をプッシュしようとしましたが、配列からランダムに選択することしかできません。また、別の配列に対して foreach を実行し、場所の配列から呼び出す必要がありますが、これは機能しませんでした。

どんな助けでも大歓迎です。

以下は、上記と同じ計算の簡単な出力です。ファイルは必要ありません。画面に出力するだけです。

     my $X_initial = "160";
     my $Y_initial = "80";
     my $MAX_X = 1120;
     my ($cur_x, $cur_y) = ($X_initial, $Y_initial);
     for (0 .. 20) {
     if ($cur_x > $MAX_X) {
        $cur_x = $X_initial;
        $cur_y += $Y_initial;
        print "\n";
     }
     print "   \t$_:$cur_x/$cur_y";
     $cur_x += $X_initial;
     }
     print "\n";

編集!!!!

わかりました、事前に割り当てられたメソッドを取得できましたが、まだ問題があります。

私がしたことはこれです。最後のセクションを変更しました。

     push @test_loc, "$location, $cur_x, $cur_y";
     $cur_x += $X_initial;
           }
         }
       }

         foreach $getit(@test_loc) {
           @new_array = split /, /, $getit;
       print "Location: $new_array[0]\n X: $new_array[1]\n Y: $new_array[2]\n";

問題はまだ残っています。スクリプトに item1 と item2 を接続し、正しい座標を持つように指示するには、location1 と location2 を一致させる必要があります。

4

1 に答える 1

0

http://perldoc.perl.org/Memoize.htmlなどの Perl の「記憶」関数を参照してください 。これらの関数は、高速な実行のためにメモリをトレードオフします。

于 2013-05-16T08:32:09.107 に答える