[code] beta Group/Image parent, glued_to? etc.

Moderator: Jim

[code] beta Group/Image parent, glued_to? etc.

Postby Dan Rathbun » Thu Jul 08, 2010 1:13 am

betacode Group / Image parent, glued_to? etc.

This was prompted by thomthom's post:
Get/Set Image and Group glue_to ?
...this is the result of brainstorming, between Dan, TIG and ThomThom
.. I'm still endevour to optimize these in Ruby as much as possible.

Remember... these are candidates for C implementation, where they belong.

REVEDITS
0.1.0
  • posted
0.2.0
  • changed all "Sketchup.active_model" in below methods to "self.model" to accomodate Mac MDI multimodel environment.
0.3.0
  • changed name of methods "parent_definition" to "definition" to be like ComponentInstance.definition, and to avoid confusion with the SKP Document heirarchy ".parent" method.
  • updated both "glued_to?" boolean methods, to raise a mismatch exception if receiver and argument are in different models.
0.4.0
  • updated code for Sketchup::Image#glued_to
  • setdown code for Sketchup::Group#glued_to
  • updated code for Sketchup::Image#definition
  • updated code for Sketchup::Group#definition
0.5.0
  • changed to using .find iterator for:
    • method Sketchup::Group#definition
    • method Sketchup::Group#glued_to
    • method Sketchup::Image#definition
    • method Sketchup::Image#glued_to
0.6.0
  • updated methods: Sketchup::Group#glued_to? and Sketchup::Image#glued_to? :
    • reordered outer conditional statement
    • fixed class in TypeError message for the Image method
  • updated the methods (listed in rev 0.5.0,) to iterate array copies for search integrity.



class Sketchup::Group

Sketchup::Group # definition
_ updated _ 0.6.0
Code: Select all
class Sketchup::Group
  unless (defined? definition)=='method'
    #
    # def  query method: definition
    #
    def definition
      dl=self.model.definitions.to_a
      if dl.length>0
        # find definition
        # enumObj.find returns first true result or nil
        df = dl.find {|cd|
          cd.group? && cd.instances.include?(self)
        }
        unless df.nil?
          return df
        else
          raise(IndexError," in `definition', Sketchup::Group object does not have a definition in the active_model DefinitionList. (count: #{dl.length.to_s})")
        end
      else
        raise(IndexError," in `definition', Sketchup::Group object does not have a definition! The active_model DefinitionList is empty.")
      end
    end
  else
    $stderr.write('Sketchup::Group#definition method already defined.')
  end
end#class



Sketchup::Group # glued_to?
_ updated _ 0.6.0
Code: Select all
class Sketchup::Group
  unless (defined? glued_to?)=='method'
    #
    # def boolean method: glued_to?(face)
    #
    def glued_to?(face)
      unless face.class==Sketchup::Face
        raise(TypeError," in `glued_to?', Sketchup::Face expected.")
      else
        if face.model==self.model
          face.get_glued_instances.include?(self)
        else
          raise(ArgumentError," in `glued_to?', Group && Face model mismatch.")
        end
      end
    end # method
  else
    $stderr.write('Sketchup::Group#glued_to? method already defined.')
  end
end#class



Sketchup::Group # glued_to
_ updated _ 0.6.0
Code: Select all
class Sketchup::Group
  unless (defined? glued_to)=='method'
    #
    # def query method: glued_to
    #
    def glued_to
      #
      # search for faces with matching normal and
      # test their glued instances for self
      #
      groupnormal=self.transformation.zaxis
      face=self.model.entities.to_a.find {|ent|
        ent.class==Sketchup::Face && ent.normal==groupnormal && self.glued_to?(ent)
      }
      # returns like ComponentInstance.glued_to
      # Returns nil if it is not glued to anything, otherwise the face.
      return face
      #
    end # method
  else
    $stderr.write('Sketchup::Group#glued_to method already defined.')
  end
end #class



class Sketchup::Image

