sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    πŸ›£οΈ Road Profile Builder | Generate roads, curbs and pavements easily Download

    Using add_3d_text

    Scheduled Pinned Locked Moved Developers' Forum
    15 Posts 4 Posters 1.8k Views 4 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.
    • G Offline
      Greg
      last edited by

      Hello,

      I'm using the command add_3d_text to add text to objects. How do you
      change orientation of the text so that it looks like it's on the
      surface of a plane? For example, I'd like the text to display at the
      top and front of a rectangular cube.

      Here is a code snippet:


      top plane

      pt1 = Geom::Point3d.new(x,y,z+h)
      pt2 = Geom::Point3d.new(x+w,y,z+h)
      pt3 = Geom::Point3d.new(x+w,y+l,z+h)
      pt4 = Geom::Point3d.new(x,y+l,z+h)
      edges[0] = entities.add_line(pt1, pt2)
      edges[1] = entities.add_line(pt2, pt3)
      edges[2] = entities.add_line(pt3, pt4)
      edges[3] = entities.add_line(pt4, pt1)
      face = entities.add_face edges
      face.material = m

      t=Geom::Transformation.new(pt1)
      grp=entities.add_group(); grpEnts=grp.entities
      grpEnts.add_3d_text("hey mon", 1, "Arial", false, false, 4.inch,
      1.mm, 0, false, 0)
      grp.move!(t)

      front plane

      pt1 = Geom::Point3d.new(x,y,z)
      pt2 = Geom::Point3d.new(x+w,y,z)
      pt3 = Geom::Point3d.new(x+w,y,z+h)
      pt4 = Geom::Point3d.new(x,y,z+h)
      edges[0] = entities.add_line(pt1, pt2)
      edges[1] = entities.add_line(pt2, pt3)
      edges[2] = entities.add_line(pt3, pt4)
      edges[3] = entities.add_line(pt4, pt1)
      face = entities.add_face edges
      face.material = m

      t=Geom::Transformation.new(pt4)
      grp=entities.add_group(); grpEnts=grp.entities
      grpEnts.add_3d_text("hey mon", 1, "Arial", false, false, 4.inch,
      1.mm, 0, false, 0)
      grp.move!(t)


      Thank you.

      Greg

      1 Reply Last reply Reply Quote 0
      • T Offline
        todd burch
        last edited by

        Mods, please move this to the Ruby Forum.

        1 Reply Last reply Reply Quote 0
        • G Offline
          Greg
          last edited by

          Done.

          1 Reply Last reply Reply Quote 0
          • GaieusG Offline
            Gaieus
            last edited by

            Yeah, this is definitely ruby stuff.

            BTW welcome, Greg, but what do you mean by "done"?

            Gai...

            1 Reply Last reply Reply Quote 0
            • G Offline
              Greg
              last edited by

              Done means I moved the posting to this forum, Ruby Discussions, from the 'Newbie' forum. Actually, I copied this from the 'Newbie' forum to this forum, 'Ruby Discussions'. I don't know how to move a posting.

              Is there a more appropriate forum then 'Ruby Discussions'?

              1 Reply Last reply Reply Quote 0
              • G Offline
                Greg
                last edited by

                Just a follow-up to clarify my question: How do I set the (x,y,z) coordinates of the text to control it's orientation?

                I am programmatically assigning 3dtext as pallet labels to the front and top of pallets in a virtual warehouse created from ruby code generated from a c# application accessing inventory data from a SQL database, 2 to 3 thousand pallets.

                Right now, the text just lays flat on an x,y plane. That works for printing text on the top of pallets, but I can't orient the text upright so that it properly prints on the front of pallets.

                I hope this makes sense.

                Thank you.

                Greg

                1 Reply Last reply Reply Quote 0
                • GaieusG Offline
                  Gaieus
                  last edited by

                  @greg said:

                  Done means I moved the posting to this forum, Ruby Discussions, from the 'Newbie' forum. Actually, I copied this from the 'Newbie' forum to this forum, 'Ruby Discussions'. I don't know how to move a posting.

                  Ok, I see. I also moved your topic nd then found that you copied it here so I merged the two.

                  @unknownuser said:

                  Is there a more appropriate forum then 'Ruby Discussions'?

                  No, this is the finest forum for this (in the World? πŸ˜‰ )

                  Gai...

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

                    See my TextTag script that does this. The 3d-text is grouped, it appears at 0,0,0, it's then transformed to where you want it, snapping to faces etc as desired...

                    301 Moved Permanently

                    favicon

                    (www.sketchucation.com)

                    TIG

                    1 Reply Last reply Reply Quote 0
                    • G Offline
                      Greg
                      last edited by

                      Thanks TIG,

                      I actually used your code as a guide to get as far as you see here. But I don't see how to programmatically snap the 3dtext to the front and side of a cubed-shaped object (pallet) without user intervention. I need the application to snap the text to the pallet automatically.

                      Is this the section of your code I should reference for the 'snapto' functionality?

                      %(#FF0040)[compo.behavior.always_face_camera=true if @cfacing=="Yes" ### faces camera
                      if @asnap=="Yes"
                      compo.behavior.is2d=true
                      compo.behavior.snapto=0 ### snaps to Any surface
                      end#if

                      tag=model.place_component(compo)]

                      If so, I can't figure out the relationship between your compo (components) and my grpEnts (entities).

                      Greg

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

                        After you have auto-placed the grp containing the 3d-text you need to rotate it in Z, then so it's vertical. You need to make a "rotation transformation"...

                        transformation=Geom::Transformation.rotation(anchor_point,vector_axis,angle_radians)

                        e.g. for a right-angle about Z try -

                        rotate=Geom::Transformation.rotation(pointN.[0,0,1],90.degrees)

                        e.g. for a right-angle about Y try -

                        rotate=Geom::Transformation.rotation(pointN.[0,1,0],90.degrees)

                        etc

                        Mess around to find which you need for which group...

                        TIG

                        1 Reply Last reply Reply Quote 0
                        • G Offline
                          Greg
                          last edited by

                          Thanks TIG, I'll do this.

                          Greg

                          1 Reply Last reply Reply Quote 0
                          • G Offline
                            Greg
                            last edited by

                            TIG,

                            I have tried variations of the code but I can't get it to work.

                            %(#FF0040)[txtPt = Geom::Point3d.new(x+w,y,z+(h/2))
                            t=Geom::Transformation.new(txtPt)
                            grp=entities.add_group(); grpEnts=grp.entities
                            grpEnts.add_3d_text("hey mon", 1, "Verdana", false, false, 4.inch, 1.mm, 0, false, 0)
                            grp.move!(t)

                            grp = Geom::Transformation.rotation(txtPt,[0,0,1],90.degrees) # these are variations
                            txtPt = Geom::Transformation.rotation(txtPt,[0,0,1],90.degrees) # these are variations
                            t = Geom::Transformation.rotation(txtPt,[0,0,1],90.degrees) # these are variations
                            rotate = Geom::Transformation.rotation(grp,[0,0,1],90.degrees) # these are variations]

                            I don't understand the relationship of 'Geom::Transformation.rotation(point,vector,angle)' to grpEnts.add_3d_text.

                            What am I overlooking?

                            Thank you.

                            Greg

                            1 Reply Last reply Reply Quote 0
                            • G Offline
                              Greg
                              last edited by

                              TIG,

                              Thanks for your help. The following code 'status = grpEnts.transform_entities t, grpEnts.collect' rotates the 3D-Text:

                              txtPt = Geom::Point3d.new(x+w,y,z+(h/2))
                              t=Geom::Transformation.new(txtPt)
                              grp=entities.add_group(); grpEnts=grp.entities
                              grpEnts.add_3d_text("hey mon", 1, "Verdana", false, false, 4.inch, 1.mm, 0, false, 0)
                              grp.move!(t)

                              t = Geom::Transformation.rotation(txtPt,[1,0,0],90.degrees)
                              status = grpEnts.transform_entities t, grpEnts.collect

                              This was copied from ldraw.rb.

                              Greg

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

                                I'd expect this to work for the 't' rotation - note that I prefer to keep things inside parentheses () - although it will work without (usually):

                                grpEnts.transform_entities(t,grpEnts)

                                or for the group rather than it's entities

                                grp.transform!(t)

                                (it's similar to grp.move!(t) ...)

                                Now you just have to copy this group of 3d-text (grp2=grp.copy!) and move! it around the corner and rotate transform! it to suit.

                                In SketchUp Ruby here are often several ways of doing the same complex thing - like transformations -, BUT sometimes there's NOT one way of doing some simple thing !!! For example finding the active section-plane or finding if sections-cuts are currently being shown in the view (something I'm looking at currently) - even the SDK doesn't access these shortcomings in the API...

                                Glad you fixed it.

                                TIG

                                1 Reply Last reply Reply Quote 0
                                • G Offline
                                  Greg
                                  last edited by

                                  Thanks TIG,

                                  I'll apply your suggestions and evaluate the results.

                                  Greg

                                  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