sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🫛 Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    Pushpull makes google 8 to crash

    Scheduled Pinned Locked Moved Developers' Forum
    4 Posts 2 Posters 243 Views 2 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.
    • N Offline
      nics
      last edited by

      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

      1 Reply Last reply Reply Quote 0
      • TIGT Offline
        TIG Moderator
        last edited by

        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 ?

        TIG

        1 Reply Last reply Reply Quote 0
        • N Offline
          nics
          last edited by

          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)
          
          
          1 Reply Last reply Reply Quote 0
          • TIGT Offline
            TIG Moderator
            last edited by

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

            TIG

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

            Advertisement