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

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

image-to-gcode v3.3.zip
image-to-gcode v3.3 с функцией обрезки краев
(7.81 КБ) 873 скачивания
image-to-gcode v3.4.zip
исправил баг когда шаг больше 1 строки, причесал код, ...
(8.34 КБ) 1055 скачиваний
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) (10458 просмотров) <a class='original' href='./download/file.php?id=10613&sid=97b6768b529c2e003c91f0fcfa335351&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 (10458 просмотров) <a class='original' href='./download/file.php?id=10616&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (51.52 КБ)</a>
g-код полученный image-to-gcode Porog depth = 0
g-код полученный image-to-gcode Porog depth = 0.001 (10458 просмотров) <a class='original' href='./download/file.php?id=10617&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (43.54 КБ)</a>
g-код полученный image-to-gcode Porog depth = 0.001
и собственно - требуемый резутат:
g-код рамки, черновой проход, фреза 6мм плоская (10424 просмотра) <a class='original' href='./download/file.php?id=10716&sid=97b6768b529c2e003c91f0fcfa335351&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 КБ) 625 скачиваний
Значения полей формы сохраняются в файл "~/.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 решениях.
Последний раз редактировалось Гармонист 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 - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

А какой край ты хочешь обрезать? Тупо квадрат вокруг рисунка?
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

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

на форуме наткнулся на тему Картинку в УП
в которой есть ссылка на программу bmp2cnc аналог image-to-gcode
стало интересно, а умеет ли она обрезать края или нет? Оказывается умеет. Называется "отсечь лишние для обработки плоскости"
Вот в этом уроке
рисунок в bmp2cnc (10618 просмотров) <a class='original' href='./download/file.php?id=10313&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (135.59 КБ)</a>
рисунок в bmp2cnc
3d рельеф построенный bmp2cnc (10618 просмотров) <a class='original' href='./download/file.php?id=10310&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (85.01 КБ)</a>
3d рельеф построенный bmp2cnc
Здесь в шестом диалоге программы есть очень полезная функция, которая, кстати, в других маститых программах часто реализуется "со скрипом".
Нажатием одной кнопки можно отсечь лишние для обработки плоскости, чем существенно укоротить время обработки.
Мы отсекаем нижнюю плоскость - и наша модель принимает окончательный вид:
после отсечения лишних для обработки плоскостей (10618 просмотров) <a class='original' href='./download/file.php?id=10311&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (113.22 КБ)</a>
после отсечения лишних для обработки плоскостей
g-код после обрезки краев (10618 просмотров) <a class='original' href='./download/file.php?id=10312&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (33.98 КБ)</a>
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 - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

хмм... посмотрим...
Гармонист писал(а):еще понравилась функция предварительно отображающая 3d рельеф по изображению...
А это что значит?
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

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 - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

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

Сообщение Гармонист »

фуух... сделал. Урааааа.... :D :relsa:
image-to-gcode.zip
image-to-gcode с функцией обрезки краев
(7.78 КБ) 661 скачивание
конечно нужно причесать(на русский перевести, назвать переменные почеловечески,...), но я уже доволен. :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 - почему все так в нашем мире
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

Гармонист писал(а):файл русификации предстоит найти...
в скрипте используется gettext
файл /usr/share/locale/ru/LC_MESSAGES/emc2.mo (если емс установленная в систему)
и DIR_УСТАНОВКИ/share/locale/ru/LC_MESSAGES/linuxcnc.mo (если емс установленная из исхоников)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

:good: Завтра по-тестируем! :)
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

image-to-gcode.zip
image-to-gcode v3.2 - исправлен глюк в режиме "по строкам"
(7.79 КБ) 604 скачивания
был такой глюк (10491 просмотр) <a class='original' href='./download/file.php?id=10570&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (286.69 КБ)</a>
был такой глюк
после исправления (10491 просмотр) <a class='original' href='./download/file.php?id=10573&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (49.52 КБ)</a>
после исправления
как это работает в картинках:
так сказать - ДО:
image-to-gcode Porog depth = 0 (10491 просмотр) <a class='original' href='./download/file.php?id=10571&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (51.52 КБ)</a>
image-to-gcode Porog depth = 0
и собственно - ПОСЛЕ:
image-to-gcode Porog depth = 0.001 (10491 просмотр) <a class='original' href='./download/file.php?id=10572&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (43.54 КБ)</a>
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 - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

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

