Страница 1 из 2

Image2gcode обрезка краев [РЕШЕНО]

Добавлено: 19 дек 2012, 12:26
Гармонист
image-to-gcode v3.3.zip
image-to-gcode v3.3 с функцией обрезки краев
(7.81 КБ) 912 скачиваний
image-to-gcode v3.4.zip
исправил баг когда шаг больше 1 строки, причесал код, ...
(8.34 КБ) 1101 скачивание
Image2gcode или image-to-gcode или "Картинку в код"
Представляет из себя скрипт к LinuxCNC, написанный на Python лежит в /usr/bin
Устанавливается вместе с LinuxCNC(старое назнание EMC2), поэтому для тех кто хочет пользоваться(попробовать), придется установить Ubuntu и LinuxCNC или записать на диск и загрузиться с него.
соответственно чтобы установить(точнее обновить) image-to-gcode до v3.3 - нужно: скачать, распаковать(желательно вначале куда-нибудь на рабочий стол или в документы), а потом с правами администратора переместить с заменой в /usr/bin
Чтобы запустить: Ubunru - LinuxCNC - Файл - Открыть - Тип файла картина - автоматически запускается image-to-gcode.
настройки image-to-gcode Porog depth(units) (10908 просмотров) <a class='original' href='./download/file.php?id=10613&mode=view' target=_blank>Загрузить оригинал (153.94 КБ)</a>
настройки image-to-gcode Porog depth(units)
Глубина рельефа рисунка задается параметром "Глубина". На моем примере я выставил 9мм.
Если Porog depth > 0(в моем примере 0.01мм),
то все что глубже(ниже, больше) 9мм - 0.01мм = 8.99мм - считается фоном и будет обрезано с краев.
Очевидно, что если Porog depth = 0, то image-to-gcode работает в обычном режиме.

как это работает в картинках:
g-код полученный image-to-gcode Porog depth = 0 (10908 просмотров) <a class='original' href='./download/file.php?id=10616&mode=view' target=_blank>Загрузить оригинал (51.52 КБ)</a>
g-код полученный image-to-gcode Porog depth = 0
g-код полученный image-to-gcode Porog depth = 0.001 (10908 просмотров) <a class='original' href='./download/file.php?id=10617&mode=view' target=_blank>Загрузить оригинал (43.54 КБ)</a>
g-код полученный image-to-gcode Porog depth = 0.001
и собственно - требуемый резутат:
g-код рамки, черновой проход, фреза 6мм плоская (10874 просмотра) <a class='original' href='./download/file.php?id=10716&mode=view' target=_blank>Загрузить оригинал (43.18 КБ)</a>
g-код рамки, черновой проход, фреза 6мм плоская
:D
Делал из 2х половинок, а потом сшивал(вручную). На скрине я запечатлел как заканчивается выризатся первая половина и начала резать 2ую...

Хочу обратить твое внимание, что я не знал(и наверное не знаю) Python, но это не помешало мне разобраться и за 3 недели дописать функционал согласно поставленной задаче. Это я к тому что бы ты не оправдывал свою лень словами "Ну я же не знаю Python, а учить - долго..." :attention:
Думаю каждый кто хотя бы немного писал на С или С++ может читать и дописывать тексты написанные на Python.
Поэтому для тех кто желает доработать image-to-gcode или использовать алгоритмы в своих разработках: (для просмотра содержимого нажмите на ссылку)
Хочу выразить благодарность за книгу "Язык программирования Python" авторов "Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач"

А еще вот это видео мне очень помогло:
https://www.youtube.com/watch?v=bZZTeKPRSLQ

Итак, основаная функция это понятное дело - содать текст g-кода, который выводит в поток вывода(как результат функции). Т.е. при запуске скрипта из терминала - выводит текст g-кода в строку терминала.
Сам текст g-кода создает специальный класс с названием как ни странно Gcode. Этот класс подключается через библиотеку rs274.
Вот так:

Код: Выделить всё

from rs274.author import Gcode
import rs274.options
Как я понял - библиотека скомпилированная, поэтому просто прочесть код - не получится, но на просторах и-нета я нашел текст. Между прочим написали эту библиотеку те же Chris Radek и Jeff Epler, кто написал image-to-gcode.
Итак текст библиотеки:
gcodesaver.py.zip
библиотека создания g-кода по массиву точек в формате (X,Y,Z)
(2.76 КБ) 653 скачивания
Значения полей формы сохраняются в файл "~/.image2gcoderc" чтобы в следующий раз не выставлять снова тоже самое.
Поля формы задаются в функции optionmenu массивы constructors, defaults и texts

