Complement color (#131)

* feat : is_valid_color function added #122

* fix : filter_color function updated #122

* feat : color_complement function added

* fix : filter_color function updated #122

* fix : autopep8 #122

* fix : tests updated #122

* fix : tests updated #131

* fix : docstring updated #131

* fix : minor edit in tests #131

* fix : tests updated #131

* fix : minor edit in tests #131

* fix : minor edit in tests #131

* fix : minor edit in tests #131

* doc : README updated #131

* doc : CHANGELOG updated #131

* doc : docstring updated #131
pull/130/head
Sepand Haghighi 2022-05-17 17:54:04 +04:30 zatwierdzone przez GitHub
rodzic eda38916f6
commit df9cf76f34
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
6 zmienionych plików z 135 dodań i 25 usunięć

Wyświetl plik

@ -5,8 +5,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- `is_valid_color` function
- `color_complement` function
- `select_color` function
### Changed
- Random mode modified
- Complementary color support for `color` and `bgcolor` parameters
- `filter_color` function modified
## [0.7] - 2022-05-04
### Added
- `fill_data` function

Wyświetl plik

@ -175,10 +175,11 @@ Samila is a generative art generator written in Python, Samila let's you create
* Supported colors are available in `VALID_COLORS` list
* `color` and `bgcolor` parameters supported formats:
1. Color name (example: `yellow`)
2. RGB/RGBA (example: `(0.1,0.1,0.1)`, `(0.1,0.1,0.1,0.1)`)
3. Hex (example: `#eeefff`)
4. Random (example: `random`)
1. Color name (example: `color="yellow"`)
2. RGB/RGBA (example: `color=(0.1,0.1,0.1)`, `color=(0.1,0.1,0.1,0.1)`)
3. Hex (example: `color="#eeefff"`)
4. Random (example: `color="random"`)
5. Complement (example: `color="complement", bgcolor="blue"`)
### Regeneration
```pycon

Wyświetl plik

@ -157,10 +157,11 @@
"source": [
"* `color` and `bgcolor` parameters supported formats:\n",
"\n",
" 1. Color name (example: `yellow`)\n",
" 2. RGB/RGBA (example: `(0.1,0.1,0.1)`, `(0.1,0.1,0.1,0.1)`)\n",
" 3. Hex (example: `#eeefff`)\n",
" 4. Random (example: `random`)"
" 1. Color name (example: `color=\"yellow\"`)\n",
" 2. RGB/RGBA (example: `color=(0.1,0.1,0.1)`, `color=(0.1,0.1,0.1,0.1)`)\n",
" 3. Hex (example: `color=\"#eeefff\"`)\n",
" 4. Random (example: `color=\"random\"`)\n",
" 5. Complement (example: `color=\"complement\", bgcolor=\"blue\"`)"
]
},
{

Wyświetl plik

@ -95,17 +95,70 @@ def distance_calc(s1, s2):
return distances[-1]
def filter_color(color):
def is_valid_color(color):
"""
Filter given color and return it.
Check that input color format is valid or not.
:param color: given color
:type color: str or tuple
:return: filtered version of color
:type color: any format
:return: result as bool
"""
try:
_ = matplotlib.colors.to_hex(color)
return True
except ValueError:
return False
def color_complement(color):
"""
Calculate complement color.
:param color: given color (hex format)
:type color: str
:return: complement color (hex format) as str
"""
color = color[1:]
color = int(color, 16)
comp_color = 0xFFFFFF ^ color
comp_color = "#%06X" % comp_color
return comp_color
def filter_color(color, bgcolor):
"""
Filter given color and bgcolor.
:param color: given color
:type color: any format
:param bgcolor: given background color
:type bgcolor: any format
:return: filtered version of color and bgcolor
"""
color = select_color(color)
bgcolor = select_color(bgcolor)
if color == "COMPLEMENT" and bgcolor == "COMPLEMENT":
return None, None
if color == "COMPLEMENT":
bgcolor = matplotlib.colors.to_hex(bgcolor)
color = color_complement(bgcolor)
if bgcolor == "COMPLEMENT":
color = matplotlib.colors.to_hex(color)
bgcolor = color_complement(color)
return color, bgcolor
def select_color(color):
"""
Select color and return it.
:param color: given color
:type color: any format
:return: color
"""
if isinstance(color, tuple):
return color
if isinstance(color, str):
if color.upper() == "COMPLEMENT":
return "COMPLEMENT"
if color.upper() == "RANDOM":
return random_hex_color_gen()
if re.match(HEX_COLOR_PATTERN, color):
@ -114,6 +167,8 @@ def filter_color(color):
VALID_COLORS))
min_distance = min(distance_list)
return VALID_COLORS[distance_list.index(min_distance)]
if is_valid_color(color):
return color
return None
@ -196,7 +251,7 @@ def plot_params_filter(
raise samilaPlotError(PLOT_DATA_ERROR.format(1))
if g.data2 is None:
raise samilaPlotError(PLOT_DATA_ERROR.format(2))
color, bgcolor = map(filter_color, [color, bgcolor])
color, bgcolor = filter_color(color, bgcolor)
projection = filter_projection(projection)
alpha = filter_float(alpha)
linewidth = filter_float(linewidth)

Wyświetl plik

@ -2,6 +2,36 @@
"""
>>> import random
>>> from samila.functions import *
>>> is_valid_color("blue")
True
>>> is_valid_color((0,0,0))
True
>>> is_valid_color((0.1,0.1,0,1))
True
>>> is_valid_color([1,1,1,1])
True
>>> is_valid_color([1,1,1,1,1,1])
False
>>> is_valid_color("nothing")
False
>>> is_valid_color("#FFFAAF")
True
>>> color_complement("#FFFFFF")
'#000000'
>>> color_complement("#FFAFBF")
'#005040'
>>> color_complement("#000000")
'#FFFFFF'
>>> select_color("blue")
'blue'
>>> select_color("#FFFFFA")
'#FFFFFA'
>>> select_color((0.1,0.1,0.1))
(0.1, 0.1, 0.1)
>>> select_color(2)
>>> select_color(None)
>>> select_color("complement")
'COMPLEMENT'
>>> s = list(float_range(1,1.5,0.1))
>>> s
[1.0, 1.1, 1.2000000000000002, 1.3000000000000003, 1.4000000000000004]
@ -13,16 +43,16 @@ False
False
>>> is_same_data(s,[])
False
>>> filter_color("yellow")
'yellow'
>>> filter_color((0.2,0.3,0.4))
(0.2, 0.3, 0.4)
>>> filter_color("#FFFFFF")
'#FFFFFF'
>>> filter_color("yellow", "blue")
('yellow', 'blue')
>>> filter_color((0.2,0.3,0.4), (0.2,0.3,0.4,1))
((0.2, 0.3, 0.4), (0.2, 0.3, 0.4, 1))
>>> filter_color("#FFFFFF", "#ffffe1")
('#FFFFFF', '#ffffe1')
>>> random.seed(2)
>>> color1 = filter_color("random")
>>> color1, bgcolor1 = filter_color("random", "random")
>>> random.seed(3)
>>> color2 = filter_color("RANDOM")
>>> color2, bgcolor2 = filter_color("RANDOM", "RANDOM")
>>> color1 == color2
False
>>> random.seed(2)
@ -35,8 +65,10 @@ False
7
>>> len(color2)
7
>>> filter_color(2)
>>> filter_color(4)
>>> filter_color(2,2)
(None, None)
>>> filter_color(4,3)
(None, None)
>>> filter_size(2)
>>> filter_size((2, 'test'))
>>> filter_size((2, 3.5))

Wyświetl plik

@ -73,6 +73,21 @@ True
>>> g.plot(projection=Projection.POLAR, color=(.1, .2, .8))
>>> g.color
(0.1, 0.2, 0.8)
>>> g.plot(projection=Projection.POLAR, color="#FFFFF1", bgcolor="complement")
>>> g.color
'#fffff1'
>>> g.bgcolor
'#00000E'
>>> g.plot(projection=Projection.POLAR, color="complement", bgcolor="#AAAAAA")
>>> g.color
'#555555'
>>> g.bgcolor
'#aaaaaa'
>>> g.plot(projection=Projection.POLAR, color="complement", bgcolor="complement")
>>> g.color
'#555555'
>>> g.bgcolor
'#aaaaaa'
>>> g.plot(bgcolor=(.1, .2, .8), spot_size=0.1)
>>> g.plot(size=(20, 20))
>>> g.size