def get_thick_samples(self, which: str, thickness: int = -1) -> ThickSpline: """TODO: what is get_thick_samples doing? """ logg = logging.getLogger(f"c.{__name__}.get_thick_samples") # logg.debug(f"Start get_thick_samples") valid_which = self.get_valid_type(which) if thickness == -1: thickness = self.thickness # compute the thick version when needed if valid_which not in self.spline_thick_samples: logg.debug( f"Loading thick spline: {valid_which}, thickness {thickness}") self.spline_thick_samples[valid_which] = compute_long_thick_spline( self.spline_seq[valid_which], thickness) # save the thickness of the loaded letter self.spline_loaded_thickness[valid_which] = thickness # reload the info if the thickness changed if self.spline_loaded_thickness[valid_which] != thickness: logg.debug( f"Reloading thick spline: {valid_which}, thickness {thickness}" ) self.spline_thick_samples[valid_which] = compute_long_thick_spline( self.spline_seq[valid_which], thickness) # save the thickness of the loaded letter self.spline_loaded_thickness[valid_which] = thickness return self.spline_thick_samples[valid_which]
def ex_long_spline(spline_sequence, thickness): """ """ fig, ax = plt.subplots() spline_samples = compute_long_thick_spline(spline_sequence, thickness) for glyph in spline_samples: for segment in glyph: ax.plot(*segment, color="k", marker=".", ls="") # plot everything plot_utils.plot_build(fig, ax)
def fill_ligature_info( input_str: str, letters_info: Dict[str, Letter], x_stride: float, data_dir: Path, ligature_dir: Path, thickness: int, ) -> Tuple[Dict[str, LigatureInfo], Dict[str, ThickSpline]]: """TODO: what is fill_ligature_info doing? """ logg = logging.getLogger(f"c.{__name__}.fill_ligature_info") logg.debug(f"Start fill_ligature_info") # where to keep the connection info ligature_info: Dict[str, LigatureInfo] = {} thick_con_info: Dict[str, ThickSpline] = {} for i in range(len(input_str) - 1): # get the current pair pair = input_str[i:i + 2] logg.debug(f"\nDoing pair: {pair}") # compute info for this pair if needed if pair not in ligature_info: f_let = letters_info[pair[0]] s_let = letters_info[pair[1]] ligature_info[pair] = compute_letter_alignement( f_let, s_let, x_stride, data_dir, ligature_dir) else: logg.debug(f"Pair already computed") # link all the spline info full_spline_con = [ligature_info[pair].f_gly_chop] full_spline_con.extend(ligature_info[pair].spline_seq_con) # shift the second glyph s_gly_chop = deepcopy(ligature_info[pair].s_gly_chop) shift = ligature_info[pair].shift translate_spline_sequence([s_gly_chop], shift, 0) full_spline_con.append(s_gly_chop) # precompute the full thick ligature information full_thick_con = compute_long_thick_spline(full_spline_con, thickness) thick_con_info[pair] = full_thick_con return ligature_info, thick_con_info
def plot_letter(pf_input_spline, thickness, color="k"): """ """ logg = logging.getLogger(f"c.{__name__}.plot_letter") logg.debug(f"Starting plot_letter") spline_sequence = load_spline(pf_input_spline) # logg.debug(f"spline_sequence: {spline_sequence}") # inches to point ratio = 4 / 1000 # find plot dimension xlim, ylim = find_spline_sequence_bbox(spline_sequence) wid = xlim[1] - xlim[0] hei = ylim[1] - ylim[0] fig_dims = (wid * ratio, hei * ratio) fig = plt.figure(figsize=fig_dims, frameon=False) fig.canvas.set_window_title(f"{pf_input_spline.stem}") ax = fig.add_axes((0, 0, 1, 1)) ax.set_axis_off() spline_samples = compute_long_thick_spline(spline_sequence, thickness) colors = ["b", "g", "r", "c", "m", "y", "k"] i = 0 for glyph in spline_samples: for segment in glyph: if color == "cycle": mod = i % len(colors) ax.plot(*segment, color=colors[mod], marker=".", ls="") elif color in colors: ax.plot(*segment, color=color, marker=".", ls="") else: ax.plot(*segment, color="k", marker=".", ls="") i += 1
def ex_align_letters_2(pf_spline_left, pf_spline_right, thickness): """TODO: what is ex_align_letters_2 doing? """ logg = logging.getLogger(f"c.{__name__}.ex_align_letters_2") logg.debug(f"\nStart ex_align_letters_2") spline_sequence_l = load_spline(pf_spline_left) spline_sequence_r = load_spline(pf_spline_right) # find a proper x_stride for this pair of files x_stride = find_align_stride((*spline_sequence_l, *spline_sequence_r)) t_align2_start = timer() spline_sequence_con, r_x_shift_al, con_line_coeff = align_letter_2( spline_sequence_l, spline_sequence_r, x_stride ) t_align2_end = timer() logg.debug(f"Time to align_letter_2: {t_align2_end - t_align2_start:.6f}") # translate the right spline along x axis translate_spline_sequence(spline_sequence_r, r_x_shift_al, 0) # compute the thick spline spline_samples_con = compute_long_thick_spline(spline_sequence_con, thickness) spline_samples_l = compute_long_thick_spline(spline_sequence_l, thickness) spline_samples_r = compute_long_thick_spline(spline_sequence_r, thickness) # find dimension of the plot xlim, ylim = find_spline_sequence_bbox(spline_sequence_l) xlim, ylim = find_spline_sequence_bbox(spline_sequence_r, xlim, ylim) # inches to point ratio = 6 / 1000 wid = xlim[1] - xlim[0] hei = ylim[1] - ylim[0] fig_dims = (wid * ratio, hei * ratio) # create plot fig = plt.figure(figsize=fig_dims, frameon=False) ax = fig.add_axes((0, 0, 1, 1)) fig.canvas.set_window_title(f"A2 {pf_spline_left.stem} - {pf_spline_right.stem}") ax.set_axis_off() # colors = False colors = True if colors: col_list = ["g", "r", "y"] else: col_list = ["k", "k", "k"] for i, spline in enumerate( [spline_samples_r, spline_samples_con, spline_samples_l] ): style = {"color": f"{col_list[i]}", "marker": ".", "ls": ""} # logg.debug(f"style: {style}") for glyph in spline: for segment in glyph: ax.plot(*segment, **style) # plot the line used left_last_op = spline_sequence_l[-1][0] right_first_op = spline_sequence_r[0][-1] l_line_x_sample = np.linspace(left_last_op.x, right_first_op.x) l_line_y_a_sample = poly_model(l_line_x_sample, con_line_coeff, flip_coeff=True) ax.plot(l_line_x_sample, l_line_y_a_sample, color="c", ls=":", marker="")
def ex_align_letters_1(pf_spline_left, pf_spline_right, thickness): """TODO: what is ex_align_letters_1 doing? Align letters * high_up/high_up: vi * high_up/high_down: vm * low_up/low_up: mi """ logg = logging.getLogger(f"c.{__name__}.ex_align_letters_1") logg.debug(f"\nStart ex_align_letters_1") recap = f"pf_spline_left.stem: {pf_spline_left.stem}" recap += f" pf_spline_right.stem {pf_spline_right.stem}" logg.debug(recap) # load the points in the splines spline_sequence_l = load_spline(pf_spline_left) spline_sequence_r = load_spline(pf_spline_right) # find a proper x_stride for this pair of files x_stride = find_align_stride((*spline_sequence_l, *spline_sequence_r)) t_align1_start = timer() spline_sequence_con, gly_chop_l, gly_chop_r, best_shift = align_letter_1( spline_sequence_l, spline_sequence_r, x_stride ) t_align1_end = timer() logg.debug(f"Time to align_letter_1: {t_align1_end - t_align1_start:.6f}") # translate the right spline along x axis translate_spline_sequence(spline_sequence_r, best_shift, 0) # change the last/first glyphs of the splines spline_sequence_l[-1] = gly_chop_l spline_sequence_r[0] = gly_chop_r # compute the thick spline spline_samples_con = compute_long_thick_spline(spline_sequence_con, thickness) spline_samples_l = compute_long_thick_spline(spline_sequence_l, thickness) spline_samples_r = compute_long_thick_spline(spline_sequence_r, thickness) # find dimension of the plot xlim, ylim = find_spline_sequence_bbox(spline_sequence_l) xlim, ylim = find_spline_sequence_bbox(spline_sequence_r, xlim, ylim) # inches to point ratio = 6 / 1000 wid = xlim[1] - xlim[0] hei = ylim[1] - ylim[0] fig_dims = (wid * ratio, hei * ratio) # create plot fig = plt.figure(figsize=fig_dims, frameon=False) ax = fig.add_axes((0, 0, 1, 1)) fig.canvas.set_window_title(f"A1 {pf_spline_left.stem} - {pf_spline_right.stem}") ax.set_axis_off() # colors = False colors = True if colors: col_list = ["g", "r", "y"] else: col_list = ["k", "k", "k"] for i, spline in enumerate( [spline_samples_r, spline_samples_con, spline_samples_l] ): style = {"color": f"{col_list[i]}", "marker": ".", "ls": ""} # logg.debug(f"style: {style}") for glyph in spline: for segment in glyph: ax.plot(*segment, **style)