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

    Get attribute roty

    Scheduled Pinned Locked Moved Developers' Forum
    11 Posts 3 Posters 627 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.
    • W Offline
      wood_galaxy
      last edited by

      Hello !

      Sorry for my poor english...

      I will get the value RotY of DC's dynamic_attributes.

      But in my code :
      model = Sketchup.active_model
      entity = model.entities[0]
      roty_1 = entity.get_attribute("dynamic_attributes", "roty")
      roty_2 = entity.definition.get_attribute "dynamic_attributes", "roty"

      puts roty_1

      0
      puts roty_2
      0

      Why get I zero ?
      It must be 30...

      Any idea ?

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

        We must assume that the first object in the model.entities is indeed a DC instance ??
        Your " roty" code to get its attribute, should return its current rotation in Y...
        For the definition's value it's more like " _inst_roty"
        😕
        Why not ensure you have the exact object of your desire in a more robust way?
        This will then avoid any unexpected results...

        TIG

        1 Reply Last reply Reply Quote 0
        • W Offline
          wood_galaxy
          last edited by

          Thanks TIG for your reply.

          Yes, entites[0] is a DC instance.
          It was a simplified example, in my whole code I have different "test" to be sure that is a DC instance.
          And in the same examaple with only one DC :
          entity.get_attribute("dynamic_attributes", "lenx")
          return a value > 0

          I have tested with _inst_roty
          return nil

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

            I have tested it with my own simple DC instance and it returns the current roty value in degrees 😕
            Let's assume the dc instance is referenced as 'dc'...
            Perhaps obtained from dc=Sketchup.active_model.selection[0] in the Ruby Console... Then if you use:
            dc.attribute_dictionaries["dynamic_attributes"].each_pair{|k,v|p k;p v;puts}
            It should print a list of ALL of the dc's attributes' key-names and their values...
            So, do you really want ' roty' is is it some other 'key' ?

            TIG

            1 Reply Last reply Reply Quote 0
            • W Offline
              wood_galaxy
              last edited by

              Ok I don't understand something...

              In my model, I create a "cube" and make it DC (manually).
              I rotate (Y axe) it (manually).

              I type your code in ruby console and run it.
              Return nil

              I display in attributes component window : x,y,z,lenx,leny,lenz,rotx,roty,rotz.
              I run again your code.
              It return each pair key and value

              With my model who have my DC,
              Your code return just
              "_has_movetool_behaviors"
              1.0
              and the two personnal key/value
              But in the attributes component windows all the key and value are displaying...

              In fact, with my code, I can get name, _lengthunits, lenx,ley,lenz. But x,y,z,rotx,roty,rotz, return 0

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

                Everything you have said seems right.
                What does roty say in the DC dialog window?
                '0' or an angle ?
                If it displays as '0' then that's what the attribute is set to.

                Rotating a DC instance in Sketchup will not change its roty rotation as a DC.
                You need to get that from its transformation??

                I am now unclear about what it is you are doing and hoping to achieve in code.
                😕

                TIG

                1 Reply Last reply Reply Quote 0
                • W Offline
                  wood_galaxy
                  last edited by

                  Ok for the time being my aim is to get the angle of my DC.
                  In the DC dialog window roty = 17.
                  With my code I get 0.

                  Ohhh, I get news
                  So I entered directly the angle in the DC dialog window
                  and now the angle appears in the ruby console !

                  But if I move the DC with "move" or "rotate" the angle change in the window but no in the return of my code.
                  Why ?

                  You speak about transformation... did i get my angle with other method than attribute_dictionaries ?

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

                    OK. 😮

                    Now I think I see the issue.

                    A DC's attributes are remembered relative to that DC itself.
                    They do not necessarily relate to the DC instance's 'transformation' in 3d space within the model-context, or even within nested contexts.

                    Image that you were NOT using a DC, but instead it were a simple group of objects...
                    Now you rotate it in the model.
                    How are you to find its model-rotation ?
                    Well... such an object has a 'transformation' which is a complex multi-item matrix of values that determine its location in 3d, and its scale and rotation [about all three axes] etc - many of these values interact - e.g. scaling an object about it's zaxis after it has been rotated has a different outcome compared to scaling it before the rotation.
                    https://developers.google.com/sketchup/docs/ourdoc/transformation

                    You can set various values by adjusting the object's transformation...
                    You can get various info by interrogating the object's transformation...

                    To find an object's rotation about the Y_AXIS in the model you need to find its obj.transformation.yaxis, then after checking it's not parallel to the model's Z_AXIS, you can get the angle between that yaxis and the model Y_AXIS - it's in 'radians', but angle.radians returns it in degrees for you... Next issue is to determine if it's cw/ccw as the angle is not specific. If you take yaxis.cross(Y_AXIS) the resultant vector will be up or down depending on the cw/ccw of the relationship, comparing that vector.z with Z_AXIS.z will tell you whether or not to make the angle negative or not...
                    The reason we checked earlier if the yaxis.parallel?(Z_AXIS) was so that in that specific case we can't get its angle with the Y_AXIS as its always 90 degrees (+/-) with no 'orientation' information, in that case you need to devise a way of getting the angles between its other axes and the equivalent model axes to determine its true model Y_AXIS rotation. The same applies to all other axial rotations you might want to obtain...
                    There ARE complex ways of trying to get an object's rotation about an axis from the transformation itself... For example

                    def euler_angles(tr=nil)
                           return [] unless tr and tr.is_a?(Geom;;Transformation)
                           m = tr.xaxis.to_a + tr.yaxis.to_a + tr.zaxis.to_a
                           if m[6] != 1 and m[6] != 1
                              ry = -Math.asin(m[6])
                              rx = Math.atan2(m[7]/Math.cos(ry),m[8]/Math.cos(ry))
                              rz = Math.atan2(m[3]/Math.cos(ry),m[0]/Math.cos(ry))
                           else
                              rz = 0
                              phi = Math.atan2(m[1], m[2])
                              if m[6] == -1
                                 ry = Math;;PI/2
                                 rx = rz + phi
                              else
                                 ry = -Math;;PI/2
                                 rx = -rz + phi
                              end
                           end
                           return [-rx,-ry,-rz] if xyz==[]
                    end
                    

                    Usage rotations=euler_angles(object.transformation)
                    It returns nil, OR a three element array of the [rotx, roty, rotz] angles
                    So to find the object's 'roty' you can use:
                    roty=euler_angle(object.transformation)[1]
                    etc etc... The code's a bit untested and needs some trialing to see if the angles return correctly...

                    TIG

                    1 Reply Last reply Reply Quote 0
                    • W Offline
                      wood_galaxy
                      last edited by

                      Ok, I need some times to understand what you say.

                      But... Why I can't get the information that I see in the DC attribute window ?
                      Then in the DC attribute window the information is update automatically...

                      How the feature File/Generate rapport do that ?

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

                        Sorry... you seem to be confusing the DC attributes and an object's actual 3d transformation 😕
                        If you set an angle for RotY in the DC's dialog as say 15 that's what the attribute is read to be in the Reporter [OR any code you write]...
                        The 'properties' of an object within the model are not necessarily tied to these DC attributes... indeed an object need not be a DC at all... that's its 'transformation'.

                        Now I am confused 😕

                        TIG

                        1 Reply Last reply Reply Quote 0
                        • existmeE Offline
                          existme
                          last edited by

                          I wonder if you had find an answer to your problem, I also need to know the value of lenY but I cannot get it through get_attribute with out entering them manually in dc panel

                          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