Ecriture dans un fichier stl

val84 - Modifié le 10 mai 2022 à 15:53
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
- 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

8 réponses

vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
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
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
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
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
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
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
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
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
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