LinuxCNC Features - набор мастеров для LinuxCNC

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

LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Снимок-features.ngc - AXIS 2.6.0-pre0-4385-g9c95855 on LinuxCNC-HAL-SIM-AXIS.png (216159 просмотров) <a class='original' href='./download/file.php?id=15468&mode=view' target=_blank>Загрузить оригинал (153.61 КБ)</a>
Как некоторые уже заметили я пропал на недельку. И пропадал я не зря. Наконец-то решил сделать достойную замену ngcgui.
LinuxCNC Features это тулкит для создания "мастеров". Точнее это тулкит самих "мастеров". В общем и целом LinuxCNC Features работает схоже с ngcgui, но с некоторыми отличиями. Честно говоря, с ngcgui я до конца так и не разобрался, поэтому это я считаю, что он работает схоже :freak:. (Название Features взято от кнопки в ngcgui - add feature.)
В wiki cnc-club добавлена страница о LinuxCNC Features, давайте вместе ее наполнять документацией, видео и прочими полезными материалами.
http://cnc-club.ru/wiki/index.php/LinuxCNC_Features

Текущий статус разработки

  • Дописать обработки.
  • Отловить баги :freak: .
Возможности (для просмотра содержимого нажмите на ссылку)
Что может LinuxCNC Features:
  1. Добавлять features - простые обработки
  2. Менять их порядок
  3. Группировать обработки
  4. Делать линейные и круговые массивы
  5. Встраиваться в axis LinuxCNC или работать как отдельной приложение
  6. Просматривать резултьтат в axis в редиме реального времени
  7. Сохранять шаблоны обработок
Это только пока :).
Скриншоты (для просмотра содержимого нажмите на ссылку)
Пара примеров обработки, созданной за 20 сек:
LinuxCNC-Features1.png (216448 просмотров) <a class='original' href='./download/file.php?id=14825&mode=view' target=_blank>Загрузить оригинал (158.39 КБ)</a>
LinuxCNC-Features.png (216448 просмотров) <a class='original' href='./download/file.php?id=14826&mode=view' target=_blank>Загрузить оригинал (166.41 КБ)</a>

Скрины предыдущих версий

