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!
    🛣️ Road Profile Builder | Generate roads, curbs and pavements easily Download

    [Plugin] Door-Lintel Update + Window-Sill

    Scheduled Pinned Locked Moved Plugins
    66 Posts 29 Posters 41.7k 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.
    • 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
                                • L Offline
                                  lamngoaison @TIG
                                  last edited by

                                  @TIG thanks alot 😁

                                  1 Reply Last reply Reply Quote 0
                                  • M Offline
                                    memaridrue81
                                    last edited by

                                    hi Didier Bur,

                                    May I request an update for this extension for SketchUp 2023 and higher? it work well with my SKP 2022 but file crashes when I use it in skp 2023 😊

                                    Many thanks!

                                    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