FreeCAD-macros
421 строка · 16.8 Кб
1# -*- coding: utf-8 -*-
2# (c) 18Turbo, 2022
3
4__Name__ = 'PiecesTemplates'
5__Comment__ = 'Create a structured pieces (PiecesTemplates)\nCreador de estructuras de piezas'
6__Author__ = '18Turbo'
7__Version__ = '1.4.1'
8__Date__ = '2022-10-06'
9__License__ = 'LGPL-2.0-or-later'
10__Web__ = 'https://github.com/18turbo/PlantillaPiezaFreeCAD'
11__Wiki__ = 'https://github.com/18turbo/PlantillaPiezaFreeCAD'
12__Icon__ = 'PiecesTemplates.svg'
13__Help__ = ''
14__Status__ = 'beta'
15__Requires__ = 'FreeCAD >= v0.20'
16__Contact__ = 'https://github.com/18turbo'
17__Communication__ = ''
18__Files__ = 'PiecesTemplates.svg,/PiecesTemplates/ui/PiecesTemplates.ui,/PiecesTemplates/Groups.txt'
19
20
21import FreeCAD as app
22import FreeCADGui as gui
23from PySide import QtCore, QtGui
24from PySide2.QtWidgets import *
25import re
26
27# (Spanish):
28#
29# Autor: 18Turbo
30# Fecha Inicial: 1-07-2022
31# Versión: 1.4.1
32#
33# Funcionalidad: Crea una estructura de una pieza con una serie de subcarpetas dentro con varios nombres
34#
35# Descripción: Al pinchar la macro (o el botón en la barra de herramientas), su comportamiento siempre es la de crear una pieza
36# con una serie de directorios (grupos) dentro (que lo define el array del principio de la macro). El nombre de la pieza se le da
37# a través de una ventana.
38#
39# Modificaciones del Usuario:
40# Al cambiar "listaGrupos" en la línea de código con las cadenas que uno desee, se crean el número de directorios
41# (grupos) con el nombre de cada elemento de la lista. Es completamente MODIFICABLE. Si listaGrupos fuese
42# listaGrupos = ['AA',BB'], siempre crearía dos directorios dentro de la pieza, uno con el nombre AA y otro con el nombre BB.
43#
44# Notas de versiones:
45# v.1.4.1: Corregido error en la posición al añadir un grupo
46# v.1.4.0: Adaptación inicial al Addon Manager
47# Cambio de la ventana a la pestaña de tareas
48# Múltiples Piezas de una vez
49# Checkbox "ilimitados"
50# Resumen de piezas creadas de una vez (número y nombre)
51# Imposibilidad de crear nombre de Pieza de nombre vacío, ya que el nombre genérico puede generar algunas confusiones
52# Scroll en los checkboxes
53# v.1.3.0: Ahora al pulsar <Return> tras introducir el nombre, crea la pieza con la estructura que hay seleccionada
54# Se aumenta la capacidad visual de los checkbox a 7
55# Corrección de errores
56# v.1.2.0: Se implementa una caja de información para indicar al usuario cómo cambiar los nombres de los grupos (idea
57# de Rafael García Rodríguez)
58# Se crean unos checkbox por defecto para marcar los directorios que se quieren crear
59# v.1.0.0 Creada ventana donde pide el nombre de la pieza
60# v.0.9.8: Inicial candidata.
61#
62#
63# Agradecimientos:
64# - Hugo Sala Sala: por la traducción al inglés del script
65# - Rocco Vicedomini: por la traducción al italiano del script
66#
67
68
69listGroups = []
70elementosBorrados = []
71maxElem = 12
72cIntro = '\n'
73
74strLang = [
75[ # Español
76## Strings for translation into any language
77"Creador de Estructuras de Piezas",
78"El documento no está activo",
79"Creación de Piezas",
80"Nombre de la Pieza:",
81"Información de Uso",
82"Grupos/Directorios a crear:",
83"Crear Estructura de Pieza",
84"Versión:",
85"Descripción:",
86"Información",
87"Este script (macro) genera una estructura de grupos (directorios) en una pieza, de manera que sea más fácil organizar las distintas operaciones,referencias y objetos de esa pieza.",
88"Los grupos inicialmente están predefinidos, pero pueden ser cambiados fácilmente.",
89"Operaciones sobre Grupos",
90"Añadir Grupo",
91"Eliminar Grupo",
92"el primero",
93"el último",
94"Listado Piezas Creadas:",
95"Nº de Piezas Creadas:"
96
97],
98[ # English
99## Strings for translation into any language (English Strings)
100"Part Template Creator",
101"The document is not active",
102"Creation of Parts",
103"Part Name:",
104"Usage Information:",
105"Groups/Directories to create:",
106"Create Part Structure",
107"Version:",
108"Description:",
109"Information",
110"This script (macro) generates a structure of groups (directories) in a part, so that it is easier to organize the different operations, references, and objects of that part.",
111"The groups are initially predefined, but can be easily changed.",
112"Operations on Groups",
113"Add Group",
114"Delete Group",
115"first",
116"the last",
117"List Pieces Created:",
118"Number of Pieces Created:"
119
120],
121[ # Italiano
122## Strings for translation into any language (Italian strings)
123"Creatore di strutture delle Parti",
124"Il documento non è attivo",
125"Creazione delle Parti",
126"Nome della Parte:",
127"Informazioni per l'uso:",
128"Gruppi/Cartelle da creare:",
129"Crea la struttura della Parte",
130"Versione:",
131"Descrizione:",
132"Informazioni",
133"Questo script (macro) genera una struttura di gruppi (cartelle) in una nuova parte, in modo che sia più semplice organizzare le varie operazioni, i riferimenti e gli elementi di questa parte.",
134"I gruppi inizialmente risultano predefiniti, però si possono modificare facilmente.",
135"Operazioni sui Gruppi",
136"Aggiungi Gruppo",
137"Elimina Gruppo",
138"per primo",
139"per ultimo",
140"Lista delle parti create:",
141"Nº di parti create:"
142]
143]
144
145ui_path = app.getUserMacroDir(True) + "/PiecesTemplates/ui/PiecesTemplates.ui"
146gr_path = app.getUserMacroDir(True) + "/PiecesTemplates/Groups.txt"
147
148try:
149_fromUtf8 = QtCore.QString.fromUtf8
150except AttributeError:
151def _fromUtf8(s):
152return s
153
154class PiecesTemplates:
155
156def __init__(self):
157self.doc = app.activeDocument()
158if not self.doc:
159app.Console.PrintWarning(tr('El documento no está activo') + cIntro)
160return
161
162# Init var
163self.form = gui.PySideUic.loadUi(ui_path)
164self.numeroPiezas = 0
165self.pieza = ""
166self.form.botonCrear.setEnabled(False)
167
168# Open File "Groups.txt"
169self.openF()
170
171# Init UI with content
172self.mostrarCheckbox()
173self.initStrings()
174
175# Connect
176self.form.botonCrear.clicked.connect(self.createPart)
177self.form.edicionNombrePieza.returnPressed.connect(self.createPart)
178self.form.edicionNombrePieza.textChanged.connect(self.nombrePiezaCambia)
179self.form.botonAyuda.clicked.connect(self.mostrarHelp)
180self.form.eliminarGrupo.clicked.connect(self.on_eliminarGrupo_clicked)
181self.form.anadirGrupo.clicked.connect(self.on_anadirGrupo_clicked)
182
183def openF(self):
184with open(gr_path, "r") as groupsFile:
185for linea in groupsFile.readlines():
186linea = re.sub("\n","",linea)
187if (linea != ""):
188listGroups.append(linea)
189self.form.comboEliminarGrupo.addItem(linea)
190if (len(listGroups) > maxElem):
191etError1 = __Name__ + "(Error)"
192error1 = "En el archivo de texto hay más líneas de las permitidas." + " "
193error1 += "El máximo es: " + str(maxElem) + cIntro + cIntro
194error1 += "Se aconseja cancelar y corregir el archivo de texto:" + cIntro + cIntro
195error1 += gr_path + cIntro + cIntro
196reply = QtGui.QMessageBox.warning(None,etError1,error1)
197self.longitudListaGrupos = len(listGroups)
198
199def translate(self, text):
200if (text not in strLang[0]) or (g_num_lang < 0) or (g_num_lang >= len(strLang)):
201return text
202primerIdioma = strLang[0]
203indice = primerIdioma.index(text)
204if (indice == -1) or (indice >= len(strLang[g_num_lang])):
205return text
206return strLang[g_num_lang][indice]
207
208def activarUnCheckbox(self,cad,cont):
209cad.setText(listGroups[cont])
210cad.setEnabled(True)
211cad.setChecked(True)
212
213def mostrarCheckbox(self):
214self.initCheckbox()
215max = self.longitudListaGrupos
216if max!=0:
217if max>=1: self.activarUnCheckbox(self.form.cb1,0)
218if max>=2: self.activarUnCheckbox(self.form.cb2,1)
219if max>=3: self.activarUnCheckbox(self.form.cb3,2)
220if max>=4: self.activarUnCheckbox(self.form.cb4,3)
221if max>=5: self.activarUnCheckbox(self.form.cb5,4)
222if max>=6: self.activarUnCheckbox(self.form.cb6,5)
223if max>=7: self.activarUnCheckbox(self.form.cb7,6)
224if max>=8: self.activarUnCheckbox(self.form.cb8,7)
225if max>=9: self.activarUnCheckbox(self.form.cb9,8)
226if max>=10: self.activarUnCheckbox(self.form.cb10,9)
227if max>=11: self.activarUnCheckbox(self.form.cb11,10)
228if max>=12: self.activarUnCheckbox(self.form.cb12,11)
229
230def unCheckbox(self,cad):
231cad.setText(self.translate("(Vacío)"))
232cad.setEnabled(False)
233cad.setChecked(False)
234
235def initCheckbox(self):
236self.unCheckbox(self.form.cb1)
237self.unCheckbox(self.form.cb2)
238self.unCheckbox(self.form.cb3)
239self.unCheckbox(self.form.cb4)
240self.unCheckbox(self.form.cb5)
241self.unCheckbox(self.form.cb6)
242self.unCheckbox(self.form.cb7)
243self.unCheckbox(self.form.cb8)
244self.unCheckbox(self.form.cb9)
245self.unCheckbox(self.form.cb10)
246self.unCheckbox(self.form.cb11)
247self.unCheckbox(self.form.cb12)
248
249def mostrarComboGroups(self):
250self.form.comboEliminarGrupo.clear()
251for cont in range(self.longitudListaGrupos):
252self.form.comboEliminarGrupo.addItem(listGroups[cont])
253
254def initStrings(self):
255tr = self.translate
256if g_num_lang != 1:
257title = "(" + strLang[g_num_lang][0] + ")"
258else:
259title = ""
260self.form.setWindowTitle(__Name__ + " " + title)
261self.form.grupoPrincipal.setTitle(tr("Creación de Piezas"))
262self.form.etNombrePieza.setText(tr("Nombre de la Pieza:"))
263self.form.botonAyuda.setToolTip(tr("Información de Uso"))
264self.form.edicionNombrePieza.setText(tr(""))
265self.form.etGrupo.setText(tr("Grupos/Directorios a crear:"))
266self.form.botonCrear.setText(tr("Crear Estructura de Pieza"))
267self.form.etVersion.setText(tr("Versión:"))
268self.form.version.setText(__Version__)
269self.form.tipoVersion.setText(__Status__)
270self.form.infoPiezasCreadas.setText("")
271self.form.etPiezasCreadas.setText(tr("Listado Piezas Creadas:"))
272self.form.numPiezasCreadas.setText(tr("Nº de Piezas Creadas:"))
273self.form.grupoOperaciones.setTitle(tr("Operaciones sobre Grupos"))
274self.form.anadirGrupo.setText(tr("Añadir Grupo"))
275self.posGroup()
276self.form.eliminarGrupo.setText(tr("Eliminar Grupo"))
277self.form.etPiezasCreadas.setEnabled(False)
278self.form.numPiezas.setEnabled(False)
279
280def mostrarHelp(self):
281tr = self.translate
282titleMH = tr("Información") + " (" + __Name__ + ")"
283stringMH = tr("Este script (macro) genera una estructura de grupos (directorios) en una pieza, de manera que sea más fácil organizar las distintas operaciones,referencias y objetos de esa pieza.")
284stringMH += cIntro + cIntro + tr("Los grupos inicialmente están predefinidos, pero pueden ser cambiados fácilmente.")
285reply = QtGui.QMessageBox.information(None,titleMH,stringMH)
286
287def posGroup(self):
288tr = self.translate
289self.form.comboPosicionGrupo.clear()
290
291if (self.longitudListaGrupos == 0):
292self.form.comboPosicionGrupo.addItem(tr("el primero"))
293self.form.eliminarGrupo.setEnabled(False)
294else:
295max = self.longitudListaGrupos
296for cont in range(max):
297if cont == 0:
298self.form.comboPosicionGrupo.addItem(tr("el primero"))
299if (cont !=0) and (cont < max):
300self.form.comboPosicionGrupo.addItem(str(cont+1))
301if (cont == max-1):
302self.form.comboPosicionGrupo.addItem(tr("el último"))
303
304def nombrePiezaCambia(self):
305if (self.form.edicionNombrePieza.text() != ''):
306self.form.botonCrear.setEnabled(True)
307else:
308self.form.botonCrear.setEnabled(False)
309
310def on_eliminarGrupo_clicked(self):
311# Delete Group
312aBorrar = self.form.comboEliminarGrupo.currentText()
313listGroups.remove(aBorrar)
314elementosBorrados.append(aBorrar)
315self.longitudListaGrupos = len(listGroups)
316self.mostrarCheckbox()
317self.refreshFichero()
318
319def on_anadirGrupo_clicked(self):
320# Add Group
321nombrePos = self.form.comboPosicionGrupo.currentText()
322if (nombrePos == "el primero"):
323posicion = 1
324elif (nombrePos == "el último"):
325posicion = self.longitudListaGrupos+1
326else:
327posicion = int(self.form.comboPosicionGrupo.currentText())
328if self.longitudListaGrupos == 0:
329listGroups.append(self.form.leAnadirGrupo.text())
330else:
331listGroups.insert(posicion-1,self.form.leAnadirGrupo.text())
332self.longitudListaGrupos = len(listGroups)
333
334self.mostrarCheckbox()
335self.refreshFichero()
336self.form.eliminarGrupo.setEnabled(True)
337
338def refreshFichero(self):
339# Refresh File (destroy and create the same file)
340groupsFile = open(gr_path, "w")
341for cont in range(self.longitudListaGrupos):
342groupsFile.write(listGroups[cont]+"\n")
343groupsFile.close()
344
345self.posGroup()
346self.mostrarCheckbox()
347self.mostrarComboGroups()
348self.form.leAnadirGrupo.setText("")
349
350def createPart(self):
351# Create one piece with groups
352self.nombrePieza = self.form.edicionNombrePieza.text()
353App.activeDocument().Tip = App.activeDocument().addObject('App::Part','Part')
354App.ActiveDocument.recompute()
355
356listaChecked = []
357if self.longitudListaGrupos < maxElem:
358longChecked = maxElem
359else:
360longChecked = self.longitudListaGrupos
361for cont in range(longChecked):
362listaChecked.append(True)
363
364for nombrePart in FreeCAD.ActiveDocument.Objects:
365if nombrePart.Name.find('Part') > -1:
366nombrePartUltimo = nombrePart.Name
367App.activeDocument().getObject(nombrePartUltimo).Label = self.nombrePieza
368
369listaChecked[0] = self.form.cb1.isChecked()
370listaChecked[1] = self.form.cb2.isChecked()
371listaChecked[2] = self.form.cb3.isChecked()
372listaChecked[3] = self.form.cb4.isChecked()
373listaChecked[4] = self.form.cb5.isChecked()
374listaChecked[5] = self.form.cb6.isChecked()
375listaChecked[6] = self.form.cb7.isChecked()
376listaChecked[7] = self.form.cb8.isChecked()
377listaChecked[8] = self.form.cb9.isChecked()
378listaChecked[9] = self.form.cb10.isChecked()
379listaChecked[10] = self.form.cb11.isChecked()
380listaChecked[11] = self.form.cb12.isChecked()
381
382App.Console.PrintMessage(listaChecked)
383contador = 0
384for labelGrupo in listGroups:
385if (listaChecked[contador] and contador<maxElem):
386App.activeDocument().Tip = App.activeDocument().addObject('App::DocumentObjectGroup','Group')
387nombreGrupo = App.activeDocument().ActiveObject.Name
388App.activeDocument().getObject(nombreGrupo).Label = labelGrupo+' ('+self.nombrePieza+')'
389App.activeDocument().getObject(nombrePartUltimo).addObject(App.activeDocument().getObject(nombreGrupo))
390contador = contador +1
391
392self.PiecesCreated()
393
394def PiecesCreated(self):
395self.form.etPiezasCreadas.setEnabled(True)
396cad = "+ " + self.nombrePieza + cIntro
397self.pieza = self.pieza + cad
398self.form.infoPiezasCreadas.setText(self.pieza)
399self.numeroPiezas += 1
400self.form.numPiezas.setText(str(self.numeroPiezas))
401self.form.botonCrear.setEnabled(False)
402self.form.edicionNombrePieza.setText("")
403
404def accept(self):
405# Ending
406if (self.form.botonCrear.isEnabled() == True):
407self.createPart()
408
409elementosBorrados = []
410gui.Control.closeDialog()
411
412# Se define el g_num_lang con variable global
413lang = gui.getLocale()
414# Default to English.
415g_num_lang = 1
416if 'Spanish' in lang:
417g_num_lang = 0
418elif 'Italian' in lang:
419g_num_lang = 2
420panel = PiecesTemplates()
421gui.Control.showDialog(panel)