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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.

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

Сообщение Гармонист » 19 дек 2012, 12:26

image-to-gcode v3.3.zip
image-to-gcode v3.3 с функцией обрезки краев
(7.81 Кб) Скачиваний: 541

image-to-gcode v3.4.zip
исправил баг когда шаг больше 1 строки, причесал код, ...
(8.34 Кб) Скачиваний: 677

Image2gcode или image-to-gcode или "Картинку в код"
Представляет из себя скрипт к LinuxCNC, написанный на Python лежит в /usr/bin
Устанавливается вместе с LinuxCNC(старое назнание EMC2), поэтому для тех кто хочет пользоваться(попробовать), придется установить Ubuntu и LinuxCNC или записать на диск и загрузиться с него.
соответственно чтобы установить(точнее обновить) image-to-gcode до v3.3 - нужно: скачать, распаковать(желательно вначале куда-нибудь на рабочий стол или в документы), а потом с правами администратора переместить с заменой в /usr/bin
Чтобы запустить: Ubunru - LinuxCNC - Файл - Открыть - Тип файла картина - автоматически запускается image-to-gcode.

Image2gcode обрезка краев [РЕШЕНО] Screenshot-2.png
настройки image-to-gcode Porog depth(units)

Глубина рельефа рисунка задается параметром "Глубина". На моем примере я выставил 9мм.
Если Porog depth > 0(в моем примере 0.01мм),
то все что глубже(ниже, больше) 9мм - 0.01мм = 8.99мм - считается фоном и будет обрезано с краев.
Очевидно, что если Porog depth = 0, то image-to-gcode работает в обычном режиме.

как это работает в картинках:
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode Porog depth = 0.png
g-код полученный image-to-gcode Porog depth = 0

Image2gcode обрезка краев [РЕШЕНО] image-to-gcode Porog depth = 0.001.png
g-код полученный image-to-gcode Porog depth = 0.001


и собственно - требуемый резутат:
Image2gcode обрезка краев [РЕШЕНО] g-код рамки, черновой проход, фреза 6мм.png
g-код рамки, черновой проход, фреза 6мм плоская
:D
Делал из 2х половинок, а потом сшивал(вручную). На скрине я запечатлел как заканчивается выризатся первая половина и начала резать 2ую...

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

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

А еще вот это видео мне очень помогло:


Итак, основаная функция это понятное дело - содать текст 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 Кб) Скачиваний: 356


Значения полей формы сохраняются в файл "~/.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
                self.one_pass()
                r = r - self.roughing_delta
            if r < m + epsilon:
                self.rd = m
                self.one_pass()
            self.image = base_image
            self.cache.clear()

после черновых проходов создается основной проход:
Код: Выделить всёРазвернуть
        self.feed = self.base_feed
        self.ro = 0
        self.rd = self.image.min()
        self.one_pass()


