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

[Plugin] 2dBoolean ver1.3.1 beta UPDATE 20 dec 2013

Scheduled Pinned Locked Moved Plugins
88 Posts 8 Posters 48.8k 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.
  • T Offline
    TIG Moderator
    last edited by 26 Aug 2011, 15:31

    If you have an 'empty' group [or definition] that's been made or just emptied within a start/commit block, then it should be auto-deleted at the 'commit' [this is also a way to remove just one definition from the model - empty its entities...] πŸ€“

    TIG

    1 Reply Last reply Reply Quote 0
    • J Offline
      jolran
      last edited by 26 Aug 2011, 16:57

      I did not know that. Good info. Garbage collection? Well in this case all the groups and defs are made within the block, so all good? Of course the group or definition would have to empty..

      1 Reply Last reply Reply Quote 0
      • T Offline
        TIG Moderator
        last edited by 26 Aug 2011, 17:29

        Of course if you have references to the groups etc then a simple group.erase! or inside a start/commit block the group.entities.erase_entities(group.entities.to_a) will both remove that one group [or instance OR definition when entities go!]... or groups[0]/parent.entities.erase_entities(groups) [where 'groups' is an array of all temporary groups]... will all work !

        TIG

        1 Reply Last reply Reply Quote 0
        • J Offline
          jolran
          last edited by 26 Aug 2011, 18:47

          Cool. So you can erase the group by erasing it's entities while inside a start/commit block? That could be useful, thanks.

          1 Reply Last reply Reply Quote 0
          • J Offline
            jolran
            last edited by 27 Aug 2011, 14:34

            Small update. Now If you have a component that have gluing behavior you don't have to select a face to run the plugin. I noticed you run into situations quite often where that is needed. Like when the face is covered and you can not select it. πŸ˜„

            This will not work with groups.

            1 Reply Last reply Reply Quote 0
            • J Offline
              jolran
              last edited by 27 Aug 2011, 18:53

              I think I know why faces in holes don't get erased.

              Face.classify point only deals with points/vertices. So if there is a face in a hole inside the face(inner edge loop). Erasing the vertices from face.classify point outside(holes included) does not erase the face in the hole at all times πŸ˜•

              Don't know how to solve that one yet.. But at least I know what's wrong.

              I reckon the plugin is kinda useless, unless I fix this. So it's got high priority now.

              1 Reply Last reply Reply Quote 0
              • J Offline
                jolran
                last edited by 28 Aug 2011, 09:27

                I think I am close fixing this hole problem.

                So I have made a collection of verticies(from face.clone) That binds the innerloops in faceclone(faces to go)

                I want to use that collection to erase the faces in the boolean group.
                This does not work 😞

                (@verts=vertex collection) need to be instance variable or it will get deleted..

                cents.to_a.each{|e| 
                		       if e.class==Sketchup;;Face and e.outer.loop==@verts.loops
                		          gp2faces2 << e
                			  end
                			}           
                			
                			cents.erase_entities(gp2faces2)
                
                1 Reply Last reply Reply Quote 0
                • T Offline
                  TIG Moderator
                  last edited by 28 Aug 2011, 09:35

                  @verts is an array ?
                  e.outer.loop==@verts.loops won't work as an array doesn't have a '.loops' method ??
                  e.outer.loop==@verts[0].loops[0] might if there's only one loop ???
                  @verts[0].loops.include?(e.outer.loop) might otherwise ????
                  Not sure... as you posted 'clipped code'...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • J Offline
                    jolran
                    last edited by 28 Aug 2011, 13:04

                    Sorry my post was unclear and made in a hurry 😳

                    Yes it's an array of face.vertices. The one from face.clone, faces to go.

                    I suppose there are multiple ways of achieving what I want. But I have failed so far.
                    Will try some combination of @verts[0.loops.include?(e.outer.loop)] as you suggest, see what happends.
                    There could be scenarios where the faces has multiple "holes", so e.outer.loop==@verts[0.loops[0]] might not work.

                    Thank you TIG.
                    Off to try!

                    1 Reply Last reply Reply Quote 0
                    • E Offline
                      EarthMover
                      last edited by 28 Aug 2011, 16:36

                      Here's a video tutorial on using the plugin for stamping stone patterns into various shapes. So far I've had great results. Thanks again Joel and TIG!

                      [flash=800,600:1trov9v7]http://www.youtube.com/v/SNTQDBmKIro[/flash:1trov9v7]

                      3D Artist at Clearstory 3D Imaging
                      Guide Tool at Winning With Sketchup
                      Content Creator at Skapeup

                      1 Reply Last reply Reply Quote 0
                      • J Offline
                        jolran
                        last edited by 28 Aug 2011, 17:13

                        Earthmover! β˜€

                        That's quite a demonstration. Really! I can see here experienced modelers can find new workflows. Nice use of styles too.

                        I know it's a bit slow when having a lot of geometry. It will be faster in Hatchfaces (tiled patterns without faces).

                        Anyway, thank you for a nice video.

                        1 Reply Last reply Reply Quote 0
                        • J Offline
                          jolran
                          last edited by 29 Aug 2011, 08:54

                          I'm wondering if the "hole" issue can be solved at all using face.classify method. πŸ˜•

                          Watching Eartmover movie one can see he using a lot of detail in his meshes. Doing that, you will probably get faces and edges erased from holes, of the face it's glued to. Wich is the desired result!

                          But if you are using less geometry for intersecting! For ex just a 2d square covering some holes. The face covering the hole will not be deleted cause there arent any vertices in the hole. The same if you have an edge crossing over the hole it will be assumed to be outside the hole, and therefore not deleted.

                          Now, I have come so far to create a new group inside the colored group, that is a face_clone of the "holes".
                          Don't know yet how I am going to use it as a reference for what to delete, since the faces are inside an individual group.
                          Tried exploding it but the reference to the faces gets deleted.

                          This could take a while to fix...


                          dilemma.jpg

                          1 Reply Last reply Reply Quote 0
                          • T Offline
                            TIG Moderator
                            last edited by 29 Aug 2011, 10:56

                            I think you need to take a step back on this face with holes issue...
                            If the originally selected face has holes then your cloned face can too...
                            You make a new group of the selected group/instance and explode it [recursively till it's all raw geometry].
                            You replicate the edges from the cloned face, inside this new group.
                            You .intersect_with() everything inside this new group so all edges get split etc.
                            You then test every edge in this group and if it fails it's collected and later the collection is erased.
                            The test for the edge needs to look at its start/end vertices positions and use face.classify_point(pt) - where the face tested is the originally selected face - you need to make several tests on each point as 'on face and not in hole', 'on edge', 'on vertex' etc might all count'... but 'off face' or 'in hole' won't.
                            If an edge has one or two 'on face and not in hole' that edge passed.
                            If an edge has one 'off face' or 'in hole' it fails.
                            If an edge has two 'on edge' or 'on vertex' hits then it might be either on OR off the original face - it's on the perimeter of the original face - it could be spanning a convex corner and by 'on' but it could be spanning a concave corner and be 'off'... so to test for this you then offset the start point towards the end point to find the midpoint of the edge mid=edge.start.position.offset(edge.line[1],edge.length/2) - now test that 'mid' point and if theta point returns 'true' for 'on face and not in hole' or 'on edge' then we know that that edge passes as its either a perimeter edge OR spanning a convex corner so it's 'on-face', but if it fails it's across a concave corner and it's listed for erasing later...
                            Set your tests up methodically and you should end up with a set of edges to go - the unwanted faces will go with them...

                            TIG

                            1 Reply Last reply Reply Quote 0
                            • J Offline
                              jolran
                              last edited by 29 Aug 2011, 12:47

                              @unknownuser said:

                              If the originally selected face has holes then your cloned face can too...

                              I hope the picture from last post did not make it look like I was having problem with the face.clone? It's the colored face(cutting comp) that is not getting holes, when totaly covering the holes. I provide another (more illustrating) picture.

                              @unknownuser said:

                              offset the start point towards the end point to find the midpoint of the edge mid=edge.start.position.offset(edge.line[1],edge.length/2) - now test that 'mid' point and if theta point returns 'true' for 'on face and not in hole' or 'on edge' then we know that that edge passes as its either a perimeter edge OR spanning a convex corner so it's 'on-face', but if it fails it's across a concave corner and it's listed for erasing later...

                              That is pretty clever πŸ˜„ That will help to get rid of edges in holes.

                              @unknownuser said:

                              the unwanted faces will go with them...

                              Probably not every time? Look at the picture, the big hole has no edges in it. Faces without edges in them will not get erased.

                              Thank you for the help, TIG. I will try to get this working.


                              separated result.jpg

                              1 Reply Last reply Reply Quote 0
                              • J Offline
                                jolran
                                last edited by 29 Aug 2011, 14:34

                                Another question TIG, about start point offset to mid. I put you formula iterating through edges. And yes, I see the additional midpoints being counted(using puts).

                                Question is. Can points be used for erasing edges that way? Must not there be a vertice on the edge at that position to be able to delete the edge? I'm using If edge used by?
                                But the edge is not using that offset point, it's just a dot in space. Am I getting it wrong?

                                I suppose I could use edge.split at that mid.point. But that would DOUBLE the vertices and have splits in the middle of every edge in the component! Could kill Sketchup, having patterns like Earthmover was showing?

                                @unknownuser said:

                                I think you need to take a step back on this face with holes issue...

                                Yeah, getting crazy about it...

                                1 Reply Last reply Reply Quote 0
                                • T Offline
                                  TIG Moderator
                                  last edited by 29 Aug 2011, 19:19

                                  NO !
                                  Each tested pair of points for an edge just tells us that the related edge must go if they fail on some grounds, or if it the result is just 'iffy' then re-test for the midpoint and if that fails then off the edge goes into the edges2go array; and when all edges are examined fully you do edges2go.flatten! to remove duplicates [just in case there are any! there shouldn't be] and then use edges2go[0].parent.entities.erase_entities(edges2go)... πŸ˜•

                                  TIG

                                  1 Reply Last reply Reply Quote 0
                                  • J Offline
                                    jolran
                                    last edited by 29 Aug 2011, 19:30

                                    @unknownuser said:

                                    NO !

                                    Clear enough πŸ˜„

                                    Ok, I will continue with this method. You showed me some new moves there I haven't tried.

                                    1 Reply Last reply Reply Quote 0
                                    • T Offline
                                      TIG Moderator
                                      last edited by 29 Aug 2011, 19:36

                                      Also why not look at it this alternative way?
                                      You use the original selected group; or if it's an instance then add that to a new group and immediately explode the instance. Now either way you now have a group to use.
                                      Use group.entities.intersect_with() using the the group.entities for the results, with a new transformations [0,0,0], and the object to intersect being ((face.edges)+face).
                                      Now test all of the group.entities edges for being on the originally selected 'face' as already outlined...
                                      Any lines not on the face get erased.
                                      Now it's possible that some faces in the group might still remain over holes in the face...
                                      To find and remove those examine each face within group.entities [let's called each 'tface'].
                                      Test the following point pt=tface.bounds.center.project_to_plane(face.plane)
                                      for being on the 'face' [but not in a hole!]... It will fail if it's one of the faces over a 'hole' in 'face' - if so add the tface to a 'faces2go' array.
                                      When all faces are tested use faces2go[0].parent.entities.erase_entities(faces2go).
                                      Now the last step is to check for any un-faced edges left after these unwanted faces were removed... group.entities.to_a.each{|e|e.erase! if e.class==Sketchup::Edge and not e.faces[1]}...
                                      NOW we should have things sorted ???

                                      TIG

                                      1 Reply Last reply Reply Quote 0
                                      • J Offline
                                        jolran
                                        last edited by 29 Aug 2011, 20:04

                                        I have to call it a day. Been at it since morning without any results. Your new approach here give me hope. πŸ‘

                                        I will sleep on it and try this tomorrow.

                                        Thanks for helping me out TIG. πŸ˜„

                                        1 Reply Last reply Reply Quote 0
                                        • T Offline
                                          TIG Moderator
                                          last edited by 30 Aug 2011, 13:17

                                          My alternative way is a bit simpler.
                                          Here it is reiterated.
                                          Select face and group or instance.
                                          Run tool.
                                          Tool sorts out the parts: one face and one group/instance.
                                          If it's an instance it's grouped and exploded and that group is used.
                                          Now you
                                          tr=Geom::Transformation.new() group.entities.intersect_with(true,tr,group.entities,tr,true,(face.edges+[face]))
                                          You then then collect all of the edges in the group.
                                          Make an array - edges2go=[]
                                          Test each edge in turn.
                                          pts=edge.start.position
                                          then
                                          pte=edge.end.position
                                          against face.classify_point(pts) etc
                                          If one point is 'on the face' [and not in a hole] AND the other point is 'on the face' [and not in a hole] OR it's on a face's edge OR on a vertex then that edge is OK.
                                          If both of these points are NOT 'on the face' [and not in a hole] AND NOT on a face's edge AND NOT on a face's vertex, then it's
                                          edges2go << edge.
                                          If both points are on one of the face's edges or vertices then it could be either 'on' or 'off' face; so we must test the edge's midpoint ( mid=pts.offset(edge.line[1], edge.length/2)) to see if that's 'on the face' [not in a hole] OR on a face's edge OR on a vertex - IF it is any of these then it's OK as it's spanning a convex corner and is all 'on face', otherwise it's off to edges2go << edge again, as it's spanning a concave corner - either within a 'hole' or an internal L-shape and falls outside of the face !
                                          You then erase all of these unwanted edges [any connected faces go with them] with
                                          group.entities.erase_entities(ents2go)
                                          There should be no 'stray lines' left by this method and this allows loose unfaced edges to be in the group and remain [trimmed to the face edges if needed]...

                                          This simpler idea can then be applied to the main hatching tool tool.
                                          We get the hatch/crosshatch parameters.
                                          We iterate through selected faces in turn.
                                          A new 'hatch' group is made that will become bigger than each face bounds... lines are added to form the hatch/crosshatch [in the plane of the face], all of these lines are then intersected_with the 'face'. Each of the edge's two points are again tested with face.classify_point() [and midpoint if questionable] to make an array of unwanted ones to remove.

                                          πŸ€“

                                          TIG

                                          1 Reply Last reply Reply Quote 0
                                          • 1
                                          • 2
                                          • 3
                                          • 4
                                          • 5
                                          • 2 / 5
                                          2 / 5
                                          • First post
                                            35/88
                                            Last post
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement