jueves, 6 de octubre de 2022

Modelador FreeCAD (XXII)

 

Crear formas con Python

FreeCAD (XXII)

Crear y manipular geometría con Python

Los bancos de trabajo Draft y Arch utilizan código Python para crear y manipular geometría Part. La sentencia Python para importar el módulo Part es:
import Part
Si se escribe Part. aparecerá la ventana que muestra los métodos disponibles. Para crear una caja de dimensiones 3x5x7, la sentencia será:
Part.makeBox(3,5,7)
No obstante, la caja no aparece en la ventana 3D, porque lo que se ha creado sólo es una forma Part, aún no es un objeto FreeCAD. En FreeCAD, los objetos y su geometría son independientes. Cada objeto FreeCAD es un contenedor que acogerá una forma. Los objetos paramétricos tienen, además, propiedades como la anchura y la altura, y su forma se recalculará sobre la marcha siempre que se cambie alguna de esas propiedades.

Creación de objeto genérico

Se puede crear un objeto genérico mediante una serie de sentencias como la siguiente:
boxShape = Part.makeBox(3,5,7)
myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MiNuevaCaja")
myObj.Shape = boxShape
FreeCAD.ActiveDocument.recompute()
La forma de un objeto (Shape) es una de sus propiedades, como la altura, solo que no requiere un número, sino una forma Part.

Listado de atributos

Las formas Part siempre tienen los atributos siguientes:
  • vértices
  • aristas
  • alambres (conjuntos de aristas)
  • caras
  • envolvente
  • sólido.
Todos esos atributos son listas que pueden contener cualquier número de elementos o no contener ninguno. Mediante el comando print se puede obtener un listado de los elementos incluidos en cada atributo. Para ver el listado de vértices en la forma boxShape, la sentencia sería:
print(boxShape.Vertexes)
Para ver las aristas:
print(boxShape.Edges)
Para ver los alambres:
print(boxShape.Wires)
Para ver las caras:
print(boxShape.Faces)
Para ver la envolvente:
print(boxShape.Shells)
Y para ver el sólido:
print(boxShape.Solids).

Listado de propiedades de atributos

Se puede obtener el área de cada cara de un objeto mediante una sentencia como la siguiente:
for f in boxShape.Faces:
   print(f.Area)
Después de la última línea hay que pulsar Intro dos veces. Para obtener un listado con los vectores correspondientes al punto inicial y al punto final de cada arista, la sentencia sería:
for e in boxShape.Edges:
   print("New edge")
   print("Start point:")
   print(e.Vertexes[0].Point)
   print("End point:")
   print(e.Vertexes[1].Point)
Si la forma tiene vértices, cada una de sus aristas también tiene vértices. Cada pareja de vértices en cada arista pertenece a la lista total de vértices de la forma.

Tipos de forma

Se puede comprobar el tipo de una forma mediante el comando ShapeType. Si se escribe la sentencia:
print(boxShape.ShapeType)
el resultado será Solid (sólido). Si se escribe:
print(boxShape.Faces[0].ShapeType)
el resultado será Face (cara). Si se escribe:
print(boxShape.Vertexes[2].ShapeType)
el resultado será Vertex (vértice).

Creación de formas complejas

El primer paso será la creación de puntos, con sentencias como las siguientes:
V1 = FreeCAD.Vector(0,10,0)
V2 = FreeCAD.Vector(30,10,0)
V3 = FreeCAD.Vector(30,-10,0)
V4 = FreeCAD.Vector(0,-10,0)
VC1 = FreeCAD.Vector(-10,0,0)
VC2 = FreeCAD.Vector(40,0,0)
Después se podrá utilizar esos vértices para crear segmentos (es necesario haber importado previamente el módulo Part):
L1 = Part.LineSegment(V1,V2)
L2 = Part.LineSegment(V4,V3)
Part.LineSegment no crea una arista, sino la geometría en la cual se basará la arista. Para crear arcos, las sentencias serán:
C1 = Part.Arc(V1,VC1,V4)
C2 = Part.Arc(V2,VC2,V3)
Para convertir todos los arcos y líneas en aristas, las sentencias serán del tipo siguiente:
E1 = Part.Edge(L1)
E2 = Part.Edge(L2)
E3 = Part.Edge(C1)
E4 = Part.Edge(C2)
Para definir un alambre a partir de las aristas creadas, la sentencia será:
W = Part.Wire([E1,E4,E2,E3])
Se puede comprobar si el alambre está cerrado mediante la sentencia:
print( W.isClosed() )
Si está cerrado, la respuesta será True. Para crear una cara, es necesario que el alambre esté cerrado. La cara se crea con una sentencia como la siguiente:
F = Part.Face(W)
Para extruir esa cara se puede utilizar una sentencia como:
P = F.extrude(FreeCAD.Vector(0,0,10))
Para comprobar si la forma creada es un sólido, la sentencia sería:
print(P.ShapeType)
La respuesta será Solid. Cuando se extruye una cara siempre se obtiene un sólido. Si se extruye un alambre sólo se obtendrá una envolvente vacía. La forma creada no aparecerá en la ventana 3D mientras no se le asigne un objeto. Para crearlo, las sentencias pueden ser:
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","Mi_Solido")
myObj2.Shape = P
FreeCAD.ActiveDocument.recompute()

