Blog / SketchUp Automation with Claude Code: A Practical Guide for Architects

SketchUp Automation with Claude Code: A Practical Guide for Architects

How architects can use Claude Code skills to automate SketchUp Ruby scripting, plugin development, model optimization, and rendering workflows

A
Archgyan Editor
· 19 min read

Go deeper with Archgyan Academy

Structured BIM and Revit learning paths for architects and students.

Explore Academy →

Architects who use SketchUp regularly know the frustration: spending hours on tasks that feel like they should take minutes. Purging unused components across a dozen project files, assigning materials to hundreds of faces, setting up the same scene tabs for every new model, or exporting multiple formats for consultants. These tasks are repetitive, error-prone, and perfectly suited for automation.

The SketchUp Ruby API has existed for years, but most architects never touch it. Ruby scripting feels like a separate discipline, and the learning curve discourages all but the most dedicated users. Claude Code changes that equation entirely. You describe what you want in plain English, and Claude Code generates working Ruby scripts that interact directly with the SketchUp API. No need to memorize method signatures or debug syntax errors manually.

This guide covers twelve practical automation skills you can build with Claude Code for SketchUp, complete with Ruby code examples you can adapt to your own projects.

Why SketchUp Workflows Need Automation

SketchUp’s strength is its simplicity. You can start modeling within minutes of opening the application. But that same simplicity becomes a bottleneck at scale. Consider what happens on a mid-size commercial project:

  • Component management becomes chaotic. You import components from the 3D Warehouse, create custom ones, copy them from previous projects, and end up with dozens of unused definitions bloating your file.
  • Material consistency breaks down. Different team members apply slightly different versions of the same material. One person uses “Brick_Red_01” while another uses “Red Brick” with identical texture files.
  • Export workflows multiply. The structural engineer needs DWG sections. The client wants rendered perspectives. The contractor needs IFC files. Each export requires manual configuration.
  • Scene setup is repetitive. Every project needs the same baseline scenes: plan views at each level, four elevations, an aerial perspective, and a context view. Setting these up manually takes 20 to 30 minutes per project.

These tasks follow predictable patterns. They have clear inputs and outputs. They rarely require design judgment. That makes them ideal candidates for automation through Ruby scripts that Claude Code can generate on demand.

The real cost is not just the time spent on each task. It is the context switching. Every time you stop designing to rename 50 scenes or purge unused layers, you lose creative momentum. Automation keeps you in the design flow by handling the mechanical work in the background.

The SketchUp Ruby API and Claude Code’s Role

The SketchUp Ruby API provides programmatic access to nearly every operation you can perform through the user interface. You can create geometry, manipulate components, apply materials, configure scenes, manage layers (tags), and control exports. The API is well-documented, with a comprehensive class reference available at ruby.sketchup.com.

Claude Code fits into this workflow as a script generator and debugging assistant. Here is the typical pattern:

  1. You describe the task in plain language: “Write a Ruby script that finds all components in the model whose name starts with ‘Furniture_’ and moves them to a tag called ‘FF&E’.”
  2. Claude Code generates a working Ruby script using the correct API methods.
  3. You paste the script into SketchUp’s Ruby Console (Window > Ruby Console) or save it as an .rb file in SketchUp’s Plugins folder.
  4. The script executes, completing in seconds what would take you minutes or hours manually.

For more complex workflows, you can ask Claude Code to build full SketchUp extensions with dialog boxes, toolbar buttons, and menu entries. But most day-to-day automation starts with simple scripts in the Ruby Console.

Here is a minimal example that counts all component instances in the active model:

model = Sketchup.active_model
entities = model.active_entities
count = entities.grep(Sketchup::ComponentInstance).length
puts "Total component instances: #{count}"

That four-line script replaces manually scrolling through the Outliner panel. Claude Code can generate scripts like this instantly, and more importantly, it can generate much more complex ones that handle edge cases, nested components, and error handling.

Skill: Automated Component Library Management

Component libraries are the backbone of efficient SketchUp workflows, but they accumulate clutter fast. Claude Code can generate scripts that audit, organize, and clean your component definitions.

Purge unused components is the most common request. SketchUp has a built-in purge function, but it does not give you a report of what was removed. This script purges and logs:

model = Sketchup.active_model
definitions = model.definitions
unused = definitions.select { |d| d.count_instances == 0 && !d.image? }

puts "Found #{unused.length} unused component definitions:"
unused.each { |d| puts "  - #{d.name}" }

