Как реализовать анализ толщины стенки для проекта .net

У меня есть .stl для 3D-печати. И я хочу проанализировать толщину стенок этой модели перед печатью. Я понятия не имею ни о каких инструментах. Могу ли я создать любое консольное или wpf-приложение для расчета толщины стенок и стоимости печати? Пожалуйста, помогите мне.

, 👍3

Обсуждение

Здравствуйте, да, вы можете создать приложение для анализа толщины стенок, но как это сделать-это вопрос программирования, а не вопрос 3D-печати, @Nir


3 ответа


2

Если вы говорите о полом объекте, например о кубе с полым центром. Толщина стенки определяется моделью.

Если вы говорите о твердом объекте, то толщина стенки определяется диаметром сопла, умноженным на количество стенок. Все это настраивается вашим программным обеспечением для сращивания. Если у вас сопло 0,5 мм и вы печатаете по периметру 3, то ваша стена должна быть 1,5 мм. Если вы хотите, чтобы стена была 2 мм, то вы отрегулируете свои периметры на 4. Все, что находится в этих стенах, будет тем, что вы выберете для заполнения.

Я работаю с ASP.NET, Windows Forms и Консольные приложения. Я уверен, что вы можете найти библиотеки, способные принимать 3D-модели, но я не думаю, что это будет иметь значение, потому что толщина печати определяется вашими настройками сращивания.

Кроме того, для стоимости печати я рекомендую просто использовать Cura, которую вам просто нужно подключить к некоторой информации о стоимости филамента, и она сообщит вам ориентировочную стоимость, мм использования нити и время.


,

Это не совсем так. Большинство слайсеров допускают чрезмерную и недостаточную экструзию стенок, чтобы обеспечить наличие стенок, которые не связаны конкретно диаметром используемого сопла. slic3r, Simplify3D и Cura, по крайней мере, все имеют эти опции. Я бы предположил, что вы захотите прочитать g-код, чтобы получить конкретные детали, поскольку способ нарезки модели варьируется, а сама модель не всегда является хорошим показателем., @Jesse Williams

Я сам использую slic3r. В моем случае каждая напечатанная стена соответствует друг другу. Я никогда не замечал, чтобы одна стена была толще или тоньше. Они, как правило, немного больше, чем моя насадка 0,4 мм, но это потому, что они немного хлюпают. Но при 3 периметрах я должен получить стенки 1,2 мм, но при измерении я получаю около 1,3 мм., @Athanasios Karagiannis


1

Если вас беспокоит, что стенки файла stl могут быть слишком тонкими для печати на принтере, MeshMixer-отличный инструмент от Autodesk, который поможет проверить и устранить проблемы с сеткой (включая толщину стенки). Это бесплатно для создателей и педагогов.

Есть много полезных руководств Вот один из них https://all3dp.com/meshmixer-tutorial/

,

1

Я не совсем уверен, что вы хотите сделать, но я добавлю некоторую информацию, которая, как мне кажется, поможет, и тогда, надеюсь, вы сможете выяснить, что вам нужно знать, или задать другой вопрос.

Когда вы спрашиваете о толщине стенки, вы можете иметь в виду две разные вещи. Стена в модели, так что вы можете говорить о попытке напечатать тонкую стену, выходящую из модели. Для анализа настройки тонких стенок некоторые слайсеры изменяют величину экструзии, чтобы печатать более толстые или тонкие линии, и чтобы найти эти настройки, вам нужно будет посмотреть на g-код. Или вы можете говорить о оболочке модели, о внешней поверхности, и для этого вы также можете провести анализ в настройках слайсера, посмотрев на количество периметров, которые слайсер попытается напечатать.

Для расчета стоимости печати вам понадобится количество использованного материала, это также будет указано в файле g-кода. Вы можете вычислить это, выполнив каждую команду G1 и выяснив, сколько нити было экструдировано за каждое движение принтера. (Не некоторые слайсеры сбрасывают это значение до нуля после каждого слоя, и это становится сложным, когда принтер начинает втягивать нить во время перемещения). Или же большинство слайсеров имеют закомментированную строку g-кода в начале или конце файла с указанием количества филамента.

Если вы проанализируете файл .stl, вы также можете обнаружить, что вам нужно восстановить файл модели, потому что многие файлы .stl созданы для 3D-графики, а не для печати, и поэтому они могут иметь пересекающиеся треугольники и не быть водонепроницаемыми.

Не все файлы .stl одинаковы, они могут быть текстовыми или двоичными файлами, это некоторый код c#, который будет считывать оба формата в список треугольников в файле для вас.

using System.Numerics.Vectors; 
void Main(){
var facets = readStl(@"C:\stls\teapot.stl");}

public class facet
{
    public Vector3 norm = new Vector3();
    public Vector3 vecA = new Vector3();
    public Vector3 vecB = new Vector3();
    public Vector3 vecC = new Vector3();
    public facet(Vector3 A, Vector3 B, Vector3 C, Vector3 N)
    {
        norm = N;
        vecA = A;
        vecB = B;
        vecC = C;
    }
}/* facet */


public static System.Collections.Generic.List<facet> readStl(string file)
{
    // проверьте, есть ли двоичный или текстовый fomat
    //Консоль.WriteLine("середина");
    bool isText;
    System.Collections.Generic.List<facet> facets = new System.Collections.Generic.List<facet>();
    using (System.IO.BinaryReader reader = new System.IO.BinaryReader(System.IO.File.Open(file, System.IO.FileMode.Open)))
    {
        //Консоль.WriteLine("Проверка бинарности");
        string fileHeading;
        fileHeading = new string(reader.ReadChars(80));
        if (fileHeading.Contains(@"solid"))
        {
            isText = true;
            //Консоль.WriteLine("isText true");
        }
        else
        {
            isText = false;
            //Консоль.WriteLine("isText false");
        }
        if(!isText)
        {
            // обработать двоичный файл
            Console.WriteLine("Is binary");
            uint numberOfTriangles = reader.ReadUInt32();
            //Debug.Log("Количество треугольников:" + NumberOfTriangles.toString());
            System.Console.WriteLine("Number of Triangles: " + numberOfTriangles.ToString());
            for(int i = 0; i < numberOfTriangles - 1; i++)
            {
                Vector3 normals = new Vector3();
                Vector3 vecA = new Vector3();
                Vector3 vecB = new Vector3();
                Vector3 vecC = new Vector3();
                System.UInt16 byteCount = new System.UInt16();
                normals.X = reader.ReadSingle();
                normals.Y = reader.ReadSingle();
                normals.Z = reader.ReadSingle();
                vecA.X = reader.ReadSingle();
                vecA.Y = reader.ReadSingle();
                vecA.Z = reader.ReadSingle();
                vecB.X = reader.ReadSingle();
                vecB.Y = reader.ReadSingle();
                vecB.Z = reader.ReadSingle();
                vecC.X = reader.ReadSingle();
                vecC.Y = reader.ReadSingle();
                vecC.Z = reader.ReadSingle();
                byteCount = reader.ReadUInt16();
                facets.Add(new facet(vecA, vecB, vecC, normals));
            }
        }
    }
    if (isText)
    {
        // читать файл текстового формата
        Console.WriteLine("Is text file");
        //Консоль.WriteLine("чтение текстового файла");
        using (System.IO.StreamReader reader = System.IO.File.OpenText(file))
        {
            string line = @"";
            string fileHeader = @"";
            line = reader.ReadLine();
            fileHeader = line.Substring(line.IndexOf("solid") + 5).Trim();
            line = "";
            System.Console.WriteLine(@"file header: " + fileHeader);
            bool endOfFile = true;
            while (endOfFile)
            {
                line = reader.ReadLine();
                if (!reader.EndOfStream)
                {
                    Vector3 normals = new Vector3();
                    Vector3 vecA = new Vector3();
                    Vector3 vecB = new Vector3();
                    Vector3 vecC = new Vector3();
                    string[] nums = line.Replace("facet", "").Replace("normal", "").Trim().Split(' ');
                    normals.X = (float)System.Double.Parse(nums[0], System.Globalization.NumberStyles.Float);
                    normals.Y = (float)System.Double.Parse(nums[1], System.Globalization.NumberStyles.Float);
                    normals.Z = (float)System.Double.Parse(nums[2], System.Globalization.NumberStyles.Float);
                    line = "";
                    line = reader.ReadLine(); // внешний цикл
                    line = reader.ReadLine(); // vertex
                    string[] vecsA = line.Replace("vertex", "").Trim().Split(' ');
                    vecA.X = (float)System.Double.Parse(vecsA[0], System.Globalization.NumberStyles.Float);
                    vecA.Y = (float)System.Double.Parse(vecsA[1], System.Globalization.NumberStyles.Float);
                    vecA.Z = (float)System.Double.Parse(vecsA[2], System.Globalization.NumberStyles.Float);
                    line = "";
                    line = reader.ReadLine(); // vertex
                    string[] vecsB = line.Replace("vertex", "").Trim().Split(' ');
                    vecB.X = (float)System.Double.Parse(vecsB[0], System.Globalization.NumberStyles.Float);
                    vecB.Y = (float)System.Double.Parse(vecsB[1], System.Globalization.NumberStyles.Float);
                    vecB.Z = (float)System.Double.Parse(vecsB[2], System.Globalization.NumberStyles.Float);
                    line = "";
                    line = reader.ReadLine(); // vertex
                    string[] vecsC = line.Replace("vertex", "").Trim().Split(' ');
                    vecC.X = (float)System.Double.Parse(vecsC[0], System.Globalization.NumberStyles.Float);
                    vecC.Y = (float)System.Double.Parse(vecsC[1], System.Globalization.NumberStyles.Float);
                    vecC.Z = (float)System.Double.Parse(vecsC[2], System.Globalization.NumberStyles.Float);
                    line = "";
                    line = reader.ReadLine(); // endloop
                    line = reader.ReadLine(); // endfacet
                    facets.Add(new facet(vecA, vecB, vecC, normals));
                }
                else
                {
                    endOfFile = false;
                }
            }// цикл while
            System.Console.WriteLine("finished reading file");
        }
    }
    return facets;
}/* readStl */
,