I sent this to the list 01/07. I am resending with a modification .
Would there be any interest in me putting the addin into the Gnumeric source as 
a plugin ?



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 different 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 the sheet from which the function is called. 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.08 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 downloaded and 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']()  # calls 'get_EvalSheet' 
to get the current sheet
           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.8 \
       -I/home/ninds/temp/gnumeric-1.7.8/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>

--------------------------------------------------------------------------------------------------------------------------------------------------
The C 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 (GnmFuncEvalInfo *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


      ___________________________________________________________
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/ 
_______________________________________________
gnumeric-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnumeric-list

Reply via email to