FreeCAD-macros

Форк
0
/
PiecesTemplates.FCMacro 
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

21
import FreeCAD as app
22
import FreeCADGui as gui
23
from PySide import QtCore, QtGui
24
from PySide2.QtWidgets import *
25
import 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

69
listGroups = []
70
elementosBorrados = []
71
maxElem = 12
72
cIntro = '\n'
73

74
strLang = [
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

145
ui_path = app.getUserMacroDir(True) + "/PiecesTemplates/ui/PiecesTemplates.ui"
146
gr_path = app.getUserMacroDir(True) + "/PiecesTemplates/Groups.txt"
147

148
try:
149
    _fromUtf8 = QtCore.QString.fromUtf8
150
except AttributeError:
151
    def _fromUtf8(s):
152
        return s
153

154
class PiecesTemplates:
155

156
    def __init__(self):
157
        self.doc = app.activeDocument()
158
        if not self.doc:
159
            app.Console.PrintWarning(tr('El documento no está activo') + cIntro)
160
            return
161
        
162
        # Init var
163
        self.form = gui.PySideUic.loadUi(ui_path)        
164
        self.numeroPiezas = 0
165
        self.pieza = ""
166
        self.form.botonCrear.setEnabled(False)
167

168
        # Open File "Groups.txt"
169
        self.openF()
170
        
171
        # Init UI with content
172
        self.mostrarCheckbox()
173
        self.initStrings()
174

175
        # Connect
176
        self.form.botonCrear.clicked.connect(self.createPart)        
177
        self.form.edicionNombrePieza.returnPressed.connect(self.createPart)
178
        self.form.edicionNombrePieza.textChanged.connect(self.nombrePiezaCambia)
179
        self.form.botonAyuda.clicked.connect(self.mostrarHelp)        
180
        self.form.eliminarGrupo.clicked.connect(self.on_eliminarGrupo_clicked)
181
        self.form.anadirGrupo.clicked.connect(self.on_anadirGrupo_clicked)
182

183
    def openF(self):
184
        with open(gr_path, "r") as groupsFile:
185
            for linea in groupsFile.readlines():
186
                linea = re.sub("\n","",linea)
187
                if (linea != ""):
188
                    listGroups.append(linea)
189
                    self.form.comboEliminarGrupo.addItem(linea)
190
        if (len(listGroups) > maxElem):
191
            etError1 = __Name__ + "(Error)"
192
            error1 = "En el archivo de texto hay más líneas de las permitidas." + " "
193
            error1 += "El máximo es: " + str(maxElem) + cIntro + cIntro
194
            error1 += "Se aconseja cancelar y corregir el archivo de texto:" + cIntro + cIntro
195
            error1 += gr_path + cIntro + cIntro
196
            reply = QtGui.QMessageBox.warning(None,etError1,error1)
197
        self.longitudListaGrupos = len(listGroups)
198

199
    def translate(self, text):
200
        if (text not in strLang[0]) or (g_num_lang < 0) or (g_num_lang >= len(strLang)):
201
            return text
202
        primerIdioma = strLang[0]
203
        indice = primerIdioma.index(text)
204
        if (indice == -1) or (indice >= len(strLang[g_num_lang])):
205
            return text
206
        return strLang[g_num_lang][indice]
207

208
    def activarUnCheckbox(self,cad,cont):
209
        cad.setText(listGroups[cont])
210
        cad.setEnabled(True)
211
        cad.setChecked(True)
212

213
    def mostrarCheckbox(self):
214
        self.initCheckbox()
215
        max = self.longitudListaGrupos
216
        if max!=0:
217
            if max>=1: self.activarUnCheckbox(self.form.cb1,0)                
218
            if max>=2: self.activarUnCheckbox(self.form.cb2,1)
219
            if max>=3: self.activarUnCheckbox(self.form.cb3,2)
220
            if max>=4: self.activarUnCheckbox(self.form.cb4,3)
221
            if max>=5: self.activarUnCheckbox(self.form.cb5,4)
222
            if max>=6: self.activarUnCheckbox(self.form.cb6,5)
223
            if max>=7: self.activarUnCheckbox(self.form.cb7,6)
224
            if max>=8: self.activarUnCheckbox(self.form.cb8,7)
225
            if max>=9: self.activarUnCheckbox(self.form.cb9,8)
226
            if max>=10: self.activarUnCheckbox(self.form.cb10,9)
227
            if max>=11: self.activarUnCheckbox(self.form.cb11,10)
228
            if max>=12: self.activarUnCheckbox(self.form.cb12,11)
229

230
    def unCheckbox(self,cad):
231
        cad.setText(self.translate("(Vacío)"))
232
        cad.setEnabled(False)
233
        cad.setChecked(False)
234

235
    def initCheckbox(self):
236
        self.unCheckbox(self.form.cb1)
237
        self.unCheckbox(self.form.cb2)
238
        self.unCheckbox(self.form.cb3)
239
        self.unCheckbox(self.form.cb4)
240
        self.unCheckbox(self.form.cb5)
241
        self.unCheckbox(self.form.cb6)
242
        self.unCheckbox(self.form.cb7)
243
        self.unCheckbox(self.form.cb8)
244
        self.unCheckbox(self.form.cb9)
245
        self.unCheckbox(self.form.cb10)
246
        self.unCheckbox(self.form.cb11)
247
        self.unCheckbox(self.form.cb12)        
248

249
    def mostrarComboGroups(self):
250
        self.form.comboEliminarGrupo.clear()
251
        for cont in range(self.longitudListaGrupos):
252
            self.form.comboEliminarGrupo.addItem(listGroups[cont])
253

254
    def initStrings(self):
255
        tr = self.translate
256
        if g_num_lang != 1:
257
            title = "(" + strLang[g_num_lang][0] + ")"
258
        else:
259
            title = ""
260
        self.form.setWindowTitle(__Name__ + " " + title)
261
        self.form.grupoPrincipal.setTitle(tr("Creación de Piezas"))
262
        self.form.etNombrePieza.setText(tr("Nombre de la Pieza:"))
263
        self.form.botonAyuda.setToolTip(tr("Información de Uso"))
264
        self.form.edicionNombrePieza.setText(tr(""))
265
        self.form.etGrupo.setText(tr("Grupos/Directorios a crear:"))            
266
        self.form.botonCrear.setText(tr("Crear Estructura de Pieza"))
267
        self.form.etVersion.setText(tr("Versión:"))
268
        self.form.version.setText(__Version__)
269
        self.form.tipoVersion.setText(__Status__)
270
        self.form.infoPiezasCreadas.setText("")
271
        self.form.etPiezasCreadas.setText(tr("Listado Piezas Creadas:"))
272
        self.form.numPiezasCreadas.setText(tr("Nº de Piezas Creadas:"))
273
        self.form.grupoOperaciones.setTitle(tr("Operaciones sobre Grupos"))
274
        self.form.anadirGrupo.setText(tr("Añadir Grupo"))
275
        self.posGroup()
276
        self.form.eliminarGrupo.setText(tr("Eliminar Grupo"))
277
        self.form.etPiezasCreadas.setEnabled(False)
278
        self.form.numPiezas.setEnabled(False)
279

280
    def mostrarHelp(self):
281
        tr = self.translate
282
        titleMH = tr("Información") + " (" + __Name__ + ")"
283
        stringMH = 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.")
284
        stringMH += cIntro + cIntro + tr("Los grupos inicialmente están predefinidos, pero pueden ser cambiados fácilmente.")
285
        reply = QtGui.QMessageBox.information(None,titleMH,stringMH)
286

287
    def posGroup(self):
288
        tr = self.translate
289
        self.form.comboPosicionGrupo.clear()
290

291
        if (self.longitudListaGrupos == 0):
292
            self.form.comboPosicionGrupo.addItem(tr("el primero"))
293
            self.form.eliminarGrupo.setEnabled(False)
294
        else:
295
            max = self.longitudListaGrupos
296
            for cont in range(max):
297
                if cont == 0:
298
                    self.form.comboPosicionGrupo.addItem(tr("el primero"))
299
                if (cont !=0) and (cont < max):
300
                    self.form.comboPosicionGrupo.addItem(str(cont+1))
301
                if (cont == max-1):
302
                    self.form.comboPosicionGrupo.addItem(tr("el último"))                    
303

304
    def nombrePiezaCambia(self):
305
        if (self.form.edicionNombrePieza.text() != ''):
306
            self.form.botonCrear.setEnabled(True)
307
        else:
308
            self.form.botonCrear.setEnabled(False)
309

310
    def on_eliminarGrupo_clicked(self):
311
        # Delete Group
312
        aBorrar = self.form.comboEliminarGrupo.currentText()
313
        listGroups.remove(aBorrar)
314
        elementosBorrados.append(aBorrar)       
315
        self.longitudListaGrupos = len(listGroups)        
316
        self.mostrarCheckbox()
317
        self.refreshFichero()
318

319
    def on_anadirGrupo_clicked(self):
320
        # Add Group  
321
        nombrePos = self.form.comboPosicionGrupo.currentText()
322
        if (nombrePos == "el primero"):
323
            posicion = 1
324
        elif (nombrePos == "el último"):
325
            posicion = self.longitudListaGrupos+1
326
        else:
327
            posicion = int(self.form.comboPosicionGrupo.currentText())
328
        if self.longitudListaGrupos == 0:
329
            listGroups.append(self.form.leAnadirGrupo.text()) 
330
        else:
331
            listGroups.insert(posicion-1,self.form.leAnadirGrupo.text())
332
        self.longitudListaGrupos = len(listGroups)
333
        
334
        self.mostrarCheckbox()
335
        self.refreshFichero()
336
        self.form.eliminarGrupo.setEnabled(True)
337

338
    def refreshFichero(self):
339
        # Refresh File (destroy and create the same file)
340
        groupsFile = open(gr_path, "w")
341
        for cont in range(self.longitudListaGrupos):
342
            groupsFile.write(listGroups[cont]+"\n")
343
        groupsFile.close()
344

345
        self.posGroup()
346
        self.mostrarCheckbox()
347
        self.mostrarComboGroups()
348
        self.form.leAnadirGrupo.setText("")           
349

350
    def createPart(self): 
351
        # Create one piece with groups   
352
        self.nombrePieza = self.form.edicionNombrePieza.text()
353
        App.activeDocument().Tip = App.activeDocument().addObject('App::Part','Part')
354
        App.ActiveDocument.recompute()
355

356
        listaChecked = []
357
        if self.longitudListaGrupos < maxElem:
358
            longChecked = maxElem
359
        else:
360
            longChecked = self.longitudListaGrupos
361
        for cont in range(longChecked):
362
            listaChecked.append(True)
363

364
        for nombrePart in FreeCAD.ActiveDocument.Objects:
365
            if nombrePart.Name.find('Part') > -1:
366
                nombrePartUltimo = nombrePart.Name
367
        App.activeDocument().getObject(nombrePartUltimo).Label = self.nombrePieza   
368

369
        listaChecked[0] = self.form.cb1.isChecked()
370
        listaChecked[1] = self.form.cb2.isChecked()
371
        listaChecked[2] = self.form.cb3.isChecked()
372
        listaChecked[3] = self.form.cb4.isChecked()
373
        listaChecked[4] = self.form.cb5.isChecked()
374
        listaChecked[5] = self.form.cb6.isChecked()
375
        listaChecked[6] = self.form.cb7.isChecked()
376
        listaChecked[7] = self.form.cb8.isChecked()
377
        listaChecked[8] = self.form.cb9.isChecked()
378
        listaChecked[9] = self.form.cb10.isChecked()
379
        listaChecked[10] = self.form.cb11.isChecked()
380
        listaChecked[11] = self.form.cb12.isChecked()
381
    
382
        App.Console.PrintMessage(listaChecked)
383
        contador = 0
384
        for labelGrupo in listGroups:
385
            if (listaChecked[contador] and contador<maxElem):
386
                App.activeDocument().Tip = App.activeDocument().addObject('App::DocumentObjectGroup','Group')
387
                nombreGrupo = App.activeDocument().ActiveObject.Name
388
                App.activeDocument().getObject(nombreGrupo).Label = labelGrupo+' ('+self.nombrePieza+')'
389
                App.activeDocument().getObject(nombrePartUltimo).addObject(App.activeDocument().getObject(nombreGrupo))
390
            contador = contador +1
391

392
        self.PiecesCreated()
393

394
    def PiecesCreated(self):
395
        self.form.etPiezasCreadas.setEnabled(True)
396
        cad = "+ " + self.nombrePieza + cIntro
397
        self.pieza = self.pieza + cad
398
        self.form.infoPiezasCreadas.setText(self.pieza)
399
        self.numeroPiezas += 1
400
        self.form.numPiezas.setText(str(self.numeroPiezas))
401
        self.form.botonCrear.setEnabled(False)
402
        self.form.edicionNombrePieza.setText("")
403

404
    def accept(self):
405
        # Ending
406
        if (self.form.botonCrear.isEnabled() == True):
407
            self.createPart()
408

409
        elementosBorrados = []
410
        gui.Control.closeDialog()
411

412
# Se define el g_num_lang con variable global
413
lang = gui.getLocale()
414
# Default to English.
415
g_num_lang = 1
416
if 'Spanish' in lang:
417
    g_num_lang = 0
418
elif 'Italian' in lang:
419
    g_num_lang = 2
420
panel = PiecesTemplates()
421
gui.Control.showDialog(panel)

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.