Код: Выделить всё

    def optionmenu(*options): return lambda f, v: _optionmenu(f, v, *options)

    rc = os.path.expanduser("~/.image2gcoderc")
    constructors = [
        ("units", optionmenu(_("G20 (in)"), _("G21 (mm)"))),
        ("invert", checkbutton),
        ("normalize", checkbutton),
        ("expand", optionmenu(_("None"), _("White"), _("Black"))),
        ("tolerance", floatentry),
        ("pixel_size", floatentry),
        ("feed_rate", floatentry),
        ("plunge_feed_rate", floatentry),
        ("spindle_speed", floatentry),
        ("pattern", optionmenu(_("Rows"), _("Columns"), _("Rows then Columns"), _("Columns then Rows"))),
        ("converter", optionmenu(_("Positive"), _("Negative"), _("Alternating"), _("Up Milling"), _("Down Milling"))),
        ("depth", floatentry),
        ("pixelstep", intscale),
        ("tool_diameter", floatentry),
        ("safety_height", floatentry),
        ("tool_type", optionmenu(_("Ball End"), _("Flat End"), _("30 Degree"), _("45 Degree"), _("60 Degree"))),
        ("bounded", optionmenu(_("None"), _("Secondary"), _("Full"))),
        ("contact_angle", floatentry),
        ("roughing_offset", floatentry),
        ("roughing_depth", floatentry),
    ]

    defaults = dict(
        invert = False,
        normalize = False,
        expand = 0,
        pixel_size = .006,
        depth = 0.25,
        pixelstep = 8,
        tool_diameter = 1/16.,
        safety_height = .012,
        tool_type = 0,
        tolerance = .001,
        feed_rate = 12,
        plunge_feed_rate = 12,
        units = 0,
        pattern = 0,
        converter = 0,
        bounded = 0,
        contact_angle = 45,
        spindle_speed = 1000,
        roughing_offset = .1,
        roughing_depth = .25,
    )

    texts = dict(
        invert=_("Invert Image"),
        normalize=_("Normalize Image"),
        expand=_("Extend Image Border"),
        pixel_size=_("Pixel Size (Units)"),
        depth=_("Depth (units)"),
        tolerance=_("Tolerance (units)"),
        pixelstep=_("Stepover (pixels)"),
        tool_diameter=_("Tool Diameter (units)"),
        tool_type=_("Tool Type"),
        feed_rate=_("Feed Rate (units per minute)"),
        plunge_feed_rate=_("Plunge Feed Rate (units per minute)"),
        units=_("Units"),
        safety_height=_("Safety Height (units)"),
        pattern=_("Scan Pattern"),
        converter=_("Scan Direction"),
        bounded=_("Lace Bounding"),
        contact_angle=_("Contact Angle (degrees)"),
        spindle_speed=_("Spindle Speed (RPM)"),
        roughing_offset=_("Roughing offset (units, 0=no roughing)"),
        roughing_depth=_("Roughing depth per pass (units)"),
    )
...
Последовательность вызовов функций: convert - one_pass - [mill_cols/mill_rows] - g.flush() - g.douglas()

основная функция создающая g-кода называется convert
в ней сразу же инициализируется класс Gcode базовыми параметрами типа "безопастная высота", "скорость шпинделя",...

Код: Выделить всё

self.g = g = Gcode(safetyheight=self.safetyheight,
                           tolerance=self.tolerance,
                           spindle_speed=self.spindle_speed,
                           units=self.units)
далее начинается цикл по ПРЕДВАРИТЕЛЬНЫМ черновым проходам:

Код: Выделить всё

