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

    Drop-Down List Options

    Scheduled Pinned Locked Moved Developers' Forum
    18 Posts 3 Posters 1.1k Views 3 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.
    • jolranJ Offline
      jolran
      last edited by

      @unknownuser said:

      but it changes only component's color. If I want to change face color , I have to reset the frame colors to

      I don't understand. Do you have a method that grabs the face material from the Component ?
      You have to be specific when targeting the face materials.

      In you code you have: if frame_color_value == "Clear"
      or glass_color_value == "Clear"
      Then do al_Light_Satin or clearmethod(?)
      (You have to rename clear method. It's is reserved Ruby method.)
      That might cause conflicts in your code..
      Edit: actually it's Array.clear. But still, might be a sketchy name for a varible.

      BTW are you on MAC ?

      I see your targeting 2 "action_name" which I reckon is 2 callbacks with
      window.location.href = etc ?

      If you are shooting 2 callbacks directly after each other you might have issues with
      one callback not being executed.

      Further Reading:
      https://github.com/thomthom/sketchup-webdialogs-the-lost-manual/wiki/Asynchronous-versus-Synchronous-Communication

      Anyway. This will not help you much but I put your code in a case statement.
      Less comparisons and might be a little easier to read.
      Don't know if it will work with your code since I don't have the whole lot, but you can try and improve on it. Just a start.
      Sorry I can't be of more help, but I do not understand what you are trying to achieve, and what your problems are in the code.

      if action_name == "Select"
      	case my_value 
      	when "Scheme_A"
      		create_scheme_A 
      		UI.messagebox "Layers created for Scheme-A...?", MB_YESNO
      		UI.play_sound "Plugins/CA/sound/fins__button.wav"
            
      	when "Scheme_B" 
      		create_scheme_B 
      		UI.messagebox "Layers created for Scheme-B...?", MB_YESNO
      		UI.play_sound "Plugins/CA/sound/fins__button.wav"
            
      	when "Scheme_C" 
      		create_scheme_C 
      		UI.messagebox "Layers created for Scheme-C...?", MB_YESNO
      		UI.play_sound "Plugins/CA/sound/fins__button.wav"
      	end
      elsif action_name == "Create"       
      	if frame_color_value == "Clear" #  Aluminium Color Selections 
      		al_Light_Satin
      		
      	elsif glass_color_value == "Clear" #  Glass Color Selections 
      		al_clear_color # ?! renamed this variable...
      	end
      end
      
      1 Reply Last reply Reply Quote 0
      • jolranJ Offline
        jolran
        last edited by

        Hi pingpink.

        Woff!! That's a lot of code to debugg!
        I don't have the time to go through the whole plugin. But if you can pinpoint down where to look more precisely, it might be easier to help for me or someone else.

        Tried your plugin and indeed nothing happends when "create-model" button is pressed.

        I'll have a better peek this evening..

        Edit: Well I can tell you one thing straight away.
        On line 135 and forwards in CurtainWallMainprogram.rb you have an "end" in a set of set conditions. And then continue next conditions with "elseif". I suppose you could change elsif action_name=="set" to if action_name=="set" as a quick solution. That whole condition statement-set need some cleaning up..

        Edit: BTW is the HTML created with a WYSIWYG editor or Visual studio by a chance ?
        There's a lot of inline code going on, makes the HTML quite hard to read..
        Don't Think I have the capacity nor time to debugg all that now.

        <ul> are a little easier to deal with than <tr>, but you've already taken that route, so..

        1 Reply Last reply Reply Quote 0
        • pingpinkP Offline
          pingpink
          last edited by

          Thanks ! I should tell you about the background of this project.

          I'm an architect , and designing a plugin which studied from the process of architects and facade designers.

          This plugin is for architect's use when doing a schematic design , so we must have to redesign until clients like , then submit 3D model to the facade designers to do material take-off. Thus , we have to do 3D modeling as a real name of component's structure - The mullion and transom with designer's options to have no-cap or cap's features from the lists.
          I studied from aluminium catalogs from many companies , and summarized that the plugin can contained these kinds of aluminium's style.I created lots of components for the mullion and transom in 1 meter high , saved in a component's file , but I can't share because it's a big file.

          In Curtain Wall Modeling is the main part that I'm thinking what procedure should I do.
          I want the process to be :

          1. Architect provides " Patterned Model data - edges and faces "

          2. The webdialog have to be defined and then convert pattern faces into 3D model which load components- mullion and transom from my data. But , in the theory , the mullion ( vertical ) can have 90 degrees or random degrees of edge , and the transom ( horizontal ) is 0 degree of edge. I'm still finding the way to solve for many months.I can't find the solution for now. The code is "Place-Face.rb" in a "rb/02_Profile".

            OR Do I have to select edges manually by users and decide which ones should be mullions or transoms ?. Then the program will load from the selection edges. And apply colors for components and faces later ?.

            The webdialog now is a test , suppose I created components for aluminium frames and faces for glasses. I choose only 2 selections for now , but it change the color sometimes component's color , and sometimes face's colors , linking from Def- "rb/02_Profile/AluColor" and "rb/01_Glass/GlassColor". If a plugin can change the color in one time , it would be nice.

            The HTML created with Dreamweaver , I do graphic design and code in it.
            I just know from you about WYSIWYG editor,never used it before.
            The Visual studio , I learnt in the past for a basic programming in C#.

          1 Reply Last reply Reply Quote 0
          • jolranJ Offline
            jolran
            last edited by

            Thanks for the background explaination, it helps to know the idea behind the code.
            Sounds interesting.

            @unknownuser said:

            1. Architect provides " Patterned Model data - edges and faces "

            Not sure I understand that. Are you going to use external data or is this going to be drawn in SU ?

            @unknownuser said:

            convert pattern faces into 3D model which load components- mullion and transom from my data. But , in the theory , the mullion ( vertical ) can have 90 degrees or random degrees of edge

            Sounds a little like you are overcomplicating things?
            Why not just let user select a Square face. Then get face.bounds dimensions (width and height) and just scale the Component to fit.
            Insert the Component at face.center aligned to face.
            Assuming your Component is created flat at ORIGIN, to get aligned to face:

            path = File.join(File.dirname(__FILE__), "mypluginfolder/mycomp.skp") #No need to dig into C;
            mydefinition = Sketchup.active_model.definitions.load(path)
            gp = Sketchup.active_model.entities.add_group() # Container group. Not a must..
            tr = Geom;;Transformation.new(ORIGIN, user_face.normal) #face selected by user
            inst = gp.entities.add_instance(mydefinition, tr)
            

            You can get the scalingfactor for width:

            scalefactorW = face.bounds.width/inst.bounds.width #(simplified, needs some laboring)
            

            and then scale the Component in the correct axis(X or Y).
            You will have to calculate and scale X & Y individually.
            Use DC's to avoid stretching of Components, although quite more unstable to use in code/refresh.

            In case of you want different mullions they can be inserted this way also, aligned to Component. And then grouped together.
            If you want to rotate Components you should do that at ORIGIN before scaling.
            And probably rotate inst.entities and refresh bounds with: inst.invalidate_bounds.
            After doing something like that you will have to update all info regarding bounds properties.

            Otherwise, if you want to create 1 solid geometry from scratch you have a lot of work to do!
            It's a combination of Windowizer, Profilebuilder and some more plugins. 😲

            Theese are just some ideas, I might have missunderstood the goal of your project so do not get discouraged if this is not what you expected as answer.
            I'll be happy to help more, if it does not take tooo much of my time πŸ˜„

            Regarding the Webdialog.
            Dreamweaver IS a WYSIWYG editor.(what-you-see-is-what-you-get-editor)
            Sometimes they give a little to much inline code(code in tags), and that make the HTML hard to work with. You'll notice when you start working more with Javascript.
            I did post this question some time ago:
            http://sketchucation.com/forums/viewtopic.php?f=180&t=37745&p=333644&hilit=wysiwyg#p333644

            You dialog looks very nice though!

            I use Jquery to facilitate JS. You don't have to, but it takes care of things that might need advanced knowledge of JS to handle. Like onload.events.
            Jquery also makes selecting elements and setting/getting values simpler.
            If you go the Jquery route have a look at Thomthoms code library. He uses Jquery a lot.
            Some of Aerilius plugins use Javascript without Jquery, which also could be used as an inspiration.
            They have some quite advanced code in them so it might be better to look elsewhere first.
            I don't know your knowledge of JavaScript actually.. πŸ˜•

            1 Reply Last reply Reply Quote 0
            • pingpinkP Offline
              pingpink
              last edited by

              Hi , Jolran

               Patterned Model Data-edges and faces , the users have to create and draw by SU.
               
               I agree with you now. This idea is complicated to do.
              
               And when I read you idea , I can picture about it. Thus , I try to test for a square face I want the width to be transom(horizontal) , and the height to be mullion(vertical). That I can load the each type of components on face.bounds.
              
               I did a code from your suggestions by steps. 
              
               1. Find face.bounds dimensions - Width and Height
               2. Conditions before doing load component
               3. Rotate origin Axis at the start position
               4. Scaling length
              
               I'm not sure how to compare in conditions
              

              for loading components around a face.I have a basic of programming.I have been trying to load " Face.load_comp " in a ruby console but it has an error.

               Thanks for recommending about WYSIWYG editor , I will gradually look about it. I use a free code editor of NotePad ++. 
              

              TYPE IN A CONSOLE

              Face.load_comp

              require 'sketchup.rb'
              
              module Face
              
              	def self.load_comp
              	
              	        $stdout.write("START-FUNC; Face.load_comp();\n") 
              				mod = Sketchup.active_model 
              				sel = mod.selection 
              				ents = mod.active_entities 
              			# Grab all the selected faces. 
              				faces = sel.each{|e| e.typename=='Face'} 
              			if faces == 0; 
              				UI.messagebox("Must select at least one face!") 
                          return 
                      end 
                      $stdout.write(" FOR-EACH(face);\n") 
                      faces.each do |face| 
                          $stdout.write("  #{face}\n")
              
              			    face = face.bounds
              				puts "Transom = #{face.width.inspect}"
              				puts "Mullion = #{face.depth.inspect}"
              
              		end
              
              #=begin		
              		if 	puts "Transom = #{face.width.inspect}" # for the width , top and buttom
              	
              			path = Sketchup.find_support_file "CurtainWall_Architect/Components/00_No_Cap/C-50/Transom/T50X193.2_No-Cap.skp", "Plugins"
              			#path = File.join(File.dirname(__FILE__), "CurtainWall_Architect/Components/00_No_Cap/C-50/Mullion/T50X193.2_No-Cap.skp") #No need to dig into C;
              				
              			mydefinition = Sketchup.active_model.definitions.load(path)
              			gp = Sketchup.active_model.entities.add_group() # Container group. Not a must..
              			#tr = Geom;;Transformation.new(ORIGIN, user_face.normal) #face selected by user
              
              			inst = gp.entities.add_instance(mydefinition, tr)
              	
              			scalefactorW = face.bounds.width/inst.bounds.width #(simplified, needs some laboring)
              			
              			tr = Geom;;Transformation.new(ORIGIN,face.normal) #face selected by user
              
              			tr = tr*Geom;;Transformation.rotation(ORIGIN, X_AXIS, self.xrotation)
              
              			position = entity.transformation.to_a
              		
              			pt = edge.start.position
              
              			tr = Geom;;Transformation.scaling pt, 1.0, 1.0, xscale
              
              			entity.transform!( tr )
              			# invalidate the view to see the move action
              			#Sketchup.active_model.active_view.invalidate
              			
              			inst.invalidate_bounds
              			
              		else puts "Mullion = #{face.depth.inspect}"# for the height of left and right sides
              		
              			path = Sketchup.find_support_file "CurtainWall_Architect/Components/00_No_Cap/C-50/Mullion/M50X230.5_No-Cap.skp", "Plugins"
              			#path = File.join(File.dirname(__FILE__), "CurtainWall_Architect/Components/00_No_Cap/C-50/Mullion/M50X230.5_No-Cap.skp") #No need to dig into C;
              				
              			mydefinition = Sketchup.active_model.definitions.load(path)
              			gp = Sketchup.active_model.entities.add_group() # Container group. Not a must..
              			#tr = Geom;;Transformation.new(ORIGIN, user_face.normal) #face selected by user
              
              			inst = gp.entities.add_instance(mydefinition, tr)
              	
              			scalefactorD = face.bounds.depth/inst.bounds.depth #(simplified, needs some laboring)
              	
              			tr = Geom;;Transformation.new(ORIGIN,face.normal) #face selected by user
              
              			tr = tr*Geom;;Transformation.rotation(ORIGIN, Z_AXIS, self.zrotation)
              		
              			position = entity.transformation.to_a
              
              			pt = edge.start.position
              
              			tr = Geom;;Transformation.scaling pt, 1.0, 1.0, zscale
              	
              		
              			entity.transform!( tr )
              			# invalidate the view to see the move action
              			# Sketchup.active_model.active_view.invalidate
              			
              			inst.invalidate_bounds
              
              			end 
              			
              	return Geom;;Transformation.new(tr)
              #=end
              
                      $stdout.write("END-FUNC; load_comp\n")
                  end # def
              
              end # module
              
              1 Reply Last reply Reply Quote 0
              • jolranJ Offline
                jolran
                last edited by

                I'll have a peek later, unless someone else have some insights..

                1 Reply Last reply Reply Quote 0
                • jolranJ Offline
                  jolran
                  last edited by

                  Ok... Hmm, where do I start, I really feel someone more experienced programmer could dig in and help here.

                  Anyway, I think you have to get back to basics first before dealing with the details, cause are some very basic errors in the conditions you are making.

                  In an if condition there must be a comparison, or a question asked(simply put).
                  The answer should be true or false. And depending on that execute whatever is in the statement. You are doing a puts! Don't Think you'll get a proper answer from that...

                  It looks like you are assigning variables here and there that don't relate to each other.
                  I think I understand what you are trying to do, but don't see the link to the rest of the program.

                  Here's a Quick gobbleup. Don't have time for more right now.
                  Maybe it can give you a few ideas, and you have something to test.
                  You may have to do some tests if using components inside containergroup how transformations and scaling is affecting eachother. I can't remember exactly in which order things go, and havent tested this code..

                  require 'sketchup.rb'
                  
                  module Fitcomponent
                  
                     def self.load_comp(comp_in, xrotation) # self.xrotation ? better add as argument
                     
                  		#$stdout.write("START-FUNC; Face.load_comp();\n") 
                  		mod  = Sketchup.active_model 
                  		sel  = mod.selection 
                  		ents = mod.active_entities 
                  		if sel.empty?
                              UI.messagebox("Must select at least one face!") 
                              return nil
                          else
                  			faces = sel.grep(Sketchup;;Face) # Grab all the selected faces. 
                  		end
                          #$stdout.write(" FOR-EACH(face);\n") 
                  		
                  		#You only should use one face for this if running the plugin 1 face at a time. Otherwise you have to doing some additional coding-
                  		#Make it work with one face first! Then add code...
                         
                  	   #$stdout.write("  #{face}\n") # I don't know what this doea, so you have to fix it yourself.
                  		
                  		#Depending on the position of the face this is not always accurate! If that is so you have to come up with a method that mesures face accurately. 
                  		face_width = faces[0].bounds.width;   # puts "Transom = #{face_width.inspect}" #debugg
                  		face_height = faces[0].bounds.height; # puts "Mullion = #{face_height.inspect}"  #debugg
                       
                  		path = File.join(File.dirname(__FILE__), "CurtainWall_Architect/Components/#{comp_in}.skp") #if coming from webdialog .skp is probably not included in name ?
                  		mydefinition = Sketchup.active_model.definitions.load(path)
                  		tr = Geom;;Transformation.new(ORIGIN, user_face.normal) #face selected by user
                  		gp = ents.add_group() # Container group. Not a must..
                  		inst = gp.entities.add_instance(mydefinition, tr)
                  		
                  		#Do the rotation before getting width and height..
                  		tr1 = Geom;;Transformation.rotation(ORIGIN, Z_AXIS, xrotation) #xrotation from argumentlist
                  		inst.entities.transform_entities(tr1, inst.entities.to_a)
                  		inst.invalidate_bounds
                  		
                  		#Now cache the width and height of instance
                  		inst_width  = inst.bounds.width
                  		inst_height = inst.bounds.height
                  		
                  		scalefactorW = face_width/inst_width #(simplified, needs some laboring)
                  		scalefactorH = face_height/inst_height #(simplified, needs some laboring)
                           
                  		#Scale the component..
                  		tr2 = Geom;;Transformation.scaling(ORIGIN, scalefactorW, scalefactorH, 1) #X,Y,Z  
                  		inst.transform!( tr2 )
                  		
                  		#Assuming you have created and saved the component at Origin with faces up in Z_AXIS flat on ground..
                  		tr3 = Geom;;Transformation.new(ORIGIN, faces[0].normal) #face selected by user
                  		gp.transform!( tr3 ) # In case you need to add different Components, do this manouver last.
                  		
                  	end # load_comp
                  
                  end # module 
                  
                  1 Reply Last reply Reply Quote 0
                  • pingpinkP Offline
                    pingpink
                    last edited by

                    Thank you very much ,Jolran !!! I've tested the codes. There is still having an error about variable of 'xrotation'. I will try all my effort to solve the codes to link my component's folder which I've created 1 meter upright at the axis (0,0,0). This is my first plugin to do from the user's requirement. You are the first person who understand my project and give me an advice in here. I am much appreciated your ideas !. I can bring to sketch my flowcharts. If I can do the codes, I will inform you later. The big task of coding is waiting for me.I'm fighting πŸ’š

                    1 Reply Last reply Reply Quote 0
                    • jolranJ Offline
                      jolran
                      last edited by

                      I did not give you such an advanced answer, but glad if it could give you a push in the right direction πŸ˜„

                      About the 'xrotation', make sure that it is not a string coming from webdialog. You need an integer in your case(90 degrees). Ruby cannot calculate rotation-amount from a string.
                      So, xrotation = webdialog_string.to_i might do it.
                      Also be vary about rotations in SU. API internally uses Radians to calculate rotations. So you might have to fiddle some with .radians or .degrees for xrotation.

                      There's some info on Thomsthoms blogg regarding stringconversion to Sketchup units.
                      I'd suggest you read that.

                      Keep fighting and don't give up!

                      1 Reply Last reply Reply Quote 0
                      • thomthomT Offline
                        thomthom
                        last edited by

                        @jolran said:

                        There's some info on Thomsthoms blogg regarding stringconversion to Sketchup units.
                        I'd suggest you read that.

                        Link to article: http://www.thomthom.net/thoughts/2012/08/dealing-with-units-in-sketchup/

                        Thomas Thomassen β€” SketchUp Monkey & Coding addict
                        List of my plugins and link to the CookieWare fund

                        1 Reply Last reply Reply Quote 0
                        • pingpinkP Offline
                          pingpink
                          last edited by

                          Maybe,the problem is about the component , and face color functions . I did it separately in the external files. My webdialog have to be chosen all options and run by clicking. I'm trying to develop the curtain wall structure modeling .I'm not finished all the codes yet.

                          I use Window , and SU7 to test a program.

                          I changed all the color_value names which you suggest it would cause the conflict about component's color and face's color. It's looked easier in the code. I've attached the files for you If you would like too see. And If you have any suggestions , I love to read for improvement.

                          Thank you for helping and teaching me ,Jolran .I keep doing codes every day.I'm trying !
                          
                          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