Here's a version that works, with undo, and a menu etc...
require 'sketchup.rb'
module PorteBuilder
class Porte
attr_accessor ;espaceBas, ;espaceHaut, ;espaceCote, ;charniereEspaceBas, ;charniereEspaceHaut, ;poigneeEspaceBas, ;hauteur, ;largeur, ;epaisseur, ;frontFace
def initialize(espaceBas, espaceHaut, espaceCote, charniereEspaceHaut, charniereEspaceBas, poigneeEspaceBas,
hauteur, largeur, epaisseur)
@espaceBas = espaceBas
@espaceHaut = espaceHaut
@espaceCote = espaceCote
@charniereEspaceHaut = charniereEspaceHaut
@charniereEspaceBas = charniereEspaceBas
@poigneeEspaceBas = poigneeEspaceBas
@hauteur = hauteur
@largeur = largeur
@epaisseur = epaisseur
end # initialize
def draw()
model = Sketchup.active_model
entities = model.entities
group = entities.add_group()
entities = group.entities
# dessiner la base de la porte
basePts = []
basePts[0] = [0, 0, @espaceBas]
basePts[1] = [@largeur, 0, @espaceBas]
basePts[2] = [@largeur, @epaisseur, @espaceBas]
basePts[3] = [0, @epaisseur, @espaceBas]
base = entities.add_face(basePts)
@hauteur = -@hauteur if( base.normal.dot(Z_AXIS) < 0 )
# faire une porte avec la base
array_before = entities.to_a
base.pushpull(@hauteur)
array_after = entities.to_a
new_entities = array_after - array_before
# aller chercher la face qui aura la poignée
new_entities.grep(Sketchup;;Face).each{|face|
resultClassify = face.classify_point(basePts[0])
if (face.normal.parallel?(Y_AXIS) && resultClassify == Sketchup;;Face;;PointOnVertex)
@frontFace = face
break
end
}
# bâtir le trou de la poignee
rayonPoignee = 1.25.inch
posXPoignee = @largeur - 2.0375.inch - rayonPoignee
posYPoignee = 0
posZPoignee = @poigneeEspaceBas + @espaceBas
centrePoignee = Geom;;Point3d.new(posXPoignee, posYPoignee, posZPoignee)
# décider de la normal de la poignee
edgesPoignee = entities.add_circle(centrePoignee, Y_AXIS, rayonPoignee)
facePognee = ( edgesPoignee[0].faces - [@frontFace] )[0]
facePognee.pushpull(-@epaisseur)
end # draw
end # class Porte
class Moulure
largeur = 3.75.inch
epaisseur = 0.75.inch
end # class Moulure
class Montant
attr_accessor ;largeur, ;epaisseur
def initialize(largeur, epaisseur)
model = Sketchup.active_model
entities = model.entities
group=entities.add_group()
@entities=group.entities
@largeur = largeur
@epaisseur = epaisseur
end # initialize
def draw(porte)
normalFrontFace = porte.frontFace.normal
nearestPoint=nil
porte.frontFace.edges.each{|edgeFrontFace|
linesPoint3d=[]
edgeFrontFace.line.each{|e|
linesPoint3d<<e if e.class==Geom;;Point3d
}
linesPoint3d.each{|linePoint3d|
point = ORIGIN.clone
if nearestPoint == nil || linePoint3d.distance(point) < nearestPoint.distance(point)
nearestPoint = linePoint3d
end
}
}
startingPoint = nearestPoint.offset [-porte.espaceCote-@epaisseur, 0, porte.hauteur+porte.espaceHaut]
drawPart(startingPoint, @epaisseur*2+porte.largeur+porte.espaceCote*2, @largeur, @epaisseur)
startingPoint = nearestPoint.offset [-porte.espaceCote-@epaisseur, 0, -porte.espaceBas]
drawPart(startingPoint, @epaisseur, @largeur, porte.espaceBas+porte.hauteur+porte.espaceHaut)
startingPoint = nearestPoint.offset [porte.largeur+porte.espaceCote, 0, -porte.espaceBas]
drawPart(startingPoint, @epaisseur, @largeur, porte.espaceBas+porte.hauteur+porte.espaceHaut)
end # draw
def drawPart(startingPoint, offsetX, offsetY, hauteur)
begin
basePts=[]
basePts[0] = startingPoint
basePts[1] = basePts[0].offset [offsetX, 0, 0]
basePts[2] = basePts[1].offset [0, offsetY, 0]
basePts[3] = basePts[2].offset [-offsetX, 0, 0]
base = @entities.add_face(basePts)
if base.normal.dot(Z_AXIS) < 0
base.pushpull(-hauteur + 0.03125.inch)
else
base.pushpull(hauteur)
end
rescue
puts $!, $@
end
end # drawPart
end # class Montant
def self.dialog()
prombasePts = ["Hauteur?", "Largeur?", "Profondeur"]
values = [80.0.inch, 30.0.inch, 1.875.inch]
results = inputbox(prombasePts, values, "Dimension de votre porte ?")
return unless results # This means that the user canceld the operation
height, width, depth = results
Sketchup.active_model.start_operation('PorteBuilder')
#espaceBas, espaceHaut, espaceCote, charniereEspaceHaut, charniereEspaceBas, poigneeEspaceBas, hauteur, largeur, epaisseur)
unePorte = PorteBuilder;;Porte.new(0.75.inch, 0.0625.inch, 0.0625.inch, 7.0.inch, 11.0.inch, 36.0.inch, height, width, depth)
unePorte.draw()
lesMontant = PorteBuilder;;Montant.new(3.5.inch, 0.75.inch)
lesMontant.draw(unePorte)
Sketchup.active_model.commit_operation
end
UI.menu("Plugins").add_item('PorteBuilder'){self.dialog()} unless file_loaded?('PorteBuilder')
file_loaded('PorteBuilder')
end # module PorteBuilder
I'm unsure of the exact issue.
Your code seems more complex than it needs to be 😕
Why not draw the vertical face for the inverted U of the door-frame and pushpull that inside a door-frame-group, then draw the vertical face of the door-leaf and pushpull that inside a door-leaf-group, with the hole punched out for the ironmongery ?
That way you control the face orientation - the counter-clockwise points around a face loop determine its normal vector.
If you want door-stops add those inside a door-stop-group, in a manner similar to the frame itself: it can be inside the frame group too.
You really don't need so many classes as a range of methods self.xxx() would do whatever you want with in the module, and using @xxx variables would make them available across the module too... 😕