Ejemplo n.º 1
0
import abtronics
from time import sleep
from glob import glob
from ntpath import basename

shell = Dispatch("Shell.Application")
ADDUC_FOLDER = shell.BrowseForFolder(0, "Séléctionnez le dossier qui contient les fiches d'addoctibilité et ka fiche PA", 1)
ADDUC_FOLDER = ADDUC_FOLDER.Self.Path
XLS = glob(ADDUC_FOLDER + sep + "*.xls")
ADDUCS = [xls for xls in XLS if not basename(xls).startswith('PA')]
PA = [xls for xls in XLS if basename(xls).startswith('PA')][0]
print('nombre de fiches addc', len(ADDUCS))

xl = CreateObject("Excel.application")
xl.Visible = False
xl.DisplayAlerts = False
pa_wb = xl.Workbooks.Open(PA)
#adduc_sheet = pa_wb.Sheets.Add(After=pa_wb.Sheets(pa_wb.Sheets.Count))
adduc_sheet = pa_wb.Sheets.Add(After=pa_wb.Sheets(7))
adduc_sheet.Name = "Adductibilité des sites"

start_row = 1

def merge(adduc):
	global xl
	global pa_wb
	global start_row
	adduc_wb = xl.Workbooks.Open(adduc)
	for cell in adduc_wb.Sheets(1).Range('C8:C1000'):
		if cell.Value() == None:
			last_line = cell.Row - 1
Ejemplo n.º 2
0
    opts, args = getopt.getopt(sys.argv[1:], "n:f:",
                               ["number of groups", "file"])
except getopt.GetoptError as err:
    print(err)
    print("\tUse -n to set number of generating groups\n"
          "\tUse -f to set path to destination file")
    sys.exit(2)

n = 5
f = "data/groups.xlsx"

for o, a in opts:
    if o == "-n":
        n = int(a)
    elif o == "-f":
        f = a

project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
file = os.path.join(project_dir, f)

xl = CreateObject("Excel.Application")
try:
    xl.Visible = 0
    xl.DisplayAlerts = False
    wb = xl.Workbooks.Add()
    for i in range(n):
        xl.Range[f"A{i + 1}"].Value[()] = random_string("group", 10)
    wb.SaveAs(file, ConflictResolution=xlLocalSessionChanges)
finally:
    xl.Quit()
