Esempio n. 1
0
def run(save_dir: str):
    pp = PPTXCreator(TemplateExample())
    title_slide = pp.add_title_slide(
        "Paragraph style example 01 - title slide")

    text = "This text has three paragraphs. This is the first.\n" \
           "Das ist der zweite ...\n" \
           "... and the third."
    text_shape = pp.add_text_box(title_slide, text, PPTXPosition(0.02, 0.24))
    text_shape.width = Inches(6)
    text_shape.height = Inches(2)
    paragraph_style = PPTXParagraphStyle()
    paragraph_style.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER
    paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[0])
    paragraph_style.line_spacing = 3
    paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[1])
    paragraph_style.level = 8
    paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[2])

    filename_pptx = os.path.join(save_dir, "paragraph_style_example_01.pptx")
    pp.save(filename_pptx, create_pdf=True, overwrite=True)
def run(save_dir: str):
    pp = PPTXCreator(TemplateExample())

    PPTXFontStyle.lanaguage_id = MSO_LANGUAGE_ID.ENGLISH_UK
    PPTXFontStyle.name = "Roboto"

    title_slide = pp.add_title_slide("General example 01 - title slide")
    font = font_title(
    )  # returns a PPTXFontStyle instance with bold paragraph and size = 32 Pt
    font.write_shape(
        title_slide.shapes.title
    )  # change paragraph attributes for all paragraphs in shape

    slide2 = pp.add_slide("General example 01 - page2")
    pp.add_slide("General example 01 - page3")
    pp.add_slide("General example 01 - page4")
    pp.add_content_slide()  # add slide with hyperlinks to all other slides

    text = "This text has three paragraphs. This is the first.\n" \
           "Das ist der zweite ...\n" \
           "... and the third."
    my_font = font_default()
    my_font.size = 16
    text_shape = pp.add_text_box(title_slide, text, PPTXPosition(0.02, 0.24),
                                 my_font)

    my_font.set(size=22,
                bold=True,
                language_id=MSO_LANGUAGE_ID.GERMAN,
                strikethrough=TEXT_STRIKE_VALUES.SingleStrike,
                caps=TEXT_CAPS_VALUES.All)

    my_font.write_paragraph(text_shape.text_frame.paragraphs[1])

    my_font.set(size=18,
                bold=False,
                italic=True,
                name="Vivaldi",
                language_id=MSO_LANGUAGE_ID.ENGLISH_UK,
                underline=MSO_TEXT_UNDERLINE_TYPE.WAVY_DOUBLE_LINE,
                color_rgb=(255, 0, 0),
                strikethrough=None,
                caps=None)

    my_font.write_paragraph(text_shape.text_frame.paragraphs[2])

    table_data = []
    table_data.append([1, 2])  # rows can have different length
    table_data.append(
        [4, slide2, 6]
    )  # there is specific type needed for entries (implemented as text=f"{entry}")
    table_data.append(["", 8, 9])

    table = pp.add_table(title_slide, table_data, PPTXPosition(0.02, 0.4))
    paragraph_style = PPTXParagraphStyle()
    paragraph_style.set(alignment=PP_PARAGRAPH_ALIGNMENT.CENTER)
    paragraph_style.write_shape(table)

    if matplotlib_installed:
        fig = create_demo_figure()
        pp.add_matplotlib_figure(fig, title_slide, PPTXPosition(0.3, 0.4))
        pp.add_matplotlib_figure(fig,
                                 title_slide,
                                 PPTXPosition(0.3, 0.4, fig.get_figwidth(),
                                              -1.0),
                                 zoom=0.4)
        pp.add_matplotlib_figure(fig,
                                 title_slide,
                                 PPTXPosition(0.3, 0.4, fig.get_figwidth(),
                                              0.0),
                                 zoom=0.5)
        pp.add_matplotlib_figure(fig,
                                 title_slide,
                                 PPTXPosition(0.3, 0.4, fig.get_figwidth(),
                                              1.5),
                                 zoom=0.6)

        pp.add_text_box(title_slide,
                        "Use latex-like syntax \nto create formula:",
                        PPTXPosition(0.748, 0.23))
        pp.add_latex_formula(f"\mu={5}^{5}", title_slide,
                             PPTXPosition(0.75, 0.35))
        formula02 = "\\int_0^\\infty e^{-x^2} dx=\\frac{\\sqrt{\\pi}}{2}"
        pp.add_latex_formula(formula02, title_slide, PPTXPosition(0.75, 0.45))
        pp.add_latex_formula(formula02,
                             title_slide,
                             PPTXPosition(0.75, 0.55),
                             font_size=24,
                             color="red")
        formula03 = "\\hat{x}, \\check{x}, \\tilde{a}, \\bar{\\ell}, \\dot{y}, \\ddot{y}, \\vec{z_1}, \\vec{z}_1"
        pp.add_latex_formula(formula03,
                             title_slide,
                             PPTXPosition(0.75, 0.65),
                             font_size=24,
                             color="blue")
        formula04 = r"\frac{3}{4} \binom{3}{4} \genfrac{}{}{0}{}{3}{4}"
        pp.add_latex_formula(formula04,
                             title_slide,
                             PPTXPosition(0.75, 0.75),
                             font_size=44,
                             color="g")
    pp.save(os.path.join(save_dir, "general_example_01.pptx"))

    try:  # only on Windows with PowerPoint installed:
        filename_pptx = os.path.join(save_dir, "general_example_01.pptx")
        filename_pdf = os.path.join(save_dir, "general_example_01.pdf")
        foldername_png = os.path.join(save_dir, "general_example_01_pngs")

        # use absolute path, because its not clear where PowerPoint saves PDF/PNG ... otherwise
        pp.save(filename_pptx, create_pdf=True, overwrite=True)
        pp.save_as_pdf(filename_pdf, overwrite=True)
        pp.save_as_png(foldername_png, overwrite_folder=True)
    except Exception as e:
        print(e)
