#!/usr/bin/env perl
#!/usr/local/bin/perl -w
#
# Albert Danial Oct. 26 2003
#
use strict;
use File::Basename;
use DBI;
use DBD::SQLite 1.00;

my $script = basename $0;
die "$script <.db file>
                  Creates a .off file that can be read by Geomview.
                  At the moment only understands tri3 elements.
" unless @ARGV;

my $db_file = shift @ARGV;
$db_file .= ".db" unless -r $db_file;
die "Cannot read $db_file" unless -r $db_file;

(my $off_file = $db_file) =~ s/\.db$/.off/;

my $dbh = DBI->connect("dbi:SQLite:dbname=$db_file","","");

my $node_ref = $dbh->selectall_hashref("select * from node", "id");
my $tri3_ref = $dbh->selectall_hashref("select * from tri3", "id");
my $nNodes   = scalar keys %{$node_ref};
my $nElem    = scalar keys %{$tri3_ref};

open  OUT, ">$off_file" or die "Cannot write to $off_file  $!\n";
printf OUT "OFF\n%d %d 0\n", $nNodes, $nElem;

# use Data::Dumper; print Dumper($tri3_ref);

# print nodal coordinates -- note that they must appear in order
foreach my $id (sort { $node_ref->{$a}{seq_no} <=>
                       $node_ref->{$b}{seq_no} } keys %{$node_ref}) {
    printf OUT "% 10.5e % 10.5e % 10.5e\n", 
               $node_ref->{$id}{x1}, $node_ref->{$id}{x2}, $node_ref->{$id}{x3};
}

foreach my $id (keys %{$tri3_ref}) {
    my $select = "select a.eid,b.seq_no from element_node a, node b " .
                 "where a.nid=b.id and a.eid='$id' order by a.seq_no";
    my $elem_node_ref = $dbh->selectall_arrayref($select);
    print OUT scalar @{$elem_node_ref}, " ";  # the number of nodes in this element
    foreach my $e_n (@{$elem_node_ref}) {
        printf OUT " %12s", $e_n->[1] - 1;   # -1 to make 0-based index
    }
    print OUT "\n";
}
close OUT;
my $rc = $dbh->disconnect;
print "Wrote $off_file ($nNodes nodes, $nElem elements).\n";