Sketchup::Image # definition
_ updated _ 0.6.0
Code: Select all
class Sketchup::Image
  unless (defined? definition)=='method'
    #
    # def query method: definition
    #
    def definition
      dl=self.model.definitions.to_a
      if dl.length>0
        # find definition
        # enumObj.find returns first true result or nil
        df = dl.find {|cd|
          cd.image? && cd.instances.include?(self)
        }
        unless df.nil?
          return df
        else
          raise(IndexError," in `definition', Sketchup::Image object does not have a definition in the active_model DefinitionList. (count: #{dl.length.to_s})")
        end
      else
        raise(IndexError," in `definition', Sketchup::Image object does not have a definition. The active_model DefinitionList is empty.")
      end
    end # method
  else
    $stderr.write('Sketchup::Image#definition method already defined.')
  end
end#class



Sketchup::Image # glued_to?
_ updated _ 0.6.0
Code: Select all
class Sketchup::Image
  unless (defined? glued_to?)=='method'
    #
    # def boolean method: glued_to?(face)
    #
    def glued_to?(face)
      unless face.class==Sketchup::Face
        raise(TypeError," in `glued_to?', Sketchup::Face expected.")
      else
        if face.model==self.model
          face.get_glued_instances.include?(self)
        else
          raise(ArgumentError," in `glued_to?', Image && Face model mismatch.")
        end
      end
    end # method
  else
    $stderr.write('Sketchup::Image#glued_to? method already defined.')
  end
end#class



Sketchup::Image # glued_to
_ updated _ 0.6.0
Code: Select all
class Sketchup::Image
  unless (defined? glued_to)=='method'
    #
    # def query method: glued_to
    #
    def glued_to
      #
      # search for faces with matching normal and
      # test their glued instances for self
      #
      face=self.model.entities.to_a.find {|ent|
        ent.class==Sketchup::Face && ent.normal==self.normal && self.glued_to?(ent)
      }
      # returns like ComponentInstance.glued_to
      # Returns nil if it is not glued to anything, otherwise the face.
      return face
      #
    end # method
  else
    $stderr.write('Sketchup::Image#glued_to method already defined.')
  end
