]> Creatis software - CreaPhase.git/blobdiff - octave_packages/plot-1.1.0/dxfwrite.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / plot-1.1.0 / dxfwrite.m
diff --git a/octave_packages/plot-1.1.0/dxfwrite.m b/octave_packages/plot-1.1.0/dxfwrite.m
new file mode 100644 (file)
index 0000000..9868f76
--- /dev/null
@@ -0,0 +1,164 @@
+## Copyright (C) 2004 Patrick Labbe
+## Copyright (C) 2004 Laurent Mazet <mazet@crm.mot.com>
+## Copyright (C) 2005 Larry Doolittle <ldoolitt@recycle.lbl.gov>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{nb} =} dxfwrite (@var{filename}, @var{pl}, @dots{})
+##
+## Write @var{filename} as a DXF file. Polyline @var{pl} must be defined as
+## matrix of 1, 2 or 3 columns respectively for x, y and z coordinates. The
+## number of polyline (@var{nb}) or 0 is returned.
+## @end deftypefn
+
+function [nb] = dxfwrite (filename, varargin)
+  
+  ## Check file name
+  sn = split(filename, ".");
+  if !strcmp(tolower(deblank(sn(end,:))), "dxf")
+    filename = [filename, ".dxf"];
+  endif
+
+  ## Check arguments
+  nb = 0;
+  if nargin <= 1
+    usage("dxfwrite = (filename, pl, ...)");
+    return;
+  endif
+  
+  ## Open file
+  fid = fopen (filename, "wt");
+  if fid <= 0
+    error("error opening file \"%s\"\n", filename);
+  endif
+
+  ## Format string
+  FMT = sprintf("%%.%dg", save_precision);
+
+  ## Header declarations
+  fprintf (fid, ["0\nSECTION\n", "2\nHEADER\n"]);
+  ## DXF version
+  fprintf (fid, ["9\n$ACADVER\n", "1\nAC1009\n"]); ## AutoCAD R11
+  ## End of headers
+  fprintf (fid, "0\nENDSEC\n");
+
+  ## Table declarations
+  fprintf (fid, ["0\nSECTION\n", "2\nTABLES\n"]);
+
+  ## Line type declarations
+  fprintf (fid, ["0\nTABLE\n", "2\nLTYPE\n"]);
+  ## Number of line types
+  fprintf (fid, "70\n1\n");
+  ## New line type
+  fprintf (fid, "0\nLTYPE\n");
+  ## Line type name
+  fprintf (fid, "2\nCONTINUOUS\n");
+  ## Standard flags
+  fprintf (fid, "70\n0\n"); ## Optimal for AutoCAD
+  ## Descriptive text for linetype
+  fprintf (fid, "3\nContinuous line\n");
+  ## Alignment code
+  fprintf (fid, "72\n65\n"); ## the ASCII code for A
+  ## Number of linetype elements
+  fprintf (fid, "73\n0\n"); 
+  ## Total pattern length
+  fprintf (fid, "40\n0\n");
+  ## Pattern definition
+  ## ???
+  ## End of line types
+  fprintf (fid, "0\nENDTAB\n");
+
+  ## Layers declarations
+  fprintf (fid, ["0\nTABLE\n", "2\nLAYER\n"]);
+  ## Number of layers
+  fprintf (fid, "70\n%d\n", nargin-1);
+
+  nb = 0;
+  for i=1:nargin-1
+    nb++;
+    ## New layer
+    fprintf (fid, "0\nLAYER\n");
+    ## Layer name
+    fprintf (fid, "2\nCurve%d\n", nb);
+    ## Standard flags
+    fprintf (fid, "70\n0\n"); ## Optimal for AutoCAD
+    ## Line type
+    fprintf (fid, "6\nCONTINUOUS\n");
+    ## Color number
+    fprintf (fid, "62\n%d\n", nb);
+  endfor
+  ## End of layers
+  fprintf (fid, "0\nENDTAB\n");
+
+  ## End of tables
+  fprintf (fid, "0\nENDSEC\n");
+
+  ## Entity declarations
+  fprintf (fid, ["0\nSECTION\n", "2\nENTITIES\n"]);
+  
+  nb = 0;
+  for i=1:nargin-1
+    tmp_pl = varargin{1+nb++};
+    
+    ## Check curve dimension (1, 2 or 3)
+    if columns(tmp_pl) <= 3
+      pl = zeros(rows(tmp_pl), 3);
+      pl(:, 1:columns(tmp_pl)) = tmp_pl;
+    else
+      warning ("%dth entry skipped (more than 3 dimensions)", nb);
+      continue;
+    endif
+
+    ## Check if the curve is closed
+    closed = false;
+    if pl(1, :) == pl(rows(pl), :)
+      closed = true;
+      pl = pl([1:rows(pl)-1], :);
+    endif
+
+    ## New polyline
+    fprintf (fid, "0\nPOLYLINE\n");
+
+    ## Layer name
+    fprintf (fid, "8\nCurve%d\n", nb);
+    ## Line type name
+    fprintf (fid, "6\nCONTINUOUS\n");
+    ## Color number???
+    fprintf (fid, "66\n%d\n", nb);
+    ## Standard flags
+    fprintf (fid, "70\n%d\n", closed);
+
+    ## Layer specification
+    layspec = sprintf("8\nCurve%d\n", nb);
+
+    ## List of vertex
+    fprintf(fid, ["0\nVERTEX\n", layspec, \
+                  "10\n",FMT,"\n", "20\n",FMT,"\n", "30\n",FMT,"\n"], pl.');
+
+    ## End of polyline
+    fprintf(fid, "0\nSEQEND\n");
+    
+  endfor
+  
+  ## End of entities
+  fprintf(fid, "0\nENDSEC\n");
+  
+  ## End of file
+  fprintf(fid, "0\nEOF\n");
+  
+  ## Close file
+  fclose(fid);
+  
+endfunction