sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Pushpull makes google 8 to crash

    Scheduled Pinned Locked Moved Developers' Forum
    4 Posts 2 Posters 213 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