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

    A quick Question

    Scheduled Pinned Locked Moved Dynamic Components
    sketchup
    12 Posts 5 Posters 2.2k Views 5 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.
    • J Offline
      Jim
      last edited by

      RAND() is a built in function and shouldn't be used as an attribute?

      Edit: No, that's not it.

      Hi

      1 Reply Last reply Reply Quote 0
      • Chris FullmerC Offline
        Chris Fullmer
        last edited by

        I think that every cell gets re-calculated on the redraw() command. That would be multiple re-evaluations of a random number. Here is a breakdown of how I think redraw is working:

        Redraw() ---> Simultaneously evaluates the following operations
        1st - The actual Length for x ---> Looks to "LenX" ---> Looks at "Rand" and is assigned a random value (ie 15)
        2nd - The value for Lenx ---> Gets sent to "Rand" for a random value (ie 27)
        3rd - The value for Rnd ---> assigns itself a random value (ie 19)

        So the length of X actually in the model comes from the first function above. This value is not displayed anyhwhere, just evaluated and applied to the model. The displayed value in "LenX" is from the 2nd operation. The value displayed for "Rand" is worked out in the 3rd operation. So that is how we are seeing three different values where it seems like we should only be seeing one. But it is really the very first evaluation that is being applied to the model.

        Is that a possible explanation for what we're seeing? That almost seems like a ReDraw() bug. Seems like that sort of makes it unuseable in certain ways.

        Instead of using a redraw() function, use this in the onclick cell:

        set("rand",(randbetween(10,30)))

        Now on the onclick event, the entire model is not being re-evaluated. Just the random number gets re-evaulated. Then all other cells get updated based on the new random number.

        I hope that makes sense. And It might take an explanation from Scott or someone to verify if that is anywhere near correct.

        Chris

        Lately you've been tan, suspicious for the winter.
        All my Plugins I've written

        1 Reply Last reply Reply Quote 0
        • R Offline
          remus
          last edited by

          So essentially what you think is happening is rand is being evaluated several times and giving several different values?

          Seems to fit the evidence, it'll be interesting to hear what the official line is.

          Cheers for the working code btw πŸ‘

          http://remusrendering.wordpress.com/

          1 Reply Last reply Reply Quote 0
          • scottliningerS Offline
            scottlininger
            last edited by

            @remus said:

            So essentially what you think is happening is rand is being evaluated several times and giving several different values?

            Seems to fit the evidence, it'll be interesting to hear what the official line is.

            Remus,

            This is exactly what is happening. Whenever a reference to a "randomized" cell is made, the random function is refired. I'm happy to hear opinions on whether this behavior is "right" or not. πŸ˜„

            • Scott Lininger
              SketchUp Software Engineer
              Have you visited the Ruby API Docs?
            1 Reply Last reply Reply Quote 0
            • R Offline
              remus
              last edited by

              Personally i dont think it's 'right' as it makes it very hard to make more than one attribute dependant on a random variable.

              I.e. if i make the material dependant on something random, i cant make anything dependant on the material as it gets re-evaluated and so isnt random.

              http://remusrendering.wordpress.com/

              1 Reply Last reply Reply Quote 0
              • Chris FullmerC Offline
                Chris Fullmer
                last edited by

                You can randomize another attribute, then have everything refer to that value. Then they won't all be calling the random function each time. But you will have the attribute with the random function and the attribute holding your randomized value displaying different values, which is confusing.

                Chris

                EDIT: For people reading this in the future, this is not true. At least not at this point. Hopefully DC's will get this randomize kink worked out. But for now, this is bad information, as Remus points out below.

                Lately you've been tan, suspicious for the winter.
                All my Plugins I've written

                1 Reply Last reply Reply Quote 0
                • R Offline
                  remus
                  last edited by

                  That doesnt always work chris, especially if you start using the redraw function.

                  Nice avatar by the way, ive never noticed it before πŸ˜›


                  rand problem.skp

                  http://remusrendering.wordpress.com/

                  1 Reply Last reply Reply Quote 0
                  • Chris FullmerC Offline
                    Chris Fullmer
                    last edited by

                    Hey, I missed your response here Remus, sorry about that. I only looked this thread up because I am seeing some unsurmountable issues with the way that random is setup.

                    The solution I posted above only works when you are using the OnClick. So for all the rest of the times that you don't want to use onclick, you are stuck not being able to get a random value and send it to multiple attributes.

                    Hey Scott, where are you? This probably is not the right behavior. What are the alternatives?

                    I think my thought is that a cell that contains a random should only be evaluated once until a refresh, or on a copy being created (so copies can have thier own random properties). On a refresh, the "random" should be re-evaluated and assign the value to the cell somehow. That value should then be the only thing passed on to other attributes that call back to it. It should not be re-evaluated. I think that makes sense and explains what I am expecting to happen.

                    Chris

                    Thanks on the avatar. I painted it at Crissy Field which is a park at the base of the Golden Gate Bridge.

                    Lately you've been tan, suspicious for the winter.
                    All my Plugins I've written

                    1 Reply Last reply Reply Quote 0
                    • M Offline
                      matthew.robert
                      last edited by

                      I think my problem is related to this discussion.

                      I have three children items and I would like only one to be shown at a time. I thought I could do this:

                      Parent
                      randthing=randbetween(1,3)

                      Child1
                      hidden=if(parent!randthing=1,0,1)
                      Child2
                      hidden=if(parent!randthing=2,0,1)
                      Child3
                      hidden=if(parent!randthing=3,0,1)

                      But it looks as if each child refires its own value for randthing, making the hidden value not mutually exclusive as I would like.

                      I could have sworn that I successfully did this before. Not sure if there was a hack or not, but if anyone has any ideas it would be appreciated.

                      I am getting some crazy ideas to concatenate a string and the random value and then stripping out the value once again... just to keep it from changing.

                      FRUSTRATION EDIT

                      I thought I could outsmart the problem by doing this:

                      Parent
                      randthing=randbetween(1,3)
                      randhack="x"&randthing

                      Child1
                      hidden=if(parent!randthing="x1",0,1)
                      Child2
                      hidden=if(parent!randthing="x2",0,1)
                      Child3
                      hidden=if(parent!randthing="x3",0,1)

                      But that failed too. It looks like the randbetween() function gets re-fired no matter how far back or indirectly it is linked. Cripes.

                      1 Reply Last reply Reply Quote 0
                      • Chris FullmerC Offline
                        Chris Fullmer
                        last edited by

                        @matthew.robert said:

                        It looks like the randbetween() function gets re-fired no matter how far back or indirectly it is linked. Cripes.

                        That is correct. Even if you link and link and link back to it, it still refires each time its refered to. There is no way to make the value stick, unfortunately.

                        Though, I think it is still possible to do what you want to do. I'll see if I can find an example that randomly shooses which component to show when they are generated.

                        Chris

                        Lately you've been tan, suspicious for the winter.
                        All my Plugins I've written

                        1 Reply Last reply Reply Quote 0
                        • Chris FullmerC Offline
                          Chris Fullmer
                          last edited by

                          Aha, I found the example I was thinking of. This is from PITRAK on the PushpullbarII forum in this thread:

                          http://www.pushpullbar.com/forums/sketchup/10076-dynamic-components-test.html

                          See if that one helps. I don't remember what id does differently or how it works, but it randonly chooses between 3 different options.

                          Chris


                          DC random wall.skp

                          Lately you've been tan, suspicious for the winter.
                          All my Plugins I've written

                          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