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.
    • 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