https://foro.gambas-es.org/viewtopic.php?f=1&t=4496
-----------------------------------
tincho
Martes, 31 Marzo 2015, 13:59

Edición De Ficheros Dxf
-----------------------------------
Buenos dias a todos. alguno podria orientarme sobre como editar ficheros DXF desde gambas. por el momento deseo hacer cosas simples como cambiar valores de bornas en un "FicheroTemplate.dxf" para crear varios planos de cableado electrico.

Si alguien puede decirme si existe alguna aplicacion hecha en GB3 que maneje ficheros DXF y este disponible el codigo fuente (no como kedicad) tambien me seria de ayuda para ver como maneja el tema.

Existe una libreria [1] que quizas sirva para esto, pero no tengo idea si es compatible con GB3 y si es así, de como usarla.

[1] libdxflib-2.2.0.0 (2.2.0.0-6) [universe] Library for reading and writing DXF files

Desde ya muchas gracias.
Un saludo.


-----------------------------------
jsbsan
Martes, 31 Marzo 2015, 15:18

Re: Edición De Ficheros Dxf
-----------------------------------
tincho:

[quote]alguno podria orientarme sobre como editar ficheros DXF desde gambas. por el momento deseo hacer cosas simples como cambiar valores de bornas en un "FicheroTemplate.dxf" para crear varios planos de cableado electrico.[/quote]
Yo, hace tiempo, lo que hacia era guardar dibujo, en formato .dxf en texto plano (no binario), y lo podía editar con cualquier editor de texto normal. 


De echo, me "estudie" como era el formato dxf y cree un programa para dibujar un diagrama tipo Pert. (en visutal basic)

Para "estudiar el formato", lo que hacia era dibujar una linea, un circulo, crear capas, etc... y ver como se reprensetaba  en el fichero .dxf, asi aprendí como crear fichero .dxf. (muy básico, pero servía ...)


[code linenumbers=false syntax=gambas]Si alguien puede decirme si existe alguna aplicacion hecha en GB3 que maneje ficheros DXF y este disponible el codigo fuente (no como kedicad) tambien me seria de ayuda para ver como maneja el tema.[/code]
No,creo... es algo muy especifico.

Pero es mejor mirarete la guia oficial de como es el formato:
http://images.autodesk.com/adsk/files/acad_dxf0.pdf

[quote]Existe una libreria [1] que quizas sirva para esto, pero no tengo idea si es compatible con GB3 y si es así, de como usarla.

[1] libdxflib-2.2.0.0 (2.2.0.0-6) [universe] Library for reading and writing DXF files[/quote]

El experto en uso de librerias externas en gambas y C es Vuott... Para lo que quieres hacer, creo que te vale editarlo como texto,localizar donde esta los valores que quieres cambiar, cambiarlos y guardar el archivo.


Otros programas softwarlibre para abrir archivos dxf:

http://librecad.org/cms/home.html


-----------------------------------
tincho
Martes, 31 Marzo 2015, 19:36

Re: Edición De Ficheros Dxf
-----------------------------------
[quote]mirarete la guia oficial ...autodesk.com/adsk/files/acad_dxf0.pdf[/quote]

Esta version del pdf dxf-reference-2010 [1] es un poco más nueva que la que dices y coincide con la version DXF qeu genera LibreCAD ($ACADVER 1 AC1021).

[quote]Para lo que quieres hacer, creo que te vale editarlo como texto[/quote]

Gracias, por el dato, es como lo estoy abordandeo de momento.

[quote]Otros programas softwarlibre para abrir archivos dxf ...librecad.org...[/quote]

LibreCAD es un proyecto muy importante y en constante desarrollo, pero por el momento no maneja los bloques con atributos que es lo que me interesa para mi proyecto. En hithub esta la version 3 [2] y quizas en esta si se implemente esta caracteristica.
De todas maneras Librecad esta hecho en C++ y no creo ser capaz de hechar un vistazo al codigo y aprovecharlo, ya que estoy aprendiendo a programar y lo primero con lo que empece es gambas.

[1] http://images.autodesk.com/adsk/files/acad_dxf1.pdf
[2] https://github.com/LibreCAD/LibreCAD_3

Gracias por la respuesta, seguire investigando a ver que saco en claro.


-----------------------------------
vuott
Martes, 31 Marzo 2015, 22:54

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="jsbsan" post="25644"]
El experto en uso de librerias externas en gambas y C es Vuott...
[/quote]

       :shock:


-----------------------------------
vuott
Miercoles, 01 Abril 2015, 01:16

