МД (1194692), страница 18
Текст из файла (страница 18)
Выполняется посредством углового обзора рядом стоящих точек и ожидания закрытия цикла:bool FindPointIntoLoop(float inX,float inY){float dAlpha=0;int countIDInLoops=0;for (int i=0;i<OutLineSeparation.size()-1;i++){if (OutLineSeparationID[i]!=OutLineSeparationID[i+1]){if (fabs(dAlpha)>0.001 ) countIDInLoops++;dAlpha=0;continue;}float p1x=OutLineSeparation[i].X-inX;float p1y=OutLineSeparation[i].Y-inY;float p2x=OutLineSeparation[i+1].X-inX;float p2y=OutLineSeparation[i+1].Y-inY;float angle=atanTrueDegree(p1x,p1y)atanTrueDegree(p2x,p2y);if (angle>180) angle=-(360atanTrueDegree(p1x,p1y)+atanTrueDegree(p2x,p2y));if (angle<-180) angle=(360atanTrueDegree(p2x,p2y)+atanTrueDegree(p1x,p1y));dAlpha+=angle;}if (fabs(dAlpha)>0.001 ) countIDInLoops++;if (countIDInLoops%2==1) return true;119else return false;}Генерация характеристических точек для последующей обработки в использовании алгоритма построения сетки Вороного:void SetInnerPointsRand(){InnerPoints.clear();point tmp;if (OutLineSeparation.size()<2) return;while (InnerPoints.size()<maxInnerRandPoint){tmp.X=(((float)rand()/(float)(RAND_MAX)) *fabs(GabariteMaxX-GabariteMinX))+GabariteMinX;tmp.Y=(((float)rand()/(float)(RAND_MAX)) *fabs(GabariteMaxY-GabariteMinY))+GabariteMinY;tmp.Z=SlicerHeight;if (FindPointIntoLoop(tmp.X,tmp.Y)) InnerPoints.push_back(tmp);}}Сохранение данных в формате g-код.
Перевод созданный массив контуров вg-код, используя системные команды, понятные станкам с ЧПУ:void exportGcode(){ofstream fout ("Export.gcode");fout << "M140 S50.000000"<<endl<<"M109 T0 S190.000000"<<endl<<"T0"<<endl<<"M190 S50.000000"<<endl<<"G21;metric values"<<endl<<"G90;absolute positioning"<<endl<<"M83;set extruder to absolute mode"<<endl<<"M107;start with the fan off"<<endl<<"G28 X0 Y0 ;move X/Y to min endstops"<<endl<<"G28 Z0;move Z to min endstops"<<endl<<"G1 Z15.0 F9000 ;move the platform down 15mm"<<endl<<"G92 E0;zero the extruded length"<<endl<<"G1 F200 E3;extrude 3mm of feed stock"<<endl<<"G92 E0;zero the extruded lengthagain"<<endl<<"G1 F9000"<<endl<<"M107"<<endl;float centX=92.22;float centY=86.75;for (int j=0;j<OutLineLoop.size();j++){fout<<";LAYER:"<<j<<endl;fout<<"G0 F9000 X"<<OutLineLoop.at(j).at(0).X+centX<<"Y"<<OutLineLoop.at(j).at(0).Y+centY<<"Z"<<OutLineLoop.at(j).at(0).Z<<endl;fout<<";TYPE:WALL-OUTER"<<endl;X"<<OutLineLoop.at(j).at(0).X+centX<<"Y"<<OutLineLoop.at(j).at(0).Y+centY<<" E"<<LenghtOfLine()<<endl;120for (int i=1;i<OutLineLoop.at(j).size()-1;i++){if (OutLineLoopID.at(j).at(i1)==OutLineLoopID.at(j).at(i)){fout<<"G1 F1200X"<<OutLineLoop.at(j).at(i).X+centX<<"Y"<<OutLineLoop.at(j).at(i).Y+centY<<"E"<<(LenghtOfLine(OutLineLoop.at(j).at(i),OutLineLoop.at(j).at(i1))/63.697)<<endl;}}fout<<"G1 F1200X"<<OutLineLoop.at(j).at(OutLineLoop.at(j).size()-1).X+centX<<"Y"<<OutLineLoop.at(j).at(OutLineLoop.at(j).size()-1).Y+centY<<"E0.1"<<endl;}fout.close ();cout<<"Save to file is OK!"<<endl;}Приведенный ниже фрагмент программы отвечает за одну из основных особенностей приложения.
Именно в нем прописана реализация создания массивазамкнутых контуров с поиском отклонения предыдущего контура от последующего, благодаря чему, при нахождении одинаковых контуров, алгоритм увеличивает толщину слоя в 2 раза.///Функция генерирующая множество контуров - полный слайсингмодели с функцией адаптивного подхода к высоте слояstatic void GenerateLoopCycleAdaptive(void){///Подготовка к слайсингу и определение его параметровif (OutLineSeparation.size()>0){cout<<"Count vertex = "<<OutLineSeparation.size()<<endl;}///Создание временных подслоев для определения их степенисхожестиfloat tempSliceHight = SlicerHeight;vector <point> tempLoop;vector <int> tempLoopID;vector <point> tempLoop2;vector <int> tempLoopID2;OutLineLoop.clear();OutLineLoopID.clear();///Цикл слайсинга с использованием базовой функции слайсинга слояfor (float height=LayerHeight/2;height<GabariteMaxZLayerHeight;height+=LayerHeight){///Создание подслоев для определения их степени похожести.
Подслайсинг слоевSlicerHeight=height;FindSeparatePoint();FindSeparateLayerOutLine();tempLoop=OutLineSeparation;tempLoopID=OutLineSeparationID;121SlicerHeight=height+LayerHeight;FindSeparatePoint();FindSeparateLayerOutLine();tempLoop2=OutLineSeparation;tempLoopID2=OutLineSeparationID;///Цикл поиска степени похожестиfloat minDeltaOnLoop=300;for (int i=0;i<tempLoop2.size();i++){float minDelta=300;for (int j=0;j<tempLoop.size()-1;j++){if (tempLoopID[j+1]==tempLoopID[j]){if (OffsetByLine(tempLoop[j],tempLoop[j+1],tempLoop2[i])<minDelta)///На каждом этапе определяется переменная - MinDelta - после поиска по всем вершинам - это максимальное из минимальных для каждой точки значение отклонения точек отисходных линийminDelta=OffsetByLine(tempLoop[j],tempLoop[j+1],tempLoop2[i]);}}if (minDelta<minDeltaOnLoop) minDeltaOnLoop=minDelta;}cout<<"Adaptive = "<<minDeltaOnLoop<<endl;/// Если величина отклонения меньше 0.001 мм.
То слойувеличить в 2 разаif (minDeltaOnLoop<=0.00001) {height+=LayerHeight;OutLineLoop.push_back(tempLoop2);OutLineLoopID.push_back(tempLoopID2);}else{OutLineLoop.push_back(tempLoop);OutLineLoopID.push_back(tempLoopID);}}OutLineSeparation.clear();OutLineSeparationID.clear();SlicerHeight=tempSliceHight;}float LenghtOfLine(point a, point b){return sqrt(pow((a.X-b.X),2)+pow((a.Y-b.Y),2));}4.3 Интерфейс и принципы работы приложенияПриложение работает как консольная программа с окном графического вывода, работающего через библиотеку glut.h. Управление производится посредством клавиатуры и мыши. С помощью горячих клавиш можно управлять процессами:– загрузки триангулированной модели;– выбором параметров для слайсинга;122– управления процессом слайсилнга;– настройки визуального оформления программы.Работа с программой начинается с загрузки графического и консольногоокна и выводом их на экран.
Консольное окно предназначено для вывода информации о модели и процесса слайсинга (рисунок 50).Рисунок 50 – Консольное окно программыГрафическое окно позволяет увидеть/ просмотреть трехмерную модель,предназначенную для трехмерной печати/ процесса аддитивного производства.По умолчанию окно содержит оси проекции и базовую плоскость – «стол» builtplate. После выбора модели для слайсинга, объект отображается в окне предпросмотра в виде твердого тела или триангуляционной сетки (рисунок 51).абРисунок 51 – Отображение модели: а – в твердотельном виде; б – в виде сегментовИмеется возможность установки различных режимов просмотра.123В программе отображение требуется для того, чтобы совместить контурдвижения экструдера и модели для удобного обзора подготавливаемого g-кода.В любом из режимов работы программы пользователь может с помощью мышив перспективной проекции наблюдать модель и траекторию движения экструдера с любых ракурсов.
Кроме того, поддерживается функция масштабирования.Начало работы в программе:1) для начала работы, после включения программы при активации графического окна, требуется нажать на клавишу O (клавиатура на английском языке),чтобы отобразился список возможных моделей для слайсинга;2) после загрузки модели, пользователю требуется нажать клавишу S длягенерации точек (вертекс) на пересечении секущей плоскости и гранями модели. Это требуется для того, чтобы разделить процесс создания траектории движения экструдера на 2 этапа и визуально контролировать процесс слайсинга.Эта функция позволяет отслеживать важнейший этап генерации g-код, что вбудущем позволит добавить сетку Вороного.
После генерации точек, пользователь переходит к процессу генерации траекторий;Рисунок 52 – Режим единичного слайсинга3) клавиша D – программа анализирует положение каждой из точек, заключая их в 1 или несколько замкнутых контуров, алгоритм позволяет обнаружить124количество и вложенность контуров друг в друга (режим единичного слайсинга), представленный на рисунке 52;4) далее клавиша F позволяет генерировать множество точек внутри замкнутых контуров, полученных на предыдущем этапе (при нажатии сочетанияклави F+Shift происходит выстраивание сетки в упорядоченном матричном виде) . Следует отметить, что алгоритм учитывает вложенность и позицию контуров на площади слайсинга (рисунок 53);абРисунок 53 – Построение сетки внутреннего заполнения: а – случайное заполнение;б – упорядоченная генерация5) клавиши E, R, T отвечают за поворот модели на 45ᵒ, E – относительно осиOX, R – относительно оси OY, T – относительно оси OZ;6) клавиша X отвечает за скрытие модели, Shift+X за показ модели;7) клавиша N разбивает модель на слои с толщиной по умолчанию 0,2мм;8) клавиша M реализует адаптивный подход к толщине слоя.
При условии,что величина предыдущего контура совпадает с величиной последующего,толщина слоя удваивается (рисунок 54);125абРисунок 54 – Слайсинг модели: а – по умолчанию; б – с адаптивным подходом9) H – навигатор по клавишам;10) A – автоматическая генерация контура;11) после послойного деления модели, результат (как статический, так и динамический) сохраняется в виде g-кода в папку программы при нажатии клавиши V;12) Q – выход.На данный момент программа-слайсер может обрабатывать загруженную вформате stl модель любой конструкции и формы (рисунок 55).Рисунок 55 – Примеры слайсинга моделейНиже, на рисунке приведен результат слайсинга модели конструкции с переменным сечением внешнего контура и сравнение использования алгоритмовстатического и динамического построения контуров (рисунок 56).126абвгРисунок 56 – Слайсинг конструкции с переменным сечением: а – загруженная модель; б –распечатанный контур модели; в – статический слайсинг; г – динамический слайсинг с адаптивным подходомG-код, построенный по загруженным трехмерным моделям, экспортируетсяв файл Export.gcode, хранящийся в папке программы.
Просмотреть полученныйg-код можно в любой из представленных в первой главе программ-слайсеров.Как пример приводится просмотр созданного g-кода в ПО Cura (рисунок 57).127Рисунок 57 – Примеры чтения g-кодаРезультаты работы программы протестированы на всех этапах работы, отзагрузки модели до трехмерной печати, в виде наглядного эксперимента по печати тонкостенных сфер, толщина стенок которой равна проходу одного слояэкструдера (рисунок 58).128абвгдРисунок 58 – Печать тонкостенных сфер: а – разработка трехмерной модели; б – экспортированная в формат *.stl модель; в – триангуляционная сетка модели; г – g-код послойного деления модели; д – результаты печатиТаким образом, результаты работы программы успешно апробированы.1294.4 Экономический эффект внедрения программыС каждым годом технология трехмерной печати становится все более и доступной для рядового потребителя – увеличивается скорость, улучшается точность печати, а сами принтеры становятся компактнее.
Помимо развития самойтехнологии, увеличивается и популярность. Это можно проследить, если посмотреть на рисунок 59, на котором изображена динамика популярности 3Dпринтеров, начиная с 2007 года. Числа по вертикали – общий уровень интересак трехмерной печати, включая уровень продаж и количество поисковых запросов по тематике. Сто баллов на графике отмечают пиковое значение интереса.Рисунок 59 – График популярности технологий трехмерной печатиПоложительный эффект от внедрения в производство программного комплекса заключается в возможности непосредственным образом сократить времяпечати и уменьшить объемы затрачиваемого пластика, за счет увеличения толщины при печати конструкций с одинаковым значением контура.По экспериментальным данным, полученным в результате работы над темой исследования, сокращение времени при печати тонкостенных конструкцийлежит в диапазоне 20-40 %, расход же пластиковой нити сокращается на 1015%.