код создается через вызовы функции 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.mill_cols(self.convert_cols, True)
            if self.convert_rows: g.safety()
        if self.convert_rows:
            self.g.set_plane(18)
            self.mill_rows(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.mill_cols(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 - не наблюдается аналогичного функционала,
поэтому так много лишних движений при чистовой обработке. Тем более, что скорость при чистовой обработке стараются сделать поменьше, для получения более качественной поверхности, тем самым - лишие движения сильно замедляют общее время производства единицы изделия.


но в нем более оптимальна черновая обработка, :think: которая проходит по спирали, а там где уже прошла на предыдущих слоях - не обрабатывает за ненадобностью - тем самым оптимизируя черновой проход.
Надеюсь аналогичный функционал найти(сделать :roll: ) в Linux решениях.

Последний раз редактировалось Гармонист 03 май 2013, 12:51, всего редактировалось 7 раз(а).
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Nick » 20 дек 2012, 11:19

А какой край ты хочешь обрезать? Тупо квадрат вокруг рисунка?
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение Гармонист » 20 дек 2012, 11:44

Nick писал(а):А какой край ты хочешь обрезать? Тупо квадрат вокруг рисунка?

Конечно не просто квадрат вокруг рисунка. Если бы я хотел просто обрезать квадрат вокруг, то я открыл бы в Gimp-е и в нем бы обрезал...
хочу обрезать весь фон до краев как в bmp2cnc:

на форуме наткнулся на тему Картинку в УП
в которой есть ссылка на программу bmp2cnc аналог image-to-gcode
стало интересно, а умеет ли она обрезать края или нет? Оказывается умеет. Называется "отсечь лишние для обработки плоскости"
Вот в этом уроке
Image2gcode обрезка краев [РЕШЕНО] 4.gif
рисунок в bmp2cnc

Image2gcode обрезка краев [РЕШЕНО] 10.gif
3d рельеф построенный bmp2cnc

Здесь в шестом диалоге программы есть очень полезная функция, которая, кстати, в других маститых программах часто реализуется "со скрипом".
Нажатием одной кнопки можно отсечь лишние для обработки плоскости, чем существенно укоротить время обработки.
Мы отсекаем нижнюю плоскость - и наша модель принимает окончательный вид:

Image2gcode обрезка краев [РЕШЕНО] 11.gif
после отсечения лишних для обработки плоскостей

Image2gcode обрезка краев [РЕШЕНО] 17.gif
g-код после обрезки краев

еще понравилась функция предварительно отображающая 3d рельеф по изображению... надеюсь когда-нибудь такая функция появится в image-to-gcode
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Nick » 20 дек 2012, 19:53

хмм... посмотрим...
Гармонист писал(а):еще понравилась функция предварительно отображающая 3d рельеф по изображению...

А это что значит?
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение Гармонист » 21 дек 2012, 10:11

Nick писал(а):А это что значит?

в image2gcode ты видешь только картинку. Так вот неплохо было бы чтобы в дополнительном поле отображался 3d рельеф, построенный по картинке, который можно покрутить, приблизить, со всех сторон рассмотреть, сохранить в формате obj :roll:
а главное - поиграться параметром "высота картинки" и посмотреть как будет выглядеть рельеф... иногда это сильно ускорило подготовку... я помню как в начале "испортил" несколько заготовок прежде чем подобрал подходящую "высоту рельефа".

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

конечно это(поднять рельеф из изображения) можно сделать в Blender-e - поэтому это "бантик", но - очень красивый "бантик" )))
и его стоит реализовывать в последнюю очередь.
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Nick » 21 дек 2012, 12:59

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

Да, в блендере за 2 минуты :):
Добавляем объект grid
Делаем ему subdivision 100х100 или 200х200 (в меню Tool shelf (T))
Image2gcode обрезка краев [РЕШЕНО] Снимок-21.png

Создаем новую текстуру и выбираем для нее наше изображение
Image2gcode обрезка краев [РЕШЕНО] Снимок-22.png
Image2gcode обрезка краев [РЕШЕНО] Снимок-23.png

Добавляем нашему Grid модификатор Displace и устанавливаем нашу текстуру.
Image2gcode обрезка краев [РЕШЕНО] Снимок-24.png

Потом крутим-вертим strenght:
Image2gcode обрезка краев [РЕШЕНО] Снимок-25.png
Image2gcode обрезка краев [РЕШЕНО] Снимок-27.png
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение Гармонист » 03 янв 2013, 01:08

фуух... сделал. Урааааа.... :D :relsa:

image-to-gcode.zip
image-to-gcode с функцией обрезки краев
(7.78 Кб) Скачиваний: 401


конечно нужно причесать(на русский перевести, назвать переменные почеловечески,...), но я уже доволен. :D
оказывается файл: "~/.image2gcoderc" - это не файл русификации, а файл где сохраняются переменные формы,
файл русификации предстоит найти...

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

Позже опишу(и вставлю картинки) все что я прочел в коде, чтобы все желающие могли его допилить :rasp: по своему усмотрению...
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение nkp » 03 янв 2013, 09:28

Гармонист писал(а):файл русификации предстоит найти...

в скрипте используется gettext
файл /usr/share/locale/ru/LC_MESSAGES/emc2.mo (если емс установленная в систему)
и DIR_УСТАНОВКИ/share/locale/ru/LC_MESSAGES/linuxcnc.mo (если емс установленная из исхоников)
nkp
Мастер
 
Сообщения: 7671
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1385
Медальки:

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

Сообщение Nick » 04 янв 2013, 01:34

:good: Завтра по-тестируем! :)
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение Гармонист » 04 янв 2013, 09:55