Re: Edición De Ficheros Dxf
-----------------------------------
...hay un inconveniente: lo malo es que la libreria [i]libdxflib[/i] está escrita en C++ .

Es imposible utilizar cada una función con [i]Extern[/i]. Se necesita una apropriada libreria externa [i].so[/i], escrita por nosotros mismos, que contiene todas las funciones utiles.

Bueno, os dejo adjunto el codigo fuente de un projecto Gambas[b]+[/b][u]ejemplo/test[/u] en C++ que encontré en el web. El ejemplo en C++ serà vuelto en una libreria especifica [i].so[/i] por el projecto principal Gambas.

Se necesita, claramente, instalar en el sistema la libreria: [i]libdxflib-2.5.0.0[/i].


-----------------------------------
tincho
Jueves, 02 Abril 2015, 16:29

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="vuott" post="25654"]...hay un inconveniente: lo malo es que la libreria [i]libdxflib[/i] está escrita en C++ .
[/quote]

Bueno gracias por lo que enviaste pero en mi caso no he podido meterle mano ya que las librerías, las clases y la POO me parecen lejanas todavía, pues me encuentro en el pantano de la programación estructurada.
Se que la poo es el camino correcto y que permite la re utilización de código etc. etc. pero  

Gracias a otro post [url=http://foro.gambas-es.org/viewtopic.php?f=1&t=4312&highlight=load]Buscar Una Parte Que Nos Interese De Un Archivo De Texto y un resumen sobre la especificación de dxf (que adjunto aquí) he podido solucionar la tarea con el DXF de la siguiente manera:

a) Cargo el DXF como texto y lo transformo en matriz de cadenas de texto
b) Acoto la búsqueda de texto para tener solo los que están dentro de los bloques.
c) Le aplico la rutina de re nombramiento
d) Guardo la matriz de textos como un archivo de texto-output.dxf

[code linenumbers=false syntax=gambas]

Public Sub btnDxf_Click()

  Dim MyPath As String
  Dim MyFile As String
  Dim MyBlock As String
  Dim MyBlocks As New String[]
  Dim MyBlockMilestone As String
  Dim MyBlocksBegins As New String[]
  Dim MyBlocksEnds As New String[]
  Dim MyPointer As String
  Dim MyPalabra As String
  Dim MyArray As String[]
  Dim i As Integer ' Busqueda de inicio de bloques
  Dim MyBlockBegin As Integer
  Dim j As Integer ' Busqueda de fin de bloques
  Dim MyBlockEnd As Integer
  Dim k As Integer ' Busqueda de inicio de textos dentro de los bloques
  Dim MyTextBegin As Integer
  Dim l As Integer ' Busqueda de fin de textos dentro de los bloques
  Dim m As Integer ' Busqueda de valores dentro de la entidad texto
  Dim MyTexts As New String[]
  Dim MyTextEnd As Integer
  Dim MyTextX As String
  Dim MyTextY As String
  Dim MyTextZ As String
  Dim MyTextValue As String
  Dim MyTextStyle As String
  
  Dim MyTemplateValue As String
  Dim MyNewValue As String
  
    MyPath = User.home & "/Input.dxf"

'a) Cargo el DXF como texto y lo transformo en matriz de cadenas de texto

MyFile = File.Load(MyPath)
MyArray = Split(Myfile, "\n")

MyBlocksBegins.Clear
MyBlocks.Clear
MyBlocksEnds.Clear

'b) Acoto la busqueda de texto para tener solo los que estan dentro de los boques.

' Creacion de lista de Nombres de bloques (blockreferences)
For i = 0 To MyArray.Count - 1
  
  MyPalabra = MyArray[i]

  Select MyPalabra
    Case "AcDbBlockReference"
      MyBlock = MyArray[i + 2]
      MyBlocks.Add(MyBlock)
    End Select

Next 'i

' Creacion de lista de comienzo y fin de los bloques (blockreferences)
For i = 0 To MyArray.Count - 1
  
  MyPalabra = MyArray[i]

  Select MyPalabra
    Case "AcDbBlockBegin"
      ' agrego el inicio de bloque si este es el de un bloque que este en la lista de blockreferences
      For j = 0 To MyBlocks.Count - 1
      
      If MyArray[i + 2] = MyBlocks[j] Then
      MyBlocksBegins.Add(i)
      Endif
        
      Next
      
    End Select

Next 'i

