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

    Beginning Ruby - Array and other Questions

    Scheduled Pinned Locked Moved Developers' Forum
    5 Posts 2 Posters 1.1k Views 2 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.
    • B Offline
      BryanHL
      last edited by

      Hi,

      I am just learning Ruby...

      Given

      arrIcosaVtxs = Array.new(12, Array.new(3))

      I can assign like this

      `

      
        arrIcosaVtxs[0] = [Geom;;Point3d.new(0,   0,   0),
                           Geom;;Point3d.new(1.m, 0,   0),
                           Geom;;Point3d.new(0,   1.m, 0)]
      

      `

      but this

      `

      
        arrIcosaVtxs[0, 0] = [Geom;;Point3d.new(0,   0,   0)]
        arrIcosaVtxs[0, 1] = [Geom;;Point3d.new(1.m, 0,   0)]
        arrIcosaVtxs[0, 2] = [Geom;;Point3d.new(0,   1.m, 0)]
      

      `

      fails here

      component.entities.add_face(arrIcosaVtxs[0]) ; # returns a Face

      I am happy to use what works, just wondering why...

      Q2
      I lifted the add_face code from a tutorial.

      In the tute the author assigned the result to a variable.

      newface = new_comp_def.entities.add_face(points) ; # returns a Face

      I have removed the assignment assuming I can access a face in the entities later if need be?

      Q3
      Also, is it possible to create all my geometry and add to a component later?

      Q4
      And possible to make a created component appear in the tray?

      thx...

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

        Q1:
        Your failing part is setting the array's three elements to three separate arrays - each containing one element [a point].
        The working version is setting the array to contain three elements - each being a point.
        A working version for the failing part would be:

        arrIcosaVtxs[0, 0] = Geom;;Point3d.new(0, 0, 0)
        arrIcosaVtxs[0, 1] = Geom;;Point3d.new(1.m, 0, 0)
        arrIcosaVtxs[0, 2] = Geom;;Point3d.new(0, 1.m, 0)
        

        Q2:
        You don't need to make a reference to that face as you create it.
        However, it does no harm.
        Unless it'll be easy to retrieve a reference to that face later on - e.g. it's the only one in that entities collection...

        Q3:
        You normally add the geometry into and entities context, so why would you want to add it into one context and move it into another ?
        Normally you would add the geometry directly into the component definition's entities collection.
        The only exception to this is if you have a selection of entities [in the current active_entities] and you add a group made from those - that group must also be in the same active_entities... otherwise it'll bugsplat!
        group = model.active_entities.add_group(model.selection.to_a)
        After that you could convert the group into a component instance and rename its definition as desired...

        Q4:
        Any new definition you add to the model should appear in the Component Browser's model tray...

        TIG

        1 Reply Last reply Reply Quote 0
        • B Offline
          BryanHL
          last edited by

          I can answer my first question myself

          In another language,

          
              arrIcosaVtxs = Array.new(12, Array.new(3))
          
              arrIcosaVtxs[0, 0] = (Geom;;Point3d.new(0,   0,   0))
              arrIcosaVtxs[0, 1] = (Geom;;Point3d.new(1.m, 0,   0))
              arrIcosaVtxs[0, 2] = (Geom;;Point3d.new(0,   1.m, 0))
          
          

          would be setting the array second dimension elements

          Just realised that in Ruby, the second digit after the comma above is a count...

          Tried this and it works

          
              arrIcosaVtxs[0][0] = (Geom;;Point3d.new(0,   0,   0))
              arrIcosaVtxs[0][1] = (Geom;;Point3d.new(1.m, 0,   0))
              arrIcosaVtxs[0][2] = (Geom;;Point3d.new(0,   1.m, 0))
          
          
          1 Reply Last reply Reply Quote 0
          • B Offline
            BryanHL
            last edited by

            Hi TIG,

            I just posted re my Q1 when I realised what I was doing wrong...

            @unknownuser said:

            Q2:
            You don't need to make a reference to that face as you create it.
            However, it does no harm.
            Unless it'll be easy to retrieve a reference to that face later on - e.g. it's the only one in that entities collection...

            There will be many faces. I am creating polyhedrons.

            You used the word "collection" which was the reason for my post. Is the entities collection an ordered list? As in, if I put 5 in, I can get the 2nd one out from the 2nd position?

            @unknownuser said:

            Q3:
            You normally add the geometry into and entities context, so why would you want to add it into one context and move it into another ?

            I dunno, just learning...
            I was wondering if the geometry can be created separately. But maybe the methods are only available through the entities context?

            Lets say I make a face into a component. I have multiple instances of that component, and I want to add them all to a separate single instance component at the end...

            @unknownuser said:

            Q4:
            Any new definition you add to the model should appear in the Component Browser's model tray...

            Thx, I didn't notice it there bcoz no name...

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

              You can't rely on the ordering of a selection or an entities collection.
              Also you should never 'loop' through a selection or an entities collection, IF your code will affect the selection or collection - since it's references will 'shift' - use .to_a to free it as an array if you must do this...
              If you are adding several faces you make a simple empty array at the start:
              faces = []
              Then every time you make a face you can add that into that array.
              ... face = ... faces << face ...
              Later on you can access the faces array and its ordering will remain constant.

              You can only add geometry into an entities context - so that's either the model.entities [the lowest base level - even if not currently active], model.active_entities [current active context - which might be any collection], or any group.entities or definition.entities ...

              In passing, a group is just a special subset of a component.
              They both have a definition [so does an Image, but we'll not go there yet].
              A definition can have instances - placed into some entities context.
              A component definition can have several instances - changing one changes the others.
              You can make an instance unique so that editing does not affect its relatives.
              A group definition can have several instances, BUT editing one of them automatically makes it unique.
              When iterating a definitions collection you can filter its members using defn.image? and defn.group? to choose or avoid those types...

              TIG

              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