Macro cuts into pieces of repetitive shape

Este foro es para preguntas y debates en Español
Forum rules
reglas del foro e información útil

IMPORTANTE: Por favor leer antes de solicitar ayuda
Post Reply
josu20
Posts: 3
Joined: Sat Aug 11, 2018 11:04 am

Macro cuts into pieces of repetitive shape

Post by josu20 »

OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 32-bit
Version: 0.17.13519 (Git)
Build type: Release
Branch: releases/FreeCAD-0-17
Hash: 1a8b868018f45ea486c0023fdbfeb06febc1fb89
Python version: 2.7.14
Qt version: 4.8.7
Coin version: 4.0.0a
OCC version: 7.2.0
Locale: Spanish/Spain (es_ES)

Hola buenas, estoy empezando a utilizar esta herramienta y se lo básico de python.
No encuentro información o tema a mi problema a ver si algun alma caritativa me puede ayudar.
Mi interes es crear una macro donde el usuario puedo generar una placa y hacerle micro perforaciones aleatorias, solo dando unos parametros como la dimesiones de la placa y lo que intento es que con la herramienta cut crear unos cilindros que la atraviesen y cree agujeros dandole una cordenadas y que pueda ser repetitivo.
Mi problema lo tengo que el programa me nombra las variables con cut, cut001 para el segundo corte y lo unico que se me ocurre es añadir un contador de repeticiones añadir un if para el primero, un elif para el segundo y el tercero agujero, todo esto dentro de la misma funcion, sea el else que ya quiero crear el bucle donde comience a repetir el procedimiento.

Mi funcion seria la siguiente:

def recortar(self):
global contador
if contador == 0:
radioc = float (self.Radioc.text())
cilindro = App.ActiveDocument.addObject("Part::Cylinder","agujero")
cilindro.Radius = radioc
global espesorp
cilindro.Height = espesorp
abcisac = float (self.Abcisac.text())
ordenadac = float (self.Ordenadac.text())
App.ActiveDocument.ActiveObject.Placement = App.Placement(App.Vector(abcisac,ordenadac,0), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))

cut = App.activeDocument().addObject("Part::Cut","cut")
App.activeDocument().cut.Base = App.activeDocument().placa
App.activeDocument().cut.Tool = App.activeDocument().agujero
Gui.activeDocument().placa.Visibility = False
Gui.activeDocument().agujero.Visibility = False
Gui.ActiveDocument.cut.ShapeColor = Gui.ActiveDocument.placa.ShapeColor
Gui.ActiveDocument.cut.DisplayMode = Gui.ActiveDocument.placa.DisplayMode
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
contador+=1
print "el contador en el if esta: ",contador