Саме начало
LinuxCNC Features.png (216452 просмотра) <a class='original' href='./download/file.php?id=14824&mode=view' target=_blank>Загрузить оригинал (68.04 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение nkp »

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

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

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

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение nkp »

Nick писал(а):Если уж делать, то лучше, чтобы через Gкод работало, а не только через Features.
конечно - тем более что связь с интерпретатором уже есть...
осталось подробно разобратья в GLCanon:
(для просмотра содержимого нажмите на ссылку)

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

class GLCanon(Translated, ArcsToSegmentsMixin):
    lineno = -1
    def __init__(self, colors, geometry, is_foam=0):
        # traverse list - [line number, [start position], [end position], [tlo x, tlo y, tlo z]]
        self.traverse = []; self.traverse_append = self.traverse.append
        # feed list - [line number, [start position], [end position], feedrate, [tlo x, tlo y, tlo z]]
        self.feed = []; self.feed_append = self.feed.append
        # arcfeed list - [line number, [start position], [end position], feedrate, [tlo x, tlo y, tlo z]]
        self.arcfeed = []; self.arcfeed_append = self.arcfeed.append
        # dwell list - [line number, color, pos x, pos y, pos z, plane]
        self.dwells = []; self.dwells_append = self.dwells.append
        self.choice = None
        self.feedrate = 1
        self.lo = (0,) * 9
        self.first_move = True
        self.geometry = geometry
        self.min_extents = [9e99,9e99,9e99]
        self.max_extents = [-9e99,-9e99,-9e99]
        self.min_extents_notool = [9e99,9e99,9e99]
        self.max_extents_notool = [-9e99,-9e99,-9e99]
        self.colors = colors
        self.in_arc = 0
        self.xo = self.yo = self.zo = self.ao = self.bo = self.co = self.uo = self.vo = self.wo = 0
        self.dwell_time = 0
        self.suppress = 0
        self.g92_offset_x = 0.0
        self.g92_offset_y = 0.0
        self.g92_offset_z = 0.0
        self.g92_offset_a = 0.0
        self.g92_offset_b = 0.0
        self.g92_offset_c = 0.0
        self.g92_offset_u = 0.0
        self.g92_offset_v = 0.0
        self.g92_offset_w = 0.0
        self.g5x_index = 1
        self.g5x_offset_x = 0.0
        self.g5x_offset_y = 0.0
        self.g5x_offset_z = 0.0
        self.g5x_offset_a = 0.0
        self.g5x_offset_b = 0.0
        self.g5x_offset_c = 0.0
        self.g5x_offset_u = 0.0
        self.g5x_offset_v = 0.0
        self.g5x_offset_w = 0.0
        self.is_foam = is_foam
        self.foam_z = 0
        self.foam_w = 1.5
        self.notify = 0
        self.notify_message = ""

    def comment(self, arg):
        if arg.startswith("AXIS,"):
            parts = arg.split(",")
            command = parts[1]
            if command == "stop": raise KeyboardInterrupt
            if command == "hide": self.suppress += 1
            if command == "show": self.suppress -= 1
            if command == "XY_Z_POS": 
                if len(parts) > 2 :
                    try:
                        self.foam_z = float(parts[2])
                        if 210 in self.state.gcodes:
                            self.foam_z = self.foam_z / 25.4
                    except:
                        self.foam_z = 5.0/25.4
            if command == "UV_Z_POS": 
                if len(parts) > 2 :
                    try:
                        self.foam_w = float(parts[2])
                        if 210 in self.state.gcodes:
                            self.foam_w = self.foam_w / 25.4
                    except:
                        self.foam_w = 30.0
            if command == "notify":
                self.notify = self.notify + 1
                self.notify_message = "(AXIS,notify):" + str(self.notify)
                if len(parts) > 2:
                    if len(parts[2]): self.notify_message = parts[2]

    def message(self, message): pass

    def check_abort(self): pass

    def next_line(self, st):
        self.state = st
        self.lineno = self.state.sequence_number

    def draw_lines(self, lines, for_selection, j=0, geometry=None):
        return linuxcnc.draw_lines(geometry or self.geometry, lines, for_selection)

    def colored_lines(self, color, lines, for_selection, j=0):
        if self.is_foam:
            if not for_selection:
                self.color_with_alpha(color + "_xy")
            glPushMatrix()
            glTranslatef(0, 0, self.foam_z)
            self.draw_lines(lines, for_selection, 2*j, 'XY')
            glPopMatrix()
            if not for_selection:
                self.color_with_alpha(color + "_uv")
            glPushMatrix()
            glTranslatef(0, 0, self.foam_w)
            self.draw_lines(lines, for_selection, 2*j+len(lines), 'UV')
            glPopMatrix()
        else:
            if not for_selection:
                self.color_with_alpha(color)
            self.draw_lines(lines, for_selection, j)

    def draw_dwells(self, dwells, alpha, for_selection, j0=0):
        return linuxcnc.draw_dwells(self.geometry, dwells, alpha, for_selection, self.is_lathe())

    def calc_extents(self):
        self.min_extents, self.max_extents, self.min_extents_notool, self.max_extents_notool = gcode.calc_extents(self.arcfeed, self.feed, self.traverse)
        if self.is_foam:
            min_z = min(self.foam_z, self.foam_w)
            max_z = max(self.foam_z, self.foam_w)
            self.min_extents = self.min_extents[0], self.min_extents[1], min_z
            self.max_extents = self.max_extents[0], self.max_extents[1], max_z
            self.min_extents_notool = \
                self.min_extents_notool[0], self.min_extents_notool[1], min_z
            self.max_extents_notool = \
                self.max_extents_notool[0], self.max_extents_notool[1], max_z
    def tool_offset(self, xo, yo, zo, ao, bo, co, uo, vo, wo):
        self.first_move = True
        x, y, z, a, b, c, u, v, w = self.lo
        self.lo = (x - xo + self.xo, y - yo + self.yo, z - zo + self.zo, a - ao + self.ao, b - bo + self.bo, c - bo + self.bo,
          u - uo + self.uo, v - vo + self.vo, w - wo + self.wo)
        self.xo = xo
        self.yo = yo
        self.zo = zo
        self.so = ao
        self.bo = bo
        self.co = co
        self.uo = uo
        self.vo = vo
        self.wo = wo

    def set_spindle_rate(self, arg): pass
    def set_feed_rate(self, arg): self.feedrate = arg / 60.
    def select_plane(self, arg): pass

    def change_tool(self, arg):
        self.first_move = True

    def straight_traverse(self, x,y,z, a,b,c, u, v, w):
        if self.suppress > 0: return
        l = self.rotate_and_translate(x,y,z,a,b,c,u,v,w)
        if not self.first_move:
                self.traverse_append((self.lineno, self.lo, l, [self.xo, self.yo, self.zo]))
        self.lo = l

    def rigid_tap(self, x, y, z):
        if self.suppress > 0: return
        self.first_move = False
        l = self.rotate_and_translate(x,y,z,0,0,0,0,0,0)[:3]
        l += [self.lo[3], self.lo[4], self.lo[5],
               self.lo[6], self.lo[7], self.lo[8]]
        self.feed_append((self.lineno, self.lo, l, self.feedrate, [self.xo, self.yo, self.zo]))
#        self.dwells_append((self.lineno, self.colors['dwell'], x + self.offset_x, y + self.offset_y, z + self.offset_z, 0))
        self.feed_append((self.lineno, l, self.lo, self.feedrate, [self.xo, self.yo, self.zo]))

    def arc_feed(self, *args):
        if self.suppress > 0: return
        self.first_move = False
        self.in_arc = True
        try:
            ArcsToSegmentsMixin.arc_feed(self, *args)
        finally:
            self.in_arc = False

    def straight_arcsegments(self, segs):
        self.first_move = False
        lo = self.lo
        lineno = self.lineno
        feedrate = self.feedrate
        to = [self.xo, self.yo, self.zo]
        append = self.arcfeed_append
        for l in segs:
            append((lineno, lo, l, feedrate, to))
            lo = l
        self.lo = lo

    def straight_feed(self, x,y,z, a,b,c, u, v, w):
        if self.suppress > 0: return
        self.first_move = False
        l = self.rotate_and_translate(x,y,z,a,b,c,u,v,w)
        self.feed_append((self.lineno, self.lo, l, self.feedrate, [self.xo, self.yo, self.zo]))
        self.lo = l
    straight_probe = straight_feed

    def user_defined_function(self, i, p, q):
        if self.suppress > 0: return
        color = self.colors['m1xx']
        self.dwells_append((self.lineno, color, self.lo[0], self.lo[1], self.lo[2], self.state.plane/10-17))

    def dwell(self, arg):
        if self.suppress > 0: return
        self.dwell_time += arg
        color = self.colors['dwell']
        self.dwells_append((self.lineno, color, self.lo[0], self.lo[1], self.lo[2], self.state.plane/10-17))


    def highlight(self, lineno, geometry):
        glLineWidth(3)
        c = self.colors['selected']
        glColor3f(*c)
        glBegin(GL_LINES)
        coords = []
        for line in self.traverse:
            if line[0] != lineno: continue
            linuxcnc.line9(geometry, line[1], line[2])
            coords.append(line[1][:3])
            coords.append(line[2][:3])
        for line in self.arcfeed:
            if line[0] != lineno: continue
            linuxcnc.line9(geometry, line[1], line[2])
            coords.append(line[1][:3])
            coords.append(line[2][:3])
        for line in self.feed:
            if line[0] != lineno: continue
            linuxcnc.line9(geometry, line[1], line[2])
            coords.append(line[1][:3])
            coords.append(line[2][:3])
        glEnd()
        for line in self.dwells:
            if line[0] != lineno: continue
            self.draw_dwells([(line[0], c) + line[2:]], 2, 0)
            coords.append(line[2:5])
        glLineWidth(1)
        if coords:
            x = reduce(lambda x,y:x+y, [c[0] for c in coords]) / len(coords)
            y = reduce(lambda x,y:x+y, [c[1] for c in coords]) / len(coords)
            z = reduce(lambda x,y:x+y, [c[2] for c in coords]) / len(coords)
        else:
            x = (self.min_extents[0] + self.max_extents[0])/2
            y = (self.min_extents[1] + self.max_extents[1])/2
            z = (self.min_extents[2] + self.max_extents[2])/2
        return x, y, z

    def color_with_alpha(self, name):
        glColor4f(*(self.colors[name] + (self.colors.get(name+'_alpha', 1/3.),)))
    def color(self, name):
        glColor3f(*self.colors[name])

    def draw(self, for_selection=0, no_traverse=True):
        if not no_traverse:
            glEnable(GL_LINE_STIPPLE)
            self.colored_lines('traverse', self.traverse, for_selection)
            glDisable(GL_LINE_STIPPLE)
        else:
            self.colored_lines('straight_feed', self.feed, for_selection, len(self.traverse))

            self.colored_lines('arc_feed', self.arcfeed, for_selection, len(self.traverse) + len(self.feed))

            glLineWidth(2)
            self.draw_dwells(self.dwells, self.colors.get('dwell_alpha', 1/3.), for_selection, len(self.traverse) + len(self.feed) + len(self.arcfeed))
            glLineWidth(1)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

О, прикольно! надо будет изучить на досуге.

Я вот по поводу смены инструмента думаю...
А ведь включать СОЖ лучше наверное в cutting paramters?

Т.е. на смену остается только ТхМ6...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

по сож, когда ее включать/выключать? Перед / после фичи, или непосредственно при резе, и на холостой пробег G0 его отключать?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение nkp »

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

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Не, ну выключать надо, например при смене инструмента, или при измерениях пробником...
Я думаю надо между фичами поставить вкл/выкл (так просто проще :freak:).... Точнее так делаем sub flood и его вызываем в нужных фичах...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

хммм добавил flood и mist в set-cutting parameters вышло дофига... :thinking:
Вложения
linuxcnc-features-set-cutting-parameters.png (2324 просмотра) <a class='original' href='./download/file.php?id=16064&mode=view' target=_blank>Загрузить оригинал (186.79 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение nkp »

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

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Да, уже думал об этом :)

Только вот как его проверить?

-------------

сделал :)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение nkp »