' Creacion de lista de comienzo y fin de los bloques (blockreferences)
For i = 0 To MyArray.Count - 1
  
  MyPalabra = MyArray[i]

  Select MyPalabra
    Case "AcDbBlockEnd"
      
      For m = 0 To MyBlocksBegins.Count - 1
      
      If i > Val(MyBlocksBegins[m]) Then
              MyBlocksEnds.Add(i)
      Endif
      
      Next
    
    End Select

Next 'i

For l = 0 To MyBlocksBegins.Count - 1
  
MyBlockBegin = Val(MyBlocksBegins[l])
MyBlockEnd = Val(MyBlocksEnds[l])
MyBlock = MyBlocks[l] 

        For k = MyBlockBegin To MyBlockEnd
        
          MyPalabra = MyArray[k]

 ' Comprobaciones para acotar la busqueda        
          If MyPalabra = "AcDbText"
            'Print MyPalabra 
                If MyArray[k + 1] = "10" Then
                  If MyArray[k + 3] = "20" Then
                    If MyArray[k + 5] = "30" Then
                      If MyArray[k + 9] = "1" Then
                        If MyArray[k + 17] = "7" Then
                            MyTextX = MyArray[k + 2]
                            MyTextY = MyArray[k + 4]
                            MyTextZ = MyArray[k + 6]
                            MyTextValue = MyArray[k + 10]
                            
                            MyTemplateValue = MyArray[k + 10]

'c) Le aplico la rutina de renombramiento                            

                            Select MyTemplateValue 
                              Case "Texto-que-quiero-reemplazar-1"
                                MyArray[k + 10] = "Texto-de-reemplazo-1"
                              Case "Texto-que-quiero-reemplazar-2"
                                MyArray[k + 10] = "Texto-de-reemplazo-2"
                              Case "Texto-que-quiero-reemplazar-N"
                                MyArray[k + 10] = "Texto-de-reemplazo-N"
                                  
                            End Select
                            
                            MyTextStyle = MyArray[k + 18]
                        Endif
                      Endif
                    Endif
                Endif
            Endif
            Endif
        
        Next 'k

Print "---"
Next 'l

'd) Guardo la matriz de textos como un archivo de texto-output.dxf

File.Save(User.home & "/Output.dxf", MyArray.Join("\n"))

End

[/code]


-----------------------------------
tincho
Lunes, 13 Abril 2015, 19:50

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="vuott" post="25654"]...hay un inconveniente: lo malo es que la libreria [i]libdxflib[/i] está escrita en C++ .

Es imposible utilizar cada una función con [i]Extern[/i]. Se necesita una apropriada libreria externa [i].so[/i], escrita por nosotros mismos, que contiene todas las funciones utiles.

Bueno, os dejo adjunto el codigo fuente de un projecto Gambas[b]+[/b][u]ejemplo/test[/u] en C++ que encontré en el web. El ejemplo en C++ serà vuelto en una libreria especifica [i].so[/i] por el projecto principal Gambas.

Se necesita, claramente, instalar en el sistema la libreria: [i]libdxflib-2.5.0.0[/i].[/quote]

Y esta librería podría funcionar mejor o ser mas practica de usar?
[url=https://github.com/LibreCAD/LibreCAD/blob/master/libraries/libdxfrw/src/drw_entities.h]https://github.com/LibreCAD/LibreCAD/blob/master/libraries/libdxfrw/src/drw_entities.h

Muchas gracias.


-----------------------------------
jsbsan
Lunes, 13 Abril 2015, 20:16

Re: Edición De Ficheros Dxf
-----------------------------------
tincho:

El archivo que dices es un archivo de definición de cabecera ".h", tienes que buscar el ".cpp" o ".c"

No creo que funcione solo la ".h"


-----------------------------------
jguardon
Lunes, 13 Abril 2015, 20:37

Re: Edición De Ficheros Dxf
-----------------------------------
No es que vaya a funcionar uno u otro fichero, porque lo que se utiliza realmente es la librería compilada. De los ficheros sólo puedes extraer la información, la "firma" de las funciones que luego se exportarán a gambas.

De todos modos, esa librería está programada en C++, que prácticamente no se puede hacer funcionar en gambas (por lo que tengo entendido, nunca he probado).

Saludos


-----------------------------------
tincho
Lunes, 13 Abril 2015, 20:44

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="jsbsan" post="25815"]tincho:

tienes que buscar el ".cpp" o ".c"
[/quote]

