sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    How to cut from object

    Scheduled Pinned Locked Moved Developers' Forum
    47 Posts 4 Posters 3.9k 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.
    • A Offline
      ado130
      last edited by

      So there are 2 solutions for this (I think)

      1. save somewhere the group where will be notch
      2. find that group somehow
        because, when I do a dril, I'm using this
      		group = nil
      		face = nil
      		Sketchup.active_model.entities.each{|g|
      			next unless g.is_a?(Sketchup;;Group)
      			g.entities.each{|f|
      				next unless f.is_a?(Sketchup;;Face)
      				if f.classify_point(center) == Sketchup;;Face;;PointInside then
      					group = g
      					face = f
      				end
      			}	
      		}
      

      2.) Exist a way how to find "my" group, where is the rectangular block, when the center point is outside that block?

      1 Reply Last reply Reply Quote 0
      • sdmitchS Offline
        sdmitch
        last edited by

        @ado130 said:

        So there are 2 solutions for this (I think)

        1. save somewhere the group where will be notch
        2. find that group somehow
          because, when I do a dril, I'm using this
        		group = nil
        > 		face = nil
        > 		Sketchup.active_model.entities.each{|g|
        > 			next unless g.is_a?(Sketchup;;Group)
        > 			g.entities.each{|f|
        > 				next unless f.is_a?(Sketchup;;Face)
        > 				if f.classify_point(center) == Sketchup;;Face;;PointInside then
        > 					group = g
        > 					face = f
        > 				end
        > 			}	
        > 		}
        

        2.) Exist a way how to find "my" group, where is the rectangular block, when the center point is outside that block?

        Perhaps

        if center.on_plane f.plane then
        	group = g
        	face = f
        end
        
        

        Nothing is worthless, it can always be used as a bad example.

        http://sdmitch.blogspot.com/

        1 Reply Last reply Reply Quote 0
        • A Offline
          ado130
          last edited by

          It almost works, but the result is

          http://i.imgur.com/RMnKEB6.png

          def notch(x, y, z, radiuses, depths, directions)
          	model = Sketchup.active_model 
          	countOfNotch = x.length.to_i
          	countOfNotch.times do |i|
          		
          		center = [x[i], y[i], z[i]].map(&;to_f)		
          		radius = radiuses[i]
          		depth = depths[i]
          		direction = directions[i]
          		
          		case direction
          			when "N"
          				dir = Geom;;Vector3d.new(0,0,1)
          			when "E"
          				dir = Geom;;Vector3d.new(-1,0,0)
          			when "S"
          				dir = Geom;;Vector3d.new(0,0,-1)
          			when "W"
          				dir = Geom;;Vector3d.new(1,0,0)		
          			when "F"
          				dir = Geom;;Vector3d.new(0,-1,0)	
          			when "B"
          				dir = Geom;;Vector3d.new(0,1,0)				
          			else
          				dir = Geom;;Vector3d.new(0,0,1)		
          		end		
          		
          		group = nil
          		Sketchup.active_model.entities.each{|g|
          			next unless g.is_a?(Sketchup;;Group)
          			g.entities.each{|f|
          				next unless f.is_a?(Sketchup;;Face)
          				if center.on_plane? f.plane then
          					group = g
          				end
          			}	
          		}	
          		gents = group.entities
          		active_faces = gents.grep(Sketchup;;Face);
          		circle_group = gents.add_group; cge = circle_group.entities;
          		edges = cge.add_circle(center, dir, radius);
          		circle_group.explode;
          		circle_face = (gents.grep(Sketchup;;Face) - active_faces)[0];
          		circle_face.pushpull(-depth)		
          	end
          end
          

          It works only if the cylinder's face is whole on the block.

          It "works", if I have two blocks on each other

          http://i.imgur.com/kAnKpQY.png

          1 Reply Last reply Reply Quote 0
          • sdmitchS Offline
            sdmitch
            last edited by

            In the second image, are both blocks in the same group? If so two new faces will be created and only one is being pushpulled.

            Nothing is worthless, it can always be used as a bad example.

            http://sdmitch.blogspot.com/

            1 Reply Last reply Reply Quote 0
            • A Offline
              ado130
              last edited by

              No, they aren't. I know it's a problem and if I will do drill into 2 blocks, they need to be in the same group. But for now, the problem is first image. It looks like, pushpull tools pushpull the block and not cylinder(drill/notch).

              It works!! I had a little bug in my input file.
              So final code is

              		group = nil
              		Sketchup.active_model.entities.each{|g|
              			next unless g.is_a?(Sketchup;;Group)
              			g.entities.each{|f|
              				next unless f.is_a?(Sketchup;;Face)
              				if center.on_plane? f.plane then
              					group = g
              				end
              			}	
              		}	
              		gents = group.entities
              		active_faces = gents.grep(Sketchup;;Face)
              		circle_group = gents.add_group; cge = circle_group.entities
              		edges = cge.add_circle(center, dir, radius)
              		circle_group.explode
              		circle_face = (gents.grep(Sketchup;;Face) - active_faces)[0]
              		circle_face.pushpull(-depth)	
              		togos = [] 
              		edges.each{|edge| togos << edge unless edge.faces[0] }
              		model.active_entities.erase_entities(togos) if togos[0]	
              

              Many many many thanks to both!
              Maybe a question about the second image, is it possible do it somehow?
              i.e.: Even if they are 4 blocks next to each (2x2 matrix) and create a hole in the middle.
              It occurred to me, try to apply this method twice (or more, if there will be more blocks next to each other).
              Or maybe 2nd solution, make a temporary group with all common groups/faces where will be a hole.

              Edit:
              So, I edited it

              		groups = []
              		i = 0
              		Sketchup.active_model.entities.each{|g|
              			next unless g.is_a?(Sketchup;;Group)
              			g.entities.each{|f|
              				next unless f.is_a?(Sketchup;;Face)
              				if center.on_plane? f.plane then
              					groups.each {|x| next if g == x}
              					groups[i] = g
              					i += 1
              				end
              			}	
              		}	
              		
              		groups = groups.uniq
              				
              		countOfGroups = groups.length.to_i
              		countOfGroups.times do |i|
              			group = groups[i]
              			gents = group.entities
              			active_faces = gents.grep(Sketchup;;Face)
              			circle_group = gents.add_group; cge = circle_group.entities
              			edges = cge.add_circle(center, dir, radius)
              			circle_group.explode
              			circle_face = (gents.grep(Sketchup;;Face) - active_faces)[0]
              			next if circle_face == nil
              			circle_face.pushpull(-depth)	
              			togos = [] 
              			edges.each{|edge| togos << edge unless edge.faces[0] }
              			model.active_entities.erase_entities(togos) if togos[0]		
              		end
              

              http://i.imgur.com/GDdGN4p.png

              It "works", but there is a problem, if I need do a drill over 3 (more) blocks.
              Or when I have 4 blocks, etc..

              http://i.imgur.com/o0xkiYw.png

              I found that after this circle_face = (gents.grep(Sketchup::Face) - active_faces), there are two faces, so I tried ".last", it helped, but still don't work at well.

              http://i.imgur.com/J8tQrBb.jpg

              Aby ideas?

              1 Reply Last reply Reply Quote 0
              • A Offline
                ado130
                last edited by

                It seems that it works. Is it correct way?
                Just one question, how can I delete the black lines?, or hide them.

                def drill(x, y, z, radiuses, depths, directions)
                	model = Sketchup.active_model 
                	countOfDrills = x.length.to_i
                	countOfDrills.times do |i|
                		
                		center = [x[i], y[i], z[i]].map(&;to_f)		
                		radius = radiuses[i]
                		depth = depths[i]
                		direction = directions[i]
                		
                		case direction
                			when "N"
                				dir = Geom;;Vector3d.new(0,0,1)
                			when "E"
                				dir = Geom;;Vector3d.new(-1,0,0)
                			when "S"
                				dir = Geom;;Vector3d.new(0,0,-1)
                			when "W"
                				dir = Geom;;Vector3d.new(1,0,0)		
                			when "F"
                				dir = Geom;;Vector3d.new(0,-1,0)	
                			when "B"
                				dir = Geom;;Vector3d.new(0,1,0)				
                			else
                				dir = Geom;;Vector3d.new(0,0,1)		
                		end		
                		
                		groups = []
                		i = 0
                		Sketchup.active_model.entities.each{|g|
                			next unless g.is_a?(Sketchup;;Group)
                			g.entities.each{|f|
                				next unless f.is_a?(Sketchup;;Face)
                				if center.on_plane? f.plane then
                					groups.each {|x| next if g == x}
                					groups[i] = g
                					i += 1
                				end
                			}	
                		}	
                		
                		groups = groups.uniq
                		
                		countOfGroups = groups.length.to_i
                		countOfGroups.times do |i|
                			group = groups[i]
                			gents = group.entities
                			activeFaces = gents.grep(Sketchup;;Face)
                			circleGroup = gents.add_group; cge = circleGroup.entities
                			edges = cge.add_circle(center, dir, radius)
                			circleGroup.explode
                			circleFace = (gents.grep(Sketchup;;Face) - activeFaces).last
                			next if circleFace == nil
                			normal = circleFace.normal
                			activeFaces = gents.grep(Sketchup;;Face)
                			circleFace.pushpull(-depth)
                			deleteFace = (gents.grep(Sketchup;;Face) - activeFaces)[0]
                			if deleteFace.normal == normal then
                				deleteFace.erase!	
                			end
                		end
                	end
                end
                
                1 Reply Last reply Reply Quote 0
                • sdmitchS Offline
                  sdmitch
                  last edited by

                  @ado130 said:

                  Just one question, how can I delete the black lines?, or hide them.

                  Try this

                  groups = groups.uniq
                  countOfGroups = groups.length.to_i
                  countOfGroups.times do |i|
                   group = groups[i]
                   gents = group.entities
                   activeFaces = gents.grep(Sketchup;;Face)
                   circleGroup = gents.add_group; cge = circleGroup.entities
                   edges = cge.add_circle(center, dir, radius)
                   circleGroup.explode;
                   (gents.grep(Sketchup;;Face) - activeFaces).each{|circleFace|
                    next if center.distance(circleFace.bounds.center) > radius
                    circleFace.pushpull(-depth)
                   ]
                   remove = gents.grep(Sketchup;;Edge).find_all{|e|e.faces.length<2}
                   gents.erase_entities(remove.reverse)
                  end
                  
                  

                  cut from object.gif

                  Nothing is worthless, it can always be used as a bad example.

                  http://sdmitch.blogspot.com/

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    ado130
                    last edited by

                    It seems that it works too. Thanks!
                    But black lines are still there.
                    You have there "]", I think, it should be "}"?

                    1 Reply Last reply Reply Quote 0
                    • sdmitchS Offline
                      sdmitch
                      last edited by

                      @ado130 said:

                      It seems that it works too. Thanks!
                      But black lines are still there.
                      You have there "]", I think, it should be "}"?

                      Yes, you are right. Sorry about that.

                      The black vertical lines in the 'drill hole'?

                      Nothing is worthless, it can always be used as a bad example.

                      http://sdmitch.blogspot.com/

                      1 Reply Last reply Reply Quote 0
                      • A Offline
                        ado130
                        last edited by

                        Yeah, you're right, but I meant black lines in rectangular blocks (rather, all lines).

                        1 Reply Last reply Reply Quote 0
                        • sdmitchS Offline
                          sdmitch
                          last edited by

                          @ado130 said:

                          Yeah, you're right, but I meant black lines in rectangular blocks.

                          Well, if you didn't want them, why did you create then in the first place.

                          groups = groups.uniq
                          countOfGroups = groups.length.to_i
                          countOfGroups.times do |i|
                          	group = groups[i]; group.make_unique
                          	gents = group.entities
                          	activeFaces = gents.grep(Sketchup;;Face)
                          	activeEdges = gents.grep(Sketchup;;Edge);#<-- save active edges
                          	circleGroup = gents.add_group; cge = circleGroup.entities
                          	edges = cge.add_circle(center, dir, radius)
                          	circleGroup.explode;
                          	(gents.grep(Sketchup;;Face) - activeFaces).each{|circleFace|
                          		next if center.distance(circleFace.bounds.center) > radius
                          		circleFace.pushpull(-depth)
                          	}
                             #remove unused circle edges
                          	remove = gents.grep(Sketchup;;Edge).find_all{|e|e.faces.length<2}
                          	gents.erase_entities(remove.reverse)
                          	# hide vertical edges in drill hole
                          	soften = (gents.grep(Sketchup;;Edge)-activeEdges).find_all{|e|e.line[1].parallel?(dir) && !e.soft?}
                          	soften.each{|e|e.soft=e.smooth=true}
                          	# remove co-planar edges
                          	remove = gents.grep(Sketchup;;Edge).find_all{|e|(e.faces.length>=2 && e.faces.find_all{|f|f.normal.parallel?(e.line[1].axes[1])}.length==2)}
                          	gents.erase_entities(remove.reverse)
                          
                          

                          Nothing is worthless, it can always be used as a bad example.

                          http://sdmitch.blogspot.com/

                          1 Reply Last reply Reply Quote 0
                          • A Offline
                            ado130
                            last edited by

                            Sorry for the delayed response. It looks fine, thanks again!

                            http://i.imgur.com/TtoBovE.png

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

                            Advertisement