Diferencia entre revisiones de «Obijuan:Notas sobre programación en python en Freecad»

De WikiRobotics
Saltar a: navegación, buscar
(Roadmap)
(Hito 3: Script con gui empotrada en Freecad)
Línea 115: Línea 115:
 
  label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
 
  label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
 
  label.setObjectName("myLabel") # sets its name, so it can be found by name
 
  label.setObjectName("myLabel") # sets its name, so it can be found by name
 +
 +
== Hito 4: Script con GUI diseñada con QTcreator ==
  
 
== Log ==
 
== Log ==
 
* 28/Agosto/2014: Comenzada esta página
 
* 28/Agosto/2014: Comenzada esta página

Revisión del 03:46 29 ago 2014

Introducción

Quiero aprender a programar piezas en Freecad, al estilo openscad, para poder hacer piezas paramétricas.

Empezaremos con ruedas paramétricas para printbots

Roadmap

  1. Hello world: programar un cilindro simple, con los parámetros h (grosor) y diámetro (d)
  2. scripts con GUI
  3. script con gui empotrada en Freecad
  4. Script con una GUI diseñada con QTcreator
  5. Script con la gui empotrada en la pestaña task
  6. Programar la rueda del miniskybot, pero con esos mismos parametros variables
  7. Incluir 2 coronas: pequeña y grande y permitir que se puedan seleccionar una u otra para la rueda
  8. ¿Como crear un boton que al pulsarlo se abra el menú y permita meter una rueda definiendo sus parametros?
  9. ¿Cómo programar un workbench de printbots? que incluya botones con piezas: ruedas, portapilas, chásis...

Hito 0: Leer

Hito 1: programa "hola mundo"

Visualizar un cilindro genérico (el mismo que cuando se le da al botón de cilindro en el workbench part)

import FreeCAD
import Part

doc = App.ActiveDocument
cyl = doc.addObject("Part::Cylinder","Cylinder")
cyl.Label = "Cylinder"
doc.recompute()

Otro ejemplo, con la función cilindro definida, donde se le pasan los parámetros de altura y diámetro

import FreeCAD
import Part

def cylinder(h = 8, d = 56):
    doc = App.ActiveDocument
    cyl = doc.addObject("Part::Cylinder","Cylinder")
    cyl.Label = "Cylinder"
    cyl.Height = h
    cyl.Radius = d / 2.0 
cylinder() cylinder(h = 20, d =10) App.ActiveDocument.recompute()

He encontrado una forma más sencilla de hacer el cilindro:

import FreeCAD
import Part

#-- radius = 56, height = 8
cyl = Part.makeCylinder(56, 8)
Part.show(cyl)

sin embargo el objeto que se crea es un "shape". Las propiedades de altura y radio se pierden. Nos servirá por tanto para construir otros objetos, pero no para hacer algo paramétrico que cambie dinámicamente

Hito 2: Scripts con GUI en FREECAD

Ejemplo hola mundo para sacar una ventana emergente

from PyQt4 import QtGui
QtGui.QMessageBox.information(None,"Titulo","Hola Mundo!")

Ventana desde la que especifiar el lado para hacer un cubo

from PyQt4 import QtGui, QtCore
import Part, FreeCAD
from FreeCAD import Base, Vector

class BoxExample(QtGui.QWidget):
	def __init__(self): 
		super(BoxExample, self).__init__()
		self.initUI()

	def initUI(self):
		self.setGeometry(100, 100, 260, 100)
		self.setWindowTitle('Mi cubo')
		self.lengthLabel = QtGui.QLabel("Lado: ",self)
		self.lengthLabel.move(20, 20)
		self.length = QtGui.QLineEdit(self)
		self.length.move(100, 15)
 		
		self.okButton = QtGui.QPushButton("Crear cubo",self)
		self.okButton.move(20, 60)
		self.show()
		
		QtCore.QObject.connect (self.okButton, QtCore.SIGNAL("pressed()"),self.box)
		
	def box(self):
		l = float(self.length.text())
		box = Part.makeBox(l, l, l)
		Part.show(box)


d = BoxExample()

Hito 3: Script con gui empotrada en Freecad

Widget "hola mundo" empotrado en la gui de Freecad, en la parte de la derecha:

import sys
from PyQt4 import QtGui, QtCore
app = QtGui.qApp
mw = app.activeWindow()

myWidget = QtGui.QDockWidget()
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)

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

Hito 4: Script con GUI diseñada con QTcreator

Log

  • 28/Agosto/2014: Comenzada esta página