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.
    • 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 Online
          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 Online
              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 Online
                              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