image-to-gcode.zip
image-to-gcode v3.2 - исправлен глюк в режиме "по строкам"
(7.79 Кб) Скачиваний: 372

Image2gcode обрезка краев [РЕШЕНО] Screenshot-3.png
был такой глюк

Image2gcode обрезка краев [РЕШЕНО] Screenshot-4.png
после исправления


как это работает в картинках:
так сказать - ДО:
Image2gcode обрезка краев [РЕШЕНО] Screenshot-1.png
image-to-gcode Porog depth = 0

и собственно - ПОСЛЕ:
Image2gcode обрезка краев [РЕШЕНО] Screenshot-2.png
image-to-gcode Porog depth = 0.001


работает в режимах: строк, столбцов, при инвертировании, при нормализации и при черновых проходах.
В режимах фрезеровки вверх и вниз не тестировал, т.к. не разобрался зачем они нужны.
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Гармонист » 05 янв 2013, 13:19

1. нашел еще один недочет:
ближайшую точку фона нужно оставлять(не удалять), считая её частью рисунка.
Демонстрирую:
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode без обрезки краев.png
image-to-gcode без обрезки краев

Image2gcode обрезка краев [РЕШЕНО] image-to-gcode с обрезкой краев.png
image-to-gcode с обрезкой краев

т.е. с краев будет вырезан не весь рельеф :attention:
это нужно исправить... :thinking:

2. беспокоит вот что:
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode компенсация диаметра инструмента.jpg
image-to-gcode компенсация диаметра инструмента

Image2gcode обрезка краев [РЕШЕНО] image-to-gcode компенсация диаметра инструмента 2.png

image-to-gcode компенсация диаметра инструмента 3.png
image-to-gcode компенсация диаметра инструмента 3.png (10.01 Кб) Просмотров: 6986

image-to-gcode компенсация диаметра инструмента 4.png
image-to-gcode компенсация диаметра инструмента 4.png (5.42 Кб) Просмотров: 6986


3. вот тут мы обсуждали что на всякий случай лучше сделать перемычки чтобы при совмещении 2х половинок не было проблем.
Вот я их сделал:
шов 1 при разрезе рисунка.jpg
вертикальный шов
шов 1 при разрезе рисунка.jpg (1.53 Кб) Просмотров: 6986

шов 2 при разрезе рисунка.jpg
горизонтальный шов
шов 2 при разрезе рисунка.jpg (1.14 Кб) Просмотров: 6986

получил g-код:
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode вертикальный шов при разрезе рисунка.png
image-to-gcode вертикальный шов при разрезе рисунка

Image2gcode обрезка краев [РЕШЕНО] недоглядел бирюзовую линию и испортил заготовку.png
недоглядел бирюзовую линию и испортил заготовку

все - ок
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode горизонтальный шов при разрезе рисунка.png
image-to-gcode горизонтальный шов при разрезе рисунка - Отсутствует


В настройках image-to-gcode я выставлял шаг - 9 строк рисунка. А шов толщиной 2, 3 пикселя(строки). Мне кажется, что image-to-gcode все же не анализирует соседние строки(см.п2), т.е. он(image-to-gcode) тупо "перескочил" горизонтальный шов. :?
А вертикальный шов он не может перескочить т.к. анализарует всегда каждый пиксель...

Хотя провел тест и он показывает, что я в чем-то ошибаюсь:
Image2gcode обрезка краев [РЕШЕНО] Image2gcode компенсация толщины инструмента 1.png
Image2gcode компенсация диаметра инструмента 1

Image2gcode обрезка краев [РЕШЕНО] Image2gcode компенсация толщины инструмента 2.png
Image2gcode компенсация диаметра инструмента 2

видите, несмотря на то что первые несколько строк это фон, Image2gcode не сделал прямую линию как в первом случае...
этот тест говорит, что диаметр инструмента играет роль и соседние строки Image2gcode анализирует... :think:
Последний раз редактировалось Гармонист 09 авг 2013, 12:04, всего редактировалось 1 раз.
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Гармонист » 05 янв 2013, 17:05

image-to-gcode v3.3.zip
image-to-gcode v3.3
(7.81 Кб) Скачиваний: 364

