Embedding FreeCAD

From FreeCAD Documentation
Revision as of 15:28, 5 September 2010 by Jmvillar (talk | contribs) (Created page with 'FreeCAD tiene la asombrosa capacidad de poder ser importado como un módulo de python en otros programas o en una consola independiente python, junto con todos sus módulos y com…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

FreeCAD tiene la asombrosa capacidad de poder ser importado como un módulo de python en otros programas o en una consola independiente python, junto con todos sus módulos y componentes. Incluso es posible importar el GUI FreeCAD como módulo python - con algunas restricciones, sin embargo.

Usando FreeCAD sin GUI

La primera, directa, fácil y útil aplicación que puede hacer de esto es para importar documentos FreeCAD en su programa. En el siguiente ejemplo, vamos a importar la geometría de la pieza de un documento FreeCAD en blender. Aquí está el guión completo. Espero que le impresione por su sencillez:

FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)

def import_fcstd(filename):
   try:
       import FreeCAD
   except ValueError:
       Blender.Draw.PupMenu('Error%t|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
   else:
       scene = Blender.Scene.GetCurrent()
       import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

def main():
   Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD', 
                       Blender.sys.makename(ext='.fcstd'))    

# This lets you import the script without running it
if __name__=='__main__':
   main()

La primera parte, importante, es estar seguro de que python encontrará nuestra biblioteca FreeCAD. Una vez que lo encuentra, todos los módulos FreeCAD como parte, que también utilizaremos, estarán disponibles de forma automática. Así que simplemente tomamos la variable sys.path, que es donde Python busca sus módulos, y añadir la ruta de acceso de la FreeCAD lib. Esta modificación es sólo temporal, y se perderán cuando cerremos nuestro intérprete de Python. Otra forma podría ser hacer un enlace a su librería FreeCAD en una de las rutas de búsqueda de Python . Yo he puesto la ruta en una constante (FREECADPATH) por lo que será más fácil para otro usuario del script (guión) adaptarlo a su propio sistema.

Una vez que estamos seguros de que la biblioteca se carga (la secuencia try/except), podemos trabajar con FreeCAD del mismo modo que lo haríamos en el propio intérprete de Python que tiene FreeCAD. Abrimos el documento FreeCAD que nos pasa la función main(), y hacemos una lista de sus objetos. Entonces, como hemos escogido ocuparnos sólo de la geometría de pieza, verificamos que la propiesdad Type de cada objeto contiene "Parte", y despues lo teselamos.

El proceso de teselado elabora una lista de vértices y una lista de caras definidas por vértices índexados. Esto es perfecto, ya que es exactamente la misma manera que Blender define mallas. Por lo tanto, nuestra tarea es ridículamente simple, sólo tiene que añadir los contenidos de ambas listas a los vértices y caras de una malla de Blender. Cuando todo esté hecho, volvemos a dibujar la pantalla, y eso es todo!

Por supuesto este script es muy simple (de hecho hice uno más avanzados aquí here, es posible que desee ampliarlo, por ejemplo añadiendo la importación de objetos malla, o la importación de geometría de piezas que no tenga caras, o importar otros formatos de archivo de los que puede leer FreeCAD. Es posible que también desee exportar la geometría a un documento FreeCAD, lo cual se puede hacer de la misma manera. Es posible que también quiera construir un cuadro de diálogo, con el que el usuario pueda elegir qué importar, etc .. La belleza de todo esto reside realmente en el hecho de que usted deje FreeCAD hacer el trabajo en la sombra, mientras que la presentación de sus resultados se hace en el programa de su elección.

Uso de FreeCAD con GUI (interfaz gráfica de usuario)

Desde la versión 4.2, Qt tiene capacidad para incrustar plugins Qt dependientes del GUI en aplicaciones host (anfitrión) no-Qt y compartir el bucle de eventos del host (anfitrión).

En concreto, para FreeCAD esto significa que puede ser importado (incrustado) en otra aplicación con toda su GUI (interfaz de usuario), en la que la aplicación host tiene el control total sobre FreeCAD.

El código python para lograr todo eso tiene sólo dos líneas

import FreeCADGui 
FreeCADGui.showMainWindow()

If the host application is based on Qt then this solution should work on all platforms which Qt supports. However, the host should link the same Qt version as FreeCAD because otherwise you could run into unexpected runtime errors.

For non-Qt applications, however, there are a few limitations you must be aware of. This solution probably doesn't work together with all other toolkits. For Windows it works as long as the host application is directly based on Win32 or any other toolkit that internally uses the Win32 API such as wxWidgets, MFC or WinForms. In order to get it working under X11 the host application must link the "glib" library.

Note, for any console application this solution of course doesn't work because there is no event loop running.

Si la aplicación host se basa en Qt, entonces esta solución debería funcionar en todas las plataformas que soporte Qt. Sin embargo, el anfitrión debe vincular la misma versión de Qt que FreeCAD porque de lo contrario podría obtener errores de ejecución inesperados.

Para aplicaciones que no son Qt, sin embargo, hay algunas limitaciones que debe tener en cuenta. Esta solución probablemente no funcionará con todos los demás toolkits. Para Windows funcionará siempre y cuando la aplicación host se basa directamente en Win32 o en cualquier otro kit que use internamente el API Win32 como wxWidgets, MFC o WinForms. Para hacerlo funcionar bajo X11, la aplicación host debe vincular la biblioteca "glib".

Tenga en cuenta, por supuesto, que para cualquier aplicación de consola, esta solución no funciona porque no hay ningún bucle de eventos en ejecución.


Scripted objects/es
Code snippets/es
Available translations of this page: Template:Se