elif contador == 1:
radioc = float (self.Radioc.text())
cilindro = App.ActiveDocument.addObject("Part::Cylinder","agujero001")
cilindro.Radius = radioc
cilindro.Height = espesorp
abcisac = float (self.Abcisac.text())
ordenadac = float (self.Ordenadac.text())
App.ActiveDocument.ActiveObject.Placement = App.Placement(App.Vector(abcisac,ordenadac,0), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
cut = App.activeDocument().addObject("Part::Cut","cut001")
App.activeDocument().cut001.Base = App.activeDocument().cut
App.activeDocument().cut001.Tool = App.activeDocument().agujero001
Gui.activeDocument().cut.Visibility = False
Gui.activeDocument().agujero001.Visibility = False
Gui.ActiveDocument.cut001.ShapeColor = Gui.ActiveDocument.cut.ShapeColor
Gui.ActiveDocument.cut001.DisplayMode = Gui.ActiveDocument.cut.DisplayMode
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
contador+=1
print "El contador en el elif esta: ",contador

else:
contadorcadena = str(contador)
agujerocadena="agujero00"+contadorcadena
cutcadena="cut00"+contadorcadena
radioc = float (self.Radioc.text())
cilindro = App.ActiveDocument.addObject("Part::Cylinder",agujerocadena)
cilindro.Radius = radioc
cilindro.Height = espesorp
abcisac = float (self.Abcisac.text())
ordenadac = float (self.Ordenadac.text())
App.ActiveDocument.ActiveObject.Placement = App.Placement(App.Vector(abcisac,ordenadac,0), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
diccionarioCut = {}
cut002 = App.activeDocument().addObject("Part::Cut",cutcadena)
App.activeDocument().cut002.Base = App.activeDocument().cut001
App.activeDocument().cut002.Tool = App.activeDocument().agujero002
Gui.activeDocument().cut001.Visibility = False
Gui.activeDocument().agujero002.Visibility = False
Gui.ActiveDocument.cut002.ShapeColor = Gui.ActiveDocument.cut001.ShapeColor
Gui.ActiveDocument.cut002.DisplayMode = Gui.ActiveDocument.cut001.DisplayMode
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
contador+=1
print "El contador en el else esta: ",contador

como se puede apreciar en el else, creando una cadena es posible que los nuevos cilindros tenga un nombre creciente cut002, cut003..., pero a la hora de igualar las bases de cut002 a cut001 como no es una cadena sino una referencia al objeto que posteriormente es invisibilizado, no se como convertir una cadena a nombre de una variable...

Resumiendo creo q es algo simple de resolver en python con un for pero no acabo de verlo, y como los nombres que freecad asigna a las piezas es inamobible el nombre una vez asignado, no puedo generar otro que contenga ese nombre? y pueda manipular?

Muchas gracias por la atención, espero que sea sencillo y sea yo el unico que no lo vea, y si ya ayudase a alguien se sentiria util. Un cordial saludo
damian
Posts: 583
Joined: Sun May 31, 2015 6:16 pm

Re: Macro cuts into pieces of repetitive shape

Post by damian »

hola @josu20
josu20 wrote: Sat Aug 11, 2018 11:21 am como se puede apreciar en el else,
El código sin indexado no se puede apreciar. Utiliza Code display. Por ejemplo:

Code: Select all

def hello():
    print("Hello Word!")
Y sin tabulaciones.
damian
Posts: 583
Joined: Sun May 31, 2015 6:16 pm

Re: Macro cuts into pieces of repetitive shape

Post by damian »

josu20 wrote: Sat Aug 11, 2018 11:21 am Mi interes es crear una macro donde el usuario puedo generar una placa y hacerle micro perforaciones aleatorias, solo dando unos parametros como la dimesiones de la placa
bien
josu20 wrote: Sat Aug 11, 2018 11:21 am y lo que intento es que con la herramienta cut crear unos cilindros que la atraviesen y cree agujeros dandole una cordenadas y que pueda ser repetitivo.
Esto no lo entiendo. Conforme a tu implementación estás creando un "document object" para el cilindro, y otro para el corte. Si tienes una placa, y diez abujeros, al final tienes 10 +10 + 1 = 21 "document object". Esto es bastante caro. ¿Es realmente esto lo que quieres? Ya que puedes tener un único objeto del documento, la placa, y elaborar su forma ("Shape") con los parámetros más los abujeros, lo cual es mucho más económico.
Posteriormente defines un método def recortar(self) en el cual se crean toda la batería de document objects (cilindros y cortes). ¿Le has hechado un vistazo a la documentación de "sripted objects"? https://www.freecadweb.org/wiki/Scripted_objects. La organización tipo de la clase, o como se crean los objetos, suele ser diferente.

PD: disculpa que no entre al fondo de tu pregunta, pero es que me resulta dificil de entender fuera del esquema organizativo que normalmente se usa en FreeCAD.
damian
Posts: 583
Joined: Sun May 31, 2015 6:16 pm

Re: Macro cuts into pieces of repetitive shape

Post by damian »

josu20 wrote: Sat Aug 11, 2018 11:21 am y como los nombres que freecad asigna a las piezas es inamobible el nombre una vez asignado, no puedo generar otro que contenga ese nombre? y pueda manipular?
El nombre es la clave principal de todo objeto del documento y no se puede modificar. La etiqueta (obj.Label) si se puede modificar.
EDICION:
Los objectos se pueden seleccionar por normbre o por etiqueta

Code: Select all

App.ActiveDocument.getObject()
App.ActiveDocument.getObjectsByLabel()
josu20
Posts: 3
Joined: Sat Aug 11, 2018 11:04 am

Re: Macro cuts into pieces of repetitive shape

Post by josu20 »

damian wrote: Sat Aug 11, 2018 5:39 pm
josu20 wrote: Sat Aug 11, 2018 11:21 am y como los nombres que freecad asigna a las piezas es inamobible el nombre una vez asignado, no puedo generar otro que contenga ese nombre? y pueda manipular?
El nombre es la clave principal de todo objeto del documento y no se puede modificar. La etiqueta (obj.Label) si se puede modificar.
EDICION:
Los objectos se pueden seleccionar por normbre o por etiqueta

Code: Select all

App.ActiveDocument.getObject()
App.ActiveDocument.getObjectsByLabel()
Muchas gracias por las respuestas, pero me podria esplicar como utilizar el getObjectsByLabel()...
He leido que tiene una devuelve una lista y como defecto se añade el primero que suele ser unico con un [0] no?
Pues no soy capaz de que haga referencia a ese objeto... me devuelve esto:
App.activeDocument.getObjectsByLabel(CutCadena)[0].Base = App.activeDocument.getObjectsByLabel(CutCadena1)[0]
AttributeError: 'builtin_function_or_method' object has no attribute 'getObjectsByLabel'
damian
Posts: 583
Joined: Sun May 31, 2015 6:16 pm

Re: Macro cuts into pieces of repetitive shape

Post by damian »

porque es ActiveDocument, con A mayúscula. La consola python del programa te va indicando.
consola_python.png
consola_python.png (222.57 KiB) Viewed 1569 times
Para aprender a usarla lee https://www.freecadweb.org/wiki/Introduction_to_Python y siguientes
mario52
Veteran
Posts: 4673
Joined: Wed May 16, 2012 2:13 pm

Re: Macro cuts into pieces of repetitive shape

Post by mario52 »

salutos

y citas para el nombre : "nombre" (string)

Manual_search_of_an_element_with_label

Code: Select all

App.ActiveDocument.getObjectsByLabel("CutCadena1")[0]
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
josu20
Posts: 3
Joined: Sat Aug 11, 2018 11:04 am

Re: Macro cuts into pieces of repetitive shape

Post by josu20 »

SOLUCIONADO!

No era exactamente como me dijisteis pero me ha ayudado mucho a dar con la tecla. Comparto la macro por si a alguien le ha surgido el mismo problema. Gracias por todo y seguiré el foro de cerca. Un cordial saludo

https://drive.google.com/file/d/12QWjSs ... sp=sharing
Post Reply