Pushpull makes google 8 to crash
-
hi guys, when I do a pushpull in my ruby script that the result ends on another surface, google 8 crashes. I dont't remember with which version I made this script (long time ago) but this was working. If I pushpull with a smaller value to avoid ending to the another surface, it works and then I'm ble to manually pushpull the remaining gap.
what's wrong ? thanks
-
Without seeing the code who knows ?
We are now in 2014 so v8 itself is looking old...
Perhaps you could try doing the changes in a group then explode it ? -
here's the code to build a door with its frame around, sorry its in french .. as you can see, there's a base.pushpull(-hauteur+"1/32".to_l) .. the 1/32 is to avoid the crash ...
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 faces=[] new_entities.each{|e|faces<<e if e.class==Sketchup;;Face} normalizeVector = (Geom;;Vector3d.new 0,1,0).normalize! faces.each{|face| resultClassify = face.classify_point(basePts[0]) if (face.normal.parallel? normalizeVector and resultClassify == Sketchup;;Face;;PointOnVertex) @frontFace = face break end } # bâtir le trou de la poignee rayonPoignee = '1 1/4"'.to_l posXPoignee = @largeur - '2 3/8"'.to_l - rayonPoignee posYPoignee = 0 posZPoignee = @poigneeEspaceBas + @espaceBas centrePoignee = Geom;;Point3d.new posXPoignee, posYPoignee, posZPoignee # décider de la normal de la poignee normalPoignee = (Geom;;Vector3d.new 0,1,0).normalize! edgesPoignee = entities.add_circle centrePoignee, normalPoignee, rayonPoignee facePognee = ( edgesPoignee.first.faces.to_a - [@frontFace] ).first facePognee.pushpull -@epaisseur end # draw end # class Porte class Moulure largeur='3 1/2"'.to_l epaisseur='3/4"'.to_l end # class Moulure class Montant attr_accessor ;largeur, ;epaisseur def initialize(largeur, epaisseur) @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 = [0,0,0] if (nearestPoint == nil or ((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 model = Sketchup.active_model entities = model.entities 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+"1/32".to_l) else base.pushpull(hauteur) end rescue puts $!, $@ end end # drawPart end # class Montant end # module PorteBuilder prombasePts = ["Hauteur?", "Largeur?", "Profondeur"] values = ['80"'.to_l, '30"'.to_l, '1 7/8"'.to_l] results = UI.inputbox prombasePts, values, "Dimension de votre porte ?" return if not results # This means that the user canceld the operation height, width, depth = results #espaceBas, espaceHaut, espaceCote, charniereEspaceHaut, charniereEspaceBas, poigneeEspaceBas, hauteur, largeur, epaisseur) unePorte = PorteBuilder;;Porte.new('3/4"'.to_l, '1/16"'.to_l, '1/16"'.to_l, '7"'.to_l, '11"'.to_l, '36"'.to_l, '80"'.to_l, '30"'.to_l, '1 7/8"'.to_l) unePorte.draw() lesMontant = PorteBuilder;;Montant.new('3 1/2"'.to_l, '3/4"'.to_l) lesMontant.draw(unePorte) -
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 PorteBuilderI'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...
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register LoginAdvertisement