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 :

Ordonner des points


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Ordonner des points
    Bonjour,

    Voila je debute avec un logiciel d'elements finis ANSYS. Je fais une analyse modale et je recupere la deformee de ma piece dans un fichier txt.

    Le seul probleme c'est que ca se presente sous la forme :

    NODE UX UY UZ
    1 0.58274E-02 -0.90524E-02 -3.6670
    2 -0.58264E-02 -0.90524E-02 3.6670
    3 0.55683E-02 -0.90594E-02 -3.4859
    4 0.52970E-02 -0.90735E-02 -3.3045
    5 0.50194E-02 -0.90879E-02 -3.1229

    etc

    Le probleme c'est que ANSYS liste les noeuds dans l'ordre qu'il veut et pas dans l'ordre que j'aimerai avoir c'est a dire pouvoir tracer en 3D la deformee de ma piece sous matlab.

    Merci.

  2. #2
    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 166
    Points
    53 166
    Par défaut
    Je ne comprends pas la question.

    Tu dois aussi exporter la table de connectivité associée à ton maillage pour pouvoir afficher le résultat...

    Si tu veux (et si il n'y a pas de problème de confidentialité), tu peux attacher le fichier texte (dans une archive zip ou rar) à un de tes messages pour que l'on puisse faire des tests
    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)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Merci de ta réponse Dut par contre je sais pas ce que c'est la table de connectivité dont tu me parles.

    Je mets le fichier en pièce jointe (c'est pas confidentiel je fais toujours des tests avant)

    C'est censé représenté une plaque rectangulaire qui est courbé comme un arc.

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    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 166
    Points
    53 166
    Par défaut
    Excuse moi, je n'avais pas vu que le fichier contenait les champs de déformation en chaque noeud.

    Donc pour le tracer, il te faut exporter les coordonnées des noeuds de ton maillage initial et la table de connectivitée associée. C'est à dire, le tableau contenant pour chaque ligne le numéro des noeuds format un élément.

    Par exemple, pour l'élement n se situant à la n-ième ligne de la table, si on lit ceci :

    5 204 28

    et si on sait que c'est un élément triangulaire, il suffit de connaitre les coordonnées des noeuds 5, 204 et 28 pour tracer l'élément (et donc les résultats associés)

    Voir par exemple le paragraphe Specifying Vertices and Faces de la documentation de la fonction PATCH

    Pouor tracer la déformée, il suffit d'additionner les résultats aux coordonnées des noeuds (avec généralement un facteur d'échelle). On peut même facilement superposer le maillage initiale au maillage déformé
    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)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Je me suis trompé dans le fichier joint je remets un .zip avec les points originaux et les points déformés. Par contre je ne vois pas ou trouver la table de connectivitée associé.
    Fichiers attachés Fichiers attachés

  6. #6
    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 166
    Points
    53 166
    Par défaut
    En fait, la table sert si tu veux visualiser un maillage. Si tu n'en as pas, tu ne visualiseras qu'un nuage de points (ordonnés dans ton cas)

    Bref... le code ci-dessous va sembler un peu magique mais il va falloir faire l'effort de le comprendre :

    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
    36
    37
    38
     
    % Lecture fichier ini
    fid = fopen('node_ini.txt');
    XYZ_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
     
    % Lecture fichier def
    fid = fopen('node_def.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
     
    % Suppression des toutes les lignes lues depuis le fichier def qui sont vides ou qui possedent des lettres
    idx = cellfun('isempty',data_def{1});
    data_def{1}(idx,:) = [];
    idx = strncmp(data_def{1},'NODE',4);
    data_def{1}(idx,:) = [];
    idx = strncmp(data_def{1},'*****',5);
    data_def{1}(idx,:) = [];
    idx = strncmp(data_def{1},'POST1',5);
    data_def{1}(idx,:) = [];                        
    idx = strncmp(data_def{1},'LOAD',4);
    data_def{1}(idx,:) = []; 
    idx = strncmp(data_def{1},'RFRQ=',5);
    data_def{1}(idx,:) = []; 
    idx = strncmp(data_def{1},'THE',3);
    data_def{1}(idx,:) = [];      
    idx = strncmp(data_def{1},'MAXIMUM',7);
    data_def{1}(idx,:) = [];   
    idx = strncmp(data_def{1},'VALUE',5);
    data_def{1}(idx,:) = [];   
     
    [x_def,y_def,z_def] = strread(char(data_def{1}).','%*d%f%f%f%*f');
     
    % Affichage
    figure
    plot3(XYZ_ini{1},XYZ_ini{2},XYZ_ini{3},'b+');
    hold on
    plot3(XYZ_ini{1}+x_def,XYZ_ini{2}+y_def,XYZ_ini{3}+z_def,'r+');
    et une version un peu plus optimisée :
    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
    % Lecture fichier ini
    fid = fopen('node_ini.txt');
    XYZ_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
     
    % Lecture fichier def
    fid = fopen('node_def.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
     
    % Suppression des toutes les lignes lues depuis le fichier def qui sont vides ou qui possedent des lettres
    idx = cellfun(@(x) isempty(x) || ~isstrprop(x(1),'digit'),data_def{1});
    data_def{1}(idx,:) = [];   
     
    [x_def,y_def,z_def] = strread(char(data_def{1}).','%*d%f%f%f%*f');
     
    % Affichage
    figure
    plot3(XYZ_ini{1},XYZ_ini{2},XYZ_ini{3},'b+');
    hold on
    plot3(XYZ_ini{1}+x_def,XYZ_ini{2}+y_def,XYZ_ini{3}+z_def,'r+');
    N'hésite pas à demander des éclaircissements...

    Peut être même que quelqu'un d'autre pourra proposer une solution plus économique
    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)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Salut Dut !

    Je te remercie grandement pour les 2 codes que tu viens de me fournir je vais essayer de comprendre un peu la méthode.

    Par contre si je peux abuser de ta bonté il y aurai un moyen de tracé le modèle déformé avec un surf plutot qu'un nuage de point et seulement un seul nuage de point ? (enlever l'epaisseur de la plaque)

    Encore merci !

  8. #8
    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 166
    Points
    53 166
    Par défaut
    ALors... il est un peu tard... j'espère ne pas trop dire de bêtises mais essaie ceci :

    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
    36
    fid = fopen('node_ini.txt');
    XYZ_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
     
    [xyz_ini,idx_ini] = sortrows([XYZ_ini{1},XYZ_ini{2},XYZ_ini{3}]);
     
    x_ini = xyz_ini(1:2:end,1);
    y_ini = xyz_ini(1:2:end,2);
    z_ini = xyz_ini(1:2:end,3);
     
    fid = fopen('node_def.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
     
    idx = cellfun(@(x) isempty(x) || ~isstrprop(x(1),'digit'),data_def{1});
    data_def{1}(idx,:) = [];   
     
    [x_def,y_def,z_def] = strread(char(data_def{1}).','%*d%f%f%f%*f');
     
    x_def = x_def(idx_ini);
    y_def = y_def(idx_ini);
    z_def = z_def(idx_ini);
     
    x_def = x_def(1:2:end);
    y_def = y_def(1:2:end);
    z_def = z_def(1:2:end);
     
    figure
     
    x = reshape(x_ini+x_def,41,[]);
    y = reshape(y_ini+y_def,41,[]);
    z = reshape(z_ini+z_def,41,[]);
     
    surf(x,y,z)
     
    axis vis3d
    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)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Salut !

    Je viens de voir et j'ai envie de dire merci et bravo j'ai encore du chemin a faire par contre je mets une capture d'écran il y a certains problemes pour quelques points.

    Derniere chose je trouve la pente de la déformée très raide pour avoir moins courbé c'est juste une histoire d'echelle à ajuster ?

    Merci bien !
    Images attachées Images attachées  

  10. #10
    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 166
    Points
    53 166
    Par défaut
    Voici un code peut être un peu plus lisible et qui résout le problème des quelques points mal alignés :
    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
    36
    37
    38
    39
    40
    % Lecture du fichier ini
    fid = fopen('node_ini.txt');
    data_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
     
    % Lecture du fichier def
    fid = fopen('node_def.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
     
    % Recuperation des donnees ini
    x_ini = data_ini{1};
    y_ini = data_ini{2};
    z_ini = data_ini{3};
     
    % Recuperation des donnees def
    idx = cellfun(@(x) isempty(x) || ~isstrprop(x(1),'digit'),data_def{1});
    data_def{1}(idx,:) = [];   
    data_def{1} = strcat(data_def{1},{' '});
    [x_def,y_def,z_def] = strread(char(data_def{1}).','%*d%f%f%f%*f');
     
    clear data_ini data_def idx fid
     
    % Classement des points ini
    [xyz_ini,idx_ini] = sortrows([x_ini y_ini z_ini]);
     
    % Classement des points def
    x_def = x_def(idx_ini);
    y_def = y_def(idx_ini);
    z_def = z_def(idx_ini);
     
    % Affichage
    figure('doublebuffer','on')
     
    x = reshape(xyz_ini(1:2:end,1)+x_def(1:2:end),41,[]);
    y = reshape(xyz_ini(1:2:end,2)+y_def(1:2:end),41,[]);
    z = reshape(xyz_ini(1:2:end,3)+z_def(1:2:end),41,[]);
     
    surf(x,y,z)
    axis vis3d
    La ligne avec STRREAD ne fonctionnait pas car il faut impérativement que chaque ligne lue se termine par au moins un espace. Ce qu'assure la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data_def{1} = strcat(data_def{1},{' '});
    Tu peux aussi utiliser une méthode plus classique de lecture en utilisant les fonctions de bas niveau FOPEN/FGETL/FCLOSE à la place de TEXTSCAN. C'est généralement moins rapide mais c'est plus lisible et plus compréhensible pour la maintenance du code

    A noter que l'autre "peau" de la surface s'obtient en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = reshape(xyz_ini(2:2:end,1)+x_def(2:2:end),41,[]);
    y = reshape(xyz_ini(2:2:end,2)+y_def(2:2:end),41,[]);
    z = reshape(xyz_ini(2:2:end,3)+z_def(2:2:end),41,[]);
    Citation Envoyé par Mimu_ Voir le message
    Derniere chose je trouve la pente de la déformée très raide pour avoir moins courbé c'est juste une histoire d'echelle à ajuster ?
    Tu dois jouer avec la propriété DataAspectRatio de l'objet Axes sur lequel est dessinée la surface.

    Ajoute ceci à la fin du code (la valeur 30 est à ajuster) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(gca,'dataaspectratio',[1 1 30])
    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)

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Salut Dut,

    Je te remercie pour le code je viens un peu de le tester et ca marche super bien je te poserai certainement quelques questions sur le code dans la semaine.

    Si jamais je fais des tests avec un empilement de plaques j'ai juste les lignes suivantes a adapté ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = reshape(xyz_ini(1:2:end,1)+x_def(1:2:end),41,[]);
    y = reshape(xyz_ini(1:2:end,2)+y_def(1:2:end),41,[]);
    z = reshape(xyz_ini(1:2:end,3)+z_def(1:2:end),41,[]);
    Merci bien et bonne soirée.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Salut !

    Alors je vais poser quelques questions sur le code pour savoir si j'ai un peu compris comment fonctionne le programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    % Lecture du fichier ini
    fid = fopen('node_ini.txt');
    data_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
    La on "nettoie le fichier" et data_ini garde combien il y a de noeud par colonne.

    % Lecture du fichier def
    fid = fopen('node_mode9.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
    Alors la je comprends pas pourquoi on a une valeur de 6323

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    % Recuperation des donnees ini
    x_ini = data_ini{1};
    y_ini = data_ini{2};
    z_ini = data_ini{3};
    Ici on mets les coordonnées des points dans chaque variable mais je ne vois pas très bien comment le programme procède parce que si on prend par exemple data_ini{1} dans la première colonne de data_ini c'est juste inscrit 5084x1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    % Recuperation des donnees def
    idx = cellfun(@(x) isempty(x) || ~isstrprop(x(1),'digit'),data_def{1});
    Et la je comprends pas comment fonctionne cellfun dans la mesure ou pour moi la fonction @x n'existe pas.

    Je m'arrête la en attendant d'en savoir plus.

    Merci

  13. #13
    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,

    je sais que le code que t'a donné Dut n'est pas un code trivial et que tu as l'air de découvrir beaucoup de notions, mais il faut que tu fasses l'effort de chercher par toi-même, de lire la doc de matlab et la faq du site...

    Par exemple, en lisant la doc tu peux lire que les données lues par textread sont stockées dans un tableau de cellules (voir la doc de matlab ou la les tableaux de cellules). Comprendre ce qu'est un tableau de cellules te permettra normalement de répondre à un grand nombre de questions de ton dernier post. Et la doc de textscan contient toute les informations qui te permettront de comprendre pourquoi Dut a utilisé tel ou tel option.

    Dans l'expression "@(x) isempty(x) || ~isstrprop(x(1),'digit')", la fonction est isempty(x) || ~isstrprop(x(1),'digit').
    @(x) permet juste de spécifier que la variable de cette fonction est x.
    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.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    je mets a jour le sujet. Tout d'abord merci a magelan j'avais effectivement fait l'impasse sur la faq

    j'ai voulu faire d'autre tests en modifiant d'abord les dimensions de ma plaque et un autre test avec un empilement de plaques.

    j'ai essaye d'adapter les lignes suivantes sans succes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = reshape(xyz_ini(1:2:end,1)+x_def(1:2:end),41,[]);
    y = reshape(xyz_ini(1:2:end,2)+y_def(1:2:end),41,[]);
    z = reshape(xyz_ini(1:2:end,3)+z_def(1:2:end),41,[]);

    je ne pense pas que ca vienne de la premiere partie du code car on recupere juste l'ordre des points.

    Je mets en piece jointe les images des resultats et les noeuds.
    Fichiers attachés Fichiers attachés

  15. #15
    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 166
    Points
    53 166
    Par défaut
    Citation Envoyé par Mimu_ Voir le message
    j'ai voulu faire d'autre tests en modifiant d'abord les dimensions de ma plaque et un autre test avec un empilement de plaques.
    D'où ce que j'écrivais dans mon premier message... à savoir qu'il serait plus commode d'exporter le maillage en plus de noeuds.

    Dans l'exemple que tu donnes, on peut s'en sortir car les plaques sont rectangulaires. Il "suffit" d'analyser les coordonnées des noeuds.

    Le nombre de plaques (ou d'épaisseurs) est donné par le nombre de valeurs uniques suivant z et le nombre de noeuds suivant x est donné par l'analyse de la fréquence d'apparition des valeurs.

    Pour l'empilement :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    % Lecture du fichier ini
    fid = fopen('node_ini.txt');
    data_ini = textscan(fid,'%*d%f%f%f','commentstyle','NODE','headerlines',5);
    fclose(fid);
     
    % Lecture du fichier def
    fid = fopen('node_def.txt');
    data_def = textscan(fid,'%s','delimiter','\n','headerlines',10);
    fclose(fid);
     
    % Recuperation des donnees ini
    x_ini = data_ini{1};
    y_ini = data_ini{2};
    z_ini = data_ini{3};
     
    % Recuperation des donnees def
    idx = cellfun(@(x) isempty(x) || ~isstrprop(x(1),'digit'),data_def{1});
    data_def{1}(idx,:) = [];
    data_def{1} = strcat(data_def{1},{' '});
    [x_def,y_def,z_def] = strread(char(data_def{1}).','%*d%f%f%f%*f');
     
    clear data_ini data_def idx fid
     
    % Classement des points ini
    [xyz_ini,idx_ini] = sortrows([x_ini y_ini z_ini]);
     
    % Classement des points def
    x_def = x_def(idx_ini);
    y_def = y_def(idx_ini);
    z_def = z_def(idx_ini);
     
    % Affichage
    figure('doublebuffer','on')
     
    hold on
     
    % Nombre de plaques (ou d'epaisseurs)
    N = numel(unique(xyz_ini(:,3)));
    % Nombre de noeuds suivants x
    L = histc(xyz_ini(1:N:end,1),unique(xyz_ini(1:N:end,1)));
     
    for n=1:N
        x = reshape(xyz_ini(n:N:end,1)+x_def(n:N:end),L(1),[]);
        y = reshape(xyz_ini(n:N:end,2)+y_def(n:N:end),L(1),[]);
        z = reshape(xyz_ini(n:N:end,3)+z_def(n:N:end),L(1),[]);
     
        surf(x,y,z)
    end
     
    axis vis3d
    Mais imagine que ton nuage de points ne soit plus ordonné (non rectangulaire par exemple)... comment pourrait-on tracer la surface ?
    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)

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    J'essaierai de voir comment extraire le maillage mais je pense qu'avec ce petit programme ca va déjà énormément m'aider.

    Par contre lorsque j'ai plusieurs épaisseurs j'ai essayé de "moyenner" le tout malheureusement la commande que j'utilise me donne une erreur et de mémoire il me semble que j'avais utilisé la meme. Je montre un bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    x_tot = zeros(L(1),size(L,1));
    for n=1:N
        x = reshape(xyz_ini(n:N:end,1)+x_def(n:N:end),L(1),[]);
        str = sprintf('X%02d=x;',n);
        x_tot = x_tot + eval(str);
        y = reshape(xyz_ini(n:N:end,2)+y_def(n:N:end),L(1),[]);
        z = reshape(xyz_ini(n:N:end,3)+z_def(n:N:end),L(1),[]);
    end
    je montre juste le code que j'avais mis pour faire la somme des matrices (j'ai juste mis pour "x" ) mais matlab me renvoie l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ??? Error: The expression to the left of the equals sign is not a valid
    target for an assignment.
    EDIT:

    Finalement j'ai contourne le probleme avec des tableaux de cellules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for n=1:N
        x{n} = reshape(xyz_ini(n:N:end,1)+x_def(n:N:end),L(1),[]);
        y{n} = reshape(xyz_ini(n:N:end,2)+y_def(n:N:end),L(1),[]);
        z{n} = reshape(xyz_ini(n:N:end,3)+z_def(n:N:end),L(1),[]);
    end
     
    x_tot = zeros(L(1),size(L,1));
    y_tot = zeros(L(1),size(L,1));
    z_tot = zeros(L(1),size(L,1));
    for n=1:N
        x_tot = x_tot + x{n};
        y_tot = y_tot + y{n};
        z_tot = z_tot + z{n};
    end
    Le probleme maintenant c'est pour la premiere boucle, la dimension augmente a chaque iteration donc je me doute que le code est pas tres propre mais je ne manipule pas de grandes quantites de donnees

Discussions similaires

  1. Export DLL et noms des points d'entrée
    Par Dozer dans le forum MFC
    Réponses: 5
    Dernier message: 03/06/2005, 09h49
  2. Utilisation des point de sauvegarde (SAVEPOINT)
    Par sto dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/01/2005, 18h35
  3. Réponses: 4
    Dernier message: 11/06/2004, 10h21
  4. [ plugin ][ extension point ] liste des points d'extension
    Par Satch dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 19/03/2004, 09h34
  5. calculs des points
    Par rabi dans le forum OpenGL
    Réponses: 11
    Dernier message: 12/02/2004, 10h03

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