unused.each { |d| definitions.remove(d) }
puts "Purge complete."

Rename components by pattern. If your components follow inconsistent naming conventions (some use underscores, others use spaces, some have version suffixes), you can standardize them:

model = Sketchup.active_model
model.start_operation('Rename Components', true)

model.definitions.each do |defn|
  next if defn.group? || defn.image?

  new_name = defn.name
    .gsub(/\s+/, '_')           # Spaces to underscores
    .gsub(/_v\d+$/i, '')        # Remove version suffixes like _v2
    .gsub(/_{2,}/, '_')         # Collapse multiple underscores
    .downcase

  defn.name = new_name unless new_name == defn.name
end

model.commit_operation
puts "Component renaming complete."

Export a component inventory to CSV. For project documentation or BIM coordination, you often need a list of all components with their counts:

model = Sketchup.active_model
path = UI.savepanel('Save Component Inventory', '', 'components.csv')

if path
  File.open(path, 'w') do |f|
    f.puts "Name,Instances,Description"
    model.definitions.each do |defn|
      next if defn.group? || defn.image? || defn.count_instances == 0
      desc = defn.description.gsub(',', ';')
      f.puts "#{defn.name},#{defn.count_instances},#{desc}"
    end
  end
  puts "Inventory saved to #{path}"
end

Each of these scripts solves a specific problem that architects encounter weekly. Ask Claude Code for variations: filtering by tag, processing only selected components, or recursively auditing nested definitions.

Skill: Ruby Script Generation for Repetitive Modeling Tasks

Many modeling tasks involve creating the same geometry with slightly different parameters. Stairs, mullion patterns, structural grids, parking layouts, and facade panels all follow geometric rules that Ruby scripts can encode.

Generate a parametric grid of columns:

model = Sketchup.active_model
model.start_operation('Generate Column Grid', true)

spacing_x = 6000.mm  # 6 meters on-center
spacing_y = 6000.mm
cols_x = 5
cols_y = 3
column_width = 300.mm
column_depth = 300.mm
column_height = 3600.mm

half_w = column_width / 2.0
half_d = column_depth / 2.0

cols_x.times do |ix|
  cols_y.times do |iy|
    cx = ix * spacing_x
    cy = iy * spacing_y

    pts = [
      Geom::Point3d.new(cx - half_w, cy - half_d, 0),
      Geom::Point3d.new(cx + half_w, cy - half_d, 0),
      Geom::Point3d.new(cx + half_w, cy + half_d, 0),
      Geom::Point3d.new(cx - half_w, cy + half_d, 0)
    ]

    face = model.active_entities.add_face(pts)
    face.pushpull(-column_height)
  end
end

model.commit_operation
puts "Generated #{cols_x * cols_y} columns."

Create a staircase with configurable parameters:

model = Sketchup.active_model
model.start_operation('Generate Stairs', true)

riser_count = 16
riser_height = 175.mm
tread_depth = 280.mm
stair_width = 1200.mm

riser_count.times do |i|
  x0 = i * tread_depth
  z0 = i * riser_height

  pts = [
    Geom::Point3d.new(x0, 0, z0),
    Geom::Point3d.new(x0 + tread_depth, 0, z0),
    Geom::Point3d.new(x0 + tread_depth, 0, z0 + riser_height),
    Geom::Point3d.new(x0, 0, z0 + riser_height)
  ]

  face = model.active_entities.add_face(pts)
  face.pushpull(stair_width) if face
end

model.commit_operation
puts "Staircase generated: #{riser_count} risers."

The power here is not in any single script. It is in the ability to describe a parametric task to Claude Code and get a working script back in seconds. When the client changes the column spacing from 6 meters to 7.5 meters, you modify one variable instead of rebuilding geometry manually.

Skill: Model Optimization and Cleanup

Large SketchUp models slow down for predictable reasons: reversed faces, excessive edge segments on curves, hidden geometry that serves no purpose, and nested groups with redundant nesting levels. Claude Code can generate cleanup scripts that target each of these issues.

Fix reversed faces. Reversed faces cause rendering artifacts and confuse 3D printing workflows. This script checks all faces in the model and reverses any that face inward:

model = Sketchup.active_model
model.start_operation('Fix Reversed Faces', true)

reversed_count = 0

model.active_entities.grep(Sketchup::Face).each do |face|
  if face.normal.z < 0 && face.normal.z.abs > face.normal.x.abs && face.normal.z.abs > face.normal.y.abs
    face.reverse!
    reversed_count += 1
  end