ok aquí hay mas
[url=https://github.com/LibreCAD/LibreCAD/tree/master/libraries/libdxfrw/src]https://github.com/LibreCAD/LibreCAD/tree/master/libraries/libdxfrw/src

intern 	fix overloaded warning & os/x error 	4 days ago
drw_base.h 	libdxfrw: dwg, bugs & image support 	4 days ago
drw_classes.cpp 	libdxfrw: dwg, bugs & image support 	4 days ago
drw_classes.h 	added missing files from previous commit 	7 days ago
drw_entities.cpp 	add hack to pass fit point as control point 	3 days ago
drw_entities.h 	libdxfrw: dwg, bugs & image support 	4 days ago
drw_header.cpp 	added missing files from previous commit 	7 days ago
drw_header.h 	added missing files from previous commit 	7 days ago
drw_interface.h 	libdxfrw update to 0.6.0 	7 days ago
drw_objects.cpp 	libdxfrw: dwg, bugs & image support 	4 days ago
drw_objects.h 	fix overloaded warning & os/x error 	4 days ago
libdwgr.cpp 	libdxfrw: dwg, bugs & image support 	4 days ago
libdwgr.h 	added missing files from previous commit 	7 days ago
libdxfrw.cpp 	fix overloaded warning & os/x error 	4 days ago
libdxfrw.h 	libdxfrw update to 0.6.0 	7 days ago
main_doc.h 	added missing files from previous commit 	7 days ago

Como lo debería encarar el tema?? la verdad es que no se programar en c++, pero bueno si me puedes orientar por donde empezar, o si lo encaras tu como clase de gambas aunque sea de forma básica por ahí con ella como marco yo podría intentar ampliarla.

Dejo abierta la inquietud, por si a alguien le interesa que tengamos soporte dxf en gambas. que abriría la posibilidad de  intercambiar ficheros gráficos con otros programas CAD.
También esta por allí la librería de GNU libredwg para ficheros DWG, quizas para mas adelante


-----------------------------------
tincho
Lunes, 13 Abril 2015, 21:07

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="jguardon" post="25816"]No es que vaya a funcionar uno u otro fichero, porque lo que se utiliza realmente es la librería compilada. De los ficheros sólo puedes extraer la información, la "firma" de las funciones que luego se exportarán a gambas.

De todos modos, esa librería está programada en C++, que prácticamente no se puede hacer funcionar en gambas (por lo que tengo entendido, nunca he probado).

Saludos[/quote]

Y esta librería que tal? [url=http://en.wikipedia.org/wiki/LibreDWG]LibreDWG esta escrita en C.


-----------------------------------
jguardon
Lunes, 13 Abril 2015, 21:34

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="tincho" post="25818"]
Y esta librería que tal? [url=http://en.wikipedia.org/wiki/LibreDWG]LibreDWG esta escrita en C.[/quote]

Esa librería está interesante, se expone una api muy completa. Pero tiene varios inconvenientes desde mi punto de vista y es que el formato dwg es nativo de Autocad y puede no ser compatible con otras aplicaciones CAD. Su formato es binario, no puedes leerlo o modificarlo con un editor de texto, como el dxf, sino sólo a través de la librería. 

A su favor, seguramente estará la velocidad de proceso para leer y escribir ficheros dwg. El proceso de dibujado después de leer un fichero o el proceso de análisis e interpretación de datos para guardar en fichero es ya otro asunto bastante peliagudo para conseguir que gambas lo haga razonablemente rápido. Sin embargo, creo que es un buen punto de partida.

Saludos


-----------------------------------
vuott
Martes, 14 Abril 2015, 09:25

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="jguardon" post="25816"]
De todos modos, esa librería está programada en C++, que prácticamente no se puede hacer funcionar en gambas [/quote]

Es posible, unos componentes de Gambas derivan de librerías escritas en C++. Pero utilizar con Extern funciones externas de librarias C++ es muy complejo.



