sketchucation logo sketchucation
    • Login
    πŸ€‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

    Dynamic Component DCFunctionsV1 within in Module

    Scheduled Pinned Locked Moved Developers' Forum
    34 Posts 4 Posters 8.2k Views 4 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.
    • michaelwhksgM Offline
      michaelwhksg
      last edited by michaelwhksg

      Hi I am a newbie to ruby. Can we place the DCFunctionsV1 within Module?
      I am unable to get the customized formula in the dynamic component.
      Please kindly advise.
      Thanks.


      # add_funcs.rb
      
      require 'sketchup'
      
      module M123
      module M123abc
      
      # Open SketchUp's Dynamic Component Functions (V1) class.
      
      class M123;;M123abc;;DCFunctionsV1
        protected
      
        # provide access to Ruby's arctangent method
        #
        # Usage;  atan2(y,x)
      
        def atan2(a)
          return Math;;atan2(a[0].to_f, a[1].to_f).radians
        end
      
      end
      end
      end
      
      1 Reply Last reply Reply Quote 0
      • S Offline
        slbaumgartner
        last edited by

        Two thoughts:

        First, the code you show isn't modifying SU's DCFunctionsV1, it is creating a new class of that name within the M123::M123abc module namespace.

        Second, what makes you think that just defining atan2 within the DCFunctionsV1 class will make that formula available for use in DC's? That assumes a lot about how the DC class is programmed (which isn't documented).

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

          This code will work outside of your own module.

          # add_funcs.rb
          # extends DCs functions
          require('sketchup')
          if Sketchup.version.to_i <= 8
            require('dynamiccomponents.rb')
          else
            require('su_dynamiccomponents.rb')
          end
          if defined?($dc_observers)
            # Open SketchUp's Dynamic Component Functions (V1) class.
            # only if DC extension is active
            class DCFunctionsV1
              protected
              unless DCFunctionsV1.method_defined?(;atan2)
                # access to Ruby's arctangent method
                # Usage; =atan2(y,x)
                def atan2(a)
                  return Math;;atan2(a[0],a[1]).radians
                end
              end#unless
              protected;atan2
            end#class
          end#if
          
          

          TIG

          1 Reply Last reply Reply Quote 0
          • michaelwhksgM Offline
            michaelwhksg
            last edited by

            Thanks a lot for the advice, slbaumgartner and TIG. πŸ˜„ Will try the codes later.

            Another question, if you don't mind. Assuming we do not confine the entire code within it's own namespace (module), will there be a chance that name of the customised formula clashes with someone's else?

            If we have created another unique formula for the dynamic component, for example, def qwer(a) and qwer(a)=a[0]+a[1]+a[2]. Is there any way from preventing others from using the same name as qwer(a)?

            Thanks.

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

              Yes you should keep your own code within your own modules.

              The example I gave is adding methods into SketchUp's DCFunctionsV1 class directly.
              I did that to show how to construct the new method etc...

              You could do it within your module with suitable extends etc:
              http://sketchucation.com/forums/search.php?keywords=extend+class%26amp;fid%5B0%5D=180
              with refine:
              http://sketchucation.com/forums/viewtopic.php?p=573770#p573770
              etc
              BUT I'm unsure that DCFunctionsV1 will respect those added methods outside of your code - i.e. with DC code...
              Test it and see...
              DCFunctionsV1.instance_methods.sort

              TIG

              1 Reply Last reply Reply Quote 0
              • michaelwhksgM Offline
                michaelwhksg
                last edited by

                Hi TIG, I have been trying for a few days with DCFunctionsV1.instance_methods.sort.

                However, it does not really work.

                Are you able to help enlighten me further?

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

                  Using
                  DCFunctionsV1.instance_methods.sort
                  in the Ruby Console simply returns a list of all of the methods available.
                  If you have added your own method it will also be listed there.

                  The example I gave for adding ' atan2' will work if you then used it as directed in your DC code...

                  TIG

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

                    You have misunderstood the purpose of the ...methods.sort snippet.
                    It is for use in the Ruby Console - pasted manually - so that you can see what's available.
                    The main code that defines the new function should NOT have that added into it !
                    As you have found it breaks it !

                    You have a script creating the atan2 function.
                    Do not do anything more to that.
                    Do not place it within your own name spaces [for now at least].
                    Use it as my example...
                    Use it to add the extra function directly into the DC code.

                    In the DC you then use: =atan2(y,x)
                    as the function...

                    TIG

                    1 Reply Last reply Reply Quote 0
                    • michaelwhksgM Offline
                      michaelwhksg
                      last edited by

                      Understood your message, TIG.

                      Does this mean that at this point in time, we are unable to introduce a new function in our name spaces?

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

                        There are ways to use an existing class and add to it or 'refine' it etc within your own module[s].
                        But that will provide the new class/method when called within your module - but not outside of it.

                        Since the DC code is calling its class/method directly, then your own method-wrapped additions will not be seen by it.

                        Since you are only using this code for yourself [?] I see little wrong in adding directly to the DC class and then making your own separate code within your own module[s] to do other things.
                        The method I provided only adds the new method it it doesn't exist [for example some other code is adding it or in the future it's added to the main shipped class.

                        It is bad form to mess with shipped classes etc, but sometimes you must do it - e.g. this DC class methods are used directly in the DC functions...

                        TIG

                        1 Reply Last reply Reply Quote 0
                        • michaelwhksgM Offline
                          michaelwhksg
                          last edited by

                          Thanks for the advice, TIG. Appreciate your input.

                          At this moment, I am using the code for myself. However, I am also looking at opportunity to release the dynamic components I have created into the Extension Store.

                          I have seen the recommendation that you have shared with others in the forum. One way of getting the DC component to be dependent on the plugin is to give the DC component a function defined in the code. The DC component will not work without the plugin.

                          How can we use the class DCFunctionV1 within the name space (our own module) so that it fulfills the requirement of a good practice of a plugin? This is the question I am trying to get around. Any recommendation on this?

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

                            I don't think you can do it wrapped inside your module.
                            It needs to add the function-method to the DC class directly, so that it's then seen by the DC function calling that class.
                            If you define it within your module it's your module's class and will not be seen.
                            Even if you 'refine' it or use it in other ways it's new methods are only seen in your class.
                            You need to change the DC class directly !

                            Changing a shipped class might get you into a mess on the EWH.
                            You could of course sell it separately...

                            TIG

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

                              Can you please format your code using the 'code' tags and indent it.
                              It's very hard to read as it is...

                              Your example is still changing the shipped class, so it will probably fail EWH checking...
                              You can but submit it, and wait and see.

                              You do not need the convolutions you added - they do nothing to a DC and still change the shipped class.

                              I can see no way you can do this and distribute it via the EWH, unless they agree to your class additions which technically break their strict rules...
                              πŸ˜•

                              TIG

                              1 Reply Last reply Reply Quote 0
                              • michaelwhksgM Offline
                                michaelwhksg
                                last edited by

                                Hi TIG. Sorry, will use the "code" tags in future.

                                Will try to submit once I have cleaned up the code.
                                Fingers crossed, but I have a feeling that you are right. It might get rejected.

                                It will be a pity though, because I believe there are many members who are able to build up the dynamic components (which can speed up and simplify the entire modelling process), but there's no way to prevent the DC from being distributed without the authors' agreement.

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

                                  @michaelwhksg said:

                                  Hi TIG. Sorry, will use the "code" tags in future.

                                  (1) A better idea is to edit your previous post, and insert the code tags.

                                  (2) The example is STILL wrong in that the check for method definition still uses the name atan2.

                                  (3) Yes, please use a unique method name, as your implementation of the atan2 method (specifically the parameter list) is not how the rest of the world would define it for use by ALL coders.

                                  I'm not here much anymore.

                                  1 Reply Last reply Reply Quote 0
                                  • michaelwhksgM Offline
                                    michaelwhksg
                                    last edited by

                                    If i am using the code which you have shared, and keying DCFunctionsV1.instance_methods.sort in the Ruby Console, I do see atan2 appearing in the console.

                                    However, if I tried inserting the DCFunctionsV1.instance_methods.sort into the code, an error message appeared.

                                    Below is the code which I have tried...


                                    # add_funcs.rb
                                    # extends DCs functions
                                    require('sketchup')
                                    
                                    module ABC
                                    module ABC123
                                    
                                    if Sketchup.version.to_i <= 8
                                      require('dynamiccomponents.rb')
                                    else
                                      require('su_dynamiccomponents.rb')
                                    end
                                    if defined?($dc_observers)
                                      # Open SketchUp's Dynamic Component Functions (V1) class.
                                      # only if DC extension is active
                                      class DCFunctionsV1.instance_methods.sort #(did I do this correctly?)
                                        protected
                                        unless DCFunctionsV1.method_defined?(;atan2)
                                          # access to Ruby's arctangent method
                                          # Usage; =atan2(y,x)
                                          def atan2(a)
                                            return Math;;atan2(a[0],a[1]).radians
                                          end
                                        end#unless
                                        protected;atan2
                                      end#class
                                    end#if
                                    
                                    end #module ABC123
                                    end #module ABC
                                    
                                    

                                    This generated an error message.

                                    "Error Loading File arctan-test2.rb
                                    Error: #<SyntaxError: C:/Users/wongh/AppData/Roaming/SketchUp/SketchUp 2017/SketchUp/Plugins/arctan-test2.rb:16: syntax error, unexpected '\n', expecting :: or '[' or '.'
                                    C:/Users/wongh/AppData/Roaming/SketchUp/SketchUp 2017/SketchUp/Plugins/arctan-test2.rb:30: syntax error, unexpected keyword_end, expecting end-of-input
                                    end #module ABC
                                    ^>"

                                    Is there anything I have done wrongly?


                                    arctan-test2.rb


                                    arctan-test.skp

                                    1 Reply Last reply Reply Quote 0
                                    • michaelwhksgM Offline
                                      michaelwhksg
                                      last edited by

                                      Since we are unable to wrap the class DCFunctionsV1 in the name space, if we just submit the script with 2 parts, one of which is the DCFunctionsV1 and letting the formula be defined as my own unique name, and the second part which is wrapped within my name space, will this work? Will EWH team accept this?

                                      For example,...

                                      # add_funcs.rb
                                      # extends DCs functions
                                      require('sketchup')
                                      if Sketchup.version.to_i <= 8
                                        require('dynamiccomponents.rb')
                                      else
                                        require('su_dynamiccomponents.rb')
                                      end
                                      if defined?($dc_observers)
                                        # Open SketchUp's Dynamic Component Functions (V1) class.
                                        # only if DC extension is active
                                        class DCFunctionsV1
                                          protected
                                          unless DCFunctionsV1.method_defined?(;XXXXXX)
                                            # access to Ruby's arctangent method
                                            # Usage; =ABC123
                                            def (we give this definition a unique name)
                                              return XXXXXX (my own unique formula)
                                            end
                                          end#unless
                                          protected;ABC123
                                        end#class
                                      end#if
                                      
                                      module ABC
                                      module ABC123
                                      
                                      codes to be in the name space
                                      
                                      end #ABC123
                                      end #ABC
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • michaelwhksgM Offline
                                        michaelwhksg
                                        last edited by

                                        Hi Dan,
                                        Thanks for the feedback.

                                        1. Have already edited the previous posts with the code tags.
                                        2. Have changed the example slightly (removal of the name atan2).
                                        3. Will use my unique name for the formula in the DCFunctionsV1 class.

                                        Will try to submit the extension after I clean up my code.
                                        Thanks.

                                        1 Reply Last reply Reply Quote 0
                                        • michaelwhksgM Offline
                                          michaelwhksg
                                          last edited by

                                          Hi TIG, Dan,
                                          Is there any resources online that shows how we can input the licensing code to our script? The below web link automatically directed me to another webpage instead of the licensing tutorial.

                                          http://www.sketchup.com/intl/en/developer/docs/tutorial_licensing

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

                                            The licensing tutorial was removed pending an overhaul. No amount of asking has resulted in any estimation of when the tutorial will be edited and reposted.

                                            Julia Christina Eneroth has posted her own licensing tutorial with test code at GitHub:
                                            https://github.com/Eneroth3/Sketchup-Api-Licensing-Test

                                            I'm not here much anymore.

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

                                            Advertisement