def create_from_config(self, svg_name='avatar'): """Create an avatar SVG from the configuration. TODO: * Deprecate in favor of request param based view using templates. """ payload = self.config icon_width = self.ICON_SIZE[0] icon_height = self.ICON_SIZE[1] components = [ icon_width, icon_height, Line([(0, icon_height / 2), (icon_width, icon_height / 2)], width=f'{icon_height}px', color=f"#{payload.get('Background')}") ] for k, v in payload.items(): if k not in [ 'Background', 'ClothingColor', 'HairColor', 'SkinTone' ]: components.append( build_avatar_component( f"{v.get('component_type')}/{v.get('svg_asset')}", self.ICON_SIZE)) with NamedTemporaryFile(mode='w+', suffix='.svg') as tmp: avatar = Figure(*components) avatar.save(tmp.name) with open(tmp.name) as file: if self.profile_set.exists(): svg_name = self.profile_set.last().handle self.svg.save(f"{svg_name}.svg", File(file), save=True)
def build_avatar_svg(svg_path='avatar.svg', line_color='#781623', icon_size=None, payload=None, temp=False): from .models import BaseAvatar icon_size = icon_size or BaseAvatar.ICON_SIZE icon_width = icon_size[0] icon_height = icon_size[1] if payload is None: # Sample payload payload = { 'background_color': line_color, 'icon_size': BaseAvatar.ICON_SIZE, 'avatar_size': None, 'skin_tone': '#3F2918', 'ears': { 'item_type': '0', }, 'clothing': { 'primary_color': '#18C708', 'item_type': 'cardigan', }, 'head': { 'item_type': '0', }, 'hair': { 'primary_color': '#29F998', 'item_type': '0', }, 'mouth': '0', 'nose': '0', 'eyes': '0', 'wallpaper': None } # Build the list of avatar components components = [ icon_width, icon_height, Line([(0, icon_height / 2), (icon_width, icon_height / 2)], width=f'{icon_height}px', color=payload.get('background_color')), ] customizable_components = ['clothing', 'ears', 'head', 'hair'] flat_components = ['eyes', 'mouth', 'nose', 'wallpaper'] multi_components = ['accessories'] for component in customizable_components: if component in payload: primary_color = payload.get( component, {}).get('primary_color') or payload.get('skin_tone') components.append( build_temporary_avatar_component( component_category=component, component_type=payload.get(component, {}).get('item_type', 'cardigan'), primary_color=primary_color, )) for component in flat_components: if component in payload: components.append( build_avatar_component( f"{component.title()}/{payload.get(component, '0')}.svg", icon_size)) for component in multi_components: if component in payload: components.append( build_avatar_component( f"{component.title()}/{payload.get(component)}")) final_avatar = Figure(*components) if temp: return final_avatar result_path = f'{COMPONENT_BASE}{svg_path}' final_avatar.save(result_path) return result_path
def plot_locus(grange, groupby, cellannot, files, size_factor='rdepth', tag='RG', mapq=10, frames_before=None, frames_after=None, normalize=True, palettes=sc.pl.palettes.vega_20_scanpy, add_total=True, style='fill', binsize=50, binarize=False, frame_width=40, add_labels=True, width_overlap=18., extend_window=0, save=None, **kwargs): if isinstance(grange, dict): names = [k for k in grange] ranges = [grange[k] for k in grange] elif not isinstance(grange, list): ranges = [grange] names = [''] elif isinstance(grange, list): names = [''] * len(grange) ranges = granges if frames_before is None: frames_before = Frame() if extend_window > 0: ranges = [_extend(gr, extend_window) for gr in ranges] with tempfile.TemporaryDirectory() as tmpdir: for i, (name, gr) in enumerate(zip(names, ranges)): sct = SingleCellTracks(cellannot, files, size_factor=size_factor, tag=tag, mapq=mapq) frame = copy.deepcopy(frames_before) frame.properties['title'] = name fig = sct.plot(gr, groupby, frames_before=frame, frames_after=frames_after, normalize=normalize, palettes=palettes, add_total=add_total, style=style, binsize=binsize, add_labels=add_labels if i == (len(names) - 1) else False, binarize=binarize, **kwargs) fig.savefig(os.path.join(tmpdir, f'{name}_{gr}.svg')) panel = SVG(os.path.join(tmpdir, f'{name}_{gr}.svg')) width, height = panel.width, panel.height composite_figure = Figure( f"{(width-width_overlap)*len(names)+width_overlap}pt", f"{height}pt", *[ SVG(os.path.join(tmpdir, f'{name}_{gr}.svg')).move( (width - width_overlap) * i, 0) for i, (name, gr) in enumerate(zip(names, ranges)) ]) if save is not None: composite_figure.save(save) os.makedirs(save.split('.')[0], exist_ok=True) for name, gr in zip(names, ranges): shutil.copy(os.path.join(tmpdir, f'{name}_{gr}.svg'), save.split('.')[0]) return composite_figure