[vox-tech] Dia & Visio
Alan H. Lake
vox-tech@lists.lugod.org
29 Oct 2002 20:40:04 -0800
You did a lot of work! Thanks!
On Tue, 2002-10-29 at 19:16, Charles Polisher wrote:
> Ryan wrote:
> > I should think visio can export to some sane format. I'll check at work
> > tomorrow
>
> I seem to remember that Visio will export in Adobe Illustrator
> format, which is actually PostScript under the hood. It
> might be possible to walk Visio's internal data structures in
> Ivfhny Onfvp and home-brew your own exporter. Or in Perl,
> maybe something like:
>
>
>
>
>
>
> #
> # -*- Perl -*-
> # $Id: olevisio.pl,v 0.01 2002/02/25 21:00:00 Y.Fujiyama Exp $
> # v 0.10 2002/03/30 12:00:00 Y.Fujiyama BugFix
> # v 0.10 2002/04/05 12:00:00 Y.Fujiyama Bigin Block Test
>
> package olevisio;
> #use strict;
> require 'util.pl';
> require 'gfilter.pl';
> use Win32::OLE;
> use Win32::OLE::Enum;
> use Win32::OLE::Const;
>
>
> #BEGIN {
> #
> # my $vsd;
> # eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
> # die "Visio not installed" if $@;
> # unless (defined $vsd) {
> # $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
> # or die "Oops, cannot start Visio";
> # }
> #
> # #Visible VisioWindow
> #
> # $Win32::OLE::Warn = 0;
> # $vsd->{Visible} = 0; #After Visio2000 Use Only
> # $vsd->{AlertResponse} = 2;
> #
> # #Dumy ioNewDocument
> # $vsd->Documents->Add("");
> #}
>
> END {
> # eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
> # die "Visio not installed" if $@;
> # unless (defined $vsd) {
> # $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
> # or die "Oops, cannot start Visio";
> # }
> if (defined $vsd) {
> util::vprint("Visio->Quit\n");
> $vsd->Quit;
> undef $vsd;
> }
> }
>
> sub mediatype() {
> return ('application/visio');
> }
>
> sub status() {
> open (SAVEERR,">&STDERR");
> open (STDERR,">nul");
> my $const;
> $const = Win32::OLE::Const->Load("Visio 2000 Type Library*");
> # $const = Win32::OLE::Const->Load("Visio 5.0 Type Library*") unless $const;
> # $const = Win32::OLE::Const->Load("Visio 4.1 Type Library*") unless $const;
> open (STDERR,">&SAVEERR");
> return 'yes' if (defined $const);
> return 'no';
> }
>
> sub recursive() {
> return 0;
> }
>
> sub pre_codeconv() {
> return 0;
> }
>
> sub post_codeconv () {
> return 1;
> }
>
> sub add_magic ($) {
> my ($magic) = @_;
>
> $magic->addFileExts('\\.vsd$', 'application/visio');
> return;
> }
>
> sub filter ($$$$$) {
> my ($orig_cfile, $cont, $weighted_str, $headings, $fields) = @_;
>
> my $cfile = defined $orig_cfile ? $$orig_cfile : '';
>
> util::vprint("Processing visio file ... (using 'Win32::OLE->new Visio.Application')\n");
>
> $cfile =~ s/\//\\/g;
> $$cont = "";
> ReadVSD::ReadVSD($cfile, $cont, $fields);
> $cfile = defined $orig_cfile ? $$orig_cfile : '';
>
> gfilter::line_adjust_filter($cont);
> # gfilter::line_adjust_filter($weighted_str);
> gfilter::white_space_adjust_filter($cont);
> $fields->{'title'} = gfilter::filename_to_title($cfile, $weighted_str)
> unless $fields->{'title'};
> gfilter::show_filter_debug_info($cont, $weighted_str, $fields, $headings);
>
> return undef;
> }
>
>
> sub enum ($$$) {
> my ($enum_objs, $func, $cont) = @_;
>
> die "No Objects or No Function" unless ($enum_objs and $func );
>
> my $e = Win32::OLE::Enum->new($enum_objs);
> while(($obj = $e->Next)) {
> return 0 if (!&$func($obj, $cont));
> }
> return 1;
> }
>
> sub getProperties ($$) {
> my ($cfile, $fields) = @_;
>
>
> my $title = $cfile->Title;
> util::vprint("Title .. $title\n");
> $title = $cfile->Subject
> unless (defined $title);
> util::vprint("SubjectTitle .. $title\n");
> $fields->{'title'} = codeconv::shiftjis_to_eucjp($title)
> if (defined $title);
>
> my $author = $cfile->Creator;
> util::vprint("Creator .. $author\n");
> $author = $cfile->Application->{UserName}
> unless (defined $author);
> $fields->{'author'} = codeconv::shiftjis_to_eucjp($author)
> if (defined $author);
>
>
> return undef;
> }
>
> package ReadVSD;
>
> sub ReadVSD ($$$) {
> my ($cfile, $cont, $fields) = @_;
>
> my $vsd;
> eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
> die "Visio not installed" if $@;
> unless (defined $vsd) {
> $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
> or die "Oops, cannot start Visio";
> }
>
> #Visible VisioWindow
>
> $Win32::OLE::Warn = 0;
> $vsd->{Visible} = 0; #After Visio2000 Use Only
> $vsd->{AlertResponse} = 2;
>
> # Redirect stderr to null device, to ignore Error and Exception message.
> open (SAVEERR,">&STDERR");
> open (STDERR,">nul");
>
> # Load Office 97/98/2000 Constant
> my $office_consts;
> $office_consts = Win32::OLE::Const->Load("Visio 2000 Type Library*");
> # $const = Win32::OLE::Const->Load("Visio 5.0 Type Library*") unless $const;
> # $const = Win32::OLE::Const->Load("Visio 4.1 Type Library*") unless $const;
>
> open (STDERR,">&SAVEERR");
>
> my $vdoc = $vsd->Documents->OpenEx({
> 'FileName' => $cfile,
> 'Flags'=> 11 #OpenEx Flags ( 1:OpenCopy + 2:ReadOnly + 8:DontList + 16:OpenMinimized??? )
> });
> die "Cannot open File $cfile" unless (defined $vdoc);
>
> olevisio::getProperties($vdoc, $fields);
>
> my $vpage = $vdoc->Pages;
> my $vpagcnt = $vpage->{Count};
>
> for ( my $vpageno = 1; $vpageno <= $vpagcnt; $vpageno++ ){
> my $pagename = $vpage->Item($vpageno)->{Name};
> util::vprint("Page .. $pagename\n");
> chomp($pagename);
> $$cont .= "$pagename\n" if (defined $pagename);
> my $vshapecnt = $vpage->Item($vpageno)->Shapes->{Count};
> for (my $vshapeno = 1; $vshapeno <= $vshapecnt; $vshapeno++ ){
> if ($vpage->Item($vpageno)->Shapes->Item($vshapeno)->{CharCount} > 0 ){
> my $shapetext = $vpage->Item($vpageno)->Shapes->Item($vshapeno)->Characters->{TextAsString};
> chomp($shapetext);
> $$cont .= "$shapetext\n" if (defined $shapetext);
> }
> }
> undef $vshapeno;
> }
> undef $vpageno;
> undef $vpagcnt;
>
> $vdoc->close();
> undef $vdoc;
>
> # When You Use BIGIN Block , Comment Out 3 Line.
> util::vprint("Visio->Quit\n");
> $vsd->Quit;
> undef $vsd;
>
> return undef;
> }
>
> ...but hey, that's just a guess ;^)
>
> ( npghnyyl gung pbzrf evtug bss gur jro ng
> http://216.239.37.100/search?q=cache:hgE6ki7L5p8C:search.namazu.org/ml
> /namazu-win32-users-ja/msg01347.html+Visio+Perl&hl=en&ie=UTF-8
> )
>
>
> Also have a look at: http://public.logica.com/~redferni/emf/,
> and http://www.lysator.liu.se/~alla/dia/links.html
>
> HTH, HAND
>
> _______________________________________________
> vox-tech mailing list
> vox-tech@lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech
>