220 lines
7.3 KiB
Python
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()
|