• Login
sketchucation logo sketchucation
  • Login
πŸ€‘ 30% Off | Artisan 2 on sale until April 30th Buy Now

[Plugin] Hatchfaces (v1.8 beta) UPDATED 15-Dec-2012

Scheduled Pinned Locked Moved Plugins
360 Posts 41 Posters 228.5k Views
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
    jolran
    last edited by 22 Jul 2011, 16:19

    Genious TIG!

    I think I got it right. It work for me in a few tests.

    Like this, no?

    pt=face.vertices[0].position
          p1=pt.clone
          p1.x=p1.x+1
          p1=p1.project_to_plane(face.plane)
          ve=pt.vector_to(p1)
          bb=face.bounds
          di=bb.diagonal
          po=pt.clone
    

    I mean is that correct for an update, cause this problem is(was) irritating.

    1 Reply Last reply Reply Quote 0
    • T Offline
      TIG Moderator
      last edited by 22 Jul 2011, 17:15

      You need to trap for the case when the X-axis is parallel with the palne and then use another axis - i.e. offset the y instead of the x value of p1...
      To do this get the n=face.normal and then use the alternative vector [offset in y] if n.x.abs==1 or n.z.abs==1
      etc...

      TIG

      1 Reply Last reply Reply Quote 0
      • J Offline
        jolran
        last edited by 22 Jul 2011, 17:24

        Hmm I will try..

        Where do you learn all these commands?? πŸ˜„ It feels like I'm missing some information source(exept from this forum).

        BTW won't there be a conflict of axes if one for ex. have a face rotated 45 degrees?

        1 Reply Last reply Reply Quote 0
        • T Offline
          TIG Moderator
          last edited by 22 Jul 2011, 17:34

          No.
          The problem arises if you try to project a p1 onto a face with a plane that is square to the x-axis or flat to it, as that p1 is then back on p0 and the vector can't have a zero length!

          TIG

          1 Reply Last reply Reply Quote 0
          • J Offline
            jolran
            last edited by 22 Jul 2011, 18:06

            @unknownuser said:

            vector can't have a zero length!

            That I can understand. Alright, I will have a go at it. I'm not sure a fully grasp this 😳
            This is more and more your plugin, it's starting to be too complicated for me. My level is more icons and stuff.
            Maybe one day I can contribute more.

            Thanks for your invaluable help TIG πŸ‘

            1 Reply Last reply Reply Quote 0
            • K Offline
              kyyu
              last edited by 22 Jul 2011, 21:35

              @jolran said:

              Hmm I will try..

              Where do you learn all these commands?? πŸ˜„ It feels like I'm missing some information source(exept from this forum).

              You have to learn the ruby language itself. I'm lacking in this area, too.

              1 Reply Last reply Reply Quote 0
              • J Offline
                jolran
                last edited by 23 Jul 2011, 07:03

                @unknownuser said:

                You have to learn the ruby language itself

                Yeah, you are right. Working on that.

                Good news is the code seams to be working for sorting irregular faces and hatching.

                
                      p1=pt.clone
                      p1.x=p1.x+1 # X value = x axis needs to be replaced if using another axis
                      
                      p1=p1.project_to_plane(face.plane)
                      ve=pt.vector_to(p1)
                      bb=face.bounds
                      di
                

                So something like this does not do the trick yet. Will work on it..

                 p1.each {|e|e.z+1 if face.normal.z.abs==1
                      e.x+1 if face.normal.x.abs==1
                      e.y+1 if face.normal.y.abs==1}
                
                
                1 Reply Last reply Reply Quote 0
                • T Offline
                  TIG Moderator
                  last edited by 23 Jul 2011, 09:44

                  Read this and try to understand...

                  p0=face.vertices[0].position
                  p1=p0.clone
                  if face.normal.x.abs>0.9999
                    p1.y=p1.y+1
                  else
                    p1.x=p1.x+1
                  end#if
                  p1=p1.project_to_plane(face.plane)
                  ve=p0.vector_to(p1)
                  ### etc
                  

                  This should always result in a 've'ctor with a non=zero length.
                  To test it set up a cube and test add temporary 'puts' into the code after ve=
                  puts face.normal puts ve.length πŸ€“

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • J Offline
                    jolran
                    last edited by 23 Jul 2011, 11:54

                    Wow, thanks! So if I understand it correctly one do only need to compare x to y to get the required results. Where if>0,9999 switches to other axis-comparison=under1? Clever.

                    It works for faces without holes if I switch values p0 to pt, with your last posted code.
                    Or do you mean p0 to be po, (typo)? Cause that is a whole different thing. That does not makes sence though, wonder why I think that...

                    I will try that meanwhile..Se if holes get fixed.

                    po=pt.clone:

                    ps=pt.offset(vp)
                            pe=pt.offset(vp.reverse)
                            gents.add_line(ps,pe)
                            pt.offset!(vs,spacing)
                            ps=po.offset(vp)
                    etc
                    
                    1 Reply Last reply Reply Quote 0
                    • J Offline
                      jolran
                      last edited by 23 Jul 2011, 12:37

                      Anyway heres how I implemented your code, between ents erase(facestogo) and intersection. It does not work on faces with holes, as mentioned.
                      Is there a clash with 2 pt.clones? Maybe I HAVE put your code in wrong places. I will continue..

                      bb=face.bounds
                            di=bb.diagonal
                             pt=face.vertices[0].position
                              p1=pt.clone
                           if face.normal.x.abs>0.9999
                            p1.y=p1.y+1
                           else
                            p1.x=p1.x+1
                           end#if
                            p1=p1.project_to_plane(face.plane)
                             ve=pt.vector_to(p1)
                              po=pt.clone
                            tr=Geom;;Transformation.rotation(pt,face.normal,@angle.degrees)
                             vp=ve.transform(tr)
                              vp.length=di*2
                               vs=face.normal.cross(vp) #spacing vector perpendicular to hatch line
                               tot=0
                            until tot>=di*2
                              ps=pt.offset(vp)
                               pe=pt.offset(vp.reverse)
                                gents.add_line(ps,pe)
                                 pt.offset!(vs,spacing)
                                  ps=po.offset(vp)
                                 pe=po.offset(vp.reverse)
                                gents.add_line(ps,pe)
                               po.offset!(vs.reverse,spacing)
                              tot=
                      
                      1 Reply Last reply Reply Quote 0
                      • J Offline
                        jolran
                        last edited by 23 Jul 2011, 12:48

                        May have found something? Commented out the last parts. Line hatching and intersection.
                        The results of faces with holes is a group(clone) with reversed face? Faces without holes is created as expected.
                        Since using face.normal that might (in my theory logic) pose some trouble?

                        Updated Hmmm, no. Grr. Did not matter if faces was reversed or not. Problem remains..

                        This code reverses the faces anyway.
                        Could be useful later on, but it will reverse ALL faces, wich is not useful right now. Faces without holes do not need reversing.

                        faces2=[]
                              gents.each{|e|faces2 << e.reverse! if e.class==Sketchup;;Face
                        
                        1 Reply Last reply Reply Quote 0
                        • T Offline
                          TIG Moderator
                          last edited by 23 Jul 2011, 14:14

                          Perhaps instead of pt=face.vertices[0].position it might be better to use pt=face.outer_loop.vertices[0].position

                          TIG

                          1 Reply Last reply Reply Quote 0
                          • J Offline
                            jolran
                            last edited by 23 Jul 2011, 14:21

                            It does not work 😞

                            However i noticed that "face" entity gets erased after erase(facestogo) if it has holes in it. Not if it's a square for ex!

                            I used puts face after loop face erasing..

                            So do face.plane have something to refere to when there are holes? Or is the variabel set earlier?

                            1 Reply Last reply Reply Quote 0
                            • T Offline
                              TIG Moderator
                              last edited by 23 Jul 2011, 14:27

                              Erase the faces after you've set the points/vector etc - you can't get the plane or normal of an erased face!

                              TIG

                              1 Reply Last reply Reply Quote 0
                              • J Offline
                                jolran
                                last edited by 23 Jul 2011, 14:30

                                AHA!!

                                So even if I am stupid enough to make that misstake, I noticed that in fact that was the error going on?

                                I'm making progress!! πŸ˜„

                                Thanks TIG. I will try to fix it.

                                1 Reply Last reply Reply Quote 0
                                • J Offline
                                  jolran
                                  last edited by 23 Jul 2011, 14:56

                                  The "earliest" place where I can insert gents.erase_entities(faces2go) without erasing the access to face.plane is:

                                  tr=Geom;;Transformation.rotation(pt,face.normal,@angle.degrees)
                                         vp=ve.transform(tr)
                                          vp.length=di*2
                                           vs=face.normal.cross(vp) #spacing vector perpendicular to hatch line
                                            gents.erase_entities(faces2go)
                                           
                                  

                                  The result is not correct. Missing edges and too short.

                                  Is face.plane or any command referring to "face" using the inner-hole faces, perhaps?
                                  Should one use gents.entities.face(or something to retrieve the face.entity in gents) instead of just face?

                                  1 Reply Last reply Reply Quote 0
                                  • T Offline
                                    TIG Moderator
                                    last edited by 23 Jul 2011, 15:10

                                    You can set variables plane=face.plane and normal=face.normal and pt=face.outer_loop.vertices[0].position, then face.erase! - the variables are still remembered... then use them later as needed ?

                                    TIG

                                    1 Reply Last reply Reply Quote 0
                                    • J Offline
                                      jolran
                                      last edited by 23 Jul 2011, 16:05

                                      @unknownuser said:

                                      You can set variables plane=face.plane and normal=face.normal and pt=face.outer_loop.vertices[0].position, then face.erase!

                                      Ok. You mean before faces2go << face? After erase.faces2goI was going to define the
                                      linehatching as a method for crosshatching, as we discussed earlier. They will have to be instance.variables then or do I pass all of them into the argument-list when calling the method?
                                      That's why I was wondering if one could use face from gents.entities, since gents will be passed into the args-list anyway.

                                      Or did you originaly mean I should put the whole operation into a method for crosshatching?

                                      I'm sorry if I sound confused. 😳 But I am.

                                      1 Reply Last reply Reply Quote 0
                                      • T Offline
                                        TIG Moderator
                                        last edited by 23 Jul 2011, 16:21

                                        All this part is trying to do is set the vector from which you will set the angle for the hatching.
                                        At the moment it's set from the vertices [0] to [1] vector which varies, so to fix it I suggested a way of projecting the x-axis onto the face.plane and getting a vector from that to use instead [with changes for a plane that doesn't play nicely with the x-axis to give a valid vector...
                                        You get all of this from the original face NOT the temporary face ??

                                        TIG

                                        1 Reply Last reply Reply Quote 0
                                        • J Offline
                                          jolran
                                          last edited by 23 Jul 2011, 16:59

                                          @unknownuser said:

                                          You get all of this from the original face NOT the temporary face!

                                          Yes, that part I understand(hopefully) what it was about to fix for problems.

                                          However when you said I can't get the plane or normal of an erased face, I thought
                                          order matters. I think my english is a bit bad, I don't understand everything right away. Apologize for that.

                                          Lets say I use ORIGINAL "face" for face plane, I still must pass "face" on in the argument-list if I am going to
                                          have following script setup, wich will be needed for crosshatching later on, no?

                                          Feels like I'm doing some fundamential misstake here.

                                          (edited)It should be "face" in the argument list. NOT faces.


                                          code_structureidea1.jpg

                                          1 Reply Last reply Reply Quote 0
                                          • 1
                                          • 2
                                          • 3
                                          • 4
                                          • 5
                                          • 6
                                          • 7
                                          • 8
                                          • 17
                                          • 18
                                          • 6 / 18
                                          6 / 18
                                          • First post
                                            102/360
                                            Last post
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement