我有一个计算图形界面位置的计算,它是完全动态的,需要将每个项目放在不同的位置。计算和分配一次完美地工作,但我遇到的问题是我需要将计算出的 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 和 2nd floor west 之间创建链接。如果我运行相同的计算,它将按照给定的顺序创建位置,添加的新设备也会重新排序。所以我想为每个位置分配一个 X 和 Y 可以稍后引用,所以它应该以某种方式存储,这样如果我说在 Reception 和 Storeroom one 之间创建一个链接,它应该知道这条线是从 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";
现在问题仍然存在,我需要将 location1 与 location2 匹配,以便告诉脚本将 item1 与 item2 连接并具有正确的坐标。