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

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

Yeah, you're right, but I meant black lines in rectangular blocks (rather, all lines).
It seems that it works too. Thanks!
But black lines are still there.
You have there "]", I think, it should be "}"?
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
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

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

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.

Aby ideas?
It almost works, but the result is

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

So there are 2 solutions for this (I think)
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?
Hmm, I have one main method, one method for rectangle blocks and next method for cylinders, but in every of those methods I have
group = Sketchup.active_model.active_entities.add_group() entities = group.entities
so then i.e.
circle = entities.add_circle(center, dir, radius)
or
entities.add_line(ptA, ptB) etc bottom = entities.add_face(ptA, ptB, ptC, ptD)
So this is the wrong solution?
If I understand correctly, I need have group = Sketchup.active_model.active_entities.add_group() only in main method and then passed as a variable to other methods?
I had never defined the group in this method previous.
This is what I have now:
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
gents = group.entities
active_faces = gents.grep(Sketchup;;Face);### modified
circle_group = gents.add_group; cge = circle_group.entities;### new
edges = cge.add_circle(center, dir, radius);### modified
circle_group.explode;### new
circle_face = (gents.grep(Sketchup;;Face) - active_faces)[0];### modified
circle_face.pushpull(-depth)
end
end
Of cource, I define a group in method, where I draw a rectangel block, but it's independently. So first I call this method, it'll draw several blocks, and then, if is necessary (according to input file) I'll call a method for notch.
I am slightly confused now
because before you said
@unknownuser said:
You don't need to add the edges to a new group.
raw it directly over the face in the active_entities.
edges = Sketchup.active_model.active_entities.add_circle(center, dir, radius, segs)
So what should I do?
If I understood Sam correctly, I need sth like
group = Sketchup.active_model.active_entities.add_group() gents = group.entities active_faces = model.active_entities.grep(Sketchup::Face) edges = gents.add_circle(center, dir, radius) group.explode circle_face = model.active_entities.grep(Sketchup::Face) - active_faces
.. and then?
I'm not sure what is meant by "add a group inside the original group".
By the way, thanks Sam, or, thanks to both.