Ejemplo n.º 3
0
def process(PA):
	global ActiveWindow, Shapes, Word, TRs_all, xl, Visio
	global RESULTS
	try:

		# ouvrir le fichier excel et faire les initialisations de coutume
		xl = CreateObject("Excel.application")
		xl.Visible = False
		xl.DisplayAlerts = False
		wb = xl.Workbooks.Open(PA)
		wb.Sheets("synoptique-bilan µmodules").Select()

		# dans la sheet visée, détecter tout les objets OLE (qui seront 
		# normalement tous des déssins visio)
		OLEObjects = wb.Sheets("synoptique-bilan µmodules").OLEObjects()

		# pour chaque déssin ...
		for OLEObject in OLEObjects:
			# l'ouvrir dans Visio
			OLEObject.Verb(2)
			# prendre la main sur la fenêtre visio ouverte
			Visio = GetActiveObject("Visio.Application")
			# Visio.Visible = False
			Visio.DisplayAlerts = False
			ActiveWindow =  Visio.ActiveWindow
			Page = ActiveWindow.Page
			Shapes = Page.Shapes

			msg = "Voulez confirmer le nombre de PBs après chaque sélection?\n" \
						+ "(si c'est plan assez complexe mieux vaut répondre par oui)"
			yn = ynbox(msg)

			# allons-y!
			# On extrait d'abord les infos d'entête
			for shape in Shapes:
				text = shape.Text
				if text.startswith('NRO'):
					bloc_NRO = text
				elif text.startswith('PT'):
					try:
						blocs_PT.append(shape)
					except:
						blocs_PT = [shape]
				elif text.startswith('PA'):
					PA_posx = get_XY(shape)[0]
			if get_XY(blocs_PT[0])[0] > get_XY(blocs_PT[1])[0]:
				FI_bloc = blocs_PT[0]
				PA_bloc = blocs_PT[1]
			else:
				PA_bloc = blocs_PT[1]
				FI_bloc = blocs_PT[0]
			PA_PT = PA_bloc.Text.rsplit('\n')[0].replace('PT: ', '')
			PMZ_PT = FI_bloc.Text.rsplit('\n')[0].replace('PT: ', '')
			CH = PA_bloc.Text.rsplit('\n')[2].replace('CH: ', '')
			NRO = extract('NRO/PMZ/PA', bloc_NRO, 'NRO')
			ADRESSE1 = ' '.join(PA_bloc.Text.rsplit('\n')[3:5])\
									.replace('Adresse: ', '')
			ADRESSE2 = ADRESSE1.rsplit('-')[0]

			TRs = {}
			empty_TRs = []
			# là ça va barder!
			for shape in Shapes:
				if shape.Text.startswith('TR'):
					if get_XY(shape)[0] > PA_posx:
						TR_TXT = str(shape.Text.encode()).replace("b'", '').replace("'", '')
						TR = TR_TXT.rsplit('FO')[0] \
							.replace('\\n', ' ') + 'FO'
						if not re.match(r'TR\s+\d{2}\s+\d{4}\s+\d+FO', TR):
							empty_TRs.append(shape.ID)
							continue
						if TR not in TRs:
							TRs[TR] = {
								'LONG': 0,
								'SHAPES': [shape.ID],
								'CH/IMB/AP': [],
								'PTs': [],
								'maxPT': 0
								}
						else:
							TRs[TR]['SHAPES'].append(shape.ID)
						try:
							TR_LONG = int(TR_TXT.rsplit('\\xe2\\x80\\x93 ')[1] \
															.replace('m', ''))
						except:
							TR_LONG = 0
						TRs[TR]['LONG'] = TRs[TR]['LONG'] + TR_LONG
			
			title1 = 'Sélectionnez les bloc'
			title2 = 'Confirmez la sélection'
			for TR in TRs:
				while True:
					SelectShapes(TRs[TR]['SHAPES'])
					if ccbox(TR, title1):
						CH_OR_IMB_OR_AP_all = []
						PTs = []
						msg = "Pour " + TR + "\nVous avez sélectionné:\n"
						selected_PBs = 0
						yn_yes = True
						for selected in ActiveWindow.Selection:
							try:
								TEXT = str(selected.Text)
								if not TEXT.startswith('PB'):
									continue
								selected_PBs = selected_PBs + 1
								PT = TEXT.rsplit('\n')[2]
								ADR = TEXT.rsplit('\n')[3]
								CH_OR_IMB_OR_AP = TEXT.rsplit('\n')[4]
								if (not CH_OR_IMB_OR_AP.startswith('AP ')
										and not CH_OR_IMB_OR_AP.startswith('Ch.')
										and not CH_OR_IMB_OR_AP.startswith('IMB')):
									SelectShapes([selected.ID])
									msgbox("T'as surement encore fais une connerie dans tes"
												+ "déssins, regarde ce bloc dans la ligne PT!\n"
												+ "Je devrais trouver Ch.XXXX ou AP XXXX"
												+ "ou IMB/XXXX/XXX mais j'ai trouvé\n"
												+ CH_OR_IMB_OR_AP + "\n"
												+ "Quand t'auras détécté l'erreur click sur OK")
									cont = boolbox("Dois-je continuer ou fermer?",
																"Que faire?",
																['Continuer?', 'Fermer?'])
									if not cont:
										exit(0)
									else:
										pass
								else:
									msg = msg + "- " + CH_OR_IMB_OR_AP + "\n"
									CH_OR_IMB_OR_AP_all.append([ADR, CH_OR_IMB_OR_AP])
									PTs.append(int(PT.replace('PT', '')))
							except:
								SelectShapes([selected.ID])
								msgbox("T'as surement encore fais une connerie dans tes"
									+ "déssins, regarde ce bloc dans la ligne PT!\n"
									+ "Quand t'auras détécté l'erreur click sur OK")
								cont = boolbox("Dois-je continuer ou fermer?",
																"Que faire?",
																['Continuer?', 'Fermer?'])
								if not cont:
									exit(0)
								else:
									msg = msg + "(RIEN!)"
									CH_OR_IMB_OR_AP_all = []
									PTs = []
									yn_yes = False
						if not selected_PBs:
							cont = boolbox("Tu n'as rien sélectionné! Tu confirmes"
															+ " que ce n'est pas une connerie?",
															"Sélection vide!",
															['Oui vas-y', 'Comme d\'hab! Une connerie'])
							if cont:
								break
							else:
								continue
						if yn and yn_yes:
							msg = msg + "(" + str(selected_PBs) + " sélectionnés)"
							conf = boolbox(msg, title2, ['Confirmer?', 'Refaire?'])
							if conf:
								TRs[TR]['CH/IMB/AP'] = CH_OR_IMB_OR_AP_all
								TRs[TR]['PTs'] = PTs
								break
							else:
								pass
						else:
							TRs[TR]['CH/IMB/AP'] = CH_OR_IMB_OR_AP_all
							TRs[TR]['PTs'] = PTs
							break
					else:
						exit(0)
				if len(TRs[TR]['PTs']):
					TRs[TR]['maxPT'] = 'DE_PT%06d' % max(TRs[TR]['PTs']) + '.doc'
				else:
					TRs[TR]['maxPT'] = 'je_ne_suis_pas_cense_exister.doc'
			if TRs == {}:
				msgbox("il n'y pas de TR valide sur ce déssin")
			TRs_all.append(TRs)
			Visio.Visible = False

		RESULTS[PA] = {
			'TRs_all': 	TRs_all,
			'NRO':			NRO,
			'PMZ_PT':		PMZ_PT,
			'PA_PT':		PA_PT,
			'CH':				CH,
			'ADRESSE1':	ADRESSE1,
			'ADRESSE2':	ADRESSE2,
			'DATE':			DATE
		}
		xl.Quit()
		return

	except:
		print(format_exc())
		codebox("t'as encore fais une connerie! Fais moi un screen de malheur!",
						"Erreur",
						format_exc())
		going()
