sketchucation logo sketchucation
    • 登入
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🔌 Smart Spline | Fluid way to handle splines for furniture design and complex structures. Download

    Simple Extension for Mac

    已排程 已置頂 已鎖定 已移動 Developers' Forum
    25 貼文 6 Posters 1.7k 瀏覽 6 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • thomthomT 離線
      thomthom
      最後由 編輯

      StackOverflow got several threads on it:
      http://stackoverflow.com/questions/10167149/compiling-ruby-c-extension
      http://stackoverflow.com/a/2060716/486990

      Noel Warren have used Rice:
      http://rice.rubyforge.org/

      And just found this which was interesting in regard to raising exceptions:
      http://old.thoughtsincomputation.com/posts/ruby-c-extensions-c-and-weird-crashing-on-rb_raise

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

      1 條回覆 最後回覆 回覆 引用 0
      • O 離線
        olilej
        最後由 編輯

        I looked over that SimpleExtension example, it seems very promising.

        By the way, what exactly are the real benefit of using Ruby C Extension ? Does this have to do with performance ? As in SketchUp 2013, C++ SDK doesn't allow model interaction, it would be very interesting if we could improve the plugins efficiency with that possibility.

        Olivier

        1 條回覆 最後回覆 回覆 引用 0
        • thomthomT 離線
          thomthom
          最後由 編輯

          I use C Extensions when I need to do many calculations. Vertex Tools became 200+ times faster in calculating the soft selection when I ported the code to C Extension.

          Just calling Ruby functions won't be faster. You'd have to be doing calculations and other processing for it to be faster.

          It's not just performance though, you might want to spawn off other processes. Use C libraries.

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

          1 條回覆 最後回覆 回覆 引用 0
          • Al HartA 離線
            Al Hart
            最後由 編輯

            We had about the same experience as ThomThom.

            Calling ruby functions from C-code was slower than calling them from ruby directly in SketchUp.

            e.g. The C-code replacement for:

            value = model.get_attribute “dictionaryname”, key, defaultvalue)
            

            can be done directly, (actually rather indirectly), from C-code, but the execution time is slower than in SketchUp ruby.

            But other things, such as maintaining a table for vertices, and then doing special processing for vertices was faster.

            Also, we were able to use Windows dialogs, functions in other Windows DLLS, etc. and attach them to SketchUp.

            Also, we were able to use all the Ruby stuff from C++ because ruby\1.8\i386-mswin32\ruby.h, (part of the ruby code), includes

            #if defined(__cplusplus)
            extern "C" {
            #endif
            

            Back to the original question.

            Has anyone interfaced to C routines from the Mac, and if so could you share a sample of some sort to get us started...

            Al Hart

            http:wiki.renderplus.comimageseefRender_plus_colored30x30%29.PNG
            IRender nXt from Render Plus

            1 條回覆 最後回覆 回覆 引用 0
            • thomthomT 離線
              thomthom
              最後由 編輯

              @al hart said:

              Has anyone interfaced to C routines from the Mac, and if so could you share a sample of some sort to get us started...

              404 — Bitbucket

              favicon

              (bitbucket.org)

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

              1 條回覆 最後回覆 回覆 引用 0
              • Al HartA 離線
                Al Hart
                最後由 編輯

                @thomthom said:

                404 — Bitbucket

                favicon

                (bitbucket.org)

                Thanks, ThomThom, that looks like what I am looking for.

                I see you had posted it before, but I didn't know what it was at the time.

                Al Hart

                http:wiki.renderplus.comimageseefRender_plus_colored30x30%29.PNG
                IRender nXt from Render Plus

                1 條回覆 最後回覆 回覆 引用 0
                • thomthomT 離線
                  thomthom
                  最後由 編輯

                  Mind you, I recently found http://rubyinstaller.org/downloads/ which I think is a better choice for Windows than the Visual Studio solution I'd used.

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

                  1 條回覆 最後回覆 回覆 引用 0
                  • O 離線
                    olilej
                    最後由 編輯

                    I've been playing around with C Extension recently and I would like to know how if there is an equivalent of is_a? ruby function in C level.

                    I found rb_obj_is_instance_of but it seems to be only meant for native ruby types.

                    1 條回覆 最後回覆 回覆 引用 0
                    • Al HartA 離線
                      Al Hart
                      最後由 編輯

                      [Ignore this for a minute - I need to add a second parameter for what the value to pass to is_a?]

                      You can execute the equivalent of any ruby function using rb_intern() and rb_funcall()

                      Try this:

                      
                      VALUE fid = rb_intern("is_a?");
                      VALUE vret = rb_funcall(klass, fid, 0);
                      
                      

                      Al Hart

                      http:wiki.renderplus.comimageseefRender_plus_colored30x30%29.PNG
                      IRender nXt from Render Plus

                      1 條回覆 最後回覆 回覆 引用 0
                      • Al HartA 離線
                        Al Hart
                        最後由 編輯

                        Here is a better example, equivalent to

                        Sketchup.is_a?(Module)

                        
                        
                        VALUE Sketchup = rb_path2class("Sketchup");
                        VALUE Module= rb_intern("Module");
                        VALUE is_a = rb_intern("is_a?");
                        VALUE result = rb_funcall(Sketchup, is_a, Module, 0);
                        
                        
                        

                        Al Hart

                        http:wiki.renderplus.comimageseefRender_plus_colored30x30%29.PNG
                        IRender nXt from Render Plus

                        1 條回覆 最後回覆 回覆 引用 0
                        • Dan RathbunD 離線
                          Dan Rathbun
                          最後由 編輯

                          @olilej said:

                          I've been playing around with C Extension recently and I would like to know how if there is an equivalent of is_a? ruby function in C level.

                          If you have the CHM... you can click on the method description, and the C source will popup:
                          (Also works for online version, but the source link must be clicked directly, and is only visible when the mouse is hovering over the method description.)

                          Object_kind_of.png

                          💭

                          I'm not here much anymore.

                          1 條回覆 最後回覆 回覆 引用 0
                          • Dan RathbunD 離線
                            Dan Rathbun
                            最後由 編輯

                            So it looks like there are some macros defined in C, to make life easier ... CLASS_OF(), RCLASS_SUPER(), etc.

                            I'm not here much anymore.

                            1 條回覆 最後回覆 回覆 引用 0
                            • Dan RathbunD 離線
                              Dan Rathbun
                              最後由 編輯

                              • Pragmatic Programmer: Extending Ruby 1.9

                              I'm not here much anymore.

                              1 條回覆 最後回覆 回覆 引用 0
                              • O 離線
                                olilej
                                最後由 編輯

                                Great, my goal is to make sure I'm dealing with a Entity in order to access its attributes.

                                Here is the code I've come up with.

                                VALUE result = rb_obj_is_kind_of(obj, rb_path2class("Sketchup;;Entity"));
                                if (Qtrue == result){
                                	VALUE rval = rb_funcall(obj, rb_intern("get_attribute"), 2, rb_str_new2("dynamic_attributes"), rb_str_new2("..."));
                                	...
                                }
                                
                                1 條回覆 最後回覆 回覆 引用 0
                                • Dan RathbunD 離線
                                  Dan Rathbun
                                  最後由 編輯

                                  Only Sketchup::ComponentDefinition and Sketchup::ComponentInstance will have dictionaries with that special name.

                                  I'm not here much anymore.

                                  1 條回覆 最後回覆 回覆 引用 0
                                  • 1
                                  • 2
                                  • 1 / 2
                                  • 第一個貼文
                                    最後的貼文
                                  Buy SketchPlus
                                  Buy SUbD
                                  Buy WrapR
                                  Buy eBook
                                  Buy Modelur
                                  Buy Vertex Tools
                                  Buy SketchCuisine
                                  Buy FormFonts

                                  Advertisement