ฉันจะเปลี่ยนโหมดตัวเลือกสีเริ่มต้นจาก HSV เป็น RGB ได้อย่างไร

Aug 19 2020

Blender 2.8x default คือHSVแต่ฉันต้องการRGBเหมือนใน 2.7x

การบันทึกไฟล์เริ่มต้นไม่ได้เก็บการตั้งค่าใหม่

ในการตั้งค่าการตั้งค่าเราสามารถเปลี่ยนวงกลมเป็นสี่เหลี่ยมจัตุรัสหรือ HSV เป็น HSL เท่านั้นไม่มีอะไรเพิ่มเติม ไม่มี RGB วงกลมหรือสี่เหลี่ยม

คำตอบ

8 SeyedMortezaKamali Aug 30 2020 at 11:07

ไม่มีตัวเลือกในการเปลี่ยนประเภทตัวเลือกสีเป็น rgb

แต่คุณสามารถดาวน์โหลด source of blender 2.83 และเพิ่มตัวเลือกในการเปลี่ยนสีเป็น rgb

blender-2.83.5 \ source \ 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;

Hard Solution เพิ่มการตั้งค่า

คุณควรเพิ่มกรณีสำหรับ 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,
};

enum ทำงานอย่างไร?

 /* 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 \ scripts \ addons \ cycles \ source \ 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()