Ejemplo n.º 4
0
__models_folder__ = abtronics.__models_folder__
__model_name__ = 'fiche_pa_3.2d.xls'
__model_path__ = __models_folder__ + sep + __model_name__
__jobs_folder__ = abtronics.__jobs_folder__
__JOB_ID__ = abtronics.__JOB_ID__
__JOB_PATH__ = __jobs_folder__ + sep + __JOB_ID__ + sep
mkdir(__JOB_PATH__)

def GetCellValue(cell):
	return excel.ActiveWorkbook.Sheets('positionnement-etude').Range(cell).Value()

file = fileopenbox("Séléctionnez la fiche PMR source", "Abtronics", filetypes= "*.xls*", multiple=False)
filename = basename(file)

excel = CreateObject('Excel.Application')
excel.DisplayAlerts = False
excel.Visible = True
excel.Workbooks.Open(file)
data = excel.ActiveWorkbook.Sheets('positionnement-etude').Range('A5:O1000').Value()
data = [line for line in data if not all(x is None for x in line)]
data = [[x for x in line] for line in data if not all(x is None for x in line)]
for i, line in enumerate(data):
	data[i][1] = ' '.join(line[1:3])
	del(data[i][2])
	if data[i][8]: data[i][8] = data[i][8].lower()
	if data[i][9]: data[i][9] = data[i][9].lower()
	if data[i][11]: data[i][11] = data[i][11].lower()
excel.Workbooks.Close()
excel.Workbooks.Open(__model_path__)
for i, line in enumerate(data):
	excel.ActiveWorkbook.Sheets('positionnement-etude').Range('A' + str(5+i) + ':N' + str(5+i)).Value[()] = line
