Big problem with Python functions . not knowing the sheet.
- From: Nindi Singh <nindi73 yahoo co uk>
- To: gnumeric-list gnome org
- Subject: Big problem with Python functions . not knowing the sheet.
- Date: Sat, 6 Jan 2007 02:22:24 +0000 (GMT)
Hi
I have been wanting to add user defined functions to Python, but there has been major hurdle.
If I call a Python function with a parameter that is a range from the same sheet the function is being called
from, I have trouble getting at the cell data. This is because to access cells I need to know the sheet. If
the range of cells is from another sheet, there is no problem, the rangeref has a sheet attribute that I can
query.
But if it he range is on the same sheet as the function this is NULL.
To solve this , what I have done is written a C function that simply returns the index of this sheet. We can
then call ths function from our python function and know which sheet the function is evaluated from.
I already had gnumeric 1.7.0 installed on an Ubuntu box.
I downloaded the source for gnumeric from the gnumeric website and unzipped it.
I then ran
./configure --prefix=~/opt
I didn't want to damage my existing installation, I only needed the source. configure showed up alot of
missing libraries which I downlodaed an installed.
I then ran configure again, successfully.followed by 'make' and 'make 'install'.
The plugin adds the function 'get_EvalSheet()' to Gnumeric. In your python function you can then do something
like this.
def MyFunc(theRange):
if theRange.start.sheet == None:
n = Gnumeric.functions['get_EvalSheet']()
wb = Gnumeric.Workbooks()[0]
range_sheet = wb.get_sheets()[n]
else:
range_sheet = theRange.start.sheet
..........................
My Makefile
--------------------------------------------------------------------------------------------------------------------------------------
PLUGIN = GetEvalSheet
GNUMERIC_SOURCE = -I/home/ninds/temp/gnumeric-1.7.0 \
-I/home/ninds/temp/gnumeric-1.7.0/src
# when I downloaded the gnumeric source I unziped it at /home/ninds/temp/
GNUMERIC_HEADERS = -I/home/ninds/opt/include/libspreadsheet-1-7 \
-I/usr/include/libgoffice-0.3
# I installed it at /home/ninds/opt/
GNOME_CFLAGS = -I/usr/include/glib-2.0 \
-I/usr/lib/glib-2.0/include \
-I/usr/include/libxml2 \
-I/usr/include/pango-1.0 \
-I/usr/include/libgsf-1
all :
gcc -fPIC -shared -o $(PLUGIN).so \
$(GNUMERIC_SOURCE)\
$(GNUMERIC_HEADERS)\
$(GNOME_CFLAGS) GetEvalSheet.c
-------------------------------------------------------------------------------------------------------------------------------------
My plugin.xml
----------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<plugin id="GetEvalSheet">
<information>
<name>GetEvalSheet plugin</name>
<description>Plugin contains a function return the sheet on which a function evaluation is taking place
</description>
</information>
<loader type="Gnumeric_Builtin:module">
<attribute value="GetEvalSheet" name="module_file"/>
</loader>
<services>
<service type="function_group" id="Ninds">
<category>Gnumeric</category>
<category xml:lang="en">Gnumeric</category>
<functions>
<function name="get_EvalSheet"/>
</functions>
</service>
</services>
</plugin>
--------------------------------------------------------------------------------------------------------------------------------------------------
#include <gnumeric-config.h>
#include <gnumeric.h>
#include <func.h>
#include <str.h>
#include <cell.h>
#include <sheet.h>
#include <value.h>
#include <rangefunc.h>
#include <gnm-i18n.h>
#include <gnm-plugin.h>
GNM_PLUGIN_MODULE_HEADER;
static GnmFuncHelp const help_getEvalSheet[] = {
{ GNM_FUNC_HELP_OLD,
F_("@FUNCTION=get_EvalSheete\n"
"@SYNTAX=get_EvalSheet()\n"
"@DESCRIPTION= Gets the sheet from where the function is evalued"
)
},
{ GNM_FUNC_HELP_END }
};
static GnmValue *
get_EvalSheet (FunctionEvalInfo *ei, GnmValue const * const *argv)
{
return value_new_int (ei->pos->sheet->index_in_wb);
}
/***************************************************************************/
const GnmFuncDescriptor Ninds_functions[] = {
{ "get_EvalSheet", "", N_(""),
help_getEvalSheet, get_EvalSheet, NULL, NULL, NULL, NULL,
GNM_FUNC_SIMPLE, GNM_FUNC_IMPL_STATUS_COMPLETE, GNM_FUNC_TEST_STATUS_BASIC },
{NULL}
};
----------------------------------------------------------------------------------------------------------------------------------------
Send instant messages to your online friends http://uk.messenger.yahoo.com
[Date Prev][
Date Next] [Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]