Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Tue 05 July 2016 14:25

Ricola62
Participant assidu
Date d'inscription: 24 Apr 2012
Messages: 166

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: 166

Re: Iterer un script python dans un répertoire

tomsigeomatique a écrit:

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

nitram
Participant assidu
Lieu: Brest
Date d'inscription: 19 May 2009
Messages: 989
Site web

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

 

Pied de page des forums

Powered by FluxBB