[quote user="tincho" post="25818"]
Y esta librería que tal? [url=http://en.wikipedia.org/wiki/LibreDWG]LibreDWG esta escrita en C.[/quote]
Hay al menos dos problemas que solucionar:
- dónde es posible descargar aquella librería;
- si existen ejemplos prácticos escritos en su lenguaje (el C).


-----------------------------------
jsbsan
Martes, 14 Abril 2015, 09:41

Re: Edición De Ficheros Dxf
-----------------------------------
Jguardon:

[quote]el formato dwg es nativo de Autocad y puede no ser compatible con otras aplicaciones CAD[/quote]
Por experiencia profesional, el formato standard es el .dwg
Todo el mundo usa Autocad, o herramienta que son compatibles con los .dwg .

Yo uso, el ZWCAD , que entre nosotros le llamamos "el autocad barato", porque es una "copia" del entorno de autocad (mismos menus, comandos, etc...).

Lo ideal seria usar los .dxf, que no dependen de la empresa Autocad, pero eso seria lo ideal... lo real  "dia a dia" es usar archivos .dwg

Creo que libreCad, todavia no incorpora la importación/exportación de .dwg por problemas de licencia (entre la GPL2 y GPL3 (ver nota1)), pero es fundamental que se lo añadan, si quieren que sea algo que use la gente más o menos profesional.



Saludos


Nota 1:
http://en.wikipedia.org/wiki/LibreCAD
[quote]GPLv3 vs GPLv2 controversy

As the GNU LibreDWG library was changed to GPLv3 it can't be used anymore by LibreCAD (and FreeCAD) [5] as both licenses are incompatible.[6] A request also went to the FSF to relicense GNU LibreDWG as GPLv2, which was rejected.[7]"[/quote]


-----------------------------------
jguardon
Martes, 14 Abril 2015, 12:44

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="vuott" post="25820"]
Hay al menos dos problemas que solucionar:
- dónde es posible descargar aquella librería;
- si existen ejemplos prácticos escritos en su lenguaje (el C).[/quote]

Sí, el código fuente se puede descargar y lleva consigo una testsuite muy completa para probar y comprender la librería. Este es el enlace:

http://git.savannah.gnu.org/cgit/libredwg.git/tree/

Por supuesto, hay que compilarla manualmente, que yo sepa no existen paquetes binarios.

Saludos


-----------------------------------
vuott
Martes, 14 Abril 2015, 17:53

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="jguardon" post="25825"]Este es el enlace:
http://git.savannah.gnu.org/cgit/libredwg.git/tree/

[/quote]

He visto la libreria...     [img]http://www.sherv.net/cm/emoticons/fighting/samurai-suicide-smiley-emoticon.gif[/img]
https://github.com/ArchimedesCAD/libredwg/blob/master/src/dwg.h

y he visto un ejemplo, este:
http://git.savannah.gnu.org/cgit/libredwg.git/tree/examples/load_dwg.c

La libreria tiene muuuchas Estructuras.
Una importante [i]Estructura[/i], llamada: [i]_dwg_struct[/i], es muuuuuy [u]compleja[/u], porque tiene como sus miembros tambien sub-Estructuras de sub-Estructuras.
Soy de la opinión de que el nuestro amigo [i]tincho[/i] tendrá que crear tambien una su libreria dinámica .so [i]ad hoc[/i] para gestionar [u]con seguridad[/u] aquel monstruo de Estructura.

...y en el mar de la libreria [i]libredwg[/i] necesitará un flotador:
[img]http://us.cdn4.123rf.com/168nwm/diamant24/diamant241405/diamant24140500010/28078142-bella-ragazza-in-bikini-con-sorrisi-salvagente-verticali.jpg[/img]


-----------------------------------
tincho
Domingo, 24 Enero 2016, 18:39

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="vuott" post="25836"]Soy de la opinión de que el nuestro amigo [i]tincho[/i] tendrá que crear tambien una su libreria dinámica .so [i]ad hoc[/i] para gestionar [u]con seguridad[/u] aquel monstruo de Estructura....y en el mar de la libreria [i]libredwg[/i] necesitará un flotador:
[img]http://us.cdn4.123rf.com/168nwm/diamant24/diamant241405/diamant24140500010/28078142-bella-ragazza-in-bikini-con-sorrisi-salvagente-verticali.jpg[/img][/quote]
Bueno aquí estamos ya, en mi opinión hemos avanzado bastante.
He contactado a alguien que programa en [b]C[/b] y conoce bastante de DWG, pero nada de Gambas ni tampoco de GNU/Linux voy a tratar de conseguir ayuda para que adapte la librería [b]load_dwg.c[/b] para obtener todo lo posible del DWG. para ponerlo en un txt y así trabajar como si fuera una importación de la información y luego guardarlo en algún otro formato, como puede se DXF, SVG, PDF, etc. e inclusive DWG si logramos usar LibreDWG para escribir DWG.
De momento ya logramos tomar las lineas, círculos, textos y coordenadas de bloques y dibujarlos en un DrawingArea.


-----------------------------------
vuott
Domingo, 24 Enero 2016, 18:53

Re: Edición De Ficheros Dxf
-----------------------------------
[quote user="tincho" post="29861"]Bueno aquí estamos ya, en mi opinión hemos avanzado bastante.[/quote]
Sì, es así. Aquella Estructura ha sido domada.

[img]http://www.100web2.it/uploads/domatore.jpg[/img]


