https://foro.gambas-es.org/viewtopic.php?f=5&t=5100&p=29735#p29735
-----------------------------------
vuott
Martes, 19 Enero 2016, 17:58

Re: LibreDWG En Gambas
-----------------------------------
[i]tincho[/i] me pedió que volviera disponible para Gambas, usando [i]Shell[/i], este programa escrito en C:
   https://github.com/ArchimedesCAD/libredwg/blob/master/examples/load_dwg.c

Bueno, he modificado un po' aquel codigo y añadí unas lineas para completarlo y para permitir a Gambas que coja unas informaciones enviadas por aquella aplicación escrita en C.

[u]Hace falta por supuesto que sea instalado[/u] el recurso [i]LibreDWG[/i], como fue explicado en estos enlances:
http://foro.gambas-es.org/show_post.php?p=29669
http://foro.gambas-es.org/show_post.php?p=29675
http://foro.gambas-es.org/show_post.php?p=29676

El nuevo codigo en C será:
[code linenumbers=false syntax=c]/*****************************************************************************/
/*  LibreDWG - free implementation of the DWG file format                    */
/*                                                                           */
/*  Copyright (C) 2009 Free Software Foundation, Inc.                        */
/*  Copyright (C) 2010 Thien-Thi Nguyen                                      */
/*                                                                           */
/*  This library is free software, licensed under the terms of the GNU       */
/*  General Public License as published by the Free Software Foundation,     */
/*  either version 3 of the License, or (at your option) any later version.  */
/*  You should have received a copy of the GNU General Public License        */
/*  along with this program.  If not, see <http://www.gnu.org/licenses/>.    */
/*****************************************************************************/

/*
 * load_dwg.c: load a DWG, get lines, text and circles
 * written by Felipe Castro
 * modified by Felipe Corrêa da Silva Sances
 * modified by Thien-Thi Nguyen
 * mutatum a vuott (www.gambas-it.org, foro.gambas-es.org)
 */

#include <dwg.h>
#include <stdio.h>

void
add_line(double x1, double y1, double x2, double y2)
{
  
	printf("%lf", x1);
	printf("%lf", y1);
	printf("%lf", x2);
	printf("%lf", y2);

}

void
add_circle(double x, double y, double R)
{
  
	printf("%lf", x);
	printf("%lf", y);
	printf("%lf", R);

}

void
add_text(double x, double y, char *txt)
{
  
	printf("%lf", x);
	printf("%lf", y);
	printf("%s", txt);

}


int main (int argc, char *argv[]) {
  unsigned int i;
  int success;
  Dwg_Data dwg;

  dwg.num_objects = 0;
  success = dwg_read_file(argv[1], &dwg);
  if (success) {
	printf("Imposible cargar el archivo %s !\n", argv[1]);
        return success;
  }

  for (i = 0; i < dwg.num_objects; i++)
    {
      Dwg_Entity_LINE *line;
      Dwg_Entity_CIRCLE *circle;
      Dwg_Entity_TEXT *text;

      switch (dwg.object[i].type)
        {
      case DWG_TYPE_LINE:
        line = dwg.object[i].tio.entity->tio.LINE;
        add_line(line->start.x, line->end.x, line->start.y, line->end.y);
        break;
      case DWG_TYPE_CIRCLE:
        circle = dwg.object[i].tio.entity->tio.CIRCLE;
        add_circle(circle->center.x, circle->center.y, circle->radius);
        break;
      case DWG_TYPE_TEXT:
        text = dwg.object[i].tio.entity->tio.TEXT;
        add_text(text->insertion_pt.x, text->insertion_pt.y, text->text_value);
        break;
        }
    }

  dwg_free(&dwg);

  return (0);

}[/code]
Guardamos este codigo en un simple archivo de texto, por ejemplo en la ruta: [color=#0072FF]/tmp/load_dwg.c[/color] 
Este codigo debe ser compilado como sigue:
 [color=#BF0000]gcc -o /tmp/load_dwg /tmp/load_dwg.c -lredwg[/color]


El codigo Gambas para coger los valores enviados por la aplicación [i]load.dwg.c[/i] será muy sencillo:
[code linenumbers=false syntax=gambas]Private pr As Process


Public Sub Main()

' Abre el programa "load_dwg", pasandole un archivo .dwg, y lo maneja con "Process" poniendolo tambien en "observación":
  pr = Shell "/tmp/load_dwg /ruta/de/un/archivo.dwg" For Read As "Lee"

End


Public Sub Lee_Read()   ' Si estan entrando datos, será activata esta sub-routine

  Dim s As String

   Read #pr, s, -256
   Print s

End[/code]


Gracias a [i]tincho[/i] por sus test de estos codigos.


