The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

CAD::Drawing::IO::DWGI - Perl bindings to the OpenDWG toolkit

WARNING

This module is intended to serve as a backend to CAD::Drawing and is not guaranteed to remain interface stable. Do not use this module directly unless you have a need for higher-speed access than that which is provided by CAD::Drawing (which also provides loads of other features.)

Just

  use CAD::Drawing 

AUTHOR

  Eric L. Wilhelm
  ewilhelm AT sbcglobal DOT net
  http://pages.sbcglobal.net/mycroft

COPYRIGHT

This module is copyright 2003 by Eric L. Wilhelm and A. Zahner Co.

This is module is free software as described under the terms below. Permission to use, modify and distribute this module shall be governed by these terms (the module code is distributed and licensed independently from the OpenDWG consortium's code.) All notices and disclaimers must remain intact with any copies of this software.

LICENSE

This module is distributed under the same terms as Perl. See the Perl source package for details.

REQUIREMENTS

You must obtain and install the OpenDWG libraries from the OpenDWG consortium in order to use this module. By using this module, you have the responsibility to adhere to both the licensing of this module and the licensing of the OpenDWG consortium.

SYNOPSIS

  use CAD::Drawing::IO::DWGI;
  $dwg = CAD::Drawing::IO::DWGI->new();
  $dwg->loadfile("file.dwg");
  $dwg->getentinit();
  while(my($layer, $color, $type) = $dwg->getent()) {
    my $type = $dwg->entype($type);
    if($type eq "lines") {
      $line = $dwg->getLine();
      }
    }
  
  $dxf = CAD::Drawing::IO::DWGI->new();
  $dxf->newfile(1);
  $dxf->getentinit();
  $dxf->writeCircle({"pt"=>[$x, $y], "rad" => 1.125, "color" => 9});
  $dxf->savefile("check.dxf", 1);

SPEED

Wow! This is fast! I had originally implemented this with a function-call based wrapper which had the drawback that the layerhandle had to be found for every object which was being saved. See the writeLayer() and setLayer() functions below for details of the improved methods. Also note that while the speed is amazing from this level, very little speed is lost by moving up a level to using CAD::Drawing (please do this.)

Accuracy

The dxf file accuracy is set internally at 14 digits after the decimal place. Providing an interface to set this would take a bit of coding in C, so you are more than welcome to submit a patch.

Constructor

new

Creates a new blessed reference which gives access to the following object methods.

  $d = CAD::Drawing::IO::DWGI->new();

File Actions

loadfile

Loads a file from disk into the toolkit data structure.

  $d->loadfile("filename.dxf|dwg");

newfile

Creates an empty data structure and initializes some default values.

  $d->newfile($version);

savefile

Writes the data to disk.

  $d->savefile($name, $type);

Layer Actions

listlayers

Returns a list of layers in the loaded object.

  @layers = $d->listlayers();

writeLayer

Add a new layer to the database and set it as the current layer. A newfile() starts with layer "0" as the default.

setLayer

Set layer as the default. Layer must have been previously created with writeLayer().

Typed Entity Functions

getCircle

Reads a circle from the current entity. NOTE that all getThing methods must be part of a getent() loop.

$circle = $d->getCircle(); print "point: ", join(",", @{$circle->{pt}}), "\n"; print "rad: $circle->{rad}\n";

writeCircle

Writes a circle to the object structure.

$d->writeCircle({"pt"=>[$x,$y,$z], "rad"=>$rad, "color"=>$color});

getArc

Reads an arc from the current entity.

$arc = $d->getArc(); print "point: ", join(",", @{$arc->{pt}}), "\n"; print "rad: $arc->{rad}\n"; print "radian angles: ", join(",", @{$arc->{angs}}), "\n";

writeArc

Writes an arc to the object structure.

%ArcOpts = ( "pt" => [$x,$y,$z], "rad" => $rad, "angs" => [$start, $end], "color" => $color, ); $d->writeArc(\%ArcOpts);

getLine

Reads a line from the current entity.

$line = $d->getLine(); print "endpoints: ", join("\n", map({join(",", @{$_})} @{$line->{pts}} ) ), "\n";

writeLine

Writes a line to the object structure.

%LineOpts = ( "pts" => [ [$x1,$y1,$z1], [$x2,$y2,$z2] ], "color" => $color, ); $d->writeLine(\%LineOpts);

getText

$text = $d->getText(); print "point: ", join(",", @{$text->{pt}}), "\n"; print "string: ", $text->{string}, "\n"; print "height: ", $text->{height}, "\n";

writeText

%TextOpts = ( "pt" => [$x, $y, $z], "string" => $string, "height" => $height, "color" => $color, ); $d->writeText(\%TextOpts);

getPoint

$point = $d->getPoint(); print "point: ", join(",", @{$point->{pt}}), "\n";

writePoint

%PointOpts = ( "pt" => [$x, $y, $z], "color" => $color, ); $d->writePoint(\%PointOpts);

getLWPline

$pline = $d->getLWPline(); print "points:\n\t", join("\n\t", map({join(",", @{$_})} @{$pline->{pts}} ) ), "\n"; $pline->{closed} && print "closed\n";

writeLWPline

@pts = ( [0,1], [5,-2.25], [7,9], [4,6], [-2,7.375], ); %PlineOpts = ( "pts" => \@pts, "closed" => 1, "color" => 255, ); $d->writeLWPline(\%PlineOpts);

Entity List handling

getentinit

Initializes the entity list. Call this before adding anything to a newfile() or before calling getent() after loadfile()

getent

Returns the next entity. This is paired with getentinit() and the two act as a pair much like Perl's open() and $line = <FILEHANDLE> setup.

Utilities

get_extrusion

Returns the extrusion vector of the current entity as an array reference.

set_extrusion

Sets the extrusion direction of the current entity. Not intended to be used from Perl (each write<entity> function calls this itself if the value of $opts{extrusion} is set.)

entype

Return a text string for the entity type code.

  $type = $d->entype($type);
  if($type eq "plines") {
    $pline = $d->getLWPline();
    }

DESTROY

This function is called under the hood by perl when variables created by new() go out of scope. You should never call this from your code, but you can undef() your object and it will get called.