def generateMAL_AON_cs(out_excel, county, rate=10.0, year=2015, where_clause='', sort_by=DEFAULT_SORT):
    """Generates the Maintenance Assessment List for a county as an excel file using ALL_OR_NOTHING
    style of admin fees.

    Required:
        out_excel -- output .xls file
        county -- name of county
        rate -- tax rate for county as a float
        year -- year for assessment

    Optional:
        where_clause -- optional where clause to filter records
        sort_by -- optional fields to sort by, if none specified will sort by
            owner code and legal description (records are already sorted by
            section-township-range)
    """
    rate = float(rate)
    if os.path.exists(out_excel):
        os.remove(out_excel)

    # **************************************************************************************
    # styles
    #
    # set up style dict
    styleDict = {DATE_PAID: styleDate,
                 LANDOWNER: styleHeadersLeft,
                 ACRES: styleCurrency,
                 BENEFIT: styleCurrency,
                 ASSESSMENT: styleCurrency,
                 ADMIN_FEE: styleCurrency,
                 DEFAULT_STYLE: defaultStyle
        }

    # style dict for breaking out of years
    yearBreakDict = {ACRES: yearBreak,
                     BENEFIT: yearBreak,
                     ASSESSMENT: yearBreak,
                     ADMIN_FEE: yearBreak
        }

    # section overwrite style dict
    sectionBreakDict = {PID: styleHeadersRight}

    # column widths
    widths = (8, 35, 8, 9, 30, 20, 8, 8, 10, 10, 3, 8)

    # **************************************************************************************

    # validate table name and set up workbook and sheets
    if not os.path.splitext(out_excel)[-1] == '.xls':
        out_excel = os.path.splitext(out_excel)[0] + '.xls'

    headers = [CODE, LANDOWNER, SECTION, SEQUENCE, DESCRIPTION,
               PID, ACRES, BENEFIT, ASSESSMENT, ADMIN_FEE, EXEMPT, DATE_PAID]

    col_widths = dict(zip(range(len(headers)), widths))

    # new workbook
    wb = ExcelWorkbook()
    ws = wb.add_sheet('Assessments', headers, header_line_no=3, use_borders=False, styleHeaders=styleHeadersWithBorder,
                      styleDict=styleDict, widths=col_widths)

    # write merged and special header cells
    ws.ws.write(0, 0, Formula('TODAY()'), styleDate)
    ws.ws.write_merge(0, 0, 1, 7, 'THE LITTLE RIVER DRAINAGE DISTRICT', style=styleHeaders)
    ws.ws.write_merge(1, 1, 1, 7, 'MAINTENANCE ASSESSMENT LIST', style=styleHeaders)
    ws.ws.write_merge(0, 0, 9, 11, '{} {}'.format(year, ' '.join(county.upper().split()[:-1])), style=styleHeaders)
    ws.ws.write_merge(1, 1, 9, 11, 'RATE    %.1f' %float(rate) + '%', style=styleHeaders)

    # form sql clause, make sure it is sorted by year at minimum
    sql = (None, None)
    if sort_by in(None, '', '#'):
        sort_by = DEFAULT_SORT

    # make sure it is sorted by Section-Township-Range at minimum
    sql2 = (None, 'ORDER BY {}'.format(', '.join(sort_by.split(';') if isinstance(sort_by, basestring) else sort_by)))
    sort_fields = sort_by.split(';') if isinstance(sort_by, basestring) else sort_by
    if sort_by:
        sql = (None, 'ORDER BY {}'.format(', '.join(sort_fields)))
    print sql


    # default value for DATE PAID
    default_date_paid = datetime.datetime(int(year), 12, 31)

    # reference Geodatabase and fields
    county_where = "{} = '{}'".format(COUNTY_GIS, county.upper())
    gdb = utils.Geodatabase()
    fields = [CODE_GIS, LANDOWNER_GIS, SEC_TWN_RNG_GIS, SEQUENCE_GIS, DESCRIPTION_GIS,
             PID_GIS, ACRES_GIS, BENEFIT_GIS, ASSESSMENT_GIS, EXEMPT_GIS, DATE_PAID_GIS]

    # field indices
    sec_ind = fields.index(SEC_TWN_RNG_GIS)
    acre_ind = fields.index(ACRES_GIS)
    benefit_ind = fields.index(BENEFIT_GIS)
    assessment_ind = fields.index(ASSESSMENT_GIS)
    exempt_ind = fields.index(EXEMPT_GIS)
    date_ind = fields.index(DATE_PAID_GIS)
    desc_ind = fields.index(DESCRIPTION_GIS)
    seq_ind = fields.index(SEQUENCE_GIS)
    admin_ind = headers.index(ADMIN_FEE)
    ben_col = ascii_uppercase[headers.index(BENEFIT)]
    assess_col = ascii_uppercase[headers.index(ASSESSMENT)]

    # alter initial where clause to include county
    hide_admin = " AND {} <> '{}'".format(DESCRIPTION_GIS, ADMINISTRATIVE_FEE)
    null_secs = " AND {} NOT LIKE '%99%'".format(SEC_TWN_RNG_GIS)
    where_clause = ' AND '.join(filter(None, [county_where, where_clause, no_flag]))

    # admin fees
    #
    # recalculate admin fees if necessary
    #
    if float(rate) != float(utils.getRate()):
        gdb.calculate_admin_fee(rate)

    # now add rows to spreadsheet
    all_pins = {}
    grand_tots = {ACRES: [], BENEFIT: [], ASSESSMENT: [], ADMIN_FEE: []}

    start_index_row = ws._currentRowIndex + 1

    with arcpy.da.SearchCursor(gdb.breakdown_table, fields + [PIN], where_clause=where_clause, sql_clause=sql) as rows:
        cnt = 0
        for r in rows:

            vals = list(r)[:len(fields)]
            vals[headers.index(ASSESSMENT)] = Formula(ASSESSMENT_FORMULA.format(b='%s%s' %(ben_col, ws._currentRowIndex+1), r=(float(rate) * 0.01)))
            vals.insert(admin_ind, Formula(ADMIN_FEE_FORMULA.format(a='%s%s' %(assess_col, ws._currentRowIndex+1))))

            ws.addRow(*vals)
            all_pins[r[-1]] = vals
            cnt += 1

    # add blank row with dashed style
    ws.addRow(styleDict=yearBreakDict)

    # now add totals
    totals = {h:Formula('SUM({col}{st}:{col}{en})'.format(col=ascii_uppercase[i],
            st=start_index_row, en=ws._currentRowIndex-1))
            for i,h in enumerate(headers) if i in range(acre_ind, admin_ind+1)}

    totals[PID] = 'TOTAL'
    totals['styleDict'] = sectionBreakDict
    ws.addRow(**totals)
    for k in [ACRES, BENEFIT, ASSESSMENT, ADMIN_FEE]:
        grand_tots[k].append(totals[k])

    # add another blank row
    ws._currentRowIndex += 1

