#1 Tue 05 July 2016 14:25
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Iterer un script python dans un répertoire
Bonjour,
voici le code
Code:
#!/usr/bin/env python # -*- coding: UTF-8 -*- """ Name: ImportCADandMerge.py Description: Imports and merges polylines from one workspace into a single feature class Author: NP http://desktop.arcgis.com/fr/desktop/latest/manage-data/cad/using-python-to-load-cad-data.htm """ # Import system modules import arcpy #------------------------------------------------------------------------------- # MAIN #------------------------------------------------------------------------------- def main(): """ Main du module : importe un calque de plusiuers DWG dans une classe d'entites d'une FGDB (elle doit exister) """ # Ecrase la classe d'entites cible si elle existe arcpy.env.overwriteOutput = True # Espace de travail ou sont les fichiers DWG arcpy.env.workspace = r'G:\Expert\03_DGST\Poubelle\DAOP1' # Create a value table that will hold the input feature classes for Merge vtab = arcpy.ValueTable() # WhereClause : calque DWG que l'on veut importer whereclause = "\"Layer\" = 'R-EPIC-CANA'" # Choix des champs que l'on veux garder : Layer, Color, DocName et DocType champsaconsever = ["Layer", "Color", "DocName"] #compteur des fichiers DWG nbfiledwg = 0 # Step through each dataset in the list for fdataset in arcpy.ListDatasets('*.dwg'): layername = u'{0}'.format(fdataset) layername = layername.replace(u'É', 'E') layername = layername.replace(' +', 'plus') layername = layername.replace(' -', 'moins') layername = layername.replace(' ', '_') print u'_{0}_'.format(layername) # Get the fields from the input fields = arcpy.ListFields(fdataset) # Create a fieldinfo object fieldinfo = arcpy.FieldInfo() # Iterate through the fields and set them to fieldinfo for field in fields: if field.name in champsaconsever: fieldinfo.addField(field.name, field.name, "VISIBLE", "") else: fieldinfo.addField(field.name, field.name, "HIDDEN", "") # Select only the Polyine features on the drawing layer (whereclause) arcpy.MakeFeatureLayer_management(u'{0}\Polyline'.format(fdataset) , layername , whereclause , '' , fieldinfo) # Creation ajout de la couches dans la liste des couches a fusionner try: vtab.addRow(layername) nbfiledwg = nbfiledwg +1 except Exception, errordesc: print arcpy.GetMessages() errmesg = 'PYTHON ERRORS: {0}'.format(errordesc) print errmesg print "Echec de l'ajout de la couche {0} ({1})".format(layername, fdataset) # Merge the CAD features into one feature class mergefc = r'G:\Expert\03_DGST\Poubelle\DAO.gdb\EPIC4' try: arcpy.Merge_management(vtab, mergefc) except Exception, errordesc: print arcpy.GetMessages() errmesg = 'PYTHON ERRORS: {0}'.format(errordesc) print errmesg # Fin print u'{0} fichiers DWG importes et fusionnes'.format(nbfiledwg) return True if __name__ == '__main__': STATUS = main() #===============================================================================
le répertoire contient 120 dwg et suite à beaucoup de manipulation : impossible de de traiter les 120 dwg en même temps.
donc j'ai lancer le script sur trois répertoire différents de environ 40 dwg et ça a fonctionné.
Afin d'automatisé cela je me posé la question, est il possible d'inclure dans le script trois traitements d'une serie de fichiers à la suite?
afin d'éviter de créer des répertoires.
Merci d'avance
Hors ligne
#2 Thu 07 July 2016 01:00
- tomsigeomatique
- Participant occasionnel
- Date d'inscription: 9 Jul 2014
- Messages: 10
Re: Iterer un script python dans un répertoire
Bonjour,
si j'ai bien compris:
- vous ne pouvez pas lancer le script sur un dossier de 120 dwg
- vous lancez 3 fois donc le script sur un dossier de 40 dwg
Et si vous créez un nouveau script qui parcourt une liste/tableau de dossier et qui exécute votre premier script, est ce que cela fonctionne?
Hors ligne
#3 Thu 07 July 2016 09:01
- Ricola62
- Participant assidu
- Date d'inscription: 24 Apr 2012
- Messages: 167
Re: Iterer un script python dans un répertoire
Bonjour,
si j'ai bien compris:
- vous ne pouvez pas lancer le script sur un dossier de 120 dwg
- vous lancez 3 fois donc le script sur un dossier de 40 dwg
Et si vous créez un nouveau script qui parcourt une liste/tableau de dossier et qui exécute votre premier script, est ce que cela fonctionne?
Bonjour,
- Oui
- Je lance le script trois fois,sur chaques dossiers de 40 dwg
je voudrais pouvoir insérer dans mon script la possibilité d'effectuer le boulot en trois fois donc créer trois listes de 40 dwg environ
Hors ligne
#4 Thu 07 July 2016 11:37
Re: Iterer un script python dans un répertoire
Bonjour,
Je ne sais pas si c'est la solution, mais vous pouvez intégrer votre script dans un outil de script.
-> http://desktop.arcgis.com/fr/arcmap/10. … t-tool.htm
Vous renseignez le répertoire en entrée comme variable, ensuite vous pourrez le lancer en batch.
-> http://desktop.arcgis.com/fr/arcmap/10. … essing.htm
à voir...
Martin
Hors ligne
#5 Fri 08 July 2016 00:45
- tomsigeomatique
- Participant occasionnel
- Date d'inscription: 9 Jul 2014
- Messages: 10
Re: Iterer un script python dans un répertoire
Bonjour,
d'accord. Le plus convivial est d'intégrer en effet le script dans un outil/script ArcGIS, avec la possibilité de traiter en batch (par lot).
Mais si vous souhaitez travailler qu'avec du code.
Deux solutions possibles:
-créer un nouveau script contenant:
Code:
def importCADtoGDB(repertoire): **renommer/copie de la fonction main avec utilisation du paramètre repertoire** mesRep=[r'G:\Expert\03_DGST\Poubelle\DAOP2',r'G:\Expert\03_DGST\Poubelle\DAOP1',r'G:\Expert\03_DGST\Poubelle\DAOP3'] for ele in mesRep: importCADtoGDB(ele)
Ou regrouper les 3 répertoires dans un répertoire principal et créer un autre nouveau script ou outil:
Code:
import os import arcpy repertoirePrincipale=r"G:\Expert\03_DGST\Poubelle" #ou #repertoirePrincipale=arcpy.GetParameterAsText(0) def importCADtoGDB(repertoire): **renommer/copie de la fonction main avec utilisation du paramètre repertoire** for dirName, subdirList, fileList in os.walk(repertoirePrincipale): if dirName != repertoirePrincipale: importCADtoGDB(dirName)
attention walk parcours de manière itérative tous les dossiers et leurs sous-dossiers
Dernière modification par tomsigeomatique (Fri 08 July 2016 00:56)
Hors ligne