sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Create new instance of a Ruby object in C?

    Scheduled Pinned Locked Moved Developers' Forum
    12 Posts 2 Posters 1.9k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • thomthomT Offline
      thomthom
      last edited by

      Say I want to create a Sketchup::Color object from a C Extension. How do you create that object? I thought to have read somewhere that it's not as easy as calling .new - is this correct? I can't seem to find the info now. Maybe I just imagined it...?

      Thomas Thomassen — SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • Dan RathbunD Offline
        Dan Rathbun
        last edited by

        You can cheat...

        VALUE tt_clr;
        
        tt_clr = rb_eval_string("Sketchup;;Color.new(0, 128, 255)");
        

        I'm not here much anymore.

        1 Reply Last reply Reply Quote 0
        • thomthomT Offline
          thomthom
          last edited by

          Wonder what the performance difference is.

          This is what I've found so far. (untested)

          <span class="syntaxdefault">struct Color<br /></span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">  unsigned char red</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> green</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> blue</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> alpha</span><span class="syntaxkeyword">;<br />};<br /><br /></span><span class="syntaxdefault">static VALUE color_to_sketchup</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> struct Color color </span><span class="syntaxkeyword">)<br />{<br /></span><span class="syntaxdefault">  VALUE mSketchup</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> cColor</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  VALUE skp_color</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  VALUE red</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> green</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> blue</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> alpha</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  VALUE args</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  <br />  mSketchup </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_define_module</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> </span><span class="syntaxstring">"Sketchup"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  cColor </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_define_class_under</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> mSketchup</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">"Color"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  red   </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">red </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  green </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">green </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  blue  </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">blue </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  alpha </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">alpha </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  args </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_ary_new3</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 4</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> red</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> green</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> blue</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> alpha </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  skp_color </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_obj_alloc</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> cColor </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  rb_obj_call_init</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> skp_color</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> args</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 4 </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  return skp_color</span><span class="syntaxkeyword">;<br />}</span><span class="syntaxdefault"> </span>
          

          Is it possible to do static initialization of module and classes? Avoiding them being "defined" every time. Or is it maybe not an issue? Just wonder if it's possible to avoid more calls to Ruby.

          <span class="syntaxdefault"></span><span class="syntaxkeyword">static&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;foobar</span><span class="syntaxkeyword">(&nbsp;</span><span class="syntaxdefault">struct&nbsp;Color&nbsp;color&nbsp;</span><span class="syntaxkeyword">)<br />{<br />&nbsp;&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;skp_color</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;red</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">green</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">blue</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">alpha</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;args</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;static&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;mSketchup&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">rb_define_module</span><span class="syntaxkeyword">(&nbsp;</span><span class="syntaxstring">"Sketchup"&nbsp;</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;static&nbsp;</span><span class="syntaxdefault">VALUE&nbsp;cColor&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">rb_define_class_under</span><span class="syntaxkeyword">(&nbsp;</span><span class="syntaxdefault">mSketchup</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxstring">"Color"&nbsp;</span><span class="syntaxkeyword">);<br />}<br />&nbsp;</span><span class="syntaxdefault"></span>
          

          ❓

          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • Dan RathbunD Offline
            Dan Rathbun
            last edited by

            @thomthom said:

            Is it possible to do static initialization of module and classes? Avoiding them being "defined" every time. ...

            Probably (open the Ruby CHM reference, and go to Array::new(), then click on the definition to view the C source.)

            Also.. take another look at John H's example in THIS topic.
            That should tell you, Google is defining static interface's to API objects.

            The challenge is to know what are the identifiers that they define. (Keep in mind that, if you are running C code under the Sketchup process, (rather than in a separate 3rd party application,) everything you see defined in the SDKs for SKPwriter and SKPreader DLLs, are ALREADY loaded, as part of the executable code. (In other words, those DLLs are just a subset of the code, cut out into DLLs, with exported functions, for use with 3rd party applications, where it's expected that the Sketchup app is not running.)

            I'm not here much anymore.

            1 Reply Last reply Reply Quote 0
            • thomthomT Offline
              thomthom
              last edited by

              That is C++ though. It let you define variables anywhere in the scope. C requires you to define everything first before it's being used. Which is why I'm confused about static variables which seems to be able to define and set at the same time. But maybe the examples I've seen has been mis-labeled as C instead of C++...

              Thomas Thomassen — SketchUp Monkey & Coding addict
              List of my plugins and link to the CookieWare fund

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                If you look near the top of the interface header files (ie: "Sketchup_i.h", etc.) you'll see that they are including support for OLE:
                %(#008080)[#include "ole2.h"]

                All the color properties (and getter methods,) return a %(#008080)[OLE_Color] type.

                There is also an interface: %(#008080)[ISkpRGBAArray]
                ... see the SDK documentation.

                Now for more low level, see:
                " %(#BF4000)[SkpWriter/Headers/source/common/utils/color.h]"

                Look at " %(#BF4000)[SkpWriter/Headers/source/sketchup/skpwriter/sapi/itexture.h]" for an example of accessing color methods.

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • Dan RathbunD Offline
                  Dan Rathbun
                  last edited by

                  @thomthom said:

                  That is C++ though. ...

                  You are overlooking a fact that is "right under your nose." Not all 3rd party applications that need to use the SDK to work with SKP files, are written in C++. It is safe to assume that, a good number of them will be written in C. If you look through the header files, you will see that Google defined "C style" interface wrappers.

                  look:

                  #ifdef __cplusplus
                  typedef class SkpView SkpView;
                  #else
                  typedef struct SkpView SkpView;
                  #endif /* __cplusplus */
                  
                  

                  The part of your code that is C, is inside the:
                  %(#008080)[#ifdef __cplusplus extern "C" { ... } #endif /* __cplusplus */]
                  ... but (I believe,) within that you can call functions that are outside it, in the C++ part.

                  I'm not here much anymore.

                  1 Reply Last reply Reply Quote 0
                  • Dan RathbunD Offline
                    Dan Rathbun
                    last edited by

                    Another thing.. do not assume your C code is wrapped or protected.

                    You could create a conflict with another %(#008080)[struct Color], defined by someone else's extension, or perhaps even defined by the Windows API (or whatever.)

                    I'd advise you to prefix any identifiers not inside a function, with "tt_" (and perhaps then add a secondary prefix for whatever lib or plugin the C code is for.)

                    Did you notice how all ruby C functions are prefixed with "rb_" ??

                    Anyway.. say you write your lib module in C...
                    use something like:
                    %(#008080)[m_tt_Lib2 c_tt_Lib2_MatlImporter]

                    .. whatever.. come up with a unique prefix, to prevent clashes.

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • thomthomT Offline
                      thomthom
                      last edited by

                      @dan rathbun said:

                      Another thing.. do not assume your C code is wrapped or protected.

                      You could create a conflict with another struct Color, defined by someone else's extension, or perhaps even defined by the Windows API (or whatever.)

                      No, my functions are all static - so they are isolated to the source file they are defined in. I hadn't made the structs static yet though.

                      Thomas Thomassen — SketchUp Monkey & Coding addict
                      List of my plugins and link to the CookieWare fund

                      1 Reply Last reply Reply Quote 0
                      • thomthomT Offline
                        thomthom
                        last edited by

                        @dan rathbun said:

                        @thomthom said:

                        That is C++ though. ...

                        You are overlooking a fact that is "right under your nose." Not all 3rd party applications that need to use the SDK to work with SKP files, are written in C++. It is safe to assume that, a good number of them will be written in C. If you look through the header files, you will see that Google defined "C style" interface wrappers.

                        Regardless, C++ allow for definition of variables anywhere in the scope, C doesn't. Can't get away from that. That's why I was wondering how variable initializion in C works. Examples such as: http://en.wikipedia.org/wiki/Static_variable

                        Guess I just need to try it out. See if it works.

                        Thomas Thomassen — SketchUp Monkey & Coding addict
                        List of my plugins and link to the CookieWare fund

                        1 Reply Last reply Reply Quote 0
                        • thomthomT Offline
                          thomthom
                          last edited by

                          @dan rathbun said:

                          Did you notice how all ruby C functions are prefixed with "rb_" ??

                          Did you notice all the rb_ functions are not static? While there's a bunch of other functions not prefixed with rb_ which are all static is not part of the API.
                          Since there is no namespace or classes in C, static and extern is what controls what is exposed to the whole environment.

                          Thomas Thomassen — SketchUp Monkey & Coding addict
                          List of my plugins and link to the CookieWare fund

                          1 Reply Last reply Reply Quote 0
                          • thomthomT Offline
                            thomthom
                            last edited by

                            After snooping around the Ruby source and looking how it's done there, it looks like this is the way to go:

                            <span class="syntaxdefault">struct Color<br /></span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">  unsigned char red</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> green</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> blue</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> alpha</span><span class="syntaxkeyword">;<br />};<br /><br /></span><span class="syntaxdefault">static VALUE<br />color_to_sketchup</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> Color color </span><span class="syntaxkeyword">)<br />{<br /></span><span class="syntaxdefault">  VALUE mSketchup</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> cColor</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  VALUE skp_color</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> args</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">4</span><span class="syntaxkeyword">];<br /></span><span class="syntaxdefault">  <br />  mSketchup </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_const_get</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> rb_cObject</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> rb_intern</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> </span><span class="syntaxstring">"Sketchup"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  cColor </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_const_get_at</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> mSketchup</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> rb_intern</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Color"</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  args</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">red </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  args</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">green </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  args</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">2</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">blue </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  args</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_float_new</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> color</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">alpha </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  skp_color </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> rb_class_new_instance</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 4</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> args</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> cColor </span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  <br />  return skp_color</span><span class="syntaxkeyword">;<br />}</span><span class="syntaxdefault"> </span>
                            

                            Thomas Thomassen — SketchUp Monkey & Coding addict
                            List of my plugins and link to the CookieWare fund

                            1 Reply Last reply Reply Quote 0
                            • 1 / 1
                            • First post
                              Last post
                            Buy SketchPlus
                            Buy SUbD
                            Buy WrapR
                            Buy eBook
                            Buy Modelur
                            Buy Vertex Tools
                            Buy SketchCuisine
                            Buy FormFonts

                            Advertisement