if self.roughing_delta and self.roughing_offset:
            base_image = self.image
            rough = make_tool_shape(ball_tool,
                                2*self.roughing_offset, self.pixelsize)
            w, h = base_image.shape
            tw, th = rough.shape
            w1 = w + tw
            h1 = h + th
            nim1 = numarray.zeros((w1, h1), 'Float32') + base_image.min()
            nim1[tw/2:tw/2+w, th/2:th/2+h] = base_image
            self.image = numarray.zeros((w,h), type="Float32")
            for j in range(0, w):
                progress(j,w)
                for i in range(0, h):
                    self.image[j,i] = (nim1[j:j+tw,i:i+th] - rough).max()
            self.feed = self.roughing_feed
            r = -self.roughing_delta
            m = self.image.min()
            self.ro = self.roughing_offset
            while r > m:
                self.rd = r
                [color=#FF0000]self.one_pass()[/color]
                r = r - self.roughing_delta
            if r < m + epsilon:
                self.rd = m
                [color=#FF0000]self.one_pass()[/color]
            self.image = base_image
            self.cache.clear()
после черновых проходов создается основной проход:

Код: Выделить всё

        self.feed = self.base_feed
        self.ro = 0
        self.rd = self.image.min()
        [color=#FF0000]self.one_pass()[/color]
код создается через вызовы функции one_pass. В зависимости от разных параметров вызываются или mill_cols или mill_rows...

Код: Выделить всё

    def one_pass(self):
        g = self.g
        g.set_feed(self.feed)

        if self.convert_cols and self.cols_first_flag:
            self.g.set_plane(19)
            self.[color=#FF0000]mill_cols[/color](self.convert_cols, True)
            if self.convert_rows: g.safety()
        if self.convert_rows:
            self.g.set_plane(18)
            self.[color=#FF0000]mill_rows[/color](self.convert_rows, not self.cols_first_flag)
        if self.convert_cols and not self.cols_first_flag:
            self.g.set_plane(19)
            if self.convert_rows: g.safety()
            self.[color=#FF0000]mill_cols[/color](self.convert_cols, not self.convert_rows)
        if self.convert_cols:
            self.convert_cols.reset()
        if self.convert_rows:
            self.convert_rows.reset()
        g.safety()
в эту(one_pass) функцию передаются настройки через класс self, которые предварительно устанавливаются в convert-е
в one_pass в свою очередь вызывает функции mill_cols или mill_rows в зависимости от настроек...

Код: Выделить всё

    def mill_rows(self, convert_scan, primary):
        w1 = self.w1; h1 = self.h1;
        pixelsize = self.pixelsize; pixelstep = self.pixelstep
        jrange = range(0, w1, pixelstep)
        if w1-1 not in jrange: jrange.append(w1-1)
        irange = range(h1)

        for j in jrange:
            progress(jrange.index(j), len(jrange))

            #--------------------------------------
            #Здесь я и определяю с какого и по какой пиксель - начинается и заканчивается рельеф, а что считать фоном
            row_y_first = 0;
            if self.Porog_depth == 0:
               row_y_last  = len(irange);
            else:
               row_y_last  = 0;
               if self.invert:
                 maxfon = self.Porog_depth*(-1)
               else:
                 maxfon = (self.image.min()+self.Porog_depth);
               for i in irange:

                  #**************************************************************************************************
                  #код определяющий высоту я взял из функции get_z() и переделал
                  #т.к. get_z() определяет высоту с учтом чернового прохода, а нужно брать оригинал...
                  try:
                      hhh1 = min(0, self.cache[i,j])
                  except KeyError:
                      m1 = self.image[j:j+self.ts,i:i+self.ts]
                      self.cache[i,j] = d = (m1 - self.tool).max()
                      hhh1 = min(0,d)
                  #**************************************************************************************************

                  if self.invert:
                        if hhh1 <= maxfon: row_y_last  = i
                        else:
                           if row_y_last == 0: row_y_first = i
                  else:
                        if hhh1 >= maxfon: row_y_last  = i
                        else:
                           if row_y_last == 0: row_y_first = i
               if row_y_first > 0: row_y_first = row_y_first -1
               if row_y_last < len(irange): row_y_last = row_y_last +1
            #--------------------------------------
            
            y = (w1-j) * pixelsize
            scan = []
            for i in irange:
                if i >= row_y_first and i<= row_y_last:
                    x = i * pixelsize
                    milldata = (i, (x, y, self.get_z(i, j)),
                        self.get_dz_dx(i, j), self.get_dz_dy(i, j))
                    scan.append(milldata)
            if len(scan) != 0:
              for flag, points in convert_scan(primary, scan):
                if flag:
                    self.entry_cut(self, points[0][0], j, points)
                for p in points:
                    self.g.cut(*p[1])
            self.g.flush()

Код: Выделить всё

    def mill_cols(self, convert_scan, primary):
        w1 = self.w1; h1 = self.h1;
        pixelsize = self.pixelsize; pixelstep = self.pixelstep
        jrange = range(0, h1, pixelstep)
        irange = range(w1)
        if h1-1 not in jrange: jrange.append(h1-1)
        jrange.reverse()

        for j in jrange:
            progress(jrange.index(j), len(jrange))

            #--------------------------------------
            #Здесь я и определяю с какого и по какой пиксель - начинается и заканчивается рельеф, а что считать фоном
            row_y_first = 0;
            if self.Porog_depth == 0:
               row_y_last  = len(irange);
            else:
               row_y_last  = 0;
               if self.invert:
                 maxfon = self.Porog_depth*(-1)
               else:
                 maxfon = (self.image.min()+self.Porog_depth);
               for i in irange:

                  #**************************************************************************************************
                  #код определяющий высоту я взял из функции get_z() и переделал
                  #т.к. get_z() определяет высоту с учтом чернового прохода, а нужно брать оригинал...
                  try:
                      hhh1 = min(0, self.cache[j,i])
                  except KeyError:
                      m1 = self.image[i:i+self.ts,j:j+self.ts]
                      self.cache[j,i] = d = (m1 - self.tool).max()
                      hhh1 = min(0,d)
                  #**************************************************************************************************

                  if self.invert:
                        if hhh1 <= maxfon: row_y_last  = i
                        else:
                           if row_y_last == 0: row_y_first = i
                  else:
                        if hhh1 >= maxfon: row_y_last  = i
                        else:
                           if row_y_last == 0: row_y_first = i
               if row_y_first > 0: row_y_first = row_y_first -1
               if row_y_last < len(irange): row_y_last = row_y_last +1
            #--------------------------------------

            x = j * pixelsize
            scan = []
            for i in irange:
                if i >= row_y_first and i<= row_y_last:
                    y = (w1-i) * pixelsize
                    milldata = (i, (x, y, self.get_z(j, i)),
                      self.get_dz_dy(j, i), self.get_dz_dx(j, i))
                    scan.append(milldata)

            if len(scan) != 0:
              for flag, points in м(primary, scan):
                if flag:
                    self.entry_cut(self, j, points[0][0], points)
                for p in points:
                    self.g.cut(*p[1])
            self.g.flush()
Функция entry_cut - создает код врезания в заготовку (такая вертикальная палочка в верхнем правом углу).
И самое главное: self.g.flush() - создает текст g-кода по точкам предварительно заполненного массива self.g.cuts. Предварительно массив g.cuts заполняется значениями через функцию self.g.cut(*p[1])

Код: Выделить всё

    def cut(self, x=None, y=None, z=None):
        if self.cuts:
            lastx, lasty, lastz = self.cuts[-1]
        else:
            lastx, lasty, lastz = self.lastx, self.lasty, self.lastz
        if x is None: x = lastx
        if y == None: y = lasty
        if z == None: z = lastz
        self.cuts.append([x,y,z])

    def flush(self):
        if not self.cuts: return
        for x, y, z in douglas(self.cuts, self.tolerance):
            self.move_common(x, y, z, gcode="G1")
        self.cuts = []
К стати: на этом видео обратите внимание в ArtCAM - не наблюдается аналогичного функционала,
поэтому так много лишних движений при чистовой обработке. Тем более, что скорость при чистовой обработке стараются сделать поменьше, для получения более качественной поверхности, тем самым - лишие движения сильно замедляют общее время производства единицы изделия.

https://www.youtube.com/watch?v=5sUC3ceoako
но в нем более оптимальна черновая обработка, :think: которая проходит по спирали, а там где уже прошла на предыдущих слоях - не обрабатывает за ненадобностью - тем самым оптимизируя черновой проход.
Надеюсь аналогичный функционал найти(сделать :roll: ) в Linux решениях.
Тема была отделена от: Станок с ЧПУ из деревянных досок своими руками #56.

Re: Image2gcode обрезка краев

Добавлено: 20 дек 2012, 11:19
Nick
А какой край ты хочешь обрезать? Тупо квадрат вокруг рисунка?

Re: Image2gcode обрезка краев

Добавлено: 20 дек 2012, 11:44
Гармонист
Nick писал(а):А какой край ты хочешь обрезать? Тупо квадрат вокруг рисунка?
Конечно не просто квадрат вокруг рисунка. Если бы я хотел просто обрезать квадрат вокруг, то я открыл бы в Gimp-е и в нем бы обрезал...
хочу обрезать весь фон до краев как в bmp2cnc:

на форуме наткнулся на тему Картинку в УП
в которой есть ссылка на программу bmp2cnc аналог image-to-gcode
стало интересно, а умеет ли она обрезать края или нет? Оказывается умеет. Называется "отсечь лишние для обработки плоскости"
Вот в этом уроке
рисунок в bmp2cnc (11068 просмотров) <a class='original' href='./download/file.php?id=10313&mode=view' target=_blank>Загрузить оригинал (135.59 КБ)</a>
рисунок в bmp2cnc
3d рельеф построенный bmp2cnc (11068 просмотров) <a class='original' href='./download/file.php?id=10310&mode=view' target=_blank>Загрузить оригинал (85.01 КБ)</a>
3d рельеф построенный bmp2cnc
Здесь в шестом диалоге программы есть очень полезная функция, которая, кстати, в других маститых программах часто реализуется "со скрипом".
Нажатием одной кнопки можно отсечь лишние для обработки плоскости, чем существенно укоротить время обработки.
Мы отсекаем нижнюю плоскость - и наша модель принимает окончательный вид:
после отсечения лишних для обработки плоскостей (11068 просмотров) <a class='original' href='./download/file.php?id=10311&mode=view' target=_blank>Загрузить оригинал (113.22 КБ)</a>
после отсечения лишних для обработки плоскостей
g-код после обрезки краев (11068 просмотров) <a class='original' href='./download/file.php?id=10312&mode=view' target=_blank>Загрузить оригинал (33.98 КБ)</a>
g-код после обрезки краев
еще понравилась функция предварительно отображающая 3d рельеф по изображению... надеюсь когда-нибудь такая функция появится в image-to-gcode

Re: Image2gcode обрезка краев

Добавлено: 20 дек 2012, 19:53
Nick
хмм... посмотрим...
Гармонист писал(а):еще понравилась функция предварительно отображающая 3d рельеф по изображению...
А это что значит?

Re: Image2gcode обрезка краев

Добавлено: 21 дек 2012, 10:11
Гармонист
Nick писал(а):А это что значит?
в image2gcode ты видешь только картинку. Так вот неплохо было бы чтобы в дополнительном поле отображался 3d рельеф, построенный по картинке, который можно покрутить, приблизить, со всех сторон рассмотреть, сохранить в формате obj :roll:
а главное - поиграться параметром "высота картинки" и посмотреть как будет выглядеть рельеф... иногда это сильно ускорило подготовку... я помню как в начале "испортил" несколько заготовок прежде чем подобрал подходящую "высоту рельефа".

Посмотри в моем посте изображение с названием "3d рельеф построенный bmp2cnc" и ты сразу поймешь о чем я.

конечно это(поднять рельеф из изображения) можно сделать в Blender-e - поэтому это "бантик", но - очень красивый "бантик" )))
и его стоит реализовывать в последнюю очередь.

Re: Image2gcode обрезка краев

Добавлено: 21 дек 2012, 12:59
Nick
Про обрезку краев попробуем что-нибудь сделать.
Гармонист писал(а):конечно это(поднять рельеф из изображения) можно сделать в Blender-e - поэтому это "бантик", но - очень красивый "бантик" )))
и его стоит реализовывать в последнюю очередь.
Да, в блендере за 2 минуты :):
Добавляем объект grid
Делаем ему subdivision 100х100 или 200х200 (в меню Tool shelf (T))
Снимок-21.png (11038 просмотров) <a class='original' href='./download/file.php?id=10351&mode=view' target=_blank>Загрузить оригинал (77.97 КБ)</a>
Создаем новую текстуру и выбираем для нее наше изображение
Снимок-22.png (11038 просмотров) <a class='original' href='./download/file.php?id=10350&mode=view' target=_blank>Загрузить оригинал (163.78 КБ)</a>
Снимок-23.png (11038 просмотров) <a class='original' href='./download/file.php?id=10349&mode=view' target=_blank>Загрузить оригинал (165.18 КБ)</a>
Добавляем нашему Grid модификатор Displace и устанавливаем нашу текстуру.
Снимок-24.png (11038 просмотров) <a class='original' href='./download/file.php?id=10348&mode=view' target=_blank>Загрузить оригинал (179.28 КБ)</a>
Потом крутим-вертим strenght:
Снимок-25.png (11038 просмотров) <a class='original' href='./download/file.php?id=10347&mode=view' target=_blank>Загрузить оригинал (281.16 КБ)</a>
Снимок-27.png (11038 просмотров) <a class='original' href='./download/file.php?id=10346&mode=view' target=_blank>Загрузить оригинал (343.23 КБ)</a>

Re: Image2gcode обрезка краев

Добавлено: 03 янв 2013, 01:08
Гармонист
фуух... сделал. Урааааа.... :D :relsa:
image-to-gcode.zip
image-to-gcode с функцией обрезки краев
(7.78 КБ) 699 скачиваний
конечно нужно причесать(на русский перевести, назвать переменные почеловечески,...), но я уже доволен. :D
оказывается файл: "~/.image2gcoderc" - это не файл русификации, а файл где сохраняются переменные формы,
файл русификации предстоит найти...

Пользоваться просто: устанавливаем параметр "Porog depth". Значение в миллиметрах. Все что ниже этого значения будет обрезано с краев.
"С краев" - значит что если от-g-кодить круг внутри которого - глубина хоть и будет ниже порога, но обрезана не будет. По сути алгоритм находит первое и последнее значения больше порога и все что внутри - жекодит(превращает в же-код).

Позже опишу(и вставлю картинки) все что я прочел в коде, чтобы все желающие могли его допилить :rasp: по своему усмотрению...

Re: Image2gcode обрезка краев

Добавлено: 03 янв 2013, 09:28
nkp
Гармонист писал(а):файл русификации предстоит найти...
в скрипте используется gettext
файл /usr/share/locale/ru/LC_MESSAGES/emc2.mo (если емс установленная в систему)
и DIR_УСТАНОВКИ/share/locale/ru/LC_MESSAGES/linuxcnc.mo (если емс установленная из исхоников)

Re: Image2gcode обрезка краев

Добавлено: 04 янв 2013, 01:34
Nick
:good: Завтра по-тестируем! :)

Re: Image2gcode обрезка краев - исправленная

Добавлено: 04 янв 2013, 09:55
Гармонист
image-to-gcode.zip
image-to-gcode v3.2 - исправлен глюк в режиме "по строкам"
(7.79 КБ) 639 скачиваний
был такой глюк (10941 просмотр) <a class='original' href='./download/file.php?id=10570&mode=view' target=_blank>Загрузить оригинал (286.69 КБ)</a>
был такой глюк
после исправления (10941 просмотр) <a class='original' href='./download/file.php?id=10573&mode=view' target=_blank>Загрузить оригинал (49.52 КБ)</a>
после исправления
как это работает в картинках:
так сказать - ДО:
image-to-gcode Porog depth = 0 (10941 просмотр) <a class='original' href='./download/file.php?id=10571&mode=view' target=_blank>Загрузить оригинал (51.52 КБ)</a>
image-to-gcode Porog depth = 0
и собственно - ПОСЛЕ:
image-to-gcode Porog depth = 0.001 (10941 просмотр) <a class='original' href='./download/file.php?id=10572&mode=view' target=_blank>Загрузить оригинал (43.54 КБ)</a>
image-to-gcode Porog depth = 0.001
работает в режимах: строк, столбцов, при инвертировании, при нормализации и при черновых проходах.
В режимах фрезеровки вверх и вниз не тестировал, т.к. не разобрался зачем они нужны.

Re: Image2gcode обрезка краев

Добавлено: 05 янв 2013, 13:19
Гармонист
1. нашел еще один недочет:
ближайшую точку фона нужно оставлять(не удалять), считая её частью рисунка.
Демонстрирую:
image-to-gcode без обрезки краев (10925 просмотров) <a class='original' href='./download/file.php?id=10585&mode=view' target=_blank>Загрузить оригинал (67.15 КБ)</a>
image-to-gcode без обрезки краев
image-to-gcode с обрезкой краев (10925 просмотров) <a class='original' href='./download/file.php?id=10586&mode=view' target=_blank>Загрузить оригинал (44.5 КБ)</a>
image-to-gcode с обрезкой краев
т.е. с краев будет вырезан не весь рельеф :attention:
это нужно исправить... :thinking:

2. беспокоит вот что:
image-to-gcode компенсация диаметра инструмента (10925 просмотров) <a class='original' href='./download/file.php?id=10591&mode=view' target=_blank>Загрузить оригинал (21.98 КБ)</a>
image-to-gcode компенсация диаметра инструмента
image-to-gcode компенсация диаметра инструмента 2.png (10925 просмотров) <a class='original' href='./download/file.php?id=10588&mode=view' target=_blank>Загрузить оригинал (29.89 КБ)</a>
image-to-gcode компенсация диаметра инструмента 3.png
image-to-gcode компенсация диаметра инструмента 3.png (10.01 КБ) 10925 просмотров
image-to-gcode компенсация диаметра инструмента 4.png
image-to-gcode компенсация диаметра инструмента 4.png (5.42 КБ) 10925 просмотров
3. вот тут мы обсуждали что на всякий случай лучше сделать перемычки чтобы при совмещении 2х половинок не было проблем.
Вот я их сделал:
вертикальный шов
вертикальный шов
шов 1 при разрезе рисунка.jpg (1.53 КБ) 10925 просмотров
горизонтальный шов
горизонтальный шов
шов 2 при разрезе рисунка.jpg (1.14 КБ) 10925 просмотров
получил g-код:
image-to-gcode вертикальный шов при разрезе рисунка (10925 просмотров) <a class='original' href='./download/file.php?id=10594&mode=view' target=_blank>Загрузить оригинал (51.12 КБ)</a>
image-to-gcode вертикальный шов при разрезе рисунка
недоглядел бирюзовую линию и испортил заготовку (10214 просмотров) <a class='original' href='./download/file.php?id=17370&mode=view' target=_blank>Загрузить оригинал (85.17 КБ)</a>
недоглядел бирюзовую линию и испортил заготовку
все - ок
image-to-gcode горизонтальный шов при разрезе рисунка - Отсутствует (10925 просмотров) <a class='original' href='./download/file.php?id=10595&mode=view' target=_blank>Загрузить оригинал (35.4 КБ)</a>
image-to-gcode горизонтальный шов при разрезе рисунка - Отсутствует
В настройках image-to-gcode я выставлял шаг - 9 строк рисунка. А шов толщиной 2, 3 пикселя(строки). Мне кажется, что image-to-gcode все же не анализирует соседние строки(см.п2), т.е. он(image-to-gcode) тупо "перескочил" горизонтальный шов. :?
А вертикальный шов он не может перескочить т.к. анализарует всегда каждый пиксель...

