roboforum.ru

Технический форум по робототехнике.

3D принтер (СОФТ)

3D принтер (СОФТ)

Master » 14 окт 2008, 16:24

Я смотрю не многих, но тема принтера тронула, а какой собсна софт буит использоваца?
Я вот накидал программку которая находит пересечение треугольника и отрезка, и на основе этого можно построить сечения модели.
А есть еще второй вариант он мне впринципе очень нравица, но я его ника нимагу асилить, в 3Д максе написать скрипт который буит находить сечения и выводить их на печать одну за одной. Но это для порошкового принтера, в котором порошок слоями наносица и по нему печатаица.

Re: 3D принтер (СОФТ)

hudbrog » 14 окт 2008, 16:33

Дык, все уже готово и опенсурсно:
http://dev.www.reprap.org/bin/view/Main ... stSoftware

Re: 3D принтер (СОФТ)

Master » 14 окт 2008, 19:06

Ниасилил, не запускаица.

Re: 3D принтер (СОФТ)

hudbrog » 14 окт 2008, 20:49

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

Re: 3D принтер (СОФТ)

geroin » 14 окт 2008, 23:58

Master
в 3Д максе написать скрипт который буит находить сечения и выводить их на печать одну за одной. Но это для порошкового принтера, в котором порошок слоями наносица и по нему печатаица.

про этот метод можно почитать здесь.

Если что то будет получатся скажете :cry: ,а? А то для меня это ну головняк ещё тот. :o
Сам пробую с СолидВоркс2007 скрипт сделать, пока что без результата. :sorry:

Re: 3D принтер (СОФТ)

Master » 15 окт 2008, 11:43

Ну в максе я пока только нарезал разные фигуры на сечения, осталось найти как это все безобразие автоматизировать и вывести на печать, желательно в масштабе. По максскрипту очень мало инфы. Пытался скачать официальный учебник по максскрипту, не нашел бесплатный. А так ваще идея мне очень нравица, вот думаю какой лучше принтер прикупить для издевательств.

Re: 3D принтер (СОФТ)

geroin » 26 окт 2008, 22:12

Короче с солидом ничего не получилось. Что интереснол у него во вкладке пуск есть раздел Print3D, но гад никаких файлы при этом не сохраняет. Зато сообщает что у меня не установлен ни сам принтер ни его дрова... :crazy:

Re: 3D принтер (СОФТ)

TomaT » 26 окт 2008, 22:49

Мало того, еще и просит "обратиться к компании, которая поставляет Вам 3D-принтеры" :crazy:

Re: 3D принтер (СОФТ)

geroin » 26 окт 2008, 23:35

Ага можно подумать что я купил себе парк 3Д принтеров, А ДРОВА ЗАБЫЛ ЗАЛИТЬ. идиоты... :P

Re: 3D принтер (СОФТ)

geroin » 28 окт 2008, 16:07

Все мучаюсь вопросом нарезки stl файлов на слои. Из полезного нарыл это
Evil Mad Scientist
FreeSteel

По первой сцылке все вроде доступно описано, токо у меня не получилось. Короче написано одно а прога так делать не хочет, ошибку выдает
По второй сцилке тоже интересный вариант, токо я еще не понял как его реализовать... нс странице справа есть пример того что должно получится. Как повторить их работу, задача намбер ВАН :crazy:

Re: 3D принтер (СОФТ)

Digit » 29 окт 2008, 09:23

А в чем траблы со Slice'ом? (вторая ссылка)
Проверить возможности нет, но по мануалам вроде все просто...

3DMax сохраняет в STL?

По файлам SVG рекомендую: Inkscape - OpenSource векторный редактор.

Re: 3D принтер (СОФТ)

Master » 29 окт 2008, 14:10

3DMax сохраняет в STL?

Да, тока там нужно жать не Save, а ниже есть Export и выбираем в каком формате сохронить, там буит 2 варианта бинарный или ASCII. ASCII понятный и простой, но якобы не очень точный, но его можно обычным блокнотом открыть и там все ясно и понятно, а вот бинарный я ниасилил, если блокнотом открыть, то там кракозяблы.