Esempio n. 3
0
class PI88ToPPTX:
    def __init__(self, measurements_path=None, template=None):
        self.path = measurements_path
        self.measurements = []
        if self.path:
            self.load_tdm_files(measurements_path)
        self.plotter = PI88Plotter(self.measurements)
        self.pptx_creator = PPTXCreator(template=template)
        self.prs = self.pptx_creator.prs
        self.position = self.pptx_creator.default_position

        self.poisson_ratio = 0.3
        self.beta = 1.0

        self.measurements_unloading_data: dict = {}

    def load_tdm_files(self,
                       path: str,
                       sort_key=os.path.getctime
                       ):  # sorted by creation time (using windows)
        self.measurements.extend(load_tdm_files(path, sort_key))

    def add_measurements(
        self, measurements: Union[PI88Measurement,
                                  Iterable[PI88Measurement]]) -> None:
        """
        Adds a single PI88Measurement or a list o PI88Measurement's to the plotter.
        """
        if measurements:
            try:
                self.measurements.extend(measurements)
            except TypeError:
                self.measurements.append(measurements)

    def clear_measurements(self):
        self.measurements = []
        self.measurements_unloading_data = {}

    def add_matplotlib_figure(self,
                              fig: Figure,
                              slide: Slide,
                              position: PPTXPosition = None,
                              **kwargs):
        """
        :param fig:
        :param slide_index:
        :param position:
        :param kwargs: e.g. width and height
        :return: prs.shapes.picture.Picture
        """
        return self.pptx_creator.add_matplotlib_figure(fig, slide, position,
                                                       **kwargs)

    def create_summary_slide(self, title: str = None, layout=None):
        if title is None:
            title = f"Summary - {self.path}"
        result = self.pptx_creator.add_slide(title, layout)

        plotter = PI88Plotter(self.measurements)
        fig = plotter.get_load_displacement_plot()
        fig.axes[0].legend(loc="best")
        self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15))
        self.create_measurements_result_data_table(result)
        return result

    def create_modulus_hardness_summary_slide(self, layout=None):
        title = "Summary - reduced modulus and hardness"
        result = self.pptx_creator.add_slide(title, layout)

        plotter = PI88Plotter(self.measurements)
        fig = plotter.get_reduced_modulus_plot()
        self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15))
        avg_reduced_modulus = statistics.mean(fig.axes[0].lines[0].get_ydata())

        fig = plotter.get_hardness_plot()
        self.add_matplotlib_figure(fig, result, PPTXPosition(0.52, 0.15))
        avg_hardness = statistics.mean(fig.axes[0].lines[0].get_ydata())

        text = f"avg. Er = {avg_reduced_modulus} GPa   -   avg. H = {avg_hardness}"
        self.pptx_creator.add_text_box(result, text, PPTXPosition(0.05, 0.85))

        return result

    def create_title_slide(self,
                           title=None,
                           layout=None,
                           default_content=False):
        if title is None:
            title = f"NI results {self.path}"
        result = self.pptx_creator.add_title_slide(title, layout)
        self.create_measurements_meta_table(result)

        plotter = PI88Plotter(self.measurements)
        fig = plotter.get_load_displacement_plot()
        self.add_matplotlib_figure(fig, result, PPTXPosition(0.57, 0.24))
        return result

    def create_measurement_slide(self,
                                 measurement: PI88Measurement,
                                 layout=None,
                                 graph_styler=None):
        title = measurement.base_name  # filename[:-4].split("/")[-1].split("\\")[-1]
        result = self.pptx_creator.add_slide(title, layout)

        self.create_measurement_result_table(result, measurement)
        self.create_measurement_meta_data_table(result, measurement)

        plotter = PI88Plotter(measurement)
        if graph_styler is not None:
            plotter.graph_styler = graph_styler
        fig = plotter.get_load_displacement_plot()

        if (measurement, self.poisson_ratio,
                self.beta) in self.measurements_unloading_data:
            fit_data = self.measurements_unloading_data[(measurement,
                                                         self.poisson_ratio,
                                                         self.beta)]
            fit_disp, fit_load = get_power_law_fit_curve(**fit_data)
            fig.axes[0].plot(fit_disp,
                             fit_load,
                             **get_power_law_fit_curve_style().dict,
                             label="power-law-fit")

        self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15))
        return result

    def create_measurement_slides(self,
                                  measurements: Optional[
                                      List[PI88Measurement]] = None,
                                  layout=None) -> list:
        result = []
        if measurements is None:
            measurements = self.measurements

        graph_styler = GraphStyler(len(self.measurements))

        for measurement in measurements:
            result.append(
                self.create_measurement_slide(measurement, layout,
                                              graph_styler))

        return result

    def create_measurement_meta_data_table(
            self,
            slide,
            measurement,
            table_style: PPTXTableStyle = None) -> Shape:
        table_data = get_measurement_meta_table_data(measurement)
        result = self.pptx_creator.add_table(slide, table_data,
                                             PPTXPosition(0.521, 0.16))
        if table_style is None:
            table_style = style_sheets.table_no_header()
            table_style.set_width_as_fraction(0.4)
        table_style.write_shape(result)
        return result

    def _get_measurement_result_table_data(self, measurement: PI88Measurement,
                                           poisson_ratio: float,
                                           beta: float) -> list:
        if (measurement, poisson_ratio,
                beta) in self.measurements_unloading_data:
            data = self.measurements_unloading_data[(measurement,
                                                     poisson_ratio, beta)]
        else:
            data = calc_unloading_data(measurement,
                                       beta=self.beta,
                                       poisson_ratio=self.poisson_ratio)
            self.measurements_unloading_data[(measurement, poisson_ratio,
                                              beta)] = data
        return get_measurement_result_table_data(measurement, data)

    def create_measurement_result_table(
            self,
            slide,
            measurement,
            table_style: PPTXTableStyle = None) -> Shape:
        table_data = self._get_measurement_result_table_data(
            measurement, self.poisson_ratio, self.beta)

        result = self.pptx_creator.add_table(slide, table_data,
                                             PPTXPosition(0.521, 0.56))
        if table_style is None:
            table_style = style_sheets.table_no_header()
            table_style.set_width_as_fraction(0.4)
        table_style.write_shape(result)
        return result

    def create_measurements_meta_table(self,
                                       slide,
                                       table_style: PPTXTableStyle = None):
        table_data = get_measurements_meta_table_data(self.measurements)

        result = self.pptx_creator.add_table(slide, table_data)
        if table_style is None:
            table_style = table_style_measurements_meta()
        table_style.write_shape(result)
        return result

    def create_measurements_result_data_table(
            self, slide, table_style: PPTXTableStyle = None):
        for measurement in self.measurements:
            if measurement not in self.measurements_unloading_data.keys():
                self._get_measurement_result_table_data(
                    measurement, self.poisson_ratio,
                    self.beta)  # todo: better method (name change?)
        table_data = get_measurements_result_table_data(
            self.measurements_unloading_data.values())
        result = self.pptx_creator.add_table(slide, table_data)
        if table_style is None:
            table_style = table_style_summary()
        table_style.write_shape(result)
        return result

    def get_average_measurements_unloading_data(self):
        sum_Er = sum_E = sum_hardness = 0
        for data in self.measurements_unloading_data.values():
            sum_Er += data['Er']
            sum_E += data['E']
            sum_hardness += data['hardness']
        n = len(self.measurements_unloading_data.values())
        if n > 0:
            return sum_Er / n, sum_E / n, sum_hardness / n
        else:
            return 0, 0, 0

    def save(self, filename="delme.prs"):
        self.prs.save(filename)
def run(save_dir: str):
    filename_pptx = os.path.join(save_dir, "font_style_example_01.pptx")
    pp = PPTXCreator(TemplateExample())

    # default language and paragraph-type for all created PPTXFontStyle instances:
    PPTXFontStyle.lanaguage_id = MSO_LANGUAGE_ID.ENGLISH_UK
    PPTXFontStyle.name = "Roboto"

    title_slide = pp.add_title_slide("Font style example presentation")
    font = font_title(
    )  # returns a PPTXFontStyle instance with bold paragraph and size = 32 Pt
    font.write_shape(
        title_slide.shapes.title
    )  # change paragraph attributes for all paragraphs in shape

    text_01 = "This text has four paragraphs. This is the first.\n" \
              "Das ist der zweite ...\n" \
              "... the third ...\n" \
              "... and the last."

    my_font = PPTXFontStyle()
    my_font.size = 16
    text_shape_01 = pp.add_text_box(title_slide, text_01,
                                    PPTXPosition(0.02, 0.24), my_font)

    my_font.set(size=22,
                bold=True,
                language_id=MSO_LANGUAGE_ID.GERMAN,
                strikethrough=TEXT_STRIKE_VALUES.SingleStrike,
                caps=TEXT_CAPS_VALUES.All)

    my_font.write_paragraph(text_shape_01.text_frame.paragraphs[1])

    my_font.set(size=18,
                bold=False,
                italic=True,
                name="Vivaldi",
                language_id=MSO_LANGUAGE_ID.ENGLISH_UK,
                underline=MSO_TEXT_UNDERLINE_TYPE.WAVY_DOUBLE_LINE,
                color_rgb=(255, 0, 0),
                strikethrough=None,
                caps=None)

    my_font.write_paragraph(text_shape_01.text_frame.paragraphs[2])

    my_font = PPTXFontStyle()
    my_font.set(size=52, bold=True)
    my_fill = PPTXFillStyle()
    my_fill.fill_type = FillType.PATTERNED
    my_fill.fore_color_rgb = (255, 0, 0)
    my_fill.back_color_rgb = (0, 0, 255)
    from pptx.enum.dml import MSO_PATTERN_TYPE
    my_fill.pattern = MSO_PATTERN_TYPE.PERCENT_50
    my_font.fill_style = my_fill

    my_font.write_paragraph(text_shape_01.text_frame.paragraphs[3])

    text_02 = "This text uses copied paragraph."

    my_copied_font = PPTXFontStyle()
    my_copied_font.read_font(text_shape_01.text_frame.paragraphs[1].font)
    text_shape_02 = pp.add_text_box(title_slide, text_02,
                                    PPTXPosition(0.42, 0.24), my_copied_font)

    pp.save(filename_pptx, overwrite=True)