end

model.commit_operation
puts "Reversed #{reversed_count} faces."

Note that face orientation is context-dependent. For floor slabs, you want normals pointing up (positive Z). For walls, the logic differs. Ask Claude Code to customize the orientation rules for your specific use case.

Reduce curve segment counts. Circles and arcs default to 24 segments, but many use cases only need 12. On large models with hundreds of curved elements, reducing segments dramatically improves performance:

model = Sketchup.active_model
edges = model.active_entities.grep(Sketchup::Edge)

curve_edges = edges.select { |e| e.curve }
curves = curve_edges.map { |e| e.curve }.uniq

puts "Found #{curves.length} curves in the model."
high_seg = curves.select { |c| c.count_edges > 16 }
puts "#{high_seg.length} curves have more than 16 segments."

This audit script identifies where geometry is over-detailed. For actual reduction, you would need to delete and recreate curves with fewer segments, which Claude Code can also script based on your tolerance thresholds.

Purge unused materials and tags in one pass:

model = Sketchup.active_model
model.start_operation('Full Purge', true)

# Purge unused materials
unused_mats = model.materials.select { |m| !m.used? }
unused_mats.each { |m| model.materials.remove(m) }
puts "Purged #{unused_mats.length} unused materials."

# Purge unused tags (layers)
default_layer = model.layers['Untagged'] || model.layers['Layer0']
unused_tags = model.layers.select { |l| l != default_layer && l.count_entities == 0 }
# Note: count_entities requires checking manually in older API versions
puts "Found #{unused_tags.length} potentially unused tags."

# Purge unused component definitions
unused_defs = model.definitions.select { |d| d.count_instances == 0 && !d.image? }
unused_defs.each { |d| model.definitions.remove(d) }
puts "Purged #{unused_defs.length} unused components."

model.commit_operation

Skill: Material Assignment Automation

Material workflows in SketchUp become tedious when you need to apply consistent materials across many faces or components. Claude Code can generate scripts for bulk material operations.

Apply materials by tag. Suppose every entity on the “Concrete” tag should use a specific concrete material:

model = Sketchup.active_model
model.start_operation('Assign Materials by Tag', true)

tag_material_map = {
  'Concrete' => 'Concrete_Exposed_Grey',
  'Steel' => 'Metal_Steel_Brushed',
  'Glass' => 'Glass_Clear_Blue',
  'Timber' => 'Wood_Oak_Natural'
}

applied = 0

tag_material_map.each do |tag_name, mat_name|
  tag = model.layers[tag_name]
  material = model.materials[mat_name]

  next unless tag && material

  model.active_entities.each do |entity|
    if entity.layer == tag
      if entity.respond_to?(:material=)
        entity.material = material
        applied += 1
      end
    end
  end
end

model.commit_operation
puts "Applied materials to #{applied} entities."

Create a material palette from hex codes. When you receive brand colors from a client or a color scheme from an interior designer, you can batch-create materials:

model = Sketchup.active_model
model.start_operation('Create Material Palette', true)

palette = {
  'Brand_Primary'   => '#2C3E50',
  'Brand_Secondary' => '#E74C3C',
  'Brand_Accent'    => '#3498DB',
  'Neutral_Light'   => '#ECF0F1',
  'Neutral_Dark'    => '#34495E',
  'Warm_Wood'       => '#8B6914',
  'Cool_Grey'       => '#95A5A6'
}

palette.each do |name, hex|
  r = hex[1..2].to_i(16)
  g = hex[3..4].to_i(16)
  b = hex[5..6].to_i(16)

  mat = model.materials.add(name)
  mat.color = Sketchup::Color.new(r, g, b)
end

model.commit_operation
puts "Created #{palette.length} materials."

Find and replace materials across the entire model. This is useful when updating material libraries or correcting a wrong material that was applied globally:

model = Sketchup.active_model
model.start_operation('Replace Material', true)

old_name = 'Brick_Old'
new_name = 'Brick_Updated'

old_mat = model.materials[old_name]
new_mat = model.materials[new_name]

unless old_mat && new_mat
  puts "Error: One or both materials not found."
  next
end

replaced = 0

model.active_entities.grep(Sketchup::Face).each do |face|
  if face.material == old_mat
    face.material = new_mat
    replaced += 1
  end
  if face.back_material == old_mat
    face.back_material = new_mat
    replaced += 1
  end
end

model.commit_operation
puts "Replaced material on #{replaced} faces."

