CreateAliasForTable : Une macro pour créer facilement les alias dans un tableau à deux dimensions
This commit is contained in:
143
createAliasForTable.FCMacro
Normal file
143
createAliasForTable.FCMacro
Normal file
@@ -0,0 +1,143 @@
|
||||
__Name__ = "Create alias for table"
|
||||
__Comment__ =""
|
||||
__Author__ = "2cv001"
|
||||
__Title__ = "Macro Create Alias For Table"
|
||||
__Date__ = "2024/01/31" #YYYY/MM/DD 20:13 Béta
|
||||
__Version__ = __Date__
|
||||
# https://forum.freecad.org/viewtopic.php?p=734928#p734928
|
||||
|
||||
|
||||
|
||||
import FreeCAD, FreeCADGui
|
||||
from PySide import QtGui
|
||||
import re
|
||||
|
||||
addNumberIfOther=True
|
||||
|
||||
def get_column(cell):
|
||||
column = ''.join([c for c in cell if not c.isdigit()])
|
||||
return column
|
||||
|
||||
def get_row(cell):
|
||||
row = ''.join([c for c in cell if c.isdigit()])
|
||||
if row=='' :
|
||||
row='1'
|
||||
return int(row)
|
||||
|
||||
|
||||
|
||||
|
||||
#################################################################################
|
||||
# part code for alias
|
||||
#################################################################################
|
||||
# parameters for alias creation
|
||||
separateur = " " # typically put " " so blanks will be replaced by nouveauCaract
|
||||
nouveauCaract = '' #Put for example "_" to have the separators replaced by "_". Put "" to have no separator
|
||||
majuscule = True #set to True if you want "Diametre du cercle" to be "DiametreDuCercle"
|
||||
changeTexteCellule = False # the text will only be changed if changeCellText is True.
|
||||
# This does not change anything for the allias itself
|
||||
premierCaractereEnMinuscule = False # Force the first character to be in lower case
|
||||
|
||||
# list of characters to be replaced by an equivalent. for example an @ will be replaced by 'a'
|
||||
# if you add characters, please send me a private message. Il will eventually add it in my code.
|
||||
caracEquivalents = [ ['é','e'],['è','e'],['ê','e'],['à','a'],['@','a'],['&','e'],['ç','c'],
|
||||
['²','2'],["'",''],['?',''],['"',''],['(',''],[')',''],['#',''],['.',''],
|
||||
[',',''],[';',''],['$',''],['+',''],['-',''],['*',''],['/',''],['\\',''] ,
|
||||
['[',''],[']',''],
|
||||
]
|
||||
|
||||
|
||||
|
||||
def traitementChaineSource(chaineSource, separateur, nouveauCaract, majuscule):
|
||||
# If separator is ' ' and nouveauCaract is '_', and majuscule is True
|
||||
# transforms "Diametre du cylindre" into "Diametre_Du_Cylindre
|
||||
|
||||
def remplaceCararcDansMot(mot):
|
||||
|
||||
def remplaceCartatParEquivalent(caractere):
|
||||
# replaces a character with its equivalent if it exists
|
||||
caracResult = caractere
|
||||
for couple in caracEquivalents:
|
||||
if (couple[0] == caractere):
|
||||
caracResult = couple[1]
|
||||
break
|
||||
return caracResult
|
||||
|
||||
#replaces all characters of the word with its equivalent if it exists
|
||||
motResult = mot
|
||||
for caract in mot:
|
||||
a = remplaceCartatParEquivalent(caract)
|
||||
motResult = motResult.replace(caract, a)
|
||||
return motResult
|
||||
|
||||
|
||||
chaineResult = ''
|
||||
first = True
|
||||
carctDeSeparation = ''
|
||||
for mots in chaineSource.split(separateur):
|
||||
mots = remplaceCararcDansMot(mots)
|
||||
if (not (first)):
|
||||
carctDeSeparation = nouveauCaract
|
||||
if (majuscule):
|
||||
chaineResult = chaineResult + nouveauCaract + mots[:1].upper() + mots[1:]
|
||||
# We use "[:1]" instead of "[0]",
|
||||
# for no crash in case of an empty string (which happens if the cell is empty)
|
||||
else:
|
||||
chaineResult = chaineResult + nouveauCaract + mots
|
||||
first=False
|
||||
if premierCaractereEnMinuscule :
|
||||
chaineResult = chaineResult[:1].lower() + chaineResult[1:]
|
||||
return chaineResult
|
||||
|
||||
|
||||
def create_alias_for_table_cells_Selected():
|
||||
mySpreadsheet = Gui.ActiveDocument.ActiveView.getSheet()
|
||||
aw = Gui.getMainWindow().centralWidget().activeSubWindow() # Store the active window
|
||||
# To get list of all selected cells
|
||||
sel_items = aw.widget().findChild(QtGui.QTableView).selectedIndexes()
|
||||
|
||||
getCellName = lambda r,c:'{}{}{}'.format(chr(c//26 + 64) if c//26 > 0 else '', chr(c%26 + 65), r + 1)
|
||||
|
||||
|
||||
|
||||
for item in sel_items: # The selected cells are scanned
|
||||
|
||||
if (sel_items[0].column()!=item.column() and sel_items[0].row()!=item.row()) :
|
||||
cellName=getCellName(item.row(), item.column())
|
||||
firstcellName=getCellName(sel_items[0].row(), sel_items[0].column())
|
||||
cellTextLine=get_column(firstcellName)+str(get_row(cellName))
|
||||
cellTextColumn=get_column(cellName)+ str(get_row(firstcellName))
|
||||
try :
|
||||
textLine = mySpreadsheet.get(cellTextLine)
|
||||
textColumn = mySpreadsheet.get(cellTextColumn)
|
||||
|
||||
except :
|
||||
#print('Des cellules en première colonne ou en première ligne ne sont pas conformes')
|
||||
continue
|
||||
textAlias = str(textLine) + '_' + str(textColumn)
|
||||
textAlias=traitementChaineSource(textAlias, separateur, nouveauCaract, majuscule)
|
||||
if addNumberIfOther :
|
||||
startIndexForTextAlias=1
|
||||
for i in range(startIndexForTextAlias, 201):
|
||||
try:
|
||||
if i == 1:
|
||||
mySpreadsheet.setAlias(cellName, textAlias)
|
||||
else:
|
||||
mySpreadsheet.setAlias(cellName, textAlias + '_' + str(i-1))
|
||||
startIndexForTextAlias=i+1
|
||||
break # Arrête la boucle si aucune exception n'est levée
|
||||
except:
|
||||
continue # Passe à l'itération suivante si une exception est levée
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
create_alias_for_table_cells_Selected()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user