domingo, 2 de octubre de 2022

Modelador FreeCAD (XXI)

 

Consola Python en FreeCAD

FreeCAD (XXI)

Introducción a Python

Python es un lenguaje de programación open source muy popular. Tiene características que lo hacen idóneo para los usuarios de FreeCAD. Es muy fácil de aprender, sobre todo para quienes no tienen experiencia previa en programación. Además de utilizarse en FreeCAD puede utilizarse en aplicaciones como Blender, Inkscape o Grass. FreeCAD utiliza mucho el lenguaje Python. Se puede utilizar Python para acceder y controlar casi cualquier característica de FreeCAD. Por ejemplo, se puede crear objetos nuevos, modificar su geometría, analizar su contenido o incluso crear nuevos controles de interfaz, herramientas y paneles. Algunos bancos de trabajo incluidos en la instalación básica y la mayoría de los bancos disponibles como complementos están totalmente programados en Python. FreeCAD tiene una consola Python que se activa mediante Ver > Paneles > Consola de Python. A menudo es útil para ejecutar operaciones para las que aún no hay ningún botón, para comprobar si alguna forma presenta problemas, o para ejecutar tareas repetitivas. Pero la consola Python tiene otro uso importante: cada vez que se pulsa un botón o se ejecuta otras operaciones en FreeCAD, la consola muestra el código Python correspondiente, así que constituye una fuente de aprendizaje del lenguaje. FreeCAD tiene también un sistema de macros, que permite grabar acciones para luego repetir la secuencia. Ese sistema también utiliza la consola Python, registrando todo lo que aparece en ella.

Escribir código Python

Hay dos maneras fáciles de escribir código Python en FreeCAD:

  • desde la consola Python: los comandos se escriben uno a uno y se ejecutan cuando se pulsa Intro
  • desde el editor de macros: admiten procesos más complejos, compuestos por varias líneas que se ejecutan cuando se ejecuta la macro.

La consola Python tiene la ventaja de que permite detectar los errores de código de manera inmediata.

Crear un documento nuevo

Para crear un nuevo documento vacío: doc = FreeCAD.newDocument(). En cuanto se completa la sentencia doc = FreeCAD. el programa muestra una pequeña ventana en la que se puede seleccionar cualquiera de las opciones disponibles para acabar el comando, así que sólo habrá que seleccionar newDocument (con doble clic) y luego escribir () y pulsar Intro. Los paréntesis son obligatorios cuando se utiliza funciones Python.

Crear y modificar un objeto

Cuando se escribe un punto tras un comando, la consola muestra todas las opciones disponibles para el mismo. Si se escribe doc. aparecerá una pequeña ventana con todas las opciones disponibles para doc. Las palabras que aparecen escritas con la inicial mayúscula son atributos, contienen un valor. Las que empiezan con minúscula son funciones o métodos, ejecutan algo. Las que empiezan con guión bajo (_) son para uso interno del módulo, se pueden ignorar. Para añadir un objeto puede utilizarse una sentencia como box box = doc.addObject("Part::Box","miCaja"). El objeto miCaja aparece en el árbol, pero puede que no se muestre en la ventana 3D. Eso es porque cuando se trabaja con Python el recálculo no es automático, hay que ordenarlo mediante la sentencia doc.recompute(). La sentencia box.Height = 5 adjudicará automáticamente la altura 5 a la caja seleccionada.

Modificar la ubicación

La posición y la orientación de los objetos puede manipularse fácilmente desde Python. Por ejemplo, para que la posición de un objeto cambie al punto (5,5,0) habría que ejecutar la siguiente secuencia de comandos:

print(box.Placement)

print(box.Placement.Base)

box.Placement.Base = sumvec

otherpla = FreeCAD.Placement()

otherpla.Base = FreeCAD.Vector(5,5,0)

box.Placement = otherpla