Ecriture dans un fichier stl

val84 - Modifié le 10 mai 2022 à 15:53
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 11 mai 2022 à 07:24
Bonjour, je dois "coder" tétraèdre et l'écrire dans un fichier stl en ASCII, afin de par la suite pouvoir automatiser le programme, j'ai donc essayer de faire tout en dure dans le code dans un premier temps

using Microsoft.Win32;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;

namespace Fichier_Stl

{


    public partial class MainWindow : Window
    {
        public MainWindow()
        {

            InitializeComponent();
            Remplirpoints(points);
            RemplirTexte(points);
            EcrirePoints(points);
        }
        public List<Point> points = new List<Point>();
        public StringBuilder sb = new StringBuilder();
        public void Remplirpoints(List<Point> points)
        {

            points.Add(new Point(){ X = "0", Y = "0", Z = "0" });
            points.Add(new Point(){ X = "1", Y = "0", Z = "0" });
            points.Add(new Point(){ X = "0", Y = "1", Z = "0" });
            points.Add(new Point(){ X = "0", Y = "0", Z = "1" });
        


        public void RemplirTexte(List<Point> points)
        {

             sb.AppendLine("solid cube");
            sb.AppendLine("facet normal" + " " + "0" + " " + "0" + " " + "1");
            sb.AppendLine("outer loop");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "1" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "1" + " " + "0");
            sb.AppendLine("endloop");
            sb.AppendLine("endfacet");
            sb.AppendLine("facet normal" + " " + "1" + " " + "0" + " " + "0");
            sb.AppendLine("outer loop");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "1" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "1");
            sb.AppendLine("endloop");
            sb.AppendLine("endfacet");
            sb.AppendLine("facet normal" + " " + "0" + " " + "-1" + " " + "0");
            sb.AppendLine("outer loop");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "1" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "1");
            sb.AppendLine("endloop");
            sb.AppendLine("endfacet");
            sb.AppendLine("facet normal" + " " + "1" + " " + "1" + " " + "1");
            sb.AppendLine("outer loop");
            sb.AppendLine("Vertex" + " " + "1" + " " + "0" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "1" + " " + "0");
            sb.AppendLine("Vertex" + " " + "0" + " " + "0" + " " + "1");
            sb.AppendLine("endloop");
            sb.AppendLine("endfacet");
            sb.AppendLine("endsolid cube");
        }


        public void EcrirePoints(List<Point> points)
        {
            string path = "";
            SaveFileDialog SFD = new SaveFileDialog
            {
                Filter = "STL Files (*.stl) | *.stl"
            };
            SFD.ShowDialog(); // on ouvre une fenetre de dialogue
            path = SFD.FileName;

            using (StreamWriter writetext = new StreamWriter(path))
            {
                writetext.WriteLine(sb);
            }

            MessageBox.Show("Ecriture terminée");
         }


        public class Point
        {


            public string X { get; set; }
            public string Y { get; set; }
            public string Z { get; set; }
        }

voici le code que j'ai une fois que j'enregistre le resultat dans le fichier stl

solid cube
facet normal 0 0 1
outer loop
Vertex 0 0 0
Vertex 1 0 0
Vertex 0 1 0
endloop
endfacet
facet normal 1 0 0
outer loop
Vertex 0 0 0
Vertex 0 1 0
Vertex 0 0 1
endloop
endfacet
facet normal 0 -1 0
outer loop
Vertex 0 0 0
Vertex 1 0 0
Vertex 0 0 1
endloop
endfacet
facet normal 1 1 1
outer loop
Vertex 1 0 0
Vertex 0 1 0
Vertex 0 0 1
endloop
endfacet
endsolid cube


ce qui est normalement si j'ai bien compris la bonne facon d'ecrire en ASCII, mais impossible de lire le fichier en 3D

je ne sais plus trop quoi faire si vous avez des idées merci d'avance
A voir également:

8 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 10 mai 2022 à 19:10
Bonjour
C'est quoi tétraèdre ?
Peux tu nous dire où tu as trouvé de la documentation pour les fichiers .stl ?

