1
0
Fork 0
libreoffice/odk/examples/DevelopersGuide/Charts/python/ChartInCalc.py
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

220 lines
7.3 KiB
Python

# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
import os
import Helper
import CalcHelper
from com.sun.star.awt import FontWeight, Point, Size
from com.sun.star.chart import ChartSymbolType, ChartDataCaption
from com.sun.star.drawing import LineDash
from com.sun.star.drawing.DashStyle import ROUND
from com.sun.star.drawing.FillStyle import SOLID
from com.sun.star.drawing.LineStyle import DASH
from com.sun.star.lang import IndexOutOfBoundsException, Locale
class ChartInCalc(object):
def __init__(self, chart_doc):
super(ChartInCalc, self).__init__()
self._chart_document = chart_doc
self._diagram = self._chart_document.getDiagram()
def lock_controllers(self):
self._chart_document.lockControllers()
def unlock_controllers(self):
self._chart_document.unlockControllers()
def test_diagram(self):
dia_prop = self._diagram
if dia_prop is not None:
# change chart type
dia_prop.setPropertyValue("Lines", True)
# change attributes for all series
# set line width to 0.5mm
dia_prop.setPropertyValue("LineWidth", 50)
def test_data_row_properties(self):
# change properties of the data series
try:
for i in range(4):
series_prop = self._diagram.getDataRowProperties(i)
series_prop.setPropertyValue("LineColor", int(0x400000 * i + 0x005000 * i + 0x0000FF - 0x40 * i))
if i == 1:
source_file = "bullet.gif"
url = os.path.abspath(source_file).replace("\\", "/")
if os.path.exists(url):
url = "file:///" + url
else:
url = "http://graphics.openoffice.org/chart/bullet1.gif"
series_prop.setPropertyValue("SymbolType", int(ChartSymbolType.BITMAPURL))
series_prop.setPropertyValue("SymbolBitmapURL", url)
else:
series_prop.setPropertyValue("SymbolType", int(ChartSymbolType.SYMBOL1))
series_prop.setPropertyValue("SymbolSize", Size(250, 250))
except IndexOutOfBoundsException as err:
print(f"Oops, there not enough series for setting properties: {err}")
def test_data_point_properties(self):
# set properties for a single data point
try:
# first parameter is the index of the point, the second one is the series
point_prop = self._diagram.getDataPointProperties(0, 1)
# set a different, larger symbol
point_prop.setPropertyValue("SymbolType", int(ChartSymbolType.SYMBOL6))
point_prop.setPropertyValue("SymbolSize", Size(600, 600))
# add a label text with bold font, bordeaux red 14pt
point_prop.setPropertyValue("DataCaption", int(ChartDataCaption.VALUE))
point_prop.setPropertyValue("CharHeight", 14.0)
point_prop.setPropertyValue("CharColor", int(0x993366))
point_prop.setPropertyValue("CharWeight", FontWeight.BOLD)
except IndexOutOfBoundsException as err:
print(f"Oops, there not enough series for setting properties: {err}")
def test_area(self):
area = self._chart_document.getArea()
if area is not None:
# change background color of entire chart
area.setPropertyValue("FillStyle", SOLID)
area.setPropertyValue("FillColor", int(0xEEEEEE))
def test_wall(self):
wall = self._diagram.getWall()
# change background color of area
wall.setPropertyValue("FillStyle", SOLID)
wall.setPropertyValue("FillColor", int(0xCCCCCC))
def test_title(self):
# change main title
doc_prop = self._chart_document
doc_prop.setPropertyValue("HasMainTitle", True)
title = self._chart_document.getTitle()
# set new text
if title is not None:
title.setPropertyValue("String", "Random Scatter Chart")
title.setPropertyValue("CharHeight", 14.0)
# align title with y axis
axis = self._diagram.getYAxis()
if axis is not None and title is not None:
pos = title.getPosition()
pos.X = axis.getPosition().X
title.setPosition(pos)
def test_axis(self):
# x axis
axis = self._diagram.getXAxis()
if axis is not None:
axis.setPropertyValue("Max", 24)
axis.setPropertyValue("StepMain", 3)
# change number format for y axis
axis = self._diagram.getYAxis()
# add a new custom number format and get the new key
new_number_format = 0
num_fmt_supp = self._chart_document
if num_fmt_supp is not None:
formats = num_fmt_supp.getNumberFormats()
locale = Locale("de", "DE", "de")
format_str = formats.generateFormat(new_number_format, locale, True, True, 3, 1)
new_number_format = formats.addNew(format_str, locale)
if axis is not None:
axis.setPropertyValue("NumberFormat", int(new_number_format))
def test_grid(self):
# y major grid
grid = self._diagram.getYMainGrid()
if grid is not None:
dash = LineDash()
dash.Style = ROUND
dash.Dots = 2
dash.DotLen = 10
dash.Dashes = 1
dash.DashLen = 200
dash.Distance = 100
grid.setPropertyValue("LineColor", int(0x999999))
grid.setPropertyValue("LineStyle", DASH)
grid.setPropertyValue("LineDash", dash)
grid.setPropertyValue("LineWidth", 30)
def main():
# Create a spreadsheet add some data and add a chart
helper = Helper.Helper()
calc_helper = CalcHelper.CalcHelper(helper.create_spreadsheet_document())
# insert a cell range with 4 columns and 24 rows filled with random numbers
cell_range = calc_helper.insert_random_range(4, 24)
range_address = cell_range.RangeAddress
# change view to sheet containing the chart
calc_helper.raise_chart_sheet()
# the unit for measures is 1/100th of a millimeter
# position at (1cm, 1cm)
pos = Point(1000, 1000)
# size of the chart is 15cm x 9.271cm
extent = Size(15000, 9271)
# insert a new chart into the "Chart" sheet of the spreadsheet document
chart_doc = calc_helper.insert_chart("ScatterChart", range_address, pos, extent, "com.sun.star.chart.XYDiagram")
test = ChartInCalc(chart_doc)
try:
test.lock_controllers()
test.test_diagram()
test.test_area()
test.test_wall()
test.test_title()
test.test_axis()
test.test_grid()
# show an intermediate state, ...
test.unlock_controllers()
test.lock_controllers()
# ..., because the following takes a while:
# an internet URL has to be resolved
test.test_data_row_properties()
test.test_data_point_properties()
test.unlock_controllers()
except Exception as err:
print(f"UNO Exception caught: {err}")
# Main entry point
if __name__ == "__main__":
main()