функцию под кнопку забыл вставить:

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

		if keyname == "Insert" :
			[b]self.add() [/b]
			return True
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Добавил возможность импорта сохраненных фич через каталог - тег <import src=""/>
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Что-то мы запустили Features! :pssdoff:
Сделал торцевание, и снял видео по токарной обработке с features!
там на видео я говорил о непонятном косяке с обработкой торца - все дело оказалось в том, что у меня стоял G64, очень большая скорость и маленькое ускорение. Таким образом LinuxCNC сгладил торец :freak:
https://www.youtube.com/watch?v=_THbTBY5BBM
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Serg »

Сейчас AG400 запустим и я наверно подключусь - буду к нему прикручивать и пробовать.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

Пока вы все тут думаете, запостил тему на chipmaker, будем еще народ подтягивать :)
http://www.chipmaker.ru/topic/114602/pa ... p__1858663
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение aftaev »

Nick писал(а):Пока вы все тут думаете, запостил тему на chipmaker, будем еще народ подтягивать
ты же бесконечный цикл замутил, на чипмекере тож ссылку на эту тему дал, а здесь на чипмекер :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Starik
Опытный
Сообщения: 136
Зарегистрирован: 13 май 2012, 21:22
Репутация: 17
Откуда: Долгопрудный

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Starik »

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

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

О, точно, надо сделать!

А что в смене прописать, просто выбор номера? Или что-то еще надо?
ЗЫ сейчас можно сменять инструмент из Gкода, есть фича - просто 5 строк Gкода.
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение tooshka »

Nick писал(а):А что в смене прописать, просто выбор номера? Или что-то еще надо?
ЗЫ сейчас можно сменять инструмент из Gкода, есть фича - просто 5 строк Gкода.
А как каждый инструмент настраивать? Какая то табличка есть?
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LinuxCNC Features - набор мастеров для LinuxCNC

Сообщение Nick »

В LinuxCNC есть таблица интсрументов.
Или можно через Gкод G10
http://linuxcnc.org/docs/html/gcode/gco ... ec:G10-L1_

Кстати, надо будет этот G10 в features тоже добавить... наверное ... или его как-то сразу с probing скрестить?
Ответить

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