##    # now add grand totals
##    totals = {k: Formula(' + '.join([f.text() for f in v])) for k,v in grand_tots.iteritems()}
##
##    totals[PID] = 'GRAND TOTAL'
##    totals['styleDict'] = sectionBreakDict
##    ws.addRow(**totals)


    # set print properties
    ws.ws.set_fit_width_to_pages(1)
    ws.ws.set_fit_height_to_pages(0)
    ws.ws.set_portrait(0)
    ws.ws.set_fit_num_pages(1)

    # set page headers
    ws.ws.set_header_str('&R Page &P of &N')
    ws.ws.set_footer_str('')

    # save it
    wb.save(out_excel)
    del wb

    # add title rows
    xl = CreateObject('Excel.application')
    wb = xl.Workbooks.Open(out_excel)
    ws = wb.ActiveSheet
    ws.PageSetup.PrintTitleRows = '$1:$4'
    try:
        # silence compatibility message going from xls to xlsx
        wb.DoNotPromptForConvert = True
        wb.CheckCompatibility = False
        xl.DisplayAlerts = False
    except:
        pass
    wb.Save()
    wb.SaveAs(out_excel)
    wb.Close()
    xl.Application.Quit()
    del xl, wb

    os.startfile(out_excel)
    return out_excel
def process(PA):
	global current_row, DATE
	# ouvrir le fichier excel et faire les initialisations de coutume
	xl = CreateObject("Excel.application")
	xl.Visible = False
	xl.DisplayAlerts = False
	PA_wb = xl.Workbooks.Open(PA)
	DEMANDE_wb = xl.Workbooks.Open(__DEMANDE_FILE__)
	POINTAGE_sh = PA_wb.Sheets("pointage-etude")
	CREATION_sh = DEMANDE_wb.WorkSheets.Item(1)

	all_rows = []
	demandeurs = ('INEO/', 'CIRCET/', 'CONSTRUCTEL/')
	try:
		imb_a_creer_ou_supp = POINTAGE_sh.Range("P5:P1000").SpecialCells(2)
	except:
		imb_a_creer_ou_supp = ()
	try:
		imb_a_modifier = POINTAGE_sh.Range("T5:T1000").SpecialCells(2)
	except:
		imb_a_modifier = ()

	for i, cell in list(enumerate(imb_a_creer_ou_supp)) + list(enumerate(imb_a_modifier)):
		current_row = cell.EntireRow
		if cell.Value() == "immeuble à créer" or cell.Value() == "immeuble à supprimer" or cell_value(20):
			IMB = cell_value(1)
			n_PA = cell_value(3)
			DATE = DATE
			NRO = cell_value(4)
			RIVOLI = cell_value(5)
			TYPE_LIB = cell_value(6)
			if cell_value(7) != '':
				cell_value_7 = int(cell_value(7))
			else:
				cell_value_7 = cell_value(7)
			N_VOIE = cell_value_7
			COMP_VOIE = cell_value(8)
			BATIMENT = cell_value(9)
			ADR_A_NORM = str(cell_value_7) + ' ' + str(cell_value(8)) + ' ' + str(cell_value(6))
			ADR_A_NORM = ADR_A_NORM.lstrip()
			CoordX = cell_value(17)
			CoordY = cell_value(18)
			commentaire = cell_value(20)
			if cell.Value() == "immeuble à supprimer":
				nb_el = ''
				TYPE_SITE = cell_value(11)
				NbLogementsR = ''
				NbLogementsP = ''
				ACTION = "SUPPRIMER"
			else:
				nb_el = int(cell_value(13)) + int(cell_value(14))
				TYPE_SITE = ['maison' if nb_el < 4 else 'immeuble'][0]
				NbLogementsR = int(cell_value(13))
				NbLogementsP = int(cell_value(14))
				if cell.Value() == "immeuble à créer":
					ACTION = "CREER"
				elif cell_value(20):
					ACTION = "MODIFIER"
			msg = "Quel est le demandeur pour IMB: " + IMB + "? (" + str(i+1) + "/" + str(len(list(imb_a_creer_ou_supp))) + ")"
			demandeur = buttonbox(msg, choices=demandeurs)
			all_rows.append({
					'IMB': IMB,
					'n_PA': n_PA,
					'ACTION': ACTION,
					'DATE': DATE,
					'NRO': NRO,
					'RIVOLI': RIVOLI,
					'TYPE_LIB': TYPE_LIB,
					'N_VOIE': N_VOIE,
					'COMP_VOIE': COMP_VOIE,
					'BATIMENT': BATIMENT,
					'nb_el': nb_el,
					'TYPE_SITE': TYPE_SITE,
					'ADR_A_NORM': ADR_A_NORM,
					'NbLogementsR': NbLogementsR,
					'NbLogementsP': NbLogementsP,
					'CoordX': CoordX,
					'CoordY': CoordY,
					'DEMANDEUR': demandeur
				})
			
	pp(all_rows)
	first_row = 2

	for row in all_rows:
		CREATION_sh.Range('B' + str(first_row)).Value[()] = str(row['IMB'])
		CREATION_sh.Range('A' + str(first_row)).Value[()] = str(row['n_PA'])
		CREATION_sh.Range('C' + str(first_row)).Value[()] = str(row['ACTION'])
		CREATION_sh.Range('E' + str(first_row)).Value[()] = str(row['DEMANDEUR'])
		CREATION_sh.Range('F' + str(first_row)).Value[()] = str(row['DATE'])
		CREATION_sh.Range('H' + str(first_row)).Value[()] = str(row['NRO'])
		CREATION_sh.Range('I' + str(first_row)).Value[()] = str(row['RIVOLI'])
		CREATION_sh.Range('J' + str(first_row)).Value[()] = str(row['TYPE_LIB'])
		CREATION_sh.Range('K' + str(first_row)).Value[()] = str(row['N_VOIE'])
		CREATION_sh.Range('L' + str(first_row)).Value[()] = str(row['COMP_VOIE'])
		CREATION_sh.Range('P' + str(first_row)).Value[()] = str(row['TYPE_SITE'])
		CREATION_sh.Range('Q' + str(first_row)).Value[()] = str(row['ADR_A_NORM'])
		CREATION_sh.Range('S' + str(first_row)).Value[()] = str(row['BATIMENT'])
		CREATION_sh.Range('U' + str(first_row)).Value[()] = str(row['NbLogementsR'])
		CREATION_sh.Range('V' + str(first_row)).Value[()] = str(row['NbLogementsP'])
		CREATION_sh.Range('W' + str(first_row)).Value[()] = str(row['CoordX'])
		CREATION_sh.Range('X' + str(first_row)).Value[()] = str(row['CoordY'])
		first_row = first_row + 1

	DEMANDE_wb.Save()
	# Quitter excel et passer à la prochaine fiche PA
	xl.Quit()
