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

    [Plugin] Door-Lintel Update + Window-Sill

    Scheduled Pinned Locked Moved Plugins
    66 Posts 29 Posters 40.4k Views 29 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.
    • halroachH Offline
      halroach
      last edited by

      This plugin is wonderful!
      Does it work within a component? It seems to work for me only when it's in the "open!?"

      FlexTools - Super Quick Windows, Doors, Slats...

      1 Reply Last reply Reply Quote 0
      • S Offline
        SyahirXIII
        last edited by

        I have been trying to use it using Profile Builder 3 , it seems to have some kind of problem detecting rectangular vertical face.


        Dont work here


        But it seems to work here

        1 Reply Last reply Reply Quote 0
        • Didier BurD Offline
          Didier Bur
          last edited by

          Hi syahirXIII,

          The message shown on your image pops up when the reveal's face loop is made of more than 4 edges.
          Please check if this is the case on the face that doesn't work.
          Regards

          4 edges.jpg

          DB

          guanjinG 1 Reply Last reply Reply Quote 0
          • guanjinG Offline
            guanjin @TIG
            last edited by

            @TIG
            hello
            This plugin doesn't seem to support sketchup2024
            A very suitable plugin, can you fix it working on sketchup024?
            thanks

            1 Reply Last reply Reply Quote 0
            • guanjinG Offline
              guanjin @Didier Bur
              last edited by

              @Didier-Bur
              hello
              This plugin doesn't seem to support sketchup2024
              A very suitable plugin, can you fix it working on sketchup024?
              thanks

              1 Reply Last reply Reply Quote 1
              • N Offline
                naealmeida Newcomers
                last edited by

                Hello! Can you update the plugin for the new skecthup 2024 please

                1 Reply Last reply Reply Quote 0
                • A Offline
                  aricfish
                  last edited by

                  Hi All,

                  Is this plugin working in 2024 sketchup? Huge time saver but not working for me in newest version.

                  Didier BurD 1 Reply Last reply Reply Quote 0
                  • Didier BurD Offline
                    Didier Bur @aricfish
                    last edited by

                    @ SU2024 and Door-Lintel users:

                    Hi,
                    I don't have SU2024 installed on my PC.
                    Maybe some developer (TIG ?) will update the plugin ?
                    So here it is.

                    Regards,

                    # Name :          door_lintel
                    # Description :   Draws a lintel above door between wall sides, and window as well
                    # Author :        D. Bur
                    # Usage :         select face and "Door by reveal" in context menu
                    # Date :          May 2008
                    # Type :          Tool
                    # History:        1.0 (May 2008) - first version
                    #                 1.1 (May 2008) - window added 
                    
                    require 'sketchup.rb'
                    
                    # f=Sketchup.active_model.selection[0]
                    
                    def trad(word)
                    	# tStrings = [["Door" "Porte"],["Window" "Fenetre"]]
                    	tStrings={ "Door" => "Porte", "Window" => "Fenêtre"}
                    	return word if Sketchup.get_locale != "fr"
                    	return tStrings[word]
                    end
                    
                    def dbe_by_embrasure(type)
                    	model=Sketchup.active_model
                    	entities=Sketchup.active_model.active_entities
                    	@dbe_door_height=2.m if not @dbe_door_height
                    	@dbe_window_height=135.cm if not @dbe_window_height
                    	@dbe_sill_height=1.m if not @dbe_sill_height
                    	org_face=model.selection[0]
                      
                    	model.start_operation "Door-window by reveal"
                      
                    	  if model.selection.empty?
                    		UI.messagebox("Empty selection: please select a vertical face.")
                    		return
                    	end
                    	if (model.selection.length !=1) 
                    		UI.messagebox("Please select only ONE vertical face.")
                    		return
                    	end
                    	if  (model.selection[0].class != Sketchup::Face)
                    		UI.messagebox("Please select a vertical face.")
                    		return
                    	end
                    	if org_face.normal.z>1e-012 or org_face.normal.z<-1e-012
                    		UI.messagebox("Please select a VERTICAL face.")
                    		return
                    	 end
                    	
                    	if org_face.outer_loop.edges.length != 4
                    		UI.messagebox("Please select a RECTANGULAR vertical face.")
                    		return
                    	 end
                    	 
                    	 # Parse edges
                    	edges=org_face.edges
                    	@verticals={}
                    	@horizontals={}
                    	
                    	edges.each do |e|
                    		if e.start.position.z==e.end.position.z
                    			@horizontals[e]=e.start.position.z
                    		else
                    			@verticals[e]=e.start.position.distance e.end.position
                    		end
                    	end
                    	
                    	# Dialog
                    	#puts "type " + type.inspect
                    	if type=="door"
                    		return if !dbe_door_height()
                    	else
                    		return if !dbe_window_height()
                    	end
                    	
                    	# heights control
                    	if type=="door"
                    		height_ok=false
                    		until height_ok
                    			if @dbe_door_height<@verticals.values.max #or (@dbe_sill_height+@dbe_window_height)<@verticals.values.max
                    				height_ok =true
                    			else
                    				UI.messagebox("Incorrect height for this door.\nPlease set it to a lower value than " +@verticals.values.max.to_s)
                    				return if !dbe_door_height()
                    			end
                    		end
                    	end
                    	
                    	if type=="window"
                    		heights_ok=false
                    		until heights_ok
                    			if (@dbe_sill_height+@dbe_window_height)<@verticals.values.max
                    				heights_ok =true
                    			else
                    				UI.messagebox("Incorrect heights for this windows.\nSum of sill and window heights should'nt exceed "  + @verticals.values.max.to_s)
                    				return if !dbe_window_height()
                    			end
                    		end
                    	end
                    	
                      # Highest edge & lintel height
                      high_edge=@horizontals.index(@horizontals.values.max)
                      bottom_edge=@horizontals.index(@horizontals.values.min)
                      lintel_height=@verticals.values.max-@dbe_door_height if type=="door"
                      lintel_height=@verticals.values.max-(@dbe_window_height+@dbe_sill_height) if type=="window"
                      # New face of lintel
                      p1=high_edge.start.position
                      p2=high_edge.end.position
                      p3=Geom::Point3d.new(p1.x,p1.y,(p1.z-lintel_height))
                      p4=Geom::Point3d.new(p2.x,p2.y,(p2.z-lintel_height))
                      # Mid point of lintel
                      v=p2.vector_to p3
                      v.length=v.length/2.0
                      mid=p2.offset(v)
                      # Opening width
                      v_norm=org_face.normal
                      touch=model.raytest([mid,v_norm])
                      if touch
                        same_object=true
                        hitpoint=touch[0]
                        hit_obj=touch[1]
                        if hit_obj.length>1
                          hit_face=hit_obj.last
                          hit_parent=hit_obj[0]
                          if not hit_parent.entities.include? org_face
                            same_object=false
                          end
                          else
                          hit_parent=hit_obj.last
                          hit_face=hit_obj.last
                        end
                        width=mid.distance hitpoint
                        if width > 200
                          go=UI.messagebox("Suspicious door width found: " + width.to_s + "\nProceed ?",MB_OKCANCEL)
                          return nil if go==2
                        end
                        case hit_parent.typename
                          when "Face"
                            if org_face.normal!=hit_face.normal.reverse
                              UI.messagebox("Opposite reveal not parallel to selected face. Aborting...")
                              return nil
                            end
                          else
                            if same_object==false
                              UI.messagebox("Cannot find opposite wall,\nobstructive "+hit_parent.typename+" found on layer "+hit_parent.layer.name+ ".\nPlease hide it and retry.")
                              return
                            end
                        end
                      else
                        UI.messagebox("No opposite wall to connect lintel.")
                        return nil
                      end
                      
                      new_face=entities.add_face p1,p2,p4,p3
                      if touch and same_object==true
                        v2=new_face.normal
                        v2.length=width
                        new_face.pushpull width
                        else
                        UI.messagebox("Cannot pushpull lintel.")
                      end
                      
                      #Redraw these fucking remaining edges to better kill them
                      e1=entities.add_line(p1.offset(v2),p2.offset(v2))
                      e2=entities.add_line(p1.offset(v2),p3.offset(v2))
                      e3=entities.add_line(p2.offset(v2),p4.offset(v2))
                      e1.erase!
                      e2.erase!
                      e3.erase!
                    
                      if type=="window"
                        # New face of sill
                        p1=bottom_edge.start.position
                        p2=bottom_edge.end.position
                        p3=Geom::Point3d.new(p1.x,p1.y,(p1.z+@dbe_sill_height))
                        p4=Geom::Point3d.new(p2.x,p2.y,(p2.z+@dbe_sill_height))
                        # Mid point of sill
                        v=p2.vector_to p3
                        v.length=v.length/2.0
                        mid=p2.offset(v)
                        # Opening width
                        touch=model.raytest([mid,v_norm])
                        if touch
                          same_object=true
                          hitpoint=touch[0]
                          hit_obj=touch[1]
                          if hit_obj.length>1
                            hit_face=hit_obj.last
                            hit_parent=hit_obj[0]
                            #if not hit_parent.entities.include? org_face
                              #same_object=false
                            #end
                          else
                            hit_parent=hit_obj.last
                            hit_face=hit_obj.last
                          end
                        width=mid.distance hitpoint
                        if width > 200
                          go=UI.messagebox("Suspicious window width found: " + width.to_s + "\nProceed ?",MB_OKCANCEL)
                          return nil if go==2
                        end
                        case hit_parent.typename
                          when "Face"
                            if v_norm!=hit_face.normal.reverse
                              UI.messagebox("Opposite reveal not parallel to selected face. Aborting...")
                              return nil
                            end
                          else
                            if same_object==false
                              UI.messagebox("Cannot find opposite wall,\nobstructive "+hit_parent.typename+" found on layer "+hit_parent.layer.name+ ".\nPlease hide it and retry.")
                              return
                            end
                        end
                      else
                        UI.messagebox("No opposite wall to connect linter.")
                        return nil
                      end
                      
                      new_face=entities.add_face p1,p2,p4,p3
                      if touch and same_object==true
                        v2=new_face.normal
                        v2.length=width
                        new_face.pushpull width
                        else
                        UI.messagebox("Cannot pushpull sill.")
                      end
                      
                      #Redraw these fucking remaining edges to better kill them
                      e1=entities.add_line(p1.offset(v2),p2.offset(v2))
                      e2=entities.add_line(p1.offset(v2),p3.offset(v2))
                      e3=entities.add_line(p2.offset(v2),p4.offset(v2))
                      e1.erase!
                      e2.erase!
                      e3.erase!
                    
                      end # if window
                      model.commit_operation
                    end
                    
                    def dbe_door_height
                    	@dbe_door_height=2.m if not @dbe_door_height
                    	prompt=["Door height: "]
                    	value=[@dbe_door_height]
                    	results=inputbox prompt,value,"Door height"
                    	puts results.inspect
                    	return false if !results
                    	@dbe_door_height=results[0]
                    
                    end
                    
                    def dbe_window_height
                    	@dbe_window_height=135.cm if not @dbe_window_height
                    	@dbe_sill_height=1.m if not @dbe_sill_height
                    	prompts=["Sill height:  ","Window height:  "]
                    	values=[@dbe_sill_height,@dbe_window_height]
                    	results=inputbox prompts,values,"Window heights"
                    	return false if !results
                    	@dbe_sill_height=results[0]
                    	@dbe_window_height=results[1]
                    end
                    
                    def valid_door_selection
                      s=Sketchup.active_model.selection
                      return false if s.length!=1
                      return false if s[0].typename!="Face"
                      return false if s[0].normal.z>1e-012 or s[0].normal.z<-1e-012
                      return false  if s[0].outer_loop.edges.length != 4
                      return true
                    end
                    
                    #----------------------------------------------------------------------------
                    # add menu items
                    if !file_loaded?(__FILE__ )
                      dbe_menu=UI.menu("Tools").add_submenu("Door/Window by reveal")
                      dbe_menu.add_item("Door") { dbe_by_embrasure "door"}
                      dbe_menu.add_item("Window") { dbe_by_embrasure "window" }
                      dbe_menu.add_separator
                      
                       # Context menu
                        UI.add_context_menu_handler do |menu|
                            if( valid_door_selection )
                            		menu.add_separator
                                menu.add_item("Door by reveal") { dbe_by_embrasure "door" }
                                menu.add_item("Window by reveal") { dbe_by_embrasure "window" }
                                menu.add_separator
                            end
                        end
                    end
                    
                    file_loaded(__FILE__ )
                    
                    
                    

                    DB

                    guanjinG 1 Reply Last reply Reply Quote 0
                    • guanjinG Offline
                      guanjin @Didier Bur
                      last edited by

                      @Didier-Bur
                      It seems that no one has fixed this plugin😞

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

                        @guanjin
                        It doesn't work in v2024 [various errors], e.g.

                        Error: #<NoMethodError: undefined method 'index' for {#Sketchup::Edge:0x0000019daaeab1b0=>0.0, #Sketchup::Edge:0x0000019daaeab160=>39.37007874015748}:Hash>
                        C:/Users/TIG/AppData/Roaming/SketchUp/SketchUp 2024/SketchUp/Plugins/GEIS_door_lintel2.rb: 100:in 'dbe_by_embrasure'
                        C:/Users/TIG/AppData/Roaming/SketchUp/SketchUp 2024/SketchUp/Plugins/GEIS_door_lintel2.rb: 274:in `block in <top (required)>'

                        @Didier-Bur also obfuscates his code, so without arduously repacking it back into RB code it'd be difficult to say what the issues are...

                        TIG

                        1 Reply Last reply Reply Quote 0
                        • guanjinG Offline
                          guanjin
                          last edited by

                          So many experts, no one can fix this plugin
                          The forum is no longer the same as before

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

                            @Didier-Bur needs to fix this - it's his baby...

                            TIG

                            Didier BurD 1 Reply Last reply Reply Quote 0
                            • Didier BurD Offline
                              Didier Bur @TIG
                              last edited by

                              Hi all,
                              My baby is quite old now 😉
                              Here is the non-encrypted version. Please unpack in your Plugins dir.
                              No update because I haven't SU2024.
                              Regards,DBUR_Lines2Tubes.zip

                              DB

                              Didier BurD 1 Reply Last reply Reply Quote 0
                              • Didier BurD Offline
                                Didier Bur @Didier Bur
                                last edited by

                                Me again,
                                Same goes for door_lintel.rb

                                door_lintel_uncrypted.zip

                                DB

                                1 Reply Last reply Reply Quote 0
                                • J Offline
                                  JGA
                                  last edited by

                                  Didier, thanks for sharing.

                                  Regards,
                                  JGA

                                  1 Reply Last reply Reply Quote -1
                                  • guanjinG Offline
                                    guanjin
                                    last edited by

                                    Thank you to Didier Bur for the source code, which successfully fixed the work in 2024 and modified the multi-faceted selection stretching.
                                    
                                    Thank you again, Didier Bur![alt text](image url)无标题项目.gif

                                    guanjinG 2 Replies Last reply Reply Quote 0
                                    • guanjinG Offline
                                      guanjin @guanjin
                                      last edited by

                                      This post is deleted!
                                      1 Reply Last reply Reply Quote 0
                                      • guanjinG Offline
                                        guanjin @guanjin
                                        last edited by

                                        @guanjin said in [Plugin] Door-Lintel Update + Window-Sill:

                                        Thank you to Didier Bur for the source code, which successfully fixed the work in 2024 and modified the multi-faceted selection stretching.
                                        Thank you again, Didier Bur
                                        无标题项目.gif

                                        1 Reply Last reply Reply Quote 0
                                        • L Offline
                                          lamngoaison
                                          last edited by

                                          i got a new problem. SU2025. any one fix it for SU2025 yet? please!!

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

                                            @lamngoaison

                                            The linked post contains a ZIP file posted a few days ago
                                            link
                                            Which can be converted to an RBZ by changing its filetype suffix.
                                            It worked in v2024, so should also work in v2025 ?

                                            TIG

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

                                            Advertisement