• Login
sketchucation logo sketchucation
  • Login
🤑 SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

Ruby Observer Existence Check

Scheduled Pinned Locked Moved Developers' Forum
6 Posts 3 Posters 1.7k Views 3 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.
  • H Offline
    hank
    last edited by 22 Apr 2017, 15:29

    Is there any way to check to see if an entity already has an observer attached to it?

    I am using:

    
    class MyInstanceObserver < Sketchup;;InstanceObserver
      def onChangeEntity(entity)
    	  #puts "onChangeEntity; #{entity}"
      end
    end
    
    

    and then

    my_openings = ent.grep(Sketchup;;ComponentInstance).find_all {|oi| oi.definition.name.include?('OPENING') }
      my_openings.each do |oi|
        next unless oi.valid?
      oi.add_observer(MyInstanceObserver.new)
    end
    

    But would prefer not to blindly attached an observer always. This loop will have been run previously.

    1 Reply Last reply Reply Quote 0
    • T Online
      TIG Moderator
      last edited by 22 Apr 2017, 16:02

      How about doing it this way.
      Outside of any of your methods...

      @@obs = MyInstanceObserver.new() unless @@obs

      That only runs once and its reference can then be used thus:

      oi.remove_observer(@@obs) oi.add_observer(@@obs)

      Attempting to remove a non-existent observer does NOT raise an error.
      So in this way just one instance of the observer is only ever attached to an instance.

      TIG

      1 Reply Last reply Reply Quote 0
      • H Offline
        hank
        last edited by 22 Apr 2017, 19:40

        Thanks TIG. I though @@ was for classes???

        I got an "uninitialized class" error until changed @@obs to @obs

        Your solution worked perfect though!

        1 Reply Last reply Reply Quote 0
        • T Online
          TIG Moderator
          last edited by 22 Apr 2017, 20:54

          You usually set @@obs = nil inside a class [outside of any method].
          Then within one of that class's methods [like initialize()] you can set it to be a proper reference - but just the once.
          In a class it needs to be @@obs = ... to persist across instances of the class.
          A @obs = ... in a class only exists during that one instance of the class.

          In my example I set it only if it's not already set [i.e. it is nil].

          You can set @obs = ... within a module, outside of any of its methods and that then persists thereafter.

          Since I didn't have your whole code I guessed... 😕

          TIG

          1 Reply Last reply Reply Quote 0
          • H Offline
            hank
            last edited by 24 Apr 2017, 01:05

            Thanks TIG. Have not gotten very advanced with Classes etc. so just a simple module. Appreciate the explanation.

            1 Reply Last reply Reply Quote 0
            • D Offline
              Dan Rathbun
              last edited by 25 Apr 2017, 15:26

              @tig said:

              You can set @obs = ... within a module, outside of any of its methods and that then persists thereafter.

              This is true because, a module is an instance of class Module.

              @hank said:

              Have not gotten very advanced with Classes etc. so just a simple module.

              The Class class is the direct child class of class Module. So classes inherit all of Module's functionality, and get a little bit of their own (ie, a few extra methods and the ability to have many instance copies of themselves, that can hold their own instance variable values.)

              I'm not here much anymore.

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

              Advertisement