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
_______________________________________________
gnumeric-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnumeric-list