Attention: this wiki is deactivated
The new wiki is up and running at http://www.freecadweb.org/wiki
Important: Do not edit this wiki anymore, it will be deleted soon. If you have edit rights here, please read this article to know how to regain your edit rights on the new wiki.
Manual/es
From free-cad
Este es el manual de FreeCAD. Incluye las partes esenciales de la Wiki de documentación de FreeCAD. Está creado principalmente para ser impreso como un gran documento, de modo que, si lo estas leyendo online, posiblemente prefieras dirigirte directamente a la versión de la Ayuda en línea, que es más sencilla de manejar.
Bienvenido a la ayuda en línea de FreeCAD
Este documento ha sido creado automáticamente a partir del contenido de la documentación oficial FreeCAD wiki, que puede leerse en línea en http://apps.sourceforge.net/mediawiki/free-cad/index.php?title=Main_Page/es. Dado que el wiki es mantenido activamente, y está siendo continuamente desarrollado por la comunidad de desarrolladores y usuarios de FreeCAD, es posible que la versión en línea contenga más información o más reciente que este documento. Allí también encontrarás los procesos de traducción en marcha de esta documentación en diversos idiomas. Pero en todo caso, esperamos que encuentres aquí toda la información que necesites. En caso de tener preguntas que no encuentren respuestas en el presente documento, echa un vistazo en FreeCAD forum, donde tal vez puedas encontrar respuestas a tus preguntas, o a alguien capaz de ayudarte.
Cómo usar esta ayuda
Este documento se divide en varias secciones: introducción, uso, scripting (archivos de guión o secuencias de comandos) y desarrollo. Las tres secciones indicadas se dirigen específicamente a los tres grandes tipos de usuarios de FreeCAD: usuarios finales, que simplemente quieren usar el programa, los usuarios avanzados, que se interesan por las capacidades de scripting de FreeCAD y les gustaría personalizar algunos de sus aspectos, y los desarrolladores, que consideran FreeCAD como base para desarrollar sus propias aplicaciones. Si eres totalmente nuevo en FreeCAD, te sugerimos que simplemente empieces por la introducción.
Como Contribuir
Como habrás notado en ocasiones, los programadores no son buenos escritores de manuales de ayuda! Para ellos todo está bastante claro, aunque no esté suficientemente explicado (¡porque lo han hecho ellos mismos!). Por lo tanto es vital que los usuarios experimentados nos ayuden a escribir y revisar la documentación. Sí, lo decimos francamente!. ¿Y Cómo lo hago?, te preguntarás. Sólo tienes que ir a la Wiki http://apps.sourceforge.net/mediawiki/free-cad/index.php en la sección de usuario. Para entrar necesitarás una cuenta en sourceforge account, y solicita en los foros o en le canal de IRC permisos de escritura (la wiki está protegida contra escritura para evitar el spam). Después ya puedes empezar a editar! También comprueba la página Colabora con FreeCAD para ver cómo puedes contribuir con FreeCAD.
Introducción
FreeCAD es una aplicación de modelado CAD 3D de propósito general. El desarrollo está completamente en Código abierto (Licencia GPL & LGPL). FreeCAD está orientado a la ingeniería mecánica y el diseño de producto pero también se ajusta a un amplio rango de usos cercanos a la ingeniería, como la arquitectura así como a otras especialidades de la ingeniería.
Las herramientas de FreeCAD son similares a las de Catia, SolidWorks o Solid Edge, por tanto también pertenece a la categoría de MCAD, PLM, CAx y CAE. Será un modelador paramétrico basado en operaciones con una arquitectura de software modular, que hace sencillo proporcionar funcionalidades adicionales sin modificar el sistema principal.
Como muchos de los modeladores 3D de CAD tendrá un componente 2D para extraer detalles de diseño a partir del modelo 3D y crear planos 2D de producción, pero el trabajar directamente en planos en 2D (como AutoCAD LT) no es el objetivo, tampoco lo es la animación o el diseño de formas orgánicas (como Maya, 3ds Max o Cinema 4D), aunque, gracias a su amplia adaptabilidad, FreeCAD podría llegar a ser útil en muchas otras áreas además de en la que está centrada actualmente.
Otra de las principales preocupaciones de FreeCAD es hacer un amplio empleo de todas las excelentes librerías de código abierto que existen en el campo de la Ciencia Computacional. Entre ellos se encuentra OpenCascade, un potente núcleo de CAD, Coin3D, una reencarnación de OpenInventor, Qt, la mundialmente famosa biblioteca multiplataforma para desarrollar interfaces gráficas, y Python, uno de los mejores lenguajes de archivos de guión disponibles. FreeCAD también puede utilizarse como una librería por otros programas.
FreeCAD es también completamente multiplataforma, y actualmente se ejecuta de forma impecable en Windows, Linux/Unix y Mac OSX, con exactamente el mismo aspecto y funcionalidades en todas las plataformas.
Echa un vistazo a la Lista de principales características o a los artículos the Primeros pasos, o diríjase directamente al Centro de usuarios!
Para comenzar con FreeCAD, continua con el siguiente artículo a través del proceso de instalación.
Esta es una lista extensa (aunque incompleta) de las características que tiene FreeCAD. Si quieres saber que se incluirá en el futuro mira el Mapa de desarrollo. Para obtener una descripción rápida, un buen punto para empezar son las Capturas de pantalla.
Notas de la versión
Características generales
La Aplicación de Base
- FreeCAD es multiplataforma. Se ejecuta y se comporta exactamente de la misma manera en Windows, Linux y Mac OSX.
- FreeCAD es una completa aplicación de interfaz gráfica de usuario (GUI). FreeCAD cuenta con una completa interfaz gráfica de usuario basada en el famoso entorno Qt, con un visualizador 3D basado en Open Inventor, que permite un rápido renderizado de escenas 3D y una representación gráfica de escenas muy accesible.
- FreeCAD también se ejecuta como una aplicación de línea de comandos, con menos requerimientos de memoria. En el modo de línea de comandos, FreeCAD se ejecuta sin su interfaz gráfica GUI, pero con todas sus herramientas de geometría. Puede ser, por ejemplo, utilizado como servidor para producir contenidos para otras aplicaciones.
- FreeCAD puede ser importado como un módulo de Python, dentro de otras aplicaciones que puedan ejecutar scripts Python, o en una consola Python. Al igual que en modo consola, la parte de interfaz GUI de FreeCAD no está disponible, pero todas las herramientas de geometría son accesibles.
- Implementa un sistema de carga tardía para el entramado de Plugins/Módulos y para las estructuras de datos. FreeCAD se divide en una aplicación principal y módulos, que se cargan sólo cuando es necesario. Casi todas las herramientas y elementos de geometría se almacenan en módulos. Los módulos se comportan como plugins, y se pueden agregar o eliminar en una instalación existente de FreeCAD.
- Incorpora un sistema de gestión de archivos de guión en Python: FreeCAD cuenta con un intérprete Python interno, y una API que cubre casi cualquier parte de la aplicación, la interfaz, la geometría y la representación de esta geometría en el visualizador 3D. El intérprete puede ejecutar tanto comandos individuales como Archivos de guión (Scripts) complejos, de hecho en Python se pueden programar módulos completos para FreeCAD.
- Un instalador MSI modular permite instalaciones flexibles en sistemas Windows. También se soportan paquetes para sistemas Ubuntu.
Estructura del documento
- Entorno deshacer/Rehacer: Todas las acciones admiten los procesos deshacer/rehacer. Hay acceso al historial de acciones, de modo que en un solo paso se pueden deshacer múltiples acciones.
- Gestión de transacciones: La pila del historial deshacer/rehacer almacena transacciones de documentos y no solo acciones individuales. Lo que permite definir exactamente lo que hay que deshacerse o rehacerse con cada herramienta.
- Objetos de documento con asociación paramétrica: Todos los objetos en un documento FreeCAD puede ser definido por parámetros. Estos parámetros se pueden modificar sobre la marcha, y los objetos se vuelven a calcular en cualquier momento. La relación entre los objetos también se almacena, por lo que al modificar un objeto también se modifican sus objetos dependientes.
- Guarda el documento en formato Compuesto (basado en ZIP): Los documentos guardados con FreeCAD con extensión .fcstd pueden contener muchos tipos diferentes de información, tales como la geometría, las secuencias de comandos o iconos en miniatura.
Interfaz de usuario
- Interfaz gráfica de usuario (GUI) totalmente configurable/programable por medio de scripts. El interfaz de FreeCAD, basado en Qt es totalmente accesible a través del intérprete de Python. Aparte de las funciones simples que FreeCAD proporciona a los entornos de trabajo, todo el entorno Qt es también accesible, permitiendo cualquier operación desde la interfaz gráfica de usuario, tales como crear, agregar, acoplar, modificar o eliminar widgets y barras de herramientas.
- concepto de entorno de trabajo (Workbench) : En la interfaz de FreeCAD, las herramientas se agrupan en entornos de trabajo (workbenchs). Esto permite mostrar sólo las herramientas utilizadas para llevar a cabo una cierta tarea, manteniendo el espacio de trabajo ordenado y acondicionado, y que la aplicación se cargue rápidamente.
- Incorpora una consola de Python con resaltado de sintaxis, autocompletado y búscador (browser) de clases: Los comandos de Python pueden ser introducidos directamente en FreeCAD y los resultados aparecen de inmediato. Permitiendo que los programadores puedan probar la funcionalidad sobre la marcha, explorar el contenido de los módulos y aprender fácilmente sobre el funcionamiento interno de FreeCAD.
- La interacción del usuario refleja "eco" en la consola: Todo lo que hace el usuario en la interfaz de FreeCAD ejecuta código python, que se puede ver en la consola y grabarse en macros.
- Grabación y edición completa de macros: Los comandos Python emitidos cuando el usuario manipula la interfaz GUI se pueden grabar, editar si fuera necesario, y guardarlos para su reproducción posterior.
- Miniaturas Thumbnailer (De momento solo en sistemas Linux): Los iconos de archivos de FreeCAD muestran el contenido del fichero en la mayoría de las aplicaciones de gestión de archivos, como por ejemplo el Nautilus de GNOME.
Características específicas de la aplicación
La funcionalidad de FreeCAD está dividida en módulos, cada uno dedicado a un tipo especial de datos y tareas:
Módulo de Mallas (Mesh)
- El Módulo de Mallas se ocupa de las mallas 3D (meshes). Está destinado básicamente a la importación, adaptación y conversión a FreeCAD de las mallas generadas por otros programas, así como a la exportación en formato tipo malla de la geometría FreeCAD. Pero FreeCAD también cuenta con otros tipos de geometría mucho más avanzados que las mallas.
- Creación de Primitivas (caja, esfera, cilindro, etc), "copia equidistante" (offset) (trivial o after Jung/Shin/Choi) o operaciones booleanas (unión, intersección, diferencia)
- Importar de los siguientes formatos: ASCII o binario STL (Stereo lithography format) (*.stl, *.ast), el formato OBJ (*.obj), soporte limitado de NASTRAN (*.nas), mallas de Open Inventor (*.iv), y mallas nativas del kernel de FreeCAD (*.bms)
- Exportar de los siguientes formatos: ASCII o binario STL (Stereo lithography format) (*.stl, *.ast), el formato OBJ (*.obj), soporte limitado de NASTRAN (*.nas, *.brl), mallas VRML (*.wrl), mallas nativas del kernel de FreeCAD (*.bms), mallas como módulo de Python (*.py)
- Herramientas para chequeo y reparación de mallas: Prueba de conversión en sólido, detección de elementos duplicados, comprobación de auto-interseccion, relleno de huecos y orientacion uniforme.
- Extensa API de programación en Python.
Croquizado 2D
- creación gráfica de elementos simples de geometría plana tales como líneas, curvas, rectángulos, arcos o círculos en cualquier plano del espacio 3D
- Anotaciones como textos o cotas dimensionales
- Operaciones de manipulación gráfica tales como desplazar, rotar, escalar, simetría, copia equidistante (offset) o conversión de formas, en cualquier plano del espacio 3D
- Importar yExportar de los siguientes formatos: Autodesk's Drawing Exchange Format (*.dxf), formato Open Cad (*.oca, *.gcad) y SVG (*.svg)
CAD
- El Módulo de piezas se ocupa de todo lo relacionado con el modelado CAD y las estructuras de datos CAD. La funcionalidad de CAD está en intenso desarrollo (ver los proyectos Módulo de piezas y Módulo de ensamblajes en el Mapa de desarrollo). El Módulo de piezas trabaja con geometría de alto nivel de Open CASCADE.
- Formas paramétricas primitivas como cajas, esferas, cilindros, conos o toros.
- Componentes topológicos como vertices, bordes, contornos yplanos (por medio de programación en Python).
- Modelado con extrusión o revolución, secciones yredondeos.
- Operaciones Booleanas como unión, diferencia e intersección.
- Extensa API de programación en Python.
- Importar yExportar en los siguientes formatos: STEP piezas y ensamblajes (*.stp,*.step), modelos IGES (*.igs, *.iges) y BRep (*.brp), el formato nativo de nuestro núcle de CAD Open CASCADE.
Módulo de Renderizado
- El Módulo de renderizado permite exportar la geometría de FreeCAD a otros programas de renderizado para generar imagenes de alta calidad. De momento, solo está soportado POV-Ray. El módulo actualmente permite la creación de una hoja de render, y añadir geometría a esa hoja de render para exportar a un archivo de POV-Ray.
Módulo de Planos
- El Módulo de Planos permite exportar vistas de la geometría 3D a un documento 2D SVG. Permite crear una hoja de dibujo a partir de una plantilla SVG existente, e incorporar vistas en esa hoja de dibujo. Posteriormente la hoja puede ser guardada como un archivo SVG.
Módulo de Mecanizado (CAM)
- El Módulo de Mecanizado (CAM) está dedicado a tareas de mecanizado industrial, como el fresado. Este módulo está en una etapa de desarrollo inicial y, de momento está básicamente orientado al Conformado incremental. Aunque hay algunos algoritmos para planificación de trayectorias de mecanizado, aún no son operativos para el usuario final.
Instalación
Instalación en Windows
El modo más sencillo de instalar FreeCAD en Windows es utilizar el instalador de abajo.
Windows 32-bit
Después de descargar el archivo .msi (Microsoft Installer), simplemente haz doble clic en él para iniciar el proceso de instalación.
Abajo hay más información sobre opciones técnicas. Si parece desalentador, no te preocupes! La mayoría de usuarios de Windows no necesitan más que el archivo .msi para instalar FreeCAD y dar sus primeros pasos started!
Instalación simple con el instalador de Microsoft
El modo más sencillo de instalar FreeCAD en Windows es utilizar el instalador de arriba. Esta página describe el uso y las características de Microsoft Installer para tener más opciones de instalación.
Si quieres descargar una versión de 64 bits o en desarrollo, mira la página de Descargas.
Instalación simple
El archivo de instalación de FreeCAD se suministra en formato .msi (Windows Installer).
Puedes descargar el último archivo .msi desde la Página oficial de descargas de FreeCAD. Después de descargar el archivo, simplemente haz doble clic en él para comenzar el proceso de instalación.
Instalación desde la línea de comandos
Con las utilidades del comando msiexec.exe, están disponibles características adicionales, como la instalación no interactiva y la instalación administrativa.
Instalación no interactiva
Con la línea de comandos
msiexec /i FreeCAD<version>.msi
la instalación se puede iniciar mediante programación. Se pueden pasar parámetros adicionales al final de esta línea de comandos, como
msiexec /i FreeCAD-2.5.msi TARGETDIR=r:\FreeCAD25
Interfaz de usuario limitada
La cantidad de interfaces de usuario que le instalador muestra puede controlarse con opciones /q, en particular:
- /qn - Sin interfaz
- /qb - Interfaz básica - simplemente un pequeño letrero de diálogo mostrando el progreso de la instalación
- /qb! - Como /qb, pero ocultando el botón de cancelar
- /qr - Interfaz reducida - Muestra todos los letreros de diálogo que no requieren interacción del usuario (evita todos los letreros de diálogo modales)
- /qn+ - Como /qn, pero muestra el letrero de diálogo "Completed" al final
- /qb+ - Como /qb, pero muestra el letrero de diálogo "Completed" al final
Directorio de destino
El directorio de destino correspondiente (TARGETDIR) determina el directorio raíz de la instalación de FreeCAD. Por ejemplo, se puede indicar una unidad de instalación deiferente con
TARGETDIR=R:\FreeCAD25
El directorio de destino por defecto (TARGETDIR) es [WindowsVolume\Programm Files\]FreeCAD<version>.
Instalación para todos los usuarios
La adicción de
ALLUSERS=1
realiza la instalación para todos los usuarios. Por defecto, la instalación no interactiva instala la aplicación solo para el usuario actual, y la instalación interactiva muestra un letrero de diálogo que con la opción "para todos los usuarios" si el usuario actual tiene los permisos necesarios en Windows.
Selección de características
Un número de propiedades permite la selección de características a ser instaladas, reinstaladas, o eliminadas. El conjunto de características para el instalador de FreeCAD son
- DefaultFeature - Instala el software adecuado, más las librerías principales
- Documentation - Instala la documentación
- Source code - Instala el código fuente
- ... ToDo
Además, ALL especifica todas las características. Todas las características dependen de DefaultFeature, así que instalando cualquier característica automáticamente también se instala la característica por defecto. Las siguientes propiedades controlan las operaciones a ser instaladas o eliminadas
- ADDLOCAL - Lista de características a ser instaladas en la máquina local
- REMOVE - Lista de características a ser eliminadas
- ADDDEFAULT - Lista de características añadidas en su configuración por defecto (la cual es local para todas las características de FreeCAD)
- REINSTALL - Lista de características a ser reinstaladas/reparadas
- ADVERTISE - Lista de características para las cuales realizar un anuncio de instalación
Hay algunas propiedades adicionales disponibles; mira la documentación del MSDN para más detalles.
Con estas opciones, añadiendo
ADDLOCAL=Extensions
instala el interprete y registra las extensiones, pero no instala nada más.
Desinstalación
Con
msiexec /x FreeCAD<version>.msi
se puede desinstalar FreeCAD. No es necesario disponer del archivo MSI para la desinstalación; alternativamente, el paquete o código del producto también puede ser especificado. Puedes encontrar el código del producto buscando en las propiedades del acceso directo de desinstalación que es instalado por FreeCAD en el menú de Inicio.
Instalación Administrativa
Con
msiexec /a FreeCAD<version>.msi
se puede iniciar una instalación "administrativa" (de red). Los archivos se descomprimen en el directorio de destino (que debería estar en un directorio en red), pero no se realiza ninguna otra modificación al sistema local. Además, se genera otro archivo mis (más pequeño) en el directorio de destino, cuyos clientes pueden utilizar para realizar una instalación local (Las futuras versiones podrán también ofrecer mantener algunas características completamente en la unidad de red).
Actualmente, no hay una interfaz de usuario para la instalación administrativa, de modo que el directorio de destino debe pasarse en la línea de comandos.
No existe un procedimiento específico de desinstalación para una instalación administrativa - simplemente eliminar el directorio de destino si ningún cliente ya no lo utiliza más.
Anuncios
Con
msiexec /jm FreeCAD<version>.msi
sería posible, en principio, "anunciar" FreeCAD a una máquina (con /ju para un usuario). Esto hará que los iconos aparezcan en el menú de inicio, y que las extensiones sean registradas, sin el software realmente instalado. El primer uso de una característica hará que dicha característica sea instalada.
El instalador de FreeCAD actualmente soporta simplemente los anuncios de las entradas en el menú de inicio, pero no los de los accesos directos.
Instalación automática en un grupo de máquinas
Con las políticas de grupo de Windows, es posible automáticamente instalar FreeCAD en un grupo de máquinas. Para hacerlo, hay que realizar los siguientes pasos:
- Acceder al controlador de dominio
- Copiar el archivo MSI en un directorio que esté compartido con acceso a todas las máquinas.
- Abrir el complemento MMC "Directorio activo de usuarios y ordenadores"
- Navegar hasta el grupo de ordenadores que necesitan FreeCAD
- Abrir las Propiedades
- Abrir las políticas de grupo
- Añadir una nueva política, y editarla
- En Configuración del ordenador/Instalación de software, seleccionar Nuevo/Paquete
- Seleccionar el archivo MSI a través de la ruta de red
- Opcionalmente, seleccionar que quieres que FreeCAD sea desinstalado si los ordenadores abandonan el alcance de la política.
La propagación de las políticas de grupo tipicamente lleva algo de tiempo - para deplegar el paquete de duentes fiables, todas las máquinas deberían reiniciarse.
Instalación en Linux utilizando Crossover Office
Puedes instalar la versión de Windows de FreeCAD en un sistema Linux utilizando CXOffice 5.0.1. Ejecuta msiexec desde la línea de comandos de CXOffice, asumiendo que el paquete de instalación está ubicado en el directorio "software" el cual tiene asignado a la unidad "Y:":
msiexec /i Y:\\software\\FreeCAD<version>.msi
FreeCAD está ejecutándose, pero informará que la visualización de OpenGL no funcionará, como con otros programas ejecutándose bajo [Wine] Por ejemplo, [SketchUp].
Instalación en Unix/Linux
La instalación de FreeCAD en los sistemas Linux más conocidos ha sido ahora aprobada por la comunidad, y FreeCAD debería estar disponible directamente a través del gestor de paquetes disponible en tu distribución. El equipo de FreeCAD también proporciona varios paquetes "oficiales" cuando las nuevas versiones están definidas, y un par de repositorios PPA experimentales para probar las últimass características que se están desarrollando.
Una vez tengas instalado FreeCAD, es hora de dar tus primeros pasos!
Ubuntu
FreeCAD está disponible desde los repositorios de Ubuntu desde la versión 9.04, y puede instalarse a través del Centro de Software o con:
sudo apt-get install freecad
Alternativamente, la comunidad de FreeCAD proporciona un PPA con construcciones diarias. Este PPA es actualizado y construido automáticamente todos los días a partir de la última versión del código fuente, y por lo tanto contiene nuevas características como un máximo de un día de antigüedad, pero también puede contener regresiones (funcionalidad que deja de funcionar). Para añadir este PPA a tu lista de fuentes de software, haz:
sudo add-apt-repository ppa:freecad-maintainers/freecad-daily sudo apt-get update sudo apt-get install freecad
La comunidad de FreeCAD también proporciona otro PPA, que es actualizado manualmente de vez en cuando , que es por tanto más estable:
sudo add-apt-repository ppa:freecad-maintainers/freecad-dev sudo apt-get update sudo apt-get install freecad
Más información en la página de Descarga
Debian, Mint y otros sistemas basados en Debian
Desde Debian Lenny, FreeCAD está disponible directamente desde los repositorios de software de Debian y se puede instalar a través de Synaptic o simplemente con:
sudo apt-get install freecad
OpenSUSE
FreeCAD se instala normalmente con:
zypper install FreeCAD
Gentoo
FreeCAD se puede construir/instalar simplemente ejecutando:
emerge freecad
Otros
Si averiguas que tu sistema incorpora FreeCAD pero no está incluido en esta página, por favor dínoslo en los foros!
Diversos paquetes de FreeCAD alternativos, no oficiales están disponibles en la red, por ejemplo para sistemas como Slackware o Fedora. Una búsqueda en la red puede darte rápidamente algunos resultados.
Instalación manual en sistemas basados en .deb
Si por cualquier razón no puedes utilizar los métodos de arriba, siempre puedes descargar uno de los paquetes .deb disponibles en la página de Descargas.
Ubuntu 32/64bit
Una vez descargues el .deb correspondiente a tu versión del sistema, si tienes el paquete Gdebi instalado (normalmente es así), simplemente necesitas navegar a donde esté to archivo descargado, y hacer doble clic en él. Las dependencias necesarias se cogerán automáticamente por tu sistema de gestión de paquetes. Alternativamente también puedes instalar desde el terminal, navegando a donde esté ubicado el archivo descargado, y escribiendo:
sudo dpkg -i Name_of_your_FreeCAD_package.deb
cambiando Name_of_your_FreeCAD_package.deb por el nombre del archivo que has descargado.
Después de instalar FreeCAD, un icono de inicio se añadirá en la sección de "Gráficos" de tu menú de inicio.
Instalación en otros sistemas Linux/Unix
Por desgracia, hasta el momento, no está disponible ningún paquete precompilado para otros sistemas Linux/Unix, así que necesitaras compilar FreeCAD tu mismo.
Instalación de la versión para Windows en Linux
Mira la página de la Instalación para Windows.
Instalación en Mac
FreeCAD puede instalarse en Mac OS X en un solo paso utilizando el instalador.
Mac OS X Lion 64-bit
Esta página describe el uso y las características del instalador de FreeCAD. También incluye instrucciones para su desinstalación. Una vez instalado, puedes dar tus primeros pasos!
Instalación simple
El instalador de FreeCAD se proporciona como un paquete de instalación (.mpkg) incluido en un archivo de imagen de disco.
Puedes descargar la última versión del instalador desde la página de Descargas. Después de descargar el archivo, simplemente monta la imagen del disco, y luego ejecuta el paquete Install FreeCAD.
El instalador te mostrará una pantalla de personalizar la instalación que lista los paquetes que serán instalados. Si sabes que ya tienes algunos de esos paquetes, puedes deseleccionarlos utilizando las casillas de selección. Si no estás segur, simplemente deja las casillas activadas.
Desinstalación
No existe actualmente un desinstalados para FreeCAD. Para eliminar por completo FreeCAD y todos los componentes instalados, arrastra los siguientes archivos y carpetas a la papelera:
- En /Applications:
- FreeCAD
- En /Library/Frameworks/
- SoQt.framework
- Inventor.framework
Luego, desde el terminal, ejecuta:
sudo /Developer/Tools/uninstall-qt.py sudo rm -R /usr/local/lib/OCC sudo rm -R /usr/local/include/OCC
Eso es todo. Tarde o temprano, FreeCAD estará disponible como un paquete de aplicación autocontenido de modo que se eliminarán todas estas molestias.
Descubriendo FreeCAD
Novedades
- Notas de la Version 0.12 : Comprueba las novedades de la versión 0.12 de FreeCAD
Introducción
FreeCAD es una aplicación de modelado paramétrico CAD/CAE. Aún está en una fase inicial de desarrollo, así que no esperes poder utilizarlo de inmediato para entornos de producción. Pero si tienes curiosidad sobre el aspecto que tiene FreeCAD o qué características se están desarrollando en él, te invitamos a descargarlo y probarlo. Por el momento ya dispone de bastante funcionalidad, aunque todavía no tiene plenas facilidades para hacer cómoda ("amigable") la interacción con el usuario. Esto significa que si sabes un poco de Python, ya estarás en condiciones de producir y modificar una geometría compleja con relativa facilidad. En otro caso, probablemente encontrarás que FreeCAD todavía tiene algunas carencias para ti. Pero se paciente, se espera que esto cambie pronto.
Y si después de probarlo tienes comentarios, ideas u opiniones, por favor, comparte con nosotros en el Foro de discusión de FreeCAD!
Instalación
En primer lugar descarga (si no lo hiciste ya) e instala FreeCAD. Mira la página de Descargas de información acerca de las versiones y actualizaciones. Hay paquetes de instalación preparados para Windows (. Msi), Ubuntu y Debian (. Deb), openSUSE (. Rpm) y Mac OSX.
Explorando FreeCAD
FreeCAD es una aplicación de modelado 3D de propósito general, centrado en la ingeniería mecánica y otras áreas relacionadas, tales como otras especialidades de la ingeniería o la arquitectura. Se concibe como una plataforma para desarrollar cualquier tipo de aplicación 3D, así como también para realizar tareas muy específicas. Para ello, su interfaz está dividida en una serie de "entornos de trabajo" (workbench). Los entornos de trabajo permiten cambiar el contenido de la interfaz para visualizar únicamente las herramientas necesarias para una tarea específica, o un grupo de tareas.
La interfaz de FreeCAD puede ser descrita como un contenedor muy simple, con una barra de menús, un área de visualización 3D, y un par de paneles laterales para mostrar el contenido de la escena o las propiedades del objeto. Todo el contenido de estos paneles puede tener distinta apariencia, en función del "entorno de trabajo" (workbench) que se esté usando.
Al iniciar FreeCAD por primera vez, se presentará un entorno de trabajo "general", que llamaremos "entorno de trabajo completo". Este entorno de trabajo simplemente contiene las herramientas más significativas de otros entornos de trabajo. Como FreeCAD es bastante joven y aún no se utiliza para trabajos muy especializados, este entorno de trabajo "completo" puede ser muy útil para descubrir FreeCAD con mayor facilidad. Básicamente, todas las herramientas que son lo suficientemente buenas para la producción de la geometría están aquí.
Navegando en el espacio 3D
FreeCAD tiene tres diferentes Modos de navegación disponibles, que se pueden establecer en las preferencias del diálogo de configuración o cambiar pulsando el botón derecho en la vista 3D. Para ver más detalles sobre los modos mira la página Modos de navegación. Para el modo de navegación por defecto ("Navegación CAD"), los comandos son los siguientes
| Select | Pan | Zoom | Rotate View |
|---|---|---|---|
| Press the left mouse button over an object you want to select. Holding down ctrl allows the selection of multiple objects. | Click the middle mouse button and move the object around to pan | Use the mouse wheel to zoom in and out. | Click first with the middle mouse button, hold it and the click the left mouse button on any visible part of an object and drag it in the desired direction. This works like spinning a ball that rotates around its center. If you release the buttons before you stop your motion, the object continues spinning, if this is enabled. A double click with the middle mouse button on any part of an object sets the new center of rotation and zooms in on this point. |
También tiene varias vistas preconfiguradas (vista superior, vista frontal, etc.) disponibles en el menú Ver y en la barra de herramientas Ver y, por atajos numéricos (1, 2, etc...)
Croquizado 2D
Dibujando objetos
Estas son las herramientas para crear objetos.
-
Línea de 2 puntos: Dibuja un segmento de línea entre 2 puntos
-
Polilínea (Línea de múltiples puntos): Dibuja una polilínea compuesta por múltiples segmentos de línea
-
Circunferencia: Dibuja una circunferencia a partir de su centro y radio
-
Arco: Dibuja un segmento de arco a partir de su centro, radio ángulo de inicio y ángulo final
-
Rectángulo: Dibuja un rectángulo a partir de 2 puntos de su diagonal
-
Polígono: Dibuja un polígono regular a partir del centro y radio de la circunferencia que lo circunscribe
-
BSpline: Dibuja una B-Spline a partir de una serie de puntos
-
Texto: Dibuja una anotación de múltiples líneas de texto
-
Cota: Dibuja una cota dimensional
-
Punto: Inserta un objeto punto
Modificando objetos
Estas son las herramientas para la edición de los objetos existentes. Trabajan sobre los objetos seleccionados, pero si no hay ningún objeto seleccionado, permiten seleccionar uno.
-
Desplazar: Desplaza objeto(s) desde una ubicación a otra
-
Girar: Gira objeto(s) desde un ángulo de inicio a un ángulo final
-
Equidistancia: Mueve segmentos de un objeto a cierta distancia
-
Promocionar: Une objetos en un objeto de nivel superior
-
Degradar: Descompone objetos en objetos de nivel inferior
-
Recortar/Extender: Recorta o extiende un objeto
-
Escalar: Escala los objetos seleccionados alrededor de un punto base
-
Editar: Edita un objeto seleccionado
-
Dibujar: Escribe los objetos seleccionados en una Hoja de dibujo
-
Shape 2D View: Crea un objeto 2D que es la vista 2D proyectada de otro objeto 3D
-
Contorno a BSpline: Convierte un contorno a BSpline y viceversa
-
Añadir punto: Añade un punto a un contorno o una BSpline
-
Borrar punto: Borra un punto de un contorno o BSpline
-
Boceto a croquis: Convierte un objeto de Boceto a Croquis y viceversa
-
Matriz: Crea una matriz polar o rectangular a partir de los objetos seleccionados
-
Clonar: Clona los objetos seleccionados
Herramientas de utilidad
Herramientas adicionales disponibles desde el menú contextual del botón derecho del ratón, dependiendo de los objetos seleccionados.
-
Establecer plano de trabajo: Establece un plano de trabajo a partir de una vista estándar o una cara seleccionada
-
Línea final: Termina el dibujo del contorno o BSpline actual, sin cerrarlo
-
Línea de cierre: Termina el dibujo del contorno o BSpline actual, cerrándolo
-
Deshacer línea: Deshace el último segmento de línea
-
Conmutar modo de construcción: Conmuta el modo de construcción del Boceto activado / desactivado
- File:Draft ToggleContinueMode.png Conmutar modo continuo: Conmuta el modo continuo de Boceto activado / desactivado
-
Aplicar estilo: Aplica el estilo actual y el color a los objetos seleccionados
-
Conmuta el modo de visualización: Alterna el modo de visualización de los objetos seleccionados entre "líneas planas" y "alámbrico"
-
Añadir a grupo: Añade rápidamente los objetos seleccionados a un grupo existente
-
Seleccionar contenido de grupo: Selecciona el contenido de un grupo seleccionado
-
Conmutar ajuste: Conmuta el ajuste a objetos activado / desactivado
-
Conmutar rejilla: Conmuta la rejilla del Boceto activado / desactivado
-
Mostrar barra de ajuste: Muestra / oculta la barra de herramientas de ajuste del Boceto
Creando Piezas 3D
Primitivas
Estas son las herramientas para crear primitivas de objetos.
-
Caja: Dibuja una caja especificando sus dimensiones
-
Cono: Dibuja un cono especificando sus dimensiones
-
Cilindro: Dibuja un cilindro especificando sus dimensiones
-
Esfera: Dibuja una esfera especificando sus dimensiones
-
Toro: Dibuja un toro (anillo) especificando sus dimensiones
Modificando objetos
Estas son las herramientas para modificar los objetos existentes. Permiten seleccionar los objetos a modificar.
-
Operaciones Booleanas: Realiza operaciones Booleanas sobre los objetos
-
Fusión: Fusión (unión) de dos objetos
-
Intersección: Extrae la parte común (intersección) de dos objetos
-
Diferencia: Corta (resta) un objeto de otro
-
Extrusión: Extruye caras planas de un objeto
-
Redondear: Redondea las aristas de un objeto
-
Revolución: Crea un objeto haciendo que gire otro objeto alrededor de un eje
-
Sección: Crea una sección por la intersección de un objeto con un plano de sección
-
Chaflán: Crea un chaflán en las aristas de un objeto
-
Simetría: Crea una simetría de los objetos seleccionados alrededor de un plano de simetría dado
Exportando a Dibujos 2D
Estas son las herramientas para la creación, configuración y exportación de hojas de dibujo 2D
-
Abre SVG scalable vector graphic: Abre una hoja de dibujo previamente guardada en un archivo SVG
-
Nueva hoja de dibujo en formato A3: Crea una hoja de dibujo nueva a partir de la plantilla por defecto A3 de FreeCAD
-
Insertar una vista: Inserta una vista de los objetos seleccionados en la hoja de dibujo activa
-
Guardar hoja de dibujo: Guarda la hoja de dibujo actual como un archivo SVG
Exportando a programas de renderizado externos
Estas son las herramientas para exportar tu trabajo 3D a aplicaciones de renderizado externas
-
Nuevo proyecto de PovRay: Inserta un nuevo proyecto de PovRay en el documento
-
Exportar vista a PovRay: Escribe la vista 3D activa con la cámara y todo su contenido en un archivo de PovRay
-
Exportar cámara a PovRay: Exporta la posición de la cámara de la vista 3D activa a un archivo con formato de PovRay
-
Exporar pieza a PovRay: Escribe la pieza seleccionada (objeto) como un archivo de PovRay
Programación de archivos de guión
Y finalmente, una de las características más poderosas de FreeCAD es el entorno de Programación de archivos de guión. Desde la consola integrada de Python (o desde cualquier otro archivo de guión de Python), puedes acceder a casi cualquier parte de FreeCAD, crear o modificar geometría, modificar la representación de esos objetos en la escena 3D o acceder y modificar la interfaz de FreeCAD. Los archivos de guión de Python también pueden utilizarse en Macros, las cuales proporcionan un método sencillo de crear comandos personalizados.
Trabajando con FreeCAD
Navegación 3D
The FreeCAD mouse model consists of the commands used to visually navigate the 3D space and interact with the objects displayed. There are currently 3 different mouse navigation schemes in FreeCAD. The default navigation style is referred to as "CAD Navigation," and is very simple and practical, but FreeCAD also has two alternative navigation styles modeled after Inventor and Blender navigation.
Navigation
La manipulación de objetos es común a todos los entornos de trabajo. Las siguientes acciones del ratón se pueden utilizar para controlar la posición y visualización de los objetos de acuerdo con el estilo de navegación que esté seleccionado.
Hay dos formas de cambiar el estilo de navegación:
- En el Editor de Preferencias, sección Display, pestaña Vista 3D;
- Pulsando con el botón derecho en un área vacía de la vista 3D y seleccionando Estilo de navegación en el menú contextual.
Navegación CAD (por defecto)
Este es el estilo de navegación por defecto y permite al usuario un control simple de la vista, y no requiere el uso del teclado con la excepción de la realización de selecciones múltiples.
| Selección | Encuadre | Zoom | Rotar vista |
|---|---|---|---|
| Presiona el botón izquierdo sobre el objeto que quieras seleccionar. Manteniendo pulsadas la tecla CRTL se permite la selección de múltiples objetos. | Pulsa el botón del medio. | Utiliza la rueda del ratón para acercar o alejar la vista. | Pulsa primero con el botón del medio, mantén el botón presionado y pulsa el botón izquierdo sobre cualquier parte visible de cualquier pieza de un objeto y arrástralo en la dirección deseada. Esto funciona como si se girase una bola que rotase sobre su centro. Si liberas el botón antes de parar el movimiento, el objeto continua girando, si está activado. Un doble clic con el botón del medio sobre cualquier parte de un objeto establece en ese punto el nuevo centro de rotación y acerca la vista a él. |
Navegación de Inventor
En la Navegación de Inventor, no se puede seleccionar sólo con el ratón. Para seleccionar objetos, debes mantener presionada la tecla CTRL.
Navegación de Blender
En la Navegación de Blender, no se puede hacer un encuadre sólo con el ratón. Para hacer un encuadre, debes mantener presionada la tecla SHIFT.
Seleccionando objetos
Los objetos pueden seleccionarse mediante un clic con el botón izquierdo del ratón o bien pulsando sobre el objeto en la vista 3D o seleccionándolo en la vista en árbol. También hay un mecanismo de preselección que resalta los tobjetos y muestra información de ellos antes de seleccionarlos con sólo pasar el ratón sobre ellos. Si no te gusta ese comportamiento o si tienes una máquina lenta, puedes desactivar la opción de preselección en el menú de preferencias.
Manipulación de Objetos
FreeCAD ofrece manipuladores que se pueden utilizar para modificar un objeto o su aspecto visual. Un ejemplo sencillo es el plano de recorte, que se puede activar con el menú Ver --> Plano de recorte. Después de la activación, el objeto plano de recorte aparece, y se muestran siete manipuladores con aspecto de cajitas o recuadros. Algunos manipuladores tienen un manejo obvio: Uno en cada extremo de sus tres ejes de coordenadas y otro en el centro del plano eje normal. Hay cuatro más que no son tan obvios: El plano, propiamente, y la parte delgada de los tres objetos eje.
- Escala
- Para escalar el objeto, haz clic con el botón izquierdo del ratón sobre los manipuladores al final de los ejes y tira de ellos hacia atrás y adelante. Dependiendo del objeto, los manipuladores trabajan independientemente o de forma sincronizada.
- desplazamiento Fuera de plano
- Para desplazar el objeto a lo largo de su vector normal, tira del recuadro grande en el centro de un eje con el botón izquierdo del ratón. En el caso del plano de recorte no hay más que un manipulador en el vector normal.
- desplazamiento En el plano
- Para mover el centro del plano de recorte, haga clic en el objeto plano y tire de él hasta la posición deseada.
- Rotación
- Al hacer clic en la parte delgada de los ejes del manipulador, se activa el modo de rotación.
Soporte de Hardware
FreeCAD también soporta algún Dispositivo de entrada 3D.
El documento de FreeCAD
Un documento FreeCAD contiene todos los objetos de la escena. Puede contener grupos y objetos hechos con cualquier entorno de trabajo. Por lo tanto, puedes cambiar entre los entornos de trabajo, y seguir trabajando en el mismo documento. El documento es lo que se guarda en el disco al guardar tu trabajo. También puedes abrir varios documentos al mismo tiempo en FreeCAD, y abrir varias vistas del mismo documento.
En el documento, los objetos se pueden mover e incorporar a grupos, y cada objeto tiene un nombre único, exclusivo. La gestión de grupos, objetos y nombres de objeto se hace principalmente en la vista de árbol. También se puede hacer, por supuesto, como todo en FreeCAD, desde el intérprete de Python. En la vista de árbol, se pueden crear grupos, mover objetos a grupos, eliminar objetos o grupos,... haciendo clic con el botón derecho del ratón en la vista en árbol o en un objeto, cambiar el nombre de los objetos haciendo doble clic sobre sus nombres,... o posiblemente otras operaciones, en función del entorno de trabajo actual.
Los objetos dentro de un documento FreeCAD pueden ser de diferentes tipos. Cada entorno de trabajo puede crear sus propios tipos de objetos, por ejemplo, el Entorno de trabajo de mallas crea objetos de malla, el Entorno de trabajo de piezas crear objetos de piezas, el Entorno de croquizado 2D también crea objetos Parte, etc
Si hay uno o más documentos abiertos en FreeCAD, siempre alguno de ellos, y sólo uno, será el documento activo. Ese es el documento que aparece en la vista 3D actual, el documento con el que se está trabajando actualmente.
Aplicación e interfaz de usuario
Como casi todo lo demás en FreeCAD, la interfaz de usuario (GUI) del entorno de trabajo de piezas está separada de la aplicación base de piezas. Esto también es válido para los documentos. Los documentos también están hechos de dos partes: el documento de la aplicación, que contiene nuestros objetos, y el documento Vista, que contiene la representación en pantalla de nuestros objetos.
Piensa en ello como dos espacios, donde los objetos están definidos. Sus parámetros constructivos (¿es un cubo? ¿Un cono? ¿Qué tamaño? ...) se almacenan en el documento de aplicación, mientras que su representación gráfica (¿es dibujado con línea negra? ¿Con las caras azules? ...) se almacena en el documento Vista. ¿Por qué? Porque FreeCAD también puede ser utilizado sin interfaz gráfica, por ejemplo dentro de otros programas y, aún así, tenemos que ser capaces de manipular nuestros objetos, incluso si no se dibujan en la pantalla.
Otra cosa que está contenida en el documento Vista son las vistas 3D. Un documento puede tener varias vistas abiertas, así que puedes inspeccionar tu documento desde varios puntos de vista al mismo tiempo. Tal vez te gustaría ver una vista superior y una vista frontal de tu trabajo, al mismo tiempo. De ese modo, tendrías dos puntos de vista del mismo documento, ambos almacenados en el documento Vista. Crear puntos de vista nuevos o cerrar vistas se puede hacer desde el menú Vista o haciendo clic derecho en la pestaña de una vista.
Archivos de guión
Los documentos se pueden crear fácilmente, acceder y modificar desde el intérprete de Python. Por ejemplo:
FreeCAD.ActiveDocument
devolverá el documento activo actual
FreeCAD.ActiveDocument.Blob
accedería a un objeto llamado "Blob" dentro de tu documento
FreeCADGui.ActiveDocument
devolvería el documento vista asociado al documento actual
FreeCADGui.ActiveDocument.Blob
accedería a la parte representación gráfica (vista) de nuestro objeto Blob
FreeCADGui.ActiveDocument.ActiveView
devolverá la vista actual
Definiendo las preferencias de usuario
Las preferencias del sistema de FreeCAD se encuentra en el menú Editar -> Preferencias.
La funcionalidad de FreeCAD está dividida en diferentes módulos, cada módulo se hace cargo del funcionamiento de un determinado Entorno de trabajo. FreeCAD también utiliza un concepto llamado carga tardía, lo que significa que los componentes se cargan sólo cuando se necesitan. Habrás notado que, cuando se selecciona un entorno de trabajo en la barra de herramientas de FreeCAD, tanto el entorno como todos sus componentes se cargan en ese momento. Esto incluye la configuración de tus preferencias.
La configuración de las preferencias generales
Cuando se inicia FreeCAD sin un entorno de trabajo cargado, la ventana de preferencias mostrará un contenido mínimo. A medida que se cargan módulos adicionales, en la ventana de preferencias aparecerán nuevas secciones, lo que permite configurar los detalles de cada entorno de trabajo.
Sin ningún módulo cargado, tendrás acceso a dos secciones de configuración, las correspondientes a la configuración general de la aplicación y a la configuración de la visualización en pantalla.
La configuración de la visualización en pantalla
FreeCAD está siempre en constante evolución, por lo que el contenido de sus letreros de diálogo puede diferir de las capturas de pantalla mostradas arriba. En general, los ajustes se explican por sí mismos. Por ello no deberías tener dificultades en adaptar la configuración de FreeCAD a tus necesidades.
Personalizando la interfaz
Como la interfaz de FreeCAD se basa en el moderno toolkit Qt, su diseño es de última generación. Los Widgets, menús, barras de herramientas y demás elementos se pueden modificar, mover o compartir entre los diversos entornos de trabajo. Se puede establecer métodos abreviados de teclado, cambiarlos, y se pueden grabar y reproducir macros. Para acceder a la ventana de personalización se usa el menú Herramientas -> Personalizar:
La pestaña Comandos permite explorar todos los comandos de FreeCAD disponibles, organizados por categorias.
En Teclado, se pueden ver los atajos de teclado, o combinaciones rápidas de teclas, asociadas con cada comando de FreeCAD y, si se desea, modificar o asignar nuevas combinaciones a cualquier comando. Por ejemplo podrías utilizarlo si utilizas frecuentemente un entorno de trabajo concreto y deseas agilizar su uso con el teclado.
Las pestañas de Barras de herramientas y Toolbox bars permiten modificar las barras de herramientas existentes o crear tus propias barras de herramientas a medida.
La pestaña Macros te permite manejar las Macros que tengas guardadas.
Propiedades de objetos
Una propiedad es un pedazo de información, tal como un número o una cadena de texto, que se adjunta a un documento de FreeCAD o a un objeto en un documento. Las propiedades pueden ser vistas y modificadas (sólo si tienes permisos para ello) con el Editor de propiedades.
Las Propiedades juegan un papel muy importante en FreeCAD, ya que el programa fue concebido desde el principio para trabajar con objetos paramétricos, que son objetos definidos únicamente por sus propiedades.
En FreeCAD, los Archivos de guión para crear objetos personalizados por el usuario pueden tener propiedades de los siguientes tipos:
Boolean Float FloatList FloatConstraint Angle Distance Integer IntegerConstraint Percent Enumeration IntegerList String StringList Link LinkList Matrix Vector VectorList Placement PlacementLink Color ColorList Material Path File FileIncluded PartShape FilletContour Circle
Trabajando con los entornos
FreeCAD, al igual que muchas aplicaciones de diseño moderno, como [Revit] o [Catia], se basa en el concepto de entorno de trabajo. Un entorno de trabajo (o banco de trabajo) puede describirse como un conjunto de herramientas especialmente agrupadas para facilitar una determinada tarea. En un taller de muebles tradicionales, podríamos tener una mesa de trabajo para la persona que trabaja con madera, otra para el que trabaja con piezas de metal, y quizás una tercera para el individuo que monta todas las piezas juntas.
En FreeCAD se aplica el mismo concepto. Las herramientas se agrupan en entornos de trabajo de acuerdo con las tareas a las que se vinculan.
Actualmente tenemos disponibles los siguientes entornos de trabajo:
-
El entorno de Diseño de Piezas para construir piezas formadas por croquis
-
El Draft Module/es|entorno de Boceto para trabajar en bocetos 2D.
-
El entorno de Mallas para trabajar con mallas triangulares.
-
El entorno de Piezas para trabajar con piezas.
-
El entorno de Imágenes para trabajar con bitmap (imágenes de mapa de bits).
-
El entorno de Ray-tracing para trabajar con ray-tracing (rendering).
-
El Drawing Module/es|entorno de Dibujo para mostrar convenientemente su trabajo 3D en una hoja de dibujo 2D.
-
El entorno de Simulación de Robots para estudiar los movimientos de los robots.
-
El entorno del Croquizador para trabajar con croquis con restricciones geométricas.
-
El entorno de Arquitectura para trabajar con elementos arquitectónicos.
-
El entorno de OpenSCAD para interactuar con OpenSCAD y reparar el historial del modelo CSG
Hay nuevos entornos de trabajo en proceso de desarrollo, mantente atento!
Al cambiar de un entorno de trabajo a otro, las herramientas disponibles en el interfaz de usuario cambian. Las Barras de herramientas, barras de comandos y eventualmente otras partes de la interfaz cambian con el nuevo entorno de trabajo, aunque el contenido de la escena permanece inalterado. Podrías, por ejemplo, empezar a dibujar formas en 2D con el entorno de boceto, y después seguir trabajando sobre ellas con el entorno de Piezas.
El entorno de Malla
El entorno de mallas maneja mallas triangulares. Las mallas son un tipo especial de objeto 3D, compuesto por triángulos conectados por sus bordes y sus esquinas (también llamados vértices).
Un ejemplo de un objeto malla
Muchas aplicaciones 3D usan mallas como su objeto 3D básico, como sketchup, blender, maya o 3d studio max. Dado que las mallas son objetos muy simples, que contiene sólo los vértices (puntos), los bordes y las caras (triangulares), son muy fáciles de crear, modificar, dividir, estirar, y fácilmente se puede pasar de una aplicación a otra sin ningún tipo de pérdida. Además, ya que contienen datos muy sencillos, las aplicaciones 3D pueden manejar gran cantidad de mallas sin ningún problema. Por estas razones, las mallas son a menudo el tipo de objeto 3D de elección preferente en aplicaciones de tratamiento de películas, animación y creación de imágenes.
Sin embargo, en el ámbito de la ingeniería las mallas presentan una gran limitación: Son objetos muy básicos, sólo se compone de puntos, líneas y caras. Sólo están formados por superficies, y no tienen información de masas, por lo que no se comportan como sólidos. En una malla no hay forma directa de saber si un punto está dentro o fuera del objeto. Esto significa que todas las operaciones basadas en sólidos, como uniones o diferencias, son siempre un poco difíciles de realizar en mallas, y a menudo se producen errores.
Como FreeCAD es una aplicación de ingeniería, es evidente que preferimos trabajar con tipos de objetos 3D más "completos" ( o "inteligentes"), que puedan incorporar más información, tales como la masa, el comportamiento de sólidos, o incluso parámetros personalizados. El módulo de malla fue inicialmente creado para servir como "banco de pruebas", pero al ser capaz de leer, manipular y convertir mallas es también muy importante para FreeCAD. Muy a menudo, en tu flujo de trabajo, recibirás los datos 3D en formato de malla. Tendrás que manejar esos datos, analizarlos para detectar errores u otros problemas que impiden convertirlos en objetos más inteligentes, y, por último, convertirlos en esos objetos "más inteligentes", que podrán ser manejados por el Entorno de piezas.
Usando el módulo de Mallas
El módulo de mallas tiene actualmente una interfaz muy sencilla, todas sus funciones se agrupan en la entrada de menú Malla. Las operaciones más importantes que actualmente se puede hacer con las mallas son:
- Importar Mallas en varios formatos de archivo
- Exportar mallas en varios formatos de archivo
- Convertir objetos Piezas en mallas
- Analizar la curvatura, caras y comprobar si una malla puede convertirse con seguridad en un sólido
- Invertir las normales de las mallas
- Tapar agujeros en la malla
- Quitar caras de la malla
- Unión, intersección y diferencia de mallas
- Crear mallas primitivas, como cubos, esferas, conos o cilindros
- Cortar la malla a lo largo de una línea
Estas son sólo algunas de las operaciones básicas que en la actualidad están presentes en la interfaz del módulo de malla. Pero las mallas FreeCAD también pueden ser manejadas de muchas otras formas con archivos de guión.
El entorno de Pieza
Las capacidades CAD de FreeCAD se basan en el núcleo de OpenCasCade. El módulo de Piezas permite a FreeCAD utilizar y acceder a los objetos y funciones de OpenCascade. OpenCascade es un núcleo de CAD de nivel profesional, que cuenta con avanzadas capacidades de manipulación de geometría 3D y objetos. Los objetos Pieza, en contraste con los objetos Malla, son mucho más complejos y, por tanto, permiten operaciones mucho más avanzadas, como operaciones booleanas coherentes, historial de modificaciones y comportamiento paramétrico.
Ejemplo de entidades Pieza en FreeCAD
Las herramientas
Las herramientas del módulo Pieza están todas situadas en el menú Pieza, que aparece cuando se carga el módulo Piezas.
Primitivas
Estas son las herramientas para crear primitivas de objetos.
-
Caja: Dibuja una caja especificando sus dimensiones
-
Cono: Dibuja un cono especificando sus dimensiones
-
Cilindro: Dibuja un cilindro especificando sus dimensiones
-
Esfera: Dibuja una esfera especificando sus dimensiones
-
Toro: Dibuja un toro (anillo) especificando sus dimensiones
Modificando objetos
Estas son las herramientas para modificar los objetos existentes. Permiten seleccionar los objetos a modificar.
-
Operaciones Booleanas: Realiza operaciones Booleanas sobre los objetos
-
Fusión: Fusión (unión) de dos objetos
-
Intersección: Extrae la parte común (intersección) de dos objetos
-
Diferencia: Corta (resta) un objeto de otro
-
Extrusión: Extruye caras planas de un objeto
-
Redondear: Redondea las aristas de un objeto
-
Revolución: Crea un objeto haciendo que gire otro objeto alrededor de un eje
-
Sección: Crea una sección por la intersección de un objeto con un plano de sección
-
Chaflán: Crea un chaflán en las aristas de un objeto
-
Simetría: Crea una simetría de los objetos seleccionados alrededor de un plano de simetría dado
Operaciones Booleanas
Un ejemplo de unión (Fusión), intersección (Común) y diferencia (Quita)
Explicando conceptos
En la terminología OpenCascade, distinguimos entre primitivas geométricas y formas (topológicas). Una primitiva geométrica puede ser un punto, una línea, un círculo, un plano, etc, o incluso algunos tipos más complejos como una superficie o una curva B-Spline. Una forma puede ser un vértice, un borde, un alambre, una cara, un sólido o un compuesto de otras formas. Las primitivas geométricas no están hechas para ser visualizadas directamente en la escena 3D, sino que se utilizarán para la construcción de la geometría de las formas. Por ejemplo, un borde (forma, shape) puede construirse a partir de una línea o de un arco de círculo (primitivas).
Podríamos decir, para resumir, que las primitivas geométricas son bloques de construcción "inmateriales" (abstractos, "sin forma"), y las formas son la verdadera geometría espacial ("materializada") construida sobre ellas.
Para obtener una lista completa de todos ellos puedes ir a OCC documentation (Alternativa: sourcearchive.com) y búscar Geom_* (para la geometría) yTopoDS_* (para las formas). Allí también se puede leer más acerca de las diferencias entre las formas y los objetos geométricos. Ten en cuenta que, lamentablemente, la documentación oficial de OCC no está disponible en línea (se debe descargar un archivo) y está dirigida básicamente a los programadores, no a los usuarios finales. Pero posiblemente puedas encontrar allí información suficiente para iniciarse en esto.
Los tipos geométricos en realidad se puede dividir en dos grandes grupos: las curvas y superficies. A partir de las curvas (líneas, círculos, ...) se puede construir un borde, a partir de las superficies (plano, cilindro, ...) se puede construir una cara. Por ejemplo, la primitiva geométrica línea es ilimitada, es decir, se define por un vector de base y un vector de dirección, mientras que su representación como forma será algo limitado por un punto de inicio y otro de fin. Y, de modo similar, una caja - un sólido - puede ser creada con seis planos limitados.
A partir de un borde o una cara (formas) también se puede pasar a su contraparte como primitiva geométrica.
Así, a partir de las formas se pueden crear piezas muy complejas o, al revés, se pueden extraer todas las sub-formas de las que está hecha otra forma más compleja.
Archivos de guión
La estructura de datos más utilizada en el módulo de Piezas es el Tipo BRep de OpenCascade. Prácticamente todos los contenidos y los tipos de objeto del módulo de Piezas ya están disponibles para los archivos de guión con Python . Esto incluye primitivas geométricas, tales como la Línea y el Círculo (o arco), y toda la gama de TopoShapes, como vértices, bordes, alambres, caras, sólidos y compuestos. Cada uno de esos objetos puede ser creado de varios modos, y para algunos de tales objetos, especialmente los TopoShapes, también son posibles operaciones avanzadas, como la unión/diferencia/intersección booleana. Explore el contenido del módulo de Piezas, como se describe en la página Conceptos básicos de archivos de guión en FreeCAD, para saber más.
Ejemplos
Para crear un elemento línea pasa a la consola de Python y escribe:
import Part,PartGui
doc=App.newDocument()
l=Part.Line()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)
doc.addObject("Part::Feature","Line").Shape=l.toShape()
doc.recompute()
Vamos a ver paso a paso el anterior ejemplo en Python:
import Part,PartGui doc=App.newDocument()
Carga el módulo de piezas y crea un nuevo documento
l=Part.Line() l.StartPoint=(0.0,0.0,0.0) l.EndPoint=(1.0,1.0,1.0)
Line es, de hecho, un segmento de recta, por ello la asignación de los puntos de inicio y fin.
doc.addObject("Part::Feature","Line").Shape=l.toShape()
Esto añade un objeto del tipo pieza al documento y le asigna la forma de representación del segmento de línea a la propiedad 'Forma' del objeto agregado. Es importante entender aquí que se utilizó una primitiva geométrica (el Part.line) para crear un TopoShape a partir de la misma (el método toShape () ). En el documento sólo se pueden añadir formas. En FreeCAD, las primitivas geométricas se utilizan como "estructuras de soporte" para las formas.
doc.recompute()
Actualiza el documento. Esto también prepara la representación visual del nuevo objeto Parte.
Ten en cuenta que una línea se pueden crear especificando sus puntos de inicio y final directamente en el constructor, por ejemplo . Part.Line (punto1, punto2) o podemos crear una línea predeterminada y establecer sus propiedades después, como lo hicimos aquí.
Podemos crear un círculo de modo similar:
import Part
doc = App.activeDocument()
c = Part.Circle()
c.Radius=10.0
f = doc.addObject("Part::Feature", "Circle")
f.Shape = c.toShape()
doc.recompute()
Observa de nuevo: Se utilizó el círculo (primitiva geométrica) para construir una forma a partir de él. Por supuesto, después podemos seguir teniendo acceso a la geometría de nuestra construcción, haciendo:
s = f.Shape e = s.Edges[0] c = e.Curve
Aquí tomamos la forma de nuestro objeto f, después tomamos la lista de los bordes, en este caso sólo habrá uno porque hemos hecho toda la forma a partir de un solo círculo, así que tomamos sólo el primer elemento de la lista de bordes, y tomamos su curva. Cada borde tiene una curva, que es la primitiva geométrica en la que se sustenta.
Diríjete a la página Archivos de guión de topología de datos si quieres saber más.
El entorno de Dibujo
El módulo de Dibujo te permite poner en papel tu trabajo 3D. Es decir, sirve para poner vistas de tus modelos en una ventana 2D e insertar esas ventanas en un dibujo, por ejemplo una hoja con un formato, un título y tu logotipo y, finalmente, imprimir esa hoja. El módulo de Dibujo está en desarrollo y es más o menos una muestra de sus posibilidades!
Herramientas GUI
Estas son las herramientas para la creación, configuración y exportación de hojas de dibujo 2D
-
Abre SVG scalable vector graphic: Abre una hoja de dibujo previamente guardada en un archivo SVG
-
Nueva hoja de dibujo en formato A3: Crea una hoja de dibujo nueva a partir de la plantilla por defecto A3 de FreeCAD
-
Insertar una vista: Inserta una vista de los objetos seleccionados en la hoja de dibujo activa
-
Guardar hoja de dibujo: Guarda la hoja de dibujo actual como un archivo SVG
En la imagen se ven los principales elementos del módulo de Dibujo. El documento contiene un objeto forma (Schenkel) que queremos poner en papel. Para ello creamos una "Página". Una página se crea a partir de una plantilla, en este caso la plantilla "A3_apaisado". La plantilla es un documento SVG que puede contener la disposición habitual de tus dibujos, tu logotipo o los estándares que utilices.
En la página puedes insertar una o varias vistas. Cada vista tiene una posición en la página (Propiedades X, Y), un factor de escala (Propiedad escala) y propiedades adicionales. Cada vez que la página, o la vista, o el objeto referenciado cambia, la página se regenera y la visualización de la página se actualiza.
Archivos de guión
De momento, el interfaz (GUI) para el usuario final está poco desarrollado, por lo que los archivos de guión de la API son más interesantes. A continuación veremos ejemplos de cómo utilizar los archivos de guión de la API del módulo de Dibujo.
Ejemplo Simple
Lo primero, se necesitan los módulos Parte y Drawing:
import FreeCAD, Part, Drawing
Creamos una pequeña Pieza, como muestra
Part.show(Part.makeBox(100,100,100).cut(Part.makeCylinder(80,100)).cut(Part.makeBox(90,40,100)).cut(Part.makeBox(20,85,100)))
Proyección directa. G0 significa borde en arista, y G1 es continuidad de tangencia.
Shape = App.ActiveDocument.Shape.Shape [visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape) print "visible edges:", len(visibleG0.Edges) print "hidden edges:", len(hiddenG0.Edges)
Todo se proyecta sobre el plano Z:
print "Bnd Box shape: X=",Shape.BoundBox.XLength," Y=",Shape.BoundBox.YLength," Z=",Shape.BoundBox.ZLength print "Bnd Box project: X=",visibleG0.BoundBox.XLength," Y=",visibleG0.BoundBox.YLength," Z=",visibleG0.BoundBox.ZLength
Vector de proyección diferente
[visibleG0,visibleG1,hiddenG0,hiddenG1] = Drawing.project(Shape,App.Vector(1,1,1))
Projectar a SVG
resultSVG = Drawing.projectToSVG(Shape,App.Vector(1,1,1)) print resultSVG
En modo paramétrico
Se Crea la pieza
# Crea 3 cajas y un cilindro
App.ActiveDocument.addObject("Part::Box","Box")
App.ActiveDocument.Box.Length=100.00
App.ActiveDocument.Box.Width=100.00
App.ActiveDocument.Box.Height=100.00
App.ActiveDocument.addObject("Part::Box","Box1")
App.ActiveDocument.Box1.Length=90.00
App.ActiveDocument.Box1.Width=40.00
App.ActiveDocument.Box1.Height=100.00
App.ActiveDocument.addObject("Part::Box","Box2")
App.ActiveDocument.Box2.Length=20.00
App.ActiveDocument.Box2.Width=85.00
App.ActiveDocument.Box2.Height=100.00
App.ActiveDocument.addObject("Part::Cylinder","Cylinder")
App.ActiveDocument.Cylinder.Radius=80.00
App.ActiveDocument.Cylinder.Height=100.00
App.ActiveDocument.Cylinder.Angle=360.00
# Unión de 2 cajas y el cilíndro
App.activeDocument().addObject("Part::Fuse","Fusion")
App.activeDocument().Fusion.Base = App.activeDocument().Cylinder
App.activeDocument().Fusion.Tool = App.activeDocument().Box1
App.activeDocument().addObject("Part::Fuse","Fusion1")
App.activeDocument().Fusion1.Base = App.activeDocument().Box2
App.activeDocument().Fusion1.Tool = App.activeDocument().Fusion
# Eliminar los elementos unidos anteriormente con la primera caja
App.activeDocument().addObject("Part::Cut","Shape")
App.activeDocument().Shape.Base = App.activeDocument().Box
App.activeDocument().Shape.Tool = App.activeDocument().Fusion1
# Ocultar todas las formas intermedias Gui.activeDocument().Box.Visibility=False Gui.activeDocument().Box1.Visibility=False Gui.activeDocument().Box2.Visibility=False Gui.activeDocument().Cylinder.Visibility=False Gui.activeDocument().Fusion.Visibility=False Gui.activeDocument().Fusion1.Visibility=False
Inserta un objeto página (Page object), y le asigna una plantilla
App.activeDocument().addObject('Drawing::FeaturePage','Page')
App.activeDocument().Page.Template = App.getResourceDir()+'Mod/Drawing/Templates/A3_Landscape.svg'
Crea una vista del objeto "forma", define la posicion y la escala, y la asigna a la Página
App.activeDocument().addObject('Drawing::FeatureViewPart','View')
App.activeDocument().View.Source = App.activeDocument().Shape
App.activeDocument().View.Direction = (0.0,0.0,1.0)
App.activeDocument().View.X = 10.0
App.activeDocument().View.Y = 10.0
App.activeDocument().Page.addObject(App.activeDocument().View)
Crea una segunda vista del mismo objecto, pero esta vez la vista está girada 90 grados.
App.activeDocument().addObject('Drawing::FeatureViewPart','ViewRot')
App.activeDocument().ViewRot.Source = App.activeDocument().Shape
App.activeDocument().ViewRot.Direction = (0.0,0.0,1.0)
App.activeDocument().ViewRot.X = 290.0
App.activeDocument().ViewRot.Y = 30.0
App.activeDocument().ViewRot.Scale = 1.0
App.activeDocument().ViewRot.Rotation = 90.0
App.activeDocument().Page.addObject(App.activeDocument().ViewRot)
Crea una tercera vista del mismo objeto, pero en proyección isométrica. Se activa también la ocultación de líneas.
App.activeDocument().addObject('Drawing::FeatureViewPart','ViewIso')
App.activeDocument().ViewIso.Source = App.activeDocument().Shape
App.activeDocument().ViewIso.Direction = (1.0,1.0,1.0)
App.activeDocument().ViewIso.X = 335.0
App.activeDocument().ViewIso.Y = 140.0
App.activeDocument().ViewIso.ShowHiddenLines = True
App.activeDocument().Page.addObject(App.activeDocument().ViewIso)
Cambiamos algo, y actualizamos. Se regenera la vista y la página.
App.activeDocument().View.X = 30.0 App.activeDocument().View.Y = 30.0 App.activeDocument().View.Scale = 1.5 App.activeDocument().recompute()
Accediendo a los datos y las partes
Obtiene el fragmento de SVG de una sola vista
ViewSVG = App.activeDocument().View.ViewResult print ViewSVG
Obtiene la página de resultados completa (Es un archivo en el directorio de archivos temporales, con permisos de solo lectura)
print "Resulting SVG document: ",App.activeDocument().Page.PageResult file = open(App.activeDocument().Page.PageResult,"r") print "Result page is ",len(file.readlines())," lines long"
Importante: Liberar el archivo!
del file
Inserta una vista con tu propio contenido:
App.activeDocument().addObject('Drawing::FeatureView','ViewSelf')
App.activeDocument().ViewSelf.ViewResult = """<g id="ViewSelf"
stroke="rgb(0, 0, 0)"
stroke-width="0.35"
stroke-linecap="butt"
stroke-linejoin="miter"
transform="translate(30,30)"
fill="#00cc00"
>
<ellipse cx="40" cy="40" rx="30" ry="15"/>
</g>
"""
App.activeDocument().Page.addObject(App.activeDocument().ViewSelf)
App.activeDocument().recompute()
del Shape,ViewSVG, resultSVG
Eso da como resultado lo siguiente:
Plantillas
FreeCAD viene con un juego de plantillas básico, pero se pueden obtener más en la página Drawing templates/es.
El entorno de Renderizado
Este módulo está destinado a trasladar el contenido de la escena a un Programa de renderizado externo, para la generación de imágenes fotorrealistas de tu trabajo. El módulo Raytracing (de trazado de rayos) se encuentra todavía en fase muy temprana de elaboración, así que por ahora no tiene muchas opciones disponibles. De momento, sólo está implementado un conjunto básico de herramientas para exportar objetos Piezas como archivos POV-ray. Los archivos pueden ser cargados en POV-ray y renderizados.
Herramientas GUI
Estas son las herramientas para exportar tu trabajo 3D a aplicaciones de renderizado externas
-
Nuevo proyecto de PovRay: Inserta un nuevo proyecto de PovRay en el documento
-
Exportar vista a PovRay: Escribe la vista 3D activa con la cámara y todo su contenido en un archivo de PovRay
-
Exportar cámara a PovRay: Exporta la posición de la cámara de la vista 3D activa a un archivo con formato de PovRay
-
Exporar pieza a PovRay: Escribe la pieza seleccionada (objeto) como un archivo de PovRay
Exportar una Vista
La manera mas fácil es exportar la vista 3D actual y todo su contenido a un archivo de Povray. Primero, se debe crear o cargar un modelo CAD y definir la orientación deseada para la vista 3D. Despues, elegir "Exportar Vista..." en el menú Renderizado.
Pedirá un sitio para guardar el archivo *.pov resultante. Despues, ya se podrá abrir el fichero en Povray y renderizar:
Como es normal en un programa de renderizado, se pueden lograr magníficas imágenes:
Archivos de guión
Veamos ahora como usar esas herramientas desde Python:
import Raytracing,RaytracingGui
OutFile = open('C:/Documents and Settings/jriegel/Desktop/test.pov','w')
OutFile.write(open(App.getResourceDir()+'Mod/Raytracing/Templates/ProjectStd.pov').read())
OutFile.write(RaytracingGui.povViewCamera())
OutFile.write(Raytracing.getPartAsPovray('Box',App.activeDocument().Box.Shape,0.800000,0.800000,0.800000))
OutFile.close()
del OutFile
Enlaces
Sobre POV-Ray:
- http://www.spiritone.com/~english/cyclopedia/
- http://www.povray.org/
- http://es.wikipedia.org/wiki/POV-Ray
Actualmente existe un nuevo entorno de renderizado en desarrollo para soportar múltiples back-ends de renderizado como Lux y Yafaray. Puedes ver información para utilizar la versión en desarrollo en el Proyecto de Render
Para consultar el estado del desarrollo del módulo de Render puedes mirar el Proyecto de Raytracing.
Otros programas de código abierto de renderizado (para su implementación futura):
El entorno de Imágenes
El módulo Imagen gestiona distintos tipos de imágenes de bitmaps, y te permite abrirlos en FreeCAD. En la actualidad, el módulo permite abrir en una ventana de visualización aparte los formatos .bmp,.jpg,.png y xpm. También hay una herramienta que permite capturar una imagen de una webcam.
El entorno de Croquizado
El entorno de Boceto permite dibujar rápidamente objetos 2D simples en el documento actual, y ofrecer diversas herramientas para poderlas modificar después. Algunas de dichas herramientas también funcionan sobre otros objetos de FreeCAD, no sólo en los creados con el entorno de Boceto. También proporciona un completo sistema de ajuste, y varias utilidades para manejar objetos y configuraciones.
Dibujando objetos
Estas son las herramientas para crear objetos.
-
Línea de 2 puntos: Dibuja un segmento de línea entre 2 puntos
-
Polilínea (Línea de múltiples puntos): Dibuja una polilínea compuesta por múltiples segmentos de línea
-
Circunferencia: Dibuja una circunferencia a partir de su centro y radio
-
Arco: Dibuja un segmento de arco a partir de su centro, radio ángulo de inicio y ángulo final
-
Rectángulo: Dibuja un rectángulo a partir de 2 puntos de su diagonal
-
Polígono: Dibuja un polígono regular a partir del centro y radio de la circunferencia que lo circunscribe
-
BSpline: Dibuja una B-Spline a partir de una serie de puntos
-
Texto: Dibuja una anotación de múltiples líneas de texto
-
Cota: Dibuja una cota dimensional
-
Punto: Inserta un objeto punto
Modificando objetos
Estas son las herramientas para la edición de los objetos existentes. Trabajan sobre los objetos seleccionados, pero si no hay ningún objeto seleccionado, permiten seleccionar uno.
-
Desplazar: Desplaza objeto(s) desde una ubicación a otra
-
Girar: Gira objeto(s) desde un ángulo de inicio a un ángulo final
-
Equidistancia: Mueve segmentos de un objeto a cierta distancia
-
Promocionar: Une objetos en un objeto de nivel superior
-
Degradar: Descompone objetos en objetos de nivel inferior
-
Recortar/Extender: Recorta o extiende un objeto
-
Escalar: Escala los objetos seleccionados alrededor de un punto base
-
Editar: Edita un objeto seleccionado
-
Dibujar: Escribe los objetos seleccionados en una Hoja de dibujo
-
Shape 2D View: Crea un objeto 2D que es la vista 2D proyectada de otro objeto 3D
-
Contorno a BSpline: Convierte un contorno a BSpline y viceversa
-
Añadir punto: Añade un punto a un contorno o una BSpline
-
Borrar punto: Borra un punto de un contorno o BSpline
-
Boceto a croquis: Convierte un objeto de Boceto a Croquis y viceversa
-
Matriz: Crea una matriz polar o rectangular a partir de los objetos seleccionados
-
Clonar: Clona los objetos seleccionados
Herramientas de utilidad
Herramientas adicionales disponibles desde el menú contextual del botón derecho del ratón, dependiendo de los objetos seleccionados.
-
Establecer plano de trabajo: Establece un plano de trabajo a partir de una vista estándar o una cara seleccionada
-
Línea final: Termina el dibujo del contorno o BSpline actual, sin cerrarlo
-
Línea de cierre: Termina el dibujo del contorno o BSpline actual, cerrándolo
-
Deshacer línea: Deshace el último segmento de línea
-
Conmutar modo de construcción: Conmuta el modo de construcción del Boceto activado / desactivado
- File:Draft ToggleContinueMode.png Conmutar modo continuo: Conmuta el modo continuo de Boceto activado / desactivado
-
Aplicar estilo: Aplica el estilo actual y el color a los objetos seleccionados
-
Conmuta el modo de visualización: Alterna el modo de visualización de los objetos seleccionados entre "líneas planas" y "alámbrico"
-
Añadir a grupo: Añade rápidamente los objetos seleccionados a un grupo existente
-
Seleccionar contenido de grupo: Selecciona el contenido de un grupo seleccionado
-
Conmutar ajuste: Conmuta el ajuste a objetos activado / desactivado
-
Conmutar rejilla: Conmuta la rejilla del Boceto activado / desactivado
-
Mostrar barra de ajuste: Muestra / oculta la barra de herramientas de ajuste del Boceto
Formato de archivos
El módulo de Boceto proporciona a FreeCAD importadores y exportadores para los siguientes formatos de archivo:
- Autodesk .DXF: Importa y exporta archivos Drawing Exchange Format creados con otras aplicaciones de CAD 2D
- SVG (como geometría): Importa y exporta archivos Scalable Vector Graphics creados con aplicaciones de dibujo vectoriales
- Open Cad format .OCA: Importa y exporta archivos OCA/GCAD, un potencialmente nuevo formato de archivo abierto para CAD
- Airfoil Data Format .DAT: Importa archivos DAT describiendo Airfoil perfiles
Características adicionales
- Ajuste: Permite colocar los nuevos puntos en lugares especiales de los objetos existentes
- Restricciones: Permite situar los puntos nuevos horizontal o verticalmente respecto a puntos previos
- Trabajando con coordenadas manualmente: Permite introducir coordenadas manualmente, en lugar de indicarlas en la pantalla
Configuración de preferencias
- El módulo de croquizado también tiene su pantalla de preferencias
Archivos de guión
El módulo de Boceto incorpora una API completa de modo que puedes utilizar sus funciones en archivos de guión y macros
Archivos de guión y macros
Macros
Las macros son una forma cómoda de crear acciones complejas en FreeCAD. Simplemente graba las acciones a medida que las haces, a continuación, lo guardas con un nombre, y las podrás reproducir siempre que lo desees. Dado que las macros son en realidad una lista de comandos de Python, también puedes editar y crear archivos de guión (scrips) o secuencias de comandos muy complejos.
¿Cómo funciona?
Si habilitas la salida en consola (Menú Editar -> Preferencias -> Macro -> Mostrar comandos de archivos de guión en la consola de Python), verás que en FreeCAD, cada acción que hacemos, como presionar un botón, da como salida un comando Python. Esos comandos son lo que se pueden grabar en una macro. La principal herramienta para la grabación de las macros es la barra de herramientas de macros:
. En ella tienes 4 botones: Grabar, detener la grabación, editar y reproducir la macro actual.
Es muy sencillo de utilizar: Presiona el botón de grabación, se pedirá que le asignes un nombre a tu macro, a continuación, realizar algunas acciones. Cuando termines, haz clic en el botón Detener grabación, y tus acciones se guardarán. Ahora puedes acceder al letrero de diálogo de macro con el botón de edición:
Allí puedes manejar tus macros, eliminar, editar o crear otras nuevas desde cero. Si editas una macro, esta se abrirá en una ventana del editor donde se pueden realizar cambios en su código.
Ejemplo
Pulsa el botón de grabar, dale un nombre, digamos "cilindro de 10x10, entonces, en el Entorno de Pieza, crea un cilindro con radio = 10 y altura = 10. A continuación, pulsa el botón "Detener la sesión de grabación de la macro". En el letrero de diálogo de edición macros, puedes ver el código Python que se ha registrado, y, si lo deseas, realizar modificaciones en él. Para ejecutar la macro, basta con pulsar el botón de ejecutar en la barra de herramientas mientras la macro se encuentra en el editor. Tu macro siempre se guarda en el disco, por lo que cualquier cambio que hagas, o cualquier macro nueva que crees, siempre estará disponible la próxima vez que inicies FreeCAD.
Personalización
Por supuesto que no es práctico cargar una macro en el editor con el fin de usarla. FreeCAD proporciona formas mucho mejores de iniciar la macro, como la asignación de un atajo de teclado, o poner una entrada en el menú. Una vez que la macro se crea, todo esto se puede hacer a través de menú -> Herramientas -> Personalizar:
Así puedes hacer que tu macro se convierta en una auténtica herramienta, al igual que cualquier herramienta estándar de FreeCAD. Esto, sumado a la potencia de Python en FreeCAD, permite añadir fácilmente tus propias herramientas a la interfaz. Sigue leyendo en la página del Centro de usuarios avanzados si quieres saber más sobre los archivos de guión en lenguaje Python ...
Creación de macros sin grabar
También puedes copiar/pegar directamente código python en una macro, sin grabar acciones de la interfaz gráfica de usuario. Basta con crear una nueva macro, editarla, y pegar el código. A continuación, puedes guardar la macro del mismo modo que se guarda un documento de FreeCAD. La próxima vez que se inicie FreeCAD, la macro aparecerá bajo el apartado "Macros instaladas" del menú Macro.
Repositorio de Macros
Visita la página Recetas de macros para recoger algunas macros útiles para añadir a tu instalación de FreeCAD.
Introducción a Python
Este es un pequeño tutorial hecho para quien sea nuevo en Python. Python es un lenguaje de programación de código abierto y multiplataforma. Python tiene varias características que lo hacen muy diferente de otros lenguajes de programación comunes, y es muy accesible para usuarios nuevos como tu:
- Se ha diseñado especialmente para ser fácil de leer por los seres humanos, por lo que es muy fácil de aprender y comprender.
- Se interpreta, es decir, a diferencia de lenguajes compilados como C, tu programa no necesitan ser compilado antes de ser ejecutado. El código que escribas podrá ser ejecutado, línea por línea si así lo deseas. Esto hace que sea muy fácil de aprender y de encontrar errores en su código, ya que va despacio, paso a paso.
- Puede ser integrado en otros programas para ser utilizado como lenguaje de archivos de guión. FreeCAD tiene un intérprete de Python integrado, por lo que se puede escribir código Python en FreeCAD, que manipulará partes de FreeCAD, por ejemplo para crear la geometría. Esto es extremadamente potente, porque en lugar de simplemente pulsar un botón "crear esfera", que un programador ha puesto allí para ti, tienes la libertad de crear fácilmente tu propia herramienta para crear exactamente la geometría que desees.
- Es extensible, puedes conectar fácilmente nuevos módulos en tu instalación de Python y extender su funcionalidad. Por ejemplo, tiene módulos que permiten a Python leer y escribir imágenes jpg, comunicarse con Twitter, programar las tareas a realizar por el sistema operativo, etc.
Así que, ¡manos a la obra! Ten en cuenta que lo que viene ahora es una introducción muy simple, de ningún modo un completo tutorial. Pero espero que después, tengas la base suficiente para explorar más profundamente en las interioridades de FreeCAD.
El intérprete
Por lo general, cuando escribes programas de ordenador, abres un editor de texto o tu entorno de programación favorito (que en la mayoría de los casos constará de un editor de texto con varias herramientas a su alrededor), escribes tu programa, a continuación, lo compilas y lo ejecutarás. La mayoría de las veces habrás cometido errores al escribir, así que tu programa no funcionará, y recibirás un mensaje de error diciendo lo que salió mal. Entonces regresarás a tu editor de texto, corregirás los errores, ejecutarás de nuevo, y así sucesivamente hasta que el programa funcione bien.
Todo este proceso se puede hacer, en Python, de forma transparente dentro del intérprete de Python. El intérprete es una ventana de Python con un símbolo del sistema, donde puedes simplemente escribir código Python. Si instalas en su ordenador Python (descargarlo desde su website si estás en Windows o Mac, o instalar desde el repositorio de paquetes si estás en linux), tendrás un intérprete Python en el menú de inicio. Pero FreeCAD también tiene un intérprete de Python en su parte inferior:
El intérprete muestra la versión de Python, y luego el símbolo >>>, que es el símbolo del sistema, es decir, donde se introduce el código Python. Escribir código en el intérprete es simple: una línea es una instrucción. Al pulsar Intro, tu línea de código se ejecutará (después de ser compilado de modo instantáneo e invisible). Por ejemplo, trata de escribir esto:
print "hola"
print es una palabra clave especial de Python que significa, obviamente, imprimir algo en la pantalla. Al pulsar Intro, la operación se ejecuta, y el mensaje "hola" se imprime. Si cometes un error, por ejemplo vamos a escribir:
print hola
Python nos dirá que no sabe lo que es hola. El caracter " especifica que el contenido es una cadena, que es simplemente, en la jerga de programación, un pedazo de texto. Sin el signo ", el comando de impresión cree que hola no era un trozo de texto, sino una palabra clave especial de Python. Lo importante es, que inmediatamente se notifica que has cometido un error. Al pulsar la flecha hacia arriba (o, en el intérprete FreeCAD, CTRL + flecha hacia arriba), puedes volver a la última orden que has escrito y corregirlo.
el intérprete de Python también incorpora un sistema de ayuda. Prueba a escribir:
help
o, por ejemplo, supongamos que no entendemos lo que salió mal con nuestro comando anterior: print hola. queremos obtener información específica sobre el comando "print":
help("print")
Entonces obtendrás una descripción más larga y completa de todo lo que el comando print puede hacer.
Ahora dominamos por completo nuestro intérprete, y podemos empezar con cosas serias.
Variables
Por supuesto, imprimir "hola" no es muy interesante. Más interesante es la impresión de cosas que no conocía antes, o dejar que Python las busque para ti. Ahí es donde el concepto de variable entra en juego. Una variable es simplemente un valor que se almacenan bajo un nombre. Por ejemplo, escribe lo siguiente:
a = "hola" print a
Supongo que entiendes lo que ocurrió, "guardaste" la cadena "hola" con el nombre a. Ahora, a ya no es un nombre desconocido más! Podemos utilizarlo en cualquier lugar, por ejemplo, en el comando de impresión. Podemos usar cualquier nombre que desees, respetando unas simples normas , como no usar espacios ni puntuación. Por ejemplo, podríamos escribir:
hola = "mi propia versión de hola" print hola
¿Ves? ahora hola no es una palabra indefinida más. ¿Qué pasa si, por una mala suerte terrible, elegiste un nombre que ya existe en Python? Supongamos que queremos almacenar nuestra cadena con el nombre de "print":
print = "hola"
Python es muy inteligente y nos dirá que esto no es posible. Tiene algunas palabras clave "reservadas" que no se pueden modificar. Pero nuestras propias variables pueden ser modificadas en cualquier momento, eso es exactamente por lo qué se llaman variables, los contenidos pueden variar. Por ejemplo:
miVariable = "hola" print miVariable miVariable = "adios" print miVariable
Hemos cambiado el valor de miVariable. También podemos copiar variables:
var1 = "hola" var2 = var1 print var2
Ten en cuenta que es interesante dar buenos nombres para las variables, ya que cuando vayas a escribir programas largos, después de un tiempo no te acordarás de para que era su variable llamada "a". Pero si la llamas, por ejemplo miMensajeBienvenida, cuando vuelvas a verlo recordarás fácilmente para que se utiliza.
Números
Por supuesto, debes saber que la programación es útil para tratar todo tipo de datos, y los números en especial, no sólo cadenas de texto. Una cosa es importante, Python debe saber con que tipo de datos está tratando. Vimos en nuestro ejemplo print hola, que el comando de impresión print reconoció nuestro cadena "hola". Eso se debe a que mediante el caracter ", le dijimos específicamente al comando de impresión print que lo que vendría después era una cadena de texto.
Siempre se puede comprobar que tipo de datos contiene una variable con la palabra clave especial de python: Type()
myVar = "hola" type(myVar)
Nos dirá el contenido de myVar es "str", o una cadena en la jerga de python. Tenemos también otros tipos de datos, como números enteros y números en coma flotante:
firstNumber = 10 secondNumber = 20 print firstNumber + secondNumber type(firstNumber)
Esto ya es mucho más interesante, ¿no? Ahora ya tenemos una potente calculadora! Mira bien cómo funciona, Python sabe que el 10 y 20 son números enteros. Así que se almacenan como "int", y Python puede hacer con ellos todo lo que puede hacer con números enteros. Mira los resultados de este:
primerNumero = "10" secondNumber = "20" print primerNumero + secondNumber
¿Ves? Estamos obligando a Python a considerar que nuestras dos variables no son números sino simples piezas de texto. Python puede unir dos fragmentos de texto en conjunto, pero no va a tratar de calcular el resultado de la suma. Pero estábamos hablando de números enteros. También hay números en coma flotante. La diferencia es que los números enteros no tienen parte decimal, mientras que los números en coma flotante pueden tener una parte decimal:
var1 = 13 var2 = 15.65 print "var1 is of type ", type(var1) print "var2 is of type ", type(var2)
Int and Float pueden mezclarse sin problemas:
total = var1 + var2 print total print type(total)
Por supuesto que 'total' tiene decimales, ¿verdad? Por eso Python automáticamente decidió que el resultado es un float. En varios casos como éste, python decide automáticamente qué tipo dar al resultado. En otros casos no es así. Por ejemplo:
varA = "hola 123" varB = 456 print varA + varB
Esto nos dará un error, varA es un string y varB es un int, y Python no sabe que hacer. Pero podemos obligar a Python a convertir entre tipos:
varA = "hola" varB = 123 print varA + str(varB)
Ahora los dos son strings, la operación se puede hacer! Fíjate que convertimos en "string" a varB en el momento de implimir, peo no cambiamos VarB. Si quisieramos cambiar varB permanentemente en un string, necesitariamos hacer así:
varB = str(varB)
Tambien podemos usar int() y float() para convertir en int y float si queremos:
varA = "123" print int(varA) print float(varA)
Nota sobre comandos en Python
Habrás visto que en esta sección hemos usado el comando print de varias formas. Hemos impreso variables, sumas, varias cosas separadas por comas e incluso el resultado de otro comando Python como es type(). Tambien habrás notado que estos dos comandos:
type(varA) print type(varA)
dan exactamente el mismo resultado. Eso es porque estamos en un interprete, y todo es automáticamente impreso en la pantalla. Cuando escribamos programas mayores que corran fuera del interprete, no imprimirán automaticaemnte todo en la pantalla, por eso tendremos que usar el comando print. Pero desde ahora y hasta entonces, dejaremos de usar print aqui (iremos más rápido), de modo que escribiremos simplemente:
myVar = "hola amigos" myVar
Tambien habrás visto que muchos de los comandos (o palabras clave) de Python que hemos conocido, tiene paréntesis que le indican sobre que tienen que operar: type(), int(), str(), etc. La única excepción es el comando print, que de hecho no es una excepcion. Tambien funciona normalmente así: print("hola"), pero, como suele ocurrir, los programadores de Python hicieron una versión simplificada.
Listas
Otro tipo de dato interesante son las listas. Las listas son, simplemente, listas de otros datos. Del mismo modo que definimos una cadena de texto, string, usando " ", definimos listas usando [ ]:
myList = [1,2,3] type(myList) myOtherList = ["Bart", "Frank", "Bob"] myMixedList = ["hello", 345, 34.567]
Verás que pueden contener cualquier tipo de datos. Las listas son muy útiles porque pueden agrupar datos. Despues puede hacer muchas cosas con ellos, por ejemplo contarlos:
len(myOtherList)
u obtener un elemento de una lista:
myName = myOtherList[0] myFriendsName = myOtherList[1]
Como vés, mientras el comando len() devuelve el número total de elementos en una lista, sus posiciones en la lista empiezan en 0. El primer elemento en una lista está simepre en la posición 0. Así, en myOtherList, "Bob" estará en la posición 2. Se pueden hacer muchas cosas con listas, como se muestra en aquí, como es ordenar sus contenidos, añadir o quitar elementos.
Una cosa interesante y divertida para ti: Un string es, en realidad, una lista de caracteres! Intenta hacer esto:
myvar = "hello" len(myvar) myvar[2]
Normalmente, todo lo que puedes hacer con listas, también puede hacerse con strings.
Además de strings, ints, floats y lists, hay más tipos de datos incorporados, como son diccionarios, o puedes incluso crear tus propios tipos con clases.
Indentación
Un uso típico de las listas es el de ojearlas y hacer algo con cada elemento. Por ejemplo, mira esto:
alldaltons = ["Joe", "William", "Jack", "Averell"] for dalton in alldaltons: print dalton + " Dalton"
Aquí iteramos (es jerga de programación!) en nuestra lista con el comando "for ... in ..." y hacemos algo con cada uno de los elementos. Observa la especial sintaxis: el comando for termina con : lo que indica que lo que siga será un bloque de uno o más comandos.
Inmediatamente después de que metas la línea de comando terminada en : el cursor donde se meten los comandos cambia a ... lo que indica que Python ha visto la línea terminada en : y que lo que siga será parte de ella.
Cómo sabe Python cuantas de las siguientes líneas deben ser ejecutadas dentro del bucle for ... in ...?. Para eso, Python usa la indentación o indentado. Eso es que las siguientes líneas no empiezan inmediatamente al inicio del renglón. Se escibirán empezando con uno o varios espacios en blanco, o tabuladores. Otros leguajes de programación usan otros medios, como poner el bloque entre paréntesis, etc.
Mientras empieces las siguientes líneas con la misma indentación, serán consideradas como parte del mismo bloque for...in. Si empiezas una línea con dos espacios y la siguiente con 4, habrá un error. Para terminar, escribe otra línea, pero sin sangría, o simplemente pulsa Intro para salir del bloque for...in.
El indentado es estupendo, porque si los haces grandes (por ejemplo usando tabulador en lugar de espacios, porque es más grande), cuando se escribe un gran programa tendrás una visión clara de lo que se ejecuta dentro de cada cosa.
Veremos que muchos comandos distintos de los bloques for-in también puede tener sangría de código.
Los comandos for-in se pueden utilizar para muchas cosas que hay que hacer más de una vez. Por ejemplo se puede combinar con el comando range():
serie = range(1,11) total = 0 print "sum" for number in serie: print number total = total + number print "----" print total
O cosas mas complejas como esto:
alldaltons = ["Joe", "William", "Jack", "Averell"] for n in range(4): print alldaltons[n], " is Dalton number ", n
El comando range() tambien tiene la extraña particularidad de que comienza con 0 (si no se especifica el número de inicio) y que su último número será uno menos del número final que le indique. Esto es, por supuesto, para que trabaje bien con otros comandos Python. Por ejemplo:
alldaltons = ["Joe", "William", "Jack", "Averell"] total = len(alldaltons) for n in range(total): print alldaltons[n]
Otro interesante uso de los bloques indentados es con el comando if. If ejecuta el bloque de código solo si se cumple una determianda condición. Por ejemplo:
alldaltons = ["Joe", "William", "Jack", "Averell"] if "Joe" in alldaltons: print "We found that Dalton!!!"
Por supuesto, esto siempre imprimirá la primera frase. Pero trata de sustituir la segunda línea por:
if "Lucky" in alldaltons:
Entonces no se imprime nada. También podemos especificar una clausula else:
alldaltons = ["Joe", "William", "Jack", "Averell"] if "Lucky" in alldaltons: print "We found that Dalton!!!" else: print "Such Dalton doesn't exist!"
Funciones
Los comandos estandard de Python no son tantos. En la actual version de Python hay unos 30, y ya conocemos algunos de ellos. ¿Pero, imagina que pudieramos inventar nuestros propios comandos? Pues podemos, y es sumamente fácil. De hecho, la mayoría de los módulos adicionales que puedes cargar en su instalación hacen eso. Añaden comandos que puedes usar. Un comando de usuario en Python se llama función y se crean así:
def printsqm(myValue): print str(myValue)+" square meters" printsqm(45)
Muy simple: el comando def() define una nueva función. Le da un nombre, y dentro del paréntesis define argumentos que usará en su función. Los Argumentos son datos que le pasará a la función.
Por ejemplo, mira el comando len(). Si escribes solo len(), Python te dirá que falta un argumento. Es decir, desea len () de algo, ¿no? Entonces, por ejemplo, si escribes len (myList) obtendrás la longitud de myList. myList es un argumento que se pasa a la función len (). la función len () está definida de tal manera que sepa qué hacer con lo que se le pasa. Lo mismo que hicimos aquí.
El nombre "myValue" puede ser cualquier cosa, y sólo será utilizado dentro de la función. Es sólo un nombre que se le asigna al argumento para que puedas hacer algo con él, pero también sirve para que la función sepa cuantos argumentos debe esperar. Por ejemplo, si haces esto:
printsqm(45,34)
Habrá un error. Nuestra función fue programada para recibir un solo argumento, pero recibió dos, 45 y 34. En su lugar, podríamos hacer algo como esto:
def sum(val1,val2): total = val1 + val2 return total
sum(45,34) myTotal = sum(45,34)
Hicimos una función que recibe dos argumentos, los suma, y devuelve ese valor. Devolver algo es muy útil, porque podemos hacer algo con el resultado, como almacenarlo en la variable myTotal. Por supuesto, ya que estamos en el intérprete y todo lo que hacemos se imprime, haciendo:
sum(45,34)
se imprimirá el resultado en la pantalla, pero fuera del intérprete nada aparece en la pantalla (ya que no hay comando de impresión dentro de la función). Tendrías que hacer:
print sum(45,34)
para que se imprima algo. Lee más sobre funciones aquí.
Módulos
Ahora que tenemos una buena idea de cómo funciona Python, necesitamos una última cosa: Cómo trabajar con archivos y módulos.
Hasta ahora, hemos escrito las instrucciones Python línea por línea en el intérprete. ¿Y si pudiéramos escribir varias líneas juntas, y ejecutarlas a la vez? Sin duda, sería más práctico para hacer cosas más complejas. Y también así podríamos salvar nuestro trabajo. Bueno, eso también es extremadamente fácil. Basta con abrir un editor de textos (como el Bloc de notas de Windows), y escribir tus líneas de Python, de la misma manera como las escribes en el intérprete, con indentación, etc. A continuación, guarda el archivo en alguna parte, preferentemente con una extensión .Py. Eso es todo, ya tienes un programa Python completo. Por supuesto, hay editores mucho mejores que el bloc de notas, pero esto es sólo para mostrar que un programa de Python no es más que un archivo de texto.
Para hacer a Python ejecutar ese programa, hay cientos de maneras. En Windows, simplemente haz clic derecho en el archivo, abrirlo con Python, y ejecutarlo. Pero también se puede ejecutar desde el intérprete de Python en sí. Para ello, el intérprete debe saber dónde está tu programa .Py. En FreeCAD, la forma más fácil es colocar su programa en un lugar que el intérprete de Python de FreeCAD sabe por defecto, como la carpeta bin de FreeCAD, o cualquiera de las carpetas Mod. Supongamos que escribes un archivo así:
def sum(a,b): return a + b
print "test.py succesfully loaded"
y lo guardas como test.py en el directorio /bin de FreeCAD. Ahora, vamos a iniciar FreeCAD, y en la ventana del intérprete, escribe:
import test
sin la extensión. py. Esto simplemente ejecuta el contenido del archivo, línea por línea, como si se hubiera escrito en el intérprete. La función suma se creará, y el mensaje se imprimirá. Pero hay una gran diferencia: el comando de importación sirve no sólo para ejecutar programas escritos en los archivos, como el nuestro, sino también para cargar las funciones que tienen en el interior, de modo que estén disponibles para el intérprete. Los archivos que contienen funciones, como la nuestra, se llaman módulos.
Normalmente cuando escribimos una función sum() en el intérprete, simplemente se ejecuta, así:
sum(14,45)
como hicimos antes. Al importar un módulo que contiene nuestra función sum(), la sintaxis es un poco diferente. Hacemos:
test.sum(14,45)
Es decir, el módulo se importa como un "contenedor", y todas sus funciones se encuentran dentro. Esto es muy útil, ya que puedes importar una gran cantidad de módulos, y mantener todo bien organizado. Así que, básicamente, Allá donde veas algo.algoMas, con un punto intermedio, lo que significa es que algoMas está dentro de algo.
También podemos sacar la parte test, e importar nuestra función sum() directamente en el espacio principal del intérprete, así:
from test import * sum(12,54)
Básicamente todos los módulos se comportan así. Importa un módulo, y ya puedes utilizar sus funciones así: module.function(argumento). Casi todos los módulos hacen eso: definen funciones, nuevos tipos de datos y clases que se pueden usar en el intérprete o en sus propios módulos de Python, porque nada impide que importes módulos dentro de tu módulo!
Una última cosa muy útil. ¿Cómo sabemos los módulos que tenemos, qué funciones se encuentran dentro y cómo utilizarlos (es decir, qué tipo de argumentos necesitan)? Vimos ya que Python tiene una función ayuda(). Si haces:
help() modules
Nos dará una lista de todos los módulos disponibles. Podemos ahora escribir q (de quit) para salir de la ayuda interactiva, e importar cualquiera de ellos. Incluso puedes navegar por su contenido con el comando dir()
import math dir(math)
Vamos a ver todas las funciones contenidas en el módulo de matemáticas, así como material extraño llamado __doc__, __file__, __name__. The __doc__ es extremadamente útil, es un texto de documentación. Cada función de un módulo (bien hecho) tiene un __doc__ que explica cómo usarlo. Por ejemplo, vemos que existe una función seno en el módulo de matemáticas. ¿Quieres saber cómo usarlo?
print math.sin.__doc__
Y por último una pequeña golosina más: Cuando trabajamos en la programación de un módulo, frecuentemente querremos probarlo. De modo que una vez que escribimos una pequeña parte del módulo, en un interprete de Python, hacemos algo parecido a esto, para probar nuestro nuevo código:
import myModule myModule.myTestFunction()
Pero que pasa si vemos que myTestFunction() no funciona correctamente? Volvemos a nuestro editor y lo modificamos. Luego, en lugar de cerrar y volver a abrir el interprete de Python, podemos simplemente actualizar el módulo así:
reload(myModule)
Empezando con FreeCAD
Bien, creo que debes tener una buena idea de cómo funciona Python, y puedes empezar a explorar lo que FreeCAD puede ofrecer. Las funciones Python de FreeCAD están todas bien organizadas en diferentes módulos. Algunos de ellos están ya cargados (importados) cuando inicias FreeCAD. Así, que simplemente haz
dir()
y sigue leyendo en Archivos de guión básicos en FreeCAD...
Por supuesto, aquí sólo hemos visto una pequeña parte del mundo de Python. Hay muchos conceptos relevantes que no hemos mencionado. En la red hay dos documentos muy importantes como referencia sobre Python:
Asegúrate de tener a mano estos enlaces!
Archivos de guión de Python en FreeCAD
FreeCAD está construido desde cero para que sea totalmente controlado por archivos de guión (scripts) de Python. Casi todas las partes de FreeCAD como la interfaz, el contenido de la escena, e incluso la representación de ese contenido en las vistas 3D, son accesibles desde el intérprete de Python incorporado, o desde sus propios archivos de guión. Como resultado, FreeCAD es, probablemente, una de las aplicaciones de diseño para ingeniería más personalizables de las disponibles en la actualidad.
En su estado actual, sin embargo, FreeCAD tiene muy pocos comandos "nativos" para interactuar con los objetos 3D. Sobre todo porque se encuentra todavía en una fase temprana de desarrollo, pero también porque la filosofía que hay detrás es más la de proporcionar una plataforma para el desarrollo CAD que una aplicación para un uso específico. Pero la facilidad de usar archivos de guión de Python dentro de FreeCAD probablemente ayudará a que pronto veamos funcionalidades nuevas que desarrollen los "usuarios avanzados", o, como de costumbre, los usuarios que conocen un poco de programación en Python. Python es uno de los lenguajes interpretados más populares, y debido a que es generalmente considerado como sencillo de aprender, tu también puedes estar proto creando tus propias macros de "usuario avanzado" sobre FreeCAD.
Si no estás familiarizado con Python, te recomendamos buscar tutoriales en Internet, y echar un rápido vistazo a su estructura. Python es un lenguaje muy fácil de aprender, sobre todo porque se puede ejecutar dentro de un intérprete, donde tanto comandos simples como programas completos pueden ejecutarse sobre la marcha, sin necesidad de compilar nada. FreeCAD ha incorporado un intérprete de Python. Si no ves la ventana denominada 'Consola de Python' como se muestra más abajo, puedes activarla en el menú Vista -> Vistas -> Consola de Python para mostrar el interprete.
El intérprete
Desde el intérprete puedes acceder a todos los módulos de Python instalados en el sistema, así como a los módulos de FreeCAD incorporados, y a todos los módulos adicionales de FreeCAD que puedas instalar más tarde. La imagen siguiente muestra el intérprete de Python:
También, puedes ejecutar código Python y navegar a través de las clases y funciones disponibles. FreeCAD proporciona un navegador de clases muy útil para la exploración de su nuevo mundo FreeCAD. Cuando se escribe el nombre de una clase conocida seguido de un punto (.) (significando que quieres añadir algo de esa clase), se abre una ventana del navegador de clases, donde se puede navegar entre las subclases y métodos disponibles. Cuando se selecciona algo, se mostrará un texto de ayuda asociado (si existe):
Así que, comienza por esto escribiendo App. o Gui. y verás qué pasa. Otra forma más genérica de exploración del contenido de los módulos y las clases de Python es usar el comando print dir(). Por ejemplo, escribiendo print dir() listará todos los módulos cargados en FreeCAD. print Dir(App) te mostrará todo el interior del módulo App, etc.
Otra característica útil del intérprete es la posibilidad de volver atrás en el historial de comandos y recuperar una línea de código que ya has escrito antes. Para navegar en el historial de comandos, sólo tienes que utilizar CTRL + flecha arriba o CTRL + flecha abajo.
Al hacer clic derecho en la ventana del intérprete también tienes otras opciones, tales como copiar todo el historial (útil para experimentar con algo, y luego hacer un archivo de guión con todo ello), o insertar el nombre de un archivo con su ruta completa.
Ayuda de Python
En el menú Ayuda de FreeCAD, encontrarás una entrada llamada "Módulos de Python", que abrirá una ventana que contiene una documentación completa, generada en tiempo real, de todos los módulos de Python a disposición del intérprete de FreeCAD, incluyendo Python y los módulos propios de FreeCAD, los módulos instalados por el sistema, y los módulos de FreeCAD adicionales. La documentación disponible depende del esfuerzo que cada desarrollador de los módulos puso en documentar su código pero, en general, los módulos de Python tienen la reputación de estar bastante bien documentados. Tu ventana de FreeCAD debe permanecer abierta para que este sistema de documentación funcione.
Módulos incorporados (Built-in)
Como FreeCAD está diseñado para poder ser ejecutado sin interfaz gráfica de usuario, casi toda su funcionalidad se separa en dos grupos: las funciones principales, llamado App, y la funcionalidad de la interfaz gráfica de usuario, llamado Gui. Así, nuestros dos principales módulos incorporados en FreeCAD se llaman App y Gui. Estos dos módulos también son accesibles desde fuera de los archivos de guiones de comandos del intérprete, con los nombres respectivos de FreeCAD y FreeCADGui.
- En el módulo App, encontrarás todo lo relacionado con la aplicación en sí, como los métodos para abrir o cerrar archivos, y lo relacionado con los documentos, como los ajustes del documento activo o listar su contenido.
- En el módulo Gui, encontrarás herramientas para la gestión de la interfaz gráfica de usuario y el acceso a sus elementos, como los entornos (workbench) y sus barras de herramientas y, más interesante, la representación gráfica de todo el contenido de FreeCAD.
Listar los contenidos de todos esos módulos es una tarea poco "productiva" ya que crecen muy rápido a lo largo del desarrollo de FreeCAD. Pero las dos herramientas de navegación (el navegador de clases y la ayuda de Python) te debería dar, en cualquier momento, una documentación actualizada y completa de estos módulos.
Los objetos App y los objetos GUI
Como hemos dicho, en FreeCAD, todo esta repartido entre el núcleo y la representación. Esto incluye también los objetos en 3D. Puedes acceder a la definición de propiedades de los objetos (llamadas características de FreeCAD) a través del módulo de la aplicación, y cambiar la forma en que están representados en la pantalla a través del módulo GUI. Por ejemplo, un cubo tiene propiedades que lo definen, como anchura, longitud, altura, que se almacenan en un objeto App, y las propiedades de la representación, como el color de las caras, modo de dibujo, que se almacenan en su correspondiente objeto GUI.
Esta forma de hacer las cosas permite una amplia gama de usos, como los algoritmos que sólo funcionan en la parte definitoria de características, sin la necesidad de ocuparse de ningun aspecto visual, o incluso redirigir el contenido del documento con la aplicación no-gráfica, como listas, hojas de cálculo o análisis de elementos.
Por cada objeto App de tu documento, existe su correspondiente objeto GUI. El documento en sí mismo, en realidad, también tiene objetos App y GUI. Esto, por supuesto, sólo es válido cuando se ejecuta FreeCAD con su interfaz completo. En la versión de línea de comandos, no existe interfaz gráfica de usuario, por lo que sólo habrá objetos App. Ten en cuenta que la parte de interfaz gráfica de usuario de los objetos se genera nuevamente cada vez que un objeto App se marca como "que se vuelven a calcular" (por ejemplo, cuando uno de sus parámetros ha cambiado), por lo que los cambios que podría haber hecho al objeto Gui directamente podrían perderse.
para acceder a la parte App de algo, escribe:
myObject = App.ActiveDocument.getObject("ObjectName")
donde "ObjectName" es el nombre de tu objeto. Tambien puedes poner:
myObject = App.ActiveDocument.ObjectName
para acceder la la parte GUI del mismo objeto, escribe:
myViewObject = Gui.ActiveDocument.getObject("ObjectName")
donde "ObjectName" es el nombre de tu objeto. También puedes escribir:
myViewObject = App.ActiveDocument.ObjectName.ViewObject
Si no tenemos GUI (por ejemplo en el modo de línea de comandos), la última línea no devolverá nada.
Los objetos de documento
En FreeCAD todo tu trabajo reside en el interior de los documentos. Un documento contiene la geometría y se pueden guardar en un archivo. Varios documentos se pueden abrir al mismo tiempo. El documento, al igual que la geometría contenidos en el interior, tiene objetos App y Gui. El objeto App contiene las definiciones de geometría real, mientras que el objeto Gui contiene los puntos de vista diferentes de tu documento. Puedes abrir varias ventanas, cada una mostrando tu trabajo con un factor de zoom diferente o un determinado punto de vista. Estas vistas forman parte del objeto Gui de tu documento.
Para acceder a la parte App del documento abierto actualmente (activo), teclea:
myDocument = App.ActiveDocument
Para crear un nuevo documento, teclea:
myDocument = App.newDocument("Document Name")
Para acceder a la parte GUI del documento abierto actualmente (active), teclea:
myGuiDocument = Gui.ActiveDocument
Para acceder a la vista actual, teclea:
myView = Gui.ActiveDocument.ActiveView
Utilizando módulos adicionales
Los módulos FreeCAD y FreeCADGui son exclusivamente responsables de la creación y mantenimiento de objetos en el documento de FreeCAD. Normalmente no hacen nada como crear o modificar geometría. Eso es porque esa geometría puede ser de diversos tipos, y así es manejada por módulos adicionales, cada uno responsable de manejar ciertos tipos de geometría. Por ejemplo, el Módulo de pieza utiliza el kernel de OpenCascade, y por tanto es capaz de crear y manipular geometría de tipo B-rep, la cual es para la que se ha construido OpenCascade. El Módulo de malla es capaz de construir y modificar objetos de malla. De ese modo, FreeCAD es capaz de manejar un amplio rango de tipos de objetos, que pueden coexistir todos en el mismo documento, y nuevos tipos se podrían añadir fácilmente en el futuro.
Creación de objetos
Cada módulo tiene su propio modo de tratar sus geometrías, pero algo que todos ellos normalmente pueden hacer es crear objetos en el documento. Pero el documento de FreeCAD es consciente de los tipos de objetos disponibles proporcionados por los módulos:
FreeCAD.ActiveDocument.supportedTypes()
listará todos los objetos que puedes crear. Por ejemplo, vamos a crear una malla (tratada por el módulo de malla) y una pieza (tratada por el módulo de pieza):
myMesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature","myMeshName")
myPart = FreeCAD.ActiveDocument.addObject("Part::Feature","myPartName")
El primer argumento es el tipo de objeto, el segundo el nombre del objeto. Nuestros dos objetos parecen casi lo mismo: Aún no contienen geometría, y la mayoría de sus propiedades son iguales cuando los inspeccionas con dir(myMesh) y dir(myPart). Excepto por una cosa, myMesh tiene una propiedad "Mesh" y "Part" tiene una propiedad "Shape". Eso es donde la malla y la pieza son almacenadas. Por ejemplo, vamos a crear una pieza de cubo y almacenarla en nuestro objeto myPart:
import Part cube = Part.makeBox(2,2,2) myPart.Shape = cube
Podrías probar almacenando el cubo dentro de la propiedad Mesh del objeto myMesh, devolverá un error quejándose de un tipo erróneo. Eso es porque dichas propiedades están creadas para almacenar sólo un cierto tipo. En la propiedad Mesh de myMesh, sólo puedes almacenar algo creado con el módulo de malla. Observa que la mayoría de módulos también tienen un atajo para añadir su geometría al documento:
import Part cube = Part.makeBox(2,2,2) Part.show(cube)
Modificando objetos
La modificación de un objeto se hace del mismo modo:
import Part cube = Part.makeBox(2,2,2) myPart.Shape = cube
Ahora vamos a cambiar la forma por una mayor:
biggercube = Part.makeBox(5,5,5) myPart.Shape = biggercube
Preguntando a los objetos
Siempre puedes mirar el tipo de un objeto así:
myObj = FreeCAD.ActiveDocument.getObject("myObjectName")
print myObj.Type
o saber si un objeto es derivado de uno de los básicos (característica de Pieza, característica de malla, etc):
print myObj.isDerivedFrom("Part::Feature")
Ahora puedes empezar a jugar con FreeCAD de verdad! Para ver lo que puedes hacer con el Módulo de pieza, lee la página Archivos de guión de Piezas, o la página Archivos de guión de mallas para trabajar con el Módulo de malla. Observa que, aunque los módulos de Pieza y Malla son los más completos y ampliamente utilizados, otros módulos como el Módulo de Boceto también tienen archivos de guión APIs que pueden ser útiles para ti. Para ver una lista completa de cada módulo y sus herramientas disponibles, visita la sección Category:API/es.
Introducción
En primer lugar tienes que importar el módulo Malla:
import Mesh
Después de eso, ya tendrás acceso al módulo Malla y la clase Malla, que ofrecen las funciones del nucleo FreeCAD C++ Mesh-Kernel.
Creación y Carga
Para crear un objeto malla vacío sólo tienes que utilizar el constructor estándar:
malla = Mesh.Mesh()
También puedes crear un objeto desde un archivo
malla = Mesh.Mesh ('D: / temp / Something.stl')
(Una lista de formatos de archivo compatibles se puede encontrar bajo 'Mallas' aquí.)
O también puedes crear la malla a partir de un conjunto de triángulos descrito por sus vértices:
planarMesh = [ # triangle 1 [-0.5000,-0.5000,0.0000],[0.5000,0.5000,0.0000],[-0.5000,0.5000,0.0000], #triangle 2 [-0.5000,-0.5000,0.0000],[0.5000,-0.5000,0.0000],[0.5000,0.5000,0.0000], ] planarMeshObject = Mesh.Mesh(planarMesh)
El núcleo de mallas, Mesh-Kernel, se encarga de crear una estructura topológica de datos correcta, ordenando conjuntamente los puntos coincidentes y los bordes.
Más adelante podrás ver cómo examinar y revisar los datos de la malla.
Modelado
Para crear geometrías regulares puedes utilizar el script de Python BuildRegularGeoms.py.
import BuildRegularGeoms
Esta secuencia de comandos proporciona métodos para definir cuerpos de revolución sencillos, como esferas, elipsoides, cilindros, toroides y conos. Y también tiene un método para crear un cubo simple. Para crear un toroide, por ejemplo, se puede hacer de la siguiente manera:
t = BuildRegularGeoms.Toroid(8.0, 2.0, 50) # list with several thousands triangles m = Mesh.Mesh(t)
Los dos primeros parámetros definen los radios del toroide y el tercer parámetro es un factor de submuestreo relacionado con el número de triángulos que se han de crear. Cuanto mayor sea este valor, más suave es la forma y mejor acabado tiene el cuerpo.
m1, m2 # are the input mesh objects m3 = Mesh.Mesh(m1) # create a copy of m1 m3.unite(m2) # union of m1 and m2, the result is stored in m3 m4 = Mesh.Mesh(m1) m4.intersect(m2) # intersection of m1 and m2 m5 = Mesh.Mesh(m1) m5.difference(m2) # the difference of m1 and m2 m6 = Mesh.Mesh(m2) m6.difference(m1) # the difference of m2 and m1, usually the result is different to m5
Por último, un ejemplo completo que calcula la intersección entre una esfera y un cilindro que corta a la esfera.
import Mesh, BuildRegularGeoms
sphere = Mesh.Mesh( BuildRegularGeoms.Sphere(5.0, 50) )
cylinder = Mesh.Mesh( BuildRegularGeoms.Cylinder(2.0, 10.0, True, 1.0, 50) )
diff = sphere
diff.difference(cylinder)
d = FreeCAD.newDocument()
d.addObject("Mesh::Feature","Diff_Sphere_Cylinder").Mesh=diff
d.recompute()
Examen y pruebas
Escribe tus propios algoritmos
Exportación
Puedes incluso escribir la malla en un módulo de Python:
m.write("D:/Develop/Projekte/FreeCAD/FreeCAD_0.7/Mod/Mesh/SavedMesh.py")
import SavedMesh
m2 = Mesh.Mesh(SavedMesh.faces)
Interfaces gráficas de usuario relacionadas
Ajustes y pruebas
Una extensa, aunque dificil de usar, librería de archivos de guión relacionados con mallas son los scripts de prueba del módulo Malla. En esta unidad, literalmente todos los métodos son invocados, y se ajustan todas las propiedades y atributos. Así que si eres lo suficientemente audaz, echa un vistazo al Módulo de prueba de unidades.
Esta página describe diversos métodos para crear y modificar formas de piezas desde Python. Antes de leer esta página, si eres nuevo en Python, es una buena idea leer la Introducción a Python y como funcionan los archivos de guión en FreeCAD.
Introducción
Aquí le explicamos cómo controlar el Módulo de Pieza directamente desde el intérprete de Python de FreeCAD, o desde cualquier archivo de guión externo. Asegúrate de navegar por la sección Archivos de guión y las páginas Conceptos básicos de archivos de guión en FreeCAD si necesitas más información acerca de cómo funcionan los archivos de guión de Python en FreeCAD.
Diagrama de clases
Ésta es una descripción Lenguaje Unificado de Modelado (UML) de las clases más importante del módulo de Pieza:
Geometría
Los objetos geométricos son la piedra angular de todos los objetos topológicos:
- geom clase base de los objetos geométricos
- line Una línea recta en 3D, definido por el punto de inicio y el punto final
- circle Círculo o segmento de círculo definido por un punto centro y los puntos de inicio y final
- ...... Y en breve más cosas ;-)
Topología
Los siguientes tipos de datos topológicos están disponibles:
- compound Un grupo de cualquier tipo de objetos topológicos.
- compsolid Un sólido compuesto es un grupo de sólidos concetados por sus caras. Es una extensión de las nociones de WIRE y SHELL en el ámbito de los sólido.
- solid Una región del espacio limitada por shells. Es tridimensional.
- shell Un conjunto de caras conectadas por sus bordes. Una shell puede ser abierta o cerrada.
- face En 2D es parte de un plano; en 3D es parte de una superficie. Su geometría está limitada por sus contornos. Es un ente bidimensional.
- wire Un grupo de bordes conectados por sus vértices. Puede tener un contorno abierto o cerrado, dependiendo que que sus bordes estén o no conectados.
- edge Un elemento topológico que corresponde a una curva limitada. Un borde está normalmente limitado por vértices. Es un ente unidimensional.
- vertex Un elemento topológico que se corresponde con un punto. Tiene dimensión cero.
- shape Un concepto genérico que abarca todos los anteriores.
Ejemplo rápido: Creación de topologías básicas
Crearemos ahora una topología por construcción de geometría simple. Como un caso de estudio utilizaremos una pieza como se puede ver en la imagen que consiste en cuatro vértices, dos circunferencias y dos líneas.
Creación de geometría
Primero tenemos que crear las distintas partes de la geometría de este contorno. Y tenemos que tener cuidado de que los vértices de las partes de la geometría están en la misma posición. De otro modo después podríamos no ser capaces de conectar las partes de la geometría en una topología!
Así que primero creamos los puntos:
from FreeCAD import Base V1 = Base.Vector(0,10,0) V2 = Base.Vector(30,10,0) V3 = Base.Vector(30,-10,0) V4 = Base.Vector(0,-10,0)
Arco
Para crear un arco de circunferencia crearemos puntos de ayuda y crearemos el arco a través de tres puntos:
VC1 = Base.Vector(-10,0,0) C1 = Part.Arc(V1,VC1,V4) # and the second one VC2 = Base.Vector(40,0,0) C2 = Part.Arc(V2,VC2,V3)
Línea
La línea puede crearse de forma muy simple a partir de los puntos:
L1 = Part.Line(V1,V2) # and the second one L2 = Part.Line(V4,V3)
Poniendo todo junto
El último paso es poner los elementos base de la geometría juntos y formar una forma topológica:
S1 = Part.Shape([C1,C2,L1,L2])
Crear un prisma
Ahora extruir el contorno en una dirección y crear una forma 3D real:
W = Part.Wire(S1.Edges) P = W.extrude(Base.Vector(0,0,10))
Mostrar todo
Part.show(P)
Creación de formas básicas
Puedes crear fácilmente objetos topológicos simples con los métodos "make...()" del Módulo Parte:
b = Part.makeBox(100,100,100) Part.show(b)
Otros métodos make...() disponibles:
- makeBox(l,w,h) -- construye una caja ubicada en p y apuntando en la dirección d con las dimensiones (l, w, h).
- makeCircle(radius) -- Hace un círculo con un radio dado.
- makeCone(radius1,radius2,height) -- Hace un cono con un radio y altura dados.
- makeCylinder(radius,height) -- Hace un cilindro con un radio y altura dados.
- makeLine((x1,y1,z1),(x2,y2,z2)) -- Hace una línea entre 2 puntos
- makePlane(length,width) -- Hace un plano con longitud y anchura dados.
- makePolygon(list) -- Hace un polígono con una lista de puntos
- makeSphere(radius) -- Hace una esfera con un radio dado.
- makeTorus(radius1,radius2) -- Hace un toro con sus radios dados.
Mira la página APIde piezas para una lista completa de los métodos disponibles del módulo de pieza.
Importing the needed modules
Primero tenemos que importar el módulo de piezas así podremos utilizar su contenido en Python. También importamos el módulo base desde dentro del módulo de FreeCAD:
import Part from FreeCAD import Base
Creación de un Vector
Los Vectores son una de las piezas de información más importantes cuando se construyen formas. Contienen 3 números normalmente (pero no necesariamente siempre) las coordenadas cartesianas X, Y y Z. Puedes crear un vector así:
myVector = Base.Vector(3,2,0)
Simplemente creamos un vector en las coordenadas X=3, Y=2, Z=0. En el módulo de pieza, los vectores se utilizan en todas partes. Las formas de las piezas también utilizan otro tipo de representaciones de punto, llamada Vértice, el cual en realidad no es más que un contenedor para un vector. Puedes acceder al vector de un vértice así:
myVertex = myShape.Vertexes[0] print myVertex.Point > Vector (3, 2, 0)
Creación de una arista
Un borde no es otra cosa mas que una linea entre dos vértices:
edge = Part.makeLine((0,0,0), (10,0,0)) edge.Vertexes >[<Vertex object at 01877430>, <Vertex object at 014888E0>]
Nota: También puedes crear una arista pasándole dos vértices.
vec1 = Base.Vector(0,0,0) vec2 = Base.Vector(10,0,0) line = Part.Line(vec1,vec2) edge = line.toShape()
Se puede determinar la longitud y el centro de un borde así:
edge.Length >10.0 edge.CenterOfMass >Vector (5, 0, 0)
Poniendo la forma en la pantalla
Hemos creado un objeto arista, pero no aparece en ninguna parte de la pantalla. Esto es porque simplemente manejamos objetos de Python aquí. La escena 3D de FreeCAD sólo muestra lo que le digas que se muestre. Para hacerlo, utilizamos este simple método:
Part.show(edge)
Un objeto se creará en nuestro documento de FreeCAD, y nuestra forma "edge" será atribuido a él. Utiliza esto si es momento para mostrar tu creación en la pantalla.
Creación de un contorno
Un contorno es una línea de múltiples aristas y se puede crear a partir de una lista de aristas, o incluso de una lista de contornos:
edge1 = Part.makeLine((0,0,0), (10,0,0)) edge2 = Part.makeLine((10,0,0), (10,10,0)) wire1 = Part.Wire([edge1,edge2]) edge3 = Part.makeLine((10,10,0), (0,10,0)) edge4 = Part.makeLine((0,10,0), (0,0,0)) wire2 = Part.Wire([edge3,edge4]) wire3 = Part.Wire([wire1,wire2]) wire3.Edges > [<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>, <Edge object at 0190A788>] Part.show(wire3)
Part.show(wire3) mostrará las 4 aristas que componen nuestro contorno. Otra información útil se puede recuperar fácilmente:
wire3.Length > 40.0 wire3.CenterOfMass > Vector (5, 5, 0) wire3.isClosed() > True wire2.isClosed() > False
Creación de una cara
Sólo serán válidas las caras creadas a partir de contornos cerrados. En este ejemplo, wire3 es un contorno cerrado pero wire2 no es un contorno cerrado (mira más arriba)
face = Part.Face(wire3) face.Area > 99.999999999999972 face.CenterOfMass > Vector (5, 5, 0) face.Length > 40.0 face.isValid() > True sface = Part.Face(wire2) face.isValid() > False
Sólo las caras tendrán un área, ni los contornos ni las aristas.
Creación de una circunferencia
Una circunferencia se puede crear de forma tan simple como esta:
circle = Part.makeCircle(10) circle.Curve > Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1))
Si deseas crearlo en cierta posición y con cierta dirección:
ccircle = Part.makeCircle(10, Base.Vector(10,0,0), Base.Vector(1,0,0)) ccircle.Curve > Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))
ccircle se creará a una distancia de 10 en el eje x desde el origen, y estará orientado hacia el eje x. Nota: makeCircle sólo acepta Base.Vector() para posición y normal, pero no admite tuplas. Tambien puedes crear una parte de una circunferencia dando su ángulo de inicio y fin, así:
from math import pi arc1 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 0, 180) arc2 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 180, 360)
Juntando arc1 y arc2 obtendremos una circunferencia. Los ángulos deberán indicarse en grados, si los tienes en radianes simplemente conviertelos según la fórmula: degrees = radians * 180/PI o usando el módulo Python de matemáticas (después de importarlo, obviamente):
degrees = math.degrees(radians)
Creación de un arco por varios puntos
Desafortunadamente no hay ninguna función makeArc pero tenemos la función Part.Arc para crear un arco a lo largo de tres puntos. Básicamente se puede suponer como un arco de unión entre el punto de partida y el punto final, pasando por el punto medio. Part.Arc crea un objeto arco en el que .toShape() tiene que ser llamado para obtener el objeto arista, del mismo modo como utilizamos Part.Line en lugar de Part.makeLine.
arc = Part.Arc(Base.Vector(0,0,0),Base.Vector(0,5,0),Base.Vector(5,5,0)) arc > <Arc object> arc_edge = arc.toShape()
Arc solo acepta puntos como Base.Vector() no acepta tuplas. arc_edge es lo que queremos que podemos mostrar utilizando Part.show(arc_edge). También puedes obtener un arco utilizando una porción de una circunferencia:
arc_edge es lo que queríamos conseguir, y podemos visualizar utilizando Part.show (arc_edge). Si desea una pequeña parte de un círculo como un arco, también es posible:
from math import pi circle = Part.Circle(Base.Vector(0,0,0),Base.Vector(0,0,1),10) arc = Part.Arc(c,0,pi)
Los arcos son aristas válidas, como las líneas. Así que también pueden utilizarse en los contornos.
Creación de un polígono
Un polígono es simplemente un contorno con múltiples aristas rectas. La función makePolygon toma una lista de puntos y crea un contorno a través de dichos puntos:
lshape_wire = Part.makePolygon([Base.Vector(0,5,0),Base.Vector(0,0,0),Base.Vector(5,0,0)])
Creación de un plano
Un plano es simplemente una superficie rectangular plana. El método utilizado para crear uno es este: makePlane(length,width,[start_pnt,dir_normal]). Por defecto start_pnt = Vector(0,0,0) y dir_normal = Vector(0,0,1). Utilizando dir_normal = Vector(0,0,1) crearemos el plano orientado hacia el eje Z, mientras que con dir_normal = Vector(1,0,0) crearemos el plano orientado hacia el eje X:
plane = Part.makePlane(2,2) plane ><Face object at 028AF990> plane = Part.makePlane(2,2, Base.Vector(3,0,0), Base.Vector(0,1,0)) plane.BoundBox > BoundBox (3, 0, 0, 5, 0, 2)
BoundBox es un prisma encerrando el plano con una diagonal empezando en (3,0,0) y terminando en (5,0,2). Aquí el espesor de BoundBox en el eje Y es cero, ya que nuestra forma es totalmente plana.
Nota: makePlane sólo acepta Base.Vector() para start_pnt y dir_normal pero no tuplas
Creación de una elipse
Para crear una elipse existen varios métodos:
Part.Ellipse()
Crea una elipse cuyo radio mayor es 2 y el radio menor 1 con centro en el (0,0,0)
Part.Ellipse(Ellipse)
Crea una copia de la elipse dada
Part.Ellipse(S1,S2,Center)
Crea una elipse centrada en el punto Center, donde el plano de la elipse está definido por Center, S1 y S2, su eje mayor está definido por Center y S1, su radio mayor es la distancia entre Center y S1, y su radio menor es la distancia entre S2 y el eje mayor.
Part.Ellipse(Center,MajorRadius,MinorRadius)
Crea una elipse con radios mayor y menor MajorRadius y MinorRadius respectivamente, y ubicada en el plano definido por Center y la normal (0,0,1)
eli = Part.Ellipse(Base.Vector(10,0,0),Base.Vector(0,5,0),Base.Vector(0,0,0)) Part.show(eli.toShape())
En el código de arriba hemos pasado S1, S2 y center. De forma similar a Arc, Ellipse también crea un objeto elipse pero no una arista, así que tenemos que convertirlo en una arista utilizando toShape() para mostrarlo.
Nota: Arc sólo acepta Base.Vector() para puntos pero no tuplas
eli = Part.Ellipse(Base.Vector(0,0,0),10,5) Part.show(eli.toShape())
para el constructor de la elipse de arriba hemos pasado el centro, MajorRadius y MinorRadius
Creación de un toro
Utilizando el método makeTorus(radius1,radius2,[pnt,dir,angle1,angle2,angle]). Por defecto pnt=Vector(0,0,0),dir=Vector(0,0,1),angle1=0,angle2=360 y angle=360. Considera un toro como un pequeño circulo barrido a lo largo de una circunferencia grande. Radius1 es el radio de la circunferencia grande, radius2 es el radio del círculo pequeño, pnt es el centro del toro y dir es la dirección normal. angle1 y angle2 son ángulos en radianes para el círculo pequeño, el último parámetro angle es para hacer una sección del toro:
torus = Part.makeTorus(10, 2)
El código de arriba creará un toro con diámetro 20 (radio 10) y espesor 4 (radio del círculo pequeño 2)
tor=Part.makeTorus(10,5,Base.Vector(0,0,0),Base.Vector(0,0,1),0,180)
El código de arriba creará una sección del toro
tor=Part.makeTorus(10,5,Base.Vector(0,0,0),Base.Vector(0,0,1),0,360,180)
El código de arriba creará un semi toro, sólo el último parámetro se ha cambiado, dando el valor 180 creará el toro desde 0 hasta 180, eso es, medio toro.
Creación de un cubo o prisma
Utilizando makeBox(length,width,height,[pnt,dir]). Por defecto pnt=Vector(0,0,0) y dir=Vector(0,0,1)
box = Part.makeBox(10,10,10) len(box.Vertexes) > 8
Creación de una esfera
Utilizando makeSphere(radius,[pnt, dir, angle1,angle2,angle3]). Por defecto pnt=Vector(0,0,0), dir=Vector(0,0,1), angle1=-90, angle2=90 y angle3=360. angle1 y angle2 son el punto vertical mínimo y máximo de la esfera, angle3 es el diámetro de la esfera.
sphere = Part.makeSphere(10) hemisphere = Part.makeSphere(10,Base.Vector(0,0,0),Base.Vector(0,0,1),-90,90,180)
Creación de un cilindro
Utilizando makeCylinder(radius,height,[pnt,dir,angle]). Por defecto pnt=Vector(0,0,0),dir=Vector(0,0,1) y angle=360
cylinder = Part.makeCylinder(5,20) partCylinder = Part.makeCylinder(5,20,Base.Vector(20,0,0),Base.Vector(0,0,1),180)
Creación de un cono
Utilizando makeCone(radius1,radius2,height,[pnt,dir,angle]). Por defecto pnt=Vector(0,0,0), dir=Vector(0,0,1) y angle=360
cone = Part.makeCone(10,0,20) semicone = Part.makeCone(10,0,20,Base.Vector(20,0,0),Base.Vector(0,0,1),180)
Modificando formas
Existen diversos métodos para modificar formas. Algunas son simples operaciones de transformación como mover o rotar formas, otras son más complejas, como la unión y diferencia de una forma y otra. are simple transformation operations such as moving or rotating shapes, other are more complex, such as unioning and subtracting one shape from another. Tenlo en cuenta
Operaciones de transformación
Traslación de una forma
Traslación es el acto de mover una forma de una situación a otra. Cualquier forma (aristas, caras, cubos, etc...) se puede trasladar del mismo modo:
myShape = Part.makeBox(2,2,2) myShape.translate(Base.Vector(2,0,0))
Esto moverá nuestra forma "myShape" 2 unidades en la dirección del eje X.
Rotación de una forma
Para rotar una forma, necesitas especificar el centro de rotación, el eje, y el ángulo de rotación:
myShape.rotate(Vector(0,0,0),Vector(0,0,1),180)
El código de arriba rotará la forma 180 grados alrededor del eje Z.
Transformaciones genéricas con matrices
Una matriz es un modo muy conveniente de almacenar transformaciones en el mundo 3D. En una simple matriz, puedes establecer traslaciones, rotaciones y valores de escala a ser aplicados a un objeto. Por ejemplo:
myMat = Base.Matrix() myMat.move(Base.Vector(2,0,0)) myMat.rotateZ(math.pi/2)
Nota: Las matrices de FreeCAD funcionan en radianes. También, casi todas las operaciones de matrices que toman un vector pueden tomar 3 números, así estas dos líneas hacen lo mismo:
myMat.move(2,0,0) myMat.move(Base.Vector(2,0,0))
Cuando nuestra matriz es establecida, podemos aplicarla a nuestra forma. FreeCAD proporciona 2 métodos para hacerlo: transformShape() y transformGeometry(). La diferencia es que con el primero, estas seguro de que no ocurrirá ninguna deformación (mira "escalando una forma" más abajo). Podemos aplicar nuestra transformación así:
myShape.trasformShape(myMat)
o
myShape.transformGeometry(myMat)
Escalando una forma
Escalando una forma es una operación más peligrosa porque, a diferencia de la traslación o rotación, un escalado no uniforme (con diferentes valores para los ejes X,Y y Z) puede modificar la estructura de la forma. Por ejemplo, escalando una circunferencia con un valor horizontal superior al vertical la transformará en una elipse, que se comporta matemáticamente de forma muy diferente. Para el escalado, no podemos utilizar transformShape, tenemos que usar transformGeometry():
myMat = Base.Matrix() myMat.scale(2,1,1) myShape.transformGeometry(myMat)
Operaciones Booleanas
Diferencia
La diferencia de una forma con otra se llama "corte" en el argot de OCC/FreeCAD y se hace así:
cylinder = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0)) sphere = Part.makeSphere(5,Base.Vector(5,0,0)) diff = cylinder.cut(sphere)
Intersección
del mismo modo, la intersección entre dos formas es denominada "común" y se hace de este modo:
cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0)) cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1)) common = cylinder1.common(cylinder2)
Unión
La unión se llama "fusión" y funciona del mismo modo:
cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0)) cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1)) fuse = cylinder1.fuse(cylinder2)
Sección
Una sección es la intersección entre una forma de un sólido y una forma de un plano. Devolverá una curva de intersección, un componente con aristas
cylinder1 = Part.makeCylinder(3,10,Base.Vector(0,0,0),Base.Vector(1,0,0)) cylinder2 = Part.makeCylinder(3,10,Base.Vector(5,0,-5),Base.Vector(0,0,1)) section = cylinder1.section(cylinder2) section.Wires > [] section.Edges > [<Edge object at 0D87CFE8>, <Edge object at 019564F8>, <Edge object at 0D998458>, <Edge object at 0D86DE18>, <Edge object at 0D9B8E80>, <Edge object at 012A3640>, <Edge object at 0D8F4BB0>]
Extrusión
Extrusión es el acto de "empujar" una forma plana en determinada dirección resultando en un cuerpo sólido. Piensa en una círculo convirtiéndose en un tubo:
circle = Part.makeCircle(10) tube = circle.extrude(Base.Vector(0,0,2))
Si tu círculo está hueco, obtendrás un tubo hueco. Si no es hueco, obtendrás un cilindro sólido:
wire = Part.Wire(circle) disc = Part.makeFace(wire) cylinder = disc.extrude(Base.Vector(0,0,2))
Exploración de formas
Puedes explorar fácilmente la estructura de datos topológicos:
import Part b = Part.makeBox(100,100,100) b.Wires w = b.Wires[0] w w.Wires w.Vertexes Part.show(w) w.Edges e = w.Edges[0] e.Vertexes v = e.Vertexes[0] v.Point
Escribiendo las líneas de arriba en el interprete de Python, conseguirás una buena comprensión de la estructura de los objetos de piezas. Aquí, nuestro comando makeBox() crea una forma sólida. Este sólido, como todos los sólidos de piezas, contiene caras. Las caras siempre contienen contornos, que son listas de aristas que bordean la cara. Cada cara tiene al menos un contorno cerrado (puede tener más si la cara tiene huecos). En el contorno, podemos mirar en cada arista de forma separada, y dentro de cada arista, podemos ver los vértices. Las aristas rectas tienen sólo dos vértices, obviamente.
Análisis de aristas
En el caso de una arista con una curva arbitraria, es más probable que quieras hacer una discretización. En FreeCAD las aristas son parametrizadas por sus longitudes. Eso significa que puedes recorrer una arista/curva por su longitud:
import Part box = Part.makeBox(100,100,100) anEdge = box.Edges[0] print anEdge.Length
Ahora puedes acceder a un montón de propiedades de la arista utilizando la longitud como una posición. Eso significa que si la arista es de 100mm de longitud el punto inicial es y la posición final es 100.
anEdge.tangentAt(0.0) # tangent direction at the beginning anEdge.valueAt(0.0) # Point at the beginning anEdge.valueAt(100.0) # Point at the end of the edge anEdge.derivative1At(50.0) # first derivative of the curve in the middle anEdge.derivative2At(50.0) # second derivative of the curve in the middle anEdge.derivative3At(50.0) # third derivative of the curve in the middle anEdge.centerOfCurvatureAt(50) # center of the curvature for that position anEdge.curvatureAt(50.0) # the curvature anEdge.normalAt(50) # normal vector at that position (if defined)
Utilizando la selección
Aquí vemos ahora cómo podemos utilizar la selección que el usuario hizo en la vista. Antes de nada creamos un cubo y lo mostramos en la vista
import Part
Part.show(Part.makeBox(100,100,100))
Gui.SendMsgToActiveView("ViewFit")
Selecciona ahora algunas caras o aristas. Con este archivo de guión puedes iterar todos los objetos seleccionados y sus subelementos:
for o in Gui.Selection.getSelectionEx(): print o.ObjectName for s in o.SubElementNames: print "name: ",s for s in o.SubObjects: print "object: ",s
Selecciona algunas aristas y este archivo de guión calculará la longitud:
length = 0.0 for o in Gui.Selection.getSelectionEx(): for s in o.SubObjects: length += s.Length print "Length of the selected edges:" ,length
Examen completo: La botella OCC
Un ejemplo típico encontrado en la página de primeros pasos de OpenCasCade es cómo construir una botella. Este es un buen ejercicio también para FreeCAD. En realidad, puedes seguir nuestro ejemplo de abajo y la página de OCC simultáneamente, comprenderás bien cómo están implementadas las estructuras de OCC en FreeCAD. El archivo de guión completo de abajo está también incluido en la instalación de FreeCAD (dentro del directorio Mod/Part) y puede llamarse desde el interprete de Python escribiendo:
import Part import MakeBottle bottle = MakeBottle.makeBottle() Part.show(bottle)
El archivo de guión completo
Aquí está el archivo de guión completo MakeBottle:
import Part, FreeCAD, math
from FreeCAD import Base
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
aPnt1=Base.Vector(-myWidth/2.,0,0)
aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
aPnt3=Base.Vector(0,-myThickness/2.,0)
aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
aPnt5=Base.Vector(myWidth/2.,0,0)
aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
aSegment1=Part.Line(aPnt1,aPnt2)
aSegment2=Part.Line(aPnt4,aPnt5)
aEdge1=aSegment1.toShape()
aEdge2=aArcOfCircle.toShape()
aEdge3=aSegment2.toShape()
aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
aTrsf=Base.Matrix()
aTrsf.rotateZ(math.pi) # rotate around the z-axis
aMirroredWire=aWire.transformGeometry(aTrsf)
myWireProfile=Part.Wire([aWire,aMirroredWire])
myFaceProfile=Part.Face(myWireProfile)
aPrismVec=Base.Vector(0,0,myHeight)
myBody=myFaceProfile.extrude(aPrismVec)
myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
neckLocation=Base.Vector(0,0,myHeight)
neckNormal=Base.Vector(0,0,1)
myNeckRadius = myThickness / 4.
myNeckHeight = myHeight / 10
myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
myBody = myBody.fuse(myNeck)
faceToRemove = 0
zMax = -1.0
for xp in myBody.Faces:
try:
surf = xp.Surface
if type(surf) == Part.Plane:
z = surf.Position.z
if z > zMax:
zMax = z
faceToRemove = xp
except:
continue
myBody = myBody.makeThickness([faceToRemove],-myThickness/50 , 1.e-3)
return myBody
Explicación detallada
import Part, FreeCAD, math from FreeCAD import Base
Necesitaremos, desde luego, el módulo de piezas, pero también el módulo FreeCAD.Base, que contiene estructuras básicas de FreeCAD como vectores y matrices.
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0): aPnt1=Base.Vector(-myWidth/2.,0,0) aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0) aPnt3=Base.Vector(0,-myThickness/2.,0) aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0) aPnt5=Base.Vector(myWidth/2.,0,0)
Aquí definimos nuestra función makeBottle. Esta función se puede llamar sin argumentos, como hicimos arriba, en cuyo caso se utilizaran los valores por defecto para ancho, alto, y espesor. Luego, definimos un conjunto de puntos que serán utilizados para construir nuestro perfil base.
aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4) aSegment1=Part.Line(aPnt1,aPnt2) aSegment2=Part.Line(aPnt4,aPnt5)
Aquí en realidad definimos la geometría: un arco, creado por 3 puntos, y dos segmentos de línea, creados por 2 puntos.
aEdge1=aSegment1.toShape() aEdge2=aArcOfCircle.toShape() aEdge3=aSegment2.toShape() aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
Recuerdas la diferencia entre geometría y formas? Aquí construimos formas a partir de nuestra geometría de construcción. 3 aristas (las aristas pueden ser rectas o curvas), luego un contorno creado a partir de dichas tres aristas.
aTrsf=Base.Matrix() aTrsf.rotateZ(math.pi) # rotate around the z-axis aMirroredWire=aWire.transformGeometry(aTrsf) myWireProfile=Part.Wire([aWire,aMirroredWire])
Hasta ahora construimos sólo medio perfil. Más sencillo que construir el perfil completo del mismo modo, simplemente podemos crear una simetría de lo que hicimos, y pegar ambas partes. Así primero creamos una matriz. Una matriz es un modo muy común para aplicar transformaciones a objetos en el mundo 3D, ya que puede contener en una estructura todas las transformaciones básicas que los objetos pueden sufrir (mover, rotar y escalar). Aquí, después de crear la matriz, creamos una simétrica, y creamos una copia de nuestro contorno con esa matriz de transformación aplicada. Ahora tenemos 2 contornos, y podemos crear un tercer contorno a partir de ellos, ya que los contornos son en realidad listas de aristas.
myFaceProfile=Part.Face(myWireProfile) aPrismVec=Base.Vector(0,0,myHeight) myBody=myFaceProfile.extrude(aPrismVec) myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
Ahora que tenemos un contorno cerrado, se puede convertir en una cara. Una vez que tengamos una cara, podemos extruirla. Haciendo esto, creamos un sólido. Entonces aplicamos un pequeño redondeo a nuestro objeto porque queremos crear un buen diseño, no es así?
neckLocation=Base.Vector(0,0,myHeight) neckNormal=Base.Vector(0,0,1) myNeckRadius = myThickness / 4. myNeckHeight = myHeight / 10 myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
El cuerpo de nuestra botella está creado, aún tenemos que crear el cuello. Así que creamos un nuevo sólido, con un cilindro.
myBody = myBody.fuse(myNeck)
La operación de fusión, que en otras aplicaciones es llamada unión, es muy potente. Tendrá cuidado de pegar lo que necesita ser pegado y eliminar las partes que necesiten ser eliminadas.
return myBody
Obtenemos nuestro sólido de pieza como resultado de nuestra función. Ese sólido de pieza, como cualquier otra forma de piezas, se puede atribuir a un objeto en el documento de FreeCAD, con:
myObject = FreeCAD.ActiveDocument.addObject("Part::Feature","myObject")
myObject.Shape = bottle
o, de forma más simple:
Part.show(bottle)
Cargando y guardando
Existen diversas formas de guardar tu trabajo en el módulo de piezas. Puedes desde luego guardar el documento de FreeCAD, pero también puedes guardar objetos de pieza directamente en formatos de CAD comunes, como BREP, IGS, STEP y STL.
El guardado de una forma en un archivo es sencillo. Existen los métodos exportBrep(), exportIges(), exportStl() y exportStep() disponibles para todos los objetos de forma. Así, haciendo:
import Part
s = Part.makeBox(0,0,0,10,10,10)
s.exportStep("test.stp")
se guardará nuestro cubo en un archivo STEP. Para cargar un archivo BREP, IGES o STEP, simplemente haz lo contrario:
import Part
s = Part.Shape()
s.read("test.stp")
Observa que la importación y apertura de archivos BREP, IGES o STEP también se puede hacer directamente desde el menú Archivo -> Abrir o Archivo -> Importar, mientras que la exportación es con Archivo -> Exportar
Convertir Objetos parte en mallas
La conversión de objetos de alto nivel, tales como formas de Piezas en objetos más simples como mallas es una operación bastante sencilla, en la que todas las caras de un objeto Pieza son triangularizadas. El resultado de esa triangulación (o teselado) se utiliza para construir una malla:
#let's assume our document contains one part object
import Mesh
faces = []
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # the number represents the precision of the tessellation)
for tri in triangles[1]:
face = []
for i in range(3):
vindex = tri[i]
face.append(triangles[0][vindex])
faces.append(face)
m = Mesh.Mesh(faces)
Mesh.show(m)
En ocasiones, la triangulación ofrecida por OpenCascade para algunas caras es bastante fea. Si la cara tiene un espacio de parámetros rectangular y no contiene ningún agujero o curvas de corte también puedes crear una malla por tu cuenta:
import Mesh def makeMeshFromFace(u,v,face): (a,b,c,d)=face.ParameterRange pts=[] for j in range(v): for i in range(u): s=1.0/(u-1)*(i*b+(u-1-i)*a) t=1.0/(v-1)*(j*d+(v-1-j)*c) pts.append(face.valueAt(s,t)) mesh=Mesh.Mesh() for j in range(v-1): for i in range(u-1): mesh.addFacet(pts[u*j+i],pts[u*j+i+1],pts[u*(j+1)+i]) mesh.addFacet(pts[u*(j+1)+i],pts[u*j+i+1],pts[u*(j+1)+i+1]) return mesh
Convertir Mallas en objetos Pieza
La conversión de mallas en objetos Pieza es una operación muy importante en el trabajo de CAD, ya que a menudo se reciben datos 3D en formato de malla de otras personas o son generados con otras aplicaciones. Las mallas son muy prácticas para representar la geometría de forma libre y para grandes escenas visuales, ya que son muy ligeras. Pero, por lo general, el CAD prefiere objetos de nivel superior que llevan mucha más información, como la idea de sólidos, o caras hechas de curvas, en lugar de triángulos.
La conversión de las mallas a esos objetos de nivel superior (manejados por el Módulo de Piezas en FreeCAD) no es una operación fácil. Las mallas pueden tener miles de triángulos (por ejemplo, los generados por un escáner 3D), y si los sólidos se hacen con el mismo número de caras, serían extremadamente pesados de manipular. Así que por lo general, se desea optimizar el objeto durante la conversión.
FreeCAD actualmente ofrece dos métodos para convertir mallas en piezas. El primer método es una conversión sencilla, directa, sin ningún tipo de optimización:
import Mesh,Part mesh = Mesh.createTorus() shape = Part.Shape() shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing solid = Part.makeSolid(shape) Part.show(solid)
El segundo método ofrece la posibilidad de considerar coplanares las facetas de malla que forman entre si un pequeño ángulo. Esto permite la construcción de formas mucho más simples:
# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
faces = []
mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
for i in segments:
if len(i) > 0:
# a segment can have inner holes
wires = MeshPart.wireFromSegment(mesh, i)
# we assume that the exterior boundary is that one with the biggest bounding box
if len(wires) > 0:
ext=None
max_length=0
for i in wires:
if i.BoundBox.DiagonalLength > max_length:
max_length = i.BoundBox.DiagonalLength
ext = i
wires.remove(ext)
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
for i in wires:
i.reverse()
# make sure that the exterior wires comes as first in the lsit
wires.insert(0, ext)
faces.append(Part.Face(wires))
shell=Part.Compound(faces)
Part.show(shell)
#solid = Part.Solid(Part.Shell(faces))
#Part.show(solid)
FreeCAD es, en esencia, un collage de varias bibliotecas muy potentes, siendo las más importantes openCascade, para la gestión y construcción de la geometría, Coin3d para visualizar esa geometría, y Qt para poner todo esto en una bonita interfaz gráfica de usuario (GUI).
La geometría que aparece en las vistas 3D de FreeCAD son renderizadas por la biblioteca Coin3D. Coin3D es una implementación del estandard OpenInventor. El software OpenCascade también proporciona la misma funcionalidad, pero se decidió, al comenzar el desarrollo de FreeCAD, no utilizar el visor de OpenCascade, sino cambiar al software Coin3D, por tener mejor rendimiento. Un buen modo de aprender sobre esa librería es el libro Open Inventor Mentor.
OpenInventor es en realidad un lenguaje de descripción de escena 3D. La escena descrita en openInventor es seguidamente renderizada en la pantalla con OpenGL. Coin3d se encarga de hacer esto, por lo que el programador no tiene que lidiar con complejas llamadas a OpenGL, bastará con que le proporcione código OpenInventor válido. La gran ventaja es que openInventor es un estándard muy bien conocido y bien documentado.
Uno de los trabajos mas inportantes que FreeCAD hace por ti es, básicamente, traducir la información de geometría OpenCascade al idioma de openInventor.
OpenInventor describe una escena 3D en forma de una escena gráfica (scenegraph), como la siguiente:
image from Inventor mentor
Una escena gráfica de openInventor describe todo lo que es parte de una escena 3D, como la geometría, colores, materiales, luces, etc, y organiza todos los datos en una estructura cómoda y clara. Todo puede agruparse en sub-estructuras, lo que te permite organizar los contenidos de tu escena más o menos de la forma que quiera. He aquí un ejemplo de un archivo de openInventor:
#Inventor V2.0 ascii
Separator {
RotationXYZ {
axis Z
angle 0
}
Transform {
translation 0 0 0.5
}
Separator {
Material {
diffuseColor 0.05 0.05 0.05
}
Transform {
rotation 1 0 0 1.5708
scaleFactor 0.2 0.5 0.2
}
Cylinder {
}
}
}
Como puedes ver, la estructura es muy simple. Utiliza separadores para organizar los datos en bloques, parecido a como harías al organizar tus archivos en carpetas. Cada declaración afecta a lo que viene después, por ejemplo los dos primeros puntos de nuestro separador raíz son una rotación y una traslación, todo ello afectará al siguiente elemento, que es un separador. En ese separador, se define un material y otra transformación. Nuestro cilindro por lo tanto se verá afectado por las dos transformaciones, la que le fue aplicada directamente, y la que se aplicó al separador que le contiene.
También tenemos muchos otros tipos de elementos para organizar nuestra escena, como los grupos, conmutadores o anotaciones. Podemos definir materiales muy complejos para nuestros objetos, con el color, las texturas, los modos de sombreado y transparencia. También podemos definir las luces, cámaras, e incluso movimiento. También es posible integrar pedazos de secuencias de comandos en los archivos de openInventor, para definir comportamientos más complejos.
Si estás interesado en aprender más sobre openInventor, vete directamente a su referencia más famosa, Inventor mentor.
En FreeCAD, normalmente, no es necesario interactuar directamente con la escena gráfica (scenegraph) de openInventor. Cada objeto en un documento de FreeCAD, ya sea una malla, una forma de pieza o cualquier otra cosa, se convierte automáticamente en código de openInventor y se inserta en la escena gráfica (scenegraph) principal que aparecen en una vista 3D. Esa escena gráfica se actualiza continuamente cuando se hacen modificaciones, se añaden o eliminan objetos en el documento. De hecho, cada objeto (en el espacio App) tiene un proveedor de vista (un objeto correspondiente en el espacio de la interfaz gráfica del usuario GUI), responsable de la expedición de código de openInventor.
Pero poder acceder a la escena gráfica directamente tiene muchas ventajas. Por ejemplo, puedes cambiar temporalmente la apariencia de un objeto, o podemos agregar objetos a la escena que no tienen existencia real en el documento de FreeCAD, como la geometría constructiva, ayudantes, sugerencias o herramientas gráficas como manipuladores o información en pantalla.
FreeCAD cuenta con varias herramientas para ver o modificar código de openInventor. Por ejemplo, el código de Python siguiente muestra la representación en openInventor de un objeto seleccionado:
obj = FreeCAD.ActiveDocument.ActiveObject viewprovider = obj.ViewObject print viewprovider.toString()
Pero también tenemos un módulo de Python que permite un acceso completo a todo lo controlado por Coin3d, como la escena gráfica (scenegraph) de FreeCAD. Sigue leyendo en Pivy.
Pivy es una biblioteca para enlazar Python con Coin3d, la biblioteca de renderizado-3D utilizada con FreeCAD. Cuando se importa en un intérprete de Python en ejecución, permite dialogar directamente con cualquier escenas gráficas (scenegraphs) de Coin3d en ejecución, como las vistas 3D de FreeCAD, o incluso para crear otras nuevas. Pivy se incluye en la instalación estándar de FreeCAD.
La biblioteca de Coin se divide en varias partes, la propia Coin, para manipular escenas gráficas, y pasarelas a varios sistemas de interfaz gráfica de usuario (GUI), tales como Windows o, en nuestro caso, Qt. Esos módulos están también disponibles para Pivy, si están presentes en el sistema. El módulo Coin está siempre presente, y es lo que vamos a utilizar en todos los casos, y no tendrás que preocuparte de anclar nuestra pantalla 3D en ninguna interfaz, ya que FreeCAD ya lo ha hecho por si mismo. Todo lo que necesitamos hacer es esto:
from pivy import coin
Acceso y modificación de la escena gráfica
Vimos en la Página de escenas gráficas cómo se organiza una típica escena de Coin. Todo lo que aparece en una vista 3D de FreeCAD es una escena gráfica de Coin, organizada de la misma manera. Tenemos un nodo raíz, y todos los objetos en la pantalla son sus hijos.
FreeCAD tiene una sencilla forma de acceder al nodo raíz de una escenas gráficas en vista 3D:
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() print sg
Esto devolverá el nodo raíz:
<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >
Podemos inspeccionar los elementos secundarios inmediatos de nuestra escena:
for node in sg.getChildren():
print node
Algunos de esos nodos, tales como SoSeparators o SoGroups, pueden tener sus propios hijos. La lista completa de los objetos de Coin disponibles se puede encontrar en la documentación oficial de Coin.
Ahora vamos a tratar de añadir algo a nuestra escena gráfica. Vamos a añadir un bonito cubo rojo:
col = coin.SoBaseColor() col.rgb=(1,0,0) cub = coin.SoCube() myCustomNode = coin.SoSeparator() myCustomNode.addChild(col) myCustomNode.addChild(cub) sg.addChild(myCustomNode)
y aquí está nuestro (magnífico) cubo rojo. Ahora, vamos a probar esto:
col.rgb=(1,1,0)
¿Ves? todo se mantiene accesible y modificable sobre la marcha. No hay necesidad de volver a calcular o dibujar cualquier cosa, Coin se encarga de todo. Puedes agregar cosas a la escena gráfica, cambiar las propiedades, ocultar cosas, mostrar objetos temporales, cualquier cosa. Por supuesto, esto sólo afecta a la pantalla en la vista 3D. Esa pantalla se vuelve a calcular por FreeCAD al abrir el archivo, y cuando un objeto necesita recalcularse. Por lo tanto, si cambias el aspecto de un objeto FreeCAD existente, esos cambios se perderán si el objeto se vuelve a recalcular o cuando se vuelve a abrir el archivo.
Una de las claves para trabajar con escenas gráficas en los archivos de guión es poder tener acceso cuando sea necesario a ciertas propiedades de los nodos que has añadido. Por ejemplo, si quisieramos mover nuestro cubo, habríamos añadido un nodo SoTranslation a nuestro nodo de referencia, y se vería así:
col = coin.SoBaseColor() col.rgb=(1,0,0) trans = coin.SoTranslation() trans.translation.setValue([0,0,0]) cub = coin.SoCube() myCustomNode = coin.SoSeparator() myCustomNode.addChild(col) mtCustomNode.addChild(trans) myCustomNode.addChild(cub) sg.addChild(myCustomNode)
Recuerda que en una escena gráfica de openInventor, el orden es importante. Un nodo afecta a lo que viene a continuación, por lo que puedes decir algo como: color rojo, cubo, color amarillo, esfera, y obtendrás un cubo rojo y una esfera amarilla. Si ahora añadimos la traslación a nuestro nodo de referencia existente, eso llegaría después del cubo, y no lo afectaría. Si lo hubieramos insertado cuando lo creamos, como aquí arriba, ahora podríamos hacer:
trans.translation.setValue([2,0,0])
Y nuestro cubo saltaría 2 unidades a la derecha. Por último, para eliminar algo se hace con:
sg.removeChild(myCustomNode)
La utilización de mecanismos de devolución de llamada
Un callback mechanism (mecanismo de devolución de llamada) es un sistema que permite a una biblioteca que se está utilizando, como la biblioteca Coin, que le devuelva la llamada, es decir, que llame a una función específica de tu objeto de Python ejecutado actualmente. Esto es muy útil, porque de esa manera Coin puede avisarte si algún evento específico se produce en la escena. Coin pueden ver cosas muy diferentes, como la posición del ratón, clics en un botón del ratón, las teclas del teclado que son pulsadas y muchas otras cosas.
FreeCAD cuenta con una sencilla manera de utilizar devoluciones de llamada de este tipo:
class ButtonTest:
def __init__(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getMouseClick)
def getMouseClick(self,event_cb):
event = event_cb.getEvent()
if event.getState() == SoMouseButtonEvent.DOWN:
print "Alert!!! A mouse button has been improperly clicked!!!"
self.view.removeEventCallbackSWIG(SoMouseButtonEvent.getClassTypeId(),self.callback)
ButtonTest()
La devolución de llamada tiene que ser iniciada por un objeto, y ese objeto debe estar todavía en ejecución cuando la devolución de llamada se produzca. Mira también una lista completa de los eventos posibles y sus parámetros, o la documentación oficial de Coin.
Documentación
Lamentablemente Pivy aún no tiene una documentación formal, pero como es una traducción exacta de Coin, puedes utilizar con seguridad la documentación de Coin como referencia, y utilizar el estilo de Python en lugar del estilo de C++ (por ejemplo, SoFile::getClassTypeId() se escribiría en Pivy como: SoFile.getClassId() )
PyQt es un módulo de Python que permite a las aplicaciones en Python crear, acceder y modificar aplicaciones Qt. Se puede utilizar por ejemplo para crear tus propios programas de Qt en Python, o para acceder y modificar la interfaz de una aplicación Qt en ejecución, como FreeCAD.
Al utilizar el módulo de PyQt desde el interior de FreeCAD, se tiene un control total sobre su interfaz. Por ejemplo, puedes:
- Añadir tus propios paneles, complementos (widgets) y barras de herramientas
- Añadir u ocultar los elementos en los paneles existentes
- Cambiar, redirigir o agregar conexiones entre todos los elementos
PyQt tiene una extensa documentación del API, y hay muchos tutoriales en la red que te enseñan cómo funciona.
Si quieres trabajar en la interfaz de FreeCAD, lo primero que debes hacer es crear una referencia a la ventana principal de FreeCAD :
import sys from PyQt4 import QtGui app = QtGui.qApp mw = app.activeWindow()
A continuación, puedes navegar por ejemplo a través de todos los complementos (widgets) de la interfaz:
for child in mw.children(): print 'widget name = ', child.objectName(), ', widget type = ', child
Los complementos (widgets) en una interfaz Qt se suelen anidar en otros complementos o (widgets) "contenedores", de modo que los hijos de nuestra ventana principal pueden contener otros hijos. Dependiendo del tipo de complemento (widget), hay un montón de cosas que puedes hacer. Comprueba la documentación de la API para ver lo que es posible.
Agregar un nuevo complemento (widget), por ejemplo un dockWidget (que puede ser colocado en uno de los paneles laterales de FreeCAD), es sencillo:
myWidget = QtGui.QDockWidget() mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)
A continuación, podrías agregar cosas directamente a tu complemento (widget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100)) # sets size of the widget
label = QtGui.QLabel("Hello World", myWidget) # creates a label
label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
label.setObjectName("myLabel") # sets its name, so it can be found by name
Sin embargo, es preferible un método que consiste en crear un objeto de interfaz de usuario (UI) que hará todo el trabajo de la configuración del complemento (widget) a la vez. La gran ventaja es que tales objetos de interfaz de usuario puede ser creados gráficamente con el programa Qt Designer. Un objeto típico generado por Qt Designer es así:
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100)).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Para utilizarlo, sólo tienes que aplicarlo a tu recién creado complemento (widget) de este modo:
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Además de los tipos de objetos estándar, tales como anotaciones, mallas y objetos de pieza, FreeCAD también ofrece la estupenda posibilidad de construir objetos de archivos de guión hechos al 100% en Python, llamados Funcionalidades Python (Feature Python). Esos objetos se comportan exactamente como cualquier otro objeto de FreeCAD, y se guardar y restauran automáticamente al guardar o cargar archivos.
Debe comprenderse una particularidad, dichos objetos son guardados en archivos FcStd de FreeCAD con el módulo de Python cPickle. Este módulo devuelve un objeto de Python como una cadena de texto, permitiendo que se añada al guardado del archivo. En la carga, el módulo cPickle utiliza esa cadena de texto para recrear los objetos originales, proporcionándole acceso al código fuente que creó el objeto. Es decir que si guardas un objeto personalizado y lo abres en un ordenador en el que el código de Python que generó dicho objeto no está presente, el objeto no será recreado. Si distribuyes dichos objetos a otros usuarios, tendrás que distribuirlos junta al archivo de guión de Python que los crea.
Las Funcionalidades Python siguen las mismas reglas que todas las Funcionalidades de FreeCAD: se separan en las partes de App y GUI. La parte de App, el objeto documento, define la geometría de nuestro objeto, mientras que su parte GUI, el objeto proveedor de vistas, define el modo en que el objeto se dibujará en la pantalla. El objeto proveedor de vistas, como cualquier otra Funcionalidad de FreeCAD, sólo está disponible cuando se ejecuta FreeCAD en su propio GUI. Hay varias propiedades y métodos disponibles para construir tu objeto. Las propiedades tienen que ser de cualquiera de los tipos predefinidos de propiedades que ofrece FreeCAD, y aparecerá en la ventana de vista de propiedades, por lo que puede ser editado por el usuario. De esta manera, los objetos Funcionalidad Python son total y absolutamente paramétricos. Puedes definir las propiedades del objeto y de su ViewObject por separado.
Ejemplo básico
El ejemplo siguiente se puede encontrar en el archivo src/Mod/TemplatePyMod/FeaturePython.py , junto con varios otros ejemplos:
"Examples for a feature class and its view provider."
import FreeCAD, FreeCADGui
from pivy import coin
class Box:
def __init__(self, obj):
"Add some custom properties to our box feature"
obj.addProperty("App::PropertyLength","Length","Box","Length of the box").Length=1.0
obj.addProperty("App::PropertyLength","Width","Box","Width of the box").Width=1.0
obj.addProperty("App::PropertyLength","Height","Box", "Height of the box").Height=1.0
obj.Proxy = self
def onChanged(self, fp, prop):
"Do something when a property has changed"
FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
def execute(self, fp):
"Do something when doing a recomputation, this method is mandatory"
FreeCAD.Console.PrintMessage("Recompute Python Box feature\n")
class ViewProviderBox:
def __init__(self, obj):
"Set this object to the proxy object of the actual view provider"
obj.addProperty("App::PropertyColor","Color","Box","Color of the box").Color=(1.0,0.0,0.0)
obj.Proxy = self
def attach(self, obj):
"Setup the scene sub-graph of the view provider, this method is mandatory"
self.shaded = coin.SoGroup()
self.wireframe = coin.SoGroup()
self.scale = coin.SoScale()
self.color = coin.SoBaseColor()
data=coin.SoCube()
self.shaded.addChild(self.scale)
self.shaded.addChild(self.color)
self.shaded.addChild(data)
obj.addDisplayMode(self.shaded,"Shaded");
style=coin.SoDrawStyle()
style.style = coin.SoDrawStyle.LINES
self.wireframe.addChild(style)
self.wireframe.addChild(self.scale)
self.wireframe.addChild(self.color)
self.wireframe.addChild(data)
obj.addDisplayMode(self.wireframe,"Wireframe");
self.onChanged(obj,"Color")
def updateData(self, fp, prop):
"If a property of the handled feature has changed we have the chance to handle this here"
# fp is the handled feature, prop is the name of the property that has changed
l = fp.getPropertyByName("Length")
w = fp.getPropertyByName("Width")
h = fp.getPropertyByName("Height")
self.scale.scaleFactor.setValue(l,w,h)
pass
def getDisplayModes(self,obj):
"Return a list of display modes."
modes=[]
modes.append("Shaded")
modes.append("Wireframe")
return modes
def getDefaultDisplayMode(self):
"Return the name of the default display mode. It must be defined in getDisplayModes."
return "Shaded"
def setDisplayMode(self,mode):
"Map the display mode defined in attach with those defined in getDisplayModes.\
Since they have the same names nothing needs to be done. This method is optional"
return mode
def onChanged(self, vp, prop):
"Here we can do something when a single property got changed"
FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
if prop == "Color":
c = vp.getPropertyByName("Color")
self.color.rgb.setValue(c[0],c[1],c[2])
def getIcon(self):
"Return the icon in XPM format which will appear in the tree view. This method is\
optional and if not defined a default icon is shown."
return """
/* XPM */
static const char * ViewProviderBox_xpm[] = {
"16 16 6 1",
" c None",
". c #141010",
"+ c #615BD2",
"@ c #C39D55",
"# c #000000",
"$ c #57C355",
" ........",
" ......++..+..",
" .@@@@.++..++.",
" .@@@@.++..++.",
" .@@ .++++++.",
" ..@@ .++..++.",
"###@@@@ .++..++.",
"##$.@@$#.++++++.",
"#$#$.$$$........",
"#$$####### ",
"#$$#$$$$$# ",
"#$$#$$$$$# ",
"#$$#$$$$$# ",
" #$#$$$$$# ",
" ##$$$$$# ",
" ####### "};
"""
def __getstate__(self):
"When saving the document this object gets stored using Python's cPickle module.\
Since we have some un-pickable here -- the Coin stuff -- we must define this method\
to return a tuple of all pickable objects or None."
return None
def __setstate__(self,state):
"When restoring the pickled object from document we have the chance to set some internals here.
Since no data were pickled nothing needs to be done here."
return None
def makeBox():
FreeCAD.newDocument()
a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Box")
Box(a)
ViewProviderBox(a.ViewObject)
Propiedades disponibles
Las propiedades son las auténticas piedras de construcción de los objetos FeaturePython. A través de ellas, el usuario será capaz de interactuar y modificar su objeto. Después de crear un nuevo objeto FeaturePython en tu documento ( a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Box") ), puedes obtener una lista de las propiedades disponibles escribiendo:
a.supportedProperties()
Obtendrás una lista de propiedades disponibles:
App::PropertyBool App::PropertyFloat App::PropertyFloatList App::PropertyFloatConstraint App::PropertyAngle App::PropertyDistance App::PropertyInteger App::PropertyIntegerConstraint App::PropertyPercent App::PropertyEnumeration App::PropertyIntegerList App::PropertyString App::PropertyStringList App::PropertyLink App::PropertyLinkList App::PropertyMatrix App::PropertyVector App::PropertyVectorList App::PropertyPlacement App::PropertyPlacementLink App::PropertyColor App::PropertyColorList App::PropertyMaterial App::PropertyPath App::PropertyFile App::PropertyFileIncluded Part::PropertyPartShape Part::PropertyFilletContour Part::PropertyCircle
Cuando se añaden propiedades a tus objetos personalizados, ten en cuenta esto: No utilices caracteres "<" o ">" en las descripciones de las propiedades (eso rompería las partes de xml en el archivo .fcstd) Las propiedades se almacenan alfabéticamente en un archivo .fcstd. Si tienes una forma en tus propiedades, cualquier propiedad cuyo nombre va después de "Shape" en orden alfabético, se cargará DESPUÉS de la forma, lo que puede causar un comportamiento extraño.
Otro ejemplo más complejo
En este ejemplo se hace uso del Módulo de Pieza para crear un octaedro, a continuación, se crea su representación Coin con Pivy.
Lo primero es el propio objeto del documento:
import FreeCAD, FreeCADGui, Part
class Octahedron:
def __init__(self, obj):
"Add some custom properties to our box feature"
obj.addProperty("App::PropertyLength","Length","Octahedron","Length of the octahedron").Length=1.0
obj.addProperty("App::PropertyLength","Width","Octahedron","Width of the octahedron").Width=1.0
obj.addProperty("App::PropertyLength","Height","Octahedron", "Height of the octahedron").Height=1.0
obj.addProperty("Part::PropertyPartShape","Shape","Octahedron", "Shape of the octahedron")
obj.Proxy = self
def execute(self, fp):
# Define six vetices for the shape
v1 = FreeCAD.Vector(0,0,0)
v2 = FreeCAD.Vector(fp.Length,0,0)
v3 = FreeCAD.Vector(0,fp.Width,0)
v4 = FreeCAD.Vector(fp.Length,fp.Width,0)
v5 = FreeCAD.Vector(fp.Length/2,fp.Width/2,fp.Height/2)
v6 = FreeCAD.Vector(fp.Length/2,fp.Width/2,-fp.Height/2)
# Make the wires/faces
f1 = self.make_face(v1,v2,v5)
f2 = self.make_face(v2,v4,v5)
f3 = self.make_face(v4,v3,v5)
f4 = self.make_face(v3,v1,v5)
f5 = self.make_face(v2,v1,v6)
f6 = self.make_face(v4,v2,v6)
f7 = self.make_face(v3,v4,v6)
f8 = self.make_face(v1,v3,v6)
shell=Part.makeShell([f1,f2,f3,f4,f5,f6,f7,f8])
solid=Part.makeSolid(shell)
fp.Shape = solid
# helper mehod to create the faces
def make_face(self,v1,v2,v3):
wire = Part.makePolygon([v1,v2,v3,v1])
face = Part.Face(wire)
return face
después, conseguimos el objeto proveedor de vista, responsable de mostrar el objeto en la escena 3D:
class ViewProviderOctahedron:
def __init__(self, obj):
"Set this object to the proxy object of the actual view provider"
obj.addProperty("App::PropertyColor","Color","Octahedron","Color of the octahedron").Color=(1.0,0.0,0.0)
obj.Proxy = self
def attach(self, obj):
"Setup the scene sub-graph of the view provider, this method is mandatory"
self.shaded = coin.SoGroup()
self.wireframe = coin.SoGroup()
self.scale = coin.SoScale()
self.color = coin.SoBaseColor()
self.data=coin.SoCoordinate3()
self.face=coin.SoIndexedLineSet()
self.shaded.addChild(self.scale)
self.shaded.addChild(self.color)
self.shaded.addChild(self.data)
self.shaded.addChild(self.face)
obj.addDisplayMode(self.shaded,"Shaded");
style=coin.SoDrawStyle()
style.style = coin.SoDrawStyle.LINES
self.wireframe.addChild(style)
self.wireframe.addChild(self.scale)
self.wireframe.addChild(self.color)
self.wireframe.addChild(self.data)
self.wireframe.addChild(self.face)
obj.addDisplayMode(self.wireframe,"Wireframe");
self.onChanged(obj,"Color")
def updateData(self, fp, prop):
"If a property of the handled feature has changed we have the chance to handle this here"
# fp is the handled feature, prop is the name of the property that has changed
if prop == "Shape":
s = fp.getPropertyByName("Shape")
self.data.point.setNum(6)
cnt=0
for i in s.Vertexes:
self.data.point.set1Value(cnt,i.X,i.Y,i.Z)
cnt=cnt+1
self.face.coordIndex.set1Value(0,0)
self.face.coordIndex.set1Value(1,1)
self.face.coordIndex.set1Value(2,2)
self.face.coordIndex.set1Value(3,-1)
self.face.coordIndex.set1Value(4,1)
self.face.coordIndex.set1Value(5,3)
self.face.coordIndex.set1Value(6,2)
self.face.coordIndex.set1Value(7,-1)
self.face.coordIndex.set1Value(8,3)
self.face.coordIndex.set1Value(9,4)
self.face.coordIndex.set1Value(10,2)
self.face.coordIndex.set1Value(11,-1)
self.face.coordIndex.set1Value(12,4)
self.face.coordIndex.set1Value(13,0)
self.face.coordIndex.set1Value(14,2)
self.face.coordIndex.set1Value(15,-1)
self.face.coordIndex.set1Value(16,1)
self.face.coordIndex.set1Value(17,0)
self.face.coordIndex.set1Value(18,5)
self.face.coordIndex.set1Value(19,-1)
self.face.coordIndex.set1Value(20,3)
self.face.coordIndex.set1Value(21,1)
self.face.coordIndex.set1Value(22,5)
self.face.coordIndex.set1Value(23,-1)
self.face.coordIndex.set1Value(24,4)
self.face.coordIndex.set1Value(25,3)
self.face.coordIndex.set1Value(26,5)
self.face.coordIndex.set1Value(27,-1)
self.face.coordIndex.set1Value(28,0)
self.face.coordIndex.set1Value(29,4)
self.face.coordIndex.set1Value(30,5)
self.face.coordIndex.set1Value(31,-1)
def getDisplayModes(self,obj):
"Return a list of display modes."
modes=[]
modes.append("Shaded")
modes.append("Wireframe")
return modes
def getDefaultDisplayMode(self):
"Return the name of the default display mode. It must be defined in getDisplayModes."
return "Shaded"
def setDisplayMode(self,mode):
return mode
def onChanged(self, vp, prop):
"Here we can do something when a single property got changed"
FreeCAD.Console.PrintMessage("Change property: " + str(prop) + "\n")
if prop == "Color":
c = vp.getPropertyByName("Color")
self.color.rgb.setValue(c[0],c[1],c[2])
def getIcon(self):
return """
/* XPM */
static const char * ViewProviderBox_xpm[] = {
"16 16 6 1",
" c None",
". c #141010",
"+ c #615BD2",
"@ c #C39D55",
"# c #000000",
"$ c #57C355",
" ........",
" ......++..+..",
" .@@@@.++..++.",
" .@@@@.++..++.",
" .@@ .++++++.",
" ..@@ .++..++.",
"###@@@@ .++..++.",
"##$.@@$#.++++++.",
"#$#$.$$$........",
"#$$####### ",
"#$$#$$$$$# ",
"#$$#$$$$$# ",
"#$$#$$$$$# ",
" #$#$$$$$# ",
" ##$$$$$# ",
" ####### "};
"""
def __getstate__(self):
return None
def __setstate__(self,state):
return None
Por último, una vez que nuestro objeto y su viewobject están definidos, sólo nos falta invocarlos:
FreeCAD.newDocument()
a=FreeCAD.ActiveDocument.addObject("App::FeaturePython","Octahedron")
Octahedron(a)
ViewProviderOctahedron(a.ViewObject)
Haciendo objetos seleccionables
Si deseas hacer tu objeto seleccionable, o al menos parte de el, haciendo clic sobre el en el visor, debes incluir su geometría Coin dentro de un nodo SoFCSelection. Si el objeto tiene una representación compleja, con widgets, anotaciones, etc, puede que desees incluir sólo una parte de el en un SoFCSelection. Todo lo que es un SoFCSelection es constantemente explorado por FreeCAD para detectar selección/preselección, por lo que tiene sentido evitar sobrecargalo con innecesarias exploraciones. Esto es lo que se haría para incluir un self.face en el ejemplo anterior:
selectionNode = coin.SoType.fromName("SoFCSelection").createInstance()
selectionNode.documentName.setValue(FreeCAD.ActiveDocument.Name)
selectionNode.objectName.setValue(obj.Object.Name) # here obj is the ViewObject, we need its associated App Object
selectionNode.subElementName.setValue("Face")
selectNode.addChild(self.face)
...
self.shaded.addChild(selectionNode)
self.wireframe.addChild(selectionNode)
Simplemente, se crea un nodo SoFCSelection, a continuación se le agregan los nodos de la geometría, y después lo añade a su nodo principal, en lugar de agregar los nodos de geometría directamente.
Trabajar con formas simples
Si tu objeto paramétrico saca simplemente una forma, no es necesario utilizar un objeto proveedor de vista. La forma se mostrará en la representación de formas de FreeCAD:
class Line:
def __init__(self, obj):
"App two point properties"
obj.addProperty("App::PropertyVector","p1","Line","Start point")
obj.addProperty("App::PropertyVector","p2","Line","End point").p2=FreeCAD.Vector(1,0,0)
obj.Proxy = self
def execute(self, fp):
"Print a short message when doing a recomputation, this method is mandatory"
fp.Shape = Part.makeLine(fp.p1,fp.p2)
a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Line")
Line(a)
a.ViewObject.Proxy=0 # just set it to something different from None (this assignment is needed to run an internal notification)
FreeCAD.ActiveDocument.recompute()
FreeCAD tiene la asombrosa capacidad de poder importarse como un módulo de Python en otros programas o en una consola independiente de Python, junto con todos sus módulos y componentes. Incluso es posible importar el GUI de FreeCAD como módulo Python (aunque con algunas restricciones).
Usando FreeCAD sin interfaz gráfica de usuario GUI
Una primera, directa, fácil y útil aplicación que puedes hacer de esto es para importar documentos de FreeCAD en tu programa. En el siguiente ejemplo, vamos a importar la geometría de la pieza de un documento de FreeCAD en Blender. Aquí está el archivo de guión completo. Espero que te 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 de FreeCAD. Una vez que la encuentra, todos los módulos de FreeCAD como el de Pieza (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ñadimos la ruta de acceso de FreeCAD lib. Esta modificación es sólo temporal, y se perderá cuando cerremos nuestro intérprete de Python. Otra forma podría ser hacer un enlace a tu librería de 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 archivo de 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 de FreeCAD que nos pasa la función main(), y hacemos una lista de sus objetos. Luego, como hemos escogido ocuparnos sólo de la geometría de la 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 del mismo modo se definen las mallas en Blender. Por lo tanto, nuestra tarea es ridículamente simple, sólo tienes 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, como este archivo de guión es muy simple (de hecho hice uno más avanzados aquí), es posible que desees ampliarlo, por ejemplo añadiendo la importación de objetos malla, o importando 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 desees exportar la geometría a un documento de FreeCAD, lo cual se puede hacer de la misma manera. Es posible que también quieras 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 tu dejas a FreeCAD hacer el trabajo en la sombra, mientras que la presentación de los resultados se hace en el programa de tu elección.
Uso de FreeCAD con interfaz gráfica de usuario GUI
Desde la versión 4.2, Qt tiene capacidad para incrustar plugins Qt dependientes del interfaz gráfica de usuario 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) con toda su GUI (interfaz de usuario) dentro de otra aplicación (host), con lo que desde la aplicación host se tiene el control total sobre FreeCAD.
El código en Python para lograr todo eso tiene sólo dos líneas
import FreeCADGui FreeCADGui.showMainWindow()
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 vincularse a la misma versión de Qt que FreeCAD porque de lo contrario podrías obtener errores de ejecución inesperados.
Para aplicaciones que no son Qt, sin embargo, hay algunas limitaciones que debes 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 base 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 vincularse a la biblioteca "glib".
Ten 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.
Esta página contiene ejemplos, pedazos, trozos de código de Python en FreeCAD recogidos de experiencias de los usuarios y las discusiones en los foros. Lee y utilízala como punto de partida para tus propios archivos de guión ...
Un típico archivo InitGui.py
Cada módulo debe contener, además de tu archivo del módulo principal, un archivo InitGui.py, responsable de insertar el módulo en la interfaz GUI principal. Este es un ejemplo de uno sencillo:
class ScriptWorkbench (Workbench):
MenuText = "Scripts"
def Initialize(self):
import Scripts # assuming Scripts.py is your module
list = ["Script_Cmd"] # That list must contain command names, that can be defined in Scripts.py
self.appendToolbar("My Scripts",list)
Gui.addWorkbench(ScriptWorkbench())
Un típico archivo de módulo
Este es un ejemplo de un archivo de módulo principal, que contiene todo lo que tu módulo hace. Es el archivo Scripts.py invocado por el ejemplo anterior. Puedes tener en él todos tus comandos personalizados.
import FreeCAD, FreeCADGui
class ScriptCmd:
def Activated(self):
# Here your write what your ScriptCmd does...
FreeCAD.Console.PrintMessage('Hello, World!')
def GetResources(self):
return {'Pixmap' : 'path_to_an_icon/myicon.png', 'MenuText': 'Short text', 'ToolTip': 'More detailed text'}
FreeCADGui.addCommand('Script_Cmd', ScriptCmd())
Importar un nuevo tipo de archivo
Hacer un importador para un nuevo tipo de archivo en FreeCAD es fácil. FreeCAD no considera que importes datos de un documento abierto, sino que simplemente puede abrir directamente el nuevo tipo de archivo. Así que, lo qué tienes que hacer es añadir la nueva extensión de archivo a la lista de las extensiones conocidas de FreeCAD, y escribir el código que leerá el archivo, y crear los objetos de FreeCAD que desees.
Esta línea debe añadirse al archivo InitGui.py para agregar la nueva extensión de archivo a la lista:
# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext")
Y despues en el archivo Import_Ext.py :
def open(filename): doc=App.newDocument() # here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects doc.recompute()
Para exportar tu documentno a algún nuevo tipo de archivo, se haría del mismo modo, salvo que usarías:
FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")
Añadir una linea
Una línea simplemente tiene 2 puntos.
import Part,PartGui
doc=App.activeDocument()
# add a line element to the document and set its points
l=Part.Line()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)
doc.addObject("Part::Feature","Line").Shape=l.toShape()
doc.recompute()
Añadir un polígono
Un polígono es simplemente un conjunto de segmentos de línea concetados (una polilínea en AutoCAD). No tiene que ser necesariamente cerrado.
import Part,PartGui
doc=App.activeDocument()
n=list()
# create a 3D vector, set its coordinates and add it to the list
v=App.Vector(0,0,0)
n.append(v)
v=App.Vector(10,0,0)
n.append(v)
#... repeat for all nodes
# Create a polygon object and set its nodes
p=doc.addObject("Part::Polygon","Polygon")
p.Nodes=n
doc.recompute()
Añadiendo y quitando un objeto en un grupo
doc=App.activeDocument()
grp=doc.addObject("App::DocumentObjectGroup", "Group")
lin=doc.addObject("Part::Feature", "Line")
grp.addObject(lin) # adds the lin object to the group grp
grp.removeObject(lin) # removes the lin object from the group grp
Nota: También puedes añadir grupos a otros grupos...
Añadir una malla
import Mesh
doc=App.activeDocument()
# create a new empty mesh
m = Mesh.Mesh()
# build up box out of 12 facets
m.addFacet(0.0,0.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,1.0, 0.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,1.0, 0.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0)
m.addFacet(0.0,1.0,0.0, 0.0,1.0,1.0, 1.0,1.0,1.0)
m.addFacet(0.0,1.0,0.0, 1.0,1.0,1.0, 1.0,1.0,0.0)
m.addFacet(0.0,1.0,1.0, 0.0,0.0,1.0, 1.0,0.0,1.0)
m.addFacet(0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,1.0,1.0, 1.0,0.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,0.0,0.0)
# scale to a edge langth of 100
m.scale(100.0)
# add the mesh to the active document
me=doc.addObject("Mesh::Feature","Cube")
me.Mesh=m
Añadiendo un arco o un círculo
import Part
doc = App.activeDocument()
c = Part.Circle()
c.Radius=10.0
f = doc.addObject("Part::Feature", "Circle") # create a document with a circle feature
f.Shape = c.toShape() # Assign the circle shape to the shape property
doc.recompute()
Accediendo y cambiando la representación de un objeto
Cada objeto en un documento de FreeCAD tiene asociado un objeto de representación de la vista, que almacena todos los parámetros que definen la forma en que el objeto aparece, tales como el color, ancho de línea, etc ..
gad=Gui.activeDocument() # access the active document containing all
# view representations of the features in the
# corresponding App document
v=gad.getObject("Cube") # access the view representation to the Mesh feature 'Cube'
v.ShapeColor # prints the color to the console
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white
Observación de Eventos del ratón en el visor 3D a través de Python
La estructura de Inventor permite añadir uno o más nodos de devolución de llamada al escenario gráfico del visor. De forma predeterminada en FreeCAD se instala un nodo de devolución de llamada por cada visor lo que permite añadir funciones C++ globales o estáticas. En el caso de la pasarela Python se han incluido algunos métodos para hacer uso de esta técnica dentro del código Python.
App.newDocument()
v=Gui.activeDocument().activeView()
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
def logPosition(self, info):
down = (info["State"] == "DOWN")
pos = info["Position"]
if (down):
FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
o = ViewObserver()
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)
Ahora, pulsa en algún lugar en la zona del visor 3D y observa los mensajes en la ventana de resultados. Para finalizar la observación sólo llama
v.removeEventCallback("SoMouseButtonEvent",c)
Se soportan los siguientes tipos de eventos:
- SoEvent -- Todo tipo de eventos
- SoButtonEvent -- Todos los eventos de los botones del ratón y del teclado
- SoLocation2Event -- Eventos de movimiento 2D (normalmente movimientos del ratón)
- SoMotion3Event -- Eventos de movimiento 3D (normalmente del spaceball)
- SoKeyboradEvent -- Eventos de pulsar y soltar teclas
- SoMouseButtonEvent -- Eventos de presionar y soltar los botones del ratón
- SoSpaceballButtonEvent -- Eventos de presionar y soltar los botones del spaceball
La función de Python que se puede registrar con addEventCallback () espera un diccionario. Dependiendo del evento observado, el diccionario puede contener diferentes claves.
En todos los eventos existen las siguientes claves:
- Type -- El nombre del tipo de evento i.e. SoMouseEvent, SoLocation2Event, ...
- Time -- La hora actual como una cadena de texto
- Position -- Una dupla de dos enteros, con la posición del ratón
- ShiftDown -- Un booleano, true si la tecla Shift estaba presionada y false en caso contrario
- CtrlDown -- Un booleano, true si la tecla Ctrl estaba presionada y false en caso contrario
- AltDown -- Un booleano, true si la tecla Alt estaba presionada y false en caso contrario
Para los eventos de botones, (tanto del teclado, como del ratón o de un spaceball):
- State -- Una cadena de texto 'UP' si el botón no estaba presionado, 'DOWN' si estaba presionado o 'UNKNOWN' para cualquier otro caso
Para eventos de teclado:
- Key -- Un carácter de la tecla presionada
Para eventos de botón de ratón
- Button -- El botón presionado, podría ser BUTTON1, ..., BUTTON5 o ANY
Para eventos de spaceball:
- Button -- El botón presionado, podría ser BUTTON1, ..., BUTTON7 o ANY
Y por último, eventos de movimiento:
- Translation -- Una tripla de tres números de coma flotante
- Rotation -- Una cuádrupla para la rotación, i.e. a tupla de cuatro números de coma flotante
Manipular escenario gráfico en Python
También es posible obtener y cambiar el escenario gráfico en Python, con el módulo 'Pivy' - una pasarela de Python para Coin.
from pivy.coin import * # load the pivy module view = Gui.ActiveDocument.ActiveView # get the active viewer root = view.getSceneGraph() # the root is an SoSeparator node root.addChild(SoCube()) view.fitAll()
La API en Python de Pivy está creada utilizando la herramienta de SWIG. En FreeCAD se usan algunos nodos auto-escritos, que no pueden crearse directamente en Python. Sin embargo, es posible crear un nodo por su nombre interno. Se puede crear una instancia del tipo "SoFCSelection" con
type = SoType.fromName("SoFCSelection")
node = type.createInstance()
Añadir y eliminar objetos al/del escenario gráfico
La adición de nuevos nodos al escenario gráfico se puede hacer de esta manera. Ten cuidado de añadir siempre un SoSeparator para contener la geometría, las coordenadas y la información de materiales de un mismo objeto. En el ejemplo siguiente se agrega una línea roja desde (0,0,0) a (10,0,0):
from pivy import coin sg = Gui.ActiveDocument.ActiveView.getSceneGraph() co = coin.SoCoordinate3() pts = [[0,0,0],[10,0,0]] co.point.setValues(0,len(pts),pts) ma = coin.SoBaseColor() ma.rgb = (1,0,0) li = coin.SoLineSet() li.numVertices.setValue(2) no = coin.SoSeparator() no.addChild(co) no.addChild(ma) no.addChild(li) sg.addChild(no)
Para quitarlo, simplemente escribe:
sg.removeChild(no)
Añadiendo widgets o complementos personalizados a la interfaz
Puedes crear widgets personalizados con Qt designer, transformarlos es archivos de guión en Python, y luego cargarlos en la interfaz de FreeCAD con PyQt4.
El código de Python producido por el compilador-UI de python (la herramienta que convierte archivos .UI de Qt-designer en código de Python) tiene, en general, este aspecto (es simple, también puedes escribir el código directamente en Python):
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Despues, todo lo que necesitas hacer es crear una referencia a la ventana Qt de FreeCAD, insertar un widget personalizado en ella, y "transformar" ese widget en el tuyo con el código UI que acabas de hacer:
app = QtGui.qApp FCmw = app.activeWindow() # the active qt window, = the freecad window since we are inside it myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Añadiendo una pestaña al Combo View
El siguiente código te permite añadir una pestaña al ComboView de FreeCAD, además de las pestañas "Proyecto" y "Tareas". Utiliza también el módulo UIC para cargar un archivo UI directamente en esa pestaña.
from PyQt4 import QtGui,QtCore
from PyQt4 import uic
#from PySide import QtGui,QtCore
def getMainWindow():
"returns the main window"
# using QtGui.qApp.activeWindow() isn't very reliable because if another
# widget than the mainwindow is active (e.g. a dialog) the wrong widget is
# returned
toplevel = QtGui.qApp.topLevelWidgets()
for i in toplevel:
if i.metaObject().className() == "Gui::MainWindow":
return i
raise Exception("No main window found")
def getComboView(mw):
dw=mw.findChildren(QtGui.QDockWidget)
for i in dw:
if str(i.objectName()) == "Combo View":
return i.findChild(QtGui.QTabWidget)
raise Exception("No tab widget found")
mw = getMainWindow()
tab = getComboView(getMainWindow())
tab2=QtGui.QDialog()
tab.addTab(tab2,"A Special Tab")
uic.loadUi("/myTaskPanelforTabs.ui",tab2)
tab2.show()
#tab.removeTab(2)
Abrir una página web personalizada
import WebGui
WebGui.openBrowser("http://www.example.com")
Obtener el contenido HTML de una página web abierta
from PyQt4 import QtGui,QtWebKit a = QtGui.qApp mw = a.activeWindow() v = mw.findChild(QtWebKit.QWebFrame) html = unicode(v.toHtml()) print html
Esta página muestra cómo se puede crear funcionalidades avanzadas con Python. En este ejercicio, construiremos una nueva herramienta que dibuja una línea. Esta herramienta puede ser vinculada a un comando de FreeCAD, y ese comando se puede llamar desde cualquier elemento de la interfaz, tal como un elemento de menú o un botón de una barra de herramientas.
El archivo de guión principal
En primer lugar vamos a escribir un archivo de guión que contenga toda nuestra funcionalidad. Después, vamos a guardar esto en un archivo, e importarlo en FreeCAD, así todas las clases y funciones que escribas estarán disponibles para FreeCAD. De modo que inicia tu editor de texto favorito y escribe las siguientes líneas:
import FreeCADGui, Part
from pivy.coin import *
class line:
"this class will create a line after the user clicked 2 points on the screen"
def __init__(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.stack = []
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getpoint)
def getpoint(self,event_cb):
event = event_cb.getEvent()
if event.getState() == SoMouseButtonEvent.DOWN:
pos = event.getPosition()
point = self.view.getPoint(pos[0],pos[1])
self.stack.append(point)
if len(self.stack) == 2:
l = Part.Line(self.stack[0],self.stack[1])
shape = l.toShape()
Part.show(shape)
self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.callback)
Explicación detallada
import Part, FreeCADGui from pivy.coin import *
En Python, cuando desees utilizar las funciones de otro módulo, tienes que importarlo. En nuestro caso, vamos a necesitar las funciones del Módulo de Pieza, para la creación de la línea, y del módulo GUI (FreeCADGui), para acceder a la vista 3D. También necesitamos el contenido completo de la biblioteca de Coin, para que podamos utilizar directamente todos los objetos Coin, como SoMouseButtonEvent, etc ..
class line:
Aquí definimos nuestra clase principal. ¿Por qué utilizar una clase y no una función? La razón es que necesitamos que nuestra herramienta se mantenga "viva" mientras esperamos a que el usuario haga clic en la pantalla. Una función termina cuando su tarea se ha hecho, pero un objeto (una clase se define como un objeto) se mantiene vivo hasta que se destruye.
"Esta clase va a crear una línea después de que el usuario hace clic en 2 puntos en la pantalla"
En Python, cada clase o función puede tener una cadena de descripción. Esto es particularmente útil en FreeCAD, porque cuando vas a llamar a esa clase en el intérprete, la cadena de descripción se mostrará como una nota.
def __init__(self):
Las clases en Python siempre pueden contener una función __init__, que se ejecuta cuando la clase es llamada para crear un objeto. Por lo tanto, vamos a poner aquí todo lo que queremos que ocurra cuando nuestra herramienta línea comienza.
self.view = FreeCADGui.ActiveDocument.ActiveView
En una clase, por lo general querrás incluir self. antes de un nombre de variable, para que sea fácilmente accesible por todas las funciones dentro y fuera de esa clase. Aquí, vamos a utilizar self.view para acceder y manipular la vista 3D activa.
self.stack = []
Aquí creamos una lista vacía que contendrá los puntos 3D enviados por la función getpoint.
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getpoint)
Aquí viene la parte importante: Dado que en realidad se trata de una escena Coin3d, FreeCAD utiliza el mecanismo de devolución de llamada de Coin, que permite que una función sea llamada cada vez que sucede un determinado evento de escena. En nuestro caso, estamos creando una devolución de llamada para eventos SoMouseButtonEvent, y lo conduciremos a la función getpoint. Ahora, cada vez que un botón del ratón sea pulsado o soltado, la función getpoint será ejecutada.
Ten en cuenta que también hay una alternativa a addEventCallbackPivy(), llamada addEventCallback(), que dispensa del uso de pivy. Pero como pivy es una forma muy eficaz y natural para acceder a cualquier parte de la escena de Coin, es mucho mejor usarlo tanto como se pueda!
def getpoint(self,event_cb):
Ahora definimos la función getpoint, que se ejecutará cuando el botón del ratón se pulsa en una vista 3D. Esta función recibe un argumento, que llamaremos event_cb. A partir de este evento de devolución de llamada podemos tener acceso al objeto de evento, que contiene varias piezas de información (más información aquí).
if event.getState() == SoMouseButtonEvent.DOWN:
La función getpoint se llamará cuando un botón del ratón sea pulsado o soltado. Pero queremos escoger un punto 3D sólo cuando se presiona (de lo contrario obtendríamos dos puntos 3D muy cerca uno del otro). Por lo tanto, debes comprobar eso aquí.
pos = event.getPosition()
Aquí obtenemos las coordenadas de pantalla del cursor del ratón
point = self.view.getPoint(pos[0],pos[1])
Esta función nos da un vector de FreeCAD (x,y,z) que contiene el punto 3D que se encuentra en el plano focal, justo debajo del cursor de nuestro ratón. Si estás en vista de cámara, imagina un rayo proveniente de la cámara, pasando por el cursor del ratón, y alcanzando el plano focal. Ahí está nuestro punto 3D. Si estamos en una vista ortogonal, el rayo es paralelo a la dirección de la vista.
self.stack.append(point)
Añadimos nuestro nuevo punto a la pila
if len(self.stack) == 2:
¿Tenemos ya suficientes puntos? si es así, entonces vamos a trazar la línea!
l = Part.Line(self.stack[0],self.stack[1])
Aquí se utiliza la función line() del Módulo de Pieza que crea una línea a partir de dos vectores de FreeCAD. Todo lo que creamos y modificamos dentro del módulo de Pieza, se queda en el módulo de Pieza . Así, hasta ahora, hemos creado un elemento de línea. No está ligado a un objeto de nuestro documento activo, por lo que no aparece nada en la pantalla.
shape = l.toShape()
El documento de FreeCAD sólo puede aceptar formas desde el módulo de Pieza. Las formas son el tipo más genérico del módulo de Pieza. Por lo tanto, debemos convertir nuestra línea en una forma antes de añadirla al documento.
Part.show(shape)
El módulo de Pieza tiene una función, show(), que es muy útil ya que crea un nuevo objeto en el documento y le conecta a una forma. También podrías haber creado primero un nuevo objeto en el documento, y a continuación vincularle a la forma manualmente.
self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.callback)
Como ya hemos terminado con nuestra línea, vamos a quitar el mecanismo de devolución de llamada, que consume unos preciosos ciclos de CPU.
Pruebas y Uso del archivo de guión
Ahora, vamos a guardar nuestro archivo de guión en un lugar donde el intérprete de Python de FreeCAD lo encuentre. Cuando importa los módulos, el intérprete mirará en los siguientes lugares: las rutas de instalación de Python, el directorio bin de FreeCAD, y todos los directorios de módulos FreeCAD. Por lo tanto, la mejor solución es crear un nuevo directorio en una de los FreeCAD Mod directories, y salvar nuestro script en él. Por ejemplo, vamos a hacer un directorio "MyScripts", y salvamos nuestro script como "exercise.py".
Ahora, todo está listo, vamos a empezar FreeCAD, cree un nuevo documento, y, en el intérprete de Python, ejecute:
import exercise
Si no aparece ningún mensaje de error, eso significa que nuestro script de ejercicio se ha cargado. Ahora puede comprobar su contenido con:
dir(exercise)
El comando dir() es un comando integrado de Python que muestra el contenido de un módulo. Podemos ver que nuestra clase line() está ahí, esperandonos. Ahora vamos a probarlo:
exercise.line()
A continuación, haz clic dos veces en la vista 3D, y .... ¡bingo!, ¡aquí está nuestra línea! Para hacerlo de nuevo, simplemente escribe exercise.line() otra vez, y otra vez, y otra vez ... Estas contento, ¿no?
Incluyendo el archivo de guión en la interfaz de FreeCAD
Ahora, para que nuestra nueva herramienta línea sea realmente buena, debe tener un botón en la interfaz, para que no sea necesario escribir todas estas cosas cada vez. La forma más fácil es transformar nuestro nuevo directorio MyScripts en un completo entorno de FreeCAD. Es fácil, todo lo que se necesita es poner un archivo llamado InitGui.py dentro de tu directorio MyScripts. El InitGui.py contendrá las instrucciones para crear un nuevo entorno (workbench), y le añadimos nuestra nueva herramienta. Además, también habrá que transformar un poco nuestro código del ejercicio, para que la herramienta line() sea reconocida como un comando oficial de FreeCAD. Comencemos por crear un archivo InitGui.py, y escribir el siguiente código en él:
class MyWorkbench (Workbench):
MenuText = "MyScripts"
def Initialize(self):
import exercise
commandslist = ["line"]
self.appendToolbar("My Scripts",commandslist)
Gui.addWorkbench(MyWorkbench())
A estas alturas, ya debes entender el archivo de guión anterior por ti mismo, supongo: Creamos una nueva clase que llamamos MyWorkbench, le damos un título (MenuText), y definimos una función initialize() que se ejecutará cuando el entorno se cargue en FreeCAD. En esa función, se carga el contenido de nuestro archivo del ejercicio, y los comandos de FreeCAD que se encuentran dentro se anexan en una lista de comandos. A continuación, hacemos una barra de herramientas llamada "Mi Scripts" y le asignamos nuestra lista de comandos. Finalmente, por supuesto, sólo tenemos una herramienta, por lo que nuestra lista de comandos contiene un solo elemento. Ahora, una vez que nuestro entorno está listo, lo añadimos a la interfaz principal.
Pero esto aún no funciona, porque un comando de FreeCAD debe estar formateado de una determinada manera para poder funcionar. Así que tendremos que transformar un poco nuestra herramienta line(). Nuestro nuevo archivo de guión exercise.py tendrá después este aspecto:
import FreeCADGui, Part
from pivy.coin import *
class line:
"this class will create a line after the user clicked 2 points on the screen"
def Activated(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.stack = []
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getpoint)
def getpoint(self,event_cb):
event = event_cb.getEvent()
if event.getState() == SoMouseButtonEvent.DOWN:
pos = event.getPosition()
point = self.view.getPoint(pos[0],pos[1])
self.stack.append(point)
if len(self.stack) == 2:
l = Part.Line(self.stack[0],self.stack[1])
shape = l.toShape()
Part.show(shape)
self.view.removeEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.callback)
def GetResources(self):
return {'Pixmap' : 'path_to_an_icon/line_icon.png', 'MenuText': 'Line', 'ToolTip': 'Creates a line by clicking 2 points on the screen'}
FreeCADGui.addCommand('line', line())
Lo que hicimos aquí es transformar nuestra función __init__() en una función Activated(), porque cuando se ejecutan comandos de FreeCAD, automáticamente se ejecuta la función Activated(). También hemos añadido una función GetResources(), que informa a FreeCAD de donde puede encontrar el icono de la herramienta, y cual será el nombre y la descripción de nuestra herramienta. Cualquier imagen jpg, png o svg funcionará como un icono. Puede ser de cualquier tamaño, pero lo mejor es utilizar un tamaño que esté cerca del aspecto final, como 16x16, 24x24 o 32x32. A continuación, añadimos la clase line() como un comando oficial de FreeCAD con el método addCommand().
Eso es todo, ahora sólo hay que reiniciar FreeCAD y tendremos un agradable entorno nuevo con una nueva herramienta line() de nuestra marca!
¿Quieres más?
Si te gustó este ejercicio, ¿por qué no tratar de mejorar esta pequeña herramienta? Hay muchas cosas que se pueden hacer, como por ejemplo:
- Agregar asistencia para los usuarios: hasta ahora hemos hecho una herramienta muy burda, el usuario podría verse un poco perdido cuando la utiliza. Se podría añadir alguna información, diciéndole qué hacer a continuación. Por ejemplo, podrías mostrar mensajes en la consola de FreeCAD. ¡Echa un vistazo en el módulo de FreeCAD.Console
- Añadir la posibilidad de teclear de forma manual las coordenadas de los puntos 3D. Mira la función input() de Python, por ejemplo
- Añadir la posibilidad de incluir más de 2 puntos
- Añadir eventos para otras cosas: Ahora sólo comprobamos eventos de botón del ratón, ¿que tal si también hace algo cuando el ratón se mueva, como mostrar las coordenadas actuales?
- Dar un nombre al objeto creado
No dudes en escribir tus preguntas o ideas en la página de discusión!
En esta página vamos a mostrar cómo crear un simple letrero de diálogo con Qt Designer, la herramienta oficial de Qt para el diseño de interfaces, después lo convertiremos en código de Python, para luego utilizarlo en FreeCAD. Vamos a suponer en el ejemplo que ya sabes cómo editar y ejecutar archivos de guión de Python, y que puedes hacer cosas simples en una ventana de terminal, como navegar, etc. También debes tener, por supuesto, PyQt instalado.
Diseñar el letrero de diálogo
En las aplicaciones de CAD, el diseño de una buena interfaz de usuario (UI, User Interface) es muy importante. Casi todo lo que el usuario haga será a través de alguna parte de la interfaz: leyendo los letreros de diálogo, pulsando los botones, eligiendo entre iconos, etc. Así que es muy importante pensar cuidadosamente lo que quieres hacer, cómo deseas que el usuario se comporte, y cómo será el flujo de trabajo de tu acción.
Hay un par de conceptos que debes saber a la hora de diseñar la interfaz:
- Letreros de diálogo Modales/no modales: Un letrero de diálogo modal aparece delante de la pantalla, deteniendo la acción de la ventana principal, obligando al usuario a responder al cuadro de diálogo, mientras que un cuadro de diálogo no modal permite seguir trabajando en la ventana principal. En algunos casos la primera opción es mejor, pero en otros casos no.
- Identificación de lo que es necesario y lo que es opcional: Asegúrate de que el usuario sabe lo que debe hacer. Etiqueta todo con la descripción adecuada, utiliza etiquetas de información sobre el uso de las herramientas, etc.
- Separar los comandos de los parámetros: Esto se hace generalmente con botones y cuadros de texto. El usuario sabe que al hacer clic en un botón, se produce una acción mientras que al cambiar un valor dentro de un cuadro de texto va a cambiar un parámetro en alguna parte. Hoy en día, sin embargo, los usuarios suelen conocer bien lo que es un botón, lo que es un cuadro de texto, etc. El conjunto de herramientas de interfaz que está utilizando, Qt, es el conjunto de herramientas más avanzado, y no tendrás que preocuparte mucho de hacer las cosas claras, puesto que ya va a ser muy clara por sí misma.
Así que, ahora que tenemos bien definido lo que haremos, es el momento para abrir el diseñador de Qt Designer. Diseñemos un letrero de diálogo muy sencillo, como este:
Después podremos utilizar este letrero de diálogo en FreeCAD para producir un bonito plano rectangular. Puede que no veas muy útil hacer planos rectangulares, pero será fácil cambiarlo más adelante para hacer cosas más complejas. Cuando lo abras, el aspecto de Qt Designer es el siguiente:
Es muy sencillo de utilizar. En la barra de la izquierda tienes elementos que pueden ser arrastrados a tu widget. En el lado derecho tienes los paneles de propiedades mostrando todo tipo de propiedades editables de los elementos seleccionados. Comencemos ahora con la creación de un nuevo widget o complemento. Selecciona "letrero de diálogo sin botones", ya que no queremos el formato predeterminado de botones Ok/Cancelar. A continuación, arrastra sobre tu widget 3 etiquetas, una para el título, una para escribir "Altura" y otra para escribir "Ancho". Las etiquetas son textos sencillos que aparecen en tu widget, simplemente para informar al usuario. Si seleccionas una etiqueta, en la parte derecha aparecerán varias propiedades que puedes cambiar si lo deseas, como el estilo de fuente, altura, etc.
A continuación, agrega 2 LineEdits, que son cuadros de texto que el usuario puede rellenar, uno para la altura y uno para el ancho. También en este caso, podemos editar las propiedades. Por ejemplo, ¿por qué no establecer un valor predeterminado? digamos 1.00 para cada uno. De esta manera, cuando el usuario vea el letrero de diálogo, ambos campos ya estarán rellenados, y si está conforme puede pulsar el botón directamente, ahorrando un tiempo precioso. A continuación, agrega un PushButton, que es el botón que el usuario deberá pulsar después de llenar los 2 campos.
Ten en cuenta que he elegido aquí controles muy sencillos, pero Qt tiene muchas más opciones, por ejemplo, podría utilizar Spinboxes en lugar de LineEdits, etc. Echa un vistazo a lo que está disponible, seguramente tendrás otras ideas.
Eso es prácticamente todo lo que necesitamos hacer en Qt Designer. Una última cosa, sin embargo, vamos a cambiar el nombre de todos nuestros elementos con nombres más adecuados, de modo que sea más fácil identificarlos en nuestros archivos de guión:
Convertir nuestro diálogo a Python
Ahora, vamos a salvar nuestro widget en alguna parte. Se guardará como un archivo .ui, que fácilmente se convertirá en un archivo de guión de Python por medio de pyuic. En Windows, el programa pyuic se ve enriquecido con PyQt (por verificar), en linux es probable que tengas que instalarlo por separado desde tu gestor de paquetes (en sistemas basados en Debian, es parte del paquete de herramientas PyQt4-dev-tools). Para realizar la conversión, tendrás que abrir una ventana de terminal (o una ventana de símbolo de sistema en Windows), ve a donde guardaste el archivo .ui, y escribe:
pyuic mywidget.ui > mywidget.py
En algunos sistemas el programa se llama pyuic4 en lugar de pyuic. Esta operación simplemente convertirá el archivo .ui en un archivo de guión de Python. Si abrimos el archivo mywidget.py, su contenido es muy fácil de entender:
from PyQt4 import QtCore, QtGui
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(187, 178)
self.title = QtGui.QLabel(Dialog)
self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
self.title.setObjectName("title")
self.label_width = QtGui.QLabel(Dialog)
...
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8))
...
Como verás, tiene una estructura muy simple: se crea una clase denominada Ui_Dialog, que almacena los elementos de interfaz de nuestro widget o complemento. Esa clase tiene dos métodos, uno para la configuración del widget, y otro para la traducción de su contenido, eso es parte del mecanismo general de Qt para la traducción de elementos de la interfaz. El método de configuración simplemente crea, uno a uno, los widgets tal como los has definido en Qt Designer, y establece sus opciones, como hayamos decidido con anterioridad. Despues, toda la interfaz se traduce, y por último, se conectan las ranuras (slots) (hablaremos de eso más adelante).
Ahora podemos crear un nuevo widget, y utilizar esta clase para crear su interfaz. Ya podemos ver nuestro widget en acción, poniendo nuestro archivo mywidget.py en un lugar donde FreeCAD lo encuentre (en el directorio bin de FreeCAD, o en cualquiera de los subdirectorios Mod), y, en el intérprete de Python FreeCAD, ejecutamos:
from PyQt4 import QtGui import mywidget d = QtGui.QWidget() d.ui = mywidget.Ui_Dialog() d.ui.setupUi(d) d.show()
¡Y nuestro letrero de diálogo aparecerá! Ten en cuenta que nuestro intérprete de Python todavía está trabajando, ya que hemos usado un letrero de diálogo no modal. Por lo tanto, para cerrarlo, podemos (aparte de hacer clic en el icono de cerrar, por supuesto) escribir:
d.hide()
Hacer algo con nuestro diálogo
Ahora que podemos mostrar y ocultar nuestro letrero de diálogo, sólo tenemos que añadir una última parte: ¡que haga algo! Si juegas un poco con Qt Designer, descubrirás rápidamente toda una sección llamada "señales y slots". Básicamente, funciona así: los elementos de los widgets o complementos (en la terminología de Qt, estos elementos son a su vez widgets) pueden enviar señales. Estas señales varían según el tipo de widget. Por ejemplo, un botón puede enviar una señal cuando se presiona y cuando es soltado. Estas señales se pueden conectar a los slots, que puede ser una funcionalidad especial de otros widgets (por ejemplo, un cuadro de diálogo tiene un slot "close" (cerrado) en el que se puede conectar la señal de un botón close (de cierre)), o pueden ser funciones de usuario. La Documentación de referencia de PyQt enumera todos los widgets Qt, lo que pueden hacer, que señales pueden enviar, etc.
Lo que haremos aquí, es crear una nueva función que va a formar un plano basado en la altura y anchura, y conectar dicha función a la señal de "pulsado" emitida por nuestro botón "Create!". Empezaremos con la importación de nuestros módulos FreeCAD, poniendo la siguiente línea al comienzo del archivo de guión, donde ya hemos mandado también la importación de QtCore y QtGui:
import FreeCAD, Part
ahora, añadamos una nueva función a nuestra clase Ui_Dialog:
def createPlane(self):
try:
# first we check if valid numbers have been entered
w = float(self.width.text())
h = float(self.height.text())
except ValueError:
print "Error! Width and Height values must be valid numbers!"
else:
# create a face from 4 points
p1 = FreeCAD.Vector(0,0,0)
p2 = FreeCAD.Vector(w,0,0)
p3 = FreeCAD.Vector(w,h,0)
p4 = FreeCAD.Vector(0,h,0)
pointslist = [p1,p2,p3,p4,p1]
mywire = Part.makePolygon(pointslist)
myface = Part.Face(mywire)
Part.show(myface)
self.hide()
A continuación, tenemos que informar a Qt para que conecte el botón con la función, mediante la colocación de la siguiente línea justo antes de QtCore.QMetaObject.connectSlotsByName(Dialog):
QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)
Como ves, esto conecta la señal pressed() de nuestro objeto create (el Botón "Create!"), a un slot llamado createPlane, que acabamos de definir. Eso es! Ahora, como toque final, podemos añadir una pequeña función para crear el cuadro de diálogo. Así será más fácil hacer las llamadas. Fuera de la clase Ui_Dialog, vamos a añadir este código:
class plane():
d = QtGui.QWidget()
d.ui = Ui_Dialog()
d.ui.setupUi(d)
d.show()
A continuación, en FreeCAD, sólo tenemos que hacer:
import mywidget mywidget.plane()
Y eso es todo amigos... Ahora puedes probar todo tipo de cosas, como por ejemplo insertar tu widget en la interfaz de FreeCAD (mira la página Pedazos de código), o la creación de herramientas personalizadas mucho más avanzado, mediante el uso de otros elementos en tu widget o complemento.
El archivo de guión completo
Este es el archivo de guión completo, como referencia:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mywidget.ui'
#
# Created: Mon Jun 1 19:09:10 2009
# by: PyQt4 UI code generator 4.4.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
import FreeCAD, Part
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(187, 178)
self.title = QtGui.QLabel(Dialog)
self.title.setGeometry(QtCore.QRect(10, 10, 271, 16))
self.title.setObjectName("title")
self.label_width = QtGui.QLabel(Dialog)
self.label_width.setGeometry(QtCore.QRect(10, 50, 57, 16))
self.label_width.setObjectName("label_width")
self.label_height = QtGui.QLabel(Dialog)
self.label_height.setGeometry(QtCore.QRect(10, 90, 57, 16))
self.label_height.setObjectName("label_height")
self.width = QtGui.QLineEdit(Dialog)
self.width.setGeometry(QtCore.QRect(60, 40, 111, 26))
self.width.setObjectName("width")
self.height = QtGui.QLineEdit(Dialog)
self.height.setGeometry(QtCore.QRect(60, 80, 111, 26))
self.height.setObjectName("height")
self.create = QtGui.QPushButton(Dialog)
self.create.setGeometry(QtCore.QRect(50, 140, 83, 26))
self.create.setObjectName("create")
self.retranslateUi(Dialog)
QtCore.QObject.connect(self.create,QtCore.SIGNAL("pressed()"),self.createPlane)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.title.setText(QtGui.QApplication.translate("Dialog", "Plane-O-Matic", None, QtGui.QApplication.UnicodeUTF8))
self.label_width.setText(QtGui.QApplication.translate("Dialog", "Width", None, QtGui.QApplication.UnicodeUTF8))
self.label_height.setText(QtGui.QApplication.translate("Dialog", "Height", None, QtGui.QApplication.UnicodeUTF8))
self.create.setText(QtGui.QApplication.translate("Dialog", "Create!", None, QtGui.QApplication.UnicodeUTF8))
def createPlane(self):
try:
# first we check if valid numbers have been entered
w = float(self.width.text())
h = float(self.height.text())
except ValueError:
print "Error! Width and Height values must be valid numbers!"
else:
# create a face from 4 points
p1 = FreeCAD.Vector(0,0,0)
p2 = FreeCAD.Vector(w,0,0)
p3 = FreeCAD.Vector(w,h,0)
p4 = FreeCAD.Vector(0,h,0)
pointslist = [p1,p2,p3,p4,p1]
mywire = Part.makePolygon(pointslist)
myface = Part.Face(mywire)
Part.show(myface)
class plane():
d = QtGui.QWidget()
d.ui = Ui_Dialog()
d.ui.setupUi(d)
d.show()
Desarrollando aplicaciones para FreeCAD
Declaración del conservador/mantenedor
Sé que el debate sobre la licencia "adecuada" para el código abierto ocupa una parte importante del ancho de banda de Internet y esa es la razón por la que, en mi opinión, también FreeCAD debería tener aquí algo sobre el tema.
Elegí el LGPL y GPL para el proyecto y conozco los pros y los contras sobre LGPL, de modo que te explicaré algunos motivos para haber tomado esta elección.
FreeCAD es un híbrido entre una biblioteca y una aplicación, de modo que la licencia GPL sería demasiado fuerte para eso. No permitiría escribir módulos comerciales para FreeCAD porque impediría la vinculación con las librerías base de FreeCAD. Te puedes preguntar ¿por qué no prescindir totalmente de los módulos comerciales? En este ámbito Linux es un buen ejemplo. ¿Tendría Linux tanto éxito si la biblioteca GNU de C fuese GPL y, por tanto, incapacitada para ligarse con las aplicaciones no-GPL? Y aunque me encanta la libertad de Linux, yo también quiero ser capaz de usar el magnífico controlador gráfico NVIDIA 3D. Entiendo y acepto que NVIDIA tenga razones para no querer regalar el código de su controlador. Todos trabajamos para empresas y necesitamos el sueldo, o por lo menos comer. Por todo lo anterior, para mí, una coexistencia de software de código abierto y de código cerrado no es algo malo, cuando obedece a las reglas de la LGPL. Me gustaría ver a alguien escribiendo un módulo de importación/exportación de formato Catia para FreeCAD, y que se distribuyese, ya fuera gratis o por dinero. No me gusta obligar a nadie a que ceda más de lo que quiere. Eso no sería bueno ni para él, ni para FreeCAD.
No obstante, esta decisión se ha tomado sólo para el sistema básico de FreeCAD. Todo escritor de un módulo de aplicación puede tomar su propia decisión.
Licencias utilizadas
He aquí las tres licencias bajo las que se publica FreeCAD:
- Lesser General Public Licence (LGPL2+)
- Para las bibliotecas principales como se indica en los fichero .h y .cpp en src/App, src/Gui, sic/Base, y muchos de los módulos en src/Mod y para el ejecutable como se indica en los archivos .h y .cpp en el directorio src/main. Los iconos y otro material gráfico también son LGPL.
- General Public Licence (GPL2+)
- Para los archivo de guión de Python que construyen los binarios como se indica en los archivos .py en src/Tools
- Open Publication Licence
- Para la documentacion en http://free-cad.sourceforge.net/ salvo que se indique lo contrario por su autor
Tratamos de utilizar sólo licencias de tipo LGPL para las bibliotecas vinculadas al núcleo (mira Bibliotecas de terceros), con una excepción:
- La licencia de Coin3D (www.coin3d.org).
Mira el archivo debian copyright file de FreeCAD, para tener más detalles sobre las licencias utilizadas en FreeCAD
Alcance de las licencias
Usuarios particulares
Los usuarios particulares pueden utilizar FreeCAD de manera gratuita y pueden hacer básicamente cualquier cosa que quieran hacer con él ....
Usuarios profesionales
Pueden usar libremente FreeCAD para cualquier tipo de trabajo particular o profesional. Se puede personalizar la aplicación como lo deseen. Pueden escribir extensiones para FreeCAD en código abierto o cerrado. Son siempre dueños de sus datos, no están obligados a actualizar FreeCAD, ni cambiar el uso que hacen de FreeCAD. El uso de FreeCAD no les vincula a ningún tipo de contrato u obligación.
Desarrolladores de código abierto (Open Source)
Puede utilizar FreeCAD como base para sus propios módulos de extensión para usos especiales. Pueden elegir entre GPL o LGPL para permitir, o no, el uso de su trabajo en software propietario.
Desarrolladores profesionales
Los desarrolladores profesionales pueden utilizar FreeCAD como base para sus propios módulos de extensión para propósitos especiales y no están obligados a hacer sus módulos en código abierto. Pueden utilizar todos los módulos que utilizan LGPL. Se les permite distribuir FreeCAD junto con su software propietario. Se dará todo el apoyo del autor(es) siempre y cuando exista una actitud de correspondencia recíproca. Si quieres vender tu módulo necesitas una licencia de Coin3d, de lo contrario estás obligado por esta biblioteca a que tu módulo sea de código abierto.
Reportando errores
Recientemente, la plataforma de sourceforge hizo la aplicación mantis bug tracker disponible para los proyectos, y FreeCAD ahora la utiliza de forma activa, en lugar del antigua trazador de fallos que tenía incorporado. La dirección de nuestro nuevo gestor de fallos es:
http://sourceforge.net/apps/mantisbt/free-cad/main_page.php
Si piensas que podrías haber encontrado un error, te invitamos a que lo informes allí. Pero antes de informar de un error, por favor, comprueba los elementos siguientes:
- Asegúrate de que tu error es realmente un bug, es decir, algo que debería estar trabajando y que no está funcionando. Si no estás seguro, no dudes en explicar tu problema en el foro y pregunta qué hacer.
- Antes de enviar cualquier cosa, lee las FAQ - Preguntas más frecuentes, haz una búsqueda en el foro, y asegúrate de que el mismo error no se ha informado antes, haciendo una búsqueda en el bug tracker.
- Describe lo más claramente posible el problema, y cómo puede ser reproducido. Si no podemos verificar el error, puede que no seamos capaces de solucionarlo.
- Incluye la siguiente información: Tu sistema operativo, si es 32 o 64 bits, y la versión de FreeCAD que estás ejecutando.
- Por favor presenta un informe por separado para cada error.
- Si estás en un sistema linux y tu error provoca un cuelgue en FreeCAD, puedes intentar ejecutar un backtrace debug: Desde un terminal ejecuta gdb freecad (suponiendo que el paquete gdb esté instalado), entonces, dentro de gdb, escribe run. FreeCAD se ejecutará. Después de que se produzca el fallo, teclea bt, para obtener el trazado completo. Incluye la salida del backtrace en tu informe de error.
Solicitar funcionalidades
Si quieres que aparezca algo en FreeCAD que aún no está implementado, no se trata de un error, sino una solicitud de funcionalidad. También puedes notificarlo en el mismo tracker (lo archivas como una petición de función, en lugar de errores), pero ten en cuenta que no hay garantías de que tus deseos se cumplan.
Envío de parches
En caso de haber programado la corrección de un error, una extensión o algo que puede ser de uso público en FreeCAD, crea un parche con la herramienta Subversion diff y preséntalo en el mismo tracker (lo archivas como parche).
LO SIGUIENTE DE ESTA PÁGINA PARECE SER OBSOLETO, Y NO LO TRADUCIREMOS DE MOMENTO.
The "old" sourceforge tracker (obsolete)
Note: Please use the new mantis bug tracker to submit bugs, this one is now a bit deprecated...
Where to find?
The FreeCAD project has its own tracker summary page. There you find the overview on the individual sections of the tracker.
When to use?
Bugs
If you think you might have found a bug, go to the Bugs Section of the tracker and choose "any" for status to see all bug request ever filed. The keyword search allows you to find bug tracker entries for a similiar issue. If you can not find an older entry about your problem, you should file a new entry on the same page.
Feature Requests
If you are missing a feature in FreeCAD that you think of as beeing absolutely necessary to become the worlds best CAD-Software, you might find the Feature Request section helpfull.
Support Requests
If you don't get around compiling FreeCAD and the Compile On Windows or Compile On Unix section does not give you a hint, or you try to port it to a new environment or are programming new modules or extensions for FreeCAD and need some assistance then the Support Requests section is the place you might want to go to.
New Patches
In case you have programmed a bug fix, an extension or something else that can be of public use in FreeCAD, create a patch using Subversion and file it in the patches section.
Este artículo explica paso a paso cómo compilar FreeCAD en Windows.
Pre-requisitos
Lo que necesitas es principalmente el compilador. En Windows utilizamos el compilador M$ VisualStudio 8 (o VC++ Express) con el último service pack. Aunque es probablemente posible utilizar Cygwin o MingW gcc no está comprobado o portado de momento. También lo hemos portado a utilizar VC8 Express Edition. Necesitas descargar el Windows Platform SDK para tener e.g. el Windows.h. También necesitas todas las you need all the Bibliotecas de terceros para compilar FreeCAD satisfactoriamente.
Si utilizar los compiladores de M$ lo más probable es que quieras descargar FreeCAD LibPack que te proporciona todas las bibliotecas necesarias para construir FreeCAD en Windows.
Otros prerequisitos (y programas útiles) son:
cMake TortoiseGit Python 2.6 WiX (Windows installer XML v3.0) - si quieres crear un instalador msi
También es necesario tener, en las rutas de tu sistema, las rutas de:
Libpack git (no tortoiseGit, sino git.exe) python
Construcción con cMake
Antes de nada, tienes que descargar cMake e instalarlo en tu equipo.
El cambio a cMake
Desde la versión 0.9 utilizamos el sistema de construcción cMake para generar los archivos build/make para varios compiladores. No proporcionaremos más archivos .vcproj. Si quieres construir versiones antiguas de FreeCAD (0.8 y anteriores) mira "Construcción de versiones antiguas" más adelante en este artículo.
Hemos cambiado porque se hacía cada vez más desagradable mantener archivos de proyectos para más de 30 tipos de construcción y x compiladores. cMake nos ofrece la posibilidad de soportar IDEs alternativos, como Code::Blocks, Qt Creator y Eclipse CDT el principal compilador que utilizamos sigue siendo M$ VC9 Express. Pero hemos planificado para el futuro un sistema de construcción en Windows sin ningún software de compilación propietario.
Configurar el sistema de construcción
El primer paso para construir FreeCAD con cMake es configurar el entorno. Hay básicamente dos modo de hacerlo:
- Utilizando LibPack
- Instalando todas las bibliotecas necesarias y permitiendo a cMake encontrarlas
En el primer caso solo necesitas indicarle a cMake la ruta de LibPack y todo el resto debería estar hecho de forma automática y veras una pantalla como esta:
Puedes ver la ruta de LibPack insertada dentro de la variable FREECAD_LIBPACK_DIR'. Empezando desde aquí todo incluidas las rutas están definidas. Solamente necesitas presionar el botón Generate y los archivos del proyecto se generarán.
Si desactivas las opciones FREECAD_LIBPACK_USE, la configuración trata de encontrar cada biblioteca necesaria en tu sistema. Dependiendo de las que las bibliotecas funcionen más o menos bien. De modo que definir frecuentemente algunas rutas a mano. cMake te mostrará lo que no se encuentra y es necesario que sea especificado.
Opciones para el proceso de construcción
El sistema de construcción de cMake nos ofrece mucha más flexibilidad sobre el proceso de construcción. Eso significa que podemos activar y desactivar algunas características o módulos. De un modo similar a la construcción del kernel de Linux. Tienes un montón de conmutadores para determinar el proceso de construcción.
Aquí está la descripción de esos conmutadores. Permitirán principalmente hacer muchos cambios en el futuro porque queremos incrementar la flexibilidad de la construcción mucho más.
| Variable name | Descripción | Por defecto |
|---|---|---|
| FREECAD_LIBPACK_USE | Conmuta el uso de FreeCAD LibPack on u off | En Win32 on, en otro caso off |
| FREECAD_LIBPACK_DIR | Directorio de LibPack | Directorio de código fuente de FreeCAD |
| FREECAD_BUILD_GUI | Construir FreeCAD con todos los módulos relacionados con el interfaz gráfico de usuario Gui | ON |
| FREECAD_BUILD_CAM | Construir el módulo de mecanizado CAM, experimental! | OFF |
| FREECAD_BUILD_INSTALLER | Crea los archivos de proyecto para el instalador de Windows. | OFF |
| FREECAD_BUILD_DOXYGEN_DOCU | Crea los archivos de proyecto para la documentación del código fuente. | OFF |
| FREECAD_MAINTAINERS_BUILD | Conmutador necesario solo cuando haces una construcción de versión. | OFF |
Procedimiento con cMake y Visual Studio 2008
Una vez que inicias el entorno gráfico de usuario de cMake, selecciona el directorio del código fuente, añade el directorio de destino y pulsa en "Configurar". cMake solicitará que selecciones un generador - el recomendado para FreeCAD es "Visual Studio 9 2008".
Después de pulsar en "Siguiente", cMake mostrará errores ya que no puede encontrar LibPack. Tienes que seleccionar manualmente el directorio en el que está Libpack en la variable "FREECAD_LIBPACK_DIR". Después pulsa en "Configurar" otra vez. Una vez termine la configuración, pulsa en "Generar". Ahora has acabado con cMake, y lo puedes cerrar.
Anmtes de utilizar Visual Studio, necesitamos añadir Libpack a las rutas del sistema (sólo tendrás que hacerlo una vez, cuando lo construyas por primera vez). Tienes que ir a "Panel de control >> Sistema>> Configuración avanzada del sistema". En el letrero de diálogo de las "Propiedades del sistema", bajo la pestaña "Avanzadas" está el botón "Variables de entorno". Pulsa sobre el.
Después de pulsar sobre el botón anterior, añade Libpack a las rutas del sistema. Para separarlo de otras rutas usa un ";".
Ahora tienes que iniciar Visual Studio 2008. Visual C++ Express 2008 también funcionará. Antes de construir, es un buen procedimiento copiar el directorio bin de libpack\bin al directorio bin de los archivos de construcción (generados con cMake).
Después ve a "Archivo>> Abrir >> Proyecto/Solución". Necesitas abrir FreeCAD_Trunk.sln, de los archivos de construcción generados con cMake.
Una vez esté abierto, habrá tres menús en la barra de herramientas. Uno de ellos dice "Depurar" - cámbialo a "Release".
Luego ejecuta "Construir>> Construir solución" (o simplemente pulsa F7) - este proceso puede tardar bastante tiempo.
Una vez termine, selecciona "Depurar >> Iniciar sin depuración". Una ventana solicitará que selecciones el archivo exe. Pulsa en el menú bajo "Nombre del archivo ejecutable" y selecciona "Explorar". Tienes que ir al directorio \bin donde están los archivos de código fuente, y seleccionar "FreeCAD.exe"
y ya has terminado!
Construcción desde la línea de comandos
Aquí está un ejemplo de cómo construir FreeCAD desde la línea de comandos:
rem @echo off rem Build script, uses vcbuild to completetly build FreeCAD rem update trunc d: cd "D:\_Projekte\FreeCAD\FreeCAD_0.9" "C:\Program Files (x86)\Subversion\bin\svn.exe" update rem set the aprobiated Variables here or outside in the system set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem set INCLUDE= set LIB= rem Register VS Build programms call "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" rem Set Standard include paths set INCLUDE=%INCLUDE%;%FrameworkSDKDir%\include set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include rem Set lib Pathes set LIB=%LIB%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib set LIB=%LIB%;%PROGRAMFILES%\Microsoft Visual Studio\VC98\Lib rem Start the Visuall Studio build process "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe" "D:\_Projekte\FreeCAD FreeCAD_0.9_build\FreeCAD_trunk.sln" /useenv
Construcción de versiones antiguas
Utilizando LibPack
Para hacer más sencillo tener FreeCAD compilado, proporcionamos una colección de todas las librerías necesarias. Se llama LibPack. Puedes encontrarlas en la página de descargas en Sourceforge.
Necesitas establecer las siguientes variables de entorno:
- FREECADLIB = "D:\Wherever\LIBPACK"
- QTDIR = "%FREECADLIB%"
Añadir "%FREECADLIB%\bin" y "%FREECADLIB%\dll" a la variable de sistema PATH. Recuerda que tienes que reemplazar "%FREECADLIB%" con el nombre de la ruta, ya que Windows no reemplaza recursivamente las variables de entorno.
Directorio de setup en Visual Studio
Es necesario definir algunas rutas de búsqueda en Visual Studio. Para cambiarlas, utiliza el menú Tools→Options→Directory
Include
Añade las siguientes rutas de búsqueda a la lista de rutas de búsqueda de include:
- %FREECADLIB%\include
- %FREECADLIB%\include\Python
- %FREECADLIB%\include\boost
- %FREECADLIB%\include\xercesc
- %FREECADLIB%\include\OpenCascade
- %FREECADLIB%\include\OpenCV
- %FREECADLIB%\include\Coin
- %FREECADLIB%\include\SoQt
- %FREECADLIB%\include\QT
- %FREECADLIB%\include\QT\Qt3Support
- %FREECADLIB%\include\QT\QtCore
- %FREECADLIB%\include\QT\QtGui
- %FREECADLIB%\include\QT\QtNetwork
- %FREECADLIB%\include\QT\QtOpenGL
- %FREECADLIB%\include\QT\QtSvg
- %FREECADLIB%\include\QT\QtUiTools
- %FREECADLIB%\include\QT\QtXml
- %FREECADLIB%\include\Gts
- %FREECADLIB%\include\zlib
Libs
Añade las siguientes rutas de búsqueda a la lista de rutas de búsqueda de lib:
- %FREECADLIB%\lib
Executables
Añade las siguientes rutas de búsqueda a la lista de rutas de búsqueda de executable:
- %FREECADLIB%\bin
- TortoiseSVN directorio de instalación binario, normalmente "C:\Programm Files\TortoiseSVN\bin", este es necesario para una construcción de distribución cuando SubWVRev.exe se utiliza para extraer el número de versión de Subversion.
Necesidades de Python
Durante la compilación se ejecutan algunos archivos de guión en Python. De modo que el interprete de Python tiene que funcionar en el OS. Utiliza un comando para comprobarlo. Si no lo encuentra indicará algo similar a Cannot find python.exe. Si utilizas LibPack también puedes usar python.exe en el directorio bin.
Especial para VC8
Cuando se construye el proyecto con VC8, tienes que cambiar la información vinculada para la librería WildMagic, ya que necesitas una versión diferente para VC6 y VC8. Ambas versiones están suministradas en LIBPACK/dll. En las propiedades del proyecto para AppMesh cambia el nombre de la biblioteca wm.dll a la versión de VC8. Ten cuidado de cambiarla en Debug y configuración de la versión.
Compilación
Después de que ajustes todos los pre-requisitos la compilación está - esperemos - solo a un clic de ratón en VC ;-)
Después de compilar Compiling
Para tener FreeCAD funcionando desde el entorno de compilación necesitas copiar unos cuantos archivos de LibPack al directorio bin donde FreeCAD.exe está instalado después de una construcción satisfactoria:
- python.exe y python_d.exe de LIBPACK/bin
- python25.dll y python25_d.dll de LIBPACK/bin
- python25.zip de LIBPACK/bin
- Haz una copia de Python25.zip y renombralo a Python25_d.zip
- QtCore4.dll de LIBPACK/bin
- QtGui4.dll de LIBPACK/bin
- boost_signals-vc80-mt-1_34_1.dll de LIBPACK/bin
- boost_program_options-vc80-mt-1_34_1.dll de LIBPACK/bin
- xerces-c_2_8.dll de LIBPACK/bin
- zlib1.dll de LIBPACK/bin
- coin2.dll de LIBPACK/bin
- soqt1.dll de LIBPACK/bin
- QtOpenGL4.dll de LIBPACK/bin
- QtNetwork4.dll de LIBPACK/bin
- QtSvg4.dll de LIBPACK/bin
- QtXml4.dll de LIBPACK/bin
Cuando se utiliza LibPack con una versión de Python anterior a la 2.5 tienes que copiar los siguientes archivos:
- zlib.pyd y zlib_d.pyd de LIBPACK/bin/lib. Estos se necesitan por Python para abrir la biblioteca de Python comprimida.
- _sre.pyd y _sre_d.pyd de LIBPACK/bin/lib. Estos se necesitan por Python para la construcción en el sistema de ayuda.
Si no consigues ejecutarlo debido a un error en Python es bastante probable que uno de los archivos zlib*.pyd no se pueda localizar.
Material adicional
Si quieres construir la documentación del código fuente necesitas DoxyGen.
Para crear un paquete de instalación necesitas WIX.
Durante la compilación se ejecutan algunos archivos de guión en Python. De modo que el interprete de Python tiene que funcionar correctamente.
Para obtener más detalles echa un vistazo al README.Linux en tus fuentes.
Antes de nada deberías construir el plugin Qt que proporciona todos los widgets personalizados de FreeCAD que necesitamos para el Qt Designer. Las fuentes se encuentran en
//src/Tools/plugins/widget//.
De momento no proporcionamos un -- pero ejecutando
qmake plugin.pro
se crea. Una vez hecho, llamando a make se creará la biblioteca
//libFreeCAD_widgets.so//.
Para hacer que esta biblioteca sea conocida por Qt Designer tienes que copiar el archivo a
//$QTDIR/plugin/designer//.
En las distribuciones recientes de Linux, FreeCAD es generalmente bastante fácil de construir, ya que todas las dependencias están proporcionadas por el gestor de paquetes. Básicamente, solo tendrás que seguir 3 pasos: 1) Conseguir el código fuente de FreeCAD 2) Instalar las dependencias (paquetes de los que depende FreeCAD) 3) Compilar con "cmake . && make"
Abajo encontrarás explicaciones detalladas del proceso completo y particularidades que podrías encontrar. Si encuentras algún error o algo anticuado (las distribuciones de Linux cambian a menudo) en lo que viene a continuación, por favor ayúdanos corrigiéndolo.
Consiguiendo el código fuente
Antes de que puedas compilar FreeCAD, debes conseguir el código fuente. Hay tres modos de conseguirlo:
Git
El modo más rápido y el mejor de obtener el código es clonar el repositorio de solo lectura de Git (necesitas tener instalado el paquete de git)::
git clone git://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad freecad
Esto situará una copia de la última versión del código fuente de FreeCAD en un nuevo directorio denominado "freecad". La primera vez que intentes conectar al huesped free-cad.git.sourceforge.net, deberías ver un mensaje solicitando la autenticidad de la clave SSH de sourceforge, que es normalmente seguro para aceptar (puedes comprobar sus claves SSH en la web de sorceforge si no estás seguro)
Gihub
Existe un repositorio de FreeCAD en Gihub siempre al día: github.com/FreeCAD/FreeCAD_sf_master
Páquetes de código fuente
Como alternativa, puedes descargar un paquete de código fuente, pero podría ser ya bastante antiguo así que es siempre mejor conseguir el último código fuente desde Git o Subversion. Dependiendo de tu distribución, existen varias formas de conseguir un paquete de código fuente:
Paquetes de código fuente oficiales de FreeCAD (independientes de la distribución): https://sourceforge.net/projects/free-cad/files/FreeCAD%20Source/ Debian: http://packages.debian.org/source/sid/freecad Ubuntu: http://packages.ubuntu.com/source/precise/freecad
Consiguiendo las dependencias
Para compilar FreeCAD en Linux primero tienes que instalar todas las bibliotecas mencionadas en Bibliotecas de Terceros. En las distribuciones más recientes esto es generalmente cuestión de instalar algunos paquetes:
Debian y Ubuntu
En los sistemas basados en Debian es bastante sencillo instalar todas las dependencias necesarias. La mayoría de las librerías están disponibles vía apt-get o el gestor de paquetes synaptic. Abajo están listados todos los paquetes que necesitas instalar. Si no utilizas la versión más reciente de tu distribución, algunos de los paquetes de abajo podrían no aparecer en los repositorios. En dicho caso, mira en la sección #Distribuciones antiguas y no convencionales más abajo.
build-essential cmake python libtool libcoin60-dev libsoqt4-dev libxerces-c-dev libboost-dev libboost-filesystem-dev libboost-regex-dev libboost-program-options-dev libboost-signals-dev libboost-thread-dev libqt4-dev qt4-dev-tools libqt4-opengl-dev python-dev O: libopencascade-dev (versión oficial de Opencascade) o: liboce*-dev (versión de la comunidad de Opencascade) oce-draw gfortran libeigen3-dev libqtwebkit-dev libode-dev swig libzipios++-dev
Opcionalmente también puedes instalar
libsimage-dev (para que Coin soporte formatos de imágenes adicionales) checkinstall (para registrar tus archivos instalados en tu gestor de paquetes del sistema, así puedes desinstalarlo después fácilmente) python-pivy (necesitado por el módulo de Bocetado 2D) python-qt4 (necesitado por el módulo de Bocetado 2D) doxygen and libcoin60-doc (si pretendes generar la documentación del código fuente) libspnav-dev (para soportar dispositivos de 3Dconnexion como Space Navigator o Space Pilot)
Fedora
Necesitas los siguientes paquetes:
cmake doxygen swig gcc-gfortran gettext dos2unix desktop-file-utils libXmu-devel freeimage-devel mesa-libGLU-devel OCE-devel python python-devel boost-devel tbb-devel eigen3-devel qt-devel qt-webkit-devel ode-devel xerces-c xerces-c-devel opencv-devel smesh-devel coin2-devel soqt-devel
Y opcionalmente:
libspnav-devel (para soportar dispositivos 3Dconnexion como el Space Navigator o Space Pilot)
pivy ( https://bugzilla.redhat.com/show_bug.cgi?id=458975 Pivy no es obligatorio pero si necesario para el módulo de Boceto)
La construcción de FreeCAD con coin3 aún es bastante frustante en Fedora, ya que sólo coin2 se proporciona en los repositorios oficiales, pero si quieres de todos modos, puedes evitar reconstruir todo el conjunto de coin3 / soqt / pivy instalando paquetes preparados para su ejecución de coin3 desde http://www.zultron.com/rpm-repo/
Gentoo
Necesitas los siguientes paquetes para construir FreeCAD:
dev-cpp/eigen dev-games/ode dev-libs/boost dev-libs/xerces-c dev-python/pivy dev-python/PyQt4 media-libs/coin media-libs/SoQt sci-libs/opencascade-6.5 sys-libs/zlib virtual/fortran x11-libs/qt-gui x11-libs/qt-opengl x11-libs/qt-svg x11-libs/qt-webkit x11-libs/qt-xmlpatterns dev-lang/swig-2.0.4-r1 app-admin/eselect-python-20091230 dev-lang/python-2.7.2-r3 dev-util/cmake-2.8.4 sys-apps/findutils-4.4.0
Desde que opencascade no está disponible, podrías compilar también opencascade, para lo cual se necesitas las siguientes librerías:
media-libs/ftgl virtual/opengl x11-libs/libXmu dev-lang/tcl-8.5.9 dev-lang/tk-8.5.9-r1 dev-tcltk/itcl-3.4_beta1 dev-tcltk/itk-3.4_pre20090417 dev-tcltk/tix-8.4.3 x11-libs/gl2ps sys-devel/automake-1.11 sys-devel/autoconf-2.68 sys-devel/libtool dev-java/java-config-2.1.11-r3
OpenSUSE
Necesitas los siguientes paquetes:
gcc cmake OpenCASCADE-devel libXerces-c-devel python-devel libqt4-devel python-qt4 Coin-devel SoQt-devel boost-devel libode-devel libQtWebKit-devel libeigen3-devel gcc-fortran
Para la versión no estable FreeCAD 0.13 necesitas añadir las bibliotecas Eigen3 y swig, que parece que no están en los repositorios estándar. Puedes conseguirlos aquí:
Eigen3: http://software.opensuse.org/search?q=eigen3&baseproject=openSUSE%3A12.1&lang=en&exclude_debug=true swig: http://software.opensuse.org/search?q=swig&baseproject=openSUSE%3A12.1&lang=en&exclude_debug=true
También, observa que la biblioteca Eigen3 de Factory Education causa problemas a veces, así que utiliza la de KDE 4.8 Extra repo
Distribuciones antiguas y no convencionales
En otras distribuciones, tenemos poca información de los usuarios, de modo que podría ser complicado encontrar los paquetes requeridos. Prueba primero localizando las bibliotecas requeridas mencionadas en Bibliotecas de terceros. Ten en cuenta que alguna de ellas podría tener un nombre de paquete ligeramente diferente en tu distribución (como name, libname, name-dev, name-devel, etc...).
También necesitas el [GNU gcc compiler] versión igual o superior a la 3.0.0. g++ también se necesita porque FreeCAD está completamente escrito en C++. Durante la compilación se ejecutan algunos archivos de guión de Python. De modo que el interprete de Python debe funcionar correctamente. Para evitar cualquier tipo de problemas de enlaces durante el proceso de construcción es una buena idea tener las rutas de las bibliotecas en la variable LD_LIBRARY_PATH o en el archivo ld.so.conf. Este es normalmente el caso en las distribuciones recientes.
Para ver más detalles echa un vistazo al README.Linux en tu código fuente.
Abajo hay ayuda adicional para varias bibliotecas que podrían no estar presentes en los repositorios de tu distribición
Eigen 3
La biblioteca Eigen3 es requerida ahora por el módulo del croquizador. Esta biblioteca sólo está disponible a partir de los repositorios de Ubuntu 11.10. Para versiones anteriores de Ubuntu, puedes descargarla desde aquí e instalarla manualmente, o añadir el PPA de construcciones diarias de FreeCAD a tus fuentes de software antes de instalarlo a través de uno de los métodos indicados más abajo.
OpenCASCADE community edition (OCE)
OpenCasCade se ha dividido recientemente en una edición de la comunidad, la cual es mucho, mucho más sencilla de construir. FreeCAD puede utilizar cualquier versión instalada en tu sistema, ya sea la edición "oficial" o la edición de la comunidad. La web de OCE contiene instrucciones detalladas sobre la construcción.
OpenCASCADE versión oficial
Nota: Se recomienda utilizar la edición de la comunidad mencionada arriba, que es más sencilla de construir, pero esta también funciona.
No todas las distribuciones de Linux tienen un paquete oficial de OpenCASCADE en sus repositorios. Tienes que comprobar si existe una disponible para tu distribución. Al menos para Debian Lenny y Ubuntu Intrepid se proporciona un paquete .deb oficial. Para versiones de Debian o Ubuntu más antiguas puedes encontrar paquetes no oficiales aquí. Para construir tu propio paquete .deb privado sigue estos pasos:
wget http://lyre.mit.edu/~powell/opencascade/opencascade_6.2.0.orig.tar.gz wget http://lyre.mit.edu/~powell/opencascade/opencascade_6.2.0-7.dsc wget http://lyre.mit.edu/~powell/opencascade/opencascade_6.2.0-7.diff.gz
dpkg-source -x opencascade_6.2.0-7.dsc
# Install OCC build-deps sudo apt-get install build-essential devscripts debhelper autoconf automake libtool bison libx11-dev tcl8.4-dev tk8.4-dev libgl1-mesa-dev libglu1-mesa-dev java-gcj-compat-dev libxmu-dev
#Build Opencascade packages. This takes hours and requires # at least 8 GB of free disk space cd opencascade-6.2.0 ; debuild
# Install the resulting library debs sudo dpkg -i libopencascade6.2-0_6.2.0-7_i386.deb libopencascade6.2-dev_6.2.0-7_i386.deb
Alternativamente, puedes descargar y compilar la última versión desde opencascade.org:
Instala el paquete normalmente, se consciente de que el instalador es un programa en Java que requiere la edición oficial de Java de Sun (nombre de paquete: sun-java6-jre), no la versión de código libre de Java (gij) que está incluida con Ubuntu. Puedes instalarlo si fuera necesario:
sudo apt-get remove gij sudo apt-get install sun-java6-jre
Ten cuidado, si estas utilizando gij Java con otras cosas como un plugin de tu navegador, dejarán de funcionar. Si el instalador no funciona, prueba:
java -cp path_to_file_setup.jar <-Dtemp.dir=path_to_tmp_directory> run
Una vez que el paquete está instalado, ve al directorio "ros" dentro de opencascade, y haz
./configure --with-tcl=/usr/lib/tcl8.4 --with-tk=/usr/lib/tk8.4
ahora puedes construirlo. Vuelve al directorio ros y haz:
make
Puede llevar algo de tiempo, incluso algunas horas.
Cuando esté terminado, simplemente instala con
sudo make install
Los archivos de biblioteca se copiarán a /usr/local/lib donde serán encontrados automáticamente por cualquier programa. Alternativamente, también puedes hacer
sudo checkinstall
lo cual hará lo mismo que make install pero crea una entrada en tu sistema de gestión de paquetes para que puedas desinstalarlo fácilmente después. Ahora limpia la gran cantidad de archivos temporales de compilación haciendo
make clean
Posible error 1: Si estas utilizando OCC version 6.2, es probable que el compilador pare justo después de empezar la operación "make". Si sucede esto, edita el archivo "configure", localiza la declaración CXXFLAGS="$CXXFLAGS ", y reemplazala por CXXFLAGS="$CXXFLAGS -ffriend-injection -fpermissive". Luego haz el paso de configure de nuevo.
Posible error 2: Posiblemente varios módulos (WOKSH, WOKLibs, TKWOKTcl, TKViewerTest y TKDraw) indiquen que no pueden encontrar las cabeceras de tcl/tk. En ese caso, ya que la opción no está presente en el archivo configure, tendrás que editar manualmente el makefile de cada uno de estos módulos: Ve a adm/make y en cada uno de los directorios de los módulos con problemas. Edita el Makefile, y localiza las líneas CSF_TclLibs_INCLUDES = -I/usr/include y CSF_TclTkLibs_INCLUDES = -I/usr/include y añade /tcl8.4 y /tk8.4 en ellas de modo que se puedan leer: CSF_TclLibs_INCLUDES = -I/usr/include/tcl8.4 y CSF_TclTkLibs_INCLUDES = -I/usr/include/tk8.4
SoQt
La biblioteca SoQt library debe compilarse contra Qt4, que es el caso de las distribuciones más recientes. Pero en el momento de escribir este artículo solo existían paquetes SoQt4 disponibles para Debian pero no para todas las versiones de Ubuntu. Para construir estos paquetes sigue los siguientes pasos:
wget http://ftp.de.debian.org/debian/pool/main/s/soqt/soqt_1.4.1.orig.tar.gz wget http://ftp.de.debian.org/debian/pool/main/s/soqt/soqt_1.4.1-6.dsc wget http://ftp.de.debian.org/debian/pool/main/s/soqt/soqt_1.4.1-6.diff.gz dpkg-source -x soqt_1.4.1-6.dsc sudo apt-get install doxygen devscripts fakeroot debhelper libqt3-mt-dev qt3-dev-tools libqt4-opengl-dev cd soqt-1.4.1 debuild sudo dpkg -i libsoqt4-20_1.4.1-6_i386.deb libsoqt4-dev_1.4.1-6_i386.deb libsoqt-dev-common_1.4.1-6_i386.deb
Si estas en un sistema de 64bit system, probablemente tendrás que cambiar i386 por amd64.
Pivy
Pivy no es necesario para construir FreeCAD o para ejecutarlo, pero es necesario para que funcione el módulo de croquizado 2D. Si no vas a utilizar ese módulo, no necesitas pivy. En el momento de escribir este artículo, Pivy aún es muy reciente y podría no estar incluido en los repositorios de tu distribución. Si no puedes encontrar Pivy en los repositorios de paquetes de tu distribución, puedes aprovechar los paquetes de Debian/Ubuntu en la página de descargas de FreeCAD:
http://sourceforge.net/projects/free-cad/files/FreeCAD%20Linux/
o compila pivy tu mismo:
Compilar FreeCAD
Utilizando cMake
cMake es un sistema de construcción más moderno que tiene la gran ventaja de ser común para diferentes sistemas (Linux, Windows, MacOSX, etc). FreeCAD utilizas ahora el sistema cMake como su sistema principal de construcciones. La compilación con cMake es normalmente muy simple y se hace en 2 pasos. En el primer paso, cMake comprueba que todos los programas necesarios y bibliotecas están presentes en tu sistema y define todo lo que es necesario para la compilación. Se te darán unas cuantas alternativas detalladas más abajo, pero FreeCAD viene con faltas sensibles. El segundo paso es la compilación en si misma, que produce el ejecutable de FreeCAD.
Ya que FreeCAD es una aplicación pesada, la compilación puede llevar algo de tiempo (unos 10 minutos en un ordenador rápido, 30 minutos en uno lento)
Construcción dentro del código
FreeCAD puede construirse dentro del código, que quiere decir que todos los archivos resultantes de la compilación permanecen en el mismo archivo que el código fuente. Este está bien si simplemente estas ojeando FreeCAD, y quieres eliminarlo fácilmente borrando ese directorio. Pero en caso de que planees compilarlo a menudo, se recomienda realizar una construcción fuera del código fuente, que ofrece algunas ventajas más. Los siguientes comandos compilaran freecad:
cd freecad (the folder where you cloned the freecad source) cmake . make
Tu ejecutable de FreeCAD estará en el directorio "bin", y puedes ejecutarlo con:
./bin/FreeCAD
Construcción fuera del código
Si pretendes seguir la rápida evolución de FreeCAD, la construcción en un directorio separado es mucho más conveniente. Cada vez que actualices el código fuente, cMake distinguirá de forma inteligente que archivos han cambiado, y recompilará sólo lo que necesita. Las construcciones fuera del código son especialmente útiles utilizando el sistema Git, porque puedes fácilmente probar otras ramas sin confusiones del sistema de construcción. Para construir fuera del código, simplemente crea un directorio de construcción, distinto del de código fuente, y desde el directorio de construcción apunta a cMake hacia el directorio del código fuente:
mkdir freecad-build cd freecad-build cmake ../freecad (o cualquier otra rutaq al directorio de código fuente) make
Tu ejecutable estará en el directorio "bin".
Opciones de configuración
Hay varios módulos experimentales o sin terminar que podrías construir si quieres trabajar en ellos. Para hacerlo, necesitas establecer las opciones apropiadas para la fase de configuración. Hazlo con la línea de comandos, pasando opciones -D <var>:<type>=<value> a cMake o utilizando uno de los interfaces disponibles (por ejemplo para Debian, los paquetes cmake-qt-gui o cmake-curses-gui).
Como ejemplo, para configurar con la línea de comandos con la construcción del módulo de ensamblajes:
cmake -D FREECAD_BUILD_ASSEMBLY:BOOL=ON path-to-freecad-root
Las opciones posibles están listadas en el archivo CmakeLists.txt del directorio raíz de FreeCAD.
Utilizando autotools
Autotools está en proceso de ser despreciado en favor de cMake, pero por el momento aún está disponible para construir FreeCAD. Debes tener instalados automake y libtool en tu sistema; en Debian/Ubuntu:
aptitude install automake libtool
Si obtienes el código fuente con Git o Subversion, entonces el primer paso debe ser
./autogen.sh
eso crea el archivo de guión de configuración y más. Para el proceso de construcción en si mismo proporcionamos un archivo de guión de configuración. Simplemente escribe
./configure
Para tener todo configurado. Si quieres un resumen de todas las opciones que puedes especificar, puedes escribir
./configure --help
Normalmente no necesitaras ninguna de ellas - a menos que tengas una de tus bibliotecas en un directorio realmente nada habitual. Después de terminar la configuración, la compilación de FreeCAD es tan simple como
make
Si se produce cualquier error durante la construcción a partir del código fuente, por favor comprueba de nuevo esta página y el archivo README.Linux, luego puedes ir al Gestor de incidencias en SourceForge, seleccionaCualquiera para el estado y pulsa el botón del Navegador para ver informes anteriores de problemas de compilación. Después de construir FreeCAD satisfactoriamente, haz
make install
para instalarlo en tu equipo. El directorio de instalación por defecto es
~/FreeCAD
Se instalará en un directorio de FreeCAD en tu directorio home, de modo que no necesitas privilegios de administrador. En lugar de make install, también puedes hacer
checkinstall
En este caso FreeCAD se instalará por tu sistema de gestión de paquetes, así lo puedes desinstalar luego fácilmente. Pero ya que todas las instalaciones de FreeCAD están dentro de un único directorio, simplemente eliminando el directorio de FreeCAD también es un método de desinstalación válido.
Qt designer plugin
Si quieres desarrollar material en Qt para FreeCAD, necesitaras el plugin Qt Designer que proporciona todos los widgets o complementos personalizados de FreeCAD. Ve a
freecad/src/Tools/plugins/widget
De momento no proporcionamos un makefile -- pero llamando
qmake plugin.pro
se crea. Una vez hecho esto, llamando
make
se creará la biblioteca libFreeCAD_widgets.so. Para hacer que esta biblioteca sea conocida por Qt Designer tienes que copiar el archivo a
$QTDIR/plugin/designer
Doxygen
Si eres suficiente audaz como para bucear entre el código, podrías aprovechar para construir y consultar la Documentación del código de FreeCAD generada por Doxygen
Creación de un paquete para Debian
Si piensas construir un paquete de Debian a partir del código fuente necesitas instalar dichos paquetes antes:
dh-make devscripts lintian (opcional, utilizado para comprobar si los paquetes cumples las normas)
Para construir un paquete abre una consola, y simplemente ve al directorio de FreeCAD y ejecuta
debuild
Una vez que el paquete se ha construido, puedes utilizar lintian para comprobar si el paquete contiene errores
lintian your-fresh-new-freecad-package.deb (reemplazar por el nombre del paquete que has creado)
Solución de problemas
Nota para sistemas de 64bit
Cuando se construye FreeCAD para sistemas de 64-bit existe una incidencia con el paquete OpenCASCADE de 64-bit. Para tener FreeCAD funcionando correctamente podrías necesitar ejecutar el archivo ./configure con la definición adicional _OCC64 establecida:
./configure CXXFLAGS="-D_OCC64"
Para sistemas basados en Debian no es necesario utilizar la solución anterior cuando se utilizan paquetes preconstruidos porque allí el paquete OpenCASCADE está construido para establecer internamente esta definición. Ahora simplemente necesitas compilar FreeCAD del mismo modo que se describe arriba.
Macros Automake
El archivo configure de FreeCAD hace uso de varias macros automake que a veces no se instalan con sus paquetes: bnv_have_qt.m4, coin.m4, y soqt.m4. Si es necesario (error durante la configuración), búscalos en google y los encontrarás fácilmente. Hay algunos archivos de guión simples que necesitas poner en tu directorio /usr/share/aclocal.
Fedora 13
Para construir e instalar FreeCAD en Fedora 13, se necesitan unos cuantos trucos y consejos:
- Instala los paquetes requeridos, la mayoría están disponibles en los repositorios de Fedora 13
- Descarga y construye xerces
- Descarga y construye OpenCascade. Necesitas que apunte a xmu: ./configure --with-xmu-include=/usr/include/X11/Xmu --with-xmu-library=/usr/lib
- Descarga y construye Pivy. Tienes que eliminar 2 referencias no existentes a "SoQtSpaceball.h" desde pivy/interfaces/soqt.i poniendo las dos líneas como comentarios se permite la construcción e instalación.
- Configura Freecad. Necesitasa que apunte a varias cosas: ./configure --with-qt4-include=/usr/include --with-qt4-bin=/usr/lib/qt4/bin --with-occ-lib=/usr/local/lib --with-occ-include=/usr/local/inc --with-xercesc-lib=/usr/local/lib
- make - muestra un problema en el que la construcción se rompe porque la ldflags para soqt está definida como "-LNONE" y hace que libtool lo devuelva. Mi solución fue modificar /usr/lib/Coin2/conf/soqt-default.cfg para que ldflags sea "" en lugar de "-LNONE". Después de esto -> Funciona!
- make install
Ubuntu Lucid
En Ubuntu Lucid, no necesitas el qtwebkit-dev, ya que se incluye en qt4-dev.
Archivos de guión de construcción automáticos
Aquí está todo lo que necesitas para una construcción completa de FreeCAD. En un único archivo de guión y funciona en las distribuciones más recientes. El comando preguntará por la contraseña del root (para la instalación de los paquetes) y a veces para reconocer algún servidor de repositorios externo o de https-subversion. Este archivo de guión debería ejecutarse en versiones de 32 y 64 bit. Están escritos para distintas versiones, pero seguramente funcionen también en versiones posteriores con algún ligero cambio o tal cual están.
Si tienes un archivo de guión similar para tu distribución preferida, por favor envíanoslo! Lo incorporaremos a este artículo.
Observa que este archivo de guión comienza añadiendo el repositorio PPA de construcción diaria de FreeCAD así se puede proceder con la instalación de la biblioteca Eigen3 (libeigen3-dev). Si ya tienes esta biblioteca instalada en tu sistema, puedes eliminar la primera línea.
Ubuntu 10.04 LTS - Lucid Lynx / Ubuntu 10.10 Maverick Meerkat / Ubuntu 11.04 Natty Narwhal
sudo add-apt-repository ppa:freecad-maintainers/freecad-daily && sudo apt-get update sudo apt-get install build-essential python libcoin60-dev libsoqt4-dev \ libxerces-c2-dev libboost-dev libboost-date-time-dev libboost-filesystem-dev \ libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev \ libboost-serialization-dev libboost-signals-dev libboost-regex-dev libboost-thread-dev \ libqt4-dev qt4-dev-tools python2.7-dev libopencascade-dev libsoqt4-dev \ libode-dev subversion cmake libeigen2-dev libsimage-dev python-qt4 \ libtool autotools-dev automake bison flex gfortran libeigen3-dev libqtwebkit-dev git # checkout the latest source svn co https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk freecad # go to source dir cd freecad # build configuration cmake . # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
# use FreeCAD ./FreeCAD
# Update latest version
# go to source dir cd freecad # Update source svn update # build configuration cmake . # build FreeCAD make
OpenSUSE 12.2
No se necesitan repositorios externos para compilar FreeCAD 0.13 con esta versión. Sin embargo, existe una incompatibilidad con python3-devel que es preciso eliminar. FreeCAD puede compilarse desde GIT de forma similar en OpenSUSE 12.2
# install needed packages for development sudo zypper install gcc cmake OpenCASCADE-devel libXerces-c-devel \ python-devel libqt4-devel python-qt4 Coin-devel SoQt-devel boost-devel \ libode-devel libQtWebKit-devel libeigen3-devel gcc-fortran git swig # create new dir, and go into it mkdir FreeCAD-Compiled cd FreeCAD-Compiled # get the source git clone git://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad # Now you will have subfolder in this location called free-cad. It contains the source # make another dir for compilation, and go into it mkdir FreeCAD-Build1 cd FreeCAD-Build1 # build configuration cmake ../free-cad # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
Ya que estas utilizando Git, la próxima vez que quieras compilar no tendrás que clonar todo, simplemente tira desde Git y compila una vez más
# go into free-cad dir created earlier cd free-cad # pull git pull # get back to previous dir cd .. # Now repeat last few steps from before. # make another dir for compilation, and go into it mkdir FreeCAD-Build2 cd FreeCAD-Build2 # build configuration cmake ../free-cad # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
OpenSUSE 12.1
Para la versión en desarrollo 0.13 de FreeCAD necesitas añadir las bibliotecas Eigen3 y swig, que no parecen estar disponibles en los repositorios estándar. Puedes obtenerlas aquí:
Eigen3: http://software.opensuse.org/search?q=eigen3&baseproject=openSUSE%3A12.1&lang=en&exclude_debug=true
swig: http://software.opensuse.org/search?q=swig&baseproject=openSUSE%3A12.1&lang=en&exclude_debug=true
# install needed packages for development sudo zypper install gcc cmake OpenCASCADE-devel libXerces-c-devel \ python-devel libqt4-devel python-qt4 Coin-devel SoQt-devel boost-devel \ libode-devel libQtWebKit-devel libeigen3-devel gcc-fortran git # create new dir, and go into it mkdir FreeCAD-Compiled cd FreeCAD-Compiled
# get the source git clone git://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad # Now you will have subfolder in this location called free-cad. It contains the source # make another dir for compilation, and go into it mkdir FreeCAD-Build1 cd FreeCAD-Build1 # build configuration cmake ../free-cad # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
Ya que estas utilizando Git, la próxima vez que quieras compilar no tendrás que clonar todo, simplemente tira desde Git y compila una vez más
# go into free-cad dir created earlier cd free-cad # pull git pull
# get back to previous dir cd .. # Now repeat last few steps from before. # make another dir for compilation, and go into it mkdir FreeCAD-Build2 cd FreeCAD-Build2 # build configuration cmake ../free-cad # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
make # test FreeCAD cd bin ./FreeCAD -t 0
OpenSuse 11.2
Este archivo de guión no funciona de momento porque:
- libXerces-c-devel parece haber desaparecido....
# install needed packages for development sudo zypper install gcc cmake subversion OpenCASCADE-devel \ libXerces-c-devel python-devel libqt4-devel python-qt4 \ Coin-devel SoQt-devel boost-devel libode-devel libQtWebKit-devel \ libeigen2-devel gcc-fortran # get the source svn co https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk freecad # go to source dir cd freecad # build configuration cmake . # build FreeCAD nice make # test FreeCAD cd bin ./FreeCAD -t 0
OpenSuse 11.1
# additional repository (for OpenCascade) sudo zypper -p http://packman.unixheads.com/suse/11.1/ # install needed packages for development sudo zypper install gcc cmake subversion OpenCASCADE-devel \ libXerces-c-devel python-devel libqt4-devel python-qt4 \ Coin-devel SoQt-devel boost-devel libode-devel libQtWebKit-devel \ libeigen2-devel # get the source svn co https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk freecad # go to source dir cd freecad # build configuration cmake . # build FreeCAD nice make # test FreeCAD cd bin ./FreeCAD -t 0
Debian Squeeze
# get the needed tools and libs sudo apt-get install build-essential python libcoin60-dev libsoqt4-dev \ libxerces-c2-dev libboost-dev libboost-date-time-dev libboost-filesystem-dev \ libboost-graph-dev libboost-iostreams-dev libboost-program-options-dev \ libboost-serialization-dev libboost-signals-dev libboost-regex-dev \ libqt4-dev qt4-dev-tools python2.5-dev \ libsimage-dev libopencascade-dev \ libsoqt4-dev libode-dev subversion cmake libeigen2-dev python-pivy \ libtool autotools-dev automake gfortran # checkout the latest source svn co https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk freecad # go to source dir cd freecad # build configuration cmake . # build FreeCAD make # test FreeCAD cd bin ./FreeCAD -t 0
Actualizando el código fuente
El desarrollo de FreeCAD sucede rápidamente, cada día se arreglan errores y se agregan nuevas características. El sistema cmake te permite actualizar inteligentemente el código fuente, y sólo recompila lo que ha cambiado, haciendo las siguientes compilaciones realmente rápidas. La actualización del código fuente con Git o Subversion es muy sencilla:
cd freecad (o donde has clonado el código fuente la primera vez) git pull (si utilizas Git)
Luego, no necesitas ejecutar cmake de nuevo, simplemente haz:
cd ../freecad-build (o donde sea tu directorio de construcción) make
Ya que Mac OS X está basado en BSD (UNIX), la compilación de FreeCAD en Mac no es muy diferente a la Compilación en Unix, sin embargo existen algunos detalles específicos para Mac que son críticos para tener todo funcionando correctamente. Estas instrucciones se han probado en Lion (10.7), pero también deberían funcionar en Intel Macs utilizando (Snow) Leopard.
Descargar las fuentes de FreeCAD
Comprueba la última versión del árbol de código fuente de FreeCAD del repositorio de subversion en Sourceforge:
svn co http://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk free-cad
Instalar dependencias
En Mac OS X 10.7, las siguientes dependencias NO están incluidas con el sistema y por tanto deben ser instaladas antes de construir FreeCAD:
- sip
- fortran
- xerces-c
- boost
- eigen
- ftgl
- coin3d
- OpenCASCADE
- Qt
- pyqt
- soqt
Opción 1: Homebrew
Nota: Esta sección está en proceso de construcción! Mira en el foro de ayuda para conocer las últimas novedades.
Descarga e instala el gestor de paquetes Homebrew:
Luego compila e instala la mayoría de dependencias de FreeCAD:
brew install sip gfortran xerces-c boost eigen coin qt pyqt soqt ftgl
Ve a CompileOnMac/es#Construir OpenCASCADE.
Opción 2: MacPorts/Fink
Nota: Esta sección necesita actualizarse.
Instala MacPorts, si aún no lo tienes. MacPorts es un sistema que permite descargar, compilar, e instalar muchas aplicaciones de código libre con un simple comando. Aplicaciones similares en el mundo UNIX/Linux son PKGSRC y APT. Para instalar, simplemente descarga la imagen del disco desde la web de MacPorts y sigue las instrucciones:
Hubieras instalado MacPorts o no, probablemente querrás asegurarte de que está actualizado. Ejecuta:
sudo port selfupdate
Ahora que MacPorts está instalado y actualizado, puedes comenzar a instalar algunos paquetes requeridos por FreeCAD:
- xercesc
- boost
- py-sip
- ftlg
- f2c
- eigen3
- py-pyqt4
El comando siguiente compilará/instalará todas las bibliotecas de arriba. Si MacPorts produce errores, puedes tratar de instalarlos uno a uno.
sudo port install xercesc boost ftgl f2c eigen3 py-sip py-pyqt4
Ten en cuenta que para los paquetes de Python como py-sip y py-pyqt4, existen múltiples paquetes, uno para cada versión de MacPorts de Python.
Ten en cuenta que boost es un paquete bastante grande, y py-pyqt4 depende de qt4-mac, que también es un paquete bastante grande. Puedes querer ejecutar port -v install así tendrás una idea de lo que va sucediendo durante estas construcciones largas.
Instalar un compilador de Fortran
También necesitas un compilador de FORTRAN. El de Apple de gcc en OSX no viene con FORTRAN. Un instalador de GFortran se puede encontrar aquí: http://gcc.gnu.org/wiki/GFortranBinaries#MacOS
Si estas utilizando fink, otro método es utilizar los siguientes comandos (intentado por Shaneyfelt 2100.Nov.14)
sudo fink selfupdate sudo fink install gcc46
Esto instala otra colección del compilador gcc con el nombre gcc-4 para evitar un conflicto de nombres con el de Apple. Por supuesto esto asume que también tienes fink instalado. Quizá exista un modo más simple?
Los paquete de gcc4x para MacPorts también incluyen compiladores de FORTRAN, así que esto también debería funcionar:
sudo port install gcc46
Otro paquete posible para MacPorts es g95. Este parece tener un compilador válido para FORTRAN90 y pasará los test de configuración del cmake de FreeCAD, pero la construcción actual parece preguntar por opciones de gcc-specific, así que probablemente se más sencillo pegarlo a gcc4x.
Instalar Eigen3
Descarga y descomprime la última versión de la biblioteca eigen3 aquí: http://eigen.tuxfamily.org/index.php?title=Main_Page Es necesario para la funcionalidad del solucionador. Una vez descomprimido, el directorio denominado 'Eigen' se puede mover dentro de /usr/local/include/eigen3/
Construir OpenCASCADE
Actualmente, el modo más simple de construir OpenCASCADE en OS X es a partir de la (oce). Descarga el código fuente o comprueba el repositorio de Git aquí:
Luego, en un terminal:
mkdir build cd build cmake .. cd .. make make install/strip
Descargar e 'instalar' la plantilla de FreeCAD.app
El siguiente archivo contiene una plantilla empaquetada de la aplicación para FreeCAD. No es estrictamente necesario, pero hace el trabajo con FreeCAD más conveniente que la configuración por defecto de la instalación. La recomendada por la instalación está en el directorio /Applications, pero deberías poder ponerla donde quieras -- simplemente recuerda que el paquete no puede moverse después de que FreeCAD es compilado e instalado (sin algunas modificaciones más). Ejecutando make install utilizando la configuración de abajo se instalará en este paquete.
Compilar
Ahora configurar, compilar, e instalar FreeCAD utilizando los siguientes comandos desde el directorio raíz de FreeCAD. Si pones el paquete FreeCAD.app en un sitio diferente a /Applications (o si no estas utilizando este paquete), cambia el argumento 'PREFIX' en consecuencia.
./autogen.sh PREFIX=/Applications/FreeCAD.app/Contents
Si instalaste las dependencias según la opción 1 (Homebrew):
Nota: Esta línea de configuración no ha sido verificada y podría contener errores!
./configure --with-xercesc-lib=/usr/local/lib --with-xercesc-include=/usr/local/include \ --with-boost-lib=/usr/local/lib --with-boost-include=/usr/local/include \ --with-qt4-dir=/usr/local--with-qt4-lib=/usr/local/lib --with-qt4-include=/usr/local/include \ --with-qt4-framework=/usr/local/lib --with-qt4-bin=/usr/local/bin --with-occ-lib=/usr/local/lib \ --with-occ-include=/usr/local/include/oce --with-coin=/usr/local/lib --with-soqt=/usr/local/lib \ --prefix=/Applications/FreeCAD.app/Contents --bindir=/Applications/FreeCAD.app/Contents/MacOS \ --libdir=/Applications/FreeCAD.app/Contents/Frameworks/FreeCAD \ --includedir=/Applications/FreeCAD.app/Contents/Resources/include \ --datarootdir=/Applications/FreeCAD.app/Contents/Resources/share --enable-debug=no \ --with-python-include=/System/Library/Frameworks/Python.framework/Versions/2.5/Headers
O si instalaste las dependencias utilizando la opción 2 (MacPorts/Fink):
./configure --with-xercesc-lib=/opt/local/lib --with-xercesc-include=/opt/local/include \ --with-boost-lib=/opt/local/lib --with-boost-include=/opt/local/include \ --with-qt4-dir=/usr/local/Trolltech/Qt-4.8.0 --with-qt4-lib=/usr/local/Trolltech/Qt-4.8.0/lib \ --with-qt4-include=/usr/local/Trolltech/Qt-4.8.0/include --with-qt4-framework=/Library/Frameworks \ --with-qt4-bin=/usr/local/Trolltech/Qt-4.8.0/bin --with-occ-lib=/usr/local/lib \ --with-occ-include=/usr/local/include/oce --with-coin=/Library/Frameworks \ --with-soqt=/Library/Frameworks --prefix=/Applications/FreeCAD.app/Contents \ --bindir=/Applications/FreeCAD.app/Contents/MacOS --libdir=/Applications/FreeCAD.app/Contents/Frameworks/FreeCAD \ --includedir=/Applications/FreeCAD.app/Contents/Resources/include \ --datarootdir=/Applications/FreeCAD.app/Contents/Resources/share --enable-debug=no \ --with-python-include=/System/Library/Frameworks/Python.framework/Versions/2.5/Headers
Luego:
make make install
Dependiendo de tu equipo, el paso de make puede tardar bastante.
Ejecutar
Si todo ha ido correctamente, doble clic en el paquete .app debería iniciar FreeCAD. Si tienes algún inconveniente, escribe los detalles en el foro de ayuda.
PyQt4
Algunos usuarios han informado de un mensaje de error indicando "No hay ningún módulo llamado PyQt4" en el inicio de FreeCAD. Este es un método para corregirlo:
cd /Library/Python/2.6/site-packages sudo ln -s /contrib/lib/python2.6/site-packages/PyQt4 . sudo ln -s /contrib/lib/python2.6/site-packages/sip* . cd /volatile/FreeCAD-r5443-ser/bin/pivy cp _coin.dylib _coin.so cd /volatile/FreeCAD-r5443-ser/lib for i in *.dylib; do j=`basename $i .dylib`; cp $i $j.so; done
Pivy
Algunos componentes de FreeCAD no funcionarán sin Pivy. Mira aquí para ver instrucciones parciales de instalación.
Resumen
Estas son bibliotecas que no se han cambiado en el proyecto de FreeCAD. Son utilizadas básicamente sin cambios como bibliotecas de vínculos dinámicos (*.so o *.dll). Si se necesita un cambio o una clase que las envuelva, entonces el código del envoltorio o la biblioteca modificada tienen que moverse al paquete base de FreeCAD. Las bibliotecas utilizadas son:
Considera el uso de LibPack en lugar de descargar e instalar todo por tu cuenta.
Enlaces
| Nombre biblioteca | Versión necesitada | Enlace para conseguirla |
|---|---|---|
| Python | >= 2.5.x | http://www.python.org/ |
| OpenCasCade | >= 5.2 | http://www.opencascade.org |
| Qt | >= 4.1.x | http://www.qtsoftware.com |
| Coin3D | >= 2.x | http://www.coin3d.org |
| ODE | >= 0.10.x | http://www.ode.org |
| SoQt | >= 1.2 | http://www.coin3d.org |
| Xerces-C++ | >= 2.7.x < 3.0 | http://xml.apache.org/xerces-c/ |
| GTS | >= 0.7.x | http://gts.sourceforge.net/ |
| Zlib | >= 1.x.x | http://www.zlib.net/ |
| Boost | >= 1.33.x | http://www.boost.org/ |
| Eigen3 | >= 3.0.1 | http://eigen.tuxfamily.org/index.php?title=Main_Page |
Detalles
Python
Versión: 2.5 o superior
Licencia: Python 2.5 licencia
Puedes utilizar el código fuente o los binarios de http://www.python.org/ o utilizar alternativamente ActiveState Python de http://www.activestate.com/ aunque es algo difícil conseguir las bibliotecas depuradas de ActiveState.
Descripción
Python es el principal lenguaje de escritura y es utilizado a través de la aplicación. Por ejemplo:
- Implementar archivos de guión para hacer pruebas sobre:
- perdidas de memoria
- asegurar la presencia de funcionalidad después de hacer cambios
- comprobaciones tras la construcción
- comprobar la cobertura de las pruebas
- Macros y grabación de macros
- Implementar la lógica de la aplicación para paquetes estándar
- Implementación de entornos completos
- Carga dinámica de paquetes
- Implementación de reglas para el diseño (ingeniería del conocimiento)
- Haciendo algo en Internet como grupos de trabajo y PDM
- Y más ...
Especialmente la carga dinámica de paquetes de Python se utiliza para cargar en tiempo de ejecución funcionalidades adicionales y entornos necesitados para las tareas. Para una visión más detallada mira: www.python.org Por qué Python? podrías preguntar. Existen varias razones: He utilizado diferentes lenguajes en mi vida profesional:
- Perl
- Tcl/Tk
- VB
- Java
Python está más orientado a objetos que Perl y Tcl, el código no está tan liado como en Perl y VB. Java no es un lenguaje de escritura en primer lugar y difícil (o imposible) de embeber. Python está bien documentado y extendido. Está también bien comprobado y tiene un fuerte soporte en la comunidad de software libre.
Créditos
Van para Guido van Rossum y un montón de gente que hace de Python un éxito!
OpenCasCade
Versión: 5.2 o superior
Licencia: OCTPL
OCC es un kernel de CAD completo. Originalmente, fue desarrollado por Matra Datavision en Francia para las aplicaciones Strim y Euclid Quantum y después lo pasaron a código libre. Es una enorme biblioteca y hace que sea posible una aplicación de CAD libre en primer lugar, proporcionando algunos paquetes que serían complicados o imposibles de implementar en un proyecto de código libre:
- Un kernel de geometría que admite STEP
- Un modelo topológico de datos y todas las funciones necesarias para trabajar con (cortar, fusionar, extruir, etc.)
- Procesadores estándar de importación / Exportación como STEP, IGES, VRML
- Visores 3D y 2D con soporte para la selección
- Un documento y estructura de datos de proyecto con soporte para guardar y restaurar, vinculación externa de documentos, recalculo del historial de diseño (modelado paramétrico) y una facilidad de cargar nuevos tipos de datos como un paquete de extensión dinámicamente
Para conocer más sobre OpenCasCade echa un vistazo a la página de OpenCasCade o http://www.opencascade.org.
Qt
Versión: 4.1.x o superior
Licencia: GPL v2.0/v3.0 o Comercial (desde la versión 4.5 también en LPGL v2.1)
No creo que necesite decir mucho sobre Qt. Es uno de las utilidades para interfaces gráficas de usuario GUI más utilizadas en los proyectos de código libre. Para mi el punto más importante para utilizar Qt es Qt Designer y la posibilidad de cargar letreros de diálogo completos como recursos (XML) e incorporar complementos (widgets) especializados. En una aplicación de CAX la interacción con el usuario y los letreros de diálogo son de lejos la parte más importante del código y un buen diseñador de letreros de diálogo es muy importante para extender FreeCAD fácilmente con nuevas funcionalidades. Puedes encontrar información complementaria y una muy buena documentación de ayuda en línea en http://www.qtsoftware.com.
Coin3D
Versión: 2.0 o superior
Licencia: GPL v2.0 o Comercial
Coin es una biblioteca de gráficos 3D de alto nivel con una interfaz de programación para aplicaciones en C++. Coin utiliza estructuras de datos de la escena gráfica para renderizar gráficos en tiempo real adecuados para la mayoría de aplicaciones de visualización para ingeniería y científicos.
Coin es portable sobre un amplio rango de plataformas: Cualquier plataforma UNIX / Linux / *BSD, todos los sistemas operativos de Microsoft Windows, y Mac OS X.
Coin está construido sobre el estándar de la industria OpenGL bibloteca de modo de renderizado inmediato, y añade abstracción para primitivas de nivel superior, proporciona interactividad 3D, aumenta enormemente la conveniencia y productividad de los programadores, y contiene muchas características de optimización complejas para un renderizado rápido que son transparentes para el programador de la aplicación.
Coin está basado en el SGI de la API de Open Inventor. Open Inventor, para aquellos que no están familiarizados con él, hace tiempo que se ha convertido en el estándar de las bibliotecas gráficas para software de visualización y simulación en la comunidad de ingeniería y científica. Se ha probado sobre un periodo de más de 10 años, su madurez contribuye a su éxito como un bloque de construcción principal en miles de aplicaciones de ingeniería de larga escala alrededor del mundo.
Utilizaremos OpenInventor como visor 3D porque el visor de OpenCasCade (AIS y Graphics3D) tiene serias limitaciones cuellos de botella de rendimiento, especialmente cuando se trata de renderizado de ingeniería de larga escala. Otras cosas como texturas o renderizado volumétrico no están soportados realmente, etc.
Desde la versión 2.0 Coin utiliza un modelo de licencia diferente. Ya no es LGPL. Utilizan GPL para el código libre y licencias comerciales para aplicaciones de código cerrado. Eso significa que si quieres vender tu trabajo basado en FreeCAD (módulos de extensión) tienes que comprar una licencia de Coin!
ODE (Open dynamic engine)
Versión: 0.10.0 o superior
Licencia: LGPL v2.1 o superiores o BSD
ODE una biblioteca de código libre, de alto rendimiento para la simulación de dinámica de cuerpos rígidos. Está lleno de características, estable, maduro e independiente de la plataforma con una API C/C++ sencilla de utilizar. Tiene tipos de unión avanzados e detección de colisiones integrada con fricción. ODE para simulación de vehículos, objetos en entornos virtuales y criaturas virtuales. Es utilizado actualmente en muchos juegos de ordenador, herramientas de autor 3D y herramientas de simulación.
Créditos
Russell Smith es el principal autor de ODE.
SoQt
Versión: 1.2.0 o superior
Licencia: GPL v2.0 o Comercial
SoQt es la cubierta de Inventor para Qt Gui Toolkit. Por desgracia, ya no es LGPL así que tenemos que eliminarlo del código base de FreeCAD y vincularlo como una biblioteca. Tiene el mismo modelo de licencia que Coin. Y tienes que compilarlo con tu versión de Qt.
Xerces-C++
Versión: 2.7.0 o superior
Licencia: Apache Software License Versión 2.0
Xerces-C++ es un analizador de validación XML escrito en C++. Xerces-C++ hace sencillo darle a tu aplicación la capacidad de leer y escribir datos XML. Una biblioteca compartida se proprciona para analizar, generar, manipular, y validar documentos XML.
Xerces-C++ es fiel a la recomendación de XML 1.0 y muchos estándares asociados (mira las características abajo).
El analizador proporciona alto rendimiento, modularidad, y escalabilidad. El código fuente, los ejemplos y la documentación de la API se proporcionan con el analizador. Para la portabilidad, se ha tenido cuidado de hacer un mínimo uso de plantillas, no RTTI, y un mínimo uso de #ifdefs.
El analizador es utilizado para guardar y restaurar parámetros en FreeCAD.
GTS
Versión: 0.7.x
Licencia: LGPL v2.0 o superior
GTS se mantiene para la biblioteca de superficies trianguladas GNU. Es una biblioteca de código libre que pretende proporcionar un conjunto de funciones útiles para trabajar con superficies 3D malladas con triángulos interconectados. El código fuente está disponible gratuitamente bajo la licencia LGPL.
Normalmente nio es necesario para compilar FreeCAD. Puedes conmutar la utilización con un preprocesador en FCConfig.h.
Zlib
Versión: 1.x.x
Licencia: zlib
zlib está diseñado para ser libre, de propósito general, legalmente sin estorbos, eso es, no está cubierto por ningún tipo de patentes. Es una biblioteca de compresión de datos con mínimas perdidas para utilizarse en virtualmente cualquier hardware y sistema operativo. El formato de datos zlib es portable a través de las plataformas. A diferencia del método de compresión utilizada en la compresión de Unix y en el formato de imágenes GIF, el método de compresión utilizado en zlib esencialmente nunca expande los datos. (LZW puede duplicar o triplicar el tamaño del archivo en casos extremos.) La huella de memoria de zlib también es independiente de las entradas de datos y se puede reducir, si es necesario, con algunas perdidas en la compresión.
Boost
Versión: 1.33.x
Licencia: Boost Software License - Versión 1.0
Las bibliotecas C++ Boost son una colección de evaluación de pares, bibliotecas de código libre que extienden la funcionalidad de C++. Las bibliotecas se licencian bajo la licencia de software de Boost, diseñada para permitir que Boost sea utilizado con proyectos de código abierto o cerrado. Muchos de los fundadores de Boost están en el comité del estándar C++ y diversas bibliotecas de Boost han sido aceptadas para incorporarse al informe técnico 1 de C++0x.
Las bibliotecas apuntan a un amplio rango de usuarios y dominios de aplicaciones C++. Desde bibliotecas de propósito general como SmartPtr, a abstracciones de OS como FileSystem, para bibliotecas principalmente apuntando a otros desarrolladores de bibliotecas y usuarios avanzados de C++, como MPL.
En orden de asegurar la eficiencia y flexibilidad, Boost hace un uso extensivo de las plantillas. Boost ha sido una fuente de trabajo extensivo e investigación en programación general y meta-programación en C++.
Mira: http://www.boost.org/ para más detalles.
LibPack
LibPack es un paquete conveniente con todas las bibliotecas de arriba empaquetadas juntas. Está disponible actualmente para la plataforma Windows en la página de Descargas! Si trabajas en Linux no necesitas LibPack, en su lugar asegúrate de utilizar los repositorios de paquetes de tu distribución Linux.
FreeCADLibs7.x Registro de cambios
- Utilizando QT 4.5.x y Coin 3.1.x
- Biblioteca de plantilla Eigen añadida para Robot
- SMESH experimental
Página de herramientas
Para cualquier desarrollo de software serio necesitas herramientas. Aquí está una lista de las herramientas que utilizamos para desarrollar FreeCAD:
Herramientas independientes de la plataforma
Qt-Toolkit
Qt-toolkit es una avanzada herramienta de diseño de interfaces de usuario independiente de la plataforma. Está contenida en LibPack de FreeCAD, pero también puede descargarse en Qt project.
InkScape
Gran programa de diseño vectorial. Se utiliza para dibujar iconos e imágenes SVG. Descargalo en www.inkscape.org.
Doxygen
Una herramienta muy buena y estable para generar documentación del codigo a partir de los archivos .h y .cpp.
Gimp
No hay mucho que decir sobre el programa de manipulación de imágenes de GNU. Además de que puede manejar archivos .xpm que es un modo muy conveniente de manejar iconos en los programas de QT. XPM es básicamente código en C que puede compilarse en un programa.
Consigue GIMP aquí: www.gimp.org
Herramientas en Windows
Visual Studio 8 Express
Aunque VC8 es para desarrollos en C++ no ha avanzado mucho desde VisualStudio 6 (en mi opinión ha sido un gran paso atrás), es un sistema de desarrollo libre en Windows. Para aplicaciones nativas Win32 necesitas descargar la PlatformSDK de M$.
Así que la Express edition es difícil de encontrar. Pero podrías probar este enlace
CamStudio
Es una herramienta de código libre para grabar Screencasts (Webcasts). Es una herramienta muy buena para crear tutoriales grabándolos. No es tan aburrido como escribir documentación.
Mira camstudio.org para más detalles.
Tortoise SVN
Esta es una gran herramienta. Hace que el uso de Subversion (nuestro sistema de control de versiones en sf.net) sea un auténtico placer. Puedes a través de la integración con el explorador, manejar revisiones de forma sencilla, comprobar diferencias, resolver conflictos, crear ramas, etc. El letrero de diálogo de asignación es una pieza de arte. Te da un resumen de los archivos modificados y te permite enviarlos o no. Esto hace sencillo empaquetar los cambios en unidades lógicas y ofrece un mensaje de envío claro.
Encontrarás ToroiseSVN en tortoisesvn.tigris.org.
StarUML
Un programa UML de código libre lleno de características. Tiene un montón de características de las grandes, incluyendo ingeniería inversa del código fuente C++....
Descargalo aquí: staruml.sourceforge.net
Herramientas en Linux
PENDIENTE
Esta página muestra las diferentes formas de iniciar FreeCAD y las características de configuración más importantes.
Iniciando FreeCAD desde la línea de comandos
FreeCAD puede iniciarse normalmente, haciendo doble clic en el icono del escritorio o seleccionándolo en el menú de inicio, pero también sr puede iniciar directamente desde la línea de comandos. Esto te permite cambiar algunos de las opciones por defecto de inicio.
Opciones de la línea de comandos
Las opciones de la línea de comandos están sujetas a frecuentes cambios, por tanto es una buena idea comprobar las opciones actuales escribiendo:
FreeCAD --help
En la respuesta puedes leer los posibles parámetros:
Usage: FreeCAD [options] File1 File2 ..... Allowed options: Generic options: -v [ --version ] print version string -h [ --help ] print help message -c [ --console ] start in console mode Configuration: -l [ --write-log ] arg write a log file -t [ --run-test ] arg test level -M [ --module-path ] arg additional module paths -P [ --python-path ] arg additional python paths --response-file arg can be specified with '@name', too
Respuesta y archivos de configuración
FreeCAD puede leer algunas de estas opciones de un archivo de configuración. Este archivo debe estar en el directorio bin y debe llamarse FreeCAD.cfg. Ten en cuenta que las opciones que especifiques en la línea de comando sobrescriben el archivo de configuración!
Algunos sistemas operativos tienen límites de longitud muy bajos para la línea de comandos. El modo más habitual de evitar esas limitaciones es utilizar un archivo de respuesta. Un archivo de respuesta es simplemente un archivo de configuración que utiliza la misma sintaxis que la línea de comandos. Si la línea de comandos especifica un nombre de archivo de respuesta a utilizar, es cargado y analizado sintáticamente en adición a la línea de comandos:
FreeCAD @ResponseFile.txt
o:
FreeCAD --response-file=ResponseFile.txt
Opciones ocultas
Existen varias opciones no visibles por el usuario. Estas opciones son por ejemplo los parámetros de X-Window analizados por el sistema Windows:
- -display display, establece la visualización de X (por defecto es $DISPLAY).
- -geometry geometry, establece la geometría cliente de la primera ventana que es mostrada.
- -fn or -font font, Define la fuente de letra de la aplicación. La fuente de letra debería estar especificada utilizando una descripción de fuente lógica de X.
- -bg or -background color, establece el color de fondo por defectoy una paleta para la aplicación (se calculan las sombras iluminadas y oscuras).
- -fg or -foreground color, establece el color de primer planor.
- -btn or -button color, establece el color por defecto de los botones.
- -name name, establece el nombre de la aplicación.
- -title title, establece el título de la aplicación.
- -visual TrueColor, fuerza a la aplicación a utilizar la visualización TrueColor en una visualización de 8-bit.
- -ncols count, limita el número de colores asignados en el cubo de color de visualización de 8-bit, si la aplicación está utilizando la especificación del color QApplication::ManyColor. Si el computo es 216 entonces se utiliza un cubo de color de 6x6x6 (por ejemplo 6 niveles de rojo, 6 de verde y 6 de azul); para otros valores, se utiliza un cubo aproximadamente proporcional a un cubo de 2x3x1.
- -cmap, cause que la aplicación instale un mapa de color privado en una visualización de 8-bit.
Ejecución de FreeCAD sin interfaz de usuario
FreeCAD normalmente se inicia en el modo de interfaz de usuario gráfico GUI, pero puedes forzar que inicie en modo consola escribiendo:
FreeCAD -c
desde la línea de comandos. En el modo consola, no se mostrará el interfaz de usuario, y tendrás presente la consola del interprete de Python. Desde ella tienes la misma funcionalidad que desde el interprete de Python que se ejecuta dentro del interfaz de usuario gráfico GUI de FreeCAD, y acceso normal a todos los módulos y plugins de FreeCAD, exceptuando el módulo FreeCADGui. Ten en cuenta que los módulos que dependan del FreeCADGui podrían tampoco estar disponibles.
Ejecución de FreeCAD como un módulo de Python
FreeCAD también puede utilizarse para ejecutar como un módulo de Python dentro de otras aplicaciones que utilizan Python o desde un interprete de Python externo. Para ello, la aplicación anfitriona de Python debe saber donde están las librerías de FreeCAD. El mejor modo para obtener eso es añadir temporalmente las librerías de FreeCAD a la variable sys.path. El código siguiente escrito desde un interprete de Python importará FreeCAD y te permitirá ejecutarlo del mismo modo que en el modo consola:
import sys
sys.path.append("path/to/FreeCAD/lib") # change this by your own FreeCAD lib path
import FreeCAD
Una vez que FreeCAD está cargado, puedes interactuar con tu aplicación anfitriona de cualquier modo que puedas imaginar!
El conjunto de configuración
En cada inicio FreeCAD examina sus alrededores y los parámetros de la línea de comandos. Esto construye un conjunto de configuración que guarda la esencia de toda la información de la ejecución. Esta información es después utilizada para determinar la ubicación donde guardar los datos del usuario o archivos de registro. También es muy importante para los análisis postmortem. Por lo tanto es guardado en el archivo de registro.
Información relativa al usuario
| Nombre variable configuración | Sinopsis | Ejemplo M$ | Ejemplo Posix (Linux) |
|---|---|---|---|
| UserAppData | Ruta donde FreeCAD almacena los datos de la aplicación relativos al usuario. | C:\Documents and Settings\username\Application Data\FreeCAD | /home/username/.FreeCAD |
| UserParameter | Archivo donde FreeCAD almacena los datos de la aplicación relativos al usuario. | C:\Documents and Settings\username\Application Data\FreeCAD\user.cfg | /home/username/.FreeCAD/user.cfg |
| SystemParameter | Archivo donde FreeCAD almacena datos relativos a la aplicación. | C:\Documents and Settings\username\Application Data\FreeCAD\system.cfg | /home/username/.FreeCAD/system.cfg |
| UserHomePath | Ruta de la carpeta de inicio del usuario actual | C:\Documents and Settings\username\My Documents | /home/username |
Argumentos de la línea de comando
| Nombre variable configuración | Sinopsis | Ejemplo |
|---|---|---|
| LoggingFile | 1 si el logging está activado | 1 |
| LoggingFileName | Nombre de archivo en el que está ubicado el registro | C:\Documents and Settings\username\Application Data\FreeCAD\FreeCAD.log |
| RunMode | Esto indica como funcionará el bucle principal. "Script" significa que el archivo de guión dado se llamará y luego se saldrá. "Cmd" ejecuta el interprete de la línea de comandos. "Internal" ejecuta un archivo de guión interno. "Gui" introduce el bucle de eventos de la interfaz de usuario gráfica GUI. "Module" carga un módulo de Python dado. | "Cmd" |
| FileName | Su significado depende del modo de ejecución | |
| ScriptFileName | Su significado depende del modo de ejecución | |
| Verbose | Nivel de verborrea de FreeCAD | "" o "strict" |
| OpenFileCount | Mantiene el número de archivos abiertos a través de argumentos de la línea de comandos | "12" |
| AdditionalModulePaths | Mantiene las rutas de módulos adicionales dados en la línea de comandos | "extraModules/" |
Relativos al sistema
| Nombre variable configuración | Sinopsis | Ejemplo M$ | Ejemplo Posix (Linux) |
|---|---|---|---|
| AppHomePath | c:/Progam Files/FreeCAD_0.7 | /user/local/FreeCAD_0.7 | |
| PythonSearchPath | Mantiene una lista de las rutas en las cuales Python busca módulos. Esto es al inicio se puede cambiar durante la ejecución |
Algunas bibliotecas necesitan llamar a variables de entorno del sistema. A veces cuando existe un problema con una instalación de FreeCAD, es porque algunas variables de entorno no están o se han definido mal. Por tanto, algunas variables importantes son duplicadas en la Configuración y guardadas en el archivo de registro.
Variables de entorno relativas a Python:
- PYTHONPATH
- PYTHONHOME
- TCL_LIBRARY
- TCLLIBPATH
Variables de entorno relativas a OpenCascade:
- CSF_MDTVFontDirectory
- CSF_MDTVTexturesDirectory
- CSF_UnitsDefinition
- CSF_UnitsLexicon
- CSF_StandardDefaults
- CSF_PluginDefaults
- CSF_LANGUAGE
- CSF_SHMessage
- CSF_XCAFDefaults
- CSF_GraphicShr
- CSF_IGESDefaults
- CSF_STEPDefaults
Variables de entorno relativas al sistema:
- PATH
Información relativa a la construcción
La tabla de abajo muestra la información disponible sobre la versión de construcción. La mayoría proviene del repositorio de Subversion. Esto es necesario para reconstruir exactamente una versión!
| Nombre variable configuración | Sinopsis | Ejemplo |
|---|---|---|
| BuildVersionMajor | Número de versión principal de la construcción. Definida en src/Build/Version.h.in | 0 |
| BuildVersionMinor | Número de versión secundario de la construcción. Definida en src/Build/Version.h.in | 7 |
| BuildRevision | Número de revisión del repositorio SVN del src en la construcción. Generado por SVN | 356 |
| BuildRevisionRange | Rango de diferentes cambios | 123-356 |
| BuildRepositoryURL | URL del repositorio | https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk/src |
| BuildRevisionDate | Fecha de la revisión de arriba | 2007/02/03 22:21:18 |
| BuildScrClean | Indica si el código fuente fue modificado después de su descarga | Src modified |
| BuildScrMixed | Src not mixed |
Relativos al marcado
Estas entradas de configuración son relativas al mecanismo de marcado de FreeCAD. Mira Marcado para más detalles.
| Nombre variable configuración | Sinopsis | Ejemplo |
|---|---|---|
| ExeName | Nombre del archivo ejecutable de la construcción. Puede diferir de la de FreeCAD si es utilizado un main.cpp diferente. | FreeCAD.exe |
| ExeVersion | Versión global mostrada al inicio | V0.7 |
| AppIcon | Icono que es utilizado por el ejecutable, mostrado en Application MainWindow. | "FCIcon" |
| ConsoleBanner | Banner que es mostrado en modo consola | |
| SplashPicture | Nombre del icono utilizado por la pantalla de bienvenida | "FreeCADSplasher" |
| SplashAlignment | Alineación del texto en el letrero de diálogo de bienvenida | Left" |
| SplashTextColor | Color del texto de bienvenida | "#000000" |
| StartWorkbench | Nombre del entorno que comenzará automáticamente después del inicio | "Part design" |
| HiddenDockWindow | Lista de dockwindows (separadas por un punto y coma) que serán mostradas | "Property editor" |
La Utilidad de construcción de FreeCAD (FreeCAD build tool o fcbt) es un archivo de guión en Python ubicado en
trunc/src/Tools/fcbt.py
Se puede utilizar para simplificar algunas tareas frecuentes de construcción, distribución y extensión de FreeCAD.
Utilización
Con Python correctamente instalado, fcbt se puede invocar por el comando
python fbct.py
Muestra un menú, donde puedes seleccionar la tarea para el que lo quieres utilizar:
FreeCAD Build Tool
Usage:
fcbt <command name> [command parameter]
possible commands are:
- DistSrc (DS) Build a source Distr. of the current source tree
- DistBin (DB) Build a binary Distr. of the current source tree
- DistSetup (DI) Build a Setup Distr. of the current source tree
- DistSetup (DUI) Build a User Setup Distr. of the current source tree
- DistAll (DA) Run all three above modules
- NextBuildNumber (NBN) Increase the Build Number of this Version
- CreateModule (CM) Insert a new FreeCAD Module in the module directory
For help on the modules type:
fcbt <command name> ?
Introduce el nombre abreviado del comando que quieres utilizar. Por ejemplo escribe "CM" para crear un módulo.
DistSrc
El comando "DS" crea un distribución de código fuente del árbol de código fuente actual.
DistBin
El comando "DB" crea una distribución binaria del árbol de código fuente actual.
DistSetup
El comando "DI" crea una distribución de setup del árbol de código fuente actual.
DistSetup
El comando "DUI" crea una distribución de setup de usuario del árbol de código fuente actual.
DistAll
El comando "DA" executes "DS", "DB" y "DI" en secuencia.
NextBuildNumber
El comando "NBN" incrementa el número de la construcción para crear una nueva versión de FreeCAD.
CreateModule
El comando "CM" crea un nuevo módulo de aplicación.
La adición de nuevos módulos y entornos en FreeCAD es muy sencillo. Denominamos módulo a cualquier extensión de FreeCAD, mientras que entorno es una configuración especial de interfaz gráfica de usuario que agrupa algunas barras de herramientas y menús. Normalmente creas un nuevo módulo que contiene su propio entorno.
Los módulos se pueden programar en C++ o en Python, o en una mezcla de ambos, pero los archivos init del módulo deben estar en Python. Establecer un nuevo módulo con dichos archivos init es sencillo, y se puede hacer manualmente o con la herramienta de construcción de FreeCAD.
Utilización de la herramienta de construcción de FreeCAD
La creación de un nuevo módulo de aplicación en FreeCAD es bastante simple. En árbol de desarrollo de FreeCAD existe la Herramienta de construcción de FreeCAD (fcbt) que hace las parte más importantes para ti. Es un archivo de guión en Python ubicado en
trunk/src/Tools/fcbt.py
Cuando tu interprete de Python está correctamente instalado puedes ejecutar este archivo de guión desde la línea de comandos con
python fcbt.py
Mostrará el siguiente menú:
FreeCAD Build Tool Usage: fcbt <command name> [command parameter] possible commands are: - DistSrc (DS) Build a source Distr. of the current source tree - DistBin (DB) Build a binary Distr. of the current source tree - DistSetup (DI) Build a Setup Distr. of the current source tree - DistSetup (DUI) Build a User Setup Distr. of the current source tree - DistAll (DA) Run all three above modules - BuildDoc (BD) Create the documentation (source docs) - NextBuildNumber (NBN) Increase the Build Number of this Version - CreateModule (CM) Insert a new FreeCAD Module in the module directory For help on the modules type: fcbt <command name> ?
En la línea de comandos introduce CM para comenzar la creación de un módulo:
Insert command: CM
Te pedirá que especifiques un nombre para tu nuevo módulo. Vamos a llamarlo TestMod por ejemplo:
Please enter a name for your application: TestMod
Después de pulsar enter fcbt comienza copiando todos los archivos necesarios para tu módulo en una carpeta nueva en
trunk/src/Mod/TestMod/
Luego todos los archivos se modifican con el nombre de tu nuevo módulo. Lo único que necesitas hacer ahora es añadir los dos nuevos proyectos "appTestMod" y "appTestModGui" a tu espacio de trabajo (en Windows) o a tus objetivos de makefile (unix). Eso es!
Establecer un nuevo módulo manualmente
Necesitas dos cosas para crear un nuevo módulo:
- Un nuevo directorio en el directorio Mod de FreeCAD (ya sea en RutadeInstalación/FreeCAD/Mod o en RutadeUsuario/.FreeCAD/Mod). Puedes denominarlo como quieras.
- Dentro de dicho directorio, un archivo InitGui.py. Este archivo será ejecutado automáticamente en el inicio de FreeCAD (por ejemplo, pon el print("hello world") dentro)
Adicionalmete, también puedes poner un archivo Init.py. La diferencia es que, el archivo InitGui.py está cargado sólo cuando FreeCAD se ejecuta en modo interfaz gráfica de usuario, el archivo Init.py se carga siempre. Pero si vamos a crear un entorno, lo pondremos en el InitGui.py, porque los entornos se usan sólo en modo interfaz gráfica de usuario, por supuesto.
Creación de un nuevo entorno
Dentro del archivo InitGui.py, una de las primeras cosas que querrás hacer es definir un entorno. Aquí tienes el mínimo código que puedes utilizar:
class MyWorkbench ( Workbench ):
"My workbench object"
Icon = """
/* XPM */
static const char *test_icon[]={
"16 16 2 1",
"a c #000000",
". c None",
"................",
"................",
"..############..",
"..############..",
"..############..",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"................",
"................"};
"""
MenuText = "My Workbench"
ToolTip = "This is my extraordinary workbench"
def GetClassName(self):
return "Gui::PythonWorkbench"
def Initialize(self):
import myModule1, myModule2
self.appendToolbar("My Tools", ["MyCommand1","MyCommand2"])
self.appendMenu("My Tools", ["MyCommand1","MyCommand2"])
Log ("Loading MyModule... done\n")
def Activated(self):
# do something here if needed...
Msg ("MyWorkbench.Activated()\n")
def Deactivated(self):
# do something here if needed...
Msg ("MyWorkbench.Deactivated()\n")
FreeCADGui.addWorkbench(MyWorkbench)
El entorno debe tener todos estos atributos definidos:
- El atributo de icono es una imagen XPM (La mayoría de programas como GIMP pueden convertir una imagen a formato xpm, el cual es un archivo de texto. Puedes entonces pegar el contenido aquí)
- MenuText es el nombre del entorno tal como aparece en la lista de entornos
- Tooltip aparece cuando pasas sobre el con el ratón
- Initialize() se ejecuta en la carga de FreeCAD, y debe crear todos los menús y barras de herramientas que el entorno va a utilizar.Si vas a crear tu propio módulo en C++, también puedes definir tus menús y barras de herramientas dentro del módulo C++, no en el archivo InitGui.py. Lo importante es si están creados o no cuando el módulo es activado.
- Activated() se ejecuta cuando el usuario cambia a tu entorno
- Deactivated() se ejecuta cuando el usuario cambia de tu entorno a otro entorno o abandona FreeCAD
Creación de comandos de FreeCAD en Python
Normalmente defines todas las herramientas (denominadas comandos en FreeCAD) en otro módulo, luego lo importas antes de la creación de las barras de herramientas y menús. Este es el mínimo código que puedes utilizar para definir un comando:
import FreeCAD,FreeCADGui
class MyTool:
"My tool object"
def GetResources(self):
return {"MenuText": "My Command",
"Accel": "Ctrl+M",
"ToolTip": "My extraordinary command",
"Pixmap" : """
/* XPM */
static const char *test_icon[]={
"16 16 2 1",
"a c #000000",
". c None",
"................",
"................",
"..############..",
"..############..",
"..############..",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"......####......",
"................",
"................"};
"""}
def IsActive(self):
if FreeCAD.ActiveDocument == None:
return False
else:
return True
def Activated(self):
# do something here...
FreeCADGui.addCommand('MyCommand1',MyTool())
- El método GetResources() debe devolver un diccionario con atributos visuales de tu herramienta. Accel define un atajo de teclado pero no es obligatorio.
- El método IsActive() define si el comando está activo o desactivado en los menús y barras de herramientas.
- El método Activated() se ejecuta cuando el comando se llama a través de un botón de una barra de herramientas o menú o incluso a través de un archivo de guión.
Creación de comandos de FreeCAD en C++
Pendiente de documentar
Prueba primero
Antes de que pruebes con la depuración utiliza el marco de pruebas para verificar si los test estándar funcionan correctamente. Si no es posible que la instalación esté rota.
Línea de comandos
El depurador de FreeCAD está soportado por unos cuantos mecanismos internos. La versión en línea de comandos de FreeCAD opciones para soporte de depuración:
- -v
- Con la opción "v" FreeCAD ofrece una salida más verbosa.
- -l
- Con la opción "l" FreeCAD escribe información adicional a un archivo de registro.
Introducción
FreeCAD incorpora un extenso entorno de pruebas. Las pruebas se basan en un conjunto de archivos de guión de Python ubicados en el módulo test.
Este artículo describe el Marcado de FreeCAD. Marcado significa comenzar tu propia aplicación basada en FreeCAD. Esto puede ser sólo tu propio ejecutable o pantalla de bienvenida hasta un programa completo adaptado. En base a la arquitectura flexible de FreeCAD es sencillo de utilizar como base para tus propios programas de propósito especial.
General
La mayoría del marcado se realiza en MainCmd.cpp o MainGui.cpp. Estos proyectos generan los archivos ejecutables de FreeCAD. Para crear tu propia Marca simplemente copia los proyectos Main o MainGui y dale al ejecutable un nombre diferente, e.g. FooApp.exe. La configuración más importante para una nueva apariencia puede realizarse en una lugar de la función main(). Aquí está la sección de código que controla el marcado:
int main( int argc, char ** argv )
{
// Name and Version of the Application
App::Application::Config()["ExeName"] = "FooApp.exe";
App::Application::Config()["ExeVersion"] = "0.7";
// set the banner (for loging and console)
App::Application::Config()["ConsoleBanner"] = sBanner;
App::Application::Config()["AppIcon"] = "FCIcon";
App::Application::Config()["SplashPicture"] = "FooAppSplasher";
App::Application::Config()["StartWorkbench"] = "Part design";
App::Application::Config()["HiddenDockWindow"] = "Property editor";
App::Application::Config()["SplashAlignment" ] = "Bottom|Left";
App::Application::Config()["SplashTextColor" ] = "#000000"; // black
// Inits the Application
App::Application::Config()["RunMode"] = "Gui";
App::Application::init(argc,argv);
Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);
Gui::Application::initApplication();
Gui::Application::runApplication();
App::Application::destruct();
return 0;
}
La primera entrada de Config define el nombre del programa. Este no es el nombre del ejecutable, el cual puede cambiarse renombrándolo o por la configuración del compilador, sino el nombre que es mostrado en la barra de tareas en Windows o en la lista de programas en los sistemas Unix.
Las siguientes líneas definen las entradas de Config de tu aplicación FooApp. Una descripción de Config y sus entradas se encuentra en Inicio y Configuración.
Imagenes
Todos los recursos de imágenes están compilados en FreeCAD. Esto reduce el tiempo de carga y mantiene la instalación compacta. Las imágenes están incluidas en formato XPM el cual es básicamente un formato de texto que utiliza sintaxis de C. Puedes dibujar estas imágenes con un editor de texto, pero es más confortable crear las imágenes con tu aplicación de gráficos preferida y convertirlas después a formato XPM.
El programa de imágenes de GNU Gimp puede guardar archivos XPM.
Para la conversión puedes utilizar la herramienta ImageConv que está incluida en FreeCAD. Puedes encontrarla en
/trunk/src/Tools/ImageTools/ImageConv
No sólo convierte imágenes sino que también actualiza automáticamente el archivo BmpFactoryIcons.cpp, donde están registradas las imágenes. El uso habitual es tan simple como en el siguiente ejemplo:
ImageConv -i InputImage.png -o OutputImage.xpm
Esto convierte el archivo InputImage.png en formato XPM y escribe el resultado al archivo OutputImage.xpm.
La línea:
Gui::BitmapFactory().addXPM("FooAppSplasher", ( const char** ) splash_screen);
en la función main() entonces incluye la imagen en el BitmapFactory de FreeCAD.
Iconos
La principal aplicación de los iconos FCIcon que aparecen en las ventanas de títulos y otros lugares está definida en
/trunk/src/Gui/Icons/images.cpp
y comienza con la línea
static const char *FCIcon[]={
Puedes reemplazarla con tus iconos preferidos, recompilar FreeCAD y el siguiente paso para crear tu propia Marca está terminado. Existen muchos otros iconos en este archivo que podrías cambiar a tu gusto.
Si necesitas añadir nuevos iconos, tienes que registrarlos en
/trunk/src/Gui/Icons/BmpFactoryIcons.cpp
así podrás acceder a ellos desde FreeCAD.
Imagen de fondo
La imagen de fondo aparece, cuando no está abierto ninguna ventana de documento. Al igual que la imagen de bienvenida está definida en developers.h en la sección que comienza con:
static const char* const background[]={
Deberías seleccionar una imagen de bajo contraste para el fondo. De otro modo puede molestar al usuario.
Localización es, en general, el proceso de proporcionar un software con una interfaz de usuario en múltiples lenguajes. En FreeCAD puedes establecer el idioma de la interfaz de usuario en Editar→Preferencias → aplicación. FreeCAD utiliza Qt para habilitar el soporte para varios idiomas. En Unix / Linux, FreeCAD utiliza la configuración regional actual de tu sistema por defecto.
Cómo ayudar a traducir FreeCAD
Una de las cosas mas importantes que puedes hacer por FreeCAD si no eres programador, es ayudar a traducir el programa a tu idioma. Hacerlo es ahora más fácil que nunca, con el uso de Crowdin], un sistema colaborativo de traducción en línea.
Como traducir
- Vete a la página del Proyecto de traducción de FreeCAD en Crowdin;
- Ingresa creando un nuevo perfil de usuario, o utilizando una cuenta de una tercera-parte, como tu dirección de gMail;
- Haz Click en el idioma en el que quieres trabajar;
- Comienza la traducción haciendo clic en el boton Translate próximo a uno de los archivos. Por ejemplo, FreeCAD.ts que contiene las cadenas de texto para el GUI (interfaz gráfico de usuario) principal de FreeCAD.
- Puedes elegir entre las traducciones existentes, o crear la tuya propia.
Traducción con Qt-Linguist (forma antigua- OBSOLETO)
La siguiente información no tiene porque ser utilizada nunca más y probablemente se convierta en obsoleta. Se mantiene aquí para que los programadores puedan conocer cómo funciona.
- Abre todos los directorios de lenguaje de FreeCAD que se muestran abajo
- Verifica que un archivo .ts con tu código de lenguaje no existe ("fr" para francés, "de" para alemán, etc...)
- Si existe, puedes descargar el archivo, si quieres modificar/revisar/mejorar la traducción (pulsa en el archivo y descargalo).
- Si no existe, descarga el archivo .ts si código de lenguaje (o cualquier otro .ts disponible, también funcionará)
- Renombra ese archivo con tu código de lenguaje
- Abrelo con el programa Qt-Linguist
- Inicia la traducción (Qt Linguist es muy sencillo de utilizar)
- Una vez esté completamente terminada, guarda tu archivo
- Envíanos los archivos así podremos incluirlos en el código fuente de FreeCAD beneficiando también a otros usuarios.
Archivos de traducción disponibles
- FreeCAD main GUI
- Complete Workbench
- Drawing Workbench
- Draft Workbench
- Reverse Engineering Workbench
- FEM Workbench
- Robot Workbench
- Image Workbench
- Sketcher Workbench
- Mesh Workbench
- Test Workbench
- Points Workbench
- Raytracing Workbench
- Part Workbench
- PartDesign Workbench
- Assembly Workbench
- MeshPart Workbench
Preparando tus propios módulos/aplicaciones para la traducción
Prerequisitos
Para realizar la localización de tu módulo de aplicación necesitas unas utilidades que vienen con Qt. Puedes descargarlos desde Trolltech-Website, pero también están contenidos en LibPack:
- qmake
- Genera los archivos de proyecto
- lupdate
- Extrae o actualiza los textos originales en tu proyecto escaneando el código fuente
- Qt-Linguist
- 'Qt-Linguist es muy sencillo de utilizar y te ayuda en la traducción con buenas características como un libro de frases para las expresiones habituales.
Setup del proyecto
Para iniciar la localización de tu proyecto ve al GUI-Part de tu módulo y escribe en la línea de comandos:
qmake -project
Esto escanea tu directorio de proyecto buscando archivos que contengan cadenas de texto y crea un archivo de proyecto como el del siguiente ejemplo:
######################################################################
# Automatically generated by qmake (1.06c) Do 2. Nov 14:44:21 2006
######################################################################
TEMPLATE = app
DEPENDPATH += .\Icons
INCLUDEPATH += .
# Input
HEADERS += ViewProvider.h Workbench.h
SOURCES += AppMyModGui.cpp \
Command.cpp \
ViewProvider.cpp \
Workbench.cpp
TRANSLATIONS += MyMod_de.ts
Puedes añadir archivos aquí manualmente. Esta sección TRANSLATIONS contiene una lista de los archivos con la traducción para cada idioma. En el ejemplo de arriba MyMod_de.ts es la traducción al alemán.
Ahora necesitas ejecutar lupdate para extraer todas las literales de las cadenas de texto en tu interfaz gráfica de usuario. La ejecución de lupdate después hacer cambios en el código fuente es siempre segura ya que nunca borra cadenas de texto de tu traducción. Sólo añade nuevas cadenas de texto.
Ahora necesitas añadir los archivos .ts a tu proyecto de VisualStudio. Especifica el siguiente método de construcción personalizado para ellos:
python ..\..\..\Tools\qembed.py "$(InputDir)\$(InputName).ts"
"$(InputDir)\$(InputName).h" "$(InputName)"
Nota: Introduce el texto en una única línea de comandos, el salto de línea es sólo para propósitos de presentación.
Compilando el archivo .ts de los ejemplos de arriba, se crea un archivo de encabezamiento MyMod_de.h. El mejor sitio para añadirlo es en App<Modul>Gui.cpp. En nuestro ejemplo esto podría ser AppMyModGui.cpp. Allí añades la línea
new Gui::LanguageProducer("Deutsch", <Modul>_de_h_data, <Modul>_de_h_len);
para publicar tu traducción en la aplicación.
Configurando los archivos de Python para la traducción
Para facilitar el proceso de localización de los archivo .py puedes utilizar la herramienta "pylupdate4" que acepta uno o más archivos .py. Con la opción -ts puedes preparar/actualizar uno o más archivos .ts. Por ejemplo para preparar un archivo .ts para la traducción al francés simplemente introduce lo siguiente en la línea de comandos:
pylupdate4 *.py -ts YourModule_fr.ts
la herramienta pylupdate escaneará tus archivos .py para las funciones translate() o tr() y crea un archivo YourModule_fr.ts. Este archivo puede ser el traducido con QLinguist y un archivo YourModule_fr.qm producido desde QLinguist o con el comando
lrelease YourModule_fr.ts
Ten en cuenta que la herramienta pylupdate4 no es muy buena reconociendo las funciones translate(), estas necesitan formatearse de forma muy específica (mira los archivos del módulo de croquizado como ejemplo). Dentro de tu archivo, puedes configurar un traductor como este (después de cargar tu QApplication pero ANTES de crear cualquier complemento o widget Qt):
translator = QtCore.QTranslator()
translator.load("YourModule_"+languages[ln])
QtGui.QApplication.installTranslator(translator)
Opcionalmente, también puedes crear el archivo XML Draft.qrc con este contenido:
<RCC> <qresource prefix="/translations" > <file>Draft_fr.qm</file> </qresource> </RCC>
y ejecutar pyrcc4 Draft.qrc -o qrc_Draft.py crea un gran archivo en Python conteniendo todos los recursos. Por otra parte esta aproximación también funciona para poner archivos de iconos en un archivo de recursos
Traduciendo la wiki
Esta wiki contiene un montón de contenido. El material más importante y actualizado es recopilado en el manual.
De modo que el primer paso es comprobar si la traducción del manual ya se ha comenzado para tu idioma (mira en la barra de la izquierda bajo "manual").
Si no, dirígete al foro y comenta que quieres iniciar una nueva traducción, crearemos la configuración básica para el idioma en el que quieras trabajar.
Tu debes luego conseguir permisos de edición del wiki.
Si tu idioma ya está listado, mira que páginas aún faltal por traducir (estarán listadas en rojo). La técnica es simple: Entra en una página en rojo, y copia/pega el contenido de la correspondiente página en inglés, y comienza a traducir.
No olvides incluir todas las etiquetas y plantillas de la página original en inglés. Algunas de dichas plantillas tendrán un equivalente en tu lenguaje (por ejemplo, existe una plantilla de Docnav en Español llamada Docnav/es). Deberías utilizar una barra inclinada y el código de tu idioma en casi todos los enlaces. Mira otras páginas ya traducidas para ver como lo hicieron.
Añade una barra inclinada y el código de tu idioma en las categorías, como [[Category:Developer Documentation/es]]
Luego, una vez has traducido la página, debes añadir un vínculo en la página original en inglés a tu traducción, así los lectores sabrán que existe una versión traducida disponible, utilizando la plantilla {{languages}} template. Mira como otros traductores lo hicieron para hacer lo mismo.
- En la página original en inglés añade tu idioma en orden alfabético: {{languages | {{es|Localisation/es}} {{fr|Localisation/fr}} {{jp|Localisation/jp}} {{se|Localisation/se}} }}
- En la página que has traducido deberías utilizar tu plantilla de idiomas y poner el inglés en primer lugar y el resto de idiomas después en orden alfabético: {{languages/fr | {{en|Localisation}} {{es|Localisation/es}} {{jp|Localisation/jp}} {{se|Localisation/se}} }}
Y si no estas seguro, dirígete a los foros y pregunta a la gente para verificar lo que hiciste y que te digan si está bien o no.
Tres plantillas son utilizadas normalmente en las páginas del manual. Estas tres plantillas tienen versiones localizadas (Template:Docnav/es, Template:Es, etc...)
- Template:Docnav : es la barra de navegación en la parte inferior de las páginas, mostrando las páginas anterior y siguiente.
- Template:Languages : esta plantilla debe estar en las páginas originales, para indicar al lector que existe una traducción. La versión localizada de esta plantilla Template:Languages/es debe por contra estar situada en la página traducida, enlazada a la página original en inglés.
- Template:en : Existe un de estas para cada idioma. Deben estar situadas dentro de la plantilla de idioma.
Convenciones de los nombres de las páginas
Por favor, apunta esto, debido a limitaciones en la implementación en Sourceforge del motor de MediaWiki, necesitamos que todas tus páginas mantengan el nombre homólogo de la página en inglés, añadiéndole una barra inclinada y tu código de idioma. Por ejemplo, la página traducida para """About FreeCAD""" debería ser """About Freecad/es""" en español, """About FreeCAD/pl""" en polaco, etc. La razón es simple: así si los traductores se van, los administradores del wiki, que no hablan todos los idiomas, sabrán para que son esas páginas. Esto facilitará el mantenimiento y evitará páginas perdidas.
Si quieres que la plantilla Docnav muestre las páginas vinculadas en tu lenguaje, puedes utilizar páginas redirigidas. Estas son básicamente enlaces a la página actual. Aquí está un ejemplo con la página en francés para About FreeCAD.
- La página About FreeCAD/fr es la página con contenido
- La página a À propos de FreeCAD contiene este código:
#REDIRECT [[About FreeCAD/fr]]
- En la página About FreeCAD/fr page, el código de Docnav se parecerá a esto:
{{docnav/fr|Bienvenue sur l'aide en ligne|Fonctionnalités}}
La página "Bienvenue sur l'aide en ligne" redirige a Online Help Startpage/fr, y la página "Fonctionnalités" redirige a Feature list/fr.
Si no estas seguro de como proceder, no dudes en solicitar ayuda en los foros.
El interprete de Python dentro de FreeCAD puede extenderse fácilmente añadiendo nuevos módulos a tu instalación de Python. Esos módulos se detectarán automáticamente y utilizarán por FreeCAD.
Todos los módulos de Python se pueden utilizar desde FreeCAD, pero algunos de ellos, listados abajo, tienen una importancia especial porque permiten a los programas de Python tener acceso completo a las funcionalidades principales de FreeCAD. También se pueden encontrar ejemplos de uso de dichos módulos en la página de Pedazos de código.
Nota: de los siguientes módulos, Pivy está ahora integrado por completo en cualquier paquete de instalación de FreeCAD, y PyQt4 también está integrado en el paquete de instalación de Windows.
PyQt4
Web: http://www.riverbankcomputing.co.uk/pyqt
PyQt (versión 4) es una biblioteca de vinculación de Python que permite a los programas acceder, crear o modificar interfaces Qt. Ya que la interfaz de FreeCAD está construida con Qt, la instalación de PyQt4 en tu sistema permitirá a los programas de Python dentro de FreeCAD acceder a todos los interfaces, modificar sus partes, crear nuevos complementos (widgets) o recoger información desde partes del interfaz.
PyQt se distribuye bajo un sistema de múltiples licencias, el mismo sistema que es utilizado por Qt. En resumen, existe una versión comercial y una versión libre GPL. Si quieres utilizarlo para crear aplicaciones comerciales (de código cerrado), necesitas comprar la licencia comercial, en otro caso puedes simplemente instalar y utilizar libremente la versión GPL.
Instalación
Antes de la instalación de PyQt4, obviamente necesitas un entorno de Python instalado y trabajando.
Linux
El modo más sencillo de instalar PyQt4 es a través del gestor de paquetes de tu distribución. En sistemas Debian/Ubuntu, el nombre del paquete es generalmente python-qt4, mientras que en sistemas basados en RPM se denomina pyqt4. Las dependencias necesarias (Qt y SIP) se cogerán automáticamente.
Windows
El programa se puede descargar desde aquí. Necesitas instalar las bibliotecas Qt y SIP antes de instalar (pendiente de documentar).
Utilización
Una vez está instalado, puedes comprobar que todo está funcionando escribiendo en la consola de Python de FreeCAD:
import PyQt4
Para acceder a la interfaz de FreeCAD, escribe:
from PyQt4 import QtCore,QtGui app = QtGui.qApp FreeCADWindow = app.activeWindow()
Ahora puedes comenzar a explorar la interfaz con el comando dir(). Puedes añadir nuevos elementos, como complementos (widget) personalizados, con comandos como:
FreeCADWindow.addDockWidget(QtCore.Qt.RghtDockWidgetArea,my_custom_widget)
Documentación
Más tutoriales de pyQt4 (incluyendo cómo construir interfaces con Qt Designer para utilizar con Python):
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/classes.html - la referencia oficial del API de PyQt4
http://www.rkblog.rk.edu.pl/w/p/introduction-pyqt4/ - una simple introducción
http://www.zetcode.com/tutorials/pyqt4/ - un tutorial en profundidad muy completo
Pivy
Pivy es una biblioteca de vinculación de coin para Python, soportada oficialmente por coin. El propio Coin es un juego de herramientas para construir aplicaciones 3D en OpenGL. Es el juego de herramientas que utiliza FreeCAD para dibujar su escena 3D en la pantalla. Instalando Pivy en tu sistema permitirá a los programas en Python acceder a la escena gráfica de FreeCAD, dibujar nuevos objetos en la escena y utilizar el amplio rango de herramientas de Coin disponibles para operaciones de dibujo. Coin está basado en el lenguaje de descripción de la escena de Open Inventor. Pivy se utiliza por el módulo de croquizado 2D de FreeCAD (y también por el módulo completo), así que es necesario si quieres utilizar cualquier herramienta de dichos módulos.
Es importante saber que FreeCAD sólo utiliza coin para la representación de los objetos en la pantalla, la cual está separada de la definición de los objetos. Esto dignifica que pivy no será capaz de modificar objetos existentes, ni de crear objetos de FreeCAD válidos. Pero puede utilizarse para dibujar todo tipo de cosas temporales en la pantalla, como ejes, parrillas, manipuladores, geometría constructiva, etc...
Pivy, al igual que Coin, se distribuye bajo licencia GPL.
Instalación
Requisitos previos
Creo que antes de compilar Pivy querrás tener Coin y SoQt instalados.
Para construirlo en Mac es suficiente instalar el paquete binario de Coin3. Intentar instalar Coin desde MacPorts es problemático: añadir un montón de paquetes de X Windows y finalmente se cuelga con un error de script.
Para Fedora encontré un RPM con Coin3.
SoQt compilado desde código fuente funciona bien en Mac y Linux.
Debian & Ubuntu
Empezando con Debian Squeeze y Ubuntu Lucid, pivy está disponible directamente desde los repositorios oficiales, ahorrándonos un montón de dificultades. Mientras tanto, puedes descargar uno de los paquetes que hemos creado (para Debian y Ubuntu karmic) disponibles en la página de Descargas, o compilarlo tu mismo.
El mejor modo de compilar pivy siomplemente es aprovechar el paquete de código fuente de Debian para pivy y crear un paquete con debuild. Es el mismo código fuente desde la web oficial de pivy, pero la gente de Debian han creado varios parches adicionales. También se compila bien en Ubuntu karmic: http://packages.debian.org/squeeze/python-pivy (descarga los archivos .orig.gz y .diff.gz, luego descomprimelos, y aplica .diff al código fuente: ve a las carpetas del código fuente descomprimido de pivy, y aplica el parche .diff:
patch -p1 < ../pivy_0.5.0~svn765-2.diff
luego
debuild
para tener pivy correctamente construido en un paquete oficial de instalación. A continuación, simplemente instala el paquete con gdebi.
Otras distribuciones Linux
Primero consigue la última versión del código fuente de los repositorios del proyecto:
hg clone http://hg.sim.no/Pivy/default Pivy
En marzo de 2012, la última versión es Pivy-0.5
Luego necesitas una herramienta llamada SWIG para generar el código C++ para la vinculación de Python. Pivy-0.5 informa que sólo ha sido comprobado con SWIG 1.3.31, 1.3.33, 1.3.35, y 1.3.40. Así que puedes descargar el código fuente en un tarball para una de dichas versiones anteriores desde http://www.swig.org. Luego descomprimelo y desde la línea de comandos haz lo siguiente (como root):
./configure make make install (or checkinstall if you use it)
Esto tardará unos segundos en construirse.
Como alternativa, puedes tratar de construir con un SWIG más reciente. En marzo de 2012, una versión típica del repositorio es la 2.0.4. Pivy tiene un problema menor de compilación con SWIG 2.0.4 en Mac OS (mira más abajo) pero parece construirse bien en Fedora Core 15.
Después de eso ve al archivo que va a los recursos de pivy y ejecuta
python setup.py build
lo que creará los archivos fuente. Ten en cuenta que la construcción puede producir miles de advertencias, pero afortunadamente no hay errores.
Es posible que esto esté obsoleto, pero puedes llegar a un error de compilación donde una constante de tipo caracter (char) no puede ser convertida en una 'char*'. Para solucionarlo sólo necesitas escribir una constante antes de las líneas apropiadas. Hay 6 líneas que corregir.
Después de eso, instalar por publicación (como root):
python setup.py install (or checkinstall python setup.py install)
Eso es todo, pivy está instalado.
Mac OS
Estas instrucciones puede que no estén completas. Algo parecido funciona para OS 10.7 en marzo de 2012. He utilizado MacPorts para los repositorios, pero también deberían funcionar otras opciones.
Para Linux, consigue la última vcersión del código fuente:
hg clone http://hg.sim.no/Pivy/default Pivy
Si no tienes hg, puedes conseguirlo desde MacPorts:
port install mercurial
Luego, como se indica arriba, necesitas SWIG. Debería ser cuestión de hacer:
port install swig
He encontrado que también necesitaba:
port install swig-python
En marzo de 2012, la versión de SWIG en MacPorts es la 2.0.4. Como se ha indicado arriba para Linux, podría ser mejor que descargaras una versión más antigua. SWIG 2.0.4 parece tener un error que detiene la construcción de Pivy. Mira el primer mensaje en este enlace: https://sourceforge.net/mailarchive/message.php?msg_id=28114815
Esto se puede corregir editando las dos ubicaciones de código fuente para añadir: *arg4, *arg5 en lugar de arg4, arg5. Ahora Pivy debería construirse:
python setup.py build sudo python setup.py install
Windows
Asumiendo que utilizas Visual Studio 2005 o superior deberías abrir una ventana de comandos con 'Visual Studio 2005 Command prompt' desde el menú Herramientas. Si el interprete aún no está en el sistema, haz
set PATH=path_to_python_2.5;%PATH%
Para tener pivy funcionando deberías conseguir las últimas fuentes desde los repositorios del proyect:
svn co https://svn.coin3d.org/repos/Pivy/trunk Pivy
Luego necesitas una herramienta denominada SWIG para generar el ódigo C++ para la vinculación con Python. Es recomendable utilizar la versión 1.3.25 de SWIG, no la última versión, porque de momento pivy sólo funciona correctamente con con la versión with 1.3.25. Descarga los binarios para 1.3.25 desde http://www.swig.org. Luego descomprimelo y desde la línea de comandos añádelo al sistema path
set PATH=path_to_swig_1.3.25;%PATH%
y establece COINDIR a la ruta aproviada
set COINDIR=path_to_coin
En Windows el archivo de configuración de pivyespera SoWin en lugar de SoQt por defecto. No he encontrado una manera obvia para construirlo con SoQt, así que he modificado el arhivo setup.py directamente. En la línea 200 simplemente elimina la parte 'sowin' : ('gui._sowin', 'sowin-config', 'pivy.gui.') (no elimines los paréntesis de cierre).
Después de esto ve a las fuentes de pivy y ejecuta
python setup.py build
lo cual crea los archivos de fuente. Puedes llegar a un error de compilación de 'Varios archivos de cabecera no se han encontrado'. En este caso ajusta la variable INCLUDE
set INCLUDE=%INCLUDE%;path_to_coin_include_dir
y si las cabeceras de SoQt no están en el mismo sitio que las cabeceras de Coin también
set INCLUDE=%INCLUDE%;path_to_soqt_include_dir
y finalmente las cabeceras de Qt
set INCLUDE=%INCLUDE%;path_to_qt4\include\Qt
Si estas utilizando la versión Express Edition de Visual Studio puedes tener una excepción de error de clave de Python. En este caso tendrás que modificar unas cuantas cosas en msvccompiler.py situado en la instalación de Python.
Ve a la línea 122 y reemplaza la línea
vsbase = r"Software\Microsoft\VisualStudio\%0.1f" % version
con
vsbase = r"Software\Microsoft\VCExpress\%0.1f" % version
Luego prueba de nuevo. Si te da un segundo error como
error: Python was built with Visual Studio 2003;...
debes reemplazar también la línea 128
self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
con
self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")
Intenta de nuevo. Si tienes un nuevo error como
error: Python was built with Visual Studio version 8.0, and extensions need to be built with the same version of the compiler, but it isn't installed.
entonces deberías comprobar las variables de entorno DISTUTILS_USE_SDK y MSSDK con
echo %DISTUTILS_USE_SDK% echo %MSSDK%
If not yet set then just set it e.g. to 1
set DISTUTILS_USE_SDK=1 set MSSDK=1
Ahora, debes encontrar un error de compilación donde una constante de tipo char no se puede convertir en char. Para solucionarlo necesitas escribir una constante antes de las líneas apropiadas. Hay 6 líneas que corregir. Después copia el directorio de pivy generado a un lugar donde el interprete de Python de FreeCAD lo pueda encontrar.
Utilización
Para tener Pivy acceso a la escena gráfica de FreeCAD haz lo siguiente:
from pivy import coin App.newDocument() # Open a document and a view view = Gui.ActiveDocument.ActiveView FCSceneGraph = view.getSceneGraph() # returns a pivy Python object that holds a SoSeparator, the main "container" of the Coin scenegraph FCSceneGraph.addChild(coin.SoCube()) # add a box to scene
Ahora puedes explorar FCSceneGraph con el comando dir().
Documentación
Desafortunadamente la documentación sobre pivy es casi inexistente en la redt. Pero podrías encontrar la documentación de Coin útil, ya que pivy simplemente traduce las funciones de Coin, los nodos y métodos en Python, todo mantiene el mismo nombre y propiedades, teniendo en cuenta la diferencia de sintaxis entre C y Python:
http://doc.coin3d.org/Coin/classes.html - Referencia del API de Coin3D
http://www-evasion.imag.fr/~Francois.Faure/doc/inventorMentor/sgi_html/index.html - The Inventor Mentor - La "biblia" del lenguaje de descripción de escena de Inventor.
También puedes echar un vistazo al archivo Draft.py en el directorio de FreeCAD Mod/Draft, ya que hace un uso importante de pivy.
pyCollada
pyCollada es una biblioteca de Python que permite a los programas leer y escribir archivos de Collada (*.DAE). Cuando pyCollada está instalado en tu sistema, FreeCAD (Disponible en la versión 0.13 ) lo detectará y añadirá opciones de importación y exportación para manejar la apertura y guardado en el formato de archivos de Collada.
Instalación
Pycollada no está normalmente disponible en los repositorios de las distribuciones de Linux, pero ya que está creado únicamente por archivos de Python, no es necesaria su compilación, y es sencillo de instalar. Tienes dos métodos, o directamente desde el repositorio ofician en Git de pycollada, o con la herramienta easy_install.
Linux
En ambos casos, necesitaras tener los siguientes paquetes ya instalados en tu sistema:
python-lxml python-numpy python-dateutil
Desde el repositorio de Git
git clone git://github.com/pycollada/pycollada.git pycollada cd pycollada sudo python setup.py install
Con easy_install
Asumiendo que ya tienes una instalación completa de Python, la utilidad easy_install ya debería estar presente:
easy_install pycollada
Windows
Pendiente de documentar
IfcOpenShell
Pendiente de documentar
Créditos
Aquí se puede ver un resumen de las personas o compañías que han contribuido a FreeCAD. Para los créditos de las bibliotecas utilizadas ver Bibliotecas de terceros.
Desarrollo
Responsables del proyecto
Responsables del proyecto de FreeCAD
Más adelante pueden tener responsabilidades sobre el módulo base.
Principales desarrolladores
Personas que trabaja regularmente en el código de FreeCAD
Otros programadores
Personas que han contribuido con código al proyecto de FreeCAD:
- Graeme van der Vlugt
- Berthold Grupp
- Georg Wiora
- Martin Burbaum
- Jacques-Antoine Gaudin
- Ken Cline
- Dmitry Chigrin
- Remigiusz Fiedler (DXF-parser)
Compañías
Compañías que han donado código o desarrolladores:
- Imetric 3D
Comunidadd
Personas de la comunidad que han aportado una gran cantidad de esfuerzo ayudando al proyecto de FreeCAD
- Normandc
- Kwahoo
- Eduardo Magdalena





