Skill: Scene and Style Template Setup

Every project type has a standard set of scenes. Residential projects need floor plans, elevations, a street view, and a garden view. Commercial projects add reflected ceiling plans and parking level views. Setting these up manually for every new project wastes time.

Create a standard scene set:

model = Sketchup.active_model
pages = model.pages
model.start_operation('Create Standard Scenes', true)

# Define camera positions for standard views
scenes = [
  { name: 'Plan - Ground Floor', eye: [15000, 15000, 50000], target: [15000, 15000, 0], up: [0, 1, 0] },
  { name: 'Plan - First Floor',  eye: [15000, 15000, 53600], target: [15000, 15000, 3600], up: [0, 1, 0] },
  { name: 'Elevation - North',   eye: [15000, -30000, 5000], target: [15000, 0, 5000], up: [0, 0, 1] },
  { name: 'Elevation - South',   eye: [15000, 60000, 5000],  target: [15000, 30000, 5000], up: [0, 0, 1] },
  { name: 'Elevation - East',    eye: [60000, 15000, 5000],  target: [30000, 15000, 5000], up: [0, 0, 1] },
  { name: 'Elevation - West',    eye: [-30000, 15000, 5000], target: [0, 15000, 5000], up: [0, 0, 1] },
  { name: 'Perspective - Aerial', eye: [40000, -20000, 25000], target: [15000, 15000, 3000], up: [0, 0, 1] },
  { name: 'Perspective - Street', eye: [-15000, -10000, 1700], target: [15000, 15000, 4000], up: [0, 0, 1] }
]

scenes.each do |s|
  eye = Geom::Point3d.new(s[:eye].map { |v| v.mm })
  target = Geom::Point3d.new(s[:target].map { |v| v.mm })
  up = Geom::Vector3d.new(s[:up])

  camera = Sketchup::Camera.new(eye, target, up)
  camera.perspective = s[:name].include?('Perspective')

  model.active_view.camera = camera
  page = pages.add(s[:name])
  page.use_camera = true
end

model.commit_operation
puts "Created #{scenes.length} standard scenes."

Apply a consistent style to all scenes. After loading your preferred style (hidden line, sketchy edges, or monochrome), you can propagate it:

model = Sketchup.active_model
style = model.styles.active_style

model.pages.each do |page|
  page.style = style
  page.use_style = true
end

puts "Applied '#{style.name}' to all #{model.pages.length} scenes."

You can also ask Claude Code to generate scripts that toggle tag visibility per scene. For example, the “Plan - Ground Floor” scene shows only ground-floor tags while hiding furniture, MEP, and upper-floor structure.

Skill: Export Workflow Automation

Exporting from SketchUp often involves switching between formats, adjusting options, and remembering which scenes map to which exports. A single Ruby script can handle the entire export pipeline.

Batch export scenes as PNG images:

model = Sketchup.active_model
export_dir = UI.select_directory(title: 'Select Export Folder')

if export_dir
  options = {
    filename: '',
    width: 3840,
    height: 2160,
    antialias: true,
    transparent: false
  }

  model.pages.each do |page|
    model.pages.selected_page = page

    safe_name = page.name.gsub(/[^a-zA-Z0-9_\-]/, '_')
    filepath = File.join(export_dir, "#{safe_name}.png")
    options[:filename] = filepath

    model.active_view.write_image(options)
    puts "Exported: #{safe_name}.png"
  end

  puts "Batch export complete: #{model.pages.length} images."
end

Export DWG with specific options:

model = Sketchup.active_model
filepath = UI.savepanel('Export DWG', '', 'export.dwg')

if filepath
  options = {
    acad_version: 'acad_2018',
    faces_flag: true,
    construction_geometry: false,
    dimensions: true,
    text: true,
    edges: true
  }

  status = model.export(filepath, options)
  puts status ? "DWG exported successfully." : "DWG export failed."
end

Export 3D model for rendering (COLLADA/DAE):

model = Sketchup.active_model
filepath = UI.savepanel('Export DAE', '', 'model.dae')

if filepath
  options = {
    triangulated_faces: true,
    doublesided_faces: true,
    edges: false,
    author_attribution: false,
    texture_maps: true,
    selectionset_only: false,
    preserve_instancing: true
  }

  model.export(filepath, options)
  puts "DAE exported for rendering."
end

For firms that export regularly to consultants, you can combine these into a single “Export All” script that creates a dated folder, exports DWG plans, PNG perspectives, and a DAE file for the rendering team, all in one operation.

Skill: SketchUp Plugin Scaffolding from Description

When a script outgrows the Ruby Console and you need a proper extension with menus, toolbars, and dialog boxes, Claude Code can scaffold the entire plugin structure.

A SketchUp extension follows a specific file structure:

my_extension/
├── my_extension.rb          # Loader file (registers the extension)
└── my_extension/
    ├── main.rb              # Entry point
    ├── core.rb              # Business logic
    └── ui.rb                # Dialog/toolbar code

The loader file (my_extension.rb) that Claude Code would generate:

require 'sketchup'
require 'extensions'

module MyCompany
  module FloorAreaCalculator
    EXTENSION = SketchupExtension.new(
      'Floor Area Calculator',
      File.join(__dir__, 'floor_area_calculator', 'main.rb')
    )

    EXTENSION.version     = '1.0.0'
    EXTENSION.creator     = 'Your Firm Name'
    EXTENSION.description = 'Calculates floor areas by tag and exports to CSV.'
    EXTENSION.copyright   = '2026'

    Sketchup.register_extension(EXTENSION, true)
  end
end

The main logic file with menu integration:

module MyCompany
  module FloorAreaCalculator
    def self.calculate_areas
      model = Sketchup.active_model
      results = {}

      model.active_entities.grep(Sketchup::Face).each do |face|
        tag_name = face.layer.name
        area_sqm = face.area / (1000.mm * 1000.mm)

        results[tag_name] ||= 0.0
        results[tag_name] += area_sqm
      end

      report = results.sort_by { |_, area| -area }
        .map { |tag, area| "#{tag}: #{'%.2f' % area} sqm" }
        .join("\n")

      UI.messagebox("Floor Areas by Tag:\n\n#{report}")
    end

    unless file_loaded?(__FILE__)
      menu = UI.menu('Plugins')
      menu.add_item('Calculate Floor Areas') { self.calculate_areas }
      file_loaded(__FILE__)
    end
  end
end

Tell Claude Code what your plugin should do: “Create a SketchUp plugin that lets me select faces, calculates their combined area, and shows the result in a dialog with an option to copy to clipboard.” Claude Code produces the full file structure, correctly namespaced under your company module, with proper extension registration.

Working with the SketchUp Extension Ecosystem

Before writing custom scripts, check whether an existing extension already handles your use case. The SketchUp Extension Warehouse and community forums host thousands of free and paid extensions.

Claude Code helps you work with existing extensions in several ways:

Understanding extension APIs. Some extensions expose their own Ruby methods. If you install an extension and want to call its functions from a script, ask Claude Code to examine the extension’s source files (located in the Plugins folder) and identify callable methods.

Extending existing extensions. If an extension does 80% of what you need, Claude Code can help you write a wrapper script that calls the extension’s functions and adds the missing 20%. This is common with rendering plugins that expose batch-render methods but lack custom scene cycling.

Migrating between extensions. When switching from one material library to another, Claude Code can generate scripts that map old material names to new ones and batch-replace across all your project files.

Common extensions worth integrating with:

  • FredoTools (by Fredo6): Provides geometry utilities. Many of its operations can be scripted.
  • Eneroth Solid Tools: Better boolean operations than SketchUp’s built-in tools, with API-accessible methods.
  • PlaceMaker: Imports GIS data. Scripts can automate site context setup.
  • Profile Builder: Parametric profiles along paths. Useful for automating railing and molding placement.

The key principle: do not reinvent what already exists. Use Claude Code to glue extensions together and fill gaps, not to rebuild functionality that established plugins already provide.

Performance Tips for Large SketchUp Models

Large models (100MB+) require specific scripting techniques to avoid freezing SketchUp during script execution. Claude Code can generate optimized scripts when you mention the model size.

Always wrap modifications in operations. The start_operation and commit_operation calls suppress the UI update until the script completes:

model = Sketchup.active_model
# The second parameter (true) disables the UI update during the operation
model.start_operation('Batch Modify', true)

# ... all modifications here ...

model.commit_operation

Without operation wrapping, SketchUp redraws after every single change. On a model with 10,000 faces, that means 10,000 redraws instead of one.

Process entities in batches. For very large models, collect references first, then modify:

model = Sketchup.active_model
model.start_operation('Batch Tag Assignment', true)

# Collect references first (avoid modifying while iterating)
target_entities = model.active_entities
  .grep(Sketchup::ComponentInstance)
  .select { |ci| ci.definition.name.start_with?('Chair') }

target_tag = model.layers['Furniture'] || model.layers.add('Furniture')

target_entities.each { |ci| ci.layer = target_tag }

model.commit_operation
puts "Moved #{target_entities.length} chairs to Furniture tag."

Avoid recursive traversal when possible. Traversing into every nested group and component is expensive. If you only need top-level entities, skip the recursion. When recursion is necessary, limit the depth:

def collect_faces(entities, depth = 0, max_depth = 3)
  return [] if depth > max_depth

  faces = entities.grep(Sketchup::Face)

  entities.grep(Sketchup::Group).each do |group|
    faces.concat(collect_faces(group.entities, depth + 1, max_depth))
  end

  entities.grep(Sketchup::ComponentInstance).each do |ci|
    faces.concat(collect_faces(ci.definition.entities, depth + 1, max_depth))
  end

  faces
end

Use model.active_view.invalidate sparingly. Forcing a view refresh mid-script is sometimes necessary for visual feedback, but each call adds overhead. Save it for the end of operations or for progress indicators on very long scripts.

Memory considerations. Ruby’s garbage collector handles memory, but holding references to thousands of entities in arrays prevents cleanup. Process and discard references when possible rather than accumulating them.

Getting Started: Building Your First SketchUp Skill

The fastest way to begin is with a concrete task you perform regularly. Here is a step-by-step process for building your first Claude Code skill for SketchUp.

Step 1: Identify a repetitive task. Pick something you do at least once per project. Good candidates for a first skill include:

  • Purging unused components, materials, and tags
  • Setting up standard tags for a new project
  • Creating a consistent scene set
  • Exporting all scenes as images

Step 2: Describe the task to Claude Code. Be specific about inputs, outputs, and edge cases. For example:

“Write a SketchUp Ruby script that creates the following tags if they don’t already exist: ‘Structure’, ‘Envelope’, ‘Interior Walls’, ‘Furniture’, ‘MEP’, ‘Site’, ‘Annotations’. Assign the color red to Structure, blue to Envelope, green to Interior Walls, orange to Furniture, purple to MEP, brown to Site, and grey to Annotations.”

Step 3: Test in the Ruby Console. Open SketchUp, go to Window > Ruby Console, and paste the generated script. Check the output messages for errors and verify the results in your model.

Here is what Claude Code might generate for that request:

model = Sketchup.active_model
model.start_operation('Create Standard Tags', true)

tag_colors = {
  'Structure'      => Sketchup::Color.new(220, 50, 50),
  'Envelope'       => Sketchup::Color.new(50, 100, 220),
  'Interior Walls' => Sketchup::Color.new(50, 180, 80),
  'Furniture'      => Sketchup::Color.new(240, 160, 40),
  'MEP'            => Sketchup::Color.new(160, 60, 200),
  'Site'           => Sketchup::Color.new(140, 100, 60),
  'Annotations'    => Sketchup::Color.new(160, 160, 160)
}

created = 0
tag_colors.each do |name, color|
  unless model.layers[name]
    tag = model.layers.add(name)
    tag.color = color
    created += 1
    puts "Created tag: #{name}"
  else
    puts "Tag already exists: #{name}"
  end
end

model.commit_operation
puts "Done. Created #{created} new tags."

Step 4: Save as a reusable script. Once the script works, save it as a .rb file. You can load it in future sessions via load '/path/to/your/script.rb' in the Ruby Console, or place it in the SketchUp Plugins folder for automatic loading.

Step 5: Iterate and expand. Ask Claude Code to add features: a dialog box that lets you customize tag names, automatic assignment of existing geometry to tags based on naming patterns, or a CSV import for tag definitions used across your firm.

Step 6: Share with your team. Package working scripts as a proper SketchUp extension (using the scaffolding skill described earlier) and distribute them to colleagues. A firm-wide automation library, maintained through Claude Code, can save hundreds of hours per year across the practice.

The most important principle is to start small. A five-line script that saves you ten minutes per project is more valuable than a complex plugin you never finish building. Let Claude Code handle the Ruby syntax so you can focus on defining what the automation should accomplish. As you build confidence, your scripts will naturally grow in complexity, and Claude Code will scale with your ambitions.

Level up your skills

Ready to learn hands-on?

  • Project-based Revit & BIM courses for architects
  • Go from beginner to confident professional
  • Video lessons you can follow at your own pace
Explore Archgyan Academy
← Back to Blog