sketchucation logo sketchucation
    • Login
    šŸ¤‘ SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

    Points and directionality

    Scheduled Pinned Locked Moved Developers' Forum
    7 Posts 3 Posters 288 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.
    • G Offline
      Garry K
      last edited by

      A user clicks on 2 points and I create a door. Unfortunately if the user picks the right corner and drags to the left corner then my door gets created backwards. My problem is to detect which of the 2 points is the most left based on the current view. I have the bottom 2 points but I do not know which is right and which is left.

      One strategy that I see is maybe I could use the camera's eye

      Sketchup.active_model.active_view.camera.eye

      I could create 2 vectors and then get the angle between the vectors.
      But will this allow me to determine which is the most left?

      1 Reply Last reply Reply Quote 0
      • tt_suT Offline
        tt_su
        last edited by

        Would you not want to create the door in the direction the user picks the points?

        Do you mean left/right in the viewport sense - or left/right in the sense of the 3d model space?

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

          @tt_su said:

          Do you mean left/right in the viewport sense - or left/right in the sense of the 3d model space?

          viewport sense - I think that's where the camera might help out.

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

            I assume you are flattening the two points so pt2.z = pt1.z ?
            And trapping for pt1.vector_to(pt2).parallel?(Z_AXIS)
            And trapping for pt1==pt2 etc...

            So now you have two coplanar points pt1 & pt2.

            You always take the insertion-point as the left-hand-most-point and then the direction for the door from the vector of that insertion-point to the other-point.
            eye = Sketchup.active_model.active_view.camera.eye
            Then
            ve1 = eye.vector_to(pt1) ve2 = eye.vector_to(pt2)
            The check which point is "to the left using"
            if ve1.parallel?(ve2) if ve2.length > ve1.length # nearest-point is insertion p1=pt1 p2=pt2 else p1=pt2 p2=pt1 end else # find ordering of points left/right cross = vec1.cross(ve2) if cross.z <= 0 p1=pt1 p2=pt2 elsif cross.z > 0 p1=pt2 p2=pt1 end end
            Now use p1 & p2 for you insertion-point and direction calcs...
            NOT pt1 & pt2 which might be swapped ??

            TIG

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

              Thanks TIG - I'll chew on this for awhile and see where I get.
              This line confuses me - I'm thinking a couple of typos??

              cross = vec1.cross(ve2)[/ruby

              did you mean

              cross = ve1.cross(ve2) #ruby

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

                cross = ve1.cross(ve2)

                The other bit was a typo edit balls up !
                I've removed it from my original text for the avoidance of confusion... šŸ˜’

                If you 'cross' two vectors you get a vector at right-angles to them.
                It points 'up' [>0] or 'down' [<0] depending of the clockwise/ccw order of the vectors.
                If you make the two points coplanar, with the same z, then it's either [0,0,-1] or [0,0,1] depending on the 'order' cw/ccw etc...

                TIG

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

                  TIG,

                  I didn't need the parallel code. I wanted to return the original pts and the flattened one

                  
                        pt1 = @ip1.position
                        pt2 = @ip2.position
                  
                        p1 = Geom;;Point3d.new(pt1.x, pt1.y, [pt1.z, pt2.z].min)
                        p2 = Geom;;Point3d.new(pt2.x, pt2.y, [pt1.z, pt2.z].min)
                  
                        eye = Sketchup.active_model.active_view.camera.eye
                  
                        ve1 = eye.vector_to(p1)
                        ve2 = eye.vector_to(p2)
                  
                        return [pt2,pt1,p2] if( ve1.cross(ve2).z > 0 )
                  
                        [pt1,pt2,p1]
                  
                  

                  My test

                  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