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

    Inherit from Sketchup Classes

    Scheduled Pinned Locked Moved Developers' Forum
    13 Posts 6 Posters 1.3k Views 6 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.
    • P Offline
      Pierreden
      last edited by

      @TIG: In this case a vector is to be considered a force in my Ivy plugin. Early in de development I did some experimenting with changing the and updating the ivy after it was actualy created (by selecting the ivy group and changing multipliers, or selecting a branch in the ivy and changing multipliers on just that one). I therefor needed to store the individual vectors and its multiplier. This became very complex very fast, very overkill and i guess its not even nessecary to store the multiplier anyway. But the problem regarding inheritance stuck and is still bugging me (even its not a problem at the moment).

      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        The 'force' of a vector is its 'length' ?
        This is already available to be read from the vector or can also be set...

        TIG

        1 Reply Last reply Reply Quote 0
        • P Offline
          Pierreden
          last edited by

          yes and no. The force is a vector multiplied by a weight multiplier. I wanted to store the user set multiplier with the vector so that i could manipulate the multiplier later πŸ˜‰

          1 Reply Last reply Reply Quote 0
          • TIGT Offline
            TIG Moderator
            last edited by

            You misconstrue - you can vary a vector's length without affecting its direction so making it longer gives it more 'force' but its direction is unchanged, normalizing it later gives it 'unit length'...

            TIG

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

              @pierreden said:

              I tried to make a custom Vector class inheriting from Geom::Vector3d. The inheritance in it self was no problem, no error messages, no warnings or anything.

              ... Is this because Vector3d is a reflection of a c++ / c class? (is it?). Are Sketchup denying me my rights as a rubyist to do whatever i want?

              I also had tried to subclass a C++ Sketchup class (UI::Toolbar in my case.) I think the fault lies with the Google C++/C side code, in that the number of arguments to the new() constructor method is not setup to accept any number of args. This is normally wrong for Ruby. When we create classes we should always be sure that new() can take any number of arguments, and always pass the entire argument list into the initialize method in the instance object after it is created.
              So the ArgumentError exception is really being raised by Ruby during the call to new().

              Now, that would make you believe, that you need to overrride the new() constructor method in your subclass, and call super() within the overridden method, with only the base set of arguments.
              I tried that, it doesn't work either.

              Neither does aliasing the original constructor method under a different name, and creating a fresh new() method, that calls the aliased one.

              In the end.. I just wrote a custom wrapper base class (being as a default, a direct subclass of Object,) that in it's own initialize() method, created a instance reference, to a new UI::Toolbar object.)
              Then I wrote wrapper methods that mimic all the Toolbar instance methods, and added custom methods of my own, that add functionality.

              Now.. there are good reasons, in some cases for Google to have limited (or prevented,) the subclassing of some classes, such as all those subclasses of Sketchup::Drawingelement. Otherwise the application would not know how to draw the objects. (A Pandora's Box scenario.)
              Likely they just did it all one way for all their classes, and never envisioned us wanting to do all the crazy things we can do with Ruby.

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • C Offline
                Cleverbeans
                last edited by

                Based on your description it seems unclear as to why you'd want to use inheritance here when the goal is to simply store the weights associated with the vector. I can envision either a class with a .vector and .weight attribute and some supporting methods. Here are some examples of what I think would be cleaner implementations of your idea.

                
                class MyClass
                   attr_accessor ;weight
                   def initialize(x,y,z,weight)
                      @vector = Geom;;Vector3d.new(x,y,z)
                      @weight = weight
                   end
                   def vector
                      return @vector.transform(@weight)
                   end
                end
                
                

                This would cleanly differentiate between the underlying Vector3d and the weight you want to store and allows you to update the weight while encapsulating the scaling behavior in the .vector method. The only downside of this approach is that occasionally you'll have to type my_class.vector.method instead of my_class.method but it avoids the semantic muddling of the underlying vector defined by the x,y,z values provided to initialize and the weighted version of it.

                1 Reply Last reply Reply Quote 0
                • K Offline
                  kwalkerman
                  last edited by

                  I ran some simple tests in the webdialog Ruby Code Editor. It seems that creating a sub-class has a number of issues (although some may be specific to the webdialog code editor):

                  1. In my example, none of the code created within the sub-class was executed
                  2. You can extend the parent class and create new methods, but any new methods in the sub-class are not recognized.

                  how about doing the following (taken from an example found here: http://railstips.org/blog/archives/2009/08/07/patterns-are-not-scary-method-missing-proxy/)

                  
                  
                  class MyVector
                  attr_reader ;v
                  attr_accessor ;wt
                  def initialize(x,y,z,wt)
                    @v = Geom;;Vector3d.new(x,y,z)
                  end
                  
                    private
                      def method_missing(method, *args, &block)
                        args = args.collect{|a| a.v if a.is_a? MyVector}
                        @v.send(method, *args, &block)
                      end
                  end
                  
                  
                  

                  This takes care of the following scenario:

                  myVector1.angle_between myVector2

                  Although, this doesn't take care of what happens if you send a MyVector instance to another Sketchup class, such as

                  t = Geom::Transformation.new(myVector1) --> returns error

                  --
                  Karen

                  1 Reply Last reply Reply Quote 0
                  • P Offline
                    Pierreden
                    last edited by

                    @tig said:

                    You misconstrue - you can vary a vector's length without affecting its direction so making it longer gives it more 'force' but its direction is unchanged, normalizing it later gives it 'unit length'...

                    @cleverbeans said:

                    Based on your description it seems unclear as to why you'd want to use inheritance here when the goal is to simply store the weights associated with the vector. I can envision either a class with a .vector and .weight attribute and some supporting methods. Here are some examples of what I think would be cleaner implementations of your idea.

                    
                    > class MyClass
                    >    attr_accessor ;weight
                    >    def initialize(x,y,z,weight)
                    >       @vector = Geom;;Vector3d.new(x,y,z)
                    >       @weight = weight
                    >    end
                    >    def vector
                    >       return @vector.transform(@weight)
                    >    end
                    > end
                    > 
                    

                    Yes. you are perfectly right. I'm sort of new to the concept of vectors, and it have taken me a while to get comfortable with the concept. My question wasn't about this particular example, bur rather the concept of inhereting from Sketchup classes. I would love to be able to make my own My::Point3d class with additional methods, and still be able to use My::Point3d together with Geom::Point3d without errors.

                    Peace
                    Pierre

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

                      @pierreden said:

                      I would love to be able to make my own My::Point3d class with additional methods, and still be able to use My::Point3d together with Geom::Point3d without errors.

                      That is possible though - I've done that. It's just the new and initialize method that can't be modified by the looks of it. 😞

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

                      1 Reply Last reply Reply Quote 0
                      • K Offline
                        kwalkerman
                        last edited by

                        @pierreden said:

                        I would love to be able to make my own My::Point3d class with additional methods, and still be able to use My::Point3d together with Geom::Point3d without errors.

                        The other option is to extend an instance of a Point3d...

                        
                        module YourPoint3d
                        attr_accessor ;your_var1, ;your_var2
                        
                        def your_def1
                        end
                        def your_def2
                        end
                        end
                        
                        p = Geom;;Point3d.new
                        p.extend YourPoint3d
                        p.your_var1 = 20
                        

                        This gives your particular Point3d additional methods and attributes without messing with the Point3d class at all.

                        --
                        Karen

                        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