[Ecls-list] Problems with updating an external global variable
Dietrich Bollmann
dietrich at formgames.org
Wed Jul 17 09:33:07 UTC 2013
Hi Juanjo,
Sorry for being unclear.
I am writing a plugin for Rhino3D, a NURBS-based 3-D modeling software.
The plugin makes it possible to script RhinoNURBS models with lisp.
When the plugin is used, the following function is called by Rhino:
---
CRhinoCommand::result CCommandRhinoLisp::RunCommand(const
CRhinoCommandContext& context) {
...
}
---
The parameter 'context' (for which I unsuccessfully substituted
'global_int' in my last email to make things "easier to understand"...) is
essential for many of the Rhino functions. The following, for example,
adds a cone object (which has to be initialized before) to a Rhino scene:
---
context.m_doc.AddObject(cone_object);
---
I therefore need a way to access 'context' from lisp and thought about
implementing this via a global variable which is set in the RunCommand()
function. But for some reason I was not able to overwrite the value of the
global variable...
Currently I therefore solve the problem as follows:
In the file where the lisp wrappers are defined I have the following:
--- rhino-lisp-api.lisp ---
(ffi:clines "static CRhinoCommandContext *global_rhinoCommandContext = (
CRhinoCommandContext *) NULL;")
(defun set-rhino-command-context (context)
(ffi:c-inline
(context) (:pointer-void) :void
"global_rhinoCommandContext = (CRhinoCommandContext *) #0"
:one-liner t
:side-effects t))
(defun get-rhino-command-context ()
(ffi:c-inline
() () :pointer-void
"(void *) global_rhinoCommandContext"
:one-liner t
:side-effects t))
---
>From RunCommand() I call the function setRhinoCommandContext(context) and
define the constant '+context+' to refer to the Rhino command context:
---
CRhinoCommand::result CCommandRhinoLisp::RunCommand(const
CRhinoCommandContext& context) {
...
setRhinoCommandContext(context);
cl_eval(READCL((defconstant +context+ (get-rhino-command-context)
"The Rhino Command Context")));
...
}
---
setRhinoCommandContext() is defined as follows:
---
static void setRhinoCommandContext(const CRhinoCommandContext& context) {
union cl_lispunion cl_context_object;
cl_context_object.foreign.t = t_foreign;
cl_context_object.foreign.tag = ECL_SYM(":POINTER-VOID",1377);
cl_context_object.foreign.size = 0;
cl_context_object.foreign.data = (char*) &context;
cl_object cl_context = &cl_context_object;
cl_funcall(2, c_string_to_object("set-rhino-command-context"),
cl_context);
}
---
It works, but I wonder if there is a better way to solve this problem?
Rather than wrapping the pointer into a cl_object it would be nice to
directly define the setter function in the file where the lisp wrappers are
defined:
--- rhino-lisp-api.lisp ---
(ffi:clines "
static CRhinoCommandContext *global_rhinoCommandContext = (
CRhinoCommandContext *) NULL;
static void setRhinoCommandContext(const CRhinoCommandContext &context) {
global_rhinoCommandContext = (CRhinoCommandContext *) &context;
}
")
(defun get-rhino-command-context ()
(ffi:c-inline
() () :pointer-void
"(void *) global_rhinoCommandContext"
:one-liner t
:side-effects t))
---
At least I would like to avoid hardcoding the integer 1377 corresponding to
":POINTER-VOID" - for example by using some (imagined) function
'pointer_to_cl_object()':
---
static void setRhinoCommandContext(const CRhinoCommandContext& context) {
cl_funcall(2,
c_string_to_object("set-rhino-command-context"),
pointer_to_cl_object((char*) &context));
}
---
But I was not able to find anything similar...
Is my explanation more understandable this time?
Thanks, Dietrich
On Sun, Jul 14, 2013 at 3:21 AM, Juan Jose Garcia-Ripoll <
juanjose.garciaripoll at gmail.com> wrote:
>
> On Sat, Jul 13, 2013 at 5:31 PM, Dietrich Bollmann <dietrich at formgames.org
> > wrote:
>
>> But when evaluating (test) before and after the value is changed, in both
>> cases the original value is printed
>
>
> You cooked up a very nice and complex example and leave out the most
> relevant part which is where you use the lisp code. How does this code look
> like?
>
>
> --
> Instituto de Física Fundamental, CSIC
> c/ Serrano, 113b, Madrid 28006 (Spain)
> http://juanjose.garciaripoll.googlepages.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/ecl-devel/attachments/20130717/c887145f/attachment.html>
More information about the ecl-devel
mailing list