Хотя провел тест и он показывает, что я в чем-то ошибаюсь:
Image2gcode компенсация диаметра инструмента 1 (10925 просмотров) <a class='original' href='./download/file.php?id=10596&mode=view' target=_blank>Загрузить оригинал (112.11 КБ)</a>
Image2gcode компенсация диаметра инструмента 1
Image2gcode компенсация диаметра инструмента 2 (10925 просмотров) <a class='original' href='./download/file.php?id=10597&mode=view' target=_blank>Загрузить оригинал (116.33 КБ)</a>
Image2gcode компенсация диаметра инструмента 2
видите, несмотря на то что первые несколько строк это фон, Image2gcode не сделал прямую линию как в первом случае...
этот тест говорит, что диаметр инструмента играет роль и соседние строки Image2gcode анализирует... :think:

Re: Image2gcode обрезка краев версия 3.3

Добавлено: 05 янв 2013, 17:05
Гармонист
image-to-gcode v3.3.zip
image-to-gcode v3.3
(7.81 КБ) 610 скачиваний
исправил трабл в прошлом посте:
было
image-to-gcode с обрезкой краев.png (10916 просмотров) <a class='original' href='./download/file.php?id=10603&mode=view' target=_blank>Загрузить оригинал (44.5 КБ)</a>
Ник, сделай пожалуйста, чтобы картинка уменишалась как здесь,
т.е. в теге img как в attachment

стало
исправлено (10919 просмотров) <a class='original' href='./download/file.php?id=10601&mode=view' target=_blank>Загрузить оригинал (31.34 КБ)</a>
исправлено

Re: Image2gcode обрезка краев

Добавлено: 05 янв 2013, 18:48
Nick
Гармонист писал(а):Ник, сделай пожалуйста, чтобы картинка уменишалась как здесь,
т.е. в теге img как в attachment
А это никак, только аттачить заново - тэг img не обрабатывается на сервере, просто преобразуется в <img>, а все аттачи обрабатываются.

PS все никак не посмотреть, на можернизированную версию.
Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.

Re: Image2gcode обрезка краев

