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

    Automate Color Variations in SketchUp with Ease

    Scheduled Pinned Locked Moved Extensions & Applications Discussions
    1 Posts 1 Posters 37 Views 1 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.
    • bagateloB Offline
      bagatelo
      last edited by

      HSL.jpg

      Automate color variations in SketchUp with ease

      This simple SketchUp script is designed to help you easily generate and visualize color variations for a selected object. The script creates three sets of variations: luminance, hue, and saturation. Each set forms a circle of rectangles around the original object, illustrating different levels of brightness, color, and saturation changes. Just select a face with any desired color and run the script to see the variations. It's a simple tool that can help you explore color options more effectively in your models.

      require 'sketchup'
      
      module CombinedVariations
        extend self
      
        def create_variations
          create_luminance_variations
          create_color_variations
          create_saturation_variations
        end
      
        def create_luminance_variations
          puts "Iniciando a criação de variações de luminância..."
          model = Sketchup.active_model
          selection = model.selection
      
          unless selection.length == 1 && selection[0].is_a?(Sketchup::Face)
            puts "Por favor, selecione apenas um objeto com uma cor só."
            return
          end
      
          puts "Objeto selecionado encontrado."
      
          original_color = selection[0].material.color
          center_point = selection[0].bounds.center
          circle_radius = 400.cm
      
          puts "Cor original do objeto: #{original_color}"
          puts "Criando retângulos com variações de luminância..."
      
          colors = generate_luminance_colors(original_color)
          create_rectangles_around_object(center_point, circle_radius, colors, 'LUM')
          
          puts "Variações de luminância criadas com sucesso."
        end
      
        def generate_luminance_colors(original_color)
          puts "Gerando variações de luminância..."
          colors = []
      
          hsl_color = rgb_to_hsl(original_color.red, original_color.green, original_color.blue)
          original_hue, original_saturation, original_lightness = hsl_color[:h], hsl_color[:s], hsl_color[:l]
      
          luminance_stages = (0..100).map { |i| i / 100.0 }
          selected_luminance_stages = luminance_stages.select.with_index { |_, i| i.even? }
      
          selected_luminance_stages.each do |lightness|
            color = hsl_to_rgb(original_hue, original_saturation, lightness)
            colors << Sketchup::Color.new(color[:r], color[:g], color[:b])
          end
      
          colors
        end
      
        def create_color_variations
          puts "Iniciando a criação de variações de cores..."
          model = Sketchup.active_model
          selection = model.selection
      
          unless selection.length == 1 && selection[0].is_a?(Sketchup::Face)
            puts "Por favor, selecione apenas um objeto com uma cor só."
            return
          end
      
          puts "Objeto selecionado encontrado."
      
          original_color = selection[0].material.color
          center_point = selection[0].bounds.center
          circle_radius = 500.cm
      
          puts "Cor original do objeto: #{original_color}"
          puts "Criando retângulos com variações de cores..."
      
          colors = generate_color_variations(original_color)
          create_rectangles_around_object(center_point, circle_radius, colors, 'HUE')
          
          puts "Variações de cores criadas com sucesso."
        end
      
        def generate_color_variations(original_color)
          puts "Gerando variações de cores..."
          hue_step = 360.0 / 64.0
          colors = []
      
          hsv_color = rgb_to_hsv(original_color.red, original_color.green, original_color.blue)
          original_hue, original_saturation, original_value = hsv_color[:h], hsv_color[:s], hsv_color[:v]
      
          64.times do |i|
            hue = (original_hue + i * hue_step) % 360
            color = hsv_to_rgb(hue, original_saturation, original_value)
            colors << Sketchup::Color.new(color[:r], color[:g], color[:b])
          end
      
          colors
        end
      
        def create_saturation_variations
          puts "Iniciando a criação de variações de saturação..."
          model = Sketchup.active_model
          selection = model.selection
      
          unless selection.length == 1 && selection[0].is_a?(Sketchup::Face)
            puts "Por favor, selecione apenas um objeto com uma cor só."
            return
          end
      
          puts "Objeto selecionado encontrado."
      
          original_color = selection[0].material.color
          center_point = selection[0].bounds.center
          circle_radius = 300.cm
      
          puts "Cor original do objeto: #{original_color}"
          puts "Criando retângulos com variações de saturação..."
      
          colors = generate_saturation_colors(original_color)
          create_rectangles_around_object(center_point, circle_radius, colors, 'SAT')
          
          puts "Variações de saturação criadas com sucesso."
        end
      
        def generate_saturation_colors(original_color)
          puts "Gerando variações de saturação..."
          colors = []
      
          hsl_color = rgb_to_hsl(original_color.red, original_color.green, original_color.blue)
          original_hue, original_saturation, original_lightness = hsl_color[:h], hsl_color[:s], hsl_color[:l]
      
          saturation_stages = (0..35).map { |i| i / 35.0 }
      
          saturation_stages.each do |saturation|
            color = hsl_to_rgb(original_hue, saturation, original_lightness)
            colors << Sketchup::Color.new(color[:r], color[:g], color[:b])
          end
      
          colors
        end
      
        def rgb_to_hsl(r, g, b)
          r, g, b = r / 255.0, g / 255.0, b / 255.0
          max = [r, g, b].max
          min = [r, g, b].min
          delta = max - min
      
          l = (max + min) / 2.0
          if delta == 0
            h = 0
            s = 0
          else
            s = delta / (1 - (2 * l - 1).abs)
            h = if max == r
                  ((g - b) / delta) % 6
                elsif max == g
                  (b - r) / delta + 2
                else
                  (r - g) / delta + 4
                end
            h *= 60
            h += 360 if h < 0
          end
      
          { h: h, s: s, l: l }
        end
      
        def hsl_to_rgb(h, s, l)
          c = (1 - (2 * l - 1).abs) * s
          x = c * (1 - ((h / 60.0) % 2 - 1).abs)
          m = l - c / 2.0
      
          r, g, b = case h
                    when 0..60 then [c, x, 0]
                    when 60..120 then [x, c, 0]
                    when 120..180 then [0, c, x]
                    when 180..240 then [0, x, c]
                    when 240..300 then [x, 0, c]
                    else [c, 0, x]
                    end
      
          { r: ((r + m) * 255).round, g: ((g + m) * 255).round, b: ((b + m) * 255).round }
        end
      
        def rgb_to_hsv(r, g, b)
          r, g, b = r / 255.0, g / 255.0, b / 255.0
          max = [r, g, b].max
          min = [r, g, b].min
          delta = max - min
      
          h = if max == min
                0
              elsif max == r
                60 * (((g - b) / delta) % 6)
              elsif max == g
                60 * (((b - r) / delta) + 2)
              else
                60 * (((r - g) / delta) + 4)
              end
      
          s = max == 0 ? 0 : delta / max
          v = max
      
          { h: h, s: s, v: v }
        end
      
        def hsv_to_rgb(h, s, v)
          h = h / 60.0
          i = h.floor
          f = h - i
          p = v * (1 - s)
          q = v * (1 - f * s)
          t = v * (1 - (1 - f) * s)
      
          r, g, b = case i % 6
                    when 0 then [v, t, p]
                    when 1 then [q, v, p]
                    when 2 then [p, v, t]
                    when 3 then [p, q, v]
                    when 4 then [t, p, v]
                    when 5 then [v, p, q]
                    end
      
          { r: (r * 255).to_i, g: (g * 255).to_i, b: (b * 255).to_i }
        end
      
        def create_rectangles_around_object(center_point, circle_radius, colors, prefix)
          puts "Criando retângulos em torno do objeto..."
      
          model = Sketchup.active_model
          entities = model.active_entities
      
          rectangle_size = [35.cm, 35.cm]
      
          angle_step = 2 * Math::PI / colors.length
          current_angle = 0
          k = 0
          colors.each do |color|
            x = center_point.x + circle_radius * Math.cos(current_angle)
            y = center_point.y + circle_radius * Math.sin(current_angle)
            position = Geom::Point3d.new(x, y, center_point.z)
      
            group = entities.add_group
            pt1 = position
            pt2 = Geom::Point3d.new(x + rectangle_size[0], y, center_point.z)
            pt3 = Geom::Point3d.new(x + rectangle_size[0], y + rectangle_size[1], center_point.z)
            pt4 = Geom::Point3d.new(x, y + rectangle_size[1], center_point.z)
            face = group.entities.add_face(pt1, pt2, pt3, pt4)
            face.reverse!
      
            material_name = "#{prefix}_#{'%02d' % k}_#{color.red}_#{color.green}_#{color.blue}"
            material = model.materials[material_name] || model.materials.add(material_name)
            material.color = color
            face.material = material
      
            current_angle += angle_step
            k += 1
          end
      
          puts "Retângulos criados."
        end
      end
      
      UI.menu("Edit").add_item("Create Combined Variations") { CombinedVariations.create_variations }
      
      

      While the cat's away, the mice will play

      1 Reply Last reply Reply Quote 1
      • 1 / 1
      • First post
        Last post
      Buy SketchPlus
      Buy SUbD
      Buy WrapR
      Buy eBook
      Buy Modelur
      Buy Vertex Tools
      Buy SketchCuisine
      Buy FormFonts

      Advertisement