Как изменить режим выбора цвета по умолчанию с HSV на RGB?

Aug 19 2020

По умолчанию Blender 2.8x - это HSV , но мне нужен RGB, как в 2.7x.

При сохранении файла запуска новые настройки не сохраняются.

В настройках можно только изменить круг на квадрат или HSV на HSL, не более того. Без круга или квадрата RGB

Ответы

8 SeyedMortezaKamali Aug 30 2020 at 11:07

нет возможности изменить тип палитры цветов на rgb

но вы можете скачать исходный код blender 2.83 и добавить возможность изменения цвета в rgb

blender-2.83.5 \ источник \ blender \ editors \ interface_region_color_picker.c

Простое решение

как вы знаете, enum имеет значение по умолчанию

enum ePickerType {
  PICKER_TYPE_RGB = 0,
  PICKER_TYPE_HSV = 1,
  PICKER_TYPE_HEX = 2,
};

по умолчанию тип палитры цветов PICKER_TYPE_HSV = 1

так что вы можете изменить его на PICKER_TYPE_RGB = 0

 static char colormode = 0;

Трудное решение Добавление в настройки

вы должны добавить случай для RGB в настройках

  switch (U.color_picker_type) {
    case USER_CP_SQUARE_SV:
      ui_colorpicker_square(block, ptr, prop, UI_GRAD_SV, cpicker);
      break;
    case USER_CP_SQUARE_HS:
      ui_colorpicker_square(block, ptr, prop, UI_GRAD_HS, cpicker);
      break;
    case USER_CP_SQUARE_HV:
      ui_colorpicker_square(block, ptr, prop, UI_GRAD_HV, cpicker);
      break;

    /* user default */
    case USER_CP_CIRCLE_HSV:
    case USER_CP_CIRCLE_HSL:
    case USER_CP_CIRCLE_RGB: # I ADD THIS CASE HERE
    default:
      ui_colorpicker_circle(block, ptr, prop, cpicker);
      break;
  }

есть функция для изменения hsv / hsl на rgb:

void ui_color_picker_to_rgb(float r_cp0, float r_cp1, float r_cp2, float *r, float *g, float *b)
{
  switch (U.color_picker_type) {
    case USER_CP_CIRCLE_HSL:
      hsl_to_rgb(r_cp0, r_cp1, r_cp2, r, g, b);
      break;
    default:
      hsv_to_rgb(r_cp0, r_cp1, r_cp2, r, g, b);
      break;
  }
}

enum ePickerType {
  PICKER_TYPE_RGB = 0,
  PICKER_TYPE_HSV = 1,
  PICKER_TYPE_HEX = 2,
};

Как работает перечисление?

 /* mode */
  yco = -1.5f * UI_UNIT_Y;
  UI_block_align_begin(block);
  bt = uiDefButC(block,
                 UI_BTYPE_ROW,
                 0,
                 IFACE_("RGB"),
                 0,
                 yco,
                 width / 3,
                 UI_UNIT_Y,
                 &colormode,
                 0.0,
                 (float)PICKER_TYPE_RGB,
                 0,
                 0,
                 "");

  UI_but_flag_disable(bt, UI_BUT_UNDO);
  UI_but_func_set(bt, ui_colorpicker_create_mode_cb, bt, NULL);
  bt->custom_data = cpicker;
  bt = uiDefButC(block,
                 UI_BTYPE_ROW,
                 0,
                 IFACE_((U.color_picker_type == USER_CP_CIRCLE_HSL) ? "HSL" : "HSV"),
                 width / 3,
                 yco,
                 width / 3,
                 UI_UNIT_Y,
                 &colormode,
                 0.0,
                 PICKER_TYPE_HSV,
                 0,
                 0,
                 "");

затем вы можете использовать эту функцию для изменения типа палитры цветов:

bpy.context.preferences.view.color_picker_type = 'CIRCLE_RGB'

Я также загрузил исходный код blender 2.79. Я обнаружил, что функция преобразования rgb в hsv может быть полезной:

2.79 \ скрипты \ аддоны \ циклы \ источник \ util \ util_color.h

ccl_device float3 rgb_to_hsv(float3 rgb)
{
    float cmax, cmin, h, s, v, cdelta;
    float3 c;

    cmax = fmaxf(rgb.x, fmaxf(rgb.y, rgb.z));
    cmin = min(rgb.x, min(rgb.y, rgb.z));
    cdelta = cmax - cmin;

    v = cmax;

    if(cmax != 0.0f) {
        s = cdelta/cmax;
    }
    else {
        s = 0.0f;
        h = 0.0f;
    }

    if(s != 0.0f) {
        float3 cmax3 = make_float3(cmax, cmax, cmax);
        c = (cmax3 - rgb)/cdelta;

        if     (rgb.x == cmax) h =        c.z - c.y;
        else if(rgb.y == cmax) h = 2.0f + c.x - c.z;
        else                   h = 4.0f + c.y - c.x;

        h /= 6.0f;

        if(h < 0.0f)
            h += 1.0f;
    }
    else {
        h = 0.0f;
    }

    return make_float3(h, s, v);
}
2 SeyedMortezaKamali Aug 30 2020 at 14:49

Глупое решение

вы можете использовать макро рекордер для изменения цветотипа !!!

когда вы меняете цветовой тип, когда он работает для других цветов, пока вы не закроете блендер

так что используйте эту программу при открытии блендера

import pyautogui

print(pyautogui.position())

pyautogui.moveTo(863,687,0.2) # Materil Position
pyautogui.click()
pyautogui.moveTo(976,677,0.2) # Color Position
pyautogui.click()
pyautogui.moveTo(834,559,0.2) # Change The Color Type to RGB
pyautogui.click()