# **************************************************************************** # CUI # # The Advanced Framework for Simulation, Integration, and Modeling (AFSIM) # # The use, dissemination or disclosure of data in this file is subject to # limitation or restriction. See accompanying README and LICENSE for details. # **************************************************************************** #!/usr/bin/perl -w # convert a suppressor antenna pattern to a tabular pattern # sub ReadAndTrim { # Read a single line from the input file, checking for EOF. $eof = !($line = ); # Trim leading and trailing whitespace. $line =~ s/^\s+|\s+$//g; }; if (@ARGV != 2) { die("Wrong number of arguments.\nUsage: convert \n"); } $file_name = $ARGV[0]; $out_file_name = $ARGV[1]; if (! open(ANT_IN, "+<", $file_name)) { die("** ERROR: File $file_name could not be opened\n"); } if (! open ANT_OUT, ">", $out_file_name) { die("** ERROR: File $out_file_name could not be opened\n"); } $el_array_index = 0; $data_value_set_index = 0; $az_array_length = 0; $max_el_values_size = 0; $max_el_values_index = 0; $el_array_length = 0; my @el_array; #Read first line; ReadAndTrim(); while (!eof) { #print $line, "\n"; # first character in the line should not be "$" # if DIMENSION 1 AZ found if (index($line , "DIMENSION 1 AZ")!= -1) { $firstChar = index($line, "(") + 1; $lastChar = index($line, ")") - 1; $az_units = lc(substr $line, $firstChar, ($lastChar - $firstChar + 1)); ReadAndTrim(); while (index($line, "\$") != 0) { # push all whitespace delimited values into the array. push (@az_array, split(/\s+/, $line)); ReadAndTrim(); } $az_array_length = @az_array; # get ready for next block $index = 0; while ($index != $az_array_length) { $offset = 0.0; # may change push(@az_array_padded, $az_array[$index]); if (($index != 0) && ($index != ($az_array_length - 1))) { push(@az_array_padded, $az_array[$index] + 0.0001); } $index = $index + 1; } } # convert to array with staggered edge values (e.g. -0.00001 and 0.00001) # else if DIMENSION 2 EL found elsif (index($line, "DIMENSION 2 EL") != -1) { # check the value in parentheses # these are the units $firstChar = index($line, "(") + 1; $lastChar = index($line, ")") - 1; $el_units[$data_value_set_index] = lc(substr $line, $firstChar, ($lastChar - $firstChar + 1)); #print {STDOUT} "el units: ", $el_units[data_value_set_index], "\n"; # read next line ReadAndTrim(); # Clear the el values @el_values = (); # read in el values until we get to the actual data while (index($line, "GAIN") == -1) { # push all whitespace delimited values into the array. push (@el_values, split(/\s+/, $line)); ReadAndTrim(); } # these need to be saved for later evaluation $el_values_size = @el_values; for($i=0; $i<$el_values_size; $i=$i+1) { $el_array[$data_value_set_index][$i] = $el_values[$i]; } $el_array_length[$data_value_set_index] = $el_values_size; # Need to determine which set of el values has the most elements # as all other el arrays will be expanded to fit this one. if ($el_values_size > $max_el_values_size) { $max_el_values_index = $data_value_set_index; $max_el_values_size = $el_values_size; } # read data values # this is tricky because we read either until we encounter another # header or comment line, or we reach eof :( # for now, we will REQUIRE a comment break "$"; although this does not # appear to be required, the files I've seen follow the rule. # Clear the data values. @data_values = (); # Keep reading data until we encounter the "$" char (comment) at the first position of a line. do { ReadAndTrim(); if (! $eof) { $char1 = substr $line, 0, 1; #check for valid data # read el values; push (@data_values, split(/\s+/, $line)); } else { print "End of file.\n"; } } while ((!$eof) && (!($char1 =~ /\$/))); # these need to be saved for later evaluation $data_values_size = @data_values; for($i=0; $i<$data_values_size; $i=$i+1) { $data_array[$data_value_set_index][$i] = $data_values[$i]; } $data_array_length[$data_value_set_index] = $data_values_size; # increment the data value set index #print "Data Values: ", @data_values, "end_data_values\n"; $data_value_set_index = $data_value_set_index + 1; # Find max set of el values. The entire table will have # to be expanded and padded to include all elevation values. } else { #comment line; read next ReadAndTrim(); } } # Done reading input print "Done reading input."; $el_array_padded[0] = $el_array[$max_el_values_index][0]; $index = 1; while ($index != $max_el_values_size) { $offset = 0.0; # may change push(@el_array_padded, $el_array[$max_el_values_index][$index]); if ($index != ($max_el_values_size - 1)) { push(@el_array_padded, $el_array[$max_el_values_index][$index]); } $index = $index + 1; } #now ready to write out data $num_padded_el_values = @el_array_padded; $num_padded_az_values = @az_array_padded; #$num_padded_values = $num_padded_az_values * $num_padded_el_values; # Three comment lines print {ANT_OUT} "# Generated from Suppressor\n"; print {ANT_OUT} "# \n"; print {ANT_OUT} "# \n"; print {ANT_OUT} $num_padded_az_values, " ", $num_padded_el_values, "\n "; $prevElValue = 500; for ($i=0; $i<$num_padded_el_values; ++$i) { if ($el_array_padded[$i] == $prevElValue) { print {ANT_OUT} $el_array_padded[$i]+0.01, " "; } else { print {ANT_OUT} $el_array_padded[$i], " "; } $prevElValue = $el_array_padded[$i]; } print {ANT_OUT} "\n"; #print el index # All data for the first az bin (first and second indices) are available in the first el set. # Just need to expand values into all el bins $az_index = 0; for ($az = 0; $az < $num_padded_az_values; ++$az) { $el_index = 0; #print $az, " ", $az_array[$az_index], " ", $az_array_padded[$az],"\n"; for ($el = 0; $el < $num_padded_el_values; ++$el) { #print $az, " ", $el, " ", $az_index, " ", $el_index, " ", $el_array[$az_index][$el_index], " ", $el_array_padded[$el], " ", $data_array[$az_index][$el_index], "\n"; $pattern[$az][$el] = $data_array[$az_index][$el_index]; if ($el_array[$az_index][$el_index] < $el_array_padded[$el]) { if ($el_array[$az_index][$el_index+1] <= $el_array_padded[$el]) { $el_index += 1; } } } if ($az_array[$az_index] < ($az_array_padded[$az] - 0.0001)) { $az_index += 1; } } $prevAzValue = 500; for ($az = 0; $az < $num_padded_az_values; ++$az) { if ($az_array_padded[$az] == $prevAzValue) { print {ANT_OUT} $az_array_padded[$az]+0.01, " "; } else { print {ANT_OUT} $az_array_padded[$az], " "; } $prevAzValue = $az_array_padded[$az]; for ($el = 0; $el < $num_padded_el_values; ++$el) { print {ANT_OUT} $pattern[$az][$el], " "; } print {ANT_OUT} "\n"; } #print $az_array_padded; # Close input and output files close(ANT_IN); close(ANT_OUT); select(STDOUT);