0
val84380 Messages postés 3 Date d'inscription mardi 10 mai 2022 Statut Membre Dernière intervention 10 mai 2022
10 mai 2022 à 19:10
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 mai 2022 à 19:18
Et tétraèdre vous l'avez trouvé où ?
0
val84380 Messages postés 3 Date d'inscription mardi 10 mai 2022 Statut Membre Dernière intervention 10 mai 2022
10 mai 2022 à 19:26
tétraedre c'est un triangle en 3D et j'ai fais les calculs et les coordonnées a la main du coup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
10 mai 2022 à 19:40
Bonjour
J'ai trouvé des infos sur les fichiers .stl : https://www.fil.univ-lille1.fr/~L1S2API/CoursTP/fichier_stl.html#:~:text=Dans%20un%20fichier%20STL%2C%20un,premiers%20octets%20sont%20un%20commentaire.
Et tu peux même télécharger tétraèfre.stl au format binaire .
Par contre bizarre que tes vertex ne comporte que des 0 et des 1 .
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
10 mai 2022 à 21:29
Bonsoir
si j'ai bien compris la bonne facon d'ecrire en ASCII,
non pas vraiment.

Perso je n'aime pas trop les stringbuilder, cela dit, le but de cet objet c'est d'éviter de construite une string de cette façon
"Vertex" + " " + "1" + " " + "2" + " " + "3"


Pour la même ligne, il faudrait écrire quelque chose comme ça (de tête dans le post, pas vérifié dans un IDE)
 sb.Append("Vertex ");
sb.Append(1.ToString());
sb.Append(" ");
sb.Append(2.ToString());
sb.Append(" ");
sb.Append(3.ToString());


Ou mieux se servir de sa déclinaison de string.Format
 sb.AppendFormat("Vertex {0} {1} {2}\r\n", 1, 2, 3);



En ce qui me concerne, je préfère string.Format
string textACompleter =@"Vertex {0} {1} {2}
Vertex {3} {4} {5}
Vertex {6} {7} {8}";

string resultat = string.Format(textACompleter, 1, 2, 3, 4, 5, 6, 7, 8, 9);


Ou mieux si tu utilises visual studio 2019 ou plus récent
            Point point1 = new Point(){ X = "1", Y = "2", Z = "3" };
            Point point2 = new Point(){ X = "4", Y = "5", Z = "6" };
            Point point3 = new Point(){ X = "7", Y = "8", Z = "9" };

            string resultat = $@"Vertex {point1.X} {point1.Y} {point1.Z}
Vertex {point2.X} {point2.Y} {point2.Z}
Vertex {point3.X} {point3.Y} {point3.Z}";


Ensuite, utiliser un streamwriter pour un fichier ascii, c'est un peu l'artillerie lourde.
Ceci
string texte = @"blablabla
blabla
bla
blablabla";

File.WriteAllText("leFichier.txt", texte);

tout simplement suffit largement.

Le streamwriter te sera nécessaire si tu optes pour la version binaire du fichier stl.


Quoiqu'il en soit, le code que tu as écrit permet effectivement d'écrire un fichier ASCII, le problème ne vient pas de C# en soit mais du format de fichier.

A première vue, je dirais que selon les sites de référence dont tu parles, Vertex s'écrit avec un v minuscule, et que les coordonnées sont sensées être décimales.
Mais pas certain que cela vienne de là.
0
val84380 Messages postés 3 Date d'inscription mardi 10 mai 2022 Statut Membre Dernière intervention 10 mai 2022
10 mai 2022 à 21:50
Merci pour vos réponses,
D'accord je vais essayer de changer le code avec ce que tu me conseilles
Ensuite j'ai passé toute mes valeurs en decimal je vais essayer de changer avec l'orthographe de vertex peut être que c'est ca qui ne marchait pas
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
11 mai 2022 à 07:24
Il faudra commencer par modifier ta classe Point, les propriétés X, Y et Z doivent être de type double.
En plus s’agissant d’un format américain, y’a toute les chances que le symbole décimal soir le point. Si ton Pc est configuré avec la virgule tout ce que je t’ai montré plus haut va écrire des virgules.
Comme il y a beaucoup de valeurs, le plus simple est de dire à C# que le thread de ton programme ne suit pas la culture du pc et de le forcer en culture « invariant ».

Enfin, VB (que je salue) a fait une remarque judicieuse, si ton tétraèdre avec des valeurs « comme ça » n’est pas physiquement possible, il se peut que ton logiciel le voit et rejette le fichier pour cette raison, es tu sûr de ces valeurs ?
0
Rejoignez-nous