исправил трабл в прошлом посте:
было
Image2gcode обрезка краев [РЕШЕНО] image-to-gcode с обрезкой краев.png

Ник, сделай пожалуйста, чтобы картинка уменишалась как здесь,
т.е. в теге img как в attachment

стало
Image2gcode обрезка краев [РЕШЕНО] Screenshot.png
исправлено
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Nick » 05 янв 2013, 18:48

Гармонист писал(а):Ник, сделай пожалуйста, чтобы картинка уменишалась как здесь,
т.е. в теге img как в attachment

А это никак, только аттачить заново - тэг img не обрабатывается на сервере, просто преобразуется в <img>, а все аттачи обрабатываются.

PS все никак не посмотреть, на можернизированную версию.
Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение Гармонист » 06 янв 2013, 09:54

Nick писал(а):Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.

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

Гармонист писал(а): Мне кажется, что image-to-gcode все же не анализирует соседние строки(см.п2), т.е. он(image-to-gcode) тупо "перескочил" горизонтальный шов.
Хотя провел тест и он показывает, что я в чем-то ошибаюсь:

Действительно - я ошибся.
Image2gcode обрезка краев [РЕШЕНО] Screenshot.png
перемычка в ж-коде

Image2gcode обрезка краев [РЕШЕНО] Screenshot-1.png
перемычка в ж-коде

оказалось я неверно выставлял "диаметр инструмента" = 0,1мм (тип - конусная 60 градусов)
думал у вершины конуса фрезы из-за биений фрезера фреза ходит на 0,1мм ...
а мерять нужно было у основания конуса, т.е. у концевика фрезы - а это 15мм. :monkey:
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Гармонист » 06 янв 2013, 10:39

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

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

Вобщем - выход:
или сделать чтобы Image-to-gcode анализировала рисунок под любым углом(а не только 90 и 180 градусов)
или поворачивать сделанный Image-to-gcode g-код - кажется на форуме попадалась такая функция...?
Последний раз редактировалось Гармонист 07 янв 2013, 10:16, всего редактировалось 3 раз(а).
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Гармонист » 06 янв 2013, 10:40

Идея 2: хорошо научить Image-to-gcode анализировать модель не только под углом, но и по заданной траектории(в моем случае - было бы круто анализ по элипсу). :roll:
Это можно сделать если перенести весь функционал Image-to-gcode в Gcodetools и там... ;)
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
 
Сообщения: 411
Зарегистрирован: 24 апр 2011, 09:14
Откуда: планета Земля
Репутация: 67
Медальки:

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

Сообщение Nick » 06 янв 2013, 12:55

по идее сделать можно. Только надо как-то к этому всему интерфейс придумать. Само по себе все не очень сложное, но вот сделать удобный и понятный интерфейс - не так уж и просто.....
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение nkp » 07 янв 2013, 11:30

Гармонист писал(а):Сам текст 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 ???????
да, функции этого модуля используются в скрипте - отсюда и вопрос...
nkp
Мастер
 
Сообщения: 7671
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1385
Медальки:

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

Сообщение Nick » 07 янв 2013, 15:26

nkp писал(а):а вот в какой строке импортируется gcodesaver.py

А с чего ты взял, что он импортируется?
Аватара пользователя
Nick
Мастер
 
Сообщения: 22552
Зарегистрирован: 23 ноя 2009, 16:45
Откуда: Gatchina, Saint-Petersburg distr., Russia
Репутация: 1570
Заслуга: Developer
Медальки:

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

Сообщение nkp » 07 янв 2013, 15:28

Nick писал(а):А с чего ты взял, что он импортируется?

да тс немного ввел в заблуждение (или я сам себя :) )
потом уже разобрался
nkp
Мастер
 
Сообщения: 7671
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1385
Медальки:

След.

Вернуться в LinuxCNC

Кто сейчас на конференции

Зарегистрированные пользователи: БРДМ-2, aftaev, at90, Bing [Bot], Brynet83, Coffeein, crazydnb, Daniel, evgeni70, evgenymcp, ex71, Евжений, Google [Bot], Kupfershcmidt, Leo_1943, mikehv, NikolayUa24, niksooon, nizamus, Rom327, shalek, shtanc, spryt, verser, Yandex [bot], Тагир, шпиндель

Reputation System ©'