end #class
0
Last edited by Dan Rathbun on Wed Jul 14, 2010 2:04 pm, edited 8 times in total.
    I'm not here much anymore. But a PM will fire email notifications.
    User avatar
    Dan Rathbun 
    PluginStore Author
    PluginStore Author
     

    Re: [code] beta Group/Image parent, glued_to? etc.

    Postby thomthom » Thu Jul 08, 2010 7:17 am

    It's actually not .glued_to? that is missing from Group and Image, it's .glued_to. The ComponentInstance method returns the face it's stuck to, not testing given face.

    I'm thinking that this is something there is no workaround for. (.glued_to might be done if you iterate every face in the model, but that is just plain silly.) Need to poke Google.
    0
    Thomas Thomassen — SketchUp Monkey & Coding addict
    List of my plugins and link to the CookieWare fund
    User avatar
    thomthom 
    PluginStore Author
    PluginStore Author
     

    Re: [code] beta Group/Image parent, glued_to? etc.

    Postby Dan Rathbun » Thu Jul 08, 2010 7:33 am

    thomthom wrote:It's actually not .glued_to? that is missing from Group and Image, it's .glued_to. The ComponentInstance method returns the face it's stuck to, not testing given face.


    I knew yuz wassa gonna say tha' thom. I made the .glued_to?(face) method so that it could be used by the other.

    thomthom wrote:I'm thinking that this is something there is no workaround for. (.glued_to might be done if you iterate every face in the model, but that is just plain silly.) Need to poke Google.


    I have a play around half done version of glued_to at the bottom (the last code block.)
    0
      I'm not here much anymore. But a PM will fire email notifications.
      User avatar
      Dan Rathbun 
      PluginStore Author
      PluginStore Author
       

      Re: [code] beta Group/Image parent, glued_to? etc.

      Postby Dan Rathbun » Thu Jul 08, 2010 7:49 am

      Either we iterate the model entities testing faces.. or

      we come up with a nifty geometric way of firing rays from the center of the objects bounding box, and getting a small set of the closest faces to test.

      Theoretically speaking... the "line to closest face" from the center of an Image BB, to the face it's glued_to, should be 0, right?
      0
        I'm not here much anymore. But a PM will fire email notifications.
        User avatar
        Dan Rathbun 
        PluginStore Author
        PluginStore Author
         

        Re: [code] beta Group/Image parent, glued_to? etc.

        Postby thomthom » Thu Jul 08, 2010 8:12 am

        Two problems:

        1. rays are slow - would be a gamble if they where faster than iterating the model.
        2. GlueTo components doesn't have to have any geometry on the glued face - just the axis origin. While I'd guess that most do in fact lie on the face itself, there are cases where it doesn't. I have used that to space objects apart.
        0
        Thomas Thomassen — SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund
        User avatar
        thomthom 
        PluginStore Author
        PluginStore Author
         

        Re: [code] beta Group/Image parent, glued_to? etc.

        Postby Dan Rathbun » Thu Jul 08, 2010 8:56 am

        thomthom wrote:1. rays are slow - would be a gamble if they where faster than iterating the model.

        Ok wait.. put groups aside a moment. Dealing with Images first.

        An Image has a normal. Depending on whether someone reversed the image, to glue to the back of a window (a decal,) or it's a poster whose back is glued to a wall. You'd only need fire 2 rays, a normal and an anti-normal.
        The starting point would be image.bounds.center, so

        testface=model.raytest(self.bounds.center, self.normal)[1].last
        and
        testface=model.raytest(self.bounds.center, self.normal.reverse)[1].last

        If you think the image could be "stood off" or rotated so it's not glued flat, then the number of rays would be perhaps 6 max. (fore, back, right, left, up, down.)
        0
          I'm not here much anymore. But a PM will fire email notifications.
          User avatar
          Dan Rathbun 
          PluginStore Author
          PluginStore Author
           

          Re: [code] beta Group/Image parent, glued_to? etc.

          Postby thomthom » Thu Jul 08, 2010 9:58 am

          Except - the ray from the centre of the image doesn't need to hit the face. The image might lie over a hole in the face, or the image might hang off the side of the face.

          Possibly - if one shot the ray from the origin of the Image.
          0
          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund
          User avatar
          thomthom 
          PluginStore Author
          PluginStore Author
           

          Re: [code] beta Group/Image parent, glued_to? etc.

          Postby thomthom » Thu Jul 08, 2010 10:00 am

          thomthom wrote:Possibly - if one shot the ray from the origin of the Image.

          Nope - that one isn't 100% either. The image moves freely on the face plane - so it's possible that the Image lies outside the face.
          0
          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund
          User avatar
          thomthom 
          PluginStore Author
          PluginStore Author
           

          Re: [code] beta Group/Image parent, glued_to? etc.

          Postby TIG » Thu Jul 08, 2010 10:15 am

          This code will return the face a Group OR Image is glued to...
          Usage: Select a Group or Image - type face=glued in the Ruby Console - face is returned as the face it's glued to, or nil if not glued: it's written like this for testing BUT it can be easily reworked for 'self' tests etc...
          The model.raytest method fails as there could be a hole in the real glued_to face affecting the 'down' tests, while the 'up' test will interfere with the geometry in 'self' anyway ?
          Since a glued 'component' always glues with its zaxis == face.normal we collect all faces with the equivalent normal and then test just those for their glued items and return the face that has the Group/Image glued to it, if any...
          Code: Select all
          def glued()
            model=Sketchup.active_model
            ents=model.active_entities
            ss=model.selection
            inst=ss[0] ### a group or image
            return nil if inst.class!=Sketchup::Group and inst.class!=Sketchup::Image
            tr=inst.transformation
            norm=tr.zaxis
            faces=[]
            ents.each{|e|faces<< e if e.class==Sketchup::Face and e.normal==norm }
            faces.each{|face|
              if face.get_glued_instances.include?(inst)
                return face
              end#if
            }
            return nil
          end
          0
          TIG
          User avatar
          TIG 
          Global Moderator
           

          Re: [code] beta Group/Image parent, glued_to? etc.

          Postby Dan Rathbun » Thu Jul 08, 2010 10:17 pm

          It's good to talk these things out. Gets it on the record for others who may go down the same musing paths in the future.

          TIG wrote:The model.raytest method fails as there could be a hole in the real glued_to face affecting the 'down' tests, while the 'up' test will interfere with the geometry in 'self' anyway ?

          And.. as thomthom pointed out (in the API discussions,) model.raytest does not hit hidden items, but does hit items on hidden layers; which makes using it a real pain-in-the-rearend, sometimes.

          TIG wrote:Since a glued 'component' always glues with its zaxis == face.normal we collect all faces with the equivalent normal and then test just those for their glued items and return the face that has the Group/Image glued to it, if any...

          And now, we get where I was wanting to go. To filter down the items to test, by a geometrical property.
          0
            I'm not here much anymore. But a PM will fire email notifications.
            User avatar
            Dan Rathbun 
            PluginStore Author
            PluginStore Author
             

            Re: [code] beta Group/Image parent, glued_to? etc.

            Postby Dan Rathbun » Sat Jul 10, 2010 3:38 am

            TIG wrote:This code will return the face a Group OR Image is glued to...

            line 7: tr=inst.transformation
            ** class Sketchup::Image does NOT have a .transformation method
            ** line 7 goes away
            line 8 would need to be:
            norm=(inst.class==Sketchup::Image ? : inst.normal : inst.transformation.zaxis )
            not: norm=tr.zaxis
            0
              I'm not here much anymore. But a PM will fire email notifications.
              User avatar
              Dan Rathbun 
              PluginStore Author
              PluginStore Author
               

              Re: [code] beta Group/Image parent, glued_to? etc.

              Postby Dan Rathbun » Sat Jul 10, 2010 3:44 am

              Can a Group or Image glue to a Face that's nested within another Group or a ComponentInstance ??
              0
                I'm not here much anymore. But a PM will fire email notifications.
                User avatar
                Dan Rathbun 
                PluginStore Author
                PluginStore Author
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby thomthom » Sat Jul 10, 2010 8:49 am

                Dan Rathbun wrote:Can a Group or Image glue to a Face that's nested within another Group or a ComponentInstance ??

                Yes. Attached is a sample where an image is glued to a face contained inside a cutout-glueto component which itself it glued to a face inside a component.
                0
                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund
                User avatar
                thomthom 
                PluginStore Author
                PluginStore Author
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby thomthom » Sat Jul 10, 2010 8:50 am

                Also - it is possible to hide the face which the ComponentInstance/Group/Image is glued to - without affecting visibility of the glued entity.
                0
                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund
                User avatar
                thomthom 
                PluginStore Author
                PluginStore Author
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby TIG » Sat Jul 10, 2010 9:28 am

                Dan Rathbun wrote:
                TIG wrote:This code will return the face a Group OR Image is glued to...

                line 7: tr=inst.transformation
                ** class Sketchup::Image does NOT have a .transformation method
                ** line 7 goes away
                line 8 would need to be:
                norm=(inst.class==Sketchup::Image ? : inst.normal : inst.transformation.zaxis )
                not: norm=tr.zaxis

                BUT since an Image AND a Group are both DrawingElements they both have .transformation as a method!

                Try selecting one Group and paste this line into the Ruby Console:
                Sketchup.active_model.selection[0].transformation.to_a
                you will see the array of data for the Group's transformation...

                Now select one Image and repeat the line of code - this time you will see another transformation array for the Image...

                It DOES work for either type.....
                :geek:
                0
                TIG
                User avatar
                TIG 
                Global Moderator
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby TIG » Sat Jul 10, 2010 9:32 am

                For the avoidance of doubt... like any component-definition instance [which has gluing/cutting capabilities set] a Group or an Image will glue to a raw geometry face in the same context and cut a hole - BUT you it won't glue to a face inside another set of entities and cut - so you can't glue an instance "onto an instance" and get a cut... But you can glue+cut an instance onto a face inside a second instance during an edit of that second instance's definition's entities... A gluing instance will glue to a face that is itself 'inside' another instance BUT it won't 'cut' the face :?
                0
                TIG
                User avatar
                TIG 
                Global Moderator
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby thomthom » Sat Jul 10, 2010 9:46 am

                Sketchup.active_model.selection[0].transformation.to_a

                Does not work for Image elements.
                Error: #<NoMethodError: (eval):149: undefined method `transformation' for #<Sketchup::Image:0xe3dc6b8>>
                (eval):149


                I'm guessing you have a plugin that extends the Image class to provide this.
                0
                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund
                User avatar
                thomthom 
                PluginStore Author
                PluginStore Author
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby TIG » Sat Jul 10, 2010 10:30 am

                No extended class that I know off ?
                Searching............
                0
                TIG
                User avatar
                TIG 
                Global Moderator
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby TIG » Sat Jul 10, 2010 10:34 am

                Found it ! AlexM's
                image_code.rb
                which gives an Image additional .transformation, .transformation=() and .definition ........... useful stuff...

                I had assumed that .transformation was inherited from DrawingElement! :oops:
                0
                TIG
                User avatar
                TIG 
                Global Moderator
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby thomthom » Sat Jul 10, 2010 10:40 am

                Then Face and Edge would also have had .transformation. Why Image doesn't have .transformation while Group and ComponentInstance, ... the usual SketchUp API logic :roll: ?
                0
                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund
                User avatar
                thomthom 
                PluginStore Author
                PluginStore Author
                 

                Re: [code] beta Group/Image parent, glued_to? etc.

                Postby Dan Rathbun » Sat Jul 10, 2010 10:44 am

                TIG wrote:
                Dan Rathbun wrote:
                ** class Sketchup::Image does NOT have a .transformation method

                BUT since an Image AND a Group are both DrawingElements they both have .transformation as a method!

                I am not blind. Sketchup::DrawingElement class does NOT define the transformation instance method.
                Thera are 3 classes that have it: InputPoint, Group and ComponentInstance
                API method index T

                TIG wrote:Now select one Image and repeat the line of code - this time you will see another transformation array for the Image...

                Sketchup.active_model.selection[0].transformation.to_a
                >>
                Error: #<NoMethodError: undefined method `transformation' for #<Sketchup::Image:0x6051440>>
                (eval):2533

                TIG wrote:It DOES work for either type.....

                NO it does NOT!
                I did check, before I posted, by interogating the methods of both Sketchup::Image class, and an instance that I selected in the model.
                0
                Last edited by Dan Rathbun on Sat Jul 10, 2010 10:46 am, edited 1 time in total.
                  I'm not here much anymore. But a PM will fire email notifications.
                  User avatar
                  Dan Rathbun 
                  PluginStore Author
                  PluginStore Author
                   

                  Re: [code] beta Group/Image parent, glued_to? etc.

                  Postby Dan Rathbun » Sat Jul 10, 2010 10:45 am

                  Ah.. ass-u-me .... thomthom your closer, smack him for me.
                  0
                    I'm not here much anymore. But a PM will fire email notifications.
                    User avatar
                    Dan Rathbun 
                    PluginStore Author
                    PluginStore Author
                     

                    Re: [code] beta Group/Image parent, glued_to? etc.

                    Postby TIG » Sat Jul 10, 2010 10:50 am

                    To recap... Image does have transformation as a method IF you have AlexM's image_code.rb in ../Plugins/........

                    :oops: + :knockout: + :knockout:
                    0
                    TIG
                    User avatar
                    TIG 
                    Global Moderator
                     

                    Re: [code] beta Group/Image parent, glued_to? etc.

                    Postby Dan Rathbun » Sat Jul 10, 2010 10:53 am

                    I updated the snippets at the top of the post.

                    Another thing (ref your snippet TIG,) those darned .each loops return the receiver despite any nested return call.
                    I put in a "break if face" type call to see if it would stop the iterate, when the face is found (no sense looking further.)
                    And then the "return face" outside the loop.
                    0
                      I'm not here much anymore. But a PM will fire email notifications.
                      User avatar
                      Dan Rathbun 
                      PluginStore Author
                      PluginStore Author
                       

                      Re: [code] beta Group/Image parent, glued_to? etc.

                      Postby Dan Rathbun » Sat Jul 10, 2010 10:55 am

                      TIG wrote:To recap... Image does have transformation as a method IF you have AlexM's image_code.rb in ../Plugins/........

                      I'll have to see how his Image.definition compares to mine.
                      If you tried to load mine, after his, mine will not redefine the method.
                      EDIT .. they are "OURS" by now after all the brainstorming.
                      0
                        I'm not here much anymore. But a PM will fire email notifications.
                        User avatar
                        Dan Rathbun 
                        PluginStore Author
                        PluginStore Author
                         

                        Re: [code] beta Group/Image parent, glued_to? etc.

                        Postby TIG » Sat Jul 10, 2010 11:10 am

                        Code: Select all
                        faces.each{|face|
                            if face.get_glued_instances.include?(inst)
                              return face
                              break
                            end#if
                        }

                        ?
                        0
                        TIG
                        User avatar
                        TIG 
                        Global Moderator
                         

                        Re: [code] beta Group/Image parent, glued_to? etc.

                        Postby Dan Rathbun » Sat Jul 10, 2010 11:46 am

                        No that won't work.

                        It does not matter what goes on inside the { }
                        the way the each method is written is that it just returns self.

                        But it's kinda dumb.. they could have returned the return value, because it IS returned to the body of the method to the yield call that calls the { } block. But they didn't. They just ignored the return value.
                        0
                          I'm not here much anymore. But a PM will fire email notifications.
                          User avatar
                          Dan Rathbun 
                          PluginStore Author
                          PluginStore Author
                           

                          Re: [code] beta Group/Image parent, glued_to? etc.

                          Postby thomthom » Sat Jul 10, 2010 11:54 am

                          Dan Rathbun wrote:No that won't work.

                          It does not matter what goes on inside the { }
                          the way the each method is written is that it just returns self.

                          But it's kinda dumb.. they could have returned the return value, because it IS returned to the body of the method to the yield call that calls the { } block. But they didn't. They just ignored the return value.

                          :?:

                          > def test; (0..9).each { |i| return 'hello world' if i == 7 }; end
                          nil
                          > test
                          hello world
                          0
                          Thomas Thomassen — SketchUp Monkey & Coding addict
                          List of my plugins and link to the CookieWare fund
                          User avatar
                          thomthom 
                          PluginStore Author
                          PluginStore Author
                           

                          Re: [code] beta Group/Image parent, glued_to? etc.

                          Postby Dan Rathbun » Sat Jul 10, 2010 11:59 am

                          OK.. I knew it was somewhere.

                          It's actually the detect (aka find ) iterator method that is mixed into Array from module Enumerable.

                          enumObj.detect {|item|
                          ### returns the FIRST item for which this block returns true
                          }

                          So using that may be more elegant.
                          0
                          Last edited by Dan Rathbun on Sat Jul 10, 2010 12:57 pm, edited 1 time in total.
                            I'm not here much anymore. But a PM will fire email notifications.
                            User avatar
                            Dan Rathbun 
                            PluginStore Author
                            PluginStore Author
                             

                            Re: [code] beta Group/Image parent, glued_to? etc.

                            Postby Dan Rathbun » Sat Jul 10, 2010 12:03 pm

                            def test; (0..9).each { |i| return 'hello world' if i == 7; puts i.to_s }; end
                            >> nil

                            I get no output at all.

                            ... and I'm not using a Range, I'm using arrays (or a SU Collection psuedo-Array.)

                            EDIT.. yes I do.. had to type "test"

                            ..and you just made me override the Object.test method (from Kernel.) [shoulda known better.]
                            0
                              I'm not here much anymore. But a PM will fire email notifications.
                              User avatar
                              Dan Rathbun 
                              PluginStore Author
                              PluginStore Author
                               

                              SketchUcation One-Liner Adverts

                              by Ad Machine » 5 minutes ago



                              Ad Machine 
                              Robot
                               

                              Next


                               

                              Return to Skx Extension Library

                              Who is online

                              Users browsing this forum: No registered users and 1 guest

                              Visit our sponsors: