带有方形/圆形的 LibreOffice Impress 进度条

dam*_*dam 8 libreoffice

我想在 LibreOffice Impress 的实习演示中添加一个进度条,但我只找到了这种类型的进度条,使用宏

在此处输入图片说明

如您所见,即使我可以添加进度的百分比,也很难知道这部分有多少张幻灯片,在完成演示之前有多少张。这个宏可以在这个链接找到:

https://github.com/dasaki/Impress-Progress-Bar

现在,我想要一些看起来像波纹管的东西(抱歉,GIMP 不是绘制线条或正方形的最佳图片编辑器):

在此处输入图片说明

如果有人有解决方案或指向执行类似操作的宏的链接,我不想手动执行该方形/圆形进程,这会很脏,而且确实需要一些时间来处理它。谢谢

use*_*.dz 2

嗯,可能没那么复杂。我原本希望通过分叉该存储库来开始,但最终却从头开始编写。

目前状态,它正在工作(LibreOffice v6.0.2.1)。但是,设置并未显示在 GUI 中。

设置

  1. 工具 > 宏 > 组织宏 > LibreOffice Basic...
  2. 我的宏 > 标准:新模块将其命名为“ProgressLine”或其他名称。
  3. 选择它然后编辑,将以下代码复制到其中

    REM  *****  BASIC  *****
    
    Dim iFileNumber As Integer
    Dim iSectionCount As Integer
    Dim iSectionPage As Integer
    Dim iSectionIndex As Integer
    Dim iSectionIndexCurrent As Integer
    
    Dim oDocument As Object
    Dim oPage As Object
    Dim iPageCount As Integer
    Dim oPositionPageMark As New com.sun.star.awt.Point
    Dim oSizePageMark As New com.sun.star.awt.Size
    Dim oSizeSectionTitle As New com.sun.star.awt.Size
    
    
    Sub ProgressLine
    
        'Default values
        'sBulletShape = "com.sun.star.drawing.RectangleShape"
        sBulletShape = "com.sun.star.drawing.EllipseShape"
        'Values are fracture of page width
        oSizePageMark_Width = 0.02
        oSizePageMark_Height = 0.02
        oSizeSectionTitle_Width = 0.20
        oSizeSectionTitle_Height = 0.03
        dSeparationRatioSection = 3.0
        dMargin_Start = 0.05
        dMargin_End = 0.10
        dMargin_Side = 0.03
    
        oFillColorPageMarkActive = RGB(255,0,0)
        oFillColorPageMarkInactive = RGB(240, 200, 200)
        oCharColorSectionTitleActive = RGB(255, 0, 0)
        oCharColorSectionTitleInactive = RGB(150, 150, 150)
    
    
        ProgressLineRemove()
    
        oDocument = ThisComponent
        If oDocument.supportsService("com.sun.star.drawing.GenericDrawingDocument") Then
            'Load index
            sIndexPath = oDocument.URL
            sIndexPath = Mid( Left(sIndexPath, InStr(sIndexPath, ".odp")-1) & ".index",1,Len(sIndexPath)+2)
            iFileNumber = Freefile
            Open sIndexPath For Input As #iFileNumber
            'First line is section total count
            If Not eof(#iFileNumber) Then
                Line Input #iFileNumber, sLine
                If sLine<>"" Then
                    iSectionCount = Int(sLine)
                End If
            End If
            'Remaining lines for sections: page, title
            iPageCount = oDocument.DrawPages.Count
            Dim sSectionTitle(iPageCount) As String
            While Not eof(#iFileNumber)
                Line Input #iFileNumber, sLine
                If sLine<>"" Then
                    iSectionPage = Int(Left(sLine, InStr(sLine, ",")-1))
                    sSectionTitle(iSectionPage-1) = Right(sLine, Len(sLine)-InStr(sLine, ","))
                End If
            Wend
    
            'loop over pages
            iSectionIndex=-1
            For iPageIndex=0 To iPageCount-1
                If sSectionTitle(iPageIndex)<>"" Then
                    iSectionIndex = iSectionIndex+1
                End If
                oPage = oDocument.DrawPages(iPageIndex)
                oSizePageMark.Width = oPage.Width*oSizePageMark_Width
                oSizePageMark.Height = oPage.Width*oSizePageMark_Height
                dSeparation = (oPage.Width*(1-dMargin_Start-dMargin_End)-oSizePageMark.Width*iPageCount)/((iPageCount-iSectionCount)+(iSectionCount-1)*dSeparationRatioSection)
    
    
                'Place new shapes, loop over page for progress
                iSectionIndexCurrent=-1
                For iPageIndexCurrent=0 To iPageCount-1
                    If sSectionTitle(iPageIndexCurrent)<>"" Then
                        iSectionIndexCurrent = iSectionIndexCurrent+1
                    End If
                    oShape = oDocument.createInstance(sBulletShape)
                    oPositionPageMark.x = (iPageIndexCurrent+iSectionIndexCurrent*(dSeparationRatioSection-1))*dSeparation+iPageIndexCurrent*oSizePageMark.Width+oPage.Width*dMargin_Start
                    oPositionPageMark.y = oPage.Height-oPage.Width*dMargin_Side-oSizePageMark.Height
                    oShape.Size = oSizePageMark
                    oShape.Position = oPositionPageMark
                    oShape.LineStyle = none
                    If (iPageIndexCurrent=iPageIndex) Then
                        oShape.FillColor = oFillColorPageMarkActive
                    Else
                        oShape.FillColor = oFillColorPageMarkInactive
                    End If
                    oShape.Name = "Progress Line RS_" + (iPageIndex+1)+"_"+(iPageIndexCurrent+1)
                    oPage.add(oShape)
    
                    'Section titles, skip dummy title: "_"
                    If sSectionTitle(iPageIndexCurrent)<>"" And sSectionTitle(iPageIndexCurrent)<>"_" Then        
                        oShape = oDocument.createInstance("com.sun.star.drawing.RectangleShape")    
                        oShape.TextVerticalAdjust = com.sun.star.drawing.TextVerticalAdjust.TOP
                        oShape.TextHorizontalAdjust = com.sun.star.drawing.TextHorizontalAdjust.LEFT
                        oShape.TextLeftDistance = 0
                        oSizeSectionTitle.Width = oPage.Width*oSizeSectionTitle_Width
                        oSizeSectionTitle.Height = oPage.Width*oSizeSectionTitle_Height
                        oShape.Size = oSizeSectionTitle
                        oPositionPageMark.y = oPositionPageMark.y-oSizeSectionTitle.Height
                        oShape.Position = oPositionPageMark
                        oShape.LineStyle = none
                        oShape.FillStyle = none
                        oShape.Name = "Progress Line TS_" + (iPageIndex+1)+"_"+(iPageIndexCurrent+1)
                        oPage.add(oShape)
                        oShape.String = sSectionTitle(iPageIndexCurrent)
                        oShape.CharWeight = com.sun.star.awt.FontWeight.BOLD  
                        oShape.CharFontName = "Arial" 'todo: doesn't work
    
                        If iSectionIndexCurrent=iSectionIndex Then
                            oShape.CharColor = oCharColorSectionTitleActive
                        Else
                            oShape.CharColor = oCharColorSectionTitleInactive
                        End If 
    
                    End If
                Next iPageIndexCurrent
            Next iPageIndex
            Close #iFileNumber
        End If
    End Sub
    
    Sub ProgressLineRemove
        oDocument = ThisComponent
        If oDocument.supportsService("com.sun.star.drawing.GenericDrawingDocument") Then
            'loop over pages
            iSectionIndexCurrent=0
            For iPageIndex=0 To oDocument.DrawPages.Count-1
                oPage = oDocument.DrawPages(iPageIndex)
                'Cleanup old shapes
                iShapeIndex = oPage.getCount-1
                Do While (iShapeIndex>=0)
                    oShape = oPage.getByIndex(iShapeIndex)
                    If (InStr(oShape.Name, "Progress Line") <> 0) Then
                        oPage.remove(oShape)
                    End If
                    iShapeIndex = iShapeIndex-1
                Loop
            Next iPageIndex
        End If
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存

工作流程

添加进度线

  1. 在同一文件夹中创建索引,一个文本文件,名称相同但.index扩展名相同

    5
    1,_
    2,H2_a
    4,H2_b
    7,H2_c
    10,_
    
    Run Code Online (Sandbox Code Playgroud)
    • 第一行是节的总数
    • 其余行采用此格式:页面、章节标题
    • _特别适用于没有标题的部分
  2. 打开您的演示文稿

  3. 工具 > 宏 > 组织宏 > LibreOffice Basic...:运行ProgressLine

删除进度线

  • 工具 > 宏 > 组织宏 > LibreOffice Basic...:运行ProgressLineRemove

笔记

  • 大多数设置都分组在脚本的顶部,因此应该很容易对其进行调整。

LibreOffice-OpenOffice Impress-演示进度条,带有部分顶部轮廓