Ejemplo n.º 7
0
def process(PA):
	global ActiveWindow, Shapes, Word, TRs_all, xl, Visio
	global RESULTS
	# Bien gérer les erreurs
	try:

		# ouvrir le fichier excel et faire les initialisations de coutume
		xl = CreateObject("Excel.application")
		xl.Visible = False
		xl.DisplayAlerts = False
		PA_wb = xl.Workbooks.Open(PA)
		PA_wb.Sheets("synoptique-bilan µmodules").Select()

		# dans la sheet visée, détecter tout les objets OLE (qui seront 
		# normalement tous des déssins visio)
		OLEObjects = PA_wb.Sheets("synoptique-bilan µmodules").OLEObjects()

		# pour chaque déssin ...
		for OLEObject in OLEObjects:
			# l'ouvrir dans Visio
			OLEObject.Verb(2)
			# prendre la main sur la fenêtre visio ouverte
			Visio = GetActiveObject("Visio.Application")
			# Visio.Visible = False
			Visio.DisplayAlerts = False
			ActiveWindow =  Visio.ActiveWindow
			Page = ActiveWindow.Page
			Shapes = Page.Shapes
			# Ceci est pour les déssins plutôt compliqués, après chaque sélection des PB, le script
			# les affichera et demandra de confirmer si c'est bon ou non
			msg = "Voulez confirmer le nombre de PBs après chaque sélection?\n" \
						+ "(si c'est plan assez complexe mieux vaut répondre par oui)"
			yn = ynbox(msg)
			# allons-y!
			# On extrait d'abord les infos d'entête
			for shape in Shapes:
				text = shape.Text
				if text.startswith('NRO'):
					bloc_NRO = text
				elif text.startswith('PT'):
					# certaines shapes buguent je ne sais pas pourquoi, elles n'ont pas d'utilité
					try:
						blocs_PT.append(shape)
					except:
						blocs_PT = [shape]
				elif text.startswith('PA'):
					bloc_PA = text
					# On extrait la position x du PA pour prendre toutes les TR qui sont à droite
					PA_posx = get_XY(shape)[0]
			# Les deux blocs FI et PA tout deux commencent par PT, celui de PA est plus à gauche
			# on les différenciera par leur position
			if get_XY(blocs_PT[0])[0] < get_XY(blocs_PT[1])[0]:
				FI_bloc = blocs_PT[0]
				PA_bloc = blocs_PT[1]
			else:
				FI_bloc = blocs_PT[1]
				PA_bloc = blocs_PT[0]

			PA_PT = PA_bloc.Text.rsplit('\n')[0].replace('PT: ', '')
			PMZ_PT = FI_bloc.Text.rsplit('\n')[0].replace('PT: ', '')
			CH = PA_bloc.Text.rsplit('\n')[2].replace('CH: ', '')
			NRO = extract('NRO/PMZ/PA', bloc_NRO, 'NRO')
			ADRESSE1 = ' '.join(PA_bloc.Text.rsplit('\n')[3:5])\
									.replace('Adresse: ', '')
			ADRESSE2 = ADRESSE1.rsplit('-')[0]

			# Les TRs du déssin courant
			TRs = {}

			# là ça va barder!
			for shape in Shapes:
				if shape.Text.startswith('TR'):
					# Seulement ceux qui sont plus à droite de PA
					if get_XY(shape)[0] > PA_posx:
						# Le text est un peu bizarre, il est vraiment en texte mais paraît être un
						# bytes! On doit le nettoyer
						TR_TXT = str(shape.Text.encode()).replace("b'", '').replace("'", '')
						# Extraire ne TR
						TR = TR_TXT.rsplit('FO')[0] \
							.replace('\\n', ' ') + 'FO'
						# Si ce n'est pas un TR valide, passer
						if not re.match(r'TR\s+\d{2}\s+\d{4}\s+\d+FO', TR):
							continue
						# Si ce TR n'a pas encore été enregistré dans la liste TRs, l'enregistrer
						## Initialiser la longueur à 0
						## Mettre le shape courant dans la liste "shapes"
						## Initialiser une liste vide pour les CH ou IMB ou AP qui vont avec
						## Initialiser une liste vide pour les PTs qui vont avec (pour le nommage)
						## Et initialiser une variable "0" pour le PT qui est maximum (pour le nommage)
						if TR not in TRs:
							TRs[TR] = {
								'LONG': 0,
								'SHAPES': [shape.ID],
								'CH/IMB/AP': [],
								'PTs': [],
								'maxPT': 0
								}
						# Sinon si le TR est déjà dans TRs, ajouter le shape courant à "SHAPES"
						else:
							TRs[TR]['SHAPES'].append(shape.ID)
						# Essayer d'extraire la longueur du TR courant
						try:
							TR_LONG = int(TR_TXT.rsplit('\\xe2\\x80\\x93 ')[1] \
															.replace('m', ''))
						except:
							TR_LONG = 0
						# Et incrémenter la longueur du TR global corréspondant à cette ligne
						TRs[TR]['LONG'] = TRs[TR]['LONG'] + TR_LONG
			
			# Message pour que l'utilisateur sélectionner les blocs PB pour chaque TR
			title1 = 'Sélectionnez les bloc'
			title2 = 'Confirmez la sélection'
			# Pour chaque TR dans TRs
			for TR in TRs:
				# Python n'a pas de "REDO", on hack avec un "WHILE"
				while True:
					# Sélectionner toutes les shapes de cette ligne de TR
					SelectShapes(TRs[TR]['SHAPES'])
					# Demander lui de sélectionner, quand il confirme continuer...
					if ccbox(TR, title1):
						# Une liste vide pour tout les PB dans ce TR
						CH_OR_IMB_OR_AP_all = []
						# Une liste vide pour tout les PTs dans ce TR
						PTs = []
						# Une liste vide pour tout les PBs dans ce TR
						PBs = []
						# Un message au cas où l'utilisateur aurait choisit une confirmation
						msg = "Pour " + TR + "\nVous avez sélectionné:\n"
						# Le nombre de PBs sélectionnées (pour affichage dans la confirmation)
						selected_PBs = 0
						# Au cas où il n'y aurait pas de PB valide, pas la peine de mettre une 
						# fenêtre de confirmation, supposer tout de même qu'il y'en a ...
						yn_yes = True
						# Pour chaque fenêtre sélectionnée
						for selected in ActiveWindow.Selection:
							# (certains shapes n'aiment pas qu'on appelle leur .Text!!!!)
							try:
								TEXT = str(selected.Text)
								# Prendre seulement les blocs qui commencent par "PB"
								if not TEXT.startswith('PB'):
									continue
								# Incrémenter le nombre de PBs trouvés par +1
								selected_PBs = selected_PBs + 1
								# Enregister le PB, PT, l'adresse, et le text qui peut être un:
								## Ch.XXXXX
								## IMB/XXXXX/XXXX
								## AP XXXX
								PB = TEXT.rsplit('\n')[0].rstrip()
								PT = TEXT.rsplit('\n')[2]
								ADR = TEXT.rsplit('\n')[3]
								CH_OR_IMB_OR_AP = TEXT.rsplit('\n')[4]
								# Si l'un de ces lignes ne se trouve pas à la bonne place
								if (not CH_OR_IMB_OR_AP.startswith('AP ')
									and not CH_OR_IMB_OR_AP.startswith('Ch.')
									and not CH_OR_IMB_OR_AP.startswith('IMB')):
									# Resélectionner les sélectionnés (pfff sert à rien ça!)
									SelectShapes([selected.ID])
									# Et dire qu'il y a un truc qui cloche!
									msgbox("T'as surement encore fais une connerie dans tes"
												+ "déssins, regarde ce bloc dans la ligne PT!\n"
												+ "Je devrais trouver Ch.XXXX ou AP XXXX"
												+ "ou IMB/XXXX/XXX mais j'ai trouvé\n"
												+ CH_OR_IMB_OR_AP + "\n"
												+ "Quand t'auras détécté l'erreur click sur OK")
									# Continuer ou quitter!
									cont = boolbox("Dois-je continuer ou fermer?",
																"Que faire?",
																['Continuer?', 'Fermer?'])
									if not cont:
										exit(0)
									else:
										pass
								else:
									# Sinon, préparer le message de confirmation
									msg = msg + "- " + CH_OR_IMB_OR_AP + "\n"
									# Et ajouter le CH/IMB/AP à la liste
									CH_OR_IMB_OR_AP_all.append([ADR, CH_OR_IMB_OR_AP])
									# Ajouter le PT de ce bloc à la liste PTs
									PTs.append(int(PT.replace('PT', '')))
									# Ajouter le PB de ce bloc à la liste PBs
									PBs.append(PB)
							except:
								# Si quelque chose cloche, trouver une porte de sortie!!:
								SelectShapes([selected.ID])
								msgbox("T'as surement encore fais une connerie dans tes"
										+ "déssins, regarde ce bloc dans la ligne PT!\n"
										+ "Quand t'auras détécté l'erreur click sur OK")
								cont = boolbox("Dois-je continuer ou fermer?",
												"Que faire?",
												['Continuer?', 'Fermer?'])
								# Vraiment je ne sais pas à quoi sert ce que j'ai écrit dans les 
								# 8 prochaines lignes!!!!
								if not cont:
									exit(0)
								else:
									msg = msg + "(RIEN!)"
									CH_OR_IMB_OR_AP_all = []
									PTs = []
									PBs = []
									yn_yes = False
						# S'il n'a rien sélectionné
						if not selected_PBs:
							cont = boolbox("Tu n'as rien sélectionné! Tu confirmes"
											+ " que ce n'est pas une connerie?",
											"Sélection vide!",
											['Oui vas-y', 'Comme d\'hab! Une connerie'])
							# Soit on quitte!
							if cont:
								break
							# Soit c'est délibéré et on continue
							else:
								continue

						# Si l'utilisateur avait demandé une confirmation, la montrer
						# (S'il y a eu une erreur, yn_yes est False, et pas la peine de montrer la
						# confirmation)
						if yn and yn_yes:
							msg = msg + "(" + str(selected_PBs) + " sélectionnés)"
							conf = boolbox(msg, title2, ['Confirmer?', 'Refaire?'])
							if conf:
								# Si c'est confirmé, stocher ces données pour le shape
								TRs[TR]['CH/IMB/AP'] = CH_OR_IMB_OR_AP_all
								TRs[TR]['PTs'] = PTs
								TRs[TR]['PBs'] = PBs
								break
							else:
								pass
						# Sinon s'il n'avait pas demandé de confirmation, stocker ces données
						# directement pour le shape
						else:
							TRs[TR]['CH/IMB/AP'] = CH_OR_IMB_OR_AP_all
							TRs[TR]['PTs'] = PTs
							TRs[TR]['PBs'] = PBs
							break
					# En cas d'erreur sortir :-(
					else:
						exit(0)
				# Il doit y avoir au moins un PT pour créer un fichier doc et xls avec le max des TRs
				if len(TRs[TR]['PTs']):
					TRs[TR]['DE_filename'] = 'DE_PT%06d' % max(TRs[TR]['PTs']) + '.doc'
					TRs[TR]['AR_filename'] = 'AR_PT%06d' % max(TRs[TR]['PTs']) + '.xls'
				# Les fichiers avec ce nom ne devront jamais voir le jour!
				else:
					TRs[TR]['DE_filename'] = 'je_ne_suis_pas_cense_exister.doc'
					TRs[TR]['AR_filename'] = 'je_ne_suis_pas_cense_exister.xls'
					# Un cas très particulier m'a forcé à ajourer la ligne suivant!
					TRs[TR]['PBs'] = []

			# Si je n'ai trouvé aucun TR, montrer un message
			if TRs == {}:
				msgbox("il n'y pas de TR valide sur ce déssin")
			# Ajouter ces TRs à TR_all
			TRs_all.append(TRs)
			# Cacher le déssin Visio
			Visio.Visible = False

		# Demander qui est le client
		xl.Visible = True
		msg = "Quel est le client pour cette fiche PA?"
		choices = ["Circet","Engie"]
		client = buttonbox(msg, choices=choices)

		# Résultat globaux pour cette fiche PA
		RESULTS[PA] = {
			'PA_REF':		bloc_PA,
			'client':		client,
			'TRs_all': 		TRs_all,
			'NRO':			NRO,
			'PMZ_PT':		PMZ_PT,
			'PA_PT':		PA_PT,
			'CH':			CH,
			'ADRESSE1':		ADRESSE1,
			'ADRESSE2':		ADRESSE2,
			'DATE':			DATE
		}

		# Quitter excel et passer à la prochaine fiche PA
		xl.Quit()
		return

	except:
		# En cas d'erreur innatendue!
		print(format_exc())
		codebox("t'as encore fais une connerie! Fais moi un screen de malheur!",
				"Erreur",
				format_exc())
		going()