Добавлено: 06 янв 2013, 09:54
Гармонист
Nick писал(а):Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.
можно,
но добавятся движения на поднятие инструмента на безопастную высоту и на опускание с безопастной высоты вконце холостого хода,
из-за этого может получиться медленнее чем просто прорезать,
правда если скорость холостого хода в несколько раз превышает скорость реза - эффект будет положительный, да и меньше износ инструмента...
Но все же, если есть возможность: лучше разрезать модель на куски, делать отдельные УП по каждому косочку, а потом все УП слить в одну УП.
Гармонист писал(а): Мне кажется, что image-to-gcode все же не анализирует соседние строки(см.п2), т.е. он(image-to-gcode) тупо "перескочил" горизонтальный шов.
Хотя провел тест и он показывает, что я в чем-то ошибаюсь:
Действительно - я ошибся.
перемычка в ж-коде (10911 просмотров) <a class='original' href='./download/file.php?id=10606&mode=view' target=_blank>Загрузить оригинал (24.82 КБ)</a>
перемычка в ж-коде
перемычка в ж-коде (10911 просмотров) <a class='original' href='./download/file.php?id=10607&mode=view' target=_blank>Загрузить оригинал (23.51 КБ)</a>
перемычка в ж-коде
оказалось я неверно выставлял "диаметр инструмента" = 0,1мм (тип - конусная 60 градусов)
думал у вершины конуса фрезы из-за биений фрезера фреза ходит на 0,1мм ...
а мерять нужно было у основания конуса, т.е. у концевика фрезы - а это 15мм. :monkey:

Re: Image2gcode анализ ризурка под глом

Добавлено: 06 янв 2013, 10:39
Гармонист
Идея(цель - все таже - минимизация холостого хода, оптимизация УП):
было бы хорошо научить Image-to-gcode анализировать не только "горизонтально/вертикально", а под углом.
Потому что некоторые элементы(в моем случае - ножки рамки и некоторые элементы) расположены под углом и эффективнее было бы чтобы и g-код получался вдоль оси элемента(для минимизации холостого хода).

Конечно можно вырезать из модели ножки развернуть из так чтобы они были не под углом а вертикально(горизонтально) и затем сделать g-код, но как потом сшить все в одну УП если каждый кусок будет под своим углом лежать, (а заготовку вертеть для каждого куска - это рабский труд), правда если на станке поворотный стол... :think:

Вобщем - выход:
или сделать чтобы Image-to-gcode анализировала рисунок под любым углом(а не только 90 и 180 градусов)
или поворачивать сделанный Image-to-gcode g-код - кажется на форуме попадалась такая функция...?

Re: Image2gcode обрезка краев

Добавлено: 06 янв 2013, 10:40
Гармонист
Идея 2: хорошо научить Image-to-gcode анализировать модель не только под углом, но и по заданной траектории(в моем случае - было бы круто анализ по элипсу). :roll:
Это можно сделать если перенести весь функционал Image-to-gcode в Gcodetools и там... ;)

Re: Image2gcode обрезка краев [РЕШЕНО]

Добавлено: 06 янв 2013, 12:55
Nick
по идее сделать можно. Только надо как-то к этому всему интерфейс придумать. Само по себе все не очень сложное, но вот сделать удобный и понятный интерфейс - не так уж и просто.....

Re: Image2gcode обрезка краев [РЕШЕНО]

Добавлено: 07 янв 2013, 11:30
nkp
Гармонист писал(а):Сам текст g-кода создает специальный класс с названием как ни странно Gcode. Этот класс подключается через библиотеку rs274.Вот так:Код: Выделить всё • Развернутьfrom rs274.author import Gcodeimport rs274.optionsКак я понял - библиотека скомпилированная, поэтому просто прочесть код - не получится, но на просторах и-нета я нашел текст. Между прочим написали эту библиотеку те же Chris Radek и Jeff Epler, кто написал image-to-gcode.
хочеться разобраться в работе данной программы (преследуются свои цели - с питоном знаком недавно (отсюда все вытекающие...) - но пытаюсь реализовать на нем(питоне) некоторые задумки)
так вот просматривая код и данную тему возникли такие мысли и вопросы
вначале импортируются модули ,среди которых:

Код: Выделить всё

from rs274.author import Gcode
import rs274.options
то есть искать их в path (директория rs274)
и так и есть - /usr/lib/pymodules/python2.6/rs274 - папка с модулями author.py и options.py (они и импортируются)
а вот в какой строке импортируется gcodesaver.py ???????
да, функции этого модуля используются в скрипте - отсюда и вопрос...

Re: Image2gcode обрезка краев [РЕШЕНО]

Добавлено: 07 янв 2013, 15:26
Nick
nkp писал(а):а вот в какой строке импортируется gcodesaver.py
А с чего ты взял, что он импортируется?

Re: Image2gcode обрезка краев [РЕШЕНО]

Добавлено: 07 янв 2013, 15:28
nkp
Nick писал(а):А с чего ты взял, что он импортируется?
да тс немного ввел в заблуждение (или я сам себя :) )
потом уже разобрался