2. беспокоит вот что:
image-to-gcode компенсация диаметра инструмента (10475 просмотров) <a class='original' href='./download/file.php?id=10591&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (21.98 КБ)</a>
image-to-gcode компенсация диаметра инструмента
image-to-gcode компенсация диаметра инструмента 2.png (10475 просмотров) <a class='original' href='./download/file.php?id=10588&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (29.89 КБ)</a>
image-to-gcode компенсация диаметра инструмента 3.png
image-to-gcode компенсация диаметра инструмента 3.png (10.01 КБ) 10475 просмотров
image-to-gcode компенсация диаметра инструмента 4.png
image-to-gcode компенсация диаметра инструмента 4.png (5.42 КБ) 10475 просмотров
3. вот тут мы обсуждали что на всякий случай лучше сделать перемычки чтобы при совмещении 2х половинок не было проблем.
Вот я их сделал:
вертикальный шов
вертикальный шов
шов 1 при разрезе рисунка.jpg (1.53 КБ) 10475 просмотров
горизонтальный шов
горизонтальный шов
шов 2 при разрезе рисунка.jpg (1.14 КБ) 10475 просмотров
получил g-код:
image-to-gcode вертикальный шов при разрезе рисунка (10475 просмотров) <a class='original' href='./download/file.php?id=10594&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (51.12 КБ)</a>
image-to-gcode вертикальный шов при разрезе рисунка
недоглядел бирюзовую линию и испортил заготовку (9764 просмотра) <a class='original' href='./download/file.php?id=17370&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (85.17 КБ)</a>
недоглядел бирюзовую линию и испортил заготовку
все - ок
image-to-gcode горизонтальный шов при разрезе рисунка - Отсутствует (10475 просмотров) <a class='original' href='./download/file.php?id=10595&sid=97b6768b529c2e003c91f0fcfa335351&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 (10475 просмотров) <a class='original' href='./download/file.php?id=10596&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (112.11 КБ)</a>
Image2gcode компенсация диаметра инструмента 1
Image2gcode компенсация диаметра инструмента 2 (10475 просмотров) <a class='original' href='./download/file.php?id=10597&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (116.33 КБ)</a>
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 - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

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

стало
исправлено (10469 просмотров) <a class='original' href='./download/file.php?id=10601&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (31.34 КБ)</a>
исправлено
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 - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

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

PS все никак не посмотреть, на можернизированную версию.
Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

Nick писал(а):Кстати было бы прикольно, если еще добавить холостой пробег над пустыми местами внутри рисунка.
можно,
но добавятся движения на поднятие инструмента на безопастную высоту и на опускание с безопастной высоты вконце холостого хода,
из-за этого может получиться медленнее чем просто прорезать,
правда если скорость холостого хода в несколько раз превышает скорость реза - эффект будет положительный, да и меньше износ инструмента...
Но все же, если есть возможность: лучше разрезать модель на куски, делать отдельные УП по каждому косочку, а потом все УП слить в одну УП.
Гармонист писал(а): Мне кажется, что image-to-gcode все же не анализирует соседние строки(см.п2), т.е. он(image-to-gcode) тупо "перескочил" горизонтальный шов.
Хотя провел тест и он показывает, что я в чем-то ошибаюсь:
Действительно - я ошибся.
перемычка в ж-коде (10461 просмотр) <a class='original' href='./download/file.php?id=10606&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (24.82 КБ)</a>
перемычка в ж-коде
перемычка в ж-коде (10461 просмотр) <a class='original' href='./download/file.php?id=10607&sid=97b6768b529c2e003c91f0fcfa335351&mode=view' target=_blank>Загрузить оригинал (23.51 КБ)</a>
перемычка в ж-коде
оказалось я неверно выставлял "диаметр инструмента" = 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 - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

Идея(цель - все таже - минимизация холостого хода, оптимизация УП):
было бы хорошо научить 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 - почему все так в нашем мире
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

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

Сообщение Гармонист »

Идея 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 - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

по идее сделать можно. Только надо как-то к этому всему интерфейс придумать. Само по себе все не очень сложное, но вот сделать удобный и понятный интерфейс - не так уж и просто.....
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение 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 ???????
да, функции этого модуля используются в скрипте - отсюда и вопрос...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

nkp писал(а):а вот в какой строке импортируется gcodesaver.py
А с чего ты взял, что он импортируется?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

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

Сообщение nkp »

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

Вернуться в «LinuxCNC»