На http://www.mntc.ru/wiki/index.php/%D0%9 ... 0%B8%D0%B5
есть статья про 3Д принтер и софт там у них самописный есть на басике, там они из бинарного STL строят сечения и исходники там есть, я хотел у них на форуме зарегица поспрашивать, но мне вместо активации учетной записи приходит фигня, я писал им на почту они молчат.
Впринципе построить сечение по STL я и сам смогу, уже написал софтинку которая находит точку пересечения отрезка по его координатам и треугольника по его координатам, т. о. пронизывая нашу STL модель отрезками с определенным шагом можно построить сечение, на MNTC они так и делают.
Но опять же софтина вначале должна проверять целостность поверхности модели, для этого нужно сводить в одну точку те вершины треугольников которые расположенны на достаточно малом расстоянии друг от друга (порядка 0,0001 мм). И есть еще заморочки с вектором нормали который при определенных условиях может повлиять на работу алгоритма.

Re: 3D принтер (СОФТ)

hudbrog » 29 окт 2008, 17:37

Вот, чесслово, не понимаю че вы мучаетесь...
Ради интереса просто, решил написать такую софтинку(благо работать седня ну ооооочень не хотелось :D )
Взял исходники reprap'а, выдрал оттуда кусок отвечавший за разрезание stl'ок, чуток его подправил, чтобы он не был так сильно привязан к остальному коду reprap'а, сделал из него библиотеку под processing, написал на нем программку(тоже нехило позаимственную из кода репрапа)... глючит пока зверски, ибо потрачено на это было часа 3 максимум, и сделано довольно грязно, но какие-то результаты есть:
Сам объект:
Door-handle-aoi.jpg

Срез на уровне примерно 10 мм:
layer1.png
layer1.png (8.47 КиБ) Просмотров: 6215

Срез на уровне 15 мм:
layer2.png
layer2.png (8.85 КиБ) Просмотров: 6180

Re: 3D принтер (СОФТ)

Master » 29 окт 2008, 17:45

Кинь исходники позырить, твои и рапа.

Re: 3D принтер (СОФТ)

hudbrog » 29 окт 2008, 18:14

Вот тут можно посмотреть исходники репрапа:
http://reprap.svn.sourceforge.net/viewv ... prap/host/

Вот тут их можно скачать целиком:
https://sourceforge.net/project/showfil ... _id=179179

Мои(ну, условно мои.. моих там строк 30 кода, остальное - издевательство над исходниками репрапа) исходники вот:
Код: Выделить всёРазвернуть
import org.reprap.*;
import org.reprap.geometry.polygons.*;
import org.reprap.gui.*;
import org.reprap.utilities.*;

STLObject stl;
STLSlice stlsl;
RrCSGPolygonList slice;
RrGraphics rr;

void setup()
{
  size(640,640);
  background(0);
  stroke(0,255,0);
  stl = new STLObject();
  stl.addSTL("file:/c:/test.stl");
  stlsl = new STLSlice(stl);
 
  println(stlsl.maxZ());
  slice = stlsl.slice(15); 
  rr = new RrGraphics(slice.get(0));
/*  for(int i=0;i<20;i++){
    slice = stlsl.slice(i); 
    println(slice.size());
  }
  */
}

void draw(){
  point(mouseX,mouseY);
  rr.plot();
}

public class RrGraphics
{
   final color background = color (0,0,0);
   final color boxes = color(0,255,0);
   final color polygon1 = color(0,255,0);
   final color polygon0 = color(0,255,0);
   final color infill = color(0,255,120);
   final color hatch1 = color(120,255,0);
   final color hatch0 = color(120,255,120);   

   private final int frame = 600;
   private int frameWidth;
   private int frameHeight;
   private RrCSGPolygon csg_p = null;
   private boolean csgSolid = true;
   private double scale;
   private Rr2Point p_0;
   private Rr2Point pos;
   private RrBox scaledBox, originalBox;
   private boolean plot_box = false;
   
   private void setScales(RrBox b)
   {
      scaledBox = b.scale(1.2);
      
      double width = scaledBox.x().length();
      double height = scaledBox.y().length();
      if(width > height)
      {
         frameWidth = frame;
         frameHeight = (int)(0.5 + (frameWidth*height)/width);
      } else
      {
         frameHeight = frame;
         frameWidth = (int)(0.5 + (frameHeight*width)/height);
      }
      double xs = (double)frameWidth/width;
      double ys = (double)frameHeight/height;
      
      if (xs < ys)
         scale = xs;
      else
         scale = ys;   
      p_0 = new Rr2Point((frameWidth - (width + 2*scaledBox.x().low())*scale)*0.5,
            (frameHeight - (height + 2*scaledBox.y().low())*scale)*0.5);
      
      pos = new Rr2Point(width*0.5, height*0.5);
   }
   

   private void init(RrBox b)
   {
      originalBox = b;
      setScales(b);                  
   }
   
   public RrGraphics(RrCSGPolygon cp)
   {
      csg_p = cp;      
      init(csg_p.box());
   }
   

   public RrGraphics()
   {
      csg_p = null;
   }

   private Rr2Point transform(Rr2Point p)
   {
      return new Rr2Point(p_0.x() + scale*p.x(), (double)frameHeight -
            (p_0.y() + scale*p.y()));
   }

   private Rr2Point iTransform(int x, int y)
   {
      return new Rr2Point(((double)x - p_0.x())/scale, ((double)(frameHeight - y)
            - p_0.y())/scale);
   }

   private void move(Rr2Point p)
   {
      pos = transform(p);
   }

   private void plot(Rr2Point p)
   {
      Rr2Point a = transform(p);
      line((int)Math.round(pos.x()), (int)Math.round(pos.y()),
            (int)Math.round(a.x()), (int)Math.round(a.y()));
      pos = a;
   }

   private void plot(RrBox b)
   {
      if(RrBox.intersection(b, scaledBox).empty())
         return;
      
      stroke(boxes);
      move(b.sw());
      plot(b.nw());
      plot(b.ne());
      plot(b.se());
      plot(b.sw());
   }

   private void plot(RrPolygon p)
   {
      if(RrBox.intersection(p.getBox(), scaledBox).empty())
         return;
      
      move(p.point(0));
      stroke(polygon1);
      for(int i = 1; i < p.size(); i++)   
            plot(p.point(i));
      stroke(polygon0);
      plot(p.point(0));
   }

   private void plot(RrLine a, RrInterval i)
   {
      if(i.empty()) return;
      move(a.point(i.low()));
      plot(a.point(i.high()));
   }

   private void fillCSG(RrCSGPolygon q)
   {
      if(RrBox.intersection(q.box(), scaledBox).empty())
         return;
      
      if(q.c_1() != null)
      {
         fillCSG(q.c_1());
         fillCSG(q.c_2());
         fillCSG(q.c_3());
         fillCSG(q.c_4());
         return;
      }
      
      if(q.csg().operator() == RrCSGOp.NULL)
         return;
         
      stroke(infill);
      Rr2Point sw = transform(q.box().sw());
      Rr2Point ne = transform(q.box().ne());
      int x0 = (int)Math.round(sw.x());
      int y0 = (int)Math.round(sw.y());
      int x1 = (int)Math.round(ne.x());
      int y1 = (int)Math.round(ne.y());
      
      if(q.csg().operator() == RrCSGOp.UNIVERSE)
      {
         rect(x0, y1, x1 - x0 + 1, y0 - y1 + 1);
         return;
      }
      
      for(int x = x0; x <= x1; x++)
      {
         for(int y = y1; y <= y0; y++)  // Bloody backwards coordinates...
         {
            Rr2Point p = iTransform(x, y);
            double v = q.csg().value(p);
            if(v <= 0)
               rect(x, y, 1, 1);
         }
      }
      
   }
   
   private void boxCSG(RrCSGPolygon q)
   {
      if(RrBox.intersection(q.box(), scaledBox).empty())
         return;
      
      if(q.c_1() != null)
      {
         boxCSG(q.c_1());
         boxCSG(q.c_2());
         boxCSG(q.c_3());
         boxCSG(q.c_4());
         return;
      }
      plot(q.box());
   }

   private void plot(RrCSGPolygon q)
   {
      if(RrBox.intersection(q.box(), scaledBox).empty())
         return;      
      
      if(q.c_1() != null)
      {
         plot(q.c_1());
         plot(q.c_2());
         plot(q.c_3());
         plot(q.c_4());
         return;
      }
      
      stroke(polygon1);
      if(q.csg().complexity() == 1)
         plot(q.csg().plane().pLine(), q.interval1());
      else if (q.csg().complexity() == 2)
      {
         plot(q.csg().c_1().plane().pLine(), q.interval1());
         plot(q.csg().c_2().plane().pLine(), q.interval2());
      }
   }
   
   private void plot()
   {
      if(csg_p != null)
      {
         if(csgSolid)
            fillCSG(csg_p);
         
         if(plot_box)
            boxCSG(csg_p);
         else
            plot(csg_p.box());
         
         plot(csg_p);
      }
      

   }
}


И приложен архив с библиотекой которую я подготовил.
Вложения
geometry.rar
Библиотека для Processing, вырванная из лап reprap'а
(141.62 КиБ) Скачиваний: 58


Rambler\'s Top100 Mail.ru counter