IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Charger et modifier un fichier *.bdf (Patran)


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut Charger et modifier un fichier *.bdf (Patran)
    Bonjour à vous,

    Je souhaite charger depuis matlab un fichier *.bdf qui est généré depuis le code aux EF Patran (Pré Pro utilisable pour Nastran).

    J'ai mis le fichier *.bdf en PJ pour donner une idée de ce à quoi ça ressemble.

    Je voudrai pourvoir le charger automatiquement et le modifier à un endroit précis et le sauvegarder pour le réutiliser.

    il y a donc plusieurs choses:
    1/ charger le fichier sous matlab
    2/ cibler la partie qui doit être modifier
    3/ sauvegarder le fichier modifié pour le renvoyer vers le logiciel EF Patran.

    Je bloque sur le point 2.

    je suis preneur d info si vous avez des réponses a mon problème,

    pour le moment, voici le code :

    par exemple, je cherche a modifier les valeurs de bush_haut qui sont le nombres situés à la ligne inférieure.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    function appellepatran()
    clc
    close all
    clear all
     
    charcode= fopen('caissontreillis.bdf','r+'); % ouvre le fichier texte sous matlab
     
    codepatran=textscan(charcode,'%s\t');     % lecture du code
    motatrouver='bush_haut' ;                 % recherche mot cible
    indice = find(ismember(codepatran{1}, motatrouver)==1)  %   ?
    isempty(indice)                                         %   ?
     
    fclose(charcode);                            % ferme le fichier texte par matlab
     
    end
    merci par avance

    PS le fichier joint est en *.txt pour le téléchargement, considère que c est un *.bdf, merci
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    une méthode pourrait être de lire le fichier ligne par ligne, de chercher si bush_haut est présent, si oui tu modifies la lignes suivantes, si non, tu copies la ligne sans modification dans le nouveau fichier.

    Fonctions qui peuvent être utiles :
    FGETS
    STRFIND
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    j ai bien avance sur mon code et je bloque maintenant sur un dernier point, renvoyer le fichier modifié sous matlab vers le fichier source pour l'utiliser apres.

    j ai essaye la fonction fprintf sans succès pour le moment.. est ce la bonne fonction? ou alors je ne l ai pas bien comprise peut être..

    je vous donne le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    function appellepatran()
    clc
    close all
    clear all
     
    %---------------------------------------   Lecture et chargement du fichier source
    charcode= fopen('caissontreillis.bdf','r+') ;   % ouvre le fichier texte sous matlab
    codepatran=textscan(charcode,'%s\t');           % lecture du code
    codepatran{1} ;                                 % affichage du fichier downloaded pour verification
    %---------------------------------------
     
     
    %---------------------------------------   Cibler la valeur à modifier
    motatrouver1 = 'bush_droite';                               % recherche mot cible
    indice1 = find(ismember(codepatran{1}, motatrouver1)==1) ;  % trouver indice 1   
    %---------------------------------------
     
     
    %---------------------------------------   Modifier la valeur
    posikx = 4 + indice1 ;                  % indice pour la modification de la raideur kx 
    valeurkx= {'3.1+01'} ;                  % valeur a modifier
    codepatran{1}(posikx,1) = valeurkx ;    % modification
    codepatran{1}                           % affichage du fichier downloaded pour verification
    %---------------------------------------
     
    whos
    type caissontreillis.bdf
    fprintf(charcode, '%s', codepatran{1,1});
     
    %---------------------------------------   NON   Enregistrer les modifications
    fprintf(charcode,'%s');        % enregistre le fichier modifié
    fclose(charcode);               % ferme le fichier texte par matlab
     
    end
    Merci de votre aide

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans un premier temps,
    • La ligne fprintf(charcode, '%s', codepatran{1,1}); est incorrecte: FPRINTF n'accepte pas les tableaux de cellules en entrée. Cette discussion pourra t'aider.
    • fprintf(charcode,'%s'); ne sert à rien.

    Ensuite, au niveau logique de ton programme, tu récupères chaque chaîne de caractères séparée par des tabulations, mais tu perds l'information du saut de ligne.
    Pour finir, tes deux lignes avec FPRINTF écrivent à la suite du fichier, si tu choisis l'option de tout ré-écrire (ce qui semble être le cas), il te faut revenir au début du fichier (avec FREWIND ou FSEEK)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    merci de votre aide tout d'abord.

    ensuite j ai l impression que je me trompe grossièrement dans la manière de gérer mon problème.

    est ce que les fonctions "fopen" et "textscan" sont les plus appropriées à mon problème?

    textscan me fournit une colonne de cellule dans laquelle je peux effectivement facilement travailler mais la remarque de Winjerome est juste, je perds l'information des sauts de ligne... est ce que je me trompe ou il est possible de tout bien remettre en forme apres?

    si "textscan" n est pas le bon opérateur, comment procéder? en utilisant "fgets" mais je ne comprends pas ce qu il fait...

    je m excuse par avance mais c est la 1er fois que je traite des fichiers textes de cette manière et j avoue que l utilisation de ces opérateurs est une nouveauté pour moi. faut bien commencer un jour

    merci encore de votre patience!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    bonjour a vous,

    je viens de trouver un exemple de solution relativement similaire à mon problème proposé par DUT qui répond bien a mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    function appellepatran()
    clc
    close all
    clear all
     
    % Lecture du fichier
    fid = fopen('caissontreillis.bdf','r');    % ouverture du fichier et chargement
        X = fread(fid,[1,inf]);
    fclose(fid);
     
    % Paramètres à modifier                    % parametre a recherche et valeur de remplacement
    str = 'bush_droite';                       % nom de l element à modifier
    [~, lettre] = size(str)  ;                % longueur du mot repere pour incrementer la distance aux valeurs mecaniques
    val = '1.+8';                              % nouvelle valeur
     
    % Modification des paramètres
    idx = strfind(X,str) + 10 + lettre ;       % recherche le mot str dans X et selectionne le mot a a position + 10 (debut de la valeur kx)
    X(idx:idx+11) = 23 ;                       %  ??   
    X(idx:idx+numel(val)-1) = val ;            % remplacement de la valeur 
     
    % Réécriture du fichier
    fid = fopen('caissontreillis2.bdf','w') ;  % reecriture du fichier 
        fwrite(fid,X) ;
    fclose(fid) ;
     
    type caissontreillis2.bdf                  % verification dans command window
     
    end
    seul hic, dans la partie modification des paramètres, en fonction des valeurs a remplacer, les valeurs s'écrivent les unes sur les autres, par exemple:

    imaginons que les données sources soient de la forme :

    $ Elements and Element Properties for region : bush_droite
    PBUSH 1 K 210000 2.+10 1.+10 2.1+10 2 2

    et que je veuille :
    $ Elements and Element Properties for region : bush_droite
    PBUSH 1 K 2.+8 2.+1 215. 210000 2 2

    comment programmer le remplacement automatique des valeur en rouge par celles en vertes quelque soit la taille de la valeur source et de la valeur de remplacement qui peuvent être différentes?

    je vous remercie!
    max

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Voici un code qui permet de modifier la ligne qui suit celle qui se termine par un mot en particulier (ici "bush_haut") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    X = textread('caissontreillis.bdf','%s','delimiter','\n');
     
    rX = cellfun(@fliplr, X, 'uniformoutput',0);
     
    str = 'bush_haut';
     
    idx = find(strncmp(rX,fliplr(str),9))+1;
     
    % Modification de la ligne
    % X{idx} =
     
    fid = fopen('caissontreillis-2.bdf','wt');
        fprintf(fid,'%s\n',X{:});
    fclose(fid)
     
    edit caissontreillis-2.bdf
    Mais pourquoi cherches-tu à modifier les valeurs sous MATLAB ?
    N'est-il pas plus simple de le faire sous Patran ?
    Quel est le problème exactement ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    merci pour le code, c est déjà plus propre.

    je cherche à itérer sous nastran. patran créer le *.bdf lu par patran, mais ce dernier ne peut pas lire le fichier modifié sous matlab (prog réaliser pour itérer) donc je renvoie le fichier sous natran. comme il y a bcp de tests, tout rentrer a la main serait une gageure.

    Je teste et je cherche comment modifier ma ligne enntiere et je vous donne les remarques.

    Merci

    Max

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 163
    Points
    53 163
    Par défaut
    Citation Envoyé par mfontan Voir le message
    comme il y a bcp de tests, tout rentrer a la main serait une gageure.
    Sais-tu que Patran possède son propre langage de programmation appelé PCL ?
    Jette un oeil dans la documentation ou encore au fichier .db.jou qui contient toutes les commandes PCL exécutées lors de la session Patran.

    Il est tout à fait possible d'automatiser une boucle PCL-Patran-Bdf-Nastran avec par exemple un fichier batch
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 57
    Points
    57
    Par défaut
    Je ne savais pas, merci pour l'info, je vais voir ça.

    Ayant déjà développer un code maison d'optimisation propre sous matlab, je ne cherche qu'à faire les interfaces logiciels en fait.

    à tout hasard, est ce que vous connaissez une doc relative à la gestion des fichiers txt, avec des infos sur les opérateurs, les erreurs à éviter etc? je dévouvre un peu tout ça et la majorité des opérateurs me sont largement inconnus en fait.

    Pb résolu pour le moment, merci à vous tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2016, 18h42
  2. Charger et modifier un fichier doc
    Par toure32 dans le forum Documents
    Réponses: 1
    Dernier message: 31/12/2007, 12h58
  3. [LG]modifier un fichier
    Par fofovi72 dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2004, 21h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo