LeenO computo metrico con LibreOffice  3.19.1
Il software libero per la gestione di computi metrici e contabilità lavori.
pyleeno.py
Vai alla documentazione di questo file.
1 #!/usr/bin/env python
2 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
3 
13 
14 #~ MsgBox('''Per segnalare questo problema,
15 #~ contatta il canale Telegram
16 #~ https://t.me/leeno_computometrico''', 'ERRORE!')
17 
18 #~ documentazione ufficiale: https://api.libreoffice.org/
19 import locale
20 import codecs
21 import configparser
22 import collections
23 import subprocess
24 #~ import psutil
25 import os, unohelper, pyuno, logging, shutil, base64, sys, uno
26 import time
27 import copy
28 from multiprocessing import Process, freeze_support
29 import threading
30 # cos'e' il namespace:
31 # http://www.html.it/articoli/il-misterioso-mondo-dei-namespaces-1/
32 from datetime import datetime, date
33 #~ from com.sun.star.lang import Locale
34 from com.sun.star.beans import PropertyValue
35 from xml.etree.ElementTree import ElementTree, Element, SubElement, Comment, tostring
36 #~ from com.sun.star.table.CellContentType import TEXT, EMPTY, VALUE, FORMULA
37 from com.sun.star.sheet.CellFlags import (VALUE, DATETIME, STRING,
38  ANNOTATION, FORMULA, HARDATTR,
39  OBJECTS, EDITATTR, FORMATTED)
40 
41 from com.sun.star.beans.PropertyAttribute import (MAYBEVOID, REMOVEABLE, MAYBEDEFAULT)
42 
44 import random
45 from com.sun.star.script.provider import XScriptProviderFactory
46 
47 from com.sun.star.script.provider import XScriptProvider
48 def barra_di_stato(testo='', valore=0):
49  '''Informa l'utente sullo stato progressivo dell'eleborazione.'''
50  oDoc = XSCRIPTCONTEXT.getDocument()
51  oProgressBar = oDoc.CurrentController.Frame.createStatusIndicator()
52  oProgressBar.start('', 100)
53  oProgressBar.Value = valore
54  oProgressBar.Text = testo
55  oProgressBar.reset()
56  oProgressBar.end
57 
58 def basic_LeenO(funcname, *args):
59  '''Richiama funzioni definite in Basic'''
60  xCompCont = XSCRIPTCONTEXT.getComponentContext()
61  sm = xCompCont.ServiceManager
62  mspf = sm.createInstance("com.sun.star.script.provider.MasterScriptProviderFactory")
63  scriptPro = mspf.createScriptProvider("")
64  Xscript = scriptPro.getScript("vnd.sun.star.script:UltimusFree2." + funcname + "?language=Basic&location=application")
65  Result = Xscript.invoke(args, None, None)
66  return Result[0]
67 
68 def LeenO_path(arg=None):
69  '''Restituisce il percorso di installazione di LeenO.oxt'''
70  ctx = XSCRIPTCONTEXT.getComponentContext()
71  pir = ctx.getValueByName('/singletons/com.sun.star.deployment.PackageInformationProvider')
72  expath = pir.getPackageLocation('org.giuseppe-vizziello.leeno')
73  return expath
74 
75 class New_file:
76  def __init__(self):#, computo):
77  pass
78  def computo(arg=1):
79  '''arg { integer } : 1 mostra il dialogo di salvataggio file'''
80  desktop = XSCRIPTCONTEXT.getDesktop()
81  opz = PropertyValue()
82  opz.Name = 'AsTemplate'
83  opz.Value = True
84  document = desktop.loadComponentFromURL(LeenO_path()+'/template/leeno/Computo_LeenO.ots', "_blank", 0, (opz,))
85  autoexec()
86  if arg == 1:
87  MsgBox('''Prima di procedere è consigliabile salvare il lavoro.
88 Provvedi subito a dare un nome al file di computo...''', 'Dai un nome al file...')
89  salva_come()
90  DlgMain()
91  return document
92  def usobollo():
93  desktop = XSCRIPTCONTEXT.getDesktop()
94  opz = PropertyValue()
95  opz.Name = 'AsTemplate'
96  opz.Value = True
97  document = desktop.loadComponentFromURL(LeenO_path()+'/template/offmisc/UsoBollo.ott', "_blank", 0, (opz,))
98  return document
99 
100 def nuovo_computo(arg=None):
101  New_file.computo()
102  '''Crea un nuovo computo vuoto.'''
103 
104 def nuovo_usobollo(arg=None):
105  '''Crea un nuovo documento in formato uso bollo.'''
106  New_file.usobollo()
107 
108 def invia_voce(arg=None):
109  '''
110  Invia la voce di prezzo del COMPUTO oppure le voci di Elenco Prezzi
111  con relative analisi al DCC.
112  '''
113  oDoc = XSCRIPTCONTEXT.getDocument()
114  oSheet = oDoc.CurrentController.ActiveSheet
115  fpartenza = uno.fileUrlToSystemPath(oDoc.getURL())
116  if fpartenza == sUltimus:
117  MsgBox("Questo file coincide con il Documento di Contabilità Corrente.", "Attenzione!")
118  return
119  elif sUltimus == '':
120  MsgBox("E' necessario impostare il Documento di Contabilità Corrente.", "Attenzione!")
121  return
122  lrow = Range2Cell()[1]
123 
124  if oSheet.Name in('COMPUTO', 'VARIANTE'):
125  sStRange = Circoscrive_Voce_Computo_Att(lrow)
126  sopra = sStRange.RangeAddress.StartRow
127  sotto = sStRange.RangeAddress.EndRow
128  cerca_in_elenco(lrow)
129  invia_voce_ep()
130  _gotoDoc(fpartenza)
131  _gotoSheet(oSheet.Name)
132 
133  else:
134  invia_voce_ep()
135  _gotoDoc(sUltimus)
136  oDoc = XSCRIPTCONTEXT.getDocument()
137  oSheet = oDoc.CurrentController.ActiveSheet
138  lrow = Range2Cell()[1]
139  if oSheet.Name in('COMPUTO', 'VARIANTE'):
140  try:
141  sStRange = Circoscrive_Voce_Computo_Att(lrow)
142  except:
144  _gotoDoc(sUltimus)
145  _gotoSheet(oSheet.Name)
146  lrow = Range2Cell()[1]
147  try:
148  sStRange = Circoscrive_Voce_Computo_Att(lrow)
149  except UnboundLocalError:
150  fine = ultima_voce(oSheet)+1
151  if lrow >= fine:
152  _gotoCella(2, fine -2)
153  lrow = Range2Cell()[1]
154  sStRange = Circoscrive_Voce_Computo_Att(lrow)
155  sopra = sStRange.RangeAddress.StartRow
156  sotto = sStRange.RangeAddress.EndRow
157  if oSheet.getCellByPosition(1, sopra+1).String in ('Cod. Art.?', ''):
158  oSheet.getCellByPosition(1, sopra+1).String = cod
159  else:
161  _gotoSheet(oSheet.Name)
162  lrow = Range2Cell()[1]
163  sStRange = Circoscrive_Voce_Computo_Att(lrow)
164  sopra = sStRange.RangeAddress.StartRow
165  oSheet.getCellByPosition(1, sopra+1).String = cod
166 
167 def invia_voce_ep(arg=None):
168  '''
169  Invia le voci di prezzario selezionate da un elenco prezzi all'Elenco
170  Prezzi del Documento di Contabilità Corrente DCC. Trasferisce anche
171  le Analisi di Prezzo con i relativi costi elementari.
172  '''
173  oDoc = XSCRIPTCONTEXT.getDocument()
174  oSheet = oDoc.CurrentController.ActiveSheet
175  lrow = Range2Cell()[1]
176  global cod
177  if oSheet.Name == 'Elenco Prezzi':
178  cod = oSheet.getCellByPosition(0, lrow).String
179  elif oSheet.Name in ('COMPUTO', 'VARIANTE'):
180  sopra = Circoscrive_Voce_Computo_Att(lrow).RangeAddress.StartRow
181  cod = oSheet.getCellByPosition(1, sopra+1).String
182  try:
183  oRangeAddress = oDoc.getCurrentSelection().getRangeAddresses()
184  except AttributeError:
185  oRangeAddress = oDoc.getCurrentSelection().getRangeAddress()
186  try:
187  SR = oRangeAddress.StartRow
188  except AttributeError:
189  return
190  ER = oRangeAddress.EndRow
191  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(0, SR, getLastUsedCell(oSheet).EndColumn, ER))
192  lista = list()
193  for el in range(SR, ER+1):
194  if oSheet.getCellByPosition(1, el).Type.value == 'FORMULA':
195  lista.append(oSheet.getCellByPosition(0, el).String)
196  try:
197  fpartenza = uno.fileUrlToSystemPath(oDoc.getURL())
198  except:
199  MsgBox("E' necessario prima salvare il file di partenza.", "Attenzione!")
200  salva_come()
201  fpartenza = uno.fileUrlToSystemPath(oDoc.getURL())
202  copy_clip()
203  if sUltimus == '':
204  MsgBox("E' necessario impostare il Documento di Contabilità Corrente.", "Attenzione!")
205  return
206  _gotoDoc(sUltimus)
207  ddcDoc = XSCRIPTCONTEXT.getDocument()
208  nSheet = ddcDoc.CurrentController.ActiveSheet.Name
209  dccSheet = ddcDoc.getSheets().getByName('Elenco Prezzi')
210  dccSheet.IsVisible = True
211  ddcDoc.CurrentController.setActiveSheet(dccSheet)
212 
213  dccSheet.getRows().insertByIndex(3, ER-SR+1)
214 
215  ddcDoc.CurrentController.select(dccSheet.getCellByPosition(0, 3))
216  paste_clip()
217  for el in reversed (range (3, 3+ER-SR+1)):
218  if dccSheet.getCellByPosition(1, el).String == '0,00':
219  dccSheet.getRows().removeByIndex(el, 1)
220 
221  # ~doppioni()
222  _gotoDoc(fpartenza)
223  oDoc = XSCRIPTCONTEXT.getDocument()
224  costi = list()
225 
226  if len(lista) > 0:
227  if oDoc.getSheets().hasByName('tmp_DCC') == False:
228  sheet = oDoc.createInstance("com.sun.star.sheet.Spreadsheet")
229  tmp = oDoc.Sheets.insertByName('tmp_DCC', sheet)
230  tmp = oDoc.getSheets().getByName('tmp_DCC')
231  oSheet = oDoc.getSheets().getByName('Analisi di Prezzo')
232  oDoc.CurrentController.setActiveSheet(oSheet)
233  for el in lista:
234  celle = Circoscrive_Analisi(uFindStringCol(el, 0, oSheet))
235  #~ voce = oSheet.getCellByPosition(0, celle.RangeAddress.StartRow+1).String
236  oRangeAddress = celle.getRangeAddress()
237  oCellAddress = tmp.getCellByPosition(0, getLastUsedCell(tmp).EndRow).getCellAddress()
238 
239  tmp.copyRange(oCellAddress, oRangeAddress)
240  nuove_righe = getLastUsedCell(tmp).EndRow+1
241  analisi = tmp.getCellRangeByPosition(0, 0, getLastUsedCell(tmp).EndColumn, getLastUsedCell(tmp).EndRow)
242  for el in range(0, getLastUsedCell(tmp).EndRow):
243  if tmp.getCellByPosition(0, el).CellStyle == 'An-lavoraz-Cod-sx' and tmp.getCellByPosition(0, el).Type.value == 'TEXT':
244  costi.append(tmp.getCellByPosition(0, el).String)
245  oDoc.CurrentController.select(analisi)
246  copy_clip()
247 
248  _gotoDoc(sUltimus)
249  ddcDoc = XSCRIPTCONTEXT.getDocument()
250  if ddcDoc.getSheets().hasByName('Analisi di Prezzo') == False:
252  _gotoSheet('Analisi di Prezzo')
253  dccSheet = ddcDoc.getSheets().getByName('Analisi di Prezzo')
254  lrow = getLastUsedCell(dccSheet).EndRow
255 
256  dccSheet.getRows().insertByIndex(lrow, nuove_righe)
257  ddcDoc.CurrentController.select(dccSheet.getCellByPosition(0, lrow))
258  paste_clip()
260  # ~doppioni()
261  ddcDoc.CurrentController.setActiveSheet(ddcDoc.getSheets().getByName('Elenco Prezzi'))
262 
263  _gotoDoc(fpartenza)
264  oDoc.Sheets.removeByName('tmp_DCC')
265  costi = set(costi)
266  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
267  _gotoSheet('Elenco Prezzi')
268  lrow = Range2Cell()[1]
269  el_y = list()
270  for el in costi:
271  el_y.append(uFindStringCol(el, 0, oSheet))
272  selezione = list()
273  for y in el_y:
274  ranges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
275  rangen = oSheet.getCellRangeByPosition(0, y, 26, y).RangeAddress
276  selezione.append(rangen)
277  ranges.addRangeAddresses(selezione, True)
278  oDoc.CurrentController.select(ranges)
279  copy_clip()
280  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
281  _gotoCella(0, lrow)
282  cod = oSheet.getCellByPosition(0, lrow).String
283  _gotoDoc(sUltimus)
284  oDoc.CurrentController.setActiveSheet(oDoc.getSheets().getByName('Elenco Prezzi'))
285  dccSheet = ddcDoc.getSheets().getByName('Elenco Prezzi')
286  dccSheet.IsVisible = True
287  ddcDoc.CurrentController.setActiveSheet(dccSheet)
288  try:
289  dccSheet.getRows().insertByIndex(3, len(costi))
290  _gotoCella(0,3)
291  paste_clip()
292  except:
293  pass
294 
295  formule = list()
296  for n in range(3, ER-SR+1+3):
297  formule.append(['=IF(ISERROR(N'+str(n+1)+'/$N$2);"--";N'+str(n+1)+'/$N$2)',
298  '=SUMIF(AA;A'+str(n+1)+';BB)',
299  '=SUMIF(AA;A'+str(n+1)+';cEuro)'])
300  oRange = dccSheet.getCellRangeByPosition(11, 3, 13, ER-SR+3)
301  formule = tuple(formule)
302  oRange.setFormulaArray(formule)
303 
304  ddcDoc.CurrentController.setActiveSheet(ddcDoc.getSheets().getByName(nSheet))
305 
306  if conf.read(path_conf, 'Generale', 'torna_a_ep') == '1':
307  _gotoDoc(fpartenza)
308  return
309 
310 def _gotoDoc(sUrl):
311  '''
312  sUrl { string } : nome del file
313  porta il focus su di un determinato documento
314  '''
315  sUrl = uno.systemPathToFileUrl(sUrl)
316  if sys.platform == 'linux' or sys.platform == 'darwin':
317  oDialogo_attesa = dlg_attesa()
318  attesa().start() #mostra il dialogo
319  target = XSCRIPTCONTEXT.getDesktop().loadComponentFromURL(sUrl, "_default", 0, list())
320  target.getCurrentController().Frame.ContainerWindow.toFront()
321  target.getCurrentController().Frame.activate()
322  oDialogo_attesa.endExecute()
323  elif sys.platform == 'win32':
324  desktop = XSCRIPTCONTEXT.getDesktop()
325  oFocus = uno.createUnoStruct('com.sun.star.awt.FocusEvent')
326  target = desktop.loadComponentFromURL(sUrl, "_default", 0, list())
327  target.getCurrentController().getFrame().focusGained(oFocus)
328 
329 def oggi():
330  '''
331  restituisce la data di oggi
332  '''
333  return('/'.join(reversed(str(datetime.now()).split(' ')[0].split('-'))))
334 import distutils.dir_util
335 
337  '''
338  fa una copia della directory del codice nel repository locale ed apre una shell per la commit
339  '''
340  oDoc = XSCRIPTCONTEXT.getDocument()
341  try:
342  if oDoc.getSheets().getByName('S1').getCellByPosition(7,338).String == '':
343  src_oxt ='_LeenO'
344  else:
345  src_oxt = oDoc.getSheets().getByName('S1').getCellByPosition(7,338).String
346  except:
347  pass
348  make_pack(bar=1)
349  oxt_path = uno.fileUrlToSystemPath(LeenO_path())
350  if sys.platform == 'linux' or sys.platform == 'darwin':
351  dest = '/media/giuserpe/PRIVATO/_dwg/ULTIMUSFREE/_SRC/leeno/src/Ultimus.oxt'
352  if processo('wish') == False:
353  os.system('cd /media/giuserpe/PRIVATO/_dwg/ULTIMUSFREE/_SRC/leeno/src/Ultimus.oxt && gnome-terminal && gitk &')
354  elif sys.platform == 'win32':
355  if not os.path.exists('w:/_dwg/ULTIMUSFREE/_SRC/leeno/src/'):
356  try:
357  os.makedirs(os.getenv("HOMEPATH") +'\\'+ src_oxt +'\\leeno\\src\\Ultimus.oxt\\')
358  except FileExistsError:
359  pass
360  dest = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") +'\\'+ src_oxt +'\\leeno\\src\\Ultimus.oxt\\'
361  else:
362  dest = 'w:/_dwg/ULTIMUSFREE/_SRC/leeno/src/Ultimus.oxt'
363  os.system('w: && cd w:/_dwg/ULTIMUSFREE/_SRC/leeno/src/Ultimus.oxt && "C:/Program Files/Git/git-bash.exe"')
364  distutils.dir_util.copy_tree(oxt_path, dest)
365  return
366 
367 def avvia_IDE(arg=None):
368  '''Avvia la modifica di pyleeno.py con geany'''
369  basic_LeenO('file_gest.avvia_IDE')
370  oDoc = XSCRIPTCONTEXT.getDocument()
371  oLayout = oDoc.CurrentController.getFrame().LayoutManager
372  oLayout.showElement("private:resource/toolbar/addon_ULTIMUS_3.OfficeToolBar_DEV")
373  if sys.platform == 'linux' or sys.platform == 'darwin':
374  subprocess.Popen('nemo ' + LeenO_path(), shell=True, stdout=subprocess.PIPE)
375  subprocess.Popen('geany ' + LeenO_path() + '/pyLeenO/pyleeno.py', shell=True, stdout=subprocess.PIPE)
376  elif sys.platform == 'win32':
377  os.system ('explorer.exe ' + LeenO_path())
378  os.system ('"C:/Program Files (x86)/Geany/bin/geany.exe" ' + uno.fileUrlToSystemPath(LeenO_path()) + '/pyLeenO/pyleeno.py')
379  return
380 
381 def Inser_SottoCapitolo(arg=None):
382  Ins_Categorie(2)
383 
384 def Inser_SottoCapitolo_arg(lrow, sTesto): #
385  '''
386  lrow { double } : id della riga di inerimento
387  sTesto { string } : titolo della sottocategoria
388  '''
389  oDoc = XSCRIPTCONTEXT.getDocument()
390  oSheet = oDoc.CurrentController.ActiveSheet
391  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
392  return
393 
394  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default': lrow -= 2#se oltre la riga rossa
395  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi': lrow -= 1#se riga rossa
396  insRows(lrow, 1)
397  oSheet.getCellByPosition(2, lrow).String = sTesto
398 # inserisco i valori e le formule
399  oSheet.getCellRangeByPosition(0, lrow, 41, lrow).CellStyle = 'livello2 valuta'
400  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'livello2_'
401  oSheet.getCellRangeByPosition(18, lrow, 18, lrow).CellStyle = 'livello2 scritta mini'
402  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'livello2 valuta mini %'
403  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'livello2 valuta mini %'
404  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'livello2 valuta mini'
405  oSheet.getCellRangeByPosition(31, lrow, 33, lrow).CellStyle = 'livello2_'
406  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
407  #~ oSheet.getCellByPosition(1, lrow).Formula = '=AF' + str(lrow+1) + '''&"."&''' + 'AG' + str(lrow+1)
408  # rinumero e ricalcolo
409  ocellBaseA = oSheet.getCellByPosition(1, lrow)
410  ocellBaseR = oSheet.getCellByPosition(31, lrow)
411 
412  lrowProvv = lrow-1
413  while oSheet.getCellByPosition(32, lrowProvv).CellStyle != 'livello2 valuta':
414  if lrowProvv > 4:
415  lrowProvv -=1
416  else:
417  break
418  oSheet.getCellByPosition(32, lrow).Value = oSheet.getCellByPosition(1 , lrowProvv).Value + 1
419  lrowProvv = lrow-1
420  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-1-scritta':
421  if lrowProvv > 4:
422  lrowProvv -=1
423  else:
424  break
425  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1 , lrowProvv).Value
426  #~ SubSum_Cap(lrow)
427 
428 
430  '''
431  n { int } : livello della categoria
432  0 = SuperCategoria
433  1 = Categoria
434  2 = SubCategoria
435  '''
436  #~ datarif = datetime.now()
437 
438  oDoc = XSCRIPTCONTEXT.getDocument()
439  oSheet = oDoc.CurrentController.ActiveSheet
440  row = Range2Cell()[1]
441  if oSheet.getCellByPosition(0, row).CellStyle in stili_computo:
442  lrow = next_voice(row, 1)
443  elif oSheet.getCellByPosition(0, row).CellStyle in noVoce:
444  lrow = row+1
445  else:
446  return
447  sTesto = ''
448  if n==0:
449  sTesto = 'Inserisci il titolo per la Supercategoria'
450  elif n==1:
451  sTesto = 'Inserisci il titolo per la Categoria'
452  elif n==2:
453  sTesto = 'Inserisci il titolo per la Sottocategoria'
454  sString = InputBox('', sTesto)
455  if sString == None or sString == '':
456  return
457  oDoc.CurrentController.ZoomValue = 400
458  if n==0:
459  Inser_SuperCapitolo_arg(lrow, sString)
460  elif n==1:
461  Inser_Capitolo_arg(lrow, sString)
462  elif n==2:
463  Inser_SottoCapitolo_arg(lrow, sString)
464 
465  _gotoCella(2, lrow)
467  oDoc.CurrentController.ZoomValue = 100
468  oDoc.CurrentController.setFirstVisibleColumn(0)
469  oDoc.CurrentController.setFirstVisibleRow(lrow-5)
470  #~ MsgBox('eseguita in ' + str((datetime.now() - datarif).total_seconds()) + ' secondi!','')
471 
472 
473 def Inser_SuperCapitolo(arg=None):
474  Ins_Categorie(0)
475 
476 def Inser_SuperCapitolo_arg(lrow, sTesto='Super Categoria'): #
477  '''
478  lrow { double } : id della riga di inerimento
479  sTesto { string } : titolo della categoria
480  '''
481  oDoc = XSCRIPTCONTEXT.getDocument()
482  oSheet = oDoc.CurrentController.ActiveSheet
483  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
484  return
485  #~ lrow = Range2Cell()[1]
486  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default': lrow -= 2#se oltre la riga rossa
487  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi': lrow -= 1#se riga rossa
488  insRows(lrow, 1)
489  oSheet.getCellByPosition(2, lrow).String = sTesto
490  # inserisco i valori e le formule
491  oSheet.getCellRangeByPosition(0, lrow, 41, lrow).CellStyle = 'Livello-0-scritta'
492  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'Livello-0-scritta mini'
493  oSheet.getCellRangeByPosition(18, lrow, 18, lrow).CellStyle = 'Livello-0-scritta mini val'
494  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'Livello-0-scritta mini %'
495  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'Livello-0-scritta mini %'
496  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'Livello-0-scritta mini val'
497  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
498  # rinumero e ricalcolo
499  ocellBaseA = oSheet.getCellByPosition(1, lrow)
500  ocellBaseR = oSheet.getCellByPosition(31, lrow)
501  lrowProvv = lrow-1
502  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-0-scritta':
503  if lrowProvv > 4:
504  lrowProvv -=1
505  else:
506  break
507  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1 , lrowProvv).Value + 1
508 
509 def Inser_Capitolo(arg=None):
510  Ins_Categorie(1)
511 
512 def Inser_Capitolo_arg(lrow, sTesto='Categoria'): #
513  '''
514  lrow { double } : id della riga di inerimento
515  sTesto { string } : titolo della categoria
516  '''
517  oDoc = XSCRIPTCONTEXT.getDocument()
518  oSheet = oDoc.CurrentController.ActiveSheet
519  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
520  return
521  #~ lrow = Range2Cell()[1]
522  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default': lrow -= 2#se oltre la riga rossa
523  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi': lrow -= 1#se riga rossa
524  insRows(lrow, 1)
525  oSheet.getCellByPosition(2, lrow).String = sTesto
526  # inserisco i valori e le formule
527  oSheet.getCellRangeByPosition(0, lrow, 41, lrow).CellStyle = 'Livello-1-scritta'
528  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'Livello-1-scritta mini'
529  oSheet.getCellRangeByPosition(18, lrow, 18, lrow).CellStyle = 'Livello-1-scritta mini val'
530  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'Livello-1-scritta mini %'
531  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'Livello-1-scritta mini %'
532  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'Livello-1-scritta mini val'
533  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
534  # rinumero e ricalcolo
535  ocellBaseA = oSheet.getCellByPosition(1, lrow)
536  ocellBaseR = oSheet.getCellByPosition(31, lrow)
537  lrowProvv = lrow-1
538  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-1-scritta':
539  if lrowProvv > 4:
540  lrowProvv -=1
541  else:
542  break
543  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1 , lrowProvv).Value + 1
544 
546  Sincronizza_SottoCap_Tag_Capitolo_Cor()# sistemo gli idcat voce per voce
547  Tutti_Subtotali()# ricalcola i totali di categorie e subcategorie
548 
549 def Tutti_Subtotali(arg=None):
550  '''ricalcola i subtotali di categorie e subcategorie'''
551  oDoc = XSCRIPTCONTEXT.getDocument()
552  oSheet = oDoc.CurrentController.ActiveSheet
553  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
554  return
555  for n in range(0, ultima_voce(oSheet)+1):
556  if oSheet.getCellByPosition(0, n).CellStyle == 'Livello-0-scritta':
557  SubSum_SuperCap(n)
558  if oSheet.getCellByPosition(0, n).CellStyle == 'Livello-1-scritta':
559  SubSum_Cap(n)
560  if oSheet.getCellByPosition(0, n).CellStyle == 'livello2 valuta':
561  SubSum_SottoCap(n)
562 # TOTALI GENERALI
563  lrow = ultima_voce(oSheet)+1
564  for x in (1, lrow):
565  oSheet.getCellByPosition(17, x).Formula = '=SUBTOTAL(9;R4:R' + str(lrow+1) + ')'
566  oSheet.getCellByPosition(18, x).Formula = '=SUBTOTAL(9;S4:S' + str(lrow+1) + ')'
567  oSheet.getCellByPosition(30, x).Formula = '=SUBTOTAL(9;AE4:AE' + str(lrow+1) + ')'
568  oSheet.getCellByPosition(36, x).Formula = '=SUBTOTAL(9;AK4:AK' + str(lrow+1) + ')'
569 
570 def SubSum_SuperCap(lrow):
571  '''
572  lrow { double } : id della riga di inerimento
573  inserisce i dati nella riga di SuperCategoria
574  '''
575  oDoc = XSCRIPTCONTEXT.getDocument()
576  oSheet = oDoc.CurrentController.ActiveSheet
577  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
578  return
579  #~ lrow = Range2Cell()[1]
580  lrowE = ultima_voce(oSheet)+2
581  nextCap = lrowE
582  for n in range(lrow+1, lrowE):
583  if oSheet.getCellByPosition(18, n).CellStyle in('Livello-0-scritta mini val', 'Comp TOTALI'):
584  #~ MsgBox(oSheet.getCellByPosition(18, n).CellStyle,'')
585  nextCap = n + 1
586  break
587  #~ oDoc.enableAutomaticCalculation(False)
588  oSheet.getCellByPosition(18, lrow).Formula = '=SUBTOTAL(9;S' + str(lrow + 1) + ':S' + str(nextCap) + ')'
589  oSheet.getCellByPosition(18, lrow).CellStyle = 'Livello-0-scritta mini val'
590  oSheet.getCellByPosition(24, lrow).Formula = '=S' + str(lrow + 1) + '/S' + str(lrowE)
591  oSheet.getCellByPosition(24, lrow).CellStyle = 'Livello-0-scritta mini %'
592  oSheet.getCellByPosition(28, lrow).Formula = '=SUBTOTAL(9;AC' + str(lrow + 1) + ':AC' + str(nextCap) + ')'
593  oSheet.getCellByPosition(29, lrow).Formula = '=AE' + str(lrow + 1) + '/S' + str(lrow + 1)
594  oSheet.getCellByPosition(29, lrow).CellStyle = 'Livello-0-scritta mini %'
595  oSheet.getCellByPosition(30, lrow).Formula = '=SUBTOTAL(9;AE' + str(lrow + 1) + ':AE' + str(nextCap) + ')'
596  oSheet.getCellByPosition(30, lrow).CellStyle = 'Livello-0-scritta mini val'
597  #~ oDoc.enableAutomaticCalculation(True)
598 
599 def SubSum_SottoCap(lrow):
600  '''
601  lrow { double } : id della riga di inerimento
602  inserisce i dati nella riga di subcategoria
603  '''
604  oDoc = XSCRIPTCONTEXT.getDocument()
605  oSheet = oDoc.CurrentController.ActiveSheet
606  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
607  return
608  #lrow = 0#Range2Cell()[1]
609  lrowE = ultima_voce(oSheet)+2
610  nextCap = lrowE
611  for n in range(lrow+1, lrowE):
612  if oSheet.getCellByPosition(18, n).CellStyle in('livello2 scritta mini', 'Livello-0-scritta mini val', 'Livello-1-scritta mini val', 'Comp TOTALI'):
613  nextCap = n + 1
614  break
615  oSheet.getCellByPosition(18, lrow).Formula = '=SUBTOTAL(9;S' + str(lrow + 1) + ':S' + str(nextCap) + ')'
616  oSheet.getCellByPosition(18, lrow).CellStyle = 'livello2 scritta mini'
617  oSheet.getCellByPosition(24, lrow).Formula = '=S' + str(lrow + 1) + '/S' + str(lrowE)
618  oSheet.getCellByPosition(24, lrow).CellStyle = 'livello2 valuta mini %'
619  oSheet.getCellByPosition(28, lrow).Formula = '=SUBTOTAL(9;AC' + str(lrow + 1) + ':AC' + str(nextCap) + ')'
620  oSheet.getCellByPosition(28, lrow).CellStyle = 'livello2 scritta mini'
621  oSheet.getCellByPosition(29, lrow).Formula = '=AE' + str(lrow + 1) + '/S' + str(lrow +1)
622  oSheet.getCellByPosition(29, lrow).CellStyle = 'livello2 valuta mini %'
623  oSheet.getCellByPosition(30, lrow).Formula = '=SUBTOTAL(9;AE' + str(lrow + 1) + ':AE' + str(nextCap) + ')'
624  oSheet.getCellByPosition(30, lrow).CellStyle = 'livello2 valuta mini'
625 
626 def SubSum_Cap(lrow):
627  '''
628  lrow { double } : id della riga di inerimento
629  inserisce i dati nella riga di categoria
630  '''
631  oDoc = XSCRIPTCONTEXT.getDocument()
632  oSheet = oDoc.CurrentController.ActiveSheet
633  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
634  return
635  #~ lrow = Range2Cell()[1]
636  lrowE = ultima_voce(oSheet)+2
637  nextCap = lrowE
638  for n in range(lrow+1, lrowE):
639  if oSheet.getCellByPosition(18, n).CellStyle in('Livello-1-scritta mini val','Livello-0-scritta mini val', 'Comp TOTALI'):
640  #~ MsgBox(oSheet.getCellByPosition(18, n).CellStyle,'')
641  nextCap = n + 1
642  break
643  #~ oDoc.enableAutomaticCalculation(False)
644  oSheet.getCellByPosition(18, lrow).Formula = '=SUBTOTAL(9;S' + str(lrow + 1) + ':S' + str(nextCap) + ')'
645  oSheet.getCellByPosition(18, lrow).CellStyle = 'Livello-1-scritta mini val'
646  oSheet.getCellByPosition(24, lrow).Formula = '=S' + str(lrow + 1) + '/S' + str(lrowE)
647  oSheet.getCellByPosition(24, lrow).CellStyle = 'Livello-1-scritta mini %'
648  oSheet.getCellByPosition(28, lrow).Formula = '=SUBTOTAL(9;AC' + str(lrow + 1) + ':AC' + str(nextCap) + ')'
649  oSheet.getCellByPosition(29, lrow).Formula = '=AE' + str(lrow + 1) + '/S' + str(lrow + 1)
650  oSheet.getCellByPosition(29, lrow).CellStyle = 'Livello-1-scritta mini %'
651  oSheet.getCellByPosition(30, lrow).Formula = '=SUBTOTAL(9;AE' + str(lrow + 1) + ':AE' + str(nextCap) + ')'
652  oSheet.getCellByPosition(30, lrow).CellStyle = 'Livello-1-scritta mini val'
653  #~ oDoc.enableAutomaticCalculation(True)
654 
655 
657  '''
658  lrow { double } : id della riga di inerimento
659  sincronizza il categoria e sottocategorie
660  '''
661  datarif = datetime.now()
662  oDoc = XSCRIPTCONTEXT.getDocument()
663  oSheet = oDoc.CurrentController.ActiveSheet
664  if oSheet.Name not in('COMPUTO', 'VARIANTE'):
665  return
666 # lrow = Range2Cell()[1]
667  lastRow = ultima_voce(oSheet)+1
668 
669  listasbcat = list()
670  listacat = list()
671  listaspcat = list()
672  for lrow in range(0,lastRow): #
673  if oSheet.getCellByPosition(2, lrow).CellStyle == 'livello2_': #SUB CATEGORIA
674  if oSheet.getCellByPosition(2, lrow).String not in listasbcat:
675  listasbcat.append((oSheet.getCellByPosition(2, lrow).String))
676  try:
677  oSheet.getCellByPosition(31, lrow).Value = idspcat
678  except:
679  pass
680  try:
681  oSheet.getCellByPosition(32, lrow).Value = idcat
682  except:
683  pass
684  idsbcat = listasbcat.index(oSheet.getCellByPosition(2, lrow).String) +1
685  oSheet.getCellByPosition(33, lrow).Value = idsbcat
686  oSheet.getCellByPosition(1, lrow).Formula = '=AF' + str(lrow+1) +'&"."&AG' + str(lrow+1) + '&"."&AH' + str(lrow+1)
687 
688  elif oSheet.getCellByPosition(2, lrow).CellStyle == 'Livello-1-scritta mini': #CATEGORIA
689  if oSheet.getCellByPosition(2, lrow).String not in listacat:
690  listacat.append((oSheet.getCellByPosition(2, lrow).String))
691 
692  idsbcat = None
693 
694  try:
695  oSheet.getCellByPosition(31, lrow).Value = idspcat
696  except:
697  pass
698  idcat = listacat.index(oSheet.getCellByPosition(2, lrow).String) +1
699  oSheet.getCellByPosition(32, lrow).Value = idcat
700  oSheet.getCellByPosition(1, lrow).Formula = '=AF' + str(lrow+1) +'&"."&AG' + str(lrow+1)
701 
702  elif oSheet.getCellByPosition(2, lrow).CellStyle == 'Livello-0-scritta mini': #SUPER CATEGORIA
703  if oSheet.getCellByPosition(2, lrow).String not in listaspcat:
704  listaspcat.append((oSheet.getCellByPosition(2, lrow).String))
705 
706  idcat = idsbcat = None
707 
708  idspcat = listaspcat.index(oSheet.getCellByPosition(2, lrow).String) +1
709  oSheet.getCellByPosition(31, lrow).Value = idspcat
710  oSheet.getCellByPosition(1, lrow).Formula = '=AF' + str(lrow+1)
711 
712  elif oSheet.getCellByPosition(33, lrow).CellStyle == 'compTagRiservato': #CATEGORIA
713  try:
714  oSheet.getCellByPosition(33, lrow).Value = idsbcat
715  except:
716  oSheet.getCellByPosition(33, lrow).Value = 0
717  try:
718  oSheet.getCellByPosition(32, lrow).Value = idcat
719  except:
720  oSheet.getCellByPosition(32, lrow).Value = 0
721  try:
722  oSheet.getCellByPosition(31, lrow).Value = idspcat
723  except:
724  oSheet.getCellByPosition(31, lrow).Value = 0
725 
726  #~ MsgBox('Importazione eseguita con successo\n in ' + str((datetime.now() - datarif).total_seconds()) + ' secondi!','')
727 
728 
729 def insRows(lrow, nrighe): #forse inutile
730  '''
731  lrow { double } : id della riga di inerimento
732  lrow { integer } : numero di nuove righe da inserire
733 
734  Inserisce nrighe nella posizione lrow - alternativo a
735  oSheet.getRows().insertByIndex(lrow, 1)
736  '''
737  oDoc = XSCRIPTCONTEXT.getDocument()
738  oSheet = oDoc.CurrentController.ActiveSheet
739  iSheet = oSheet.RangeAddress.Sheet
740  #~ oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
741  #~ lrow = Range2Cell()[1]
742  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
743  oCellRangeAddr.Sheet = iSheet
744  oCellRangeAddr.StartColumn = 0
745  oCellRangeAddr.EndColumn = 0
746  oCellRangeAddr.StartRow = lrow
747  oCellRangeAddr.EndRow = lrow + nrighe - 1
748  oSheet.insertCells(oCellRangeAddr, 3) # com.sun.star.sheet.CellInsertMode.ROW
749 
750 def ultima_voce(oSheet):
751  #~ oDoc = XSCRIPTCONTEXT.getDocument()
752  #~ oSheet = oDoc.CurrentController.ActiveSheet
753  nRow = getLastUsedCell(oSheet).EndRow
754  for n in reversed(range(0, nRow)):
755  #~ if oSheet.getCellByPosition(0, n).CellStyle in('Comp TOTALI'):
756  if oSheet.getCellByPosition(0, n).CellStyle in('EP-aS', 'EP-Cs', 'An-sfondo-basso Att End', 'Comp End Attributo',
757  'Comp End Attributo_R', 'comp Int_colonna', 'comp Int_colonna_R_prima',
758  'Livello-0-scritta', 'Livello-1-scritta', 'livello2 valuta'):
759  break
760  return n
761 
762 def uFindStringCol(sString, nCol, oSheet, start=0):
763  '''
764  sString { string } : stringa da cercare
765  nCol { integer } : indice di colonna
766  oSheet { object } :
767  start { integer } : riga di partenza
768 
769  Trova la prima ricorrenza di una stringa(sString) nella
770  colonna nCol di un foglio di calcolo(oSheet) e restituisce
771  in numero di riga
772  '''
773  oCell = oSheet.getCellByPosition(0,0)
774  oCursor = oSheet.createCursorByRange(oCell)
775  oCursor.gotoEndOfUsedArea(True)
776  aAddress = oCursor.RangeAddress
777  for nRow in range(start, aAddress.EndRow+1):
778  if sString in oSheet.getCellByPosition(nCol,nRow).String:
779  return(nRow)
780 
781 def uFindString(sString, oSheet):
782  '''
783  sString { string } : stringa da cercare
784  oSheet { object } :
785 
786  Trova la prima ricorrenza di una stringa(sString) riga
787  per riga in un foglio di calcolo(oSheet) e restituisce
788  una tupla(IDcolonna, IDriga)
789  '''
790  oCell = oSheet.getCellByPosition(0,0)
791  oCursor = oSheet.createCursorByRange(oCell)
792  oCursor.gotoEndOfUsedArea(True)
793  aAddress = oCursor.RangeAddress
794  for nRow in range(0, aAddress.EndRow+1):
795  for nCol in range(0, aAddress.EndColumn+1):
796  # ritocco di +Daniele Zambelli:
797  if sString in oSheet.getCellByPosition(nCol,nRow).String:
798  return(nCol,nRow)
799 
800 def join_sheets(arg=None):
801  '''
802  unisci fogli
803  serve per unire tanti fogli in un unico foglio
804  '''
805  oDoc = XSCRIPTCONTEXT.getDocument()
806  lista_fogli = oDoc.Sheets.ElementNames
807  if oDoc.getSheets().hasByName('unione_fogli') == False:
808  sheet = oDoc.createInstance("com.sun.star.sheet.Spreadsheet")
809  unione = oDoc.Sheets.insertByName('unione_fogli', sheet)
810  unione = oDoc.getSheets().getByName('unione_fogli')
811  for el in lista_fogli:
812  oSheet = oDoc.getSheets().getByName(el)
813  oRangeAddress = oSheet.getCellRangeByPosition(0,0,(getLastUsedCell(oSheet).EndColumn),(getLastUsedCell(oSheet).EndRow)).getRangeAddress()
814  oCellAddress = unione.getCellByPosition(0, getLastUsedCell(unione).EndRow+1).getCellAddress()
815  oSheet.copyRange(oCellAddress, oRangeAddress)
816  MsgBox('Unione dei fogli eseguita.','Avviso')
817  else:
818  unione = oDoc.getSheets().getByName('unione_fogli')
819  MsgBox('Il foglio "unione_fogli" è già esistente, quindi non procedo.','Avviso!')
820  oDoc.CurrentController.setActiveSheet(unione)
821 
822 def copia_sheet(nSheet, tag):
823  '''
824  nSheet { string } : nome sheet
825  tag { string } : stringa di tag
826  duplica copia sheet corrente di fianco a destra
827  '''
828  oDoc = XSCRIPTCONTEXT.getDocument()
829  #~ nSheet = 'COMPUTO'
830  oSheet = oDoc.getSheets().getByName(nSheet)
831  idSheet = oSheet.RangeAddress.Sheet + 1
832  if oDoc.getSheets().hasByName(nSheet +'_'+ tag) == True:
833  MsgBox('La tabella di nome '+ nSheet +'_'+ tag + 'è già presente.', 'ATTENZIONE! Impossibile procedere.')
834  return
835  else:
836  oDoc.Sheets.copyByName(nSheet, nSheet +'_'+ tag, idSheet)
837  oSheet = oDoc.getSheets().getByName(nSheet +'_'+ tag)
838  oDoc.CurrentController.setActiveSheet(oSheet)
839  #~ oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
840 
841 def Filtra_computo(nSheet, nCol, sString):
842  '''
843  nSheet { string } : nome Sheet
844  ncol { integer } : colonna di tag
845  sString { string } : stringa di tag
846  crea una nuova sheet contenente le sole voci filtrate
847  '''
848  oDoc = XSCRIPTCONTEXT.getDocument()
849  copia_sheet(nSheet, sString)
850  oSheet = oDoc.CurrentController.ActiveSheet
851  for lrow in reversed(range(0, ultima_voce(oSheet))):
852  try:
853  sStRange = Circoscrive_Voce_Computo_Att(lrow)
854  sopra = sStRange.RangeAddress.StartRow
855  sotto = sStRange.RangeAddress.EndRow
856  if nCol ==1:
857  test=sopra+1
858  else:
859  test=sotto
860  if sString != oSheet.getCellByPosition(nCol,test).String:
861  oSheet.getRows().removeByIndex(sopra, sotto-sopra+1)
862  lrow =next_voice(lrow,0)
863  except:
864  lrow =next_voice(lrow,0)
865  for lrow in range(3, getLastUsedCell(oSheet).EndRow):
866  if oSheet.getCellByPosition(18,lrow).CellStyle == 'Livello-1-scritta mini val' and \
867  oSheet.getCellByPosition(18,lrow).Value == 0 or \
868  oSheet.getCellByPosition(18,lrow).CellStyle == 'livello2 scritta mini' and \
869  oSheet.getCellByPosition(18,lrow).Value == 0:
870 
871  oSheet.getRows().removeByIndex(lrow, 1)
872 
873  #~ iCellAttr =(oDoc.createInstance("com.sun.star.sheet.CellFlags.OBJECTS"))
874  flags = OBJECTS
875  oSheet.getCellRangeByPosition(0,0,42,0).clearContents(flags) #cancello gli oggetti
876  oDoc.CurrentController.select(oSheet.getCellByPosition(0,3))
877  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
878 
879 def Filtra_Computo_Cap(arg=None):
880  oDoc = XSCRIPTCONTEXT.getDocument()
881  oSheet = oDoc.CurrentController.ActiveSheet
882  nSheet = oSheet.getCellByPosition(7,8).String
883  sString = oSheet.getCellByPosition(7,10).String
884  Filtra_computo(nSheet, 31, sString)
885 
887  oDoc = XSCRIPTCONTEXT.getDocument()
888  oSheet = oDoc.CurrentController.ActiveSheet
889  nSheet = oSheet.getCellByPosition(7, 8).String
890  sString = oSheet.getCellByPosition(7, 12).String
891  Filtra_computo(nSheet, 32, sString)
892 
893 def Filtra_Computo_A(arg=None):
894  oDoc = XSCRIPTCONTEXT.getDocument()
895  oSheet = oDoc.CurrentController.ActiveSheet
896  nSheet = oSheet.getCellByPosition(7, 8).String
897  sString = oSheet.getCellByPosition(7, 14).String
898  Filtra_computo(nSheet, 33, sString)
899 
900 def Filtra_Computo_B(arg=None):
901  oDoc = XSCRIPTCONTEXT.getDocument()
902  oSheet = oDoc.CurrentController.ActiveSheet
903  nSheet = oSheet.getCellByPosition(7, 8).String
904  sString = oSheet.getCellByPosition(7, 16).String
905  Filtra_computo(nSheet, 34, sString)
906 
907 def Filtra_Computo_C(arg=None): #filtra in base al codice di prezzo
908  oDoc = XSCRIPTCONTEXT.getDocument()
909  oSheet = oDoc.CurrentController.ActiveSheet
910  nSheet = oSheet.getCellByPosition(7, 8).String
911  sString = oSheet.getCellByPosition(7, 20).String
912  Filtra_computo(nSheet, 1, sString)
913 
914 def Vai_a_M1(arg=None):
915  _gotoSheet('M1', 85)
916  _primaCella(0,0)
917 
918 def Vai_a_S2(arg=None):
919  _gotoSheet('S2')
920 
921 def Vai_a_S1(arg=None):
922  _gotoSheet('S1')
923  _primaCella(0,190)
924 
925 def Vai_a_ElencoPrezzi(arg=None):
926  _gotoSheet('Elenco Prezzi')
927 
928 def Vai_a_Computo(arg=None):
929  _gotoSheet('COMPUTO')
930 
931 def Vai_a_Variabili(arg=None):
932  _gotoSheet('S1', 85)
933  _primaCella(6,289)
934 
935 def Vai_a_Scorciatoie(arg=None):
936  _gotoSheet('Scorciatoie')
937  _primaCella(0,0)
938 
939 def _gotoSheet(nSheet, fattore=100):
940  '''
941  nSheet { string } : nome Sheet
942  attiva e seleziona una sheet
943  '''
944  oDoc = XSCRIPTCONTEXT.getDocument()
945  oSheet = oDoc.Sheets.getByName(nSheet)
946  oSheet.IsVisible = True
947  oDoc.CurrentController.setActiveSheet(oSheet)
948  #~ oDoc.CurrentController.ZoomValue = fattore
949  #~ oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
950 
951 def _primaCella(IDcol=0, IDrow=0):
952  '''
953  IDcol { integer } : id colonna
954  IDrow { integer } : id riga
955  settaggio prima cella visibile(IDcol, IDrow)
956  '''
957  oDoc = XSCRIPTCONTEXT.getDocument()
958  oSheet = oDoc.CurrentController.ActiveSheet
959  oDoc.CurrentController.setFirstVisibleColumn(IDcol)
960  oDoc.CurrentController.setFirstVisibleRow(IDrow)
961  return
962 
963 def ordina_col(ncol):
964  '''
965  ncol { integer } : id colonna
966  ordina i dati secondo la colonna con id ncol
967  '''
968  oDoc = XSCRIPTCONTEXT.getDocument()
969  oSheet = oDoc.CurrentController.ActiveSheet
970  ctx = XSCRIPTCONTEXT.getComponentContext()
971  desktop = XSCRIPTCONTEXT.getDesktop()
972  oFrame = desktop.getCurrentFrame()
973  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
974  oProp = []
975  oProp0 = PropertyValue()
976  oProp0.Name = 'ByRows'
977  oProp0.Value = True
978  oProp1 = PropertyValue()
979  oProp1.Name = 'HasHeader'
980  oProp1.Value = False
981  oProp2 = PropertyValue()
982  oProp2.Name = 'CaseSensitive'
983  oProp2.Value = False
984  oProp3 = PropertyValue()
985  oProp3.Name = 'NaturalSort'
986  oProp3.Value = False
987  oProp4 = PropertyValue()
988  oProp4.Name = 'IncludeAttribs'
989  oProp4.Value = True
990  oProp5 = PropertyValue()
991  oProp5.Name = 'UserDefIndex'
992  oProp5.Value = 0
993  oProp6 = PropertyValue()
994  oProp6.Name = 'Col1'
995  oProp6.Value = ncol
996  oProp7 = PropertyValue()
997  oProp7.Name = 'Ascending1'
998  oProp7.Value = True
999  oProp.append(oProp0)
1000  oProp.append(oProp1)
1001  oProp.append(oProp2)
1002  oProp.append(oProp3)
1003  oProp.append(oProp4)
1004  oProp.append(oProp5)
1005  oProp.append(oProp6)
1006  oProp.append(oProp7)
1007  properties = tuple(oProp)
1008  dispatchHelper.executeDispatch(oFrame, '.uno:DataSort', '', 0, properties)
1009 
1011  '''
1012  Sprotegge e riordina tutti fogli del documento.
1013  '''
1014  oDoc = XSCRIPTCONTEXT.getDocument()
1015  oSheets = oDoc.Sheets.ElementNames
1016  for nome in oSheets:
1017  oSheet = oDoc.getSheets().getByName(nome)
1018  oSheet.unprotect('')
1019  #riordino le sheet
1020  oDoc.Sheets.moveByName("Elenco Prezzi", 0)
1021  if oDoc.Sheets.hasByName("Analisi di Prezzo"):
1022  oDoc.Sheets.moveByName("Analisi di Prezzo", 1)
1023  oDoc.Sheets.moveByName("COMPUTO", 2)
1024  if oDoc.Sheets.hasByName("VARIANTE"):
1025  oDoc.Sheets.moveByName("VARIANTE", 3)
1026  if oDoc.Sheets.hasByName("CONTABILITA"):
1027  oDoc.Sheets.moveByName("CONTABILITA", 4)
1028  if oDoc.Sheets.hasByName("M1"):
1029  oDoc.Sheets.moveByName("M1", 5)
1030  oDoc.Sheets.moveByName("S1", 6)
1031  oDoc.Sheets.moveByName("S2", 7)
1032  oDoc.Sheets.moveByName("S4", 9)
1033  if oDoc.Sheets.hasByName("S5"):
1034  oDoc.Sheets.moveByName("S5", 10)
1035  if oDoc.Sheets.hasByName("copyright_LeenO"):
1036  oDoc.Sheets.moveByName("copyright_LeenO", oDoc.Sheets.Count)
1037 
1038 def setPreview(arg=0):
1039  '''
1040  colore { integer } : id colore
1041  attribuisce al foglio corrente un colore a scelta
1042  '''
1043  oDoc = XSCRIPTCONTEXT.getDocument()
1044  oSheet = oDoc.CurrentController.ActiveSheet #se questa dà errore, il preview è già attivo
1045  ctx = XSCRIPTCONTEXT.getComponentContext()
1046  desktop = XSCRIPTCONTEXT.getDesktop()
1047  oFrame = desktop.getCurrentFrame()
1048  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
1049  oProp = PropertyValue()
1050  properties =(oProp,)
1051  dispatchHelper.executeDispatch(oFrame, '.uno:PrintPreview', '', arg, properties)
1052 
1053 def setTabColor(colore):
1054  '''
1055  colore { integer } : id colore
1056  attribuisce al foglio corrente un colore a scelta
1057  '''
1058  oDoc = XSCRIPTCONTEXT.getDocument()
1059  oSheet = oDoc.CurrentController.ActiveSheet
1060  ctx = XSCRIPTCONTEXT.getComponentContext()
1061  desktop = XSCRIPTCONTEXT.getDesktop()
1062  oFrame = desktop.getCurrentFrame()
1063  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
1064  oProp = PropertyValue()
1065  oProp.Name = 'TabBgColor'
1066  oProp.Value = colore
1067  properties =(oProp,)
1068  dispatchHelper.executeDispatch(oFrame, '.uno:SetTabBgColor', '', 0, properties)
1069 
1070 def txt_Format(stile):
1071  '''
1072  Forza la formattazione della cella
1073  '''
1074  oDoc = XSCRIPTCONTEXT.getDocument()
1075  oSheet = oDoc.CurrentController.ActiveSheet
1076  ctx = XSCRIPTCONTEXT.getComponentContext()
1077  desktop = XSCRIPTCONTEXT.getDesktop()
1078  oFrame = desktop.getCurrentFrame()
1079  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
1080  oProp = PropertyValue()
1081  oProp.Name = stile
1082  oProp.Value = True
1083  properties =(oProp,)
1084  dispatchHelper.executeDispatch(oFrame, '.uno:' + stile, '', 0, properties)
1085 
1086 def show_sheets(x=True):
1087  '''
1088  x { boolean } : True = ON, False = OFF
1089 
1090  Mastra/nasconde tutte le tabelle ad escluzione di COMPUTO ed Elenco Prezzi
1091  '''
1092  oDoc = XSCRIPTCONTEXT.getDocument()
1093  oSheets = list(oDoc.getSheets().getElementNames())
1094  for nome in ('M1', 'S1', 'S2', 'S4', 'S5', 'Elenco Prezzi', 'COMPUTO'):
1095  oSheets.remove(nome)
1096  #~ oSheets.remove('Elenco Prezzi')
1097  #~ oSheets.remove('COMPUTO')
1098  for nome in oSheets:
1099  oSheet = oDoc.getSheets().getByName(nome)
1100  oSheet.IsVisible = x
1101  for nome in ('COMPUTO', 'Elenco Prezzi'):
1102  oSheet = oDoc.getSheets().getByName(nome)
1103  oSheet.IsVisible = True
1104  #~ if x == True:
1105  #~ for nome in ('M1', 'S1', 'S2', 'S4', 'S5'):
1106  #~ oSheet = oDoc.getSheets().getByName(nome).IsVisible = False
1107 def nascondi_sheets(arg=None):
1108  show_sheets(False)
1109 
1110 def salva_come(nomefile=None):
1111  '''
1112  nomefile { string } : nome del file di destinazione
1113  Se presente l'argomento nomefile, salva il file corrente in nomefile.
1114  '''
1115  oDoc = XSCRIPTCONTEXT.getDocument()
1116  oSheet = oDoc.CurrentController.ActiveSheet
1117  ctx = XSCRIPTCONTEXT.getComponentContext()
1118  desktop = XSCRIPTCONTEXT.getDesktop()
1119  oFrame = desktop.getCurrentFrame()
1120  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
1121 
1122  oProp = []
1123  if nomefile != None:
1124  nomefile = uno.systemPathToFileUrl(nomefile)
1125  oProp0 = PropertyValue()
1126  oProp0.Name = "URL"
1127  oProp0.Value = nomefile
1128  oProp.append(oProp0)
1129 
1130  oProp1 = PropertyValue()
1131  oProp1.Name = "FilterName"
1132  oProp1.Value = "calc8"
1133  oProp.append(oProp1)
1134 
1135  properties = tuple(oProp)
1136 
1137  dispatchHelper.executeDispatch(oFrame, ".uno:SaveAs", "", 0, properties)
1138 
1139 def _gotoCella(IDcol=0, IDrow=0):
1140  '''
1141  IDcol { integer } : id colonna
1142  IDrow { integer } : id riga
1143 
1144  muove il cursore nelle cella(IDcol, IDrow)
1145  '''
1146  oDoc = XSCRIPTCONTEXT.getDocument()
1147  oSheet = oDoc.CurrentController.ActiveSheet
1148 
1149  oDoc.CurrentController.select(oSheet.getCellByPosition(IDcol, IDrow))
1150  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges"))
1151  return
1152 
1153 def loVersion(arg=None):
1154  '''
1155  Legge il numero di versione di LibreOffice.
1156  '''
1157  sAccess = createUnoService("com.sun.star.configuration.ConfigurationAccess")
1158  aConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
1159  arg = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
1160  arg.Name = "nodepath"
1161  arg.Value = '/org.openoffice.Setup/Product'
1162  return aConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", (arg,)).ooSetupVersionAboutBox
1163 #~ ########################################################################
1164 def adatta_altezza_riga(nSheet=None):
1165  '''
1166  Adattal'altezza delle righe al contenuto delle celle.
1167 
1168  nSheet { string } : nSheet della sheet
1169  imposta l'altezza ottimale delle celle
1170  '''
1171  oDoc = XSCRIPTCONTEXT.getDocument()
1172  oSheet = oDoc.CurrentController.ActiveSheet
1173  if oDoc.getSheets().hasByName('S1') == False: return
1174  nSheet = oSheet.Name
1175  oDoc.getSheets().hasByName(nSheet)
1176  oSheet.getCellRangeByPosition(0, 0, getLastUsedCell(oSheet).EndColumn, getLastUsedCell(oSheet).EndRow).Rows.OptimalHeight = True
1177  #~ se la versione di LibreOffice è maggiore della 5.2, esegue il comando agendo direttamente sullo stile
1178  if float(loVersion()[:3]) > 5.2 and float(loVersion()[:3]) < 6.2:
1179  # ~for stile_cella in ('Comp-Bianche in mezzo Descr', 'comp 1-a', 'Comp-Bianche in mezzo Descr_R'):
1180  # ~try:
1181  # ~oDoc.StyleFamilies.getByName("CellStyles").getByName(stile_cella).IsTextWrapped = True
1182  # ~except:
1183  # ~pass
1184  if nSheet in('VARIANTE', 'COMPUTO', 'CONTABILITA', 'Elenco Prezzi_2'):
1185  test = getLastUsedCell(oSheet).EndRow+1
1186  for y in range(0, test):
1187  if oSheet.getCellByPosition(2, y).CellStyle in ('comp 1-a', 'Comp-Bianche in mezzo Descr_R', 'Comp-Bianche in mezzo Descr', 'EP-a'):
1188  oSheet.getCellRangeByPosition(0, y, getLastUsedCell(oSheet).EndColumn, y).Rows.OptimalHeight = True
1189 
1190  if oSheet.Name in('Elenco Prezzi', 'VARIANTE', 'COMPUTO', 'CONTABILITA'):
1191  oSheet.getCellByPosition(0, 2).Rows.Height = 800
1192  if nSheet == 'Elenco Prezzi':
1193  test = getLastUsedCell(oSheet).EndRow+1
1194  for y in range(0, test):
1195  oSheet.getCellRangeByPosition(0, y, getLastUsedCell(oSheet).EndColumn, y).Rows.OptimalHeight = True
1196  return
1197 
1198 def voce_breve(arg=None):
1199  '''
1200  Cambia il numero di caratteri visualizzati per la descrizione voce in COMPUTO,
1201  CONTABILITA E VARIANTE.
1202  '''
1203  oDoc = XSCRIPTCONTEXT.getDocument()
1204  oSheet = oDoc.CurrentController.ActiveSheet
1205  oSheet.getCellRangeByPosition(0, 0, getLastUsedCell(oSheet).EndColumn, getLastUsedCell(oSheet).EndRow).Rows.OptimalHeight = True
1206  if oDoc.getSheets().hasByName('S1') == False: return
1207  if oSheet.Name in ('COMPUTO', 'VARIANTE'):
1208  oSheet = oDoc.getSheets().getByName('S1')
1209  if oSheet.getCellRangeByName('S1.H337').Value < 10000:
1210  conf.write(path_conf, 'Computo', 'inizio_voci_abbreviate', oSheet.getCellRangeByName('S1.H337').String)
1211  oSheet.getCellRangeByName('S1.H337').Value = 10000
1212  else:
1213  oSheet.getCellRangeByName('S1.H337').Value = int(conf.read(path_conf, 'Computo', 'inizio_voci_abbreviate'))
1214  if oSheet.getCellRangeByName('S1.H338').Value < 10000:
1215  conf.write(path_conf, 'Computo', 'fine_voci_abbreviate', oSheet.getCellRangeByName('S1.H338').String)
1216  oSheet.getCellRangeByName('S1.H338').Value = 10000
1217  else:
1218  oSheet.getCellRangeByName('S1.H338').Value = int(conf.read(path_conf, 'Computo', 'fine_voci_abbreviate'))
1220 
1221  elif oSheet.Name == 'CONTABILITA':
1222  oSheet = oDoc.getSheets().getByName('S1')
1223  if oDoc.NamedRanges.hasByName("#Lib#1") == True:
1224  MsgBox("Risulta già registrato un SAL. NON E' POSSIBILE PROCEDERE.",'ATTENZIONE!')
1225  return
1226  else:
1227  if oSheet.getCellRangeByName('S1.H335').Value < 10000:
1228  conf.write(path_conf, 'Contabilità', 'cont_inizio_voci_abbreviate', oSheet.getCellRangeByName('S1.H335').String)
1229  oSheet.getCellRangeByName('S1.H335').Value = 10000
1230  else:
1231  oSheet.getCellRangeByName('S1.H335').Value = int(conf.read(path_conf, 'Contabilità', 'cont_inizio_voci_abbreviate'))
1232  if oSheet.getCellRangeByName('S1.H336').Value < 10000:
1233  conf.write(path_conf, 'Contabilità', 'cont_fine_voci_abbreviate', oSheet.getCellRangeByName('S1.H336').String)
1234  oSheet.getCellRangeByName('S1.H336').Value = 10000
1235  else:
1236  oSheet.getCellRangeByName('S1.H336').Value = int(conf.read(path_conf, 'Contabilità', 'cont_fine_voci_abbreviate'))
1238 
1240  '''
1241  Cancella le voci di prezzo non utilizzate.
1242  '''
1243  oDialogo_attesa = dlg_attesa()
1244  attesa().start() #mostra il dialogo
1245 
1246  if DlgSiNo('''Questo comando ripulisce l'Elenco Prezzi
1247 dalle voci non utilizzate in nessuno degli altri elaborati.
1248 
1249 LA PROCEDURA POTREBBE RICHIEDERE DEL TEMPO.
1250 
1251 Vuoi procedere comunque?''', 'AVVISO!') == 3:
1252  oDialogo_attesa.endExecute() #chiude il dialogo
1253  return
1254  oDoc = XSCRIPTCONTEXT.getDocument()
1255  oDoc.enableAutomaticCalculation(False)
1256  oDoc.CurrentController.ZoomValue = 400
1257  oSheet = oDoc.CurrentController.ActiveSheet
1258 
1259  oRange=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1260  SR = oRange.StartRow+1
1261  ER = oRange.EndRow
1262  lista_prezzi = list()
1263  for n in range(SR, ER):
1264  lista_prezzi.append (oSheet.getCellByPosition(0, n).String)
1265  lista = list()
1266  for tab in ('COMPUTO','Analisi di Prezzo', 'VARIANTE', 'CONTABILITA'):
1267  try:
1268  oSheet = oDoc.getSheets().getByName(tab)
1269  if tab == 'Analisi di Prezzo':
1270  col = 0
1271  else:
1272  col = 1
1273  for el in lista_prezzi:
1274  if uFindStringCol (el, col, oSheet):
1275  lista.append(el)
1276  except:
1277  pass
1278  oSheet = oDoc.CurrentController.ActiveSheet
1279  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1280  da_cancellare = set(lista_prezzi).difference(set(lista))
1281  for n in reversed(range(SR, ER-1)):
1282  if oSheet.getCellByPosition(0, n).String in da_cancellare:
1283  oSheet.Rows.removeByIndex(n, 1)
1284  oDoc.enableAutomaticCalculation(True)
1285  oDoc.CurrentController.ZoomValue = 100
1286  _gotoCella(0, 3)
1287  oDialogo_attesa.endExecute() #chiude il dialogo
1288 
1289 
1290 def voce_breve_ep(arg=None):
1291  '''
1292  Ottimizza l'altezza delle celle di Elenco Prezzi o visualizza solo
1293  tre righe della descrizione.
1294  '''
1295  oDoc = XSCRIPTCONTEXT.getDocument()
1296  oSheet = oDoc.CurrentController.ActiveSheet
1297 
1298  oRange=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1299  SR = oRange.StartRow+1
1300  ER = oRange.EndRow-1
1301 
1302  if oSheet.getCellByPosition(1, 3).Rows.OptimalHeight == False:
1304  else:
1305  hriga = oSheet.getCellRangeByName('B4').CharHeight * 65 * 2 + 100 #visualizza tre righe
1306  oSheet.getCellRangeByPosition(0, SR, 0, ER).Rows.Height = hriga
1307 
1308 
1309 def scelta_viste(arg=None):
1310  '''
1311  Gestisce i dialoghi del menù viste nelle tabelle di Analisi di Prezzo,
1312  Elenco Prezzi, COMPUTO, VARIANTE, CONTABILITA'
1313  Genera i raffronti tra COMPUTO e VARIANTE e CONTABILITA'
1314  '''
1315  oDoc = XSCRIPTCONTEXT.getDocument()
1316  oSheet = oDoc.CurrentController.ActiveSheet
1317  psm = uno.getComponentContext().ServiceManager
1318  dp = psm.createInstance('com.sun.star.awt.DialogProvider')
1319  if oSheet.Name in('VARIANTE', 'COMPUTO'):
1320  oDialog1 = dp.createDialog('vnd.sun.star.script:UltimusFree2.DialogViste_A?language=Basic&location=application')
1321  oDialog1Model = oDialog1.Model
1322  oDialog1.getControl('Dettaglio').State = conf.read(path_conf, 'Generale', 'dettaglio')
1323  if oSheet.getColumns().getByIndex(5).Columns.IsVisible == True: oDialog1.getControl('CBMis').State = 1
1324  if oSheet.getColumns().getByIndex(17).Columns.IsVisible == True: oDialog1.getControl('CBSic').State = 1
1325  if oSheet.getColumns().getByIndex(28).Columns.IsVisible == True: oDialog1.getControl('CBMat').State = 1
1326  if oSheet.getColumns().getByIndex(29).Columns.IsVisible == True: oDialog1.getControl('CBMdo').State = 1
1327  if oSheet.getColumns().getByIndex(31).Columns.IsVisible == True: oDialog1.getControl('CBCat').State = 1
1328  if oSheet.getColumns().getByIndex(38).Columns.IsVisible == True: oDialog1.getControl('CBFig').State = 1
1329 
1330  sString = oDialog1.getControl('TextField10')
1331  sString.Text = oDoc.getSheets().getByName('S1').getCellRangeByName('H337').Value #inizio_voci_abbreviate
1332  sString = oDialog1.getControl('TextField11')
1333  sString.Text = oDoc.getSheets().getByName('S1').getCellRangeByName('H338').Value #fine_voci_abbreviate
1334 
1335  oDialog1.execute()
1336 
1337  #il salvataggio anche su leeno.conf serve alla funzione voce_breve()
1338  if oDialog1.getControl('TextField10').getText() != '10000': conf.write(path_conf, 'Computo', 'inizio_voci_abbreviate', oDialog1.getControl('TextField10').getText())
1339  oDoc.getSheets().getByName('S1').getCellRangeByName('H337').Value = float(oDialog1.getControl('TextField10').getText())
1340 
1341  if oDialog1.getControl('TextField11').getText() != '10000': conf.write(path_conf, 'Computo', 'fine_voci_abbreviate', oDialog1.getControl('TextField11').getText())
1342  oDoc.getSheets().getByName('S1').getCellRangeByName('H338').Value = float(oDialog1.getControl('TextField11').getText())
1343  #~ oDialog1.getControl('CBMdo').State = False
1344  #~ if oSheet.getColumns().getByIndex(29).Columns.IsVisible == True:
1345  #~ oDialog1.getControl('CBMdo').State = True
1346 
1347  if oDialog1.getControl('OBTerra').State == True:
1349  oDialog1.getControl('CBSic').State = 0
1350  oDialog1.getControl('CBMdo').State = 0
1351  oDialog1.getControl('CBMat').State = 0
1352  oDialog1.getControl('CBCat').State = 0
1353  oDialog1.getControl('CBFig').State = 0
1354  oDialog1.getControl('CBMis').State = 1
1355 
1356 
1357  if oDialog1.getControl("CBMis").State == 0: #misure
1358  oSheet.getColumns().getByIndex(5).Columns.IsVisible = False
1359  oSheet.getColumns().getByIndex(6).Columns.IsVisible = False
1360  oSheet.getColumns().getByIndex(7).Columns.IsVisible = False
1361  oSheet.getColumns().getByIndex(8).Columns.IsVisible = False
1362  else:
1363  oSheet.getColumns().getByIndex(5).Columns.IsVisible = True
1364  oSheet.getColumns().getByIndex(6).Columns.IsVisible = True
1365  oSheet.getColumns().getByIndex(7).Columns.IsVisible = True
1366  oSheet.getColumns().getByIndex(8).Columns.IsVisible = True
1367 
1368  if oDialog1.getControl('CBMdo').State == True: #manodopera
1369  oSheet.getColumns().getByIndex(29).Columns.IsVisible = True
1370  oSheet.getColumns().getByIndex(30).Columns.IsVisible = True
1371  oSheet.getColumns().getByIndex(5).Columns.IsVisible = False
1372  oSheet.getColumns().getByIndex(6).Columns.IsVisible = False
1373  oSheet.getColumns().getByIndex(7).Columns.IsVisible = False
1374  oSheet.getColumns().getByIndex(8).Columns.IsVisible = False
1375  adatta_altezza_riga(oSheet)
1376  oSheet.clearOutline()
1377  struct(3)
1378  else:
1379  oSheet.getColumns().getByIndex(29).Columns.IsVisible = False
1380  oSheet.getColumns().getByIndex(30).Columns.IsVisible = False
1381 
1382 
1383  if oDialog1.getControl('CBMat').State == 0: #materiali
1384  oSheet.getColumns().getByIndex(28).Columns.IsVisible = False
1385 
1386  else:
1387  oSheet.getColumns().getByIndex(28).Columns.IsVisible = True
1388 
1389  if oDialog1.getControl('CBCat').State == 0: #categorie
1390  oSheet.getColumns().getByIndex(31).Columns.IsVisible = False
1391  oSheet.getColumns().getByIndex(32).Columns.IsVisible = False
1392  oSheet.getColumns().getByIndex(33).Columns.IsVisible = False
1393  else:
1394  oSheet.getColumns().getByIndex(31).Columns.IsVisible = True
1395  oSheet.getColumns().getByIndex(32).Columns.IsVisible = True
1396  oSheet.getColumns().getByIndex(33).Columns.IsVisible = True
1397 
1398  if oDialog1.getControl("CBSic").State == 0: #sicurezza
1399  oSheet.getColumns().getByIndex(17).Columns.IsVisible = False
1400  else:
1401  oSheet.getColumns().getByIndex(17).Columns.IsVisible = True
1402 
1403  if oDialog1.getControl("CBFig").State == 0: #figure
1404  oSheet.getColumns().getByIndex(38).Columns.IsVisible = False
1405  else:
1406  oSheet.getColumns().getByIndex(38).Columns.IsVisible = True
1407 
1408  if oDialog1.getControl('Dettaglio').State == 0: #
1409  conf.write(path_conf, 'Generale', 'dettaglio', '0')
1410  dettaglio_misure(0)
1411  else:
1412  conf.write(path_conf, 'Generale', 'dettaglio', '1')
1413  dettaglio_misure(0)
1414  dettaglio_misure(1)
1415 
1416  elif oSheet.Name in('Elenco Prezzi'):
1417  oDialog1 = dp.createDialog("vnd.sun.star.script:UltimusFree2.DialogViste_EP?language=Basic&location=application")
1418  oDialog1Model = oDialog1.Model
1419  if oSheet.getColumns().getByIndex(3).Columns.IsVisible == True: oDialog1.getControl('CBSic').State = 1
1420  if oSheet.getColumns().getByIndex(5).Columns.IsVisible == True: oDialog1.getControl('CBMdo').State = 1
1421  if oSheet.getCellByPosition(1, 3).Rows.OptimalHeight == False: oDialog1.getControl('CBDesc').State = 1
1422  if oSheet.getColumns().getByIndex(7).Columns.IsVisible == True: oDialog1.getControl('CBOrig').State = 1
1423  if oDialog1.execute() == 1:
1424  if oDialog1.getControl("CBSic").State == 0: #sicurezza
1425  oSheet.getColumns().getByIndex(3).Columns.IsVisible = False
1426  else:
1427  oSheet.getColumns().getByIndex(3).Columns.IsVisible = True
1428 
1429  if oDialog1.getControl("CBMdo").State == 0: #manodopera
1430  oSheet.getColumns().getByIndex(5).Columns.IsVisible = False
1431  oSheet.getColumns().getByIndex(6).Columns.IsVisible = False
1432  else:
1433  oSheet.getColumns().getByIndex(5).Columns.IsVisible = True
1434  oSheet.getColumns().getByIndex(6).Columns.IsVisible = True
1435 
1436  if oDialog1.getControl("CBDesc").State == 1: #descrizione
1437  oSheet.getColumns().getByIndex(3).Columns.IsVisible = False
1438  oSheet.getCellByPosition(1, 3).Rows.OptimalHeight
1439  voce_breve_ep()
1440  elif oDialog1.getControl("CBDesc").State == 0: adatta_altezza_riga(oSheet.Name)
1441 
1442  if oDialog1.getControl("CBOrig").State == 0: #origine
1443  oSheet.getColumns().getByIndex(7).Columns.IsVisible = False
1444  else:
1445  oSheet.getColumns().getByIndex(7).Columns.IsVisible = True
1446 
1447  if oDialog1.getControl("CBSom").State == 1:
1448  genera_sommario()
1449 
1450  oRangeAddress=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1451  SR = oRangeAddress.StartRow+1
1452  ER = oRangeAddress.EndRow-1
1453 
1454  oSheet.getCellRangeByPosition(11, 0, 26, 0).Columns.IsVisible = True
1455  oSheet.getCellRangeByPosition(23 , SR, 25, ER).CellStyle = 'EP statistiche'
1456  oSheet.getCellRangeByPosition(26, SR, 26, ER+1).CellStyle = 'EP-mezzo %'
1457 
1458  formule = list()
1459  oSheet.getCellByPosition(11, 0).String = 'COMPUTO'
1460  oSheet.getCellByPosition(15, 0).String = 'VARIANTE'
1461  oSheet.getCellByPosition(19, 0).String = "CONTABILITA"
1462  if oDialog1.getControl("ComVar").State == True: #Computo - Variante
1463  genera_sommario()
1464 
1465  oRangeAddress.StartColumn = 19
1466  oRangeAddress.EndColumn = 22
1467 
1468  oSheet.getCellByPosition(23, 0).String = 'COMPUTO - VARIANTE'
1469  for n in range(4, ultima_voce(oSheet)+2):
1470  formule.append(['=IF(Q' + str(n) + '-M' + str(n) + '=0;"--";Q' + str(n) + '-M' + str(n) + ')',
1471  '=IF(R' + str(n) + '-N' + str(n) + '>0;R' + str(n) + '-N' + str(n) + ';"")',
1472  '=IF(R' + str(n) + '-N' + str(n) + '<0;N' + str(n) + '-R' + str(n) + ';"")',
1473  '=IFERROR(IFS(AND(N' + str(n) + '>R' + str(n) + ';R' + str(n) + '=0);-1;AND(N' + str(n) + '<R' + str(n) + ';N' + str(n) + '=0);1;N' + str(n) + '=R' + str(n) + ';"--";N' + str(n) + '>R' + str(n) + ';-(N' + str(n) + '-R' + str(n) + ')/N' + str(n) + ';N' + str(n) + '<R' + str(n) + ';-(N' + str(n) + '-R' + str(n) + ')/N' + str(n) + ');"--")'])
1474 
1475  n += 1
1476  for el in(1, ER+1):
1477  oSheet.getCellByPosition(26, el).Formula = '=IFERROR(IFS(AND(N' + str(n) + '>R' + str(n) + ';R' + str(n) + '=0);-1;AND(N' + str(n) + '<R' + str(n) + ';N' + str(n) + '=0);1;N' + str(n) + '=R' + str(n) + ';"--";N' + str(n) + '>R' + str(n) + ';-(N' + str(n) + '-R' + str(n) + ')/N' + str(n) + ';N' + str(n) + '<R' + str(n) + ';-(N' + str(n) + '-R' + str(n) + ')/N' + str(n) + ');"--")'
1478  oRange = oSheet.getCellRangeByPosition(23, 3, 26, ultima_voce(oSheet))
1479  formule = tuple(formule)
1480  oRange.setFormulaArray(formule)
1481 
1482  if oDialog1.getControl("ComCon").State == True: #Computo - Contabilità
1483  genera_sommario()
1484  oRangeAddress.StartColumn = 15
1485  oRangeAddress.EndColumn = 18
1486 
1487  oSheet.getCellByPosition(23, 0).String = 'COMPUTO - CONTABILITÀ'
1488  for n in range(4, ultima_voce(oSheet)+2):
1489  formule.append(['=IF(U' + str(n) + '-M' + str(n) + '=0;"--";U' + str(n) + '-M' + str(n) + ')',
1490  '=IF(V' + str(n) + '-N' + str(n) + '>0;V' + str(n) + '-N' + str(n) + ';"")',
1491  '=IF(V' + str(n) + '-N' + str(n) + '<0;N' + str(n) + '-V' + str(n) + ';"")',
1492  '=IFERROR(IFS(AND(N' + str(n) + '>V' + str(n) + ';V' + str(n) + '=0);-1;AND(N' + str(n) + '<V' + str(n) + ';N' + str(n) + '=0);1;N' + str(n) + '=V' + str(n) + ';"--";N' + str(n) + '>V' + str(n) + ';-(N' + str(n) + '-V' + str(n) + ')/N' + str(n) + ';N' + str(n) + '<V' + str(n) + ';-(N' + str(n) + '-V' + str(n) + ')/N' + str(n) + ');"--")'])
1493  n += 1
1494  for el in(1, ER+1):
1495  oSheet.getCellByPosition(26, el).Formula = '=IFERROR(IFS(AND(N' + str(n) + '>V' + str(n) + ';V' + str(n) + '=0);-1;AND(N' + str(n) + '<V' + str(n) + ';N' + str(n) + '=0);1;N' + str(n) + '=V' + str(n) + ';"--";N' + str(n) + '>V' + str(n) + ';-(N' + str(n) + '-V' + str(n) + ')/N' + str(n) + ';N' + str(n) + '<V' + str(n) + ';-(N' + str(n) + '-V' + str(n) + ')/N' + str(n) + ');"--")'
1496  oRange = oSheet.getCellRangeByPosition(23, 3, 26, ultima_voce(oSheet))
1497  formule = tuple(formule)
1498  oRange.setFormulaArray(formule)
1499 
1500  if oDialog1.getControl("VarCon").State == True: #Variante - Contabilità
1501  genera_sommario()
1502 
1503  oRangeAddress.StartColumn = 11
1504  oRangeAddress.EndColumn = 14
1505 
1506  oSheet.getCellByPosition(23, 0).String = 'VARIANTE - CONTABILITÀ'
1507  for n in range(4, ultima_voce(oSheet)+2):
1508  formule.append(['=IF(U' + str(n) + '-Q' + str(n) + '=0;"--";U' + str(n) + '-Q' + str(n) + ')',
1509  '=IF(V' + str(n) + '-R' + str(n) + '>0;V' + str(n) + '-R' + str(n) + ';"")',
1510  '=IF(V' + str(n) + '-R' + str(n) + '<0;R' + str(n) + '-V' + str(n) + ';"")',
1511  '=IFERROR(IFS(AND(R' + str(n) + '>V' + str(n) + ';V' + str(n) + '=0);-1;AND(R' + str(n) + '<V' + str(n) + ';R' + str(n) + '=0);1;R' + str(n) + '=V' + str(n) + ';"--";R' + str(n) + '>V' + str(n) + ';-(R' + str(n) + '-V' + str(n) + ')/R' + str(n) + ';R' + str(n) + '<V' + str(n) + ';-(R' + str(n) + '-V' + str(n) + ')/R' + str(n) + ');"--")'])
1512  n += 1
1513  for el in(1, ER+1):
1514  oSheet.getCellByPosition(26, el).Formula = '=IFERROR(IFS(AND(R' + str(n) + '>V' + str(n) + ';V' + str(n) + '=0);-100;AND(R' + str(n) + '<V' + str(n) + ';R' + str(n) + '=0);100;R' + str(n) + '=V' + str(n) + ';"--";R' + str(n) + '>V' + str(n) + ';-(R' + str(n) + '-V' + str(n) + ')/R' + str(n) + ';R' + str(n) + '<V' + str(n) + ';-(R' + str(n) + '-V' + str(n) + ')/R' + str(n) + ');"--")'
1515  oRange = oSheet.getCellRangeByPosition(23, 3, 26, ultima_voce(oSheet))
1516  formule = tuple(formule)
1517  oRange.setFormulaArray(formule)
1518  for el in(11, 15, 19, 26):
1519  oSheet.getCellRangeByPosition(el, 3, el, ultima_voce(oSheet)).CellStyle = 'EP-mezzo %'
1520  for el in(12, 16, 20, 23):
1521  oSheet.getCellRangeByPosition(el, 3, el, ultima_voce(oSheet)).CellStyle = 'EP statistiche_q'
1522  for el in(13, 17, 21, 24, 25):
1523  oSheet.getCellRangeByPosition(el, 3, el, ultima_voce(oSheet)).CellStyle = 'EP statistiche'
1524  if oRangeAddress.StartColumn != 0:
1525  if DlgSiNo("Nascondo eventuali righe con scostamento nullo?") == 2:
1526  refresh(0)
1527  errori =('#DIV/0!', '--')
1528  hide_error(errori, 26)
1529  oSheet.group(oRangeAddress, 0)
1530  oSheet.getCellRangeByPosition(oRangeAddress.StartColumn, 0, oRangeAddress.EndColumn, 1).Columns.IsVisible = False
1531  else: return
1532 
1533  elif oSheet.Name in('Analisi di Prezzo'):
1534  oDialog1 = dp.createDialog("vnd.sun.star.script:UltimusFree2.DialogViste_AN?language=Basic&location=application")
1535  oDialog1Model = oDialog1.Model
1536  if oSheet.getCellByPosition(1, 2).Rows.OptimalHeight == False: oDialog1.getControl("CBDesc").State = 1 #descrizione breve
1537 
1538  oS1 = oDoc.getSheets().getByName('S1')
1539  sString = oDialog1.getControl('TextField5')
1540  sString.Text =oS1.getCellRangeByName('S1.H319').Value * 100 #sicurezza
1541  sString = oDialog1.getControl('TextField6')
1542  sString.Text =oS1.getCellRangeByName('S1.H320').Value * 100 #spese_generali
1543  sString = oDialog1.getControl('TextField7')
1544  sString.Text =oS1.getCellRangeByName('S1.H321').Value * 100 #utile_impresa
1545 
1546  #accorpa_spese_utili
1547  if oS1.getCellRangeByName('S1.H323').Value == 1: oDialog1.getControl('CheckBox4').State = 1
1548  sString = oDialog1.getControl('TextField8')
1549  sString.Text =oS1.getCellRangeByName('S1.H324').Value * 100 #sconto
1550  sString = oDialog1.getControl('TextField9')
1551  sString.Text =oS1.getCellRangeByName('S1.H326').Value * 100 #maggiorazione
1552 
1553  oDialog1.execute() #mostra il dialogo
1554 
1555  if oSheet.getCellByPosition(1, 2).Rows.OptimalHeight == True and oDialog1.getControl("CBDesc").State == 1: #descrizione breve
1556  basic_LeenO('Strutture.Tronca_Altezza_Analisi')
1557  elif oDialog1.getControl("CBDesc").State == 0: adatta_altezza_riga(oSheet.Name)
1558 
1559  #~ sString.Text =oSheet.getCellRangeByName('S1.H321').Value * 100 #utile_impresa
1560  oS1.getCellRangeByName('S1.H319').Value = float(oDialog1.getControl('TextField5').getText().replace(',','.')) / 100
1561  oS1.getCellRangeByName('S1.H320').Value = float(oDialog1.getControl('TextField6').getText().replace(',','.')) / 100 #spese generali
1562  oS1.getCellRangeByName('S1.H321').Value = float(oDialog1.getControl('TextField7').getText().replace(',','.')) / 100 #utile_impresa
1563  oS1.getCellRangeByName('S1.H323').Value = oDialog1.getControl('CheckBox4').State
1564  oS1.getCellRangeByName('S1.H324').Value = float(oDialog1.getControl('TextField8').getText().replace(',','.')) / 100 #sconto
1565  oS1.getCellRangeByName('S1.H326').Value = float(oDialog1.getControl('TextField9').getText().replace(',','.')) / 100 #maggiorazione
1566 
1567  #accorpa_spese_utili
1568  if oS1.getCellRangeByName('S1.H323').Value == 1: oDialog1.getControl('CheckBox4').State = 1
1569  sString = oDialog1.getControl('TextField8')
1570  sString.Text =oS1.getCellRangeByName('S1.H324').Value * 100 #sconto
1571  sString = oDialog1.getControl('TextField9')
1572  sString.Text =oS1.getCellRangeByName('S1.H326').Value * 100 #maggiorazione
1573 
1574  elif oSheet.Name in('CONTABILITA', 'Registro', 'SAL'):
1575  oDialog1 = dp.createDialog("vnd.sun.star.script:UltimusFree2.Dialogviste_N?language=Basic&location=application")
1576  oDialog1Model = oDialog1.Model
1577  oDialog1.execute()
1578 
1579 
1580  refresh(1)
1581  #~ MsgBox('Operazione eseguita con successo!','')
1582 
1583 def genera_variante(arg=None):
1584  '''Genera il foglio di VARIANTE a partire dal COMPUTO'''
1585  oDoc = XSCRIPTCONTEXT.getDocument()
1586  if oDoc.getSheets().hasByName('VARIANTE') == False:
1587  if oDoc.NamedRanges.hasByName("AA") == True:
1588  oDoc.NamedRanges.removeByName("AA")
1589  oDoc.NamedRanges.removeByName("BB")
1590  oDoc.Sheets.copyByName('COMPUTO','VARIANTE', 4)
1591  oSheet = oDoc.getSheets().getByName('COMPUTO')
1592  lRow = getLastUsedCell(oSheet).EndRow
1593  rifa_nomearea('COMPUTO', '$AJ$3:$AJ$' + str(lRow), 'AA')
1594  rifa_nomearea('COMPUTO', '$N$3:$N$' + str(lRow), "BB")
1595  rifa_nomearea('COMPUTO', '$AK$3:$AK$' + str(lRow), "cEuro")
1596  oSheet = oDoc.getSheets().getByName('VARIANTE')
1597  _gotoSheet('VARIANTE')
1598  setTabColor(16777062)
1599  oSheet.getCellByPosition(2,0).String = "VARIANTE"
1600  oSheet.getCellByPosition(2,0).CellStyle = "comp Int_colonna"
1601  oSheet.getCellRangeByName("C1").CellBackColor = 16777062
1602  oSheet.getCellRangeByPosition(0,2,42,2).CellBackColor = 16777062
1603  if DlgSiNo("""Vuoi svuotare la VARIANTE appena generata?
1604 
1605 Se decidi di continuare, cancellerai tutte le voci di
1606 misurazione già presenti in questo elaborato.
1607 Cancello le voci di misurazione?
1608  """,'ATTENZIONE!') ==2:
1609  lrow = uFindStringCol('TOTALI COMPUTO', 2, oSheet) -3
1610  oSheet.Rows.removeByIndex(3, lrow)
1611  _gotoCella(0,2)
1613  adatta_altezza_riga('VARIANTE')
1614  else:
1615  _gotoSheet('VARIANTE')
1616 
1617 def genera_sommario(arg=None):
1618  '''
1619  Genera i sommari in Elenco Prezzi
1620  '''
1621  #~ oDialogo_attesa = dlg_attesa()
1622  #~ attesa().start() #mostra il dialogo
1623  refresh(0)
1624 
1625  oDoc = XSCRIPTCONTEXT.getDocument()
1626  oSheet = oDoc.getSheets().getByName('COMPUTO')
1627  lRow = getLastUsedCell(oSheet).EndRow
1628  rifa_nomearea('COMPUTO', '$AJ$3:$AJ$' + str(lRow), 'AA')
1629  rifa_nomearea('COMPUTO', '$N$3:$N$' + str(lRow), "BB")
1630  rifa_nomearea('COMPUTO', '$AK$3:$AK$' + str(lRow), "cEuro")
1631 
1632  if oDoc.getSheets().hasByName('VARIANTE') == True:
1633  oSheet = oDoc.getSheets().getByName('VARIANTE')
1634  lRow = getLastUsedCell(oSheet).EndRow
1635  rifa_nomearea('VARIANTE', '$AJ$3:$AJ$' + str(lRow), 'varAA')
1636  rifa_nomearea('VARIANTE', '$N$3:$N$' + str(lRow), "varBB")
1637  rifa_nomearea('VARIANTE', '$AK$3:$AK$' + str(lRow), "varEuro")
1638 
1639  if oDoc.getSheets().hasByName('CONTABILITA') == True:
1640  oSheet = oDoc.getSheets().getByName('CONTABILITA')
1641  lRow = getLastUsedCell(oSheet).EndRow
1642  lRow = getLastUsedCell(oDoc.getSheets().getByName('CONTABILITA')).EndRow
1643  rifa_nomearea('CONTABILITA', '$AJ$3:$AJ$' + str(lRow), 'GG')
1644  rifa_nomearea('CONTABILITA', '$S$3:$S$' + str(lRow), "G1G1")
1645  rifa_nomearea('CONTABILITA', '$AK$3:$AK$' + str(lRow), "conEuro")
1646 
1647  formule = list()
1648  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1649  for n in range(4, ultima_voce(oSheet)+2):
1650  stringa =(['=N' + str(n) + '/$N$2',
1651  '=SUMIF(AA;A' + str(n) + ';BB)',
1652  '=SUMIF(AA;A' + str(n) + ';cEuro)',
1653  '', '', '', '', '', '', '', ''])
1654  if oDoc.getSheets().hasByName('VARIANTE') == True:
1655  stringa =(['=N' + str(n) + '/$N$2',
1656  '=SUMIF(AA;A' + str(n) + ';BB)',
1657  '=SUMIF(AA;A' + str(n) + ';cEuro)',
1658  '',
1659  '=R' + str(n) + '/$R$2',
1660  '=SUMIF(varAA;A' + str(n) + ';varBB)',
1661  '=SUMIF(varAA;A' + str(n) + ';varEuro)',
1662  '', '', '',
1663  ''])
1664  if oDoc.getSheets().hasByName('CONTABILITA') == True:
1665  stringa =(['=N' + str(n) + '/$N$2',
1666  '=SUMIF(AA;A' + str(n) + ';BB)',
1667  '=SUMIF(AA;A' + str(n) + ';cEuro)',
1668  '',
1669  '=R' + str(n) + '/$R$2',
1670  '=SUMIF(varAA;A' + str(n) + ';varBB)',
1671  '=SUMIF(varAA;A' + str(n) + ';varEuro)',
1672  '',
1673  '=V' + str(n) + '/$V$2',
1674  '=SUMIF(GG;A' + str(n) + ';G1G1)',
1675  '=SUMIF(GG;A' + str(n) + ';conEuro)'])
1676  elif oDoc.getSheets().hasByName('CONTABILITA') == True:
1677  stringa =(['=N' + str(n) + '/$N$2',
1678  '=SUMIF(AA;A' + str(n) + ';BB)',
1679  '=SUMIF(AA;A' + str(n) + ';cEuro)',
1680  '',
1681  '', '', '',
1682  '',
1683  '=V' + str(n) + '/$V$2',
1684  '=SUMIF(GG;A' + str(n) + ';G1G1)',
1685  '=SUMIF(GG;A' + str(n) + ';conEuro)'])
1686  formule.append(stringa)
1687  oRange = oSheet.getCellRangeByPosition(11, 3, 21, ultima_voce(oSheet))
1688  formule = tuple(formule)
1689  oRange.setFormulaArray(formule)
1690  refresh(1)
1691  adatta_altezza_riga(oSheet.Name)
1692  #~ oDialogo_attesa.endExecute() #chiude il dialogo
1693 
1695  oDoc = XSCRIPTCONTEXT.getDocument()
1696  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1697  oRangeAddress=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1698  IS = oRangeAddress.Sheet
1699  SC = oRangeAddress.StartColumn
1700  EC = oRangeAddress.EndColumn
1701  SR = oRangeAddress.StartRow+1
1702  ER = oRangeAddress.EndRow-1
1703  if ER < SR:
1704  try:
1705  uFindStringCol('Fine elenco', 0, oSheet)
1706  except TypeError:
1708  test = str(uFindStringCol('Fine elenco', 0, oSheet))
1709  rifa_nomearea('Elenco Prezzi', "$A$3:$AF$" + test, 'elenco_prezzi')
1710  rifa_nomearea('Elenco Prezzi', "$A$3:$A$" + test, 'Lista')
1711  oRangeAddress=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1712  ER = oRangeAddress.EndRow-1
1713  oRange = oSheet.getCellRangeByPosition(SC, SR, EC, ER)
1714  oDoc.CurrentController.select(oRange)
1715  ordina_col(1)
1716  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
1717 
1718 def doppioni(arg=None):
1719  oDoc = XSCRIPTCONTEXT.getDocument()
1720  '''
1721  Cancella eventuali voci che si ripetono in Elenco Prezzi
1722  '''
1723  oDoc.CurrentController.ZoomValue = 400
1724  refresh(0)
1725  if oDoc.getSheets().hasByName('Analisi di Prezzo') == True:
1726  lista_tariffe_analisi = list()
1727  oSheet = oDoc.getSheets().getByName('Analisi di Prezzo')
1728  for n in range(0, ultima_voce(oSheet)+1):
1729  if oSheet.getCellByPosition(0, n).CellStyle == 'An-1_sigla':
1730  lista_tariffe_analisi.append(oSheet.getCellByPosition(0, n).String)
1731  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1732 
1733  oRangeAddress=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1734  SR = oRangeAddress.StartRow+1
1735  ER = oRangeAddress.EndRow-1
1736  oRange = oSheet.getCellRangeByPosition(0, SR, 7, ER)
1737 
1738  if oDoc.getSheets().hasByName('Analisi di Prezzo') == True:
1739  for i in reversed(range(SR, ER)):
1740  if oSheet.getCellByPosition(0, i).String in lista_tariffe_analisi:
1741  oSheet.getRows().removeByIndex(i, 1)
1742  oRangeAddress=oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
1743  SR = oRangeAddress.StartRow+1
1744  ER = oRangeAddress.EndRow-1
1745  oRange = oSheet.getCellRangeByPosition(0, SR, 7, ER)
1746  lista_come_array = tuple(set(oRange.getDataArray()))
1747  oSheet.getRows().removeByIndex(SR, ER-SR+1)
1748  lista_tar = list()
1749  oSheet.getRows().insertByIndex(SR, len(set(lista_come_array)))
1750  for el in set(lista_come_array):
1751  lista_tar.append(el[0])
1752  colonne_lista = len(lista_come_array[0]) # numero di colonne necessarie per ospitare i dati
1753  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
1754  oRange = oSheet.getCellRangeByPosition( 0,
1755  3,
1756  colonne_lista + 0 - 1, # l'indice parte da 0
1757  righe_lista + 3 - 1)
1758  oRange.setDataArray(lista_come_array)
1759  oSheet.getCellRangeByPosition(0, 3, 0, righe_lista + 3 - 1).CellStyle = "EP-aS"
1760  oSheet.getCellRangeByPosition(1, 3, 1, righe_lista + 3 - 1).CellStyle = "EP-a"
1761  oSheet.getCellRangeByPosition(2, 3, 7, righe_lista + 3 - 1).CellStyle = "EP-mezzo"
1762  oSheet.getCellRangeByPosition(5, 3, 5, righe_lista + 3 - 1).CellStyle = "EP-mezzo %"
1763  oSheet.getCellRangeByPosition(8, 3, 9, righe_lista + 3 - 1).CellStyle = "EP-sfondo"
1764 
1765  oSheet.getCellRangeByPosition(11, 3, 11, righe_lista + 3 - 1).CellStyle = 'EP-mezzo %'
1766  oSheet.getCellRangeByPosition(12, 3, 12, righe_lista + 3 - 1).CellStyle = 'EP statistiche_q'
1767  oSheet.getCellRangeByPosition(13, 3, 13, righe_lista + 3 - 1).CellStyle = 'EP statistiche_Contab_q'
1768  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
1769  if oDoc.getSheets().hasByName('Analisi di Prezzo') == True:
1771  refresh(1)
1772  oDoc.CurrentController.ZoomValue = 100
1773  adatta_altezza_riga(oSheet.Name)
1775  if len(set(lista_tar)) != len(set(lista_come_array)):
1776  MsgBox('Ci sono ancora 2 o più voci che hanno lo stesso Codice Articolo, pur essendo diverse.', 'C o n t r o l l a!')
1777 
1779 def XPWE_out(arg=None):
1780  '''
1781  esporta il documento in formato XPWE
1782  '''
1783  oDoc = XSCRIPTCONTEXT.getDocument()
1784  oDialogo_attesa = dlg_attesa('LETTURA DATI IN CORSO...')
1785  attesa().start() #mostra il dialogo
1786 
1787  if oDoc.getSheets().hasByName('S2') == False:
1788  MsgBox('Puoi usare questo comando da un file di computo esistente.','Avviso!')
1789  return
1790  dettaglio_misure(0)
1791  numera_voci(1)
1792  top = Element('PweDocumento')
1793 #~ dati generali
1794  PweDatiGenerali = SubElement(top,'PweDatiGenerali')
1795  PweMisurazioni = SubElement(top,'PweMisurazioni')
1796  PweDGProgetto = SubElement(PweDatiGenerali,'PweDGProgetto')
1797  PweDGDatiGenerali = SubElement(PweDGProgetto,'PweDGDatiGenerali')
1798  PercPrezzi = SubElement(PweDGDatiGenerali,'PercPrezzi')
1799  PercPrezzi.text = '0'
1800 
1801  Comune = SubElement(PweDGDatiGenerali,'Comune')
1802  Provincia = SubElement(PweDGDatiGenerali,'Provincia')
1803  Oggetto = SubElement(PweDGDatiGenerali,'Oggetto')
1804  Committente = SubElement(PweDGDatiGenerali,'Committente')
1805  Impresa = SubElement(PweDGDatiGenerali,'Impresa')
1806  ParteOpera = SubElement(PweDGDatiGenerali,'ParteOpera')
1807 #~ leggo i dati generali
1808  oSheet = oDoc.getSheets().getByName('S2')
1809  Comune.text = oSheet.getCellByPosition(2, 3).String
1810  Provincia.text = ''
1811  Oggetto.text = oSheet.getCellByPosition(2, 2).String
1812  Committente.text = oSheet.getCellByPosition(2, 5).String
1813  Impresa.text = oSheet.getCellByPosition(2, 16).String
1814  ParteOpera.text = ''
1815 #~ Capitoli e Categorie
1816  PweDGCapitoliCategorie = SubElement(PweDatiGenerali,'PweDGCapitoliCategorie')
1817 
1818 #~ SuperCategorie
1819  oSheet = oDoc.getSheets().getByName(arg)
1820  lastRow = ultima_voce(oSheet)+1
1821  # evito di esportare in SuperCategorie perché inutile, almeno per ora
1822  listaspcat = list()
1823  PweDGSuperCategorie = SubElement(PweDGCapitoliCategorie,'PweDGSuperCategorie')
1824  for n in range(0, lastRow):
1825  if oSheet.getCellByPosition(1, n).CellStyle == 'Livello-0-scritta':
1826  desc = oSheet.getCellByPosition(2, n).String
1827  if desc not in listaspcat:
1828  listaspcat.append(desc)
1829  idID = str(listaspcat.index(desc) +1)
1830 
1831  #~ PweDGSuperCategorie = SubElement(PweDGCapitoliCategorie,'PweDGSuperCategorie')
1832  DGSuperCategorieItem = SubElement(PweDGSuperCategorie,'DGSuperCategorieItem')
1833  DesSintetica = SubElement(DGSuperCategorieItem,'DesSintetica')
1834 
1835  DesEstesa = SubElement(DGSuperCategorieItem,'DesEstesa')
1836  DataInit = SubElement(DGSuperCategorieItem,'DataInit')
1837  Durata = SubElement(DGSuperCategorieItem,'Durata')
1838  CodFase = SubElement(DGSuperCategorieItem,'CodFase')
1839  Percentuale = SubElement(DGSuperCategorieItem,'Percentuale')
1840  Codice = SubElement(DGSuperCategorieItem,'Codice')
1841 
1842  DGSuperCategorieItem.set('ID', idID)
1843  DesSintetica.text = desc
1844  DataInit.text = oggi()
1845  Durata.text = '0'
1846  Percentuale.text = '0'
1847 
1848 #~ Categorie
1849  listaCat = list()
1850  PweDGCategorie = SubElement(PweDGCapitoliCategorie,'PweDGCategorie')
1851  for n in range(0,lastRow):
1852  if oSheet.getCellByPosition(2, n).CellStyle == 'Livello-1-scritta mini':
1853  desc = oSheet.getCellByPosition(2, n).String
1854  if desc not in listaCat:
1855  listaCat.append(desc)
1856  idID = str(listaCat.index(desc) +1)
1857 
1858  #~ PweDGCategorie = SubElement(PweDGCapitoliCategorie,'PweDGCategorie')
1859  DGCategorieItem = SubElement(PweDGCategorie,'DGCategorieItem')
1860  DesSintetica = SubElement(DGCategorieItem,'DesSintetica')
1861 
1862  DesEstesa = SubElement(DGCategorieItem,'DesEstesa')
1863  DataInit = SubElement(DGCategorieItem,'DataInit')
1864  Durata = SubElement(DGCategorieItem,'Durata')
1865  CodFase = SubElement(DGCategorieItem,'CodFase')
1866  Percentuale = SubElement(DGCategorieItem,'Percentuale')
1867  Codice = SubElement(DGCategorieItem,'Codice')
1868 
1869  DGCategorieItem.set('ID', idID)
1870  DesSintetica.text = desc
1871  DataInit.text = oggi()
1872  Durata.text = '0'
1873  Percentuale.text = '0'
1874 
1875 #~ SubCategorie
1876  listasbCat = list()
1877  PweDGSubCategorie = SubElement(PweDGCapitoliCategorie,'PweDGSubCategorie')
1878  for n in range(0,lastRow):
1879  if oSheet.getCellByPosition(2, n).CellStyle == 'livello2_':
1880  desc = oSheet.getCellByPosition(2, n).String
1881  if desc not in listasbCat:
1882  listasbCat.append(desc)
1883  idID = str(listasbCat.index(desc) +1)
1884 
1885  #~ PweDGSubCategorie = SubElement(PweDGCapitoliCategorie,'PweDGSubCategorie')
1886  DGSubCategorieItem = SubElement(PweDGSubCategorie,'DGSubCategorieItem')
1887  DesSintetica = SubElement(DGSubCategorieItem,'DesSintetica')
1888 
1889  DesEstesa = SubElement(DGSubCategorieItem,'DesEstesa')
1890  DataInit = SubElement(DGSubCategorieItem,'DataInit')
1891  Durata = SubElement(DGSubCategorieItem,'Durata')
1892  CodFase = SubElement(DGSubCategorieItem,'CodFase')
1893  Percentuale = SubElement(DGSubCategorieItem,'Percentuale')
1894  Codice = SubElement(DGSubCategorieItem,'Codice')
1895 
1896  DGSubCategorieItem.set('ID', idID)
1897  DesSintetica.text = desc
1898  DataInit.text = oggi()
1899  Durata.text = '0'
1900  Percentuale.text = '0'
1901 
1902 #~ Moduli
1903  PweDGModuli = SubElement(PweDatiGenerali,'PweDGModuli')
1904  PweDGAnalisi = SubElement(PweDGModuli,'PweDGAnalisi')
1905  SpeseUtili = SubElement(PweDGAnalisi,'SpeseUtili')
1906  SpeseGenerali = SubElement(PweDGAnalisi,'SpeseGenerali')
1907  UtiliImpresa = SubElement(PweDGAnalisi,'UtiliImpresa')
1908  OneriAccessoriSc = SubElement(PweDGAnalisi,'OneriAccessoriSc')
1909  ConfQuantita = SubElement(PweDGAnalisi,'ConfQuantita')
1910 
1911  oSheet = oDoc.getSheets().getByName('S1')
1912  if oSheet.getCellByPosition(7,322).Value ==0: # se 0: Spese e Utili Accorpati
1913  SpeseUtili.text = '1'
1914  else:
1915  SpeseUtili.text = '-1'
1916 
1917  UtiliImpresa.text = oSheet.getCellByPosition(7,320).String[:-1].replace(',','.')
1918  OneriAccessoriSc.text = oSheet.getCellByPosition(7,318).String[:-1].replace(',','.')
1919  SpeseGenerali.text = oSheet.getCellByPosition(7,319).String[:-1].replace(',','.')
1920 
1921 #~ Configurazioni
1922  PU = str(len(getFormatString('comp 1-a PU').split(',')[-1]))
1923  LUN = str(len(getFormatString('comp 1-a LUNG').split(',')[-1]))
1924  LAR = str(len(getFormatString('comp 1-a LARG').split(',')[-1]))
1925  PES = str(len(getFormatString('comp 1-a peso').split(',')[-1]))
1926  QUA = str(len(getFormatString('Blu').split(',')[-1]))
1927  PR = str(len(getFormatString('comp sotto Unitario').split(',')[-1]))
1928  TOT = str(len(getFormatString('An-1v-dx').split(',')[-1]))
1929  PweDGConfigurazione = SubElement(PweDatiGenerali,'PweDGConfigurazione')
1930  PweDGConfigNumeri = SubElement(PweDGConfigurazione,'PweDGConfigNumeri')
1931  Divisa = SubElement(PweDGConfigNumeri,'Divisa')
1932  Divisa.text = 'euro'
1933  ConversioniIN = SubElement(PweDGConfigNumeri,'ConversioniIN')
1934  ConversioniIN.text = 'lire'
1935  FattoreConversione = SubElement(PweDGConfigNumeri,'FattoreConversione')
1936  FattoreConversione.text = '1936.27'
1937  Cambio = SubElement(PweDGConfigNumeri,'Cambio')
1938  Cambio.text = '1'
1939  PartiUguali = SubElement(PweDGConfigNumeri,'PartiUguali')
1940  PartiUguali.text = '9.' + PU + '|0'
1941  Lunghezza = SubElement(PweDGConfigNumeri,'Lunghezza')
1942  Lunghezza.text = '9.'+ LUN + '|0'
1943  Larghezza = SubElement(PweDGConfigNumeri,'Larghezza')
1944  Larghezza.text = '9.'+ LAR + '|0'
1945  HPeso = SubElement(PweDGConfigNumeri,'HPeso')
1946  HPeso.text = '9.' + PES + '|0'
1947  Quantita = SubElement(PweDGConfigNumeri,'Quantita')
1948  Quantita.text = '10.'+ QUA + '|1'
1949  Prezzi = SubElement(PweDGConfigNumeri,'Prezzi')
1950  Prezzi.text = '10.' + PR + '|1'
1951  PrezziTotale = SubElement(PweDGConfigNumeri,'PrezziTotale')
1952  PrezziTotale.text = '14.'+ TOT +'|1'
1953  ConvPrezzi = SubElement(PweDGConfigNumeri,'ConvPrezzi')
1954  ConvPrezzi.text = '11.0|1'
1955  ConvPrezziTotale = SubElement(PweDGConfigNumeri,'ConvPrezziTotale')
1956  ConvPrezziTotale.text = '15.0|1'
1957  IncidenzaPercentuale = SubElement(PweDGConfigNumeri,'IncidenzaPercentuale')
1958  IncidenzaPercentuale.text = '7.3|0'
1959  Aliquote = SubElement(PweDGConfigNumeri,'Aliquote')
1960  Aliquote.text = '7.3|0'
1961 
1962 #~ Elenco Prezzi
1963  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1964  PweElencoPrezzi = SubElement(PweMisurazioni,'PweElencoPrezzi')
1965  diz_ep = dict()
1966  lista_AP = list()
1967  for n in range(3, getLastUsedCell(oSheet).EndRow):
1968  if oSheet.getCellByPosition(1, n).Type.value == 'TEXT' and \
1969  oSheet.getCellByPosition(2, n).Type.value == 'TEXT':
1970  EPItem = SubElement(PweElencoPrezzi,'EPItem')
1971  EPItem.set('ID', str(n))
1972  TipoEP = SubElement(EPItem,'TipoEP')
1973  TipoEP.text = '0'
1974  Tariffa = SubElement(EPItem,'Tariffa')
1975  id_tar = str(n)
1976  Tariffa.text = oSheet.getCellByPosition(0, n).String
1977  diz_ep[oSheet.getCellByPosition(0, n).String] = id_tar
1978  Articolo = SubElement(EPItem,'Articolo')
1979  Articolo.text = ''
1980  DesEstesa = SubElement(EPItem,'DesEstesa')
1981  DesEstesa.text = oSheet.getCellByPosition(1, n).String
1982  DesRidotta = SubElement(EPItem,'DesRidotta')
1983  if len(DesEstesa.text) > 120:
1984  DesRidotta.text = DesEstesa.text[:60] + ' ... ' + DesEstesa.text[-60:]
1985  else:
1986  DesRidotta.text = DesEstesa.text
1987  DesBreve = SubElement(EPItem,'DesBreve')
1988  if len(DesEstesa.text) > 60:
1989  DesBreve.text = DesEstesa.text[:30] + ' ... ' + DesEstesa.text[-30:]
1990  else:
1991  DesBreve.text = DesEstesa.text
1992  UnMisura = SubElement(EPItem,'UnMisura')
1993  UnMisura.text = oSheet.getCellByPosition(2, n).String
1994  Prezzo1 = SubElement(EPItem,'Prezzo1')
1995  Prezzo1.text = str(oSheet.getCellByPosition(4, n).Value)
1996  Prezzo2 = SubElement(EPItem,'Prezzo2')
1997  Prezzo2.text = '0'
1998  Prezzo3 = SubElement(EPItem,'Prezzo3')
1999  Prezzo3.text = '0'
2000  Prezzo4 = SubElement(EPItem,'Prezzo4')
2001  Prezzo4.text = '0'
2002  Prezzo5 = SubElement(EPItem,'Prezzo5')
2003  Prezzo5.text = '0'
2004  IDSpCap = SubElement(EPItem,'IDSpCap')
2005  IDSpCap.text = '0'
2006  IDCap = SubElement(EPItem,'IDCap')
2007  IDCap.text = '0'
2008  IDSbCap = SubElement(EPItem,'IDSbCap')
2009  IDSbCap.text = '0'
2010  Flags = SubElement(EPItem,'Flags')
2011  if oSheet.getCellByPosition(8, n).String == '(AP)':
2012  Flags.text = '131072'
2013  else:
2014  Flags.text = '0'
2015  Data = SubElement(EPItem,'Data')
2016  Data.text = '30/12/1899'
2017  AdrInternet = SubElement(EPItem,'AdrInternet')
2018  AdrInternet.text = ''
2019  PweEPAnalisi = SubElement(EPItem,'PweEPAnalisi')
2020 
2021  IncSIC = SubElement(EPItem,'IncSIC')
2022  if oSheet.getCellByPosition(3, n).Value == 0.0:
2023  IncSIC.text = ''
2024  else:
2025  IncSIC.text = str(oSheet.getCellByPosition(3, n).Value * 100)
2026 
2027  IncMDO = SubElement(EPItem,'IncMDO')
2028  if oSheet.getCellByPosition(5, n).Value == 0.0:
2029  IncMDO.text = ''
2030  else:
2031  IncMDO.text = str(oSheet.getCellByPosition(5, n).Value * 100)
2032 
2033  IncMAT = SubElement(EPItem,'IncMAT')
2034  if oSheet.getCellByPosition(6, n).Value == 0.0:
2035  IncMAT.text = ''
2036  else:
2037  IncMAT.text = str(oSheet.getCellByPosition(6, n).Value * 100)
2038 
2039  IncATTR = SubElement(EPItem,'IncATTR')
2040  if oSheet.getCellByPosition(7, n).Value == 0.0:
2041  IncATTR.text = ''
2042  else:
2043  IncATTR.text = str(oSheet.getCellByPosition(7, n).Value * 100)
2044 
2045  elif oSheet.getCellByPosition(1, n).Type.value == 'FORMULA' and \
2046  oSheet.getCellByPosition(2, n).Type.value == 'FORMULA':
2047  lista_AP.append(oSheet.getCellByPosition(0, n).String)
2048 #Analisi di prezzo
2049  if len(lista_AP) != 0:
2050  k = n+1
2051  oSheet = oDoc.getSheets().getByName('Analisi di Prezzo')
2052  for el in lista_AP:
2053  try:
2054  n =(uFindStringCol(el, 0, oSheet))
2055  EPItem = SubElement(PweElencoPrezzi,'EPItem')
2056  EPItem.set('ID', str(k))
2057  TipoEP = SubElement(EPItem,'TipoEP')
2058  TipoEP.text = '0'
2059  Tariffa = SubElement(EPItem,'Tariffa')
2060  id_tar = str(k)
2061  Tariffa.text = oSheet.getCellByPosition(0, n).String
2062  diz_ep[oSheet.getCellByPosition(0, n).String] = id_tar
2063  Articolo = SubElement(EPItem,'Articolo')
2064  Articolo.text = ''
2065  DesEstesa = SubElement(EPItem,'DesEstesa')
2066  DesEstesa.text = oSheet.getCellByPosition(1, n).String
2067  DesRidotta = SubElement(EPItem,'DesRidotta')
2068  if len(DesEstesa.text) > 120:
2069  DesRidotta.text = DesEstesa.text[:60] + ' ... ' + DesEstesa.text[-60:]
2070  else:
2071  DesRidotta.text = DesEstesa.text
2072  DesBreve = SubElement(EPItem,'DesBreve')
2073  if len(DesEstesa.text) > 60:
2074  DesBreve.text = DesEstesa.text[:30] + ' ... ' + DesEstesa.text[-30:]
2075  else:
2076  DesBreve.text = DesEstesa.text
2077 
2078  UnMisura = SubElement(EPItem,'UnMisura')
2079  UnMisura.text = oSheet.getCellByPosition(2, n).String
2080  Prezzo1 = SubElement(EPItem,'Prezzo1')
2081  Prezzo1.text = str(oSheet.getCellByPosition(6, n).Value)
2082  Prezzo2 = SubElement(EPItem,'Prezzo2')
2083  Prezzo2.text = '0'
2084  Prezzo3 = SubElement(EPItem,'Prezzo3')
2085  Prezzo3.text = '0'
2086  Prezzo4 = SubElement(EPItem,'Prezzo4')
2087  Prezzo4.text = '0'
2088  Prezzo5 = SubElement(EPItem,'Prezzo5')
2089  Prezzo5.text = '0'
2090  IDSpCap = SubElement(EPItem,'IDSpCap')
2091  IDSpCap.text = '0'
2092  IDCap = SubElement(EPItem,'IDCap')
2093  IDCap.text = '0'
2094  IDSbCap = SubElement(EPItem,'IDSbCap')
2095  IDSbCap.text = '0'
2096  Flags = SubElement(EPItem,'Flags')
2097  Flags.text = '131072'
2098  Data = SubElement(EPItem,'Data')
2099  Data.text = '30/12/1899'
2100  AdrInternet = SubElement(EPItem,'AdrInternet')
2101  AdrInternet.text = ''
2102  PweEPAnalisi = SubElement(EPItem,'PweEPAnalisi')
2103  PweEPAR = SubElement(PweEPAnalisi,'PweEPAR')
2104  nEPARItem = 2
2105  for x in range(n, n+100):
2106  if oSheet.getCellByPosition(0, x).CellStyle == 'An-lavoraz-desc':
2107  EPARItem = SubElement(PweEPAR,'EPARItem')
2108  EPARItem.set('ID', str(nEPARItem))
2109  nEPARItem += 1
2110  Tipo = SubElement(EPARItem,'Tipo')
2111  Tipo.text = '0'
2112  IDEP = SubElement(EPARItem,'IDEP')
2113  IDEP.text = diz_ep.get(oSheet.getCellByPosition(0, x).String)
2114  if IDEP.text == None:
2115  IDEP.text ='-2'
2116  Descrizione = SubElement(EPARItem,'Descrizione')
2117  if '=IF(' in oSheet.getCellByPosition(1, x).String:
2118  Descrizione.text = ''
2119  else:
2120  Descrizione.text = oSheet.getCellByPosition(1, x).String
2121  Misura = SubElement(EPARItem,'Misura')
2122  Misura.text = ''
2123  Qt = SubElement(EPARItem,'Qt')
2124  Qt.text = ''
2125  Prezzo = SubElement(EPARItem,'Prezzo')
2126  Prezzo.text = ''
2127  FieldCTL = SubElement(EPARItem,'FieldCTL')
2128  FieldCTL.text = '0'
2129  if oSheet.getCellByPosition(0, x).CellStyle == 'An-lavoraz-Cod-sx' and \
2130  oSheet.getCellByPosition(1, x).String != '':
2131  EPARItem = SubElement(PweEPAR,'EPARItem')
2132  EPARItem.set('ID', str(nEPARItem))
2133  nEPARItem += 1
2134  Tipo = SubElement(EPARItem,'Tipo')
2135  Tipo.text = '1'
2136  IDEP = SubElement(EPARItem,'IDEP')
2137  IDEP.text = diz_ep.get(oSheet.getCellByPosition(0, x).String)
2138  if IDEP.text == None:
2139  IDEP.text ='-2'
2140  Descrizione = SubElement(EPARItem,'Descrizione')
2141  if '=IF(' in oSheet.getCellByPosition(1, x).String:
2142  Descrizione.text = ''
2143  else:
2144  Descrizione.text = oSheet.getCellByPosition(1, x).String
2145  Misura = SubElement(EPARItem,'Misura')
2146  Misura.text = oSheet.getCellByPosition(2, x).String
2147  Qt = SubElement(EPARItem,'Qt')
2148  Qt.text = oSheet.getCellByPosition(3, x).String.replace(',','.')
2149  Prezzo = SubElement(EPARItem,'Prezzo')
2150  Prezzo.text = str(oSheet.getCellByPosition(4, x).Value).replace(',','.')
2151  FieldCTL = SubElement(EPARItem,'FieldCTL')
2152  FieldCTL.text = '0'
2153  elif oSheet.getCellByPosition(0, x).CellStyle == 'An-sfondo-basso Att End':
2154  break
2155 
2156  IncSIC = SubElement(EPItem,'IncSIC')
2157  if oSheet.getCellByPosition(10, n).Value == 0.0:
2158  IncSIC.text = ''
2159  else:
2160  IncSIC.text = str(oSheet.getCellByPosition(10, n).Value)
2161 
2162  IncMDO = SubElement(EPItem,'IncMDO')
2163  if oSheet.getCellByPosition(8, n).Value == 0.0:
2164  IncMDO.text = ''
2165  else:
2166  IncMDO.text = str(oSheet.getCellByPosition(5, n).Value * 100)
2167  k += 1
2168  except:
2169  pass
2170 #COMPUTO/VARIANTE
2171  oSheet = oDoc.getSheets().getByName(arg)
2172  PweVociComputo = SubElement(PweMisurazioni,'PweVociComputo')
2173  oDoc.CurrentController.setActiveSheet(oSheet)
2174  #~ oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
2175  nVCItem = 2
2176  for n in range(0, ultima_voce(oSheet)):
2177  if oSheet.getCellByPosition(0, n).CellStyle == 'Comp Start Attributo':
2178  sStRange = Circoscrive_Voce_Computo_Att(n)
2179  sStRange.RangeAddress
2180  sopra = sStRange.RangeAddress.StartRow
2181  sotto = sStRange.RangeAddress.EndRow
2182 
2183  VCItem = SubElement(PweVociComputo,'VCItem')
2184  VCItem.set('ID', str(nVCItem))
2185  nVCItem += 1
2186 
2187  IDEP = SubElement(VCItem,'IDEP')
2188  IDEP.text = diz_ep.get(oSheet.getCellByPosition(1, sopra+1).String)
2189 
2190  Quantita = SubElement(VCItem,'Quantita')
2191  Quantita.text = oSheet.getCellByPosition(9, sotto).String
2192 
2193  DataMis = SubElement(VCItem,'DataMis')
2194  DataMis.text = oggi() #'26/12/1952'#'28/09/2013'###
2195  vFlags = SubElement(VCItem,'Flags')
2196  vFlags.text = '0'
2197 
2198  IDSpCat = SubElement(VCItem,'IDSpCat')
2199  IDSpCat.text = str(oSheet.getCellByPosition(31, sotto).String)
2200  if IDSpCat.text == '':
2201  IDSpCat.text = '0'
2202 
2203  IDCat = SubElement(VCItem,'IDCat')
2204  IDCat.text = str(oSheet.getCellByPosition(32, sotto).String)
2205  if IDCat.text == '':
2206  IDCat.text = '0'
2207 
2208  IDSbCat = SubElement(VCItem,'IDSbCat')
2209  IDSbCat.text = str(oSheet.getCellByPosition(33, sotto).String)
2210  if IDSbCat.text == '':
2211  IDSbCat.text = '0'
2212 
2213  PweVCMisure = SubElement(VCItem,'PweVCMisure')
2214  for m in range(sopra+2, sotto):
2215  RGItem = SubElement(PweVCMisure,'RGItem')
2216  x = 2
2217  RGItem.set('ID', str(x))
2218  x += 1
2219 
2220  IDVV = SubElement(RGItem,'IDVV')
2221  IDVV.text = '-2'
2222 
2223  Descrizione = SubElement(RGItem,'Descrizione')
2224  Descrizione.text = oSheet.getCellByPosition(2, m).String
2225 
2226  PartiUguali = SubElement(RGItem,'PartiUguali')
2227  PartiUguali.text = valuta_cella(oSheet.getCellByPosition(5, m))
2228 
2229  Lunghezza = SubElement(RGItem,'Lunghezza')
2230  Lunghezza.text = valuta_cella(oSheet.getCellByPosition(6, m))
2231 
2232  Larghezza = SubElement(RGItem,'Larghezza')
2233  Larghezza.text = valuta_cella(oSheet.getCellByPosition(7, m))
2234 
2235  HPeso = SubElement(RGItem,'HPeso')
2236  HPeso.text = valuta_cella(oSheet.getCellByPosition(8, m))
2237 
2238  Quantita = SubElement(RGItem,'Quantita')
2239  Quantita.text = str(oSheet.getCellByPosition(9, m).Value)
2240 
2241  if PartiUguali.text == '' and Lunghezza.text == '' and Larghezza.text == '' and HPeso.text == '':
2242  PartiUguali.text = Quantita.text
2243  Flags = SubElement(RGItem,'Flags')
2244  if '*** VOCE AZZERATA ***' in Descrizione.text:
2245  PartiUguali.text = str(abs(float(valuta_cella(oSheet.getCellByPosition(5, m)))))
2246  Flags.text = '1'
2247  elif '-' in Quantita.text:
2248  Flags.text = '1'
2249  elif "Parziale [" in oSheet.getCellByPosition(8, m).String:
2250  Flags.text = '2'
2251  HPeso.text = ''
2252  elif 'PARTITA IN CONTO PROVVISORIO' in Descrizione.text:
2253  Flags.text = '16'
2254  else:
2255  Flags.text = '0'
2256 
2257  if 'DETRAE LA PARTITA IN CONTO PROVVISORIO' in Descrizione.text:
2258  Flags.text = '32'
2259  if '- vedi voce n.' in Descrizione.text:
2260  IDVV.text = str(int(Descrizione.text.split('- vedi voce n.')[1].split(' ')[0])+1)
2261  Flags.text = '32768'
2262  #~ PartiUguali.text =''
2263  if '-' in Quantita.text:
2264  Flags.text = '32769'
2265  n = sotto+1
2266 
2267  oDialogo_attesa.endExecute()
2268  out_file = filedia('Salva con nome...', '*.xpwe', 1)
2269  # ~out_file = uno.fileUrlToSystemPath(oDoc.getURL())
2270  # ~mri (uno.fileUrlToSystemPath(oDoc.getURL()))
2271  # ~chi(out_file)
2272  dettaglio_misure(1)
2273  try:
2274  if out_file.split('.')[-1].upper() != 'XPWE':
2275  out_file = out_file + '-'+ arg + '.xpwe'
2276  except AttributeError:
2277  return
2278  riga = str(tostring(top, encoding="unicode"))
2279  #~ if len(lista_AP) != 0:
2280  #~ riga = riga.replace('<PweDatiGenerali>','<Fgs>131072</Fgs><PweDatiGenerali>')
2281  try:
2282  of = codecs.open(out_file,'w','utf-8')
2283  of.write(riga)
2284  MsgBox('Esportazione in formato XPWE eseguita con successo\nsul file ' + out_file + '!','Avviso.')
2285  except:
2286  MsgBox('Esportazione non eseguita!\n\nVerifica che il file di destinazione non sia già in uso!','E R R O R E !')
2287 
2288 def firme_in_calce_run(arg=None):
2289  oDialogo_attesa = dlg_attesa()# avvia il diaolgo di attesa che viene chiuso alla fine con
2290  '''
2291  Inserisce(in COMPUTO o VARIANTE) un riepilogo delle categorie
2292  ed i dati necessari alle firme
2293  '''
2294  oDoc = XSCRIPTCONTEXT.getDocument()
2295 
2296  oSheet = oDoc.CurrentController.ActiveSheet
2297  if oSheet.Name in('Analisi di Prezzo', 'Elenco Prezzi'):
2298  lRowF = ultima_voce(oSheet)+1
2299  oDoc.CurrentController.setFirstVisibleRow(lRowF-1)
2300  lRowE = getLastUsedCell(oSheet).EndRow
2301  for i in range(lRowF, getLastUsedCell(oSheet).EndRow+1):
2302  if oSheet.getCellByPosition(0, i).CellStyle == "Riga_rossa_Chiudi":
2303  lRowE = i
2304  break
2305  if lRowE > lRowF+1:
2306  oSheet.getRows().removeByIndex(lRowF, lRowE-lRowF)
2307  riga_corrente = lRowF+1
2308  oSheet.getRows().insertByIndex(lRowF, 15)
2309  oSheet.getCellRangeByPosition(0,lRowF,100,lRowF+15-1).CellStyle = "Ultimus_centro"
2310  #~ raggruppo i righi di mirura
2311  iSheet = oSheet.RangeAddress.Sheet
2312  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
2313  oCellRangeAddr.Sheet = iSheet
2314  oCellRangeAddr.StartColumn = 0
2315  oCellRangeAddr.EndColumn = 0
2316  oCellRangeAddr.StartRow = lRowF
2317  oCellRangeAddr.EndRow = lRowF+15-1
2318  oSheet.group(oCellRangeAddr, 1)
2319 
2320 #~ INSERISCI LA DATA E IL PROGETTISTA
2321  oSheet.getCellByPosition(1 , riga_corrente+3).Formula = '=CONCATENATE("Data, ";TEXT(NOW();"GG/MM/AAAA"))'
2322  #~ consolido il risultato
2323  oRange = oSheet.getCellByPosition(1 , riga_corrente+3)
2324  flags =(oDoc.createInstance('com.sun.star.sheet.CellFlags.FORMULA'))
2325  aSaveData = oRange.getDataArray()
2326  oRange.setDataArray(aSaveData)
2327  oSheet.getCellRangeByPosition(1,riga_corrente+3,1,riga_corrente+3).CellStyle = 'ULTIMUS'
2328  oSheet.getCellByPosition(1 , riga_corrente+5).Formula = 'Il Progettista'
2329  oSheet.getCellByPosition(1 , riga_corrente+6).Formula = '=CONCATENATE($S2.$C$13)'
2330 
2331  if oSheet.Name in('COMPUTO', 'VARIANTE', 'CompuM_NoP'):
2332  oDoc.CurrentController.ZoomValue = 400
2333 
2334  attesa().start()
2335  lRowF = ultima_voce(oSheet)+2
2336 
2337  oDoc.CurrentController.setFirstVisibleRow(lRowF-2)
2338  lRowE = getLastUsedCell(oSheet).EndRow
2339  for i in range(lRowF, getLastUsedCell(oSheet).EndRow+1):
2340  if oSheet.getCellByPosition(0, i).CellStyle == "Riga_rossa_Chiudi":
2341  lRowE = i
2342  break
2343  if lRowE > lRowF+1:
2344  oSheet.getRows().removeByIndex(lRowF, lRowE-lRowF)
2345  riga_corrente = lRowF+2
2346  if oDoc.getSheets().hasByName('S2') == True:
2347  ii = 11
2348  vv = 18
2349  ac = 28
2350  ad = 29
2351  ae = 30
2352  ss = 41
2353  col ='S'
2354  else:
2355  ii = 8
2356  vv = 9
2357  ss = 9
2358  col ='J'
2359  oSheet.getRows().insertByIndex(lRowF, 17)
2360  oSheet.getCellRangeByPosition(0, lRowF, ss, lRowF+17-1).CellStyle = 'ULTIMUS'
2361  # raggruppo i righi di mirura
2362  iSheet = oSheet.RangeAddress.Sheet
2363  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
2364  oCellRangeAddr.Sheet = iSheet
2365  oCellRangeAddr.StartColumn = 0
2366  oCellRangeAddr.EndColumn = 0
2367  oCellRangeAddr.StartRow = lRowF
2368  oCellRangeAddr.EndRow = lRowF+17-1
2369  oSheet.group(oCellRangeAddr, 1)
2370 
2371  #~ INSERIMENTO TITOLO
2372  oSheet.getCellByPosition(2 , riga_corrente).String = 'Riepilogo strutturale delle Categorie'
2373  oSheet.getCellByPosition(ii , riga_corrente).String = 'Incidenze %'
2374  oSheet.getCellByPosition(vv , riga_corrente).String = 'Importi €'
2375  oSheet.getCellByPosition(ac , riga_corrente).String = 'Materiali\ne Noli €'
2376  oSheet.getCellByPosition(ad , riga_corrente).String = 'Incidenza\nMDO %'
2377  oSheet.getCellByPosition(ae , riga_corrente).String = 'Importo\nMDO €'
2378  inizio_gruppo = riga_corrente
2379  riga_corrente += 1
2380  for i in range(0, lRowF):
2381  if oSheet.getCellByPosition(1 , i).CellStyle == 'Livello-0-scritta':
2382  oSheet.getRows().insertByIndex(riga_corrente,1)
2383  oSheet.getCellRangeByPosition(0, riga_corrente, 30, riga_corrente).CellStyle = 'ULTIMUS_1'
2384  oSheet.getCellByPosition(1 , riga_corrente).Formula = '=B' + str(i+1)
2385  oSheet.getCellByPosition(1 , riga_corrente).CellStyle = 'Ultimus_destra_1'
2386  oSheet.getCellByPosition(2 , riga_corrente).Formula = '=C' + str(i+1)
2387  oSheet.getCellByPosition(ii , riga_corrente).Formula = '=' + col + str(riga_corrente+1) + '/' + col + str(lRowF) + '*100'
2388  oSheet.getCellByPosition(ii, riga_corrente).CellStyle = 'Ultimus %_1'
2389  oSheet.getCellByPosition(vv , riga_corrente).Formula = '='+ col + str(i+1)
2390  oSheet.getCellRangeByPosition(vv , riga_corrente, ae , riga_corrente).CellStyle = 'Ultimus_totali_1'
2391  oSheet.getCellByPosition(ac , riga_corrente).Formula = '=AC'+ str(i+1)
2392  oSheet.getCellByPosition(ad , riga_corrente).Formula = '=AD'+ str(i+1) + '*100'
2393  oSheet.getCellByPosition(ad, riga_corrente).CellStyle = 'Ultimus %_1'
2394  oSheet.getCellByPosition(ae , riga_corrente).Formula = '=AE'+ str(i+1)
2395  riga_corrente += 1
2396  elif oSheet.getCellByPosition(1 , i).CellStyle == 'Livello-1-scritta':
2397  oSheet.getRows().insertByIndex(riga_corrente,1)
2398  oSheet.getCellRangeByPosition(0, riga_corrente, 30, riga_corrente).CellStyle = 'ULTIMUS_2'
2399  oSheet.getCellByPosition(1 , riga_corrente).Formula = '=B' + str(i+1)
2400  oSheet.getCellByPosition(1 , riga_corrente).CellStyle = 'Ultimus_destra'
2401  oSheet.getCellByPosition(2 , riga_corrente).Formula = '=C' + str(i+1)
2402  oSheet.getCellByPosition(ii , riga_corrente).Formula = '=' + col + str(riga_corrente+1) + '/' + col + str(lRowF) + '*100'
2403  oSheet.getCellByPosition(ii, riga_corrente).CellStyle = 'Ultimus %'
2404  oSheet.getCellByPosition(vv , riga_corrente).Formula = '='+ col + str(i+1)
2405  oSheet.getCellByPosition(vv , riga_corrente).CellStyle = 'Ultimus_bordo'
2406  oSheet.getCellByPosition(ac , riga_corrente).Formula = '=AC'+ str(i+1)
2407  oSheet.getCellByPosition(ad , riga_corrente).Formula = '=AD'+ str(i+1) + '*100'
2408  oSheet.getCellByPosition(ad, riga_corrente).CellStyle = 'Ultimus %'
2409  oSheet.getCellByPosition(ae , riga_corrente).Formula = '=AE'+ str(i+1)
2410  riga_corrente += 1
2411  elif oSheet.getCellByPosition(1 , i).CellStyle == 'livello2 valuta':
2412  oSheet.getRows().insertByIndex(riga_corrente,1)
2413  oSheet.getCellRangeByPosition(0, riga_corrente, 30, riga_corrente).CellStyle = 'ULTIMUS_3'
2414  oSheet.getCellByPosition(1 , riga_corrente).Formula = '=B' + str(i+1)
2415  oSheet.getCellByPosition(1 , riga_corrente).CellStyle = 'Ultimus_destra_3'
2416  oSheet.getCellByPosition(2 , riga_corrente).Formula = '=C' + str(i+1)
2417  oSheet.getCellByPosition(ii , riga_corrente).Formula = '=' + col + str(riga_corrente+1) + '/' + col + str(lRowF) + '*100'
2418  oSheet.getCellByPosition(ii, riga_corrente).CellStyle = 'Ultimus %_3'
2419  oSheet.getCellByPosition(vv , riga_corrente).Formula = '='+ col + str(i+1)
2420  oSheet.getCellByPosition(vv , riga_corrente).CellStyle = 'ULTIMUS_3'
2421  oSheet.getCellByPosition(ac , riga_corrente).Formula = '=AC'+ str(i+1)
2422  oSheet.getCellByPosition(ad , riga_corrente).Formula = '=AD'+ str(i+1) + '*100'
2423  oSheet.getCellByPosition(ad, riga_corrente).CellStyle = 'Ultimus %_3'
2424  oSheet.getCellByPosition(ae , riga_corrente).Formula = '=AE'+ str(i+1)
2425  riga_corrente += 1
2426  oSheet.getCellRangeByPosition(2,inizio_gruppo,ae,inizio_gruppo).CellStyle = "Ultimus_centro"
2427  oSheet.getCellByPosition(ii, riga_corrente).Value = 100
2428  oSheet.getCellByPosition(2 , riga_corrente).CellStyle = 'Ultimus_destra'
2429  oSheet.getCellByPosition(ii , riga_corrente).CellStyle = 'Ultimus %_1'
2430  oSheet.getCellByPosition(vv , riga_corrente).Formula = '=' + col + str(lRowF)
2431  oSheet.getCellByPosition(vv , riga_corrente).CellStyle = 'Ultimus_Bordo_sotto'
2432  oSheet.getCellByPosition(ac , riga_corrente).Formula = '=AC' + str(lRowF)
2433  oSheet.getCellByPosition(ac , riga_corrente).CellStyle = 'Ultimus_Bordo_sotto'
2434  oSheet.getCellByPosition(ae , riga_corrente).Formula = '=AE' + str(lRowF)
2435  oSheet.getCellByPosition(ae , riga_corrente).CellStyle = 'Ultimus_Bordo_sotto'
2436  oSheet.getCellByPosition(ad , riga_corrente).Formula = '=AD' + str(lRowF) + '*100'
2437  oSheet.getCellByPosition(2 , riga_corrente).String= ' T O T A L E €'
2438  oSheet.getCellByPosition(2 , riga_corrente).CellStyle = 'ULTIMUS_1'
2439  fine_gruppo = riga_corrente
2440  #~ DATA
2441  oSheet.getCellByPosition(2 , riga_corrente+3).Formula = '=CONCATENATE("Data, ";TEXT(NOW();"GG/MM/AAAA"))'
2442  #~ consolido il risultato
2443  oRange = oSheet.getCellByPosition(2 , riga_corrente+3)
2444  flags =(oDoc.createInstance('com.sun.star.sheet.CellFlags.FORMULA'))
2445  aSaveData = oRange.getDataArray()
2446  oRange.setDataArray(aSaveData)
2447 
2448  oSheet.getCellByPosition(2 , riga_corrente+5).Formula = 'Il Progettista'
2449  oSheet.getCellByPosition(2 , riga_corrente+6).Formula = '=CONCATENATE($S2.$C$13)'
2450  oSheet.getCellRangeByPosition(2 , riga_corrente+5, 2 , riga_corrente+6).CellStyle = 'Ultimus_centro'
2451 
2452 
2453  oDoc.CurrentController.select(oSheet.getCellByPosition(0, lRowF))
2454  ctx = XSCRIPTCONTEXT.getComponentContext()
2455  desktop = XSCRIPTCONTEXT.getDesktop()
2456  oFrame = desktop.getCurrentFrame()
2457 
2458  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
2459  dispatchHelper.executeDispatch(oFrame, ".uno:InsertRowBreak", "", 0, list())
2460  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges"))
2461 
2463  oDialogo_attesa.endExecute()
2464  oDoc.CurrentController.ZoomValue = 100
2465 
2466 def next_voice(lrow, n=1):
2467  '''
2468  lrow { double } : riga di riferimento
2469  n { integer } : se 0 sposta prima della voce corrente
2470  se 1 sposta dopo della voce corrente
2471  sposta il cursore prima o dopo la voce corrente restituento un idrow
2472  '''
2473  oDoc = XSCRIPTCONTEXT.getDocument()
2474  oSheet = oDoc.CurrentController.ActiveSheet
2475  #~ n =0
2476  #~ lrow = Range2Cell()[1]
2477  fine = ultima_voce(oSheet)+1
2478  if lrow >= fine:
2479  return lrow
2480  if oSheet.getCellByPosition(0, lrow).CellStyle in stili_computo + stili_contab:
2481  if n==0:
2482  sopra = Circoscrive_Voce_Computo_Att(lrow).RangeAddress.StartRow
2483  lrow = sopra
2484  elif n==1:
2485  sotto = Circoscrive_Voce_Computo_Att(lrow).RangeAddress.EndRow
2486  lrow = sotto+1
2487  elif oSheet.getCellByPosition(0, lrow).CellStyle in ('Ultimus_centro_bordi_lati',):
2488  for y in range(lrow, getLastUsedCell(oSheet).EndRow+1):
2489  if oSheet.getCellByPosition(0, y).CellStyle != 'Ultimus_centro_bordi_lati':
2490  lrow = y
2491  break
2492  elif oSheet.getCellByPosition(0, lrow).CellStyle in noVoce:
2493  while oSheet.getCellByPosition(0, lrow).CellStyle in noVoce:
2494  lrow +=1
2495  else:
2496  return
2497  return lrow
2498 
2500  '''
2501  cancella le voci in Elenco Prezzi che derivano da analisi
2502  '''
2503  oDoc = XSCRIPTCONTEXT.getDocument()
2504  oSheet = oDoc.CurrentController.ActiveSheet
2505  oSheet = oDoc.Sheets.getByName('Analisi di Prezzo')
2506  lista_an = list()
2507  for i in range(0, getLastUsedCell(oSheet).EndRow):
2508  if oSheet.getCellByPosition(0, i).CellStyle == 'An-1_sigla':
2509  codice = oSheet.getCellByPosition(0, i).String
2510  lista_an.append(oSheet.getCellByPosition(0, i).String)
2511  oSheet = oDoc.Sheets.getByName('Elenco Prezzi')
2512  for i in reversed(range(0, getLastUsedCell(oSheet).EndRow)):
2513  if oSheet.getCellByPosition(0, i).String in lista_an:
2514  oSheet.getRows().removeByIndex(i, 1)
2515 
2517  oDoc = XSCRIPTCONTEXT.getDocument()
2518  try:
2519  oSheet = oDoc.CurrentController.ActiveSheet
2520  if oSheet.Name != 'Analisi di Prezzo':
2521  return
2522  oDoc.enableAutomaticCalculation(False) # blocco il calcolo automatico
2523  sStRange = Circoscrive_Analisi(Range2Cell()[1])
2524  riga = sStRange.RangeAddress.StartRow + 1
2525 
2526  codice = oSheet.getCellByPosition(0, riga).String
2527 
2528  oSheet = oDoc.Sheets.getByName('Elenco Prezzi')
2529  oDoc.CurrentController.setActiveSheet(oSheet)
2530 
2531  oSheet.getRows().insertByIndex(3,1)
2532 
2533  oSheet.getCellByPosition(0,3).CellStyle = 'EP-Cs'
2534  oSheet.getCellByPosition(1,3).CellStyle = 'EP-C'
2535  oSheet.getCellRangeByPosition(2,3,8,3).CellStyle = 'EP-C mezzo'
2536  oSheet.getCellByPosition(5,3).CellStyle = 'EP-C mezzo %'
2537  oSheet.getCellByPosition(9,3).CellStyle = 'EP-sfondo'
2538  oSheet.getCellByPosition(10,3).CellStyle = 'Default'
2539  oSheet.getCellByPosition(11,3).CellStyle = 'EP-mezzo %'
2540  oSheet.getCellByPosition(12,3).CellStyle = 'EP statistiche_q'
2541  oSheet.getCellByPosition(13,3).CellStyle = 'EP statistiche_Contab_q'
2542 
2543  oSheet.getCellByPosition(0,3).String = codice
2544 
2545  oSheet.getCellByPosition(1,3).Formula = "=$'Analisi di Prezzo'.B" + str(riga+1)
2546  oSheet.getCellByPosition(2,3).Formula = "=$'Analisi di Prezzo'.C" + str(riga+1)
2547  oSheet.getCellByPosition(3,3).Formula = "=$'Analisi di Prezzo'.K" + str(riga+1)
2548  oSheet.getCellByPosition(4,3).Formula = "=$'Analisi di Prezzo'.G" + str(riga+1)
2549  oSheet.getCellByPosition(5,3).Formula = "=$'Analisi di Prezzo'.I" + str(riga+1)
2550  oSheet.getCellByPosition(6,3).Formula = "=$'Analisi di Prezzo'.J" + str(riga+1)
2551  oSheet.getCellByPosition(7,3).Formula = "=$'Analisi di Prezzo'.A" + str(riga+1)
2552  oSheet.getCellByPosition(8,3).String = "(AP)"
2553  oSheet.getCellByPosition(11,3).Formula = "=N4/$N$2"
2554  oSheet.getCellByPosition(12,3).Formula = "=SUMIF(AA;A4;BB)"
2555  oSheet.getCellByPosition(13,3).Formula = "=SUMIF(AA;A4;cEuro)"
2556  oDoc.enableAutomaticCalculation(True) # sblocco il calcolo automatico
2557  _gotoCella(1, 3)
2558  except:
2559  oDoc.enableAutomaticCalculation(True)
2560 
2561 def tante_analisi_in_ep(arg=None):
2562  oDoc = XSCRIPTCONTEXT.getDocument()
2563  lista_analisi = list()
2564  oSheet = oDoc.getSheets().getByName('Analisi di prezzo')
2565  voce = list()
2566  idx = 4
2567  for n in range(0, ultima_voce(oSheet)+1):
2568  if oSheet.getCellByPosition(0, n).CellStyle == 'An-1_sigla' and oSheet.getCellByPosition(1, n).String != '<<<Scrivi la descrizione della nuova voce da analizzare ':
2569  voce =(oSheet.getCellByPosition(0, n).String,
2570  "=$'Analisi di Prezzo'.B" + str(n+1),
2571  "=$'Analisi di Prezzo'.C" + str(n+1),
2572  "=$'Analisi di Prezzo'.K" + str(n+1),
2573  "=$'Analisi di Prezzo'.G" + str(n+1),
2574  "=$'Analisi di Prezzo'.I" + str(n+1),
2575  "=F"+ str(idx)+"*E"+ str(idx),
2576  "=$'Analisi di Prezzo'.A" + str(n+1),
2577  )
2578  lista_analisi.append(voce)
2579  idx += 1
2580  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
2581  if len(lista_analisi) !=0:
2582  oSheet.getRows().insertByIndex(3,len(lista_analisi))
2583  else:
2584  return
2585  oRange = oSheet.getCellRangeByPosition(0, 3, 7, 3+len(lista_analisi)-1)
2586  lista_come_array = tuple(lista_analisi)
2587 
2588  oSheet.getCellRangeByPosition(11, 3, 11, 3+len(lista_analisi)-1).CellStyle = 'EP-mezzo %'
2589  oSheet.getCellRangeByPosition(12, 3, 12, 3+len(lista_analisi)-1).CellStyle = 'EP statistiche_q'
2590  oSheet.getCellRangeByPosition(13, 3, 13, 3+len(lista_analisi)-1).CellStyle = 'EP statistiche_Contab_q'
2591 
2592  oRange.setDataArray(lista_come_array) #setFrmulaArray() sarebbe meglio, ma mi fa storie sul codice articolo
2593  for y in range(3, 3+len(lista_analisi)):
2594  for x in range(1, 8): #evito il codice articolo, altrimenti me lo converte in numero
2595  oSheet.getCellByPosition(x, y).Formula = oSheet.getCellByPosition(x, y).String
2596  oSheet.getCellRangeByPosition(0, 3, 7, 3+len(lista_analisi)-1).CellStyle = 'EP-C mezzo'
2597  oSheet.getCellRangeByPosition(0, 3, 0, 3+len(lista_analisi)-1).CellStyle = 'EP-Cs'
2598  oSheet.getCellRangeByPosition(1, 3, 1, 3+len(lista_analisi)-1).CellStyle = 'EP-C'
2599  oSheet.getCellRangeByPosition(5, 3, 5, 3+len(lista_analisi)-1).CellStyle = 'EP-C mezzo %'
2600  #~ MsgBox('Trasferite ' + str(len(lista_analisi)) + ' analisi di prezzo in Elenco Prezzi.', 'Avviso')
2601 
2603  '''
2604  lrow { double } : riga di riferimento per
2605  la selezione dell'intera voce
2606  Circoscrive una voce di analisi
2607  partendo dalla posizione corrente del cursore
2608  '''
2609  oDoc = XSCRIPTCONTEXT.getDocument()
2610  oSheet = oDoc.CurrentController.ActiveSheet
2611  if oSheet.getCellByPosition(0, lrow).CellStyle in stili_analisi:
2612  if oSheet.getCellByPosition(0, lrow).CellStyle == stili_analisi[0]:
2613  lrowS=lrow
2614  else:
2615  while oSheet.getCellByPosition(0, lrow).CellStyle != stili_analisi[0]:
2616  lrow = lrow-1
2617  lrowS=lrow
2618  lrow = lrowS
2619  while oSheet.getCellByPosition(0, lrow).CellStyle != stili_analisi[-1]:
2620  lrow=lrow+1
2621  lrowE=lrow+1
2622  celle=oSheet.getCellRangeByPosition(0,lrowS,250,lrowE)
2623  return celle
2625  '''
2626  lrow { double } : riga di riferimento per
2627  la selezione dell'intera voce
2628 
2629  Circoscrive una voce di computo, variante o contabilità
2630  partendo dalla posizione corrente del cursore
2631  '''
2632  oDoc = XSCRIPTCONTEXT.getDocument()
2633  oSheet = oDoc.CurrentController.ActiveSheet
2634  #~ lrow = Range2Cell()[1]
2635  #~ if oSheet.Name in('VARIANTE', 'COMPUTO','CONTABILITA'):
2636  if oSheet.getCellByPosition(0, lrow).CellStyle in('comp progress', 'comp 10 s', 'Comp Start Attributo',
2637  'Comp End Attributo', 'Comp Start Attributo_R', 'comp 10 s_R', 'Comp End Attributo_R', 'Livello-0-scritta', 'Livello-1-scritta', 'livello2 valuta'):
2638  while oSheet.getCellByPosition(0, lrow).CellStyle not in('Comp End Attributo', 'Comp End Attributo_R'):
2639  lrow +=1
2640  lrowE=lrow
2641  while oSheet.getCellByPosition(0, lrow).CellStyle not in('Comp Start Attributo', 'Comp Start Attributo_R'):
2642  lrow -=1
2643  lrowS=lrow
2644  celle=oSheet.getCellRangeByPosition(0,lrowS,250,lrowE)
2645  return celle
2646 
2647 def ColumnNumberToName(oSheet,cColumnNumb):
2648  '''Trasforma IDcolonna in Nome'''
2649  #~ oDoc = XSCRIPTCONTEXT.getDocument()
2650  #~ oSheet = oDoc.CurrentController.ActiveSheet
2651  oColumns = oSheet.getColumns()
2652  oColumn = oColumns.getByIndex(cColumnNumb).Name
2653  return oColumn
2654 
2655 def ColumnNameToNumber(oSheet,cColumnName):
2656  '''Trasforma il nome colonna in IDcolonna'''
2657  #~ oDoc = XSCRIPTCONTEXT.getDocument()
2658  #~ oSheet = oDoc.CurrentController.ActiveSheet
2659  oColumns = oSheet.getColumns()
2660  oColumn = oColumns.getByName(cColumnName)
2661  oRangeAddress = oColumn.getRangeAddress()
2662  nColumn = oRangeAddress.StartColumn
2663  return nColumn
2664 
2665 def azzera_voce(arg=None):
2666  '''
2667  Azzera la quantità di una voce e ne raggruppa le relative righe
2668  '''
2669  try:
2670  oDoc = XSCRIPTCONTEXT.getDocument()
2671  oSheet = oDoc.CurrentController.ActiveSheet
2672  if oSheet.Name in('COMPUTO', 'VARIANTE'):
2673  try:
2674  sRow = oDoc.getCurrentSelection().getRangeAddresses()[0].StartRow
2675  eRow = oDoc.getCurrentSelection().getRangeAddresses()[0].EndRow
2676 
2677  except:
2678  sRow = oDoc.getCurrentSelection().getRangeAddress().StartRow
2679  eRow = oDoc.getCurrentSelection().getRangeAddress().EndRow
2680  sStRange = Circoscrive_Voce_Computo_Att(sRow)
2681  sStRange.RangeAddress
2682  sRow = sStRange.RangeAddress.StartRow
2683  sStRange = Circoscrive_Voce_Computo_Att(eRow)
2684  try:
2685  sStRange.RangeAddress
2686  except:
2687  return
2688  inizio = sStRange.RangeAddress.StartRow
2689  eRow = sStRange.RangeAddress.EndRow+1
2690 
2691  lrow = sRow
2692  fini = list()
2693  for x in range(sRow, eRow):
2694  if oSheet.getCellByPosition(0, x).CellStyle in('Comp End Attributo', 'Comp End Attributo_R'):
2695  fini.append(x)
2696  idx = 0
2697 
2698  for lrow in fini:
2699  lrow += idx
2700  try:
2701  sStRange = Circoscrive_Voce_Computo_Att(lrow)
2702  sStRange.RangeAddress
2703  inizio = sStRange.RangeAddress.StartRow
2704  fine = sStRange.RangeAddress.EndRow
2705 
2706  _gotoCella(2, fine-1)
2707  if oSheet.getCellByPosition(2, fine-1).String == '*** VOCE AZZERATA ***':
2708 
2709  oSheet.getCellRangeByPosition(0, inizio, 250, fine).clearContents(HARDATTR)
2710  raggruppa_righe_voce(lrow, 0)
2711  oSheet.getRows().removeByIndex(fine-1, 1)
2712  fine -=1
2713  _gotoCella(2, fine-1)
2714  idx -= 1
2715  else:
2716  Copia_riga_Ent()
2717  oSheet.getCellByPosition(2, fine).String = '*** VOCE AZZERATA ***'
2718  oSheet.getCellByPosition(5, fine).Formula = '=-SUBTOTAL(9;J' + str(inizio+1) + ':J' + str(fine) + ')'
2719 
2720  oDoc.CurrentController.select(sStRange)
2721  raggruppa_righe_voce (lrow, 1)
2722  ctx = XSCRIPTCONTEXT.getComponentContext()
2723  desktop = XSCRIPTCONTEXT.getDesktop()
2724  oFrame = desktop.getCurrentFrame()
2725  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
2726  oProp = PropertyValue()
2727  oProp.Name = 'BackgroundColor'
2728  oProp.Value = 15066597
2729  properties =(oProp,)
2730  dispatchHelper.executeDispatch(oFrame, '.uno:BackgroundColor', '', 0, properties)
2731  _gotoCella(2, fine)
2732 
2733  lrow = Range2Cell()[1]
2734  lrow = next_voice(lrow, 1)
2735  except:
2736  pass
2737  numera_voci(1)
2738  except:
2739  pass
2740  return
2741 
2743  '''
2744  Elimina le voci in cui compare la dicitura '*** VOCE AZZERATA ***'
2745  in COMPUTO o in VARIANTE, senza chiedere conferma
2746  '''
2747  oDoc = XSCRIPTCONTEXT.getDocument()
2748  oSheet = oDoc.CurrentController.ActiveSheet
2749  try:
2750  if oSheet.Name in('COMPUTO', 'VARIANTE'):
2751  ER = getLastUsedCell(oSheet).EndRow
2752  for lrow in reversed(range(0, ER)):
2753  if oSheet.getCellByPosition(2, lrow).String == '*** VOCE AZZERATA ***':
2754  elimina_voce(lRow=lrow, msg=0)
2755  numera_voci(1)
2756  except:
2757  return
2758 
2759 def raggruppa_righe_voce (lrow, flag=1):
2760  '''
2761  Raggruppa le righe che compongono una singola voce.
2762  '''
2763  oDoc = XSCRIPTCONTEXT.getDocument()
2764  oSheet = oDoc.CurrentController.ActiveSheet
2765  #~ lrow = Range2Cell()[1]
2766  if oSheet.Name in('COMPUTO', 'VARIANTE'):
2767  sStRange = Circoscrive_Voce_Computo_Att (lrow)
2768  sStRange.RangeAddress
2769 
2770  iSheet = oSheet.RangeAddress.Sheet
2771  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
2772  oCellRangeAddr.Sheet = iSheet
2773  oCellRangeAddr.StartColumn = sStRange.RangeAddress.StartColumn
2774  oCellRangeAddr.EndColumn = sStRange.RangeAddress.EndColumn
2775  oCellRangeAddr.StartRow = sStRange.RangeAddress.StartRow
2776  oCellRangeAddr.EndRow = sStRange.RangeAddress.EndRow
2777  if flag == 1:
2778  oSheet.group(oCellRangeAddr, 1)
2779  else:
2780  oSheet.ungroup(oCellRangeAddr, 1)
2781 
2783  '''
2784  Nasconde le voci in cui compare la dicitura '*** VOCE AZZERATA ***'
2785  in COMPUTO o in VARIANTE.
2786  '''
2787  oDoc = XSCRIPTCONTEXT.getDocument()
2788  oSheet = oDoc.CurrentController.ActiveSheet
2789  try:
2790  if oSheet.Name in('COMPUTO', 'VARIANTE'):
2791  oSheet.clearOutline()
2792  ER = getLastUsedCell(oSheet).EndRow
2793  for lrow in reversed(range(0, ER)):
2794  if oSheet.getCellByPosition(2, lrow).String == '*** VOCE AZZERATA ***':
2795  raggruppa_righe_voce(lrow, 1)
2796  except:
2797  return
2798 
2799 def elimina_voce(lRow=None, msg=1):
2800  '''
2801  Elimina una voce in COMPUTO, VARIANTE, CONTABILITA o Analisi di Prezzo
2802 
2803  lRow { long } : numero riga
2804  msg { bit } : 1 chiedi conferma con messaggio
2805  0 egegui senza conferma
2806  '''
2807  oDoc = XSCRIPTCONTEXT.getDocument()
2808  oSheet = oDoc.CurrentController.ActiveSheet
2809  if lRow == None or lRow == 0:
2810  lRow = Range2Cell()[1]
2811  try:
2812  if oSheet.Name in('COMPUTO', 'VARIANTE'):
2813  sStRange = Circoscrive_Voce_Computo_Att(lRow)
2814  elif oSheet.Name == 'Analisi di Prezzo':
2815  sStRange = Circoscrive_Analisi(lRow)
2816 
2817  if oSheet.Name =='CONTABILITA':
2818  cerca_partenza()
2819  if partenza[2] == '#reg':
2820  sblocca_cont()
2821  if sblocca_computo == 0:
2822  return
2823  pass
2824  else:
2825  pass
2826  sStRange = Circoscrive_Voce_Computo_Att(lRow)
2827 
2828  except:
2829  return
2830  sStRange.RangeAddress
2831  SR = sStRange.RangeAddress.StartRow
2832  ER = sStRange.RangeAddress.EndRow
2833  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(0, SR, 250, ER))
2834  if msg==1:
2835  if DlgSiNo("""OPERAZIONE NON ANNULLABILE!
2836 
2837 Stai per eliminare la voce selezionata.
2838 Vuoi Procedere?
2839  """,'AVVISO!') ==2:
2840  oSheet.getRows().removeByIndex(SR, ER-SR+1)
2841  numera_voci(0)
2842  else:
2843  return
2844  elif msg==0:
2845  oSheet.getRows().removeByIndex(SR, ER-SR+1)
2846  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges"))
2847 
2849  '''
2850  Inserisce una nuova riga di misurazione nel computo
2851  '''
2852  oDoc = XSCRIPTCONTEXT.getDocument()
2853  oSheet = oDoc.CurrentController.ActiveSheet
2854  #~ lrow = Range2Cell()[1]
2855  stile = oSheet.getCellByPosition(1, lrow).CellStyle
2856  if stile in('comp Art-EP', 'comp Art-EP_R', 'Comp-Bianche in mezzo'):#'Comp-Bianche in mezzo Descr', 'comp 1-a', 'comp sotto centro'):# <stili computo
2857  sStRange = Circoscrive_Voce_Computo_Att(lrow)
2858  sStRange.RangeAddress
2859  sopra = sStRange.RangeAddress.StartRow
2860  sotto = sStRange.RangeAddress.EndRow
2861  lrow = lrow+1 # PER INSERIMENTO SOTTO RIGA CORRENTE
2862  oSheet.getRows().insertByIndex(lrow,1)
2863 # imposto gli stili
2864  oSheet.getCellRangeByPosition(5, lrow, 7, lrow,).CellStyle = 'comp 1-a'
2865  oSheet.getCellByPosition(0, lrow).CellStyle = 'comp 10 s'
2866  oSheet.getCellByPosition(1, lrow).CellStyle = 'Comp-Bianche in mezzo'
2867  oSheet.getCellByPosition(2, lrow).CellStyle = 'comp 1-a'
2868  oSheet.getCellRangeByPosition(3, lrow, 4, lrow).CellStyle = 'Comp-Bianche in mezzo bordate_R'
2869  oSheet.getCellByPosition(8, lrow).CellStyle = 'comp 1-a peso'
2870  oSheet.getCellByPosition(9, lrow).CellStyle = 'Blu'
2871 # ci metto le formule
2872  oSheet.getCellByPosition(9, lrow).Formula = '=IF(PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + '))'
2873  oSheet.getCellByPosition(10 , lrow).Formula = ""
2874  #~ _gotoCella(2, lrow)
2875  oDoc.CurrentController.select(oSheet.getCellByPosition(2, lrow))
2876  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges"))
2878  '''
2879  Inserisce una nuova riga di misurazione in contabilità
2880  '''
2881  oDoc = XSCRIPTCONTEXT.getDocument()
2882  oSheet = oDoc.CurrentController.ActiveSheet
2883  #~ lrow = Range2Cell()[1]
2884  stile = oSheet.getCellByPosition(1, lrow).CellStyle
2885  if oSheet.getCellByPosition(1, lrow+1).CellStyle == 'comp sotto Bianche_R':
2886  return
2887  if stile in('comp Art-EP_R', 'Data_bianca', 'Comp-Bianche in mezzo_R'):
2888  sStRange = Circoscrive_Voce_Computo_Att(lrow)
2889  sStRange.RangeAddress
2890  sopra = sStRange.RangeAddress.StartRow
2891  sotto = sStRange.RangeAddress.EndRow
2892  lrow = lrow+1 # PER INSERIMENTO SOTTO RIGA CORRENTE
2893  #~ if oSheet.getCellByPosition(2, lrow).CellStyle == 'comp sotto centro_R':
2894  #~ lrow = lrow-1
2895  oSheet.getRows().insertByIndex(lrow,1)
2896  # imposto gli stili
2897  oSheet.getCellByPosition(1, lrow).CellStyle = 'Comp-Bianche in mezzo_R'
2898  oSheet.getCellByPosition(2, lrow).CellStyle = 'comp 1-a'
2899  oSheet.getCellRangeByPosition(5, lrow, 7, lrow).CellStyle = 'comp 1-a'
2900  oSheet.getCellRangeByPosition(11, lrow, 23, lrow).CellStyle = 'Comp-Bianche in mezzo_R'
2901  oSheet.getCellByPosition(8, lrow).CellStyle = 'comp 1-a peso'
2902  oSheet.getCellRangeByPosition(9, lrow, 11, lrow).CellStyle = 'Comp-Variante'
2903  # ci metto le formule
2904  oSheet.getCellByPosition(9, lrow).Formula = '=IF(PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')<=0;"";PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + '))'
2905  oSheet.getCellByPosition(11, lrow).Formula = '=IF(PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')>=0;"";PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')*-1)'
2906  # preserva la data di misura
2907  if oSheet.getCellByPosition(1, lrow+1).CellStyle == 'Data_bianca':
2908  oRangeAddress = oSheet.getCellByPosition(1, lrow+1).getRangeAddress()
2909  oCellAddress = oSheet.getCellByPosition(1,lrow).getCellAddress()
2910  oSheet.copyRange(oCellAddress, oRangeAddress)
2911  oSheet.getCellByPosition(1, lrow+1).String = ""
2912  oSheet.getCellByPosition(1, lrow+1).CellStyle = 'Comp-Bianche in mezzo_R'
2913  oDoc.CurrentController.select(oSheet.getCellByPosition(2, lrow))
2915  '''
2916  Inserisce una nuova riga di misurazione in analisi di prezzo
2917  '''
2918  oDoc = XSCRIPTCONTEXT.getDocument()
2919  oSheet = oDoc.CurrentController.ActiveSheet
2920  stile = oSheet.getCellByPosition(0, lrow).CellStyle
2921  if stile in('An-lavoraz-desc', 'An-lavoraz-Cod-sx'):
2922  lrow=lrow+1
2923  oSheet.getRows().insertByIndex(lrow,1)
2924  # imposto gli stili
2925  oSheet.getCellByPosition(0, lrow).CellStyle = 'An-lavoraz-Cod-sx'
2926  oSheet.getCellRangeByPosition(1, lrow, 5, lrow).CellStyle = 'An-lavoraz-generica'
2927  oSheet.getCellByPosition(3, lrow).CellStyle = 'An-lavoraz-input'
2928  oSheet.getCellByPosition(6, lrow).CellStyle = 'An-senza'
2929  oSheet.getCellByPosition(7, lrow).CellStyle = 'An-senza-DX'
2930  # ci metto le formule
2931  #~ oDoc.enableAutomaticCalculation(False)
2932  oSheet.getCellByPosition(1, lrow).Formula = '=IF(A' + str(lrow+1) + '="";"";CONCATENATE(" ";VLOOKUP(A' + str(lrow+1) + ';elenco_prezzi;2;FALSE());' '))'
2933  oSheet.getCellByPosition(2, lrow).Formula = '=IF(A' + str(lrow+1) + '="";"";VLOOKUP(A' + str(lrow+1) + ';elenco_prezzi;3;FALSE()))'
2934  oSheet.getCellByPosition(3, lrow).Value = 0
2935  oSheet.getCellByPosition(4, lrow).Formula = '=IF(A' + str(lrow+1) + '="";0;VLOOKUP(A' + str(lrow+1) + ';elenco_prezzi;5;FALSE()))'
2936  oSheet.getCellByPosition(5, lrow).Formula = '=D' + str(lrow+1) + '*E' + str(lrow+1)
2937  oSheet.getCellByPosition(8, lrow).Formula = '=IF(A' + str(lrow+1) + '="";"";IF(VLOOKUP(A' + str(lrow+1) + ';elenco_prezzi;6;FALSE())="";"";(VLOOKUP(A' + str(lrow+1) + ';elenco_prezzi;6;FALSE()))))'
2938  oSheet.getCellByPosition(9, lrow).Formula = '=IF(I' + str(lrow+1) + '="";"";I' + str(lrow+1) + '*F' + str(lrow+1) + ')'
2939  #~ oDoc.enableAutomaticCalculation(True)
2940  # preserva il Pesca
2941  if oSheet.getCellByPosition(1, lrow-1).CellStyle == 'An-lavoraz-dx-senza-bordi':
2942  oRangeAddress = oSheet.getCellByPosition(0, lrow+1).getRangeAddress()
2943  oCellAddress = oSheet.getCellByPosition(0,lrow).getCellAddress()
2944  oSheet.copyRange(oCellAddress, oRangeAddress)
2945  oSheet.getCellByPosition(0, lrow).String = 'Cod. Art.?'
2946  oDoc.CurrentController.select(oSheet.getCellByPosition(1, lrow))
2947 
2948 def Copia_riga_Ent(arg=None): #Aggiungi Componente - capisce su quale tipologia di tabelle è
2949  oDoc = XSCRIPTCONTEXT.getDocument()
2950  oSheet = oDoc.CurrentController.ActiveSheet
2951  lrow = Range2Cell()[1]
2952  nome_sheet = oSheet.Name
2953  if nome_sheet in('COMPUTO', 'VARIANTE'):
2954  if conf.read(path_conf, 'Generale', 'dettaglio') == '1':
2956  copia_riga_computo(lrow)
2957  elif nome_sheet == 'CONTABILITA':
2958  copia_riga_contab(lrow)
2959  elif nome_sheet == 'Analisi di Prezzo':
2960  copia_riga_analisi(lrow)
2961 
2962 def cerca_partenza(arg=None):
2963  '''
2964  Conserva, nella variabile globale 'partenza', il nome del foglio [0] e l'id
2965  della riga di codice prezzo componente [1], il flag '#reg' solo per la contbailità.
2966  partenza = (nome_foglio, id_rcodice, flag_contabilità)
2967  '''
2968  oDoc = XSCRIPTCONTEXT.getDocument()
2969  oSheet = oDoc.CurrentController.ActiveSheet
2970  lrow = Range2Cell()[1]
2971  global partenza
2972 
2973  if oSheet.getCellByPosition(0, lrow).CellStyle in stili_computo: #COMPUTO, VARIANTE
2974  sStRange = Circoscrive_Voce_Computo_Att(lrow)
2975  partenza =(oSheet.Name, sStRange.RangeAddress.StartRow+1)
2976  elif oSheet.getCellByPosition(0, lrow).CellStyle in stili_contab: #CONTABILITA
2977  sStRange = Circoscrive_Voce_Computo_Att(lrow)
2978  partenza =(oSheet.Name, sStRange.RangeAddress.StartRow+1, oSheet.getCellByPosition(22, sStRange.RangeAddress.StartRow+1).String)
2979  elif oSheet.getCellByPosition(0, lrow).CellStyle in ('An-lavoraz-Cod-sx', 'Comp TOTALI'): #ANALISI o riga totale
2980  partenza =(oSheet.Name, lrow)
2981  return partenza
2982 
2983 sblocca_computo = 0
2985  '''
2986  Controlla che non ci siano atti contabili registrati e dà il consenso a procedere.
2987  '''
2988  global sblocca_computo
2989  oDoc = XSCRIPTCONTEXT.getDocument()
2990  oSheet = oDoc.CurrentController.ActiveSheet
2991  if oSheet.Name in('CONTABILITA'):
2992  cerca_partenza()
2993  chi(partenza[2])
2994  chi(sblocca_computo)
2995  if sblocca_computo == 1:
2996  pass
2997  else:
2998  if partenza[2] == '':
2999  pass
3000  if partenza[2] == '#reg':
3001  if DlgSiNo("""Lavorando in questo punto del foglio,
3002 comprometterai la validità degli atti contabili già emessi.
3003 
3004 Vuoi procedere?
3005 
3006 SCEGLIENDO SI' SARAI COSTRETTO A RIGENERARLI!""", 'Voce già registrata!') ==3:
3007  pass
3008  else:
3009  sblocca_computo = 1
3010  chi(sblocca_computo)
3011 
3012 def cerca_in_elenco(arg=None):
3013  '''Evidenzia il codice di elenco prezzi della voce corrente.'''
3014  oDoc = XSCRIPTCONTEXT.getDocument()
3015  oSheet = oDoc.CurrentController.ActiveSheet
3016  lrow = Range2Cell()[1]
3017  if oSheet.Name in ('COMPUTO', 'CONTABILITA', 'VARIANTE', 'Analisi di Prezzo'):
3018  if oSheet.Name == 'Analisi di Prezzo':
3019  if oSheet.getCellByPosition(0, lrow).CellStyle == 'An-lavoraz-Cod-sx':
3020  codice_da_cercare = oSheet.getCellByPosition(0, lrow).String
3021  else:
3022  return
3023  else:
3024  sStRange = Circoscrive_Voce_Computo_Att (lrow)
3025  sopra = sStRange.RangeAddress.StartRow
3026  codice_da_cercare = oSheet.getCellByPosition(1,sopra+1).String
3027  oSheet = oDoc.getSheets().getByName("Elenco Prezzi")
3028  oSheet.IsVisible = True
3029  _gotoSheet('Elenco Prezzi')
3030  elif oSheet.Name in ('Elenco Prezzi'):
3031  if oSheet.getCellByPosition(1, lrow).Type.value == 'FORMULA':
3032  codice_da_cercare = oSheet.getCellByPosition(0, lrow).String
3033  else:
3034  return
3035  oSheet = oDoc.getSheets().getByName("Analisi di Prezzo")
3036  oSheet.IsVisible = True
3037  _gotoSheet('Analisi di Prezzo')
3038  if codice_da_cercare == "Cod. Art.?":
3039  return
3040  if codice_da_cercare != '':
3041  oCell=uFindString (codice_da_cercare, oSheet)
3042  _gotoCella(oCell[0], oCell[1])
3043 
3044 def pesca_cod(arg=None):
3045  '''
3046  Permette di scegliere il codice per la voce di COMPUTO o VARIANTE o CONTABILITA dall'Elenco Prezzi.
3047  Capisce quando la voce nel libretto delle misure è già registrata o nel documento ci sono già atti contabili emessi.
3048  '''
3049  global sblocca_computo
3050  oDoc = XSCRIPTCONTEXT.getDocument()
3051  oSheet = oDoc.CurrentController.ActiveSheet
3052  lrow = Range2Cell()[1]
3053  if oSheet.getCellByPosition(0, lrow).CellStyle not in stili_computo + stili_contab + stili_analisi + stili_elenco:
3054  return
3055  if oSheet.Name in('Analisi di Prezzo'):
3056  cerca_partenza()
3057  cerca_in_elenco()
3058  _gotoSheet('Elenco Prezzi')
3059 
3060 
3061  if oSheet.Name in('CONTABILITA'):
3062 
3063  cerca_partenza()
3064  if partenza[2] == '#reg':
3065  sblocca_cont()
3066  if sblocca_computo == 0:
3067  return
3068  pass
3069  else:
3070  pass
3071 
3073  if oSheet.Name in('COMPUTO', 'VARIANTE'):
3074  if oDoc.NamedRanges.hasByName("#Lib#1") == True:
3075  if sblocca_computo == 0:
3076  if DlgSiNo("Risulta già registrato un SAL. VUOI PROCEDERE COMUQUE?",'ATTENZIONE!') ==3:
3077  return
3078  else:
3079  sblocca_computo = 1
3080  cerca_partenza()
3081  if oSheet.getCellByPosition(1, partenza[1]).String != 'Cod. Art.?':
3082  cerca_in_elenco()
3083  _gotoSheet('Elenco Prezzi')
3084 
3085  if oSheet.Name in('Elenco Prezzi'):
3086  try:
3087  lrow = Range2Cell()[1]
3088  codice = oSheet.getCellByPosition(0, lrow).String
3089  _gotoSheet(partenza[0])
3090  oSheet = oDoc.CurrentController.ActiveSheet
3091  if partenza[0] == 'Analisi di Prezzo':
3092  oSheet.getCellByPosition(0, partenza[1]).String = codice
3093  _gotoCella(3, partenza[1])
3094  else:
3095  oSheet.getCellByPosition(1, partenza[1]).String = codice
3096  _gotoCella(2, partenza[1]+1)
3097  except NameError:
3098  return
3099 
3100 def ricicla_misure(arg=None):
3101  '''
3102  In CONTABILITA consente l'inserimento di nuove voci di misurazione
3103  partendo da voci già inserite in COMPUTO o VARIANTE.
3104  '''
3105  oDoc = XSCRIPTCONTEXT.getDocument()
3106  oSheet = oDoc.CurrentController.ActiveSheet
3107  if oSheet.Name =='CONTABILITA':
3108  try:
3109 
3110  cerca_partenza()
3111  if partenza[2] == '#reg':
3112  sblocca_cont()
3113  if sblocca_computo == 0:
3114  return
3115  pass
3116  else:
3117  pass
3118 
3119  except:
3120  pass
3121 
3122  lrow = Range2Cell()[1]
3123  if oSheet.getCellByPosition(0, lrow).CellStyle not in stili_contab + ('comp Int_colonna_R_prima',): return
3124  ins_voce_contab(arg = 0)
3125  cerca_partenza()
3126  _gotoSheet(conf.read(path_conf, 'Contabilità', 'ricicla_da'))
3127 
3128  if oSheet.Name in ('COMPUTO', 'VARIANTE'):
3129  lrow = Range2Cell()[1]
3130  sStRange = Circoscrive_Voce_Computo_Att(lrow)
3131  sopra = sStRange.RangeAddress.StartRow+2
3132  sotto = sStRange.RangeAddress.EndRow-1
3133 
3134  oSrc = oSheet.getCellRangeByPosition(2, sopra, 8, sotto).getRangeAddress()
3135  try:
3136  oDest = oDoc.getSheets().getByName('CONTABILITA')
3137  except:
3138  return
3139  oCellAddress = oDest.getCellByPosition(2, partenza[1]+1).getCellAddress()
3140  _gotoSheet('CONTABILITA')
3141  for n in range (sopra, sotto):
3142  copia_riga_contab(partenza[1])
3143  oDest.copyRange(oCellAddress, oSrc)
3144 
3145  oDest.getCellByPosition(1, partenza[1]).String = oSheet.getCellByPosition(1, sopra-1).String
3146  parziale_verifica()
3147  _gotoCella(2, partenza[1]+1)
3148 
3149 def inverti_segno(arg=None):
3150  '''
3151  Inverte il segno delle formule di quantità nei righi di misurazione selezionati.
3152  Funziona solo in COMPUTO e VARIANTE.
3153  '''
3154  oDoc = XSCRIPTCONTEXT.getDocument()
3155  oSheet = oDoc.CurrentController.ActiveSheet
3156  if oSheet.Name in('COMPUTO', 'VARIANTE'):
3157  try:
3158  oRangeAddress = oDoc.getCurrentSelection().getRangeAddresses()
3159  except AttributeError:
3160  oRangeAddress = oDoc.getCurrentSelection().getRangeAddress()
3161  SR = oRangeAddress.StartRow
3162  ER = oRangeAddress.EndRow
3163  for lrow in range(SR, ER+1):
3164  if oSheet.getCellByPosition(2, lrow).CellStyle == 'comp 1-a':
3165  if '-' in oSheet.getCellByPosition(9, lrow).Formula:
3166  if oSheet.getCellByPosition(4, lrow).Type.value != 'EMPTY':
3167  oSheet.getCellByPosition(9, lrow).Formula='=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))' # se VediVoce
3168  else:
3169  oSheet.getCellByPosition(9, lrow).Formula='=IF(PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + '))'
3170  for x in range (2, 10):
3171  oSheet.getCellByPosition(x, lrow).CharColor = -1
3172  else:
3173  if oSheet.getCellByPosition(4, lrow).Type.value != 'EMPTY':
3174  oSheet.getCellByPosition(9, lrow).Formula = '=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";-PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))' # se VediVoce
3175  else:
3176  oSheet.getCellByPosition(9, lrow).Formula = '=IF(PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";-PRODUCT(F' + str(lrow+1) + ':I' + str(lrow+1) + '))'
3177  for x in range (2, 10):
3178  oSheet.getCellByPosition(x, lrow).CharColor = 16724787
3179 
3180 def valuta_cella(oCell):
3181  '''
3182  Estrae qualsiasi valore da una cella, restituendo una strigna, indipendentemente dal tipo originario.
3183  oCell { object } : cella da validare
3184  '''
3185  if oCell.Type.value == 'FORMULA':
3186  try:
3187  eval(oCell.Formula.split('=')[-1])
3188  valore = oCell.Formula.split('=')[-1]
3189  except:
3190  try:
3191  valore = str(oSheet.getCellRangeByName(oCell.Formula.split('=')[-1]).Value)
3192  except:
3193  valore = str(oCell.Value)
3194  elif oCell.Type.value == 'VALUE':
3195  valore = str(oCell.Value)
3196  elif oCell.Type.value == 'TEXT':
3197  valore = str(oCell.String)
3198  elif oCell.Type.value == 'EMPTY':
3199  valore = ''
3200  if valore == ' ': valore = ''
3201  return valore
3202 
3204 # ~def debug(arg=None):
3205  '''
3206  Indica il dettaglio delle misure nel rigo di descrizione quando
3207  incontra delle formule nei valori immessi.
3208  bit { integer } : 1 inserisce i dettagli
3209  0 cancella i dettagli
3210  '''
3211  oDoc = XSCRIPTCONTEXT.getDocument()
3212  oSheet = oDoc.CurrentController.ActiveSheet
3213  lrow = Range2Cell()[1]
3214  if ' >(' in oSheet.getCellByPosition(2, lrow).String:
3215  oSheet.getCellByPosition(2, lrow).String = oSheet.getCellByPosition(2, lrow).String.split(' >(')[0]
3216  if oSheet.getCellByPosition(2, lrow).CellStyle in ('comp 1-a') and "*** VOCE AZZERATA ***" not in oSheet.getCellByPosition(2, lrow).String:
3217  for el in range(5, 9):
3218  if oSheet.getCellByPosition(el, lrow).Type.value == 'FORMULA':
3219  stringa =''
3220  break
3221  else:
3222  stringa = None
3223 
3224  if stringa == '':
3225  for el in range(5, 9):
3226  test = '>('
3227  if oSheet.getCellByPosition(el, lrow).Type.value == 'FORMULA':
3228  if '$' not in oSheet.getCellByPosition(el, lrow).Formula:
3229  try:
3230  eval(oSheet.getCellByPosition(el, lrow).Formula.split('=')[1])
3231  stringa = stringa + '(' + oSheet.getCellByPosition(el, lrow).Formula.split('=')[-1] + ')*'
3232  except:
3233  stringa = stringa + '(' + oSheet.getCellByPosition(el, lrow).String.split('=')[-1] + ')*'
3234  pass
3235  else:
3236  stringa = stringa + '*' + str(oSheet.getCellByPosition(el, lrow).String) + '*'
3237  while '**' in stringa:
3238  stringa=stringa.replace('**','*')
3239  if stringa[0] == '*':
3240  stringa = stringa[1:-1]
3241  else:
3242  stringa = stringa[0:-1]
3243  stringa = ' >(' + stringa + ')'
3244  if oSheet.getCellByPosition(2, lrow).Type.value != 'FORMULA':
3245  oSheet.getCellByPosition(2, lrow).String = oSheet.getCellByPosition(2, lrow).String + stringa.replace('.',',')
3246 
3248  '''
3249  Indica il dettaglio delle misure nel rigo di descrizione quando
3250  incontra delle formule nei valori immessi.
3251  bit { integer } : 1 inserisce i dettagli
3252  0 cancella i dettagli
3253  '''
3254  oDoc = XSCRIPTCONTEXT.getDocument()
3255  try:
3256  oSheet = oDoc.CurrentController.ActiveSheet
3257  except:
3258  return
3259  ER = getLastUsedCell(oSheet).EndRow
3260  if bit == 1:
3261  for lrow in range(0, ER):
3262  if oSheet.getCellByPosition(2, lrow).CellStyle in ('comp 1-a') and "*** VOCE AZZERATA ***" not in oSheet.getCellByPosition(2, lrow).String:
3263  for el in range(5, 9):
3264  if oSheet.getCellByPosition(el, lrow).Type.value == 'FORMULA':
3265  stringa =''
3266  break
3267  else:
3268  stringa = None
3269  if stringa == '':
3270  for el in range(5, 9):
3271  test = '>('
3272  if oSheet.getCellByPosition(el, lrow).Type.value == 'FORMULA':
3273  if '$' not in oSheet.getCellByPosition(el, lrow).Formula:
3274  try:
3275  eval(oSheet.getCellByPosition(el, lrow).Formula.split('=')[1])
3276  stringa = stringa + '(' + oSheet.getCellByPosition(el, lrow).Formula.split('=')[-1] + ')*'
3277  except:
3278  stringa = stringa + '(' + oSheet.getCellByPosition(el, lrow).String.split('=')[-1] + ')*'
3279  pass
3280  else:
3281  stringa = stringa + '*' + str(oSheet.getCellByPosition(el, lrow).String) + '*'
3282  while '**' in stringa:
3283  stringa=stringa.replace('**','*')
3284  if stringa[0] == '*':
3285  stringa = stringa[1:-1]
3286  else:
3287  stringa = stringa[0:-1]
3288  stringa = ' >(' + stringa + ')'
3289  if oSheet.getCellByPosition(2, lrow).Type.value != 'FORMULA':
3290  oSheet.getCellByPosition(2, lrow).String = oSheet.getCellByPosition(2, lrow).String + stringa.replace('.',',')
3291  else:
3292  for lrow in range(0, ER):
3293  if ' >(' in oSheet.getCellByPosition(2, lrow).String:
3294  oSheet.getCellByPosition(2, lrow).String = oSheet.getCellByPosition(2, lrow).String.split(' >(')[0]
3295  return
3296 
3297 def debug_validation(arg=None):
3298  oDoc = XSCRIPTCONTEXT.getDocument()
3299  oSheet = oDoc.CurrentController.ActiveSheet
3300  #~ mri(oDoc.CurrentSelection.Validation)
3301 
3302  oSheet.getCellRangeByName('L1').String = 'Ricicla da:'
3303  oSheet.getCellRangeByName('L1').CellStyle = 'Reg_prog'
3304  oCell= oSheet.getCellRangeByName('N1')
3305  if oCell.String not in("COMPUTO", "VARIANTE", 'Scegli origine'):
3306  oCell.CellStyle = 'Menu_sfondo _input_grasBig'
3307  valida_cella(oCell, '"COMPUTO";"VARIANTE"',titoloInput='Scegli...', msgInput='COMPUTO o VARIANTE', err=True)
3308  oCell.String ='Scegli...'
3309 
3310 def valida_cella(oCell, lista_val, titoloInput='', msgInput='', err= False ):
3311  '''
3312  Validità lista valori
3313  Imposta un elenco di valori a cascata, da cui scegliere.
3314  oCell { object } : cella da validare
3315  lista_val { string } : lista dei valori in questa forma: '"UNO";"DUE";"TRE"'
3316  titoloInput { string } : titolo del suggerimento che compare passando il cursore sulla cella
3317  msgInput { string } : suggerimento che compare passando il cursore sulla cella
3318  err { boolean } : permette di abilitare il messaggio di errore per input non validi
3319  '''
3320  oDoc = XSCRIPTCONTEXT.getDocument()
3321  oSheet = oDoc.CurrentController.ActiveSheet
3322 
3323  oTabVal = oCell.getPropertyValue("Validation")
3324  oTabVal.setPropertyValue('ConditionOperator', 1)
3325 
3326  oTabVal.setPropertyValue("ShowInputMessage", True)
3327  oTabVal.setPropertyValue("InputTitle", titoloInput)
3328  oTabVal.setPropertyValue("InputMessage", msgInput)
3329  oTabVal.setPropertyValue("ErrorMessage", "ERRORE: Questo valore non è consentito.")
3330  oTabVal.setPropertyValue("ShowErrorMessage", err)
3331  oTabVal.ErrorAlertStyle = uno.Enum("com.sun.star.sheet.ValidationAlertStyle", "STOP")
3332  oTabVal.Type = uno.Enum("com.sun.star.sheet.ValidationType", "LIST")
3333  oTabVal.Operator = uno.Enum("com.sun.star.sheet.ConditionOperator", "EQUAL")
3334  oTabVal.setFormula1(lista_val)
3335  oCell.setPropertyValue("Validation", oTabVal)
3336 
3338  oDoc = XSCRIPTCONTEXT.getDocument()
3339  oCell= oDoc.CurrentSelection
3340  oSheet = oDoc.CurrentController.ActiveSheet
3341 
3342  i =oCell.RangeAddress.StartRow
3343  n =oCell.Rows.Count
3344  oSheet.getRows().removeByIndex(i, n)
3345 
3346 def debugclip(arg=None):
3347  import pyperclip
3348  #~ mri(XSCRIPTCONTEXT.getComponentContext())
3349  sText = 'sticazzi'
3350  #create SystemClipboard instance
3351  oClip = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
3352  oClipContents = oClip.getContents()
3353  flavors = oClipContents.getTransferDataFlavors()
3354  mri(oClip)
3355  #~ for i in flavors:
3356  #~ aDataFlavor = flavors(i)
3357  #~ chi(aDataFlavor)
3358 
3359  return
3360  #~ createUnoService =(XSCRIPTCONTEXT.getComponentContext().getServiceManager().createInstance)
3361  #~ oTR = createUnoListener("Tr_", "com.sun.star.datatransfer.XTransferable")
3362  oClip.setContents( oTR, None )
3363  sTxtCString = sText
3364  oClip.flushClipboard()
3365 
3366 def copy_clip(arg=None):
3367  oDoc = XSCRIPTCONTEXT.getDocument()
3368  oSheet = oDoc.CurrentController.ActiveSheet
3369  ctx = XSCRIPTCONTEXT.getComponentContext()
3370  desktop = XSCRIPTCONTEXT.getDesktop()
3371  oFrame = desktop.getCurrentFrame()
3372 
3373  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
3374  dispatchHelper.executeDispatch(oFrame, ".uno:Copy", "", 0, list())
3375 
3376 def paste_clip(arg=None):
3377  oDoc = XSCRIPTCONTEXT.getDocument()
3378  oSheet = oDoc.CurrentController.ActiveSheet
3379  ctx = XSCRIPTCONTEXT.getComponentContext()
3380  desktop = XSCRIPTCONTEXT.getDesktop()
3381  oFrame = desktop.getCurrentFrame()
3382 
3383  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
3384  dispatchHelper.executeDispatch(oFrame, ".uno:Paste", "", 0, list())
3385  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
3386 
3387 
3388 def copia_celle_visibili(arg=None):
3389  '''
3390  A partire dalla selezione di un range di celle in cui alcune righe e/o
3391  colonne sono nascoste, mette in clipboard solo il contenuto delle celle
3392  visibili.
3393  Liberamente ispirato a "Copy only visible cells" http://bit.ly/2j3bfq2
3394  '''
3395  oDoc = XSCRIPTCONTEXT.getDocument()
3396  oSheet = oDoc.CurrentController.ActiveSheet
3397  try:
3398  oRangeAddress = oDoc.getCurrentSelection().getRangeAddresses()
3399  except AttributeError:
3400  oRangeAddress = oDoc.getCurrentSelection().getRangeAddress()
3401  IS = oRangeAddress.Sheet
3402  SC = oRangeAddress.StartColumn
3403  EC = oRangeAddress.EndColumn
3404  SR = oRangeAddress.StartRow
3405  ER = oRangeAddress.EndRow
3406  if EC == 1023:
3407  EC = getLastUsedCell(oSheet).EndColumn
3408  if ER == 1048575:
3409  ER = getLastUsedCell(oSheet).EndRow
3410  righe = list()
3411  colonne = list()
3412  i = 0
3413  for nRow in range(SR, ER+1):
3414  if oSheet.getCellByPosition(SR, nRow).Rows.IsVisible == False:
3415  righe.append(i)
3416  i += 1
3417  i = 0
3418  for nCol in range(SC, EC+1):
3419  if oSheet.getCellByPosition(nCol, nRow).Columns.IsVisible == False:
3420  colonne.append(i)
3421  i += 1
3422 
3423  if oDoc.getSheets().hasByName('tmp_clip') == False:
3424  sheet = oDoc.createInstance("com.sun.star.sheet.Spreadsheet")
3425  tmp = oDoc.Sheets.insertByName('tmp_clip', sheet)
3426  tmp = oDoc.getSheets().getByName('tmp_clip')
3427 
3428  oCellAddress = tmp.getCellByPosition(0,0).getCellAddress()
3429  tmp.copyRange(oCellAddress, oRangeAddress)
3430 
3431  for i in reversed(righe):
3432  tmp.getRows().removeByIndex(i, 1)
3433  for i in reversed(colonne):
3434  tmp.getColumns().removeByIndex(i, 1)
3435 
3436  oRange = tmp.getCellRangeByPosition(0,0, EC-SC-len(colonne), ER-SR-len(righe))
3437  oDoc.CurrentController.select(oRange)
3438 
3439  ctx = XSCRIPTCONTEXT.getComponentContext()
3440  desktop = XSCRIPTCONTEXT.getDesktop()
3441  oFrame = desktop.getCurrentFrame()
3442  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
3443  dispatchHelper.executeDispatch(oFrame, ".uno:Copy", "", 0, list())
3444  oDoc.Sheets.removeByName('tmp_clip')
3445  oDoc.CurrentController.setActiveSheet(oSheet)
3446  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(SC, SR, EC, ER))
3447 # Range2Cell ###########################################################
3448 def Range2Cell(arg=None):
3449  '''
3450  Restituisce la tupla (IDcolonna, IDriga, NameSheet) della posizione corrente
3451  '''
3452  oDoc = XSCRIPTCONTEXT.getDocument()
3453  oSheet = oDoc.CurrentController.ActiveSheet
3454  try:
3455  if oDoc.getCurrentSelection().getRangeAddresses()[0]:
3456  nRow = oDoc.getCurrentSelection().getRangeAddresses()[0].StartRow
3457  nCol = oDoc.getCurrentSelection().getRangeAddresses()[0].StartColumn
3458  except AttributeError:
3459  nRow = oDoc.getCurrentSelection().getRangeAddress().StartRow
3460  nCol = oDoc.getCurrentSelection().getRangeAddress().StartColumn
3461  return(nCol, nRow, oSheet.Name)
3462 
3464 def getLastUsedCell(oSheet):
3465  '''
3466  Restitusce l'indirizzo dell'ultima cella usata
3467  in forma di oggetto
3468  '''
3469  oCell = oSheet.getCellByPosition(0, 0)
3470  oCursor = oSheet.createCursorByRange(oCell)
3471  oCursor.gotoEndOfUsedArea(True)
3472  aAddress = oCursor.RangeAddress
3473  return aAddress#.EndColumn, aAddress.EndRow)
3474 
3476 def numera_voci(bit=1):#
3477  '''
3478  bit { integer } : 1 rinumera tutto
3479  0 rinumera dalla voce corrente in giù
3480  '''
3481  oDoc = XSCRIPTCONTEXT.getDocument()
3482  oSheet = oDoc.CurrentController.ActiveSheet
3483  lastRow = getLastUsedCell(oSheet).EndRow+1
3484  lrow = Range2Cell()[1]
3485  n = 1
3486  if bit==0:
3487  for x in reversed(range(0, lrow)):
3488  if oSheet.getCellByPosition(1,x).CellStyle in('comp Art-EP', 'comp Art-EP_R') and oSheet.getCellByPosition(1,x).CellBackColor != 15066597:
3489  n = oSheet.getCellByPosition(0,x).Value +1
3490  break
3491  for row in range(lrow,lastRow):
3492  if oSheet.getCellByPosition(1,row).CellBackColor == 15066597:
3493  oSheet.getCellByPosition(0,row).String = ''
3494  elif oSheet.getCellByPosition(1,row).CellStyle in('comp Art-EP', 'comp Art-EP_R'):
3495  oSheet.getCellByPosition(0,row).Value = n
3496  n +=1
3497  if bit==1:
3498  for row in range(0,lastRow):
3499  if oSheet.getCellByPosition(1,row).CellBackColor == 15066597:
3500  oSheet.getCellByPosition(0,row).String = ''
3501  elif oSheet.getCellByPosition(1,row).CellStyle in('comp Art-EP', 'comp Art-EP_R'):
3502  oSheet.getCellByPosition(0,row).Value = n
3503  n = n+1
3504 
3505 
3506 def refresh(arg=1):
3507  '''
3508  Abilita / disabilita il refresh per accelerare le procedure
3509  '''
3510  oDoc = XSCRIPTCONTEXT.getDocument()
3511  if arg == 0:
3512  #~ oDoc.CurrentController.ZoomValue = 400
3513  oDoc.enableAutomaticCalculation(False) # blocco il calcolo automatico
3514  #~ oDoc.addActionLock()
3515  #~ oDoc.removeActionLock()
3516  #~ oDoc.lockControllers #disattiva l'eco a schermo
3517  elif arg == 1:
3518  #~ oDoc.CurrentController.ZoomValue = 100
3519  oDoc.enableAutomaticCalculation(True) # sblocco il calcolo automatico
3520  #~ oDoc.removeActionLock()
3521  #~ oDoc.unlockControllers #attiva l'eco a schermo
3522 
3523 def richiesta_offerta(arg=None):
3524  '''Crea la Lista Lavorazioni e Forniture dall'Elenco Prezzi,
3525 per la formulazione dell'offerta'''
3526  oDoc = XSCRIPTCONTEXT.getDocument()
3527  _gotoSheet('Elenco Prezzi')
3528  #~ genera_sommario()
3529  oSheet = oDoc.CurrentController.ActiveSheet
3530  try:
3531  oDoc.Sheets.copyByName(oSheet.Name,'Elenco Prezzi', 5)
3532  except:
3533  pass
3534  nSheet = oDoc.getSheets().getByIndex(5).Name
3535  _gotoSheet(nSheet)
3536  setTabColor(10079487)
3537  oSheet = oDoc.CurrentController.ActiveSheet
3538  fine = getLastUsedCell(oSheet).EndRow+1
3539  oRange = oSheet.getCellRangeByPosition (12,3,12, fine)
3540  aSaveData = oRange.getDataArray()
3541  oRange = oSheet.getCellRangeByPosition (3,3,3, fine)
3542  oRange.CellStyle = 'EP statistiche_q'
3543  oRange.setDataArray(aSaveData)
3544 
3545  oSheet.getCellByPosition(3 , 2).String = 'Quantità\na Computo'
3546  oSheet.getCellByPosition(5 , 2).String = 'Prezzo Unitario\nin lettere'
3547  oSheet.getCellByPosition(6 , 2).String = 'Importo'
3548  oSheet.Columns.removeByIndex(7, 100)
3549  oSheet.getColumns().getByName("D").IsVisible = True
3550  oSheet.getColumns().getByName("F").IsVisible = True
3551  oSheet.getColumns().getByName("G").IsVisible = True
3552  oSheet.getColumns().getByName("A").Columns.Width = 1600
3553  oSheet.getColumns().getByName("B").Columns.Width = 8000
3554  oSheet.getColumns().getByName("C").Columns.Width = 1200
3555  oSheet.getColumns().getByName("D").Columns.Width = 1600
3556  oSheet.getColumns().getByName("E").Columns.Width = 1500
3557  oSheet.getColumns().getByName("F").Columns.Width = 4000
3558  oSheet.getColumns().getByName("G").Columns.Width = 1800
3559  oDoc.CurrentController.freezeAtPosition(0, 1)
3560  formule = list()
3561  for x in range(3,getLastUsedCell(oSheet).EndRow-1):
3562  formule.append(['=IF(E' + str(x+1) + '<>"";D' + str(x+1) + '*E' + str(x+1) + ';""'])
3563  oSheet.getCellRangeByPosition (6,3,6,len(formule)+2).CellBackColor = 15757935
3564  oRange = oSheet.getCellRangeByPosition (6,3,6,len(formule)+2)
3565  formule = tuple(formule)
3566  oRange.setFormulaArray(formule)
3567 
3568  oSheet.getCellRangeByPosition(4, 3, 4, fine).clearContents(VALUE + DATETIME + STRING +
3569  ANNOTATION + FORMULA + HARDATTR +
3570  OBJECTS + EDITATTR + FORMATTED)
3571 
3572  oSheet.getCellRangeByPosition(0, fine-1, 100, fine+1).clearContents(VALUE + FORMULA + STRING)
3573 
3574  oSheet.Columns.insertByIndex(0, 1)
3575  oSrc = oSheet.getCellRangeByPosition(1,0,1, fine).RangeAddress
3576  oDest = oSheet.getCellByPosition(0,0 ).CellAddress
3577  oSheet.copyRange(oDest, oSrc)
3578  oSheet.getCellByPosition(0,2).String="N."
3579  for x in range(3, fine-1):
3580  oSheet.getCellByPosition(0,x).Value = x-2
3581  oSheet.getColumns().getByName("A").Columns.Width = 650
3582 
3583  oSheet.getCellByPosition(7,fine).Formula="=SUBTOTAL(9;H2:H"+ str(fine+1) +")"
3584  oSheet.getCellByPosition(2,fine).String="TOTALE COMPUTO"
3585  oSheet.getCellRangeByPosition(0,fine,7,fine).CellStyle="Comp TOTALI"
3586  oSheet.Rows.removeByIndex(fine-1, 1)
3587  oSheet.Rows.removeByIndex(0, 2)
3588 
3589  oSheet.getCellByPosition(2,fine+3).String="(diconsi euro - in lettere)"
3590  oSheet.getCellRangeByPosition (2,fine+3,6,fine+3).CellStyle="List-intest_med_c"
3591 
3592  oSheet.getCellByPosition(2,fine+5).String="Pari a Ribasso del ___________%"
3593 
3594  oSheet.getCellByPosition(2,fine+8).String="(ribasso in lettere)"
3595  oSheet.getCellRangeByPosition (2,fine+8,6,fine+8).CellStyle="List-intest_med_c"
3596 
3597  # INSERISCI LA DATA E L'OFFERENTE
3598  oSheet.getCellByPosition(2, fine+10).Formula = '=CONCATENATE("Data, ";TEXT(NOW();"GG/MM/AAAA"))'
3599  oSheet.getCellRangeByPosition (2,fine+10,2,fine+10).CellStyle = "Ultimus"
3600  oSheet.getCellByPosition(2, fine+12).String = "L'OFFERENTE"
3601  oSheet.getCellByPosition(2, fine+12).CellStyle = 'centro_grassetto'
3602  oSheet.getCellByPosition(2, fine+13).String= '(timbro e firma)'
3603  oSheet.getCellByPosition(2, fine+13).CellStyle = 'centro_corsivo'
3604 
3605  # CONSOLIDA LA DATA
3606  oRange = oSheet.getCellRangeByPosition (2,fine+10,2,fine+10)
3607  #~ Flags = com.sun.star.sheet.CellFlags.FORMULA
3608  aSaveData = oRange.getDataArray()
3609  oRange.setDataArray(aSaveData)
3610 
3611  oSheet.getCellRangeByPosition(0, 0, getLastUsedCell(oSheet).EndColumn, getLastUsedCell(oSheet).EndRow).CellBackColor = -1
3612 
3613  _gotoCella(0, 1)
3614  adatta_altezza_riga(nSheet)
3615 
3616 # imposta stile pagina ed intestazioni
3617  oSheet.PageStyle = 'PageStyle_COMPUTO_A4'
3618  pagestyle = oDoc.StyleFamilies.getByName('PageStyles').getByName('PageStyle_COMPUTO_A4')
3619  pagestyle.HeaderIsOn = True
3620  left = pagestyle.RightPageHeaderContent.LeftText.Text
3621 
3622  pagestyle.HeaderIsOn= True
3623  oHContent=pagestyle.RightPageHeaderContent
3624  filename = '' #uno.fileUrlToSystemPath(oDoc.getURL())
3625  if len(filename) > 50:
3626  filename = filename[:20] + ' ... ' + filename[-20:]
3627  oHContent.LeftText.String = filename
3628  oHContent.CenterText.String=''
3629  oHContent.RightText.String = tempo = ''.join(''.join(''.join(str(datetime.now()).split('.')[0].split(' ')).split('-')).split(':'))
3630 
3631  pagestyle.RightPageHeaderContent=oHContent
3632  return
3633 
3634 def ins_voce_elenco(arg=None):
3635  '''
3636  Inserisce una nuova riga voce in Elenco Prezzi
3637  '''
3638  oDoc = XSCRIPTCONTEXT.getDocument()
3639  refresh(0)
3640  oSheet = oDoc.CurrentController.ActiveSheet
3641  _gotoCella(0,3)
3642  oSheet.getRows().insertByIndex(3,1)
3643 
3644  oSheet.getCellByPosition(0, 3).CellStyle = "EP-aS"
3645  oSheet.getCellByPosition(1, 3).CellStyle = "EP-a"
3646  oSheet.getCellRangeByPosition(2, 3, 7, 3).CellStyle = "EP-mezzo"
3647  oSheet.getCellRangeByPosition(8, 3, 9, 3).CellStyle = "EP-sfondo"
3648  for el in(5, 11, 15, 19, 26):
3649  oSheet.getCellByPosition(el, 3).CellStyle = "EP-mezzo %"
3650 
3651  for el in(12, 16, 20, 21):#(12, 16, 20):
3652  oSheet.getCellByPosition(el, 3).CellStyle = 'EP statistiche_q'
3653 
3654  for el in(13, 17, 23, 24, 25):#(12, 16, 20):
3655  oSheet.getCellByPosition(el, 3).CellStyle = 'EP statistiche'
3656 
3657  oSheet.getCellRangeByPosition(0, 3, 26, 3).clearContents(HARDATTR)
3658  oSheet.getCellByPosition(11, 3).Formula = '=IF(ISERROR(N4/$N$2);"--";N4/$N$2)'
3659  #~ oSheet.getCellByPosition(11, 3).Formula = '=N4/$N$2'
3660  oSheet.getCellByPosition(12, 3).Formula = '=SUMIF(AA;A4;BB)'
3661  oSheet.getCellByPosition(13, 3).Formula = '=SUMIF(AA;A4;cEuro)'
3662 
3663  #copio le formule dalla riga sotto
3664  oRangeAddress = oSheet.getCellRangeByPosition(15, 4, 26, 4).getRangeAddress()
3665  oCellAddress = oSheet.getCellByPosition(15,3).getCellAddress()
3666  oSheet.copyRange(oCellAddress, oRangeAddress)
3667  oCell = oSheet.getCellByPosition(2, 3)
3668  valida_cella(oCell, '"cad";"corpo";"dm";"dm²";"dm³";"kg";"lt";"m";"m²";"m³";"q";"t";"',titoloInput='Scegli...', msgInput='Unità di misura')
3669  refresh(1)
3670 
3673  oDoc = XSCRIPTCONTEXT.getDocument()
3674  oSheet = oDoc.CurrentController.ActiveSheet
3675  #lrow = Range2Cell()[1]
3676 
3680 
3681  #~ insRows(lrow,4) #inserisco le righe
3682  #~ oSheet.getCellByPosition(0,lrow).CellStyle = 'Comp Start Attributo'
3683  #~ oSheet.getCellRangeByPosition(0,lrow,30,lrow).CellStyle = 'Comp-Bianche sopra'
3684  #~ oSheet.getCellByPosition(2,lrow).CellStyle = 'Comp-Bianche sopraS'
3685  #~
3686  #~ oSheet.getCellByPosition(0,lrow+1).CellStyle = 'comp progress'
3687  #~ oSheet.getCellByPosition(1,lrow+1).CellStyle = 'comp Art-EP'
3688  #~ oSheet.getCellRangeByPosition(2,lrow+1,8,lrow+1).CellStyle = 'Comp-Bianche in mezzo Descr'
3689  #~ oSheet.getCellRangeByPosition(2,lrow+1,8,lrow+1).merge(True)
3690 
3692  oSheetto = oDoc.getSheets().getByName('S5')
3693  #~ oRangeAddress = oSheetto.getCellRangeByName('$A$9:$AR$12').getRangeAddress()
3694  oRangeAddress = oSheetto.getCellRangeByPosition(0, 8, 42, 11).getRangeAddress()
3695  oCellAddress = oSheet.getCellByPosition(0,lrow).getCellAddress()
3696  oSheet.getRows().insertByIndex(lrow, 4)#~ insRows(lrow,4) #inserisco le righe
3697  oSheet.copyRange(oCellAddress, oRangeAddress)
3698 
3703  iSheet = oSheet.RangeAddress.Sheet
3704  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
3705  oCellRangeAddr.Sheet = iSheet
3706  oCellRangeAddr.StartColumn = 0
3707  oCellRangeAddr.EndColumn = 0
3708  oCellRangeAddr.StartRow = lrow+2
3709  oCellRangeAddr.EndRow = lrow+2
3710  oSheet.group(oCellRangeAddr, 1)
3711 
3713  oSheet.getCellByPosition(13,lrow+3).Formula ='=J'+str(lrow+4)
3714  oSheet.getCellByPosition(35,lrow+3).Formula ='=B'+str(lrow+2)
3715 
3716  if oSheet.getCellByPosition(31, lrow-1).CellStyle in('livello2 valuta', 'Livello-0-scritta', 'Livello-1-scritta', 'compTagRiservato'):
3717  oSheet.getCellByPosition(31, lrow+3).Value = oSheet.getCellByPosition(31, lrow-1).Value
3718  oSheet.getCellByPosition(32, lrow+3).Value = oSheet.getCellByPosition(32, lrow-1).Value
3719  oSheet.getCellByPosition(33, lrow+3).Value = oSheet.getCellByPosition(33, lrow-1).Value
3720 
3721  _gotoCella(1,lrow+1)
3722 
3724 def ins_voce_computo(arg=None): #TROPPO LENTA
3725  oDoc = XSCRIPTCONTEXT.getDocument()
3726  oSheet = oDoc.CurrentController.ActiveSheet
3727  lrow = Range2Cell()[1]
3728  if oSheet.getCellByPosition(0, lrow).CellStyle in(noVoce + stili_computo):
3729  lrow = next_voice(lrow, 1)
3730  else:
3731  return
3733  numera_voci(0)
3734  if conf.read(path_conf, 'Generale', 'pesca_auto') == '1':
3735  pesca_cod()
3736 
3737 def rigenera_voce(arg=None):
3738 #~ def debug(arg=None):
3739  '''
3740  Ripristina/ricalcola le formule di descrizione e somma di una voce.
3741  '''
3742  oDoc = XSCRIPTCONTEXT.getDocument()
3743  oSheet = oDoc.CurrentController.ActiveSheet
3744  lrow = Range2Cell()[1]
3745  sStRange = Circoscrive_Voce_Computo_Att(lrow)
3746  sopra = sStRange.RangeAddress.StartRow
3747  sotto = sStRange.RangeAddress.EndRow
3748  for r in range(sopra+2, sotto):
3749  if oSheet.getCellByPosition(2, r).CellStyle == 'comp 1-a' and oSheet.getCellByPosition(9, r).Type.value != 'FORMULA':
3750  if oSheet.getCellByPosition(4, r).Type.value == 'EMPTY':
3751  oSheet.getCellByPosition(9, r).Formula = '=IF(PRODUCT(F' + str(r+1) + ':I' + str(r+1) + ')=0;"";PRODUCT(F' + str(r+1) + ':I' + str(r+1) + '))'
3752  else:
3753  oSheet.getCellByPosition(9, r).Formula = '=IF(PRODUCT(E' + str(r+1) + ':I' + str(r+1) + ')=0;"";PRODUCT(E' + str(r+1) + ':I' + str(r+1) + '))'
3754  oSheet.getCellByPosition(2, sopra+1).Formula = '=IF(LEN(VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;2;FALSE()))<($S1.$H$337+$S1.$H$338);VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;2;FALSE());CONCATENATE(LEFT(VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;2;FALSE());$S1.$H$337);" [...] ";RIGHT(VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;2;FALSE());$S1.$H$338)))'
3755  oSheet.getCellByPosition(8, sotto).Formula = '=CONCATENATE("SOMMANO [";VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;3;FALSE());"]")'
3756  oSheet.getCellByPosition(9, sotto).Formula = '=SUBTOTAL(9;J'+ str(sopra+2) + ':J'+ str(sotto+1) + ')'
3757  oSheet.getCellByPosition(11, sotto).Formula = '=VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;5;FALSE())'
3758  oSheet.getCellByPosition(13, sotto).Formula = '=J'+ str(sotto+1)
3759  oSheet.getCellByPosition(17, sotto).Formula = '=AB'+ str(sotto+1) +'*J'+ str(sotto+1)
3760  oSheet.getCellByPosition(18, sotto).Formula = '=J'+ str(sotto+1) +'*L'+ str(sotto+1)
3761  oSheet.getCellByPosition(27, sotto).Formula = '=VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;4;FALSE())'
3762  #~ return
3763  oSheet.getCellByPosition(28, sotto).Formula = '=S'+ str(sotto+1) +'-AE'+ str(sotto+1)
3764  oSheet.getCellByPosition(29, sotto).Formula = '=VLOOKUP(B'+ str(sopra+2) + ';elenco_prezzi;6;FALSE())'
3765  oSheet.getCellByPosition(30, sotto).Formula = '=IF(AD'+ str(sotto+1) +'<>""; PRODUCT(AD'+ str(sotto+1) +'*S'+ str(sotto+1) +'))'
3766  oSheet.getCellByPosition(35, sotto).Formula = '=B'+ str(sopra+2)
3767  oSheet.getCellByPosition(36, sotto).Formula = '=IF(ISERROR(S'+ str(sotto+1) +');"";IF(S'+ str(sotto+1) +'<>"";S'+ str(sotto+1) +';""))'
3768 
3769 def rigenera_tutte(arg=None):
3770  '''
3771  Ripristina le formule in tutto il foglio
3772  '''
3773  oDialogo_attesa = dlg_attesa()
3774  oDoc = XSCRIPTCONTEXT.getDocument()
3775  oSheet = oDoc.CurrentController.ActiveSheet
3776  refresh(0)
3777  oDoc.CurrentController.ZoomValue = 400
3778  row = 3
3779  last = ultima_voce(oSheet)
3780  attesa().start() #mostra il dialogo
3781  while row < last:
3782  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(0, row, 30, row))
3783  rigenera_voce()
3784  row = next_voice(row, 1)
3786  oDoc.CurrentController.ZoomValue = 100
3787  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
3788  refresh(1)
3789  oDialogo_attesa.endExecute()
3790  return
3791 
3793 def leeno_conf(arg=None):
3794  '''
3795  Visualizza il menù di configurazione
3796  '''
3797  oDoc = XSCRIPTCONTEXT.getDocument()
3798  if not oDoc.getSheets().hasByName('S1'):
3799  for bar in GetmyToolBarNames:
3800  toolbar_on(bar, 0)
3801  return
3802  psm = uno.getComponentContext().ServiceManager
3803  dp = psm.createInstance("com.sun.star.awt.DialogProvider")
3804  oDlg_config = dp.createDialog("vnd.sun.star.script:UltimusFree2.Dlg_config?language=Basic&location=application")
3805  oDialog1Model = oDlg_config.Model
3806 
3807  try:
3808  oSheets = list(oDoc.getSheets().getElementNames())
3809  for nome in ('M1', 'S1', 'S2', 'S4', 'S5', 'Elenco Prezzi', 'COMPUTO'):
3810  oSheets.remove(nome)
3811  for nome in oSheets:
3812  oSheet = oDoc.getSheets().getByName(nome)
3813  if oSheet.IsVisible == False:
3814  oDlg_config.getControl('CheckBox2').State = 0
3815  test = 0
3816  break
3817  else:
3818  oDlg_config.getControl('CheckBox2').State = 1
3819  test = 1
3820  if oDoc.getSheets().getByName("copyright_LeenO").IsVisible == True: oDlg_config.getControl('CheckBox2').State = 1
3821  if conf.read(path_conf, 'Generale', 'pesca_auto') == '1': oDlg_config.getControl('CheckBox1').State = 1 #pesca codice automatico
3822  if conf.read(path_conf, 'Generale', 'toolbar_contestuali') == '1': oDlg_config.getControl('CheckBox6').State = 1
3823 
3824  oSheet = oDoc.getSheets().getByName('S5')
3825  # descrizione_in_una_colonna
3826  if oSheet.getCellRangeByName('C9').IsMerged == False:
3827  oDlg_config.getControl('CheckBox5').State = 1
3828  else:
3829  oDlg_config.getControl('CheckBox5').State = 0
3830 
3831  #~ if conf.read(path_conf, 'Generale', 'descrizione_in_una_colonna') == '1': oDlg_config.getControl('CheckBox5').State = 1
3832 
3833  sString = oDlg_config.getControl('TextField1')
3834  sString.Text = conf.read(path_conf, 'Generale', 'altezza_celle')
3835 
3836  sString = oDlg_config.getControl("ComboBox1")
3837  sString.Text = conf.read(path_conf, 'Generale', 'visualizza') #visualizza all'avvio
3838 
3839  sString = oDlg_config.getControl("ComboBox2") #spostamento ad INVIO
3840  if conf.read(path_conf, 'Generale', 'movedirection')== '1':
3841  sString.Text = 'A DESTRA'
3842  elif conf.read(path_conf, 'Generale', 'movedirection')== '0':
3843  sString.Text = 'IN BASSO'
3844  oSheet = oDoc.getSheets().getByName('S1')
3845 
3846  # fullscreen
3847  oLayout = oDoc.CurrentController.getFrame().LayoutManager
3848  if oLayout.isElementVisible('private:resource/toolbar/standardbar') == False:
3849  oDlg_config.getControl('CheckBox3').State = 1
3850 
3851  sString = oDlg_config.getControl('TextField14')
3852  sString.Text =oSheet.getCellRangeByName('S1.H334').Value #vedi_voce_breve
3853  sString = oDlg_config.getControl('TextField4')
3854  sString.Text =oSheet.getCellRangeByName('S1.H335').Value #cont_inizio_voci_abbreviate
3855  if oDoc.NamedRanges.hasByName("#Lib#1") == True:
3856  sString.setEnable(False)
3857  sString = oDlg_config.getControl('TextField12')
3858  sString.Text =oSheet.getCellRangeByName('S1.H336').Value #cont_fine_voci_abbreviate
3859  if oDoc.NamedRanges.hasByName("#Lib#1") == True:
3860  sString.setEnable(False)
3861  sString = oDlg_config.getControl('TextField10')
3862  sString.Text =oSheet.getCellRangeByName('S1.H337').Value #inizio_voci_abbreviate
3863  sString = oDlg_config.getControl('TextField11')
3864  sString.Text =oSheet.getCellRangeByName('S1.H338').Value #fine_voci_abbreviate
3865 
3866  if conf.read(path_conf, 'Generale', 'torna_a_ep') == '1': oDlg_config.getControl('CheckBox8').State = 1
3867 
3868  # Contabilità abilita
3869  if oSheet.getCellRangeByName('S1.H328').Value == 1: oDlg_config.getControl('CheckBox7').State = 1
3870  sString = oDlg_config.getControl('TextField13')
3871  sString.Text = conf.read(path_conf, 'Contabilità', 'idxSAL')
3872  sString = oDlg_config.getControl('ComboBox3')
3873  sString.Text = conf.read(path_conf, 'Contabilità', 'ricicla_da')
3874 
3875  except:
3876  config_default()
3877 
3878  oDlg_config.execute()
3879 
3880  if oDlg_config.getControl('CheckBox2').State != test:
3881  if oDlg_config.getControl('CheckBox2').State == 1:
3882  show_sheets(True)
3883  else:
3884  show_sheets(False)
3885 
3886  if oDlg_config.getControl('CheckBox3').State == 1:
3887  toolbar_switch(0)
3888  else:
3889  toolbar_switch(1)
3890 
3891  conf.write(path_conf, 'Generale', 'visualizza', oDlg_config.getControl('ComboBox1').getText())
3892 
3893  ctx = XSCRIPTCONTEXT.getComponentContext()
3894  oGSheetSettings = ctx.ServiceManager.createInstanceWithContext("com.sun.star.sheet.GlobalSheetSettings", ctx)
3895  if oDlg_config.getControl('ComboBox2').getText() == 'IN BASSO':
3896  conf.write(path_conf, 'Generale', 'movedirection', '0')
3897  oGSheetSettings.MoveDirection = 0
3898  else:
3899  conf.write(path_conf, 'Generale', 'movedirection', '1')
3900  oGSheetSettings.MoveDirection = 1
3901  conf.write(path_conf, 'Generale', 'altezza_celle', oDlg_config.getControl('TextField1').getText())
3902 
3903  conf.write(path_conf, 'Generale', 'pesca_auto', str(oDlg_config.getControl('CheckBox1').State))
3904  conf.write(path_conf, 'Generale', 'descrizione_in_una_colonna', str(oDlg_config.getControl('CheckBox5').State))
3905  conf.write(path_conf, 'Generale', 'toolbar_contestuali', str(oDlg_config.getControl('CheckBox6').State))
3906  toolbar_vedi()
3907  if oDlg_config.getControl('CheckBox5').State == 1:
3909  else:
3911  conf.write(path_conf, 'Generale', 'torna_a_ep', str(oDlg_config.getControl('CheckBox8').State)) #torna su prezzario
3912 
3913 #il salvataggio anche su leeno.conf serve alla funzione voce_breve()
3914 
3915  if oDlg_config.getControl('TextField14').getText() != '10000': conf.write(path_conf, 'Generale', 'vedi_voce_breve', oDlg_config.getControl('TextField14').getText())
3916  oSheet.getCellRangeByName('S1.H334').Value = float(oDlg_config.getControl('TextField14').getText())
3917 
3918  if oDlg_config.getControl('TextField4').getText() != '10000': conf.write(path_conf, 'Contabilità', 'cont_inizio_voci_abbreviate', oDlg_config.getControl('TextField4').getText())
3919  oSheet.getCellRangeByName('S1.H335').Value = float(oDlg_config.getControl('TextField4').getText())
3920 
3921  if oDlg_config.getControl('TextField12').getText() != '10000': conf.write(path_conf, 'Contabilità', 'cont_fine_voci_abbreviate', oDlg_config.getControl('TextField12').getText())
3922  oSheet.getCellRangeByName('S1.H336').Value = float(oDlg_config.getControl('TextField12').getText())
3924 
3925  conf.write(path_conf, 'Contabilità', 'abilita', str(oDlg_config.getControl('CheckBox7').State))
3926  conf.write(path_conf, 'Contabilità', 'idxSAL', oDlg_config.getControl('TextField13').getText())
3927  if oDlg_config.getControl('ComboBox3').getText() in ('COMPUTO', '&305.Dlg_config.ComboBox3.Text'):
3928  conf.write(path_conf, 'Contabilità', 'ricicla_da', 'COMPUTO')
3929  else:
3930  conf.write(path_conf, 'Contabilità', 'ricicla_da', 'VARIANTE')
3931 
3933 if sys.platform == 'win32':
3934  path_conf = os.getenv("APPDATA") + '/.config/leeno/leeno.conf'
3935 else:
3936  path_conf = os.getenv("HOME") + '/.config/leeno/leeno.conf'
3937 class conf:
3938  '''
3939  path { string }: indirizzo del file di configurazione
3940  section { string }: sezione
3941  option { string }: opzione
3942  value { string }: valore
3943  '''
3944  def __init__(self, path=path_conf):
3945  #~ config = configparser.SafeConfigParser()
3946  #~ config.read(path)
3947  #~ self.path = path
3948  pass
3949  def write(path, section, option, value):
3950  """
3951  Scrive i dati nel file di configurazione.
3952  http://www.programcreek.com/python/example/1033/ConfigParser.SafeConfigParser
3953  Write the specified Section.Option to the config file specified by path.
3954  Replace any previous value. If the path doesn't exist, create it.
3955  Also add the option the the in-memory config.
3956  """
3957  config = configparser.SafeConfigParser()
3958  config.read(path)
3959 
3960  if not config.has_section(section):
3961  config.add_section(section)
3962  config.set(section, option, value)
3963 
3964  fp = open(path, 'w')
3965  config.write(fp)
3966  fp.close()
3967 
3968  def read(path, section, option):
3969  '''
3970  https://pymotw.com/2/ConfigParser/
3971  Legge i dati dal file di configurazione.
3972  '''
3973  config = configparser.SafeConfigParser()
3974  config.read(path)
3975  return config.get(section, option)
3976 
3977  def diz(path):
3978  '''
3979  Legge tutto il file di configurazione e restituisce un dizionario.
3980  '''
3981  my_config_parser_dict = {s:dict(config.items(s)) for s in config.sections()}
3982  return my_config_parser_dict
3983 
3984 def config_default(arg=None):
3985  '''
3986  Imposta i parametri di default in leeno.conf
3987  '''
3988  parametri = (
3989  ('Zoom', 'fattore', '100'),
3990  ('Zoom', 'fattore_ottimale', '81'),
3991  ('Zoom', 'fullscreen', '0'),
3992  ('Generale', 'visualizza', 'Menù Principale'),
3993  ('Generale', 'altezza_celle', '1.25'),
3994  ('Generale', 'pesca_auto', '1'),
3995  ('Generale', 'movedirection', '1'),
3996  ('Generale', 'descrizione_in_una_colonna', '0'),
3997  ('Generale', 'toolbar_contestuali', '1'),
3998  ('Generale', 'vedi_voce_breve', '50'),
3999  ('Generale', 'dettaglio', '1'),
4000 
4001  #~ ('Computo', 'riga_bianca_categorie', '1'),
4002  #~ ('Computo', 'voci_senza_numerazione', '0'),
4003  ('Computo', 'inizio_voci_abbreviate', '100'),
4004  ('Computo', 'fine_voci_abbreviate', '120'),
4005  ('Contabilità', 'cont_inizio_voci_abbreviate', '100'),
4006  ('Contabilità', 'cont_fine_voci_abbreviate', '120'),
4007  ('Contabilità', 'abilita', '0'),
4008  ('Contabilità', 'idxSAL', '30'),
4009  ('Contabilità', 'ricicla_da', 'COMPUTO')
4010  )
4011  for el in parametri:
4012  try:
4013  conf.read(path_conf, el[0], el[1])
4014  except:
4015  conf.write(path_conf, el[0], el[1], el[2])
4016 
4017 def nuova_voce_scelta(arg=None): #assegnato a ctrl-shift-n
4018  '''
4019  Contestualizza in ogni tabella l'inserimento delle voci.
4020  '''
4021  oDoc = XSCRIPTCONTEXT.getDocument()
4022  oSheet = oDoc.CurrentController.ActiveSheet
4023  if oSheet.Name in('COMPUTO', 'VARIANTE'):
4025  elif oSheet.Name =='Analisi di Prezzo':
4027  elif oSheet.Name =='CONTABILITA':
4028  ins_voce_contab()
4029  elif oSheet.Name =='Elenco Prezzi':
4030  ins_voce_elenco()
4031 
4032 # nuova_voce_contab ##################################################
4033 def ins_voce_contab(arg=1):
4034  '''
4035  Inserisce una nuova voce in CONTABILITA.
4036  '''
4037  oDoc = XSCRIPTCONTEXT.getDocument()
4038  oSheet = oDoc.CurrentController.ActiveSheet
4039  lrow = Range2Cell()[1]
4040  nome = oSheet.Name
4041  try:
4042 
4043  cerca_partenza()
4044  if partenza[2] == '#reg':
4045  sblocca_cont()
4046  if sblocca_computo == 0:
4047  return
4048  pass
4049  else:
4050  pass
4051 
4052  except:
4053  pass
4054  stile = oSheet.getCellByPosition( 0, lrow).CellStyle
4055  nSal = 1
4056  if stile == 'comp Int_colonna_R_prima':
4057  lrow += 1
4058  elif stile =='Ultimus_centro_bordi_lati':
4059  i = lrow
4060  while i != 0:
4061  if oSheet.getCellByPosition(23, i).Value != 0:
4062  nSal = int(oSheet.getCellByPosition(23, i).Value)
4063  break
4064  i -= 1
4065  while oSheet.getCellByPosition( 0, lrow).CellStyle == stile:
4066  lrow += 1
4067  if oSheet.getCellByPosition( 0, lrow).CellStyle == 'uuuuu':
4068  lrow += 1
4069  #~ nSal += 1
4070  #~ else
4071  elif stile == 'Comp TOTALI':
4072  pass
4073  elif stile in stili_contab:
4074  sStRange = Circoscrive_Voce_Computo_Att(lrow)
4075  nSal = int(oSheet.getCellByPosition(23, sStRange.RangeAddress.StartRow + 1).Value)
4076  lrow = next_voice(lrow)
4077  else:
4078  return
4079  oSheetto = oDoc.getSheets().getByName('S5')
4080  oRangeAddress = oSheetto.getCellRangeByPosition(0, 22, 48, 26).getRangeAddress()
4081  oCellAddress = oSheet.getCellByPosition(0,lrow).getCellAddress()
4082  oSheet.getRows().insertByIndex(lrow, 5) #inserisco le righe
4083  oSheet.copyRange(oCellAddress, oRangeAddress)
4084  oSheet.getCellRangeByPosition(0, lrow, 48, lrow+5).Rows.OptimalHeight = True
4085  _gotoCella(1, lrow+1)
4086 
4087  #~ if(oSheet.getCellByPosition(0,lrow).queryIntersection(oSheet.getCellRangeByName('#Lib#'+str(nSal)).getRangeAddress())):
4088  #~ chi('appartiene')
4089  #~ else:
4090  #~ chi('nooooo')
4091  #~ return
4092 
4093  sStRange = Circoscrive_Voce_Computo_Att(lrow)
4094  sopra = sStRange.RangeAddress.StartRow
4095 
4096  try:
4097  oSheet.getCellByPosition(1, sopra+2).Value = data
4098  except:
4099  oSheet.getCellByPosition(1, sopra+2).Value = date.today().toordinal()-693594
4100 
4105  iSheet = oSheet.RangeAddress.Sheet
4106  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
4107  oCellRangeAddr.Sheet = iSheet
4108  oCellRangeAddr.StartColumn = 0
4109  oCellRangeAddr.EndColumn = 0
4110  oCellRangeAddr.StartRow = lrow+2
4111  oCellRangeAddr.EndRow = lrow+2
4112  oSheet.group(oCellRangeAddr, 1)
4113 
4114 
4115  if oDoc.NamedRanges.hasByName('#Lib#'+str(nSal)):
4116  if lrow -1 == oSheet.getCellRangeByName('#Lib#'+str(nSal)).getRangeAddress().EndRow:
4117  nSal += 1
4118 
4119  oSheet.getCellByPosition(23, sopra + 1).Value = nSal
4120  oSheet.getCellByPosition(23, sopra + 1).CellStyle = 'Sal'
4121 
4122  oSheet.getCellByPosition(35, sopra+4).Formula = '=B'+ str(sopra+2)
4123  oSheet.getCellByPosition(36, sopra+4).Formula = '=IF(ISERROR(P'+ str(sopra +5) +');"";IF(P' + str(sopra+5) +'<>"";P' + str(sopra +5) + ';""))'
4124  oSheet.getCellByPosition(36, sopra+4).CellStyle = "comp -controolo"
4125  numera_voci(0)
4126  if conf.read(path_conf, 'Generale', 'pesca_auto') == '1':
4127  if arg == 0 : return
4128  pesca_cod()
4129 
4130 
4131 def attiva_contabilita(arg=None):
4132  '''Se presenti, attiva e visualizza le tabelle di contabilità'''
4133  oDoc = XSCRIPTCONTEXT.getDocument()
4134  if oDoc.Sheets.hasByName('S1'):
4135  oDoc.Sheets.getByName('S1').getCellByPosition(7,327).Value = 1
4136  if oDoc.Sheets.hasByName('CONTABILITA'):
4137  for el in('Registro', 'SAL','CONTABILITA'):
4138  if oDoc.Sheets.hasByName(el):_gotoSheet(el)
4139  else:
4140  oDoc.Sheets.insertNewByName('CONTABILITA',3)
4141  _gotoSheet('CONTABILITA')
4143  ins_voce_contab()
4145  _gotoSheet('CONTABILITA')
4146 
4147 def svuota_contabilita(arg=None):
4148  '''Ricrea il foglio di contabilità partendo da zero.'''
4149  oDoc = XSCRIPTCONTEXT.getDocument()
4150  for n in range(1 ,20):
4151  if oDoc.NamedRanges.hasByName('#Lib#'+str(n)) == True:
4152  oDoc.NamedRanges.removeByName('#Lib#'+str(n))
4153  oDoc.NamedRanges.removeByName('#SAL#'+str(n))
4154  oDoc.NamedRanges.removeByName('#Reg#'+str(n))
4155  for el in('Registro', 'SAL', 'CONTABILITA'):
4156  if oDoc.Sheets.hasByName(el):
4157  oDoc.Sheets.removeByName(el)
4158 
4159  oDoc.Sheets.insertNewByName('CONTABILITA',3)
4160  oSheet = oDoc.Sheets.getByName('CONTABILITA')
4161 
4162  _gotoSheet('CONTABILITA')
4163  setTabColor(16757935)
4164  oSheet.getCellRangeByName('C1').String = 'CONTABILITA'
4165  oSheet.getCellRangeByName('C1').CellStyle = 'comp Int_colonna'
4166  oSheet.getCellRangeByName('C1').CellBackColor = 16757935
4167  oSheet.getCellByPosition(0,2).String = 'N.'
4168  oSheet.getCellByPosition(1,2).String = 'Articolo\nData'
4169  oSheet.getCellByPosition(2,2).String = 'LAVORAZIONI\nO PROVVISTE'
4170  oSheet.getCellByPosition(5,2).String = 'P.U.\nCoeff.'
4171  oSheet.getCellByPosition(6,2).String = 'Lung.'
4172  oSheet.getCellByPosition(7,2).String = 'Larg.'
4173  oSheet.getCellByPosition(8,2).String = 'Alt.\nPeso'
4174  oSheet.getCellByPosition(9,2).String = 'Quantità\nPositive'
4175  oSheet.getCellByPosition(11,2).String = 'Quantità\nNegative'
4176  oSheet.getCellByPosition(13,2).String = 'Prezzo\nunitario'
4177  oSheet.getCellByPosition(15,2).String = 'Importi'
4178  oSheet.getCellByPosition(17,2).String = 'Sicurezza\ninclusa'
4179  oSheet.getCellByPosition(18,2).String = 'Serve per avere le quantità\nrealizzate "pulite" e sommabili'
4180  oSheet.getCellByPosition(19,2).String = 'Lib.\nN.'
4181  oSheet.getCellByPosition(20,2).String = 'Lib.\nP.'
4182  oSheet.getCellByPosition(22,2).String = 'flag'
4183  oSheet.getCellByPosition(23,2).String = 'SAL\nN.'
4184  oSheet.getCellByPosition(25,2).String = 'Importi\nSAL parziali'
4185  oSheet.getCellByPosition(27,2).String = 'Sicurezza\nunitaria'
4186  oSheet.getCellByPosition(28,2).String = 'Materiali\ne Noli €'
4187  oSheet.getCellByPosition(29,2).String = 'Incidenza\nMdO %'
4188  oSheet.getCellByPosition(30,2).String = 'Importo\nMdO'
4189  oSheet.getCellByPosition(31,2).String = 'Super Cat'
4190  oSheet.getCellByPosition(32,2).String = 'Cat'
4191  oSheet.getCellByPosition(33,2).String = 'Sub Cat'
4192  #~ oSheet.getCellByPosition(34,2).String = 'tag B'sub Scrivi_header_moduli
4193  #~ oSheet.getCellByPosition(35,2).String = 'tag C'
4194  oSheet.getCellByPosition(36,2).String = 'Importi\nsenza errori'
4195  oSheet.getCellByPosition(0,2).Rows.Height = 800
4196  #~ colore colonne riga di intestazione
4197  oSheet.getCellRangeByPosition(0, 2, 36 , 2).CellStyle = 'comp Int_colonna_R'
4198  oSheet.getCellByPosition(0, 2).CellStyle = 'comp Int_colonna_R_prima'
4199  oSheet.getCellByPosition(18, 2).CellStyle = 'COnt_noP'
4200  oSheet.getCellRangeByPosition(0,0,0,3).Rows.OptimalHeight = True
4201  #~ riga di controllo importo
4202  oSheet.getCellRangeByPosition(0, 1, 36 , 1).CellStyle = 'comp In testa'
4203  oSheet.getCellByPosition(2,1).String = 'QUESTA RIGA NON VIENE STAMPATA'
4204  oSheet.getCellRangeByPosition(0, 1, 1, 1).merge(True)
4205  oSheet.getCellByPosition(13,1).String = 'TOTALE:'
4206  oSheet.getCellByPosition(20,1).String = 'SAL SUCCESSIVO:'
4207 
4208  oSheet.getCellByPosition(25, 1).Formula = '=$P$2-SUBTOTAL(9;$P$2:$P$2)'
4209  #~ 'pippi
4210  oSheet.getCellByPosition(15,1).Formula='=SUBTOTAL(9;P3:P4)' #importo lavori
4211  oSheet.getCellByPosition(0,1).Formula='=AK2' #importo lavori
4212  oSheet.getCellByPosition(17,1).Formula='=SUBTOTAL(9;R3:R4)' #importo sicurezza
4213 
4214  oSheet.getCellByPosition(28,1).Formula='=SUBTOTAL(9;AC3:AC4)' #importo materiali
4215  oSheet.getCellByPosition(29,1).Formula='=AE2/Z2' #Incidenza manodopera %
4216  oSheet.getCellByPosition(29, 1).CellStyle = 'Comp TOTALI %'
4217  oSheet.getCellByPosition(30,1).Formula='=SUBTOTAL(9;AE3:AE4)' #importo manodopera
4218  oSheet.getCellByPosition(36,1).Formula='=SUBTOTAL(9;AK3:AK4)' #importo certo
4219 
4220  #~ rem riga del totale
4221  oSheet.getCellByPosition(2,3).String = 'T O T A L E'
4222  oSheet.getCellByPosition(15,3).Formula='=SUBTOTAL(9;P3:P4)' #importo lavori
4223  oSheet.getCellByPosition(17,3).Formula='=SUBTOTAL(9;R3:R4)' #importo sicurezza
4224  oSheet.getCellByPosition(30,3).Formula='=SUBTOTAL(9;AE3:AE4)' #importo manodopera
4225  oSheet.getCellRangeByPosition(0, 3, 36 , 3).CellStyle = 'Comp TOTALI'
4226  #~ rem riga rossa
4227  oSheet.getCellByPosition(0,4).String = 'Fine Computo'
4228  oSheet.getCellRangeByPosition(0, 4, 36 , 4).CellStyle = 'Riga_rossa_Chiudi'
4229  _gotoCella(0, 2)
4231 
4232 def inizializza_elenco(arg=None):
4233  '''
4234  Riscrive le intestazioni di colonna e le formule dei totali in Elenco Prezzi.
4235  '''
4236  oDoc = XSCRIPTCONTEXT.getDocument()
4237  oSheet = oDoc.Sheets.getByName('Elenco Prezzi')
4238  oDoc.CurrentController.freezeAtPosition(0, 3)
4239  oSheet.getCellRangeByPosition(0, 0, 100 , 0).CellStyle = "Default"
4240 #~ riscrivo le intestazioni di colonna
4242  oSheet.getCellRangeByName('L1').String ='COMPUTO'
4243  oSheet.getCellRangeByName('P1').String ='VARIANTE'
4244  oSheet.getCellRangeByName('T1').String ='CONTABILITA'
4245  oSheet.getCellRangeByName('B2').String ='QUESTA RIGA NON VIENE STAMPATA'
4246  oSheet.getCellRangeByName("'Elenco Prezzi'.A2:AA2").CellStyle = "comp In testa"
4247  oSheet.getCellRangeByName("'Elenco Prezzi'.A3:AA3").CellStyle = "EP-a -Top"
4248  oSheet.getCellRangeByName('A3').String ='Codice\nArticolo'
4249  oSheet.getCellRangeByName('B3').String ='DESCRIZIONE DEI LAVORI\nE DELLE SOMMINISTRAZIONI'
4250  oSheet.getCellRangeByName('C3').String ='Unità\ndi misura'
4251  oSheet.getCellRangeByName('D3').String ='Sicurezza\ninclusa'
4252  oSheet.getCellRangeByName('E3').String ='Prezzo\nunitario'
4253  oSheet.getCellRangeByName('F3').String ='Incidenza\nMdO'
4254  oSheet.getCellRangeByName('G3').String ='Importo\nMdO'
4255  oSheet.getCellRangeByName('H3').String ='Codice di origine'
4256  oSheet.getCellRangeByName('L3').String ='Inc. % \ncomputo'
4257  oSheet.getCellRangeByName('M3').String ='Quantità\ncomputo'
4258  oSheet.getCellRangeByName('N3').String ='Importi\ncomputo'
4259  oSheet.getCellRangeByName('L3:N3').CellBackColor = 16762855
4260  oSheet.getCellRangeByName('P3').String ='Inc. % \ncomputo'
4261  oSheet.getCellRangeByName('Q3').String ='Quantità\ncomputo'
4262  oSheet.getCellRangeByName('R3').String ='Importi\ncomputo'
4263  oSheet.getCellRangeByName('P3:R3').CellBackColor = 16777062
4264  oSheet.getCellRangeByName('T3').String ='Inc. % \ncomputo'
4265  oSheet.getCellRangeByName('U3').String ='Quantità\ncomputo'
4266  oSheet.getCellRangeByName('V3').String ='Importi\ncomputo'
4267  oSheet.getCellRangeByName('T3:V3').CellBackColor = 16757935
4268  oSheet.getCellRangeByName('X3').String ='Quantità\nvariaz.'
4269  oSheet.getCellRangeByName('Y3').String ='IMPORTI\nin più'
4270  oSheet.getCellRangeByName('Z3').String ='IMPORTI\nin meno'
4271  oSheet.getCellRangeByName('AA3').String ='VAR. %'
4272  oSheet.getCellRangeByName('I1:J1').Columns.IsVisible = False
4273 
4274  y = uFindStringCol('Fine elenco', 0, oSheet) + 1
4275  oSheet.getCellRangeByName('N2').Formula='=SUBTOTAL(9;N3:N' + str(y) +')'
4276  oSheet.getCellRangeByName('R2').Formula='=SUBTOTAL(9;R3:R' + str(y) +')'
4277  oSheet.getCellRangeByName('V2').Formula='=SUBTOTAL(9;V3:V' + str(y) +')'
4278  oSheet.getCellRangeByName('Y2').Formula='=SUBTOTAL(9;Y3:Y' + str(y) +')'
4279  oSheet.getCellRangeByName('Z2').Formula='=SUBTOTAL(9;Z3:Z' + str(y) +')'
4280 #~ riga di totale importo COMPUTO
4281  y -=1
4282  oSheet.getCellByPosition(12, y).String='TOTALE'
4283  oSheet.getCellByPosition(13, y).Formula='=SUBTOTAL(9;N3:N' + str(y) +')'
4284 #~ riga di totale importo CONTABILITA'
4285  oSheet.getCellByPosition(16, y).String='TOTALE'
4286  oSheet.getCellByPosition(17, y).Formula='=SUBTOTAL(9;R3:R' + str(y) +')'
4287 #~ rem riga di totale importo VARIANTE
4288  oSheet.getCellByPosition(20, y).String='TOTALE'
4289  oSheet.getCellByPosition(21, y).Formula='=SUBTOTAL(9;V3:V' + str(y) +')'
4290 #~ rem riga di totale importo PARALLELO
4291  oSheet.getCellByPosition(23, y).String='TOTALE'
4292  oSheet.getCellByPosition(24, y).Formula='=SUBTOTAL(9;Y3:Y' + str(y) +')'
4293  oSheet.getCellByPosition(25, y).Formula='=SUBTOTAL(9;Z3:Z' + str(y) +')'
4294  oSheet.getCellRangeByPosition(10, y, 26 , y).CellStyle = 'EP statistiche_Contab'
4295  y +=1
4296  #~ oSheet.getCellRangeByName('C2').String = 'prezzi'
4297  #~ oSheet.getCellRangeByName('E2').Formula = '=COUNT(E3:E' + str(y) +')'
4298  oSheet.getCellRangeByName('K2:K' + str(y)).CellStyle = 'Default'
4299  oSheet.getCellRangeByName('O2:O' + str(y)).CellStyle = 'Default'
4300  oSheet.getCellRangeByName('S2:S' + str(y)).CellStyle = 'Default'
4301  oSheet.getCellRangeByName('W2:W' + str(y)).CellStyle = 'Default'
4302  oSheet.getCellRangeByPosition(3, 3, 250, y +10).clearContents(HARDATTR)
4303  MsgBox('Rigenerazione del foglio eseguita!','')
4304 
4305 def inizializza_analisi(arg=None):
4306  '''
4307  Se non presente, crea il foglio 'Analisi di Prezzo' ed inserisce la prima scheda
4308  '''
4309  oDoc = XSCRIPTCONTEXT.getDocument()
4310  rifa_nomearea('S5', '$B$108:$P$133', 'blocco_analisi')
4311  if oDoc.getSheets().hasByName('Analisi di Prezzo') == False:
4312  oDoc.getSheets().insertNewByName('Analisi di Prezzo',1)
4313  oSheet = oDoc.Sheets.getByName('Analisi di Prezzo')
4314  oSheet.getCellRangeByPosition(0,0,15,0).CellStyle = 'Analisi_Sfondo'
4315  oSheet.getCellByPosition(0, 1).Value = 0
4316  oSheet = oDoc.Sheets.getByName('Analisi di Prezzo')
4317  oDoc.CurrentController.setActiveSheet(oSheet)
4318  setTabColor(12189608)
4319  oRangeAddress=oDoc.NamedRanges.blocco_analisi.ReferredCells.RangeAddress
4320  oCellAddress = oSheet.getCellByPosition(0, getLastUsedCell(oSheet).EndRow).getCellAddress()
4321  oDoc.CurrentController.select(oSheet.getCellByPosition(0,2))
4322  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
4324  else:
4325  _gotoSheet('Analisi di Prezzo')
4326  oSheet = oDoc.Sheets.getByName('Analisi di Prezzo')
4327  oDoc.CurrentController.setActiveSheet(oSheet)
4328  lrow = Range2Cell()[1]
4329  urow = getLastUsedCell(oSheet).EndRow
4330  if lrow >= urow:
4331  lrow = ultima_voce(oSheet)-5
4332  for n in range(lrow ,getLastUsedCell(oSheet).EndRow):
4333  if oSheet.getCellByPosition(0, n).CellStyle == 'An-sfondo-basso Att End':
4334  break
4335  oRangeAddress=oDoc.NamedRanges.blocco_analisi.ReferredCells.RangeAddress
4336  oSheet.getRows().insertByIndex(n+2,26)
4337  oCellAddress = oSheet.getCellByPosition(0,n+2).getCellAddress()
4338  oDoc.CurrentController.select(oSheet.getCellByPosition(0,n+2+1))
4339  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
4340  oSheet.copyRange(oCellAddress, oRangeAddress)
4342  return
4343 
4344 def inserisci_Riga_rossa(arg=None):
4345  '''
4346  Inserisce la riga rossa di chiusura degli elaborati
4347  Questa riga è un rigerimento per varie operazioni
4348  '''
4349  oDoc = XSCRIPTCONTEXT.getDocument()
4350  oSheet = oDoc.CurrentController.ActiveSheet
4351  lrow = Range2Cell()[1]
4352  nome = oSheet.Name
4353  if nome in('COMPUTO', 'VARIANTE', 'CONTABILITA'):
4354  lrow = ultima_voce(oSheet) + 2
4355  for n in range(lrow, getLastUsedCell(oSheet).EndRow+2):
4356  if oSheet.getCellByPosition(0,n).CellStyle == 'Riga_rossa_Chiudi':
4357  return
4358  oSheet.getRows().insertByIndex(lrow,1)
4359  oSheet.getCellByPosition(0, lrow).String = 'Fine Computo'
4360  oSheet.getCellRangeByPosition(0,lrow,34,lrow).CellStyle='Riga_rossa_Chiudi'
4361  elif nome == 'Analisi di Prezzo':
4362  lrow = ultima_voce(oSheet) + 2
4363  oSheet.getCellByPosition( 0, lrow).String = 'Fine ANALISI'
4364  oSheet.getCellRangeByPosition(0,lrow,10,lrow).CellStyle='Riga_rossa_Chiudi'
4365  elif nome == 'Elenco Prezzi':
4366  lrow = ultima_voce(oSheet) + 2
4367  oSheet.getCellByPosition( 0, lrow).String = 'Fine elenco'
4368  oSheet.getCellRangeByPosition(0,lrow,26,lrow).CellStyle='Riga_rossa_Chiudi'
4369  oSheet.getCellByPosition(2, lrow).String = 'Questa riga NON deve essere cancellata, MAI!!!(ma può rimanere tranquillamente NASCOSTA!)'
4370 
4371 def rifa_nomearea(sSheet, sRange, sName):
4372  '''
4373  Definisce o ridefinisce un'area di dati a cui far riferimento
4374  sSheet = nome del foglio, es.: 'S5'
4375  sRange = individuazione del range di celle, es.:'$B$89:$L$89'
4376  sName = nome da attribuire all'area scelta, es.: "manodopera"
4377  '''
4378  sPath = "$'" + sSheet + "'." + sRange
4379  oDoc = XSCRIPTCONTEXT.getDocument()
4380  oRanges = oDoc.NamedRanges
4381  oCellAddress = oDoc.Sheets.getByName(sSheet).getCellRangeByName('A1').getCellAddress()
4382  if oRanges.hasByName(sName):
4383  oRanges.removeByName(sName)
4384  oRanges.addNewByName(sName,sPath,oCellAddress,0)
4385 
4387  '''
4388  Mette in vista struttura secondo il colore
4389  l { integer } : specifica il livello di categoria
4390  '''
4391  oDoc = XSCRIPTCONTEXT.getDocument()
4392 
4393  #~ oDoc.CurrentController.ZoomValue = 400
4394 
4395  oSheet = oDoc.CurrentController.ActiveSheet
4396  iSheet = oSheet.RangeAddress.Sheet
4397  oCellRangeAddr = uno.createUnoStruct('com.sun.star.table.CellRangeAddress')
4398  oCellRangeAddr.Sheet = iSheet
4399  hriga = oSheet.getCellRangeByName('B4').CharHeight * 65
4400  #~ giallo(16777072,16777120,16777168)
4401  #~ verde(9502608,13696976,15794160)
4402  #~ viola(12632319,13684991,15790335)
4403  col0 = 16724787 #riga_rossa
4404  col1 = 16777072
4405  col2 = 16777120
4406  col3 = 16777168
4407 # attribuisce i colori
4408  for y in range(3, getLastUsedCell(oSheet).EndRow):
4409  if oSheet.getCellByPosition(0, y).String == '':
4410  oSheet.getCellByPosition(0, y).CellBackColor = col3
4411  elif len(oSheet.getCellByPosition(0, y).String.split('.')) == 2:
4412  oSheet.getCellByPosition(0, y).CellBackColor = col2
4413  elif len(oSheet.getCellByPosition(0, y).String.split('.')) == 1:
4414  oSheet.getCellByPosition(0, y).CellBackColor = col1
4415  if l == 0:
4416  colore = col1
4417  myrange =(col1, col0)
4418  elif l == 1:
4419  colore = col2
4420  myrange =(col1, col2, col0)
4421  elif l == 2:
4422  colore = col3
4423  myrange =(col1, col2, col3, col0)
4424 
4425  for n in(3, 7):
4426  oCellRangeAddr.StartColumn = n
4427  oCellRangeAddr.EndColumn = n
4428  oSheet.group(oCellRangeAddr,0)
4429  oSheet.getCellRangeByPosition(n, 0, n, 0).Columns.IsVisible=False
4430  test = ultima_voce(oSheet)+2
4431  lista = list()
4432  for n in range(0, test):
4433  if oSheet.getCellByPosition(0, n).CellBackColor == colore:
4434  oSheet.getCellByPosition(0,n).Rows.Height = hriga
4435  sopra = n+1
4436  for n in range(sopra+1, test):
4437  if oSheet.getCellByPosition(0, n).CellBackColor in myrange:
4438  sotto = n-1
4439  lista.append((sopra, sotto))
4440  break
4441  for el in lista:
4442  oCellRangeAddr.StartRow = el[0]
4443  oCellRangeAddr.EndRow = el[1]
4444  oSheet.group(oCellRangeAddr,1)
4445  oSheet.getCellRangeByPosition(0, el[0], 0, el[1]).Rows.IsVisible=False
4446  oDoc.CurrentController.ZoomValue = 100
4447  return
4448 
4449 def struttura_Elenco(arg=None):
4450  '''
4451  Dà una tonalità di colore, diverso dal colore dello stile cella, alle righe
4452  che non hanno il prezzo, come i titoli di capitolo e sottocapitolo.
4453  '''
4454  if DlgSiNo('''Adesso puoi dare ai titoli di capitolo e sottocapitolo
4455 una tonalità di colore che ne facilita la leggibilità, ma
4456 il risultato finale dipende dalla struttura dei codici di voce.
4457 
4458 QUESTA OPERAZIONE RICHIEDE DEL TEMPO E
4459 LibreOffice POTREBBE SEMBRARE BLOCCATO!
4460 
4461 Vuoi procedere con la creazione della struttura dei capitoli?''', 'Avviso') == 3:
4462  return
4464  oDoc = XSCRIPTCONTEXT.getDocument()
4465  oSheet = oDoc.CurrentController.ActiveSheet
4466  oSheet.clearOutline()
4467  struct_colore(0) #attribuisce i colori
4468  struct_colore(1)
4469  struct_colore(2)
4470  return
4471 
4472 def XML_toscana_import(arg=None):
4473  '''
4474  Importazione di un prezzario XML della regione Toscana
4475  in tabella Elenco Prezzi del template COMPUTO.
4476  '''
4477  MsgBox('Questa operazione potrebbe richiedere del tempo.','Avviso')
4478 
4479  try:
4480  filename = filedia('Scegli il file XML Toscana da importare', '*.xml')
4481  if filename == None: return
4482  except:
4483  return
4484  New_file.computo(0)
4485  # effettua il parsing del file XML
4486  tree = ElementTree()
4487  tree.parse(filename)
4488 
4489  # ottieni l'item root
4490  root = tree.getroot()
4491  iter = tree.getiterator()
4492 
4493  PRT = '{' + str(iter[0].getchildren()[0]).split('}')[0].split('{')[-1] + '}' # xmlns
4494  # nome del prezzario
4495  intestazione = root.find(PRT+'intestazione')
4496  titolo = 'Prezzario '+ intestazione.get('autore') + ' - ' + intestazione[0].get('area') +' '+ intestazione[0].get('anno')
4497  licenza = intestazione[1].get('descrizione').split(':')[0] +' '+ intestazione[1].get('tipo')
4498  titolo = titolo + '\nCopyright: ' + licenza + '\nhttp://prezzariollpp.regione.toscana.it'
4499 
4500  Contenuto = root.find(PRT+'Contenuto')
4501 
4502  voci = root.getchildren()[1]
4503 
4504  tipo_lista = list()
4505  cap_lista = list()
4506  lista_articoli = list()
4507  lista_cap = list()
4508  lista_subcap = list()
4509  for el in voci:
4510  if el.tag == PRT+'Articolo':
4511  codice = el.get('codice')
4512  codicesp = codice.split('.')
4513 
4514  voce = el.getchildren()[2].text
4515  articolo = el.getchildren()[3].text
4516  if articolo == None:
4517  desc_voce = voce
4518  else:
4519  desc_voce = voce + ' ' + articolo
4520  udm = el.getchildren()[4].text
4521 
4522  try:
4523  sic = float(el.getchildren()[-1][-4].get('valore'))
4524  except IndexError:
4525  sic =''
4526  prezzo = float(el.getchildren()[5].text)
4527  try:
4528  mdo = float(el.getchildren()[-1][-1].get('percentuale'))/100
4529  mdoE = mdo * prezzo
4530  except IndexError:
4531  mdo =''
4532  mdoE = ''
4533  if codicesp[0] not in tipo_lista:
4534  tipo_lista.append(codicesp[0])
4535  cap =(codicesp[0], el.getchildren()[0].text, '', '', '', '', '')
4536  lista_cap.append(cap)
4537  if codicesp[0]+'.'+codicesp[1] not in cap_lista:
4538  cap_lista.append(codicesp[0]+'.'+codicesp[1])
4539  cap =(codicesp[0]+'.'+codicesp[1], el.getchildren()[1].text, '', '', '', '', '', '')
4540  lista_subcap.append(cap)
4541  voceel =(codice, desc_voce, udm, sic, prezzo, mdo, mdoE)
4542  lista_articoli.append(voceel)
4543 # compilo ##############################################################
4544  oDoc = XSCRIPTCONTEXT.getDocument()
4545  oSheet = oDoc.getSheets().getByName('S2')
4546  oSheet.getCellByPosition(2, 2).String = titolo
4547  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
4548  oSheet.getCellByPosition(1, 0).String = titolo
4549  oSheet.getCellByPosition(2, 0).String = '''ATTENZIONE!
4550 1. Lo staff di LeenO non si assume alcuna responsabilità riguardo al contenuto del prezzario.
4551 2. L’utente finale è tenuto a verificare il contenuto dei prezzari sulla base di documenti ufficiali.
4552 3. L’utente finale è il solo responsabile degli elaborati ottenuti con l'uso di questo prezzario.
4553 
4554 Si consiglia una attenta lettura delle note informative disponibili sul sito istituzionale ufficiale prima di accedere al prezzario.'''
4555  oSheet.getCellByPosition(1, 0).CellStyle = 'EP-mezzo'
4556  n = 0
4557 
4558  for el in (lista_articoli, lista_cap, lista_subcap):
4559  oSheet.getRows().insertByIndex(4, len(el))
4560  lista_come_array = tuple(el)
4561  # Parametrizzo il range di celle a seconda della dimensione della lista
4562  scarto_colonne = 0 # numero colonne da saltare a partire da sinistra
4563  scarto_righe = 4 # numero righe da saltare a partire dall'alto
4564  colonne_lista = len(lista_come_array[1]) # numero di colonne necessarie per ospitare i dati
4565  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
4566  oRange = oSheet.getCellRangeByPosition( 0, 4, colonne_lista + 0 - 1, righe_lista + 4 - 1)
4567  oRange.setDataArray(lista_come_array)
4568  #~ oSheet.getRows().removeByIndex(3, 1)
4569  oDoc.CurrentController.setActiveSheet(oSheet)
4570 
4571  oSheet.getCellRangeByPosition(0, 3, 0, righe_lista + 3 - 1).CellStyle = "EP-aS"
4572  oSheet.getCellRangeByPosition(1, 3, 1, righe_lista + 3 - 1).CellStyle = "EP-a"
4573  oSheet.getCellRangeByPosition(2, 3, 7, righe_lista + 3 - 1).CellStyle = "EP-mezzo"
4574  oSheet.getCellRangeByPosition(5, 3, 5, righe_lista + 3 - 1).CellStyle = "EP-mezzo %"
4575  oSheet.getCellRangeByPosition(8, 3, 9, righe_lista + 3 - 1).CellStyle = "EP-sfondo"
4576  oSheet.getCellRangeByPosition(11, 3, 11, righe_lista + 3 - 1).CellStyle = 'EP-mezzo %'
4577  oSheet.getCellRangeByPosition(12, 3, 12, righe_lista + 3 - 1).CellStyle = 'EP statistiche_q'
4578  oSheet.getCellRangeByPosition(13, 3, 13, righe_lista + 3 - 1).CellStyle = 'EP statistiche'
4579  if n == 1:
4580  oSheet.getCellRangeByPosition(0, 3, 0, righe_lista + 3 - 1).CellBackColor = 16777120
4581  elif n == 2:
4582  oSheet.getCellRangeByPosition(0, 3, 0, righe_lista + 3 - 1).CellBackColor = 16777168
4583  n += 1
4584  #~ set_larghezza_colonne()
4585  toolbar_vedi()
4586  adatta_altezza_riga('Elenco Prezzi')
4588  #~ struttura_Elenco()
4589 
4590  dest = filename[0:-4]+ '.ods'
4591  salva_come(dest)
4592  MsgBox('''
4593 Importazione eseguita con successo!
4594 
4595 ATTENZIONE:
4596 1. Lo staff di LeenO non si assume alcuna responsabilità riguardo al contenuto del prezzario.
4597 2. L’utente finale è tenuto a verificare il contenuto dei prezzari sulla base di documenti ufficiali.
4598 3. L’utente finale è il solo responsabile degli elaborati ottenuti con l'uso di questo prezzario.
4599 
4600 N.B.: Si consiglia una attenta lettura delle note informative disponibili sul sito istituzionale ufficiale prima di accedere al Prezzario.
4601 
4602  ''','ATTENZIONE!')
4603 #~ ########################################################################
4604 def fuf(arg=None):
4605  '''
4606  Traduce un particolare formato DAT usato in falegnameria - non c'entra un tubo con LeenO.
4607  E' solo una cortesia per un amico.
4608  '''
4609  bak_timestamp()
4610  filename = filedia('Scegli il file XML-SIX da importare', '*.dat')
4611  riga = list()
4612  try:
4613  f = open(filename, 'r')
4614  except TypeError:
4615  return
4616  ordini = list()
4617  riga =('Codice', 'Descrizione articolo', 'Quantità', 'Data consegna','Conto lavoro', 'Prezzo(€)')
4618  ordini.append(riga)
4619 
4620  for row in f:
4621  art =row[:15]
4622  if art[0:4] not in('HEAD', 'FEET'):
4623  art = art[4:]
4624  des =row[22:62]
4625  num = 1 #row[72:78].replace(' ','')
4626  car =row[78:87]
4627  dataC =row[96:104]
4628  dataC = '=DATE('+ dataC[:4]+';'+dataC[4:6]+';'+dataC[6:] + ')'
4629  clav =row[120:130]
4630  prz =row[142:-1]
4631  riga =(art, des, num, dataC, clav, float(prz.strip()))
4632  ordini.append(riga)
4633 
4634  oDoc = XSCRIPTCONTEXT.getDocument()
4635  oSheet = oDoc.CurrentController.ActiveSheet
4636  lista_come_array = tuple(ordini)
4637  colonne_lista = len(lista_come_array[0]) # numero di colonne necessarie per ospitare i dati
4638  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
4639 
4640  oRange = oSheet.getCellRangeByPosition( 0,
4641  0,
4642  colonne_lista -1, # l'indice parte da 0
4643  righe_lista -1)
4644  oRange.setFormulaArray(lista_come_array)
4645 
4646  #~ oDoc.CurrentController.select(oSheet.getCellRangeByPosition(3, 1, 3, getLastUsedCell(oSheet).EndRow+1))
4647 
4648  oSheet.getCellRangeByPosition(0, 0, getLastUsedCell(oSheet).EndColumn, getLastUsedCell(oSheet).EndRow).Columns.OptimalWidth = True
4649 
4650  return
4651  copy_clip()
4652 
4653  ctx = XSCRIPTCONTEXT.getComponentContext()
4654  desktop = XSCRIPTCONTEXT.getDesktop()
4655  oFrame = desktop.getCurrentFrame()
4656  dispatchHelper = ctx.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.DispatchHelper', ctx )
4657  oProp = []
4658  oProp0 = PropertyValue()
4659  oProp0.Name = 'Flags'
4660  oProp0.Value = 'D'
4661  oProp1 = PropertyValue()
4662  oProp1.Name = 'FormulaCommand'
4663  oProp1.Value = 0
4664  oProp2 = PropertyValue()
4665  oProp2.Name = 'SkipEmptyCells'
4666  oProp2.Value = False
4667  oProp3 = PropertyValue()
4668  oProp3.Name = 'Transpose'
4669  oProp3.Value = False
4670  oProp4 = PropertyValue()
4671  oProp4.Name = 'AsLink'
4672  oProp4.Value = False
4673  oProp5 = PropertyValue()
4674  oProp5.Name = 'MoveMode'
4675  oProp5.Value = 4
4676  oProp.append(oProp0)
4677  oProp.append(oProp1)
4678  oProp.append(oProp2)
4679  oProp.append(oProp3)
4680  oProp.append(oProp4)
4681  oProp.append(oProp5)
4682  properties = tuple(oProp)
4683  #~ _gotoCella(6,1)
4684 
4685  dispatchHelper.executeDispatch(oFrame, '.uno:InsertContents', '', 0, properties)
4686  #~ paste_clip()
4687  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(0, 1, 5, getLastUsedCell(oSheet).EndRow+1))
4688 
4689  ordina_col(3)
4690  oDoc.CurrentController.select(oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) #'unselect
4691 
4692 #~ ########################################################################
4693 def XML_import_ep(arg=None):
4694  '''
4695  Routine di importazione di un prezzario XML-SIX in tabella Elenco Prezzi
4696  del template COMPUTO.
4697  '''
4698  MsgBox('Questa operazione potrebbe richiedere del tempo.','Avviso')
4699  New_file.computo(0)
4700  try:
4701  filename = filedia('Scegli il file XML-SIX da importare', '*.xml')
4702  if filename == None:
4703  return
4704  oDialogo_attesa = dlg_attesa()
4705  attesa().start() #mostra il dialogo
4706  except:
4707  return
4708 
4709  datarif = datetime.now()
4710  # inizializzazioe delle variabili
4711  lista_articoli = list() # lista in cui memorizzare gli articoli da importare
4712  diz_um = dict() # array per le unità di misura
4713  # stringhe per descrizioni articoli
4714  desc_breve = str()
4715  desc_estesa = str()
4716  # effettua il parsing del file XML
4717  tree = ElementTree()
4718  if filename == None:
4719  return
4720  tree.parse(filename)
4721  # ottieni l'item root
4722  root = tree.getroot()
4723  logging.debug(list(root))
4724  # effettua il parsing di tutti gli elemnti dell'albero
4725  iter = tree.getiterator()
4726  listaSOA = []
4727  articolo = []
4728  articolo_modificato =()
4729  lingua_scelta = 'it'
4730 
4732  prezzario = root.find('{six.xsd}prezzario')
4733  if len(prezzario.findall('{six.xsd}przDescrizione')) == 2:
4734  if prezzario.findall('{six.xsd}przDescrizione')[0].get('lingua') == lingua_scelta:
4735  nome = prezzario.findall('{six.xsd}przDescrizione')[0].get('breve')
4736  else:
4737  nome = prezzario.findall('{six.xsd}przDescrizione')[1].get('breve')
4738  else:
4739  nome = prezzario.findall('{six.xsd}przDescrizione')[0].get('breve')
4740 
4741  madre = ''
4742  for elem in iter:
4743  # esegui le verifiche sulla root dell'XML
4744  if elem.tag == '{six.xsd}intestazione':
4745  intestazioneId= elem.get('intestazioneId')
4746  lingua= elem.get('lingua')
4747  separatore= elem.get('separatore')
4748  separatoreParametri= elem.get('separatoreParametri')
4749  valuta= elem.get('valuta')
4750  autore= elem.get('autore')
4751  versione= elem.get('versione')
4752  # inserisci i dati generali
4753  #~ self.update_dati_generali(nome=None, cliente=None,
4754  #~ redattore=autore,
4755  #~ ricarico=1,
4756  #~ manodopera=None,
4757  #~ sicurezza=None,
4758  #~ indirizzo=None,
4759  #~ comune=None, provincia=None,
4760  #~ valuta=valuta)
4761  elif elem.tag == '{six.xsd}categoriaSOA':
4762  soaId = elem.get('soaId')
4763  soaCategoria = elem.get('soaCategoria')
4764  soaDescrizione = elem.find('{six.xsd}soaDescrizione')
4765  if soaDescrizione != None:
4766  breveSOA = soaDescrizione.get('breve')
4767  voceSOA =(soaCategoria, soaId, breveSOA)
4768  listaSOA.append(voceSOA)
4769  elif elem.tag == '{six.xsd}prezzario':
4770  prezzarioId = elem.get('prezzarioId')
4771  przId= elem.get('przId')
4772  try:
4773  livelli_struttura = len(elem.get('prdStruttura').split('.'))
4774  except:
4775  pass
4776  categoriaPrezzario= elem.get('categoriaPrezzario')
4777 
4778  elif elem.tag == '{six.xsd}unitaDiMisura':
4779  um_id= elem.get('unitaDiMisuraId')
4780  um_sim= elem.get('simbolo')
4781  um_dec= elem.get('decimali')
4782  # crea il dizionario dell'unita di misura
4783 
4785  unita_misura = ''
4786  try:
4787  if len(elem.findall('{six.xsd}udmDescrizione')) == 1:
4788  unita_misura = elem.findall('{six.xsd}udmDescrizione')[0].get('breve')
4789  else:
4790  if elem.findall('{six.xsd}udmDescrizione')[1].get('lingua') == lingua_scelta:
4791  idx = 1 #ITALIANO
4792  else:
4793  idx = 0 #TEDESCO
4794  unita_misura = elem.findall('{six.xsd}udmDescrizione')[idx].get('breve')
4795  except IndexError:
4796  pass
4797  diz_um[um_id] = unita_misura
4798 
4800  elif elem.tag == '{six.xsd}prodotto':
4801  prod_id = elem.get('prodottoId')
4802  if prod_id is not None:
4803  prod_id = int(prod_id)
4804  tariffa= elem.get('prdId')
4805  voce = elem.get('voce')
4806 
4807  sic = elem.get('onereSicurezza')
4808  if sic != None:
4809  sicurezza = float(sic)
4810  else:
4811  sicurezza = ''
4812 
4813  if diz_um.get(elem.get('unitaDiMisuraId')) != None:
4814  unita_misura = diz_um.get(elem.get('unitaDiMisuraId'))
4815  else:
4816  unita_misura = ''
4817 
4819  sub_mdo = elem.find('{six.xsd}incidenzaManodopera')
4820  if sub_mdo != None:
4821  mdo = float(sub_mdo.text)
4822  else:
4823  mdo =''
4824 
4827  try:
4828  if len(elem.findall('{six.xsd}prdDescrizione')) == 1:
4829  desc_breve = elem.findall('{six.xsd}prdDescrizione')[0].get('breve')
4830  desc_estesa = elem.findall('{six.xsd}prdDescrizione')[0].get('estesa')
4831  else:
4832  #descrizione voce
4833  if elem.findall('{six.xsd}prdDescrizione')[0].get('lingua') == lingua_scelta:
4834  idx = 0 #ITALIANO
4835  else:
4836  idx = 1 #TEDESCO
4837  idx = 0 #ITALIANO
4838  desc_breve = elem.findall('{six.xsd}prdDescrizione')[idx].get('breve')
4839  desc_estesa = elem.findall('{six.xsd}prdDescrizione')[idx].get('estesa')
4840  except:
4841  pass
4842  if desc_breve == None: desc_breve = ''
4843  if desc_estesa == None: desc_estesa = ''
4844  if len(desc_breve) > len(desc_estesa): desc_voce = desc_breve
4845  else: desc_voce = desc_estesa
4846 
4847  sub_quot = elem.find('{six.xsd}prdQuotazione')
4848  if sub_quot != None:
4849  list_nr = sub_quot.get('listaQuotazioneId')
4850  if sub_quot.get('valore') != None:
4851  valore = float(sub_quot.get('valore'))
4852  if valore == 0: valore = ''
4853  if sub_quot.get('quantita') is not None: quantita = float(sub_quot.get('quantita')) #SERVE DAVVERO???
4854  if desc_voce[:2] == '- ': desc_voce=desc_voce[2:]
4855  desc_voce = madre + '\n- ' + desc_voce
4856  else:
4857  madre = desc_voce
4858  valore = ''
4859  quantita = ''
4860  elem_7 = ''
4861  elem_11 = ''
4862  if mdo != '' and mdo != 0: elem_7 = mdo/100
4863  if sicurezza != '' and valore != '': elem_11 = valore*sicurezza/100
4864  # Nota che ora articolo_modificato non è più una lista ma una tupla,
4865  # riguardo al motivo, vedi commenti in basso
4866  articolo_modificato = (tariffa, #2 colonna
4867  desc_voce, #4 colonna
4868  unita_misura, #6 colonna
4869  '',
4870  valore, #7 prezzo
4871  elem_7, #8 mdo %
4872  elem_11) #11 sicurezza %
4873  lista_articoli.append(articolo_modificato)
4874 # compilo ##############################################################
4875  oDoc = XSCRIPTCONTEXT.getDocument()
4876  oSheet = oDoc.getSheets().getByName('S2')
4877  oSheet.getCellByPosition(2, 2).String = nome
4878  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
4879  oSheet.getCellByPosition(1, 1).String = nome
4880  oSheet.getRows().insertByIndex(4, len(lista_articoli))
4881 
4882  lista_come_array = tuple(lista_articoli)
4883  # Parametrizzo il range di celle a seconda della dimensione della lista
4884  scarto_colonne = 0 # numero colonne da saltare a partire da sinistra
4885  scarto_righe = 4 # numero righe da saltare a partire dall'alto
4886  colonne_lista = len(lista_come_array[1]) # numero di colonne necessarie per ospitare i dati
4887  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
4888  oRange = oSheet.getCellRangeByPosition( scarto_colonne,
4889  scarto_righe,
4890  colonne_lista + scarto_colonne - 1, # l'indice parte da 0
4891  righe_lista + scarto_righe - 1)
4892  oRange.setDataArray(lista_come_array)
4893  oSheet.getRows().removeByIndex(3, 1)
4894  oDoc.CurrentController.setActiveSheet(oSheet)
4895  #~ struttura_Elenco()
4896  oDialogo_attesa.endExecute()
4897  MsgBox('Importazione eseguita con successo!','')
4898  autoexec()
4899 # XML_import ###########################################################
4900 
4901 def XML_import_multi(arg=None):
4902  '''
4903  Routine di importazione di un prezzario XML-SIX in tabella Elenco Prezzi
4904  del template COMPUTO.
4905  Tratta da PreventARES https://launchpad.net/preventares
4906  di <Davide Vescovini> <davide.vescovini@gmail.com>
4907  *Versione bilingue*
4908  '''
4909  MsgBox("L'importazione dati dal formato XML-SIX potrebbe richiedere del tempo.", 'Avviso')
4910  New_file.computo(0)
4911  try:
4912  filename = filedia('Scegli il file XML-SIX da importare', '*.xml')
4913  if filename == None:
4914  return
4915  oDialogo_attesa = dlg_attesa()
4916  attesa().start() #mostra il dialogo
4917  except:
4918  return
4919 
4920  datarif = datetime.now()
4921  # inizializzazioe delle variabili
4922  lista_articoli = list() # lista in cui memorizzare gli articoli da importare
4923  diz_um = dict() # array per le unità di misura
4924  # stringhe per descrizioni articoli
4925  desc_breve = str()
4926  desc_estesa = str()
4927  # effettua il parsing del file XML
4928  tree = ElementTree()
4929  if filename == None:
4930  return
4931  tree.parse(filename)
4932  # ottieni l'item root
4933  root = tree.getroot()
4934  logging.debug(list(root))
4935  # effettua il parsing di tutti gli elemnti dell'albero XML
4936  iter = tree.getiterator()
4937  listaSOA = []
4938  articolo = []
4939  lingua_scelta = 'it'
4940 
4942  prezzario = root.find('{six.xsd}prezzario')
4943  if len(prezzario.findall('{six.xsd}przDescrizione')) == 2:
4944  if prezzario.findall('{six.xsd}przDescrizione')[0].get('lingua') == lingua_scelta:
4945  nome1 = prezzario.findall('{six.xsd}przDescrizione')[0].get('breve')
4946  nome2 = prezzario.findall('{six.xsd}przDescrizione')[1].get('breve')
4947  else:
4948  nome1 = prezzario.findall('{six.xsd}przDescrizione')[1].get('breve')
4949  nome2 = prezzario.findall('{six.xsd}przDescrizione')[0].get('breve')
4950  nome=nome1+'\n§\n'+nome2
4951  else:
4952  nome = prezzario.findall('{six.xsd}przDescrizione')[0].get('breve')
4953 
4954  suffB_IT, suffE_IT, suffB_DE, suffE_DE = '', '', '', ''
4955  test = True
4956  madre = ''
4957  for elem in iter:
4958  # esegui le verifiche sulla root dell'XML
4959  if elem.tag == '{six.xsd}intestazione':
4960  intestazioneId= elem.get('intestazioneId')
4961  lingua= elem.get('lingua')
4962  separatore= elem.get('separatore')
4963  separatoreParametri= elem.get('separatoreParametri')
4964  valuta= elem.get('valuta')
4965  autore= elem.get('autore')
4966  versione= elem.get('versione')
4967  elif elem.tag == '{six.xsd}categoriaSOA':
4968  soaId = elem.get('soaId')
4969  soaCategoria = elem.get('soaCategoria')
4970  soaDescrizione = elem.find('{six.xsd}soaDescrizione')
4971  if soaDescrizione != None:
4972  breveSOA = soaDescrizione.get('breve')
4973  voceSOA =(soaCategoria, soaId, breveSOA)
4974  listaSOA.append(voceSOA)
4975  elif elem.tag == '{six.xsd}prezzario':
4976  prezzarioId = elem.get('prezzarioId')
4977  przId= elem.get('przId')
4978  try:
4979  livelli_struttura = len(elem.get('prdStruttura').split('.'))
4980  except:
4981  pass
4982  categoriaPrezzario= elem.get('categoriaPrezzario')
4983 
4984  elif elem.tag == '{six.xsd}unitaDiMisura':
4985  um_id= elem.get('unitaDiMisuraId')
4986  um_sim= elem.get('simbolo')
4987  um_dec= elem.get('decimali')
4988  # crea il dizionario dell'unita di misura
4989 
4991  unita_misura = ''
4992  try:
4993  if len(elem.findall('{six.xsd}udmDescrizione')) == 1:
4994  unita_misura = elem.findall('{six.xsd}udmDescrizione')[0].get('breve')
4995  else:
4996  if elem.findall('{six.xsd}udmDescrizione')[1].get('lingua') == lingua_scelta:
4997  unita_misura1 = elem.findall('{six.xsd}udmDescrizione')[1].get('breve')
4998  unita_misura2 = elem.findall('{six.xsd}udmDescrizione')[0].get('breve')
4999  else:
5000  unita_misura1 = elem.findall('{six.xsd}udmDescrizione')[0].get('breve')
5001  unita_misura2 = elem.findall('{six.xsd}udmDescrizione')[1].get('breve')
5002  if unita_misura != None:
5003  unita_misura = unita_misura1 +' § '+ unita_misura2
5004  except IndexError:
5005  pass
5006  diz_um[um_id] = unita_misura
5007 
5009  elif elem.tag == '{six.xsd}prodotto':
5010 
5011  prod_id = elem.get('prodottoId')
5012  if prod_id is not None:
5013  prod_id = int(prod_id)
5014  tariffa= elem.get('prdId')
5015  sic = elem.get('onereSicurezza')
5016  if sic != None:
5017  sicurezza = float(sic)
5018  else:
5019  sicurezza = ''
5020 
5021  if diz_um.get(elem.get('unitaDiMisuraId')) != None:
5022  unita_misura = diz_um.get(elem.get('unitaDiMisuraId'))
5023  else:
5024  unita_misura = ''
5025 
5027  sub_mdo = elem.find('{six.xsd}incidenzaManodopera')
5028  if sub_mdo != None:
5029  mdo = float(sub_mdo.text)
5030  else:
5031  mdo =''
5032 
5034  desc_estesa1, desc_estesa2 = '', ''
5035  if test == 0:
5036  test = 1
5037  suffB_IT = suffB_IT + ' '
5038  suffE_IT = suffE_IT + ' '
5039  suffB_DE = suffB_DE + ' '
5040  suffE_DE = suffE_DE + ' '
5041  #~ try:
5042  if len(elem.findall('{six.xsd}prdDescrizione')) == 1:
5043  desc_breve = elem.findall('{six.xsd}prdDescrizione')[0].get('breve')
5044  desc_estesa = elem.findall('{six.xsd}prdDescrizione')[0].get('estesa')
5045  else:
5046  #descrizione voce
5047  if elem.findall('{six.xsd}prdDescrizione')[0].get('lingua') == lingua_scelta:
5048  desc_breve1 = elem.findall('{six.xsd}prdDescrizione')[0].get('breve')
5049  desc_breve2 = elem.findall('{six.xsd}prdDescrizione')[1].get('breve')
5050  desc_estesa1 = elem.findall('{six.xsd}prdDescrizione')[0].get('estesa')
5051  desc_estesa2 = elem.findall('{six.xsd}prdDescrizione')[1].get('estesa')
5052  else:
5053  desc_breve1 = elem.findall('{six.xsd}prdDescrizione')[1].get('breve')
5054  desc_breve2 = elem.findall('{six.xsd}prdDescrizione')[0].get('breve')
5055  desc_estesa1 = elem.findall('{six.xsd}prdDescrizione')[1].get('estesa')
5056  desc_estesa2 = elem.findall('{six.xsd}prdDescrizione')[0].get('estesa')
5057  if desc_breve1 == None:
5058  desc_breve1 = ''
5059  if desc_breve2 == None:
5060  desc_breve2 = ''
5061  if desc_estesa1 == None:
5062  desc_estesa1 = ''
5063  if desc_estesa2 == None:
5064  desc_estesa2 = ''
5065  desc_breve = suffB_IT + desc_breve1.strip() +'\n§\n'+ suffB_DE + desc_breve2.strip()
5066  desc_estesa = suffE_IT + desc_estesa1.strip() +'\n§\n'+ suffE_DE + desc_estesa2.strip()
5067  if len(desc_breve) > len(desc_estesa):
5068  desc_voce = desc_breve
5069  else:
5070  desc_voce = desc_estesa
5071  #~ except IndexError:
5072  #~ pass
5073 
5074  sub_quot = elem.find('{six.xsd}prdQuotazione')
5075  if sub_quot != None:
5076  list_nr = sub_quot.get('listaQuotazioneId')
5077  if sub_quot.get('valore') != None:
5078  valore = float(sub_quot.get('valore'))
5079  if valore == 0:
5080  valore = ''
5081  if sub_quot.get('quantita') is not None: #SERVE DAVVERO???
5082  quantita = float(sub_quot.get('quantita'))
5083  else:
5084  test = 0
5085  suffB_IT, suffB_DE, suffE_IT, suffE_DE = desc_breve1, desc_breve2, desc_estesa1, desc_estesa2
5086  valore = ''
5087  quantita = ''
5088  vuoto = ''
5089  elem_7 = ''
5090  elem_11 = ''
5091  articolo_modificato = (tariffa, #2 colonna
5092  desc_voce, #4 colonna
5093  unita_misura, #6 colonna
5094  vuoto,
5095  valore, #7 prezzo
5096  elem_7, #8 mdo %
5097  elem_11) #11 sicurezza %
5098  lista_articoli.append(articolo_modificato)
5099 # compilo la tabella ###################################################
5100  oDoc = XSCRIPTCONTEXT.getDocument()
5101  oSheet = oDoc.getSheets().getByName('S2')
5102  oSheet.getCellByPosition(2, 2).String = nome
5103  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
5104  oSheet.getCellByPosition(1, 1).String = nome
5105  oSheet.getRows().insertByIndex(4, len(lista_articoli))
5106 
5107  lista_come_array = tuple(lista_articoli)
5108  # Parametrizzo il range di celle a seconda della dimensione della lista
5109  scarto_colonne = 0 # numero colonne da saltare a partire da sinistra
5110  scarto_righe = 4 # numero righe da saltare a partire dall'alto
5111  colonne_lista = len(lista_come_array[1]) # numero di colonne necessarie per ospitare i dati
5112  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
5113  oRange = oSheet.getCellRangeByPosition( scarto_colonne,
5114  scarto_righe,
5115  colonne_lista + scarto_colonne - 1, # l'indice parte da 0
5116  righe_lista + scarto_righe - 1)
5117  oRange.setDataArray(lista_come_array)
5118  oSheet.getRows().removeByIndex(3, 1)
5119  oDoc.CurrentController.setActiveSheet(oSheet)
5120  #~ struttura_Elenco()
5121  oDialogo_attesa.endExecute()
5122  MsgBox('Importazione eseguita con successo!','')
5123  autoexec()
5124 # XML_import_multi ###################################################
5125 
5126 class importa_listino_leeno_th(threading.Thread):
5127  def __init__(self):
5128  threading.Thread.__init__(self)
5129  def run(self):
5130  importa_listino_leeno_run()
5131 def importa_listino_leeno(arg=None):
5132  importa_listino_leeno_th().start()
5133 
5134 def importa_listino_leeno_run(arg=None):
5135  '''
5136  Esegue la conversione di un listino (formato LeenO) in template Computo
5137  '''
5138  oDoc = XSCRIPTCONTEXT.getDocument()
5139  oSheet = oDoc.CurrentController.ActiveSheet
5140  #~ giallo(16777072,16777120,16777168)
5141  #~ verde(9502608,13696976,15794160)
5142  #~ viola(12632319,13684991,15790335)
5143  lista_articoli = list()
5144  nome = oSheet.getCellByPosition(2, 0).String
5145  test = uFindStringCol('ATTENZIONE!', 5, oSheet)+1
5146  assembla = DlgSiNo('''Il riconoscimento di descrizioni e sottodescrizioni
5147 dipende dalla colorazione di sfondo delle righe.
5148 
5149 Nel caso in cui questa fosse alterata, il risultato finale
5150 della conversione potrebbe essere inatteso.
5151 
5152 Considera anche la possibilità di recuperare il formato XML(SIX)
5153 di questo prezzario dal sito ufficiale dell'ente che lo rilascia.
5154 
5155 Vuoi assemblare descrizioni e sottodescrizioni?''', 'Richiesta')
5156 
5157  orig = oDoc.getURL()
5158  dest0 = orig[0:-4]+ '_new.ods'
5159 
5160  orig = uno.fileUrlToSystemPath(LeenO_path()+'/template/leeno/Computo_LeenO.ots')
5161  dest = uno.fileUrlToSystemPath(dest0)
5162 
5163  shutil.copyfile(orig, dest)
5164  oDialogo_attesa = dlg_attesa()
5165  attesa().start() #mostra il dialogo
5166  madre = ''
5167  for el in range(test, getLastUsedCell(oSheet).EndRow+1):
5168  tariffa = oSheet.getCellByPosition(2, el).String
5169  descrizione = oSheet.getCellByPosition(4, el).String
5170  um = oSheet.getCellByPosition(6, el).String
5171  sic = oSheet.getCellByPosition(11, el).String
5172  prezzo = oSheet.getCellByPosition(7, el).String
5173  mdo_p = oSheet.getCellByPosition(8, el).String
5174  mdo = oSheet.getCellByPosition(9, el).String
5175  if oSheet.getCellByPosition(2, el).CellBackColor in(16777072,16777120,9502608,13696976,12632319,13684991):
5176  articolo =(tariffa,
5177  descrizione,
5178  um,
5179  sic,
5180  prezzo,
5181  mdo_p,
5182  mdo,)
5183  elif oSheet.getCellByPosition(2, el).CellBackColor in(16777168,15794160,15790335):
5184  if assembla ==2: madre = descrizione
5185  articolo =(tariffa,
5186  descrizione,
5187  um,
5188  sic,
5189  prezzo,
5190  mdo_p,
5191  mdo,)
5192  else:
5193  if madre == '':
5194  descrizione = oSheet.getCellByPosition(4, el).String
5195  else:
5196  descrizione = madre + ' \n- ' + oSheet.getCellByPosition(4, el).String
5197  articolo =(tariffa,
5198  descrizione,
5199  um,
5200  sic,
5201  prezzo,
5202  mdo_p,
5203  mdo,)
5204  lista_articoli.append(articolo)
5205  oDialogo_attesa.endExecute()
5206  _gotoDoc(dest) #vado sul nuovo file
5207 # compilo la tabella ###################################################
5208  oDoc = XSCRIPTCONTEXT.getDocument()
5209  oDialogo_attesa = dlg_attesa()
5210  attesa().start() #mostra il dialogo
5211 
5212  oSheet = oDoc.getSheets().getByName('S2')
5213  oSheet.getCellByPosition(2, 2).String = nome
5214  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
5215  oSheet.getCellByPosition(1, 1).String = nome
5216 
5217  oSheet.getRows().insertByIndex(4, len(lista_articoli))
5218  lista_come_array = tuple(lista_articoli)
5219  # Parametrizzo il range di celle a seconda della dimensione della lista
5220  colonne_lista = len(lista_come_array[1]) # numero di colonne necessarie per ospitare i dati
5221  righe_lista = len(lista_come_array) # numero di righe necessarie per ospitare i dati
5222  oRange = oSheet.getCellRangeByPosition( 0,
5223  4,
5224  colonne_lista - 1, # l'indice parte da 0
5225  righe_lista + 4 - 1)
5226  oRange.setDataArray(lista_come_array)
5227  oSheet.getRows().removeByIndex(3, 1)
5228  oDoc.CurrentController.setActiveSheet(oSheet)
5229  oDialogo_attesa.endExecute()
5230  procedo = DlgSiNo('''Vuoi mettere in ordine la visualizzazione del prezzario?
5231 
5232 Le righe senza prezzo avranno una tonalità di sfondo
5233 diversa dalle altre e potranno essere facilmente nascoste.
5234 
5235 Questa operazione potrebbe richiedere del tempo.''', 'Richiesta...')
5236  if procedo ==2:
5237  attesa().start() #mostra il dialogo
5238  #~ struttura_Elenco()
5239  oDialogo_attesa.endExecute()
5240  MsgBox('Conversione eseguita con successo!','')
5241  autoexec()
5242 
5243 
5244 def importa_stili(arg=None):
5245  '''
5246  Importa tutti gli stili da un documento di riferimento. Se non è
5247  selezionato, il file di rifetimento è il template di leenO.
5248  '''
5249  if DlgSiNo('''Questa operazione sovrascriverà gli stili
5250 del documento attivo, se già presenti!
5251 
5252 Se non scegli un file di riferimento, saranno
5253 importati gli stili di default di LeenO.
5254 
5255 Vuoi continuare?''', 'Importa Stili in blocco?') == 3: return
5256  filename = filedia('Scegli il file di riferimento...', '*.ods')
5257  if filename == None:
5258  #~ desktop = XSCRIPTCONTEXT.getDesktop()
5259  filename = LeenO_path()+'/template/leeno/Computo_LeenO.ots'
5260  else:
5261  filename = uno.systemPathToFileUrl(filename)
5262  oDoc = XSCRIPTCONTEXT.getDocument()
5263  oDoc.getStyleFamilies().loadStylesFromURL(filename,list())
5264  for el in oDoc.Sheets.ElementNames:
5265  oDoc.CurrentController.setActiveSheet(oDoc.getSheets().getByName(el))
5267  try:
5268  _gotoSheet('Elenco Prezzi')
5269  except:
5270  pass
5271 
5272 def parziale(arg=None):
5273  '''
5274  Inserisce una riga con l'indicazione della somma parziale.
5275  '''
5276  oDoc = XSCRIPTCONTEXT.getDocument()
5277  oSheet = oDoc.CurrentController.ActiveSheet
5278  lrow = Range2Cell()[1]
5279  if oSheet.Name in('COMPUTO','VARIANTE', 'CONTABILITA'):
5280  parziale_core(lrow)
5281  parziale_verifica()
5282 
5283 def parziale_core(lrow):
5284  '''
5285  lrow { double } : id della riga di inerimento
5286  '''
5287 
5288  if lrow == 0: return
5289  oDoc = XSCRIPTCONTEXT.getDocument()
5290  oSheet = oDoc.CurrentController.ActiveSheet
5291  sStRange = Circoscrive_Voce_Computo_Att(lrow)
5292  sopra = sStRange.RangeAddress.StartRow
5293  sotto = sStRange.RangeAddress.EndRow
5294  if oSheet.Name in('COMPUTO','VARIANTE'):
5295  if oSheet.getCellByPosition(0, lrow).CellStyle == 'comp 10 s' and \
5296  oSheet.getCellByPosition(1, lrow).CellStyle == 'Comp-Bianche in mezzo' and \
5297  oSheet.getCellByPosition(2, lrow).CellStyle == 'comp 1-a' or \
5298  oSheet.getCellByPosition(0, lrow).CellStyle == 'Comp End Attributo':
5299  oSheet.getRows().insertByIndex(lrow, 1)
5300 
5301  oSheet.getCellByPosition(1, lrow).CellStyle = 'Comp-Bianche in mezzo'
5302  oSheet.getCellRangeByPosition(2, lrow, 7, lrow).CellStyle = 'comp sotto centro'
5303  oSheet.getCellByPosition(8, lrow).CellStyle = 'comp sotto BiancheS'
5304  oSheet.getCellByPosition(9, lrow).CellStyle = 'Comp-Variante num sotto'
5305  oSheet.getCellByPosition(8, lrow).Formula = '''=CONCATENATE("Parziale [";VLOOKUP(B'''+ str(sopra+2) + ''';elenco_prezzi;3;FALSE());"]")'''
5306  for i in reversed(range(0, lrow)):
5307  if oSheet.getCellByPosition(9, i-1).CellStyle in('vuote2', 'Comp-Variante num sotto'):
5308  i
5309  break
5310  oSheet.getCellByPosition(9, lrow).Formula = "=SUBTOTAL(9;J" + str(i) + ":J" + str(lrow+1) + ")"
5311 
5312  if oSheet.Name in('CONTABILITA'):
5313  if oSheet.getCellByPosition (0, lrow).CellStyle == "comp 10 s_R" and \
5314  oSheet.getCellByPosition (1, lrow).CellStyle == "Comp-Bianche in mezzo_R" and \
5315  oSheet.getCellByPosition (2, lrow).CellStyle == "comp 1-a" or \
5316  'Somma positivi e negativi [' in oSheet.getCellByPosition (8, lrow).String:
5317  oSheet.getRows().insertByIndex(lrow, 1)
5318 
5319  oSheet.getCellByPosition(2, lrow).CellStyle = "comp sotto centro"
5320  oSheet.getCellRangeByPosition(5, lrow, 7, lrow).CellStyle = "comp sotto centro"
5321  oSheet.getCellByPosition(8, lrow).CellStyle = "comp sotto BiancheS"
5322  oSheet.getCellByPosition(9, lrow).CellStyle = "Comp-Variante num sotto"
5323  oSheet.getCellByPosition(8, lrow).Formula ='=CONCATENATE("Parziale [";VLOOKUP(B' + str(sopra+2) + ';elenco_prezzi;3;FALSE());"]")'
5324 
5325  i = lrow
5326  while i > 0:
5327  if oSheet.getCellByPosition (9, i-1).CellStyle in ('vuote2', 'Comp-Variante num sotto'):
5328  da=i
5329  break
5330  i -= 1
5331  oSheet.getCellByPosition(9, lrow).Formula = '=SUBTOTAL(9;J' + str(da) + ':J' + str(lrow+1) + ')-SUBTOTAL(9;L' + str(da) + ':L' + str(lrow+1) + ')'
5332 
5333 def parziale_verifica(arg=None):
5334  '''
5335  Controlla l'esattezza del calcolo del parziale quanto le righe di
5336  misura vengono aggiunte o cancellate.
5337  '''
5338  oDoc = XSCRIPTCONTEXT.getDocument()
5339  oSheet = oDoc.CurrentController.ActiveSheet
5340  lrow = Range2Cell()[1]
5341  #~ if oSheet.Name in('COMPUTO','VARIANTE', 'CONTABILITA'):
5342  sStRange = Circoscrive_Voce_Computo_Att(lrow)
5343  sopra = sStRange.RangeAddress.StartRow+2
5344  sotto = sStRange.RangeAddress.EndRow
5345  for n in range(sopra, sotto):
5346  if 'Parziale [' in(oSheet.getCellByPosition(8, n).String):
5347  parziale_core(n)
5348 
5349 def vedi_voce_xpwe(lrow,vRif,flags=''):
5350  """(riga d'inserimento, riga di riferimento)"""
5351  oDoc = XSCRIPTCONTEXT.getDocument()
5352  oSheet = oDoc.CurrentController.ActiveSheet
5353  sStRange = Circoscrive_Voce_Computo_Att(vRif)
5354  sStRange.RangeAddress
5355  idv = sStRange.RangeAddress.StartRow +1
5356  sotto = sStRange.RangeAddress.EndRow
5357  art = 'B$' + str(idv+1)
5358  idvoce = 'A$' + str(idv+1)
5359  des = 'C$' + str(idv+1)
5360  quantity = 'J$' + str(sotto+1)
5361  um = 'VLOOKUP(' + art + ';elenco_prezzi;3;FALSE())'
5362 
5363  if oSheet.Name == 'CONTABILITA':
5364  sformula = '=CONCATENATE("";"- vedi voce n.";TEXT(' + idvoce +';"@");" - art. ";' + art + ';" [";' + um + ';"]"'
5365  else:
5366  sformula = '=CONCATENATE("";"- vedi voce n.";TEXT(' + idvoce +';"@");" - art. ";' + art +';" - ";LEFT(' + des + ';$S1.$H$334);" - [";' + um + ';" ";TEXT('+ quantity +';"0,00");"]";)'
5367 
5368  oSheet.getCellByPosition(2, lrow).Formula= sformula
5369  oSheet.getCellByPosition(4, lrow).Formula='=' + quantity
5370  oSheet.getCellByPosition(9, lrow).Formula='=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))'
5371  if flags in('32769', '32801'): # 32768
5372  inverti_segno()
5373  oSheet.getCellRangeByPosition(2, lrow, 10, lrow).CharColor = 16724787
5374 
5375 def vedi_voce(arg=None):
5376  '''
5377  Inserisce un riferimento a voce precedente sulla riga corrente.
5378  '''
5379  oDoc = XSCRIPTCONTEXT.getDocument()
5380  oSheet = oDoc.CurrentController.ActiveSheet
5381  lrow = Range2Cell()[1]
5382  if oSheet.getCellByPosition(2, lrow).Type.value != 'EMPTY':
5383  copia_riga_computo(lrow)
5384  lrow += 1
5385  if oSheet.getCellByPosition(2, lrow).CellStyle == 'comp 1-a':
5386  to = basic_LeenO('ListenersSelectRange.getRange', 'prova')
5387  to = int(to.split('$')[-1])-1
5388  _gotoCella(2, lrow)
5389  focus = oDoc.CurrentController.getFirstVisibleRow
5390  if to < lrow:
5391  vedi_voce_xpwe(lrow, to,)
5392 
5393 def strall(el, n=3, pos=0):
5394  '''
5395  Allunga una stringa fino a n.
5396  el { string } : stringa di partenza
5397  n { int } : numero di caratteri da aggiungere
5398  pos { int } : 0 = prefisso; 1 = suffisso
5399 
5400  '''
5401  #~ el ='o'
5402  if pos == 0:
5403  el = n * '0' + el
5404  else:
5405  el = el + n * '0'
5406  return el
5407 
5408 
5409 def converti_stringhe(arg=None):
5410  '''
5411  Converte in numeri le stinghe o viceversa.
5412  '''
5413  oDoc = XSCRIPTCONTEXT.getDocument()
5414  oSheet = oDoc.CurrentController.ActiveSheet
5415  ctx = XSCRIPTCONTEXT.getComponentContext()
5416  desktop = XSCRIPTCONTEXT.getDesktop()
5417  try:
5418  sRow = oDoc.getCurrentSelection().getRangeAddresses()[0].StartRow
5419  sCol = oDoc.getCurrentSelection().getRangeAddresses()[0].StartColumn
5420  eRow = oDoc.getCurrentSelection().getRangeAddresses()[0].EndRow
5421  eCol = oDoc.getCurrentSelection().getRangeAddresses()[0].EndColumn
5422  except AttributeError:
5423  sRow = oDoc.getCurrentSelection().getRangeAddress().StartRow
5424  sCol = oDoc.getCurrentSelection().getRangeAddress().StartColumn
5425  eRow = oDoc.getCurrentSelection().getRangeAddress().EndRow
5426  eCol = oDoc.getCurrentSelection().getRangeAddress().EndColumn
5427  oRange = oSheet.getCellRangeByPosition(sCol, sRow, eCol, eRow)
5428  for y in range(sCol, eCol+1):
5429  for x in range(sRow, eRow+1):
5430  try:
5431  if oSheet.getCellByPosition(y, x).Type.value == 'TEXT':
5432  oSheet.getCellByPosition(y, x).Value = float(oSheet.getCellByPosition(y, x).String.replace(',','.'))
5433  else:
5434  oSheet.getCellByPosition(y, x).String = oSheet.getCellByPosition(y, x).String
5435  except:
5436  pass
5437  return
5438 
5439 def getNumFormat (FormatString):
5440  '''
5441  Restituisce il numero identificativo del formato sulla base di una
5442  stringa di rifetrimento.
5443  FormatString { string } : codifica letterale del numero; es.: "#.##0,00"
5444  '''
5445  oDoc = XSCRIPTCONTEXT.getDocument()
5446  oSheet = oDoc.CurrentController.ActiveSheet
5447 
5448  LocalSettings = uno.createUnoStruct("com.sun.star.lang.Locale")
5449  LocalSettings.Language = "it"
5450  LocalSettings.Country = "IT"
5451  NumberFormats = oDoc.NumberFormats
5452  #~ FormatString # = "#.##0,00"
5453  NumberFormatId = NumberFormats.queryKey(FormatString, LocalSettings, True)
5454 
5455  if NumberFormatId == -1:
5456  NumberFormatId = NumberFormats.addNew(FormatString, LocalSettings)
5457  return NumberFormatId
5458 
5459 def getFormatString (stile_cella):
5460  '''
5461  Recupera la stringa di riferimento dal nome dello stile di cella.
5462  stile_cella { string } : nome dello stile di cella
5463  '''
5464  oDoc = XSCRIPTCONTEXT.getDocument()
5465  oSheet = oDoc.CurrentController.ActiveSheet
5466  num = oDoc.StyleFamilies.getByName("CellStyles").getByName(stile_cella).NumberFormat
5467  return oDoc.getNumberFormats().getByKey(num).FormatString
5468 
5469 def dec_pl (nome_stile, n):
5470  '''
5471  Cambia il numero dei decimali dello stile di cella.
5472  stile_cella { string } : nome stile di cella
5473  n { int } : nuovo numero decimali
5474  '''
5475  oDoc = XSCRIPTCONTEXT.getDocument()
5476  oSheet = oDoc.CurrentController.ActiveSheet
5477  stringa = getFormatString(nome_stile).split(';')
5478  new = list()
5479  for el in stringa:
5480  new.append (el.split(',')[0] + ',' + '0'* n)
5481  #~ oDoc.StyleFamilies.getByName('CellStyles').getByName(nome_stile).NumberFormat = getNumFormat(strall("#.##0,", 6+int(PartiUguali), 1))
5482  oDoc.StyleFamilies.getByName('CellStyles').getByName(nome_stile).NumberFormat = getNumFormat(';'.join(new))
5483  return
5484 
5485 
5486 def XPWE_in(arg):
5487  oDoc = XSCRIPTCONTEXT.getDocument()
5488  oSheet = oDoc.CurrentController.ActiveSheet
5489  refresh(0)
5490  oDialogo_attesa = dlg_attesa('Caricamento dei dati...')
5491  if oDoc.getSheets().hasByName('S2') == False:
5492  MsgBox('Puoi usare questo comando da un file di computo nuovo o già esistente.','ATTENZIONE!')
5493  return
5494  else:
5495  MsgBox("Il contenuto dell'archivio XPWE sarà aggiunto a questo file.",'Avviso!')
5496  _gotoSheet('COMPUTO')
5497  oDoc.CurrentController.select(oDoc.getSheets().hasByName('COMPUTO')) # per evitare che lo script parta da un altro documento
5498  filename = filedia('Scegli il file XPWE da importare...','*.xpwe')#'*.xpwe')
5499  '''xml auto indent: http://www.freeformatter.com/xml-formatter.html'''
5500  # inizializzazione delle variabili
5501  datarif = datetime.now()
5502  lista_articoli = list() # lista in cui memorizzare gli articoli da importare
5503  diz_ep = dict() # array per le voci di elenco prezzi
5504  # effettua il parsing del file XML
5505  tree = ElementTree()
5506  if filename == 'Cancel' or filename == '':
5507  return
5508  try:
5509  tree.parse(filename)
5510  except TypeError:
5511  return
5512  except PermissionError:
5513  MsgBox('Accertati che il nome del file sia corretto.', 'ATTENZIONE! Impossibile procedere.')
5514  return
5515  # ottieni l'item root
5516  root = tree.getroot()
5517  logging.debug(list(root))
5518  # effettua il parsing di tutti gli elementi dell'albero XML
5519  iter = tree.getiterator()
5520  if root.find('FileNameDocumento'):
5521  nome_file = root.find('FileNameDocumento').text
5522  else:
5523  nome_file = "nome_file"
5524 
5525  dati = root.find('PweDatiGenerali')
5526  DatiGenerali = dati.getchildren()[0][0]
5527  percprezzi = DatiGenerali[0].text
5528  comune = DatiGenerali[1].text
5529  provincia = DatiGenerali[2].text
5530  oggetto = DatiGenerali[3].text
5531  committente = DatiGenerali[4].text
5532  impresa = DatiGenerali[5].text
5533  parteopera = DatiGenerali[6].text
5534 
5535 
5536  try:
5537  CapCat = dati.find('PweDGCapitoliCategorie')
5538 
5539  lista_supcap = list()
5540  if CapCat.find('PweDGSuperCapitoli'):
5541  PweDGSuperCapitoli = CapCat.find('PweDGSuperCapitoli').getchildren()
5542  for elem in PweDGSuperCapitoli:
5543  id_sc = elem.get('ID')
5544  codice = elem.find('Codice').text
5545  try:
5546  codice = elem.find('Codice').text
5547  except AttributeError:
5548  codice = ''
5549  dessintetica = elem.find('DesSintetica').text
5550  percentuale = elem.find('Percentuale').text
5551  diz = dict()
5552  diz['id_sc'] = id_sc
5553  diz['codice'] = codice
5554  diz['dessintetica'] = dessintetica
5555  diz['percentuale'] = percentuale
5556  lista_supcap.append(diz)
5557 
5558  lista_cap = list()
5559  if CapCat.find('PweDGCapitoli'):
5560  PweDGCapitoli = CapCat.find('PweDGCapitoli').getchildren()
5561  for elem in PweDGCapitoli:
5562  id_sc = elem.get('ID')
5563  codice = elem.find('Codice').text
5564  try:
5565  codice = elem.find('Codice').text
5566  except AttributeError:
5567  codice = ''
5568  dessintetica = elem.find('DesSintetica').text
5569  percentuale = elem.find('Percentuale').text
5570  diz = dict()
5571  diz['id_sc'] = id_sc
5572  diz['codice'] = codice
5573  diz['dessintetica'] = dessintetica
5574  diz['percentuale'] = percentuale
5575  lista_cap.append(diz)
5576 
5577  lista_subcap = list()
5578  if CapCat.find('PweDGSubCapitoli'):
5579  PweDGSubCapitoli = CapCat.find('PweDGSubCapitoli').getchildren()
5580  for elem in PweDGSubCapitoli:
5581  id_sc = elem.get('ID')
5582  codice = elem.find('Codice').text
5583  try:
5584  codice = elem.find('Codice').text
5585  except AttributeError:
5586  codice = ''
5587  dessintetica = elem.find('DesSintetica').text
5588  percentuale = elem.find('Percentuale').text
5589  diz = dict()
5590  diz['id_sc'] = id_sc
5591  diz['codice'] = codice
5592  diz['dessintetica'] = dessintetica
5593  diz['percentuale'] = percentuale
5594  lista_subcap.append(diz)
5595 
5596  lista_supcat = list()
5597  if CapCat.find('PweDGSuperCategorie'):
5598  PweDGSuperCategorie = CapCat.find('PweDGSuperCategorie').getchildren()
5599  for elem in PweDGSuperCategorie:
5600  id_sc = elem.get('ID')
5601  dessintetica = elem.find('DesSintetica').text
5602  try:
5603  percentuale = elem.find('Percentuale').text
5604  except AttributeError:
5605  percentuale = '0'
5606  supcat =(id_sc, dessintetica, percentuale)
5607  lista_supcat.append(supcat)
5608 
5609  lista_cat = list()
5610  if CapCat.find('PweDGCategorie'):
5611  PweDGCategorie = CapCat.find('PweDGCategorie').getchildren()
5612  for elem in PweDGCategorie:
5613  id_sc = elem.get('ID')
5614  dessintetica = elem.find('DesSintetica').text
5615  try:
5616  percentuale = elem.find('Percentuale').text
5617  except AttributeError:
5618  percentuale = '0'
5619  cat =(id_sc, dessintetica, percentuale)
5620  lista_cat.append(cat)
5621 
5622  lista_subcat = list()
5623  if CapCat.find('PweDGSubCategorie'):
5624  PweDGSubCategorie = CapCat.find('PweDGSubCategorie').getchildren()
5625  for elem in PweDGSubCategorie:
5626  id_sc = elem.get('ID')
5627  dessintetica = elem.find('DesSintetica').text
5628  try:
5629  percentuale = elem.find('Percentuale').text
5630  except AttributeError:
5631  percentuale = '0'
5632  subcat =(id_sc, dessintetica, percentuale)
5633  lista_subcat.append(subcat)
5634  except AttributeError:
5635  pass
5636 
5637  try:
5638  PweDGWBS = dati.find('PweDGWBS')
5639  pass
5640  except AttributeError:
5641  pass
5642 
5643  PweDGAnalisi = dati.find('PweDGModuli').getchildren()[0]
5644  speseutili = PweDGAnalisi.find('SpeseUtili').text
5645  spesegenerali = PweDGAnalisi.find('SpeseGenerali').text
5646  utiliimpresa = PweDGAnalisi.find('UtiliImpresa').text
5647  oneriaccessorisc = PweDGAnalisi.find('OneriAccessoriSc').text
5648  confquantita = PweDGAnalisi.find('ConfQuantita').text
5649  oSheet = oDoc.getSheets().getByName('S1')
5650 
5651  try:
5652  oSheet.getCellByPosition(7,318).Value = float(oneriaccessorisc)/100
5653  except:
5654  pass
5655  try:
5656  oSheet.getCellByPosition(7,319).Value = float(spesegenerali)/100
5657  except:
5658  pass
5659  try:
5660  oSheet.getCellByPosition(7,320).Value = float(utiliimpresa)/100
5661  except:
5662  pass
5663 
5664  try:
5665  PweDGConfigNumeri = dati.find('PweDGConfigurazione').getchildren()[0]
5666  Divisa = PweDGConfigNumeri.find('Divisa').text
5667  ConversioniIN = PweDGConfigNumeri.find('ConversioniIN').text
5668  FattoreConversione = PweDGConfigNumeri.find('FattoreConversione').text
5669  Cambio = PweDGConfigNumeri.find('Cambio').text
5670  PartiUguali = PweDGConfigNumeri.find('PartiUguali').text.split('.')[-1].split('|')[0]
5671  Larghezza = PweDGConfigNumeri.find('Larghezza').text.split('.')[-1].split('|')[0]
5672  Lunghezza = PweDGConfigNumeri.find('Lunghezza').text.split('.')[-1].split('|')[0]
5673  HPeso = PweDGConfigNumeri.find('HPeso').text.split('.')[-1].split('|')[0]
5674  Quantita = PweDGConfigNumeri.find('Quantita').text.split('.')[-1].split('|')[0]
5675  Prezzi = PweDGConfigNumeri.find('Prezzi').text.split('.')[-1].split('|')[0]
5676  PrezziTotale = PweDGConfigNumeri.find('PrezziTotale').text.split('.')[-1].split('|')[0]
5677  ConvPrezzi = PweDGConfigNumeri.find('ConvPrezzi').text.split('.')[-1].split('|')[0]
5678  ConvPrezziTotale = PweDGConfigNumeri.find('ConvPrezziTotale').text.split('.')[-1].split('|')[0]
5679  IncidenzaPercentuale = PweDGConfigNumeri.find('IncidenzaPercentuale').text.split('.')[-1].split('|')[0]
5680  Aliquote = PweDGConfigNumeri.find('Aliquote').text.split('.')[-1].split('|')[0]
5681  dec_pl('comp 1-a PU', int(PartiUguali))
5682  dec_pl('comp 1-a LUNG', int(Lunghezza))
5683  dec_pl('comp 1-a LARG', int(Larghezza))
5684  dec_pl('comp 1-a peso', int(HPeso))
5685  for el in ('Comp-Variante num sotto', 'An-lavoraz-input', 'Blu'):
5686  dec_pl(el, int(Quantita))
5687  for el in ('comp sotto Unitario', 'An-lavoraz-generica'):
5688  dec_pl(el, int(Prezzi))
5689  for el in ('comp sotto Euro Originale', 'Livello-0-scritta mini val',
5690  'Livello-1-scritta mini val', 'livello2 scritta mini', 'Comp TOTALI',
5691  'Ultimus_totali_1', 'Ultimus_bordo', 'ULTIMUS_3', 'Ultimus_Bordo_sotto',
5692  'Comp-Variante num sotto','An-valuta-dx', 'An-1v-dx', 'An-lavoraz-generica',
5693  'An-lavoraz-Utili-num sin'):
5694  dec_pl(el, int(PrezziTotale))
5695  except IndexError:
5696  pass
5697 
5698  misurazioni = root.find('PweMisurazioni')
5699  PweElencoPrezzi = misurazioni.getchildren()[0]
5700 
5701 
5702  epitems = PweElencoPrezzi.findall('EPItem')
5703  dict_articoli = dict()
5704  lista_articoli = list()
5705  lista_analisi = list()
5706  lista_tariffe_analisi = list()
5707  for elem in epitems:
5708  id_ep = elem.get('ID')
5709  diz_ep = dict()
5710  tipoep = elem.find('TipoEP').text
5711  if elem.find('Tariffa').text != None:
5712  tariffa = elem.find('Tariffa').text
5713  else:
5714  tariffa = ''
5715  articolo = elem.find('Articolo').text
5716  desridotta = elem.find('DesRidotta').text
5717  destestesa = elem.find('DesEstesa').text#.strip()
5718  try:
5719  desridotta = elem.find('DesBreve').text
5720  except AttributeError:
5721  pass
5722  try:
5723  desbreve = elem.find('DesBreve').text
5724  except AttributeError:
5725  desbreve = ''
5726 
5727  if elem.find('UnMisura').text != None:
5728  unmisura = elem.find('UnMisura').text
5729  else:
5730  unmisura = ''
5731  # ~prezzo1 = elem.find('Prezzo1').text
5732  if elem.find('Prezzo1').text == '0' :
5733  prezzo1 = ''
5734  else:
5735  prezzo1 = float(elem.find('Prezzo1').text)
5736  prezzo2 = elem.find('Prezzo2').text
5737  prezzo3 = elem.find('Prezzo3').text
5738  prezzo4 = elem.find('Prezzo4').text
5739  prezzo5 = elem.find('Prezzo5').text
5740 
5741  try:
5742  idspcap = elem.find('IDSpCap').text
5743  except AttributeError:
5744  idspcap = ''
5745  try:
5746  idcap = elem.find('IDCap').text
5747  except AttributeError:
5748  idcap = ''
5749  try:
5750  idsbcap = elem.find('IDSbCap').text
5751  except AttributeError:
5752  idsbcap = ''
5753  try:
5754  flags = elem.find('Flags').text
5755  except AttributeError:
5756  flags = ''
5757  try:
5758  data = elem.find('Data').text
5759  except AttributeError:
5760  data = ''
5761 
5762  IncSIC = ''
5763  IncMDO = ''
5764  IncMAT = ''
5765  IncATTR= ''
5766 
5767  try:
5768  if float(elem.find('IncSIC').text) != 0 : IncSIC = float(elem.find('IncSIC').text) / 100
5769  except: # AttributeError TypeError:
5770  pass
5771  try:
5772  if float(elem.find('IncMDO').text) != 0 : IncMDO = float(elem.find('IncMDO').text) / 100
5773  except: # AttributeError TypeError:
5774  pass
5775  try:
5776  if float(elem.find('IncMAT').text) != 0 : IncMAT = float(elem.find('IncMAT').text) / 100
5777  except: # AttributeError TypeError:
5778  pass
5779  try:
5780  if float(elem.find('IncATTR').text) != 0 : IncATTR = float(elem.find('IncATTR').text) / 100
5781  except: # AttributeError TypeError:
5782  pass
5783  try:
5784  adrinternet = elem.find('AdrInternet').text
5785  except AttributeError:
5786  adrinternet = ''
5787  if elem.find('PweEPAnalisi').text == None:
5788  pweepanalisi = ''
5789  else:
5790  pweepanalisi = elem.find('PweEPAnalisi').text
5791  #~ chi(pweepanalisi)
5792  diz_ep['tipoep'] = tipoep
5793  diz_ep['tariffa'] = tariffa
5794  diz_ep['articolo'] = articolo
5795  diz_ep['desridotta'] = desridotta
5796  diz_ep['destestesa'] = destestesa
5797  diz_ep['desridotta'] = desridotta
5798  diz_ep['desbreve'] = desbreve
5799  diz_ep['unmisura'] = unmisura
5800  diz_ep['prezzo1'] = prezzo1
5801  diz_ep['prezzo2'] = prezzo2
5802  diz_ep['prezzo3'] = prezzo3
5803  diz_ep['prezzo4'] = prezzo4
5804  diz_ep['prezzo5'] = prezzo5
5805  diz_ep['idspcap'] = idspcap
5806  diz_ep['idcap'] = idcap
5807  diz_ep['flags'] = flags
5808  diz_ep['data'] = data
5809  diz_ep['adrinternet'] = adrinternet
5810  #~ diz_ep['pweepanalisi'] = pweepanalisi
5811  diz_ep['IncSIC'] = IncSIC
5812  diz_ep['IncMDO'] = IncMDO
5813  diz_ep['IncMAT'] = IncMDO
5814  diz_ep['IncATTR'] = IncMDO
5815 
5816  dict_articoli[id_ep] = diz_ep
5817  articolo_modificato = (tariffa,
5818  destestesa,
5819  unmisura,
5820  IncSIC,
5821  # ~float(prezzo1),
5822  prezzo1,
5823  IncMDO,
5824  IncMAT,
5825  IncATTR)
5826  lista_articoli.append(articolo_modificato)
5827 
5828  pweepanalisi = elem.find('PweEPAnalisi')
5829  PweEPAR = pweepanalisi.find('PweEPAR')
5830  if PweEPAR != None:
5831  EPARItem = PweEPAR.findall('EPARItem')
5832  analisi = list()
5833  for el in EPARItem:
5834  id_an = el.get('ID')
5835  an_tipo = el.find('Tipo').text
5836  id_ep = el.find('IDEP').text
5837  an_des = el.find('Descrizione').text
5838  an_um = el.find('Misura').text
5839  if an_um == None: an_um = ''
5840  try:
5841  an_qt = el.find('Qt').text.replace(' ','')
5842  except:
5843  an_qt = ''
5844  try:
5845  an_pr = el.find('Prezzo').text.replace(' ','')
5846  except:
5847  an_pr = ''
5848  an_fld = el.find('FieldCTL').text
5849  an_rigo =(id_ep, an_des, an_um, an_qt, an_pr)
5850  analisi.append(an_rigo)
5851  lista_analisi.append([tariffa, destestesa, unmisura, analisi, prezzo1])
5852  lista_tariffe_analisi.append(tariffa)
5853 # leggo voci di misurazione e righe ####################################
5854  lista_misure = list()
5855  try:
5856  PweVociComputo = misurazioni.getchildren()[1]
5857  vcitems = PweVociComputo.findall('VCItem')
5858  prova_l = list()
5859  for elem in vcitems:
5860  diz_misura = dict()
5861  id_vc = elem.get('ID')
5862  id_ep = elem.find('IDEP').text
5863  quantita = elem.find('Quantita').text
5864  try:
5865  datamis = elem.find('DataMis').text
5866  except AttributeError:
5867  datamis = ''
5868  try:
5869  flags = elem.find('Flags').text
5870  except AttributeError:
5871  flags = ''
5872  try:
5873  idspcat = elem.find('IDSpCat').text
5874  except AttributeError:
5875  idspcat = ''
5876  try:
5877  idcat = elem.find('IDCat').text
5878  except AttributeError:
5879  idcat = ''
5880  try:
5881  idsbcat = elem.find('IDSbCat').text
5882  except AttributeError:
5883  idsbcat = ''
5884  try:
5885  CodiceWBS = elem.find('CodiceWBS').text
5886  except AttributeError:
5887  CodiceWBS = ''
5888  righi_mis = elem.getchildren()[-1].findall('RGItem')
5889  lista_rig = list()
5890  riga_misura =()
5891  lista_righe = list()#[]
5892  new_id_l = list()
5893 
5894  for el in righi_mis:
5895  rgitem = el.get('ID')
5896  idvv = el.find('IDVV').text
5897  if el.find('Descrizione').text != None:
5898  descrizione = el.find('Descrizione').text
5899  else:
5900  descrizione = ''
5901  partiuguali = el.find('PartiUguali').text
5902  lunghezza = el.find('Lunghezza').text
5903  larghezza = el.find('Larghezza').text
5904  hpeso = el.find('HPeso').text
5905  quantita = el.find('Quantita').text
5906  flags = el.find('Flags').text
5907  riga_misura = (descrizione,
5908  '',
5909  '',
5910  partiuguali,
5911  lunghezza,
5912  larghezza,
5913  hpeso,
5914  quantita,
5915  flags,
5916  idvv,
5917  )
5918  mia = []
5919  mia.append(riga_misura[0])
5920  for el in riga_misura[1:]:
5921  if el == None:
5922  el = ''
5923  else:
5924  try:
5925  el = float(el)
5926  except ValueError:
5927  if el != '':
5928  el = '=' + el.replace('.'<