Workflow Development Log - 5D+ Plus, FredoSection, Medeek BIM

Well, Off I go. Getting a 3D model built to set up tags and understand how to either convert Medeek tags to 5D+ compatible ones (editing them in each Medeek BIM Tool’s global settings:) or seeing how to change the customization in 5D+ to accommodate Medeek’s tag and grouping architecture.

I am trying to basically create a house that utilizes everything that Medeek has to offer and see what I need to tweak to make it all talk together, then there’s Fredo’s integration, haven’t tried it yet.

@medeek see below list of tags: Had AI write some ruby to just write out the tags in the modal If you have time, let me know if I missed any.

anchor_bolts
door_hw
floor_2d
floor_beam
floor_block
floor_carpet
floor_code
floor_conc
floor_coverboard
floor_deck
floor_dim
floor_dim2
floor_dim3
floor_dim4
floor_eng
floor_frame
floor_gypsum
floor_hardwood
floor_hidden
floor_hw
floor_ijoist
floor_insul
floor_joist
floor_membrane
floor_mpc
floor_outline
floor_outline2
floor_rim
floor_sheath
floor_sill
floor_steeljoist
floor_tile
floor_trim
floor_underlay
floor_wrap
fnd_2d
fnd_code
fnd_conc
fnd_dim
fnd_dim2
fnd_dim3
fnd_drain
fnd_eng
fnd_framing
fnd_hidden
fnd_insul
fnd_rebar
fnd_subbase
holdowns
Layer0
roof_2d
roof_clad
roof_code
roof_dim
roof_dim2
roof_dim3
roof_eng
roof_frame
roof_hidden
roof_outline
roof_rafter
roof_sheath
roof_soffit
roof_truss
wall_2d
wall_beam
wall_block
wall_btmplate
wall_casing
wall_clad
wall_cmu
wall_code
wall_column
wall_conc
wall_dim
wall_dim2
wall_dim3
wall_dim4
wall_dim5
wall_door
wall_eng
wall_frame
wall_furring
wall_gypsum
wall_header
wall_header2
wall_hw
wall_insul
wall_king
wall_plate
wall_post
wall_sheath
wall_shutter
wall_sill
wall_symbol
wall_symbol2
wall_trim
wall_trimmer
wall_window

3 Likes

I’d like to share some information about how 5D+ helps manage and classify objects using Tags.

1. Flexible Tag Usage

5D+ does not force users to adopt a predefined Tag system. Instead, users can continue using their own Tag structures while still benefiting from the automation features provided by 5D+.

2. Tag Export / Import Capabilities

5D+ allows Tags to be exchanged between projects through two methods:

• Export/Import via Excel, including:

  • Tag names
  • Colors
  • Dash styles

• Export/Import via SketchUp files, including:

  • Tag names
  • Colors
  • Dash styles
  • Tag textures

Tag textures are especially important for maintaining consistency across template and project files. When importing, textures of Tags with the same name are overridden, helping keep projects synchronized.

3. Mapping Tags to Friendly Names and IFC Classes

5D+ Plus enables users to:

  • Map existing Tags to more user-friendly names
  • Organize Tags into categories
  • Map Tags to IFC classes for BIM workflows and data exchange.

4. Converting Old Tags to New Tags

5D+ Plus also allows users to create mapping rules to convert old Tags into new ones, making it easier to standardize data across legacy projects.

If you want to know more detaits about how to do these with 5D+, just let me know.

4 Likes

SO far I have organized the Medeek tags into the CSI Master format via Ruby from AI:

So I Don't bore you with code
# Organize Tags into CSI MasterFormat folders + separate Annotations
# SketchUp 2021+ required (Tag Folders)

require 'sketchup.rb'

module CSI_TagFolderOrganizer
  # ---- Folder names (edit if you want different wording) ----
  F_ANNOT = "00 - ANNOTATIONS (Dims/2D/Code/Eng)"
  F_03    = "03 - CONCRETE"
  F_04    = "04 - MASONRY"
  F_05    = "05 - METALS"
  F_06    = "06 - WOOD, PLASTICS & COMPOSITES"
  F_07    = "07 - THERMAL & MOISTURE PROTECTION"
  F_08    = "08 - OPENINGS"
  F_09    = "09 - FINISHES"
  F_31    = "31 - EARTHWORK"
  F_MISC  = "99 - MISC / REVIEW"

  FOLDERS = [F_ANNOT, F_03, F_04, F_05, F_06, F_07, F_08, F_09, F_31, F_MISC].freeze

  def self.ensure_folder(layers, name)
    existing = layers.folders.find { |f| f.name == name }
    existing || layers.add_folder(name)
  end

  def self.default_tag?(layers, tag)
    default = layers[0] # Untagged
    return true if default && default.valid? && tag == default
    n = tag.name.to_s
    n == "Untagged" || n == "Layer0"
  end

  # ---- Classification rules ----
  # 1) Annotations (always separate, regardless of system)
  def self.annotation_tag?(n)
    return true if n.start_with?("edge_") ||
                   n.start_with?("face_") ||
                   n.start_with?("FredoSection__")

    return true if n.end_with?("_2d") ||
                   n.include?("_dim") ||     # catches _dim, _dim2, _dim3...
                   n.end_with?("_code") ||
                   n.end_with?("_eng") ||
                   n.end_with?("_hidden") ||
                   n.include?("_outline") || # outline / outline2
                   n.include?("_symbol")     # symbol / symbol2
    false
  end

  # 2) CSI bucket
  def self.csi_bucket_for(n)
    # --- Openings (08) ---
    return F_08 if n.include?("_door") || n.include?("_window") || n.include?("_shutter")

    # --- Finishes (09) ---
    return F_09 if n.include?("_gypsum") ||
                   n.include?("_tile") ||
                   n.include?("_carpet") ||
                   n.include?("_hardwood") ||
                   n.include?("_trim") ||
                   n.include?("_casing") ||
                   n.include?("_soffit")

    # --- Thermal & Moisture Protection (07) ---
    return F_07 if n.include?("_insul") ||
                   n.include?("_membrane") ||
                   n.include?("_wrap") ||
                   n.include?("_underlay")

    # --- Masonry (04) ---
    return F_04 if n.include?("_cmu")

    # --- Concrete (03) ---
    return F_03 if n.include?("_conc") ||
                   n.include?("_slab") ||
                   n.include?("anchor_bolts") ||
                   n.include?("holdowns") ||
                   n.include?("_rebar")

    # --- Metals (05) ---
    return F_05 if n.include?("_steeljoist") ||
                   n.include?("_column") ||
                   n.include?("_beam")

    # --- Wood, Plastics & Composites (06) ---
    # (All typical framing + sheathing + rim/joist/rafter/truss/plates/headers/etc)
    return F_06 if n.include?("_frame") ||
                   n.include?("_sheath") ||
                   n.include?("_joist") ||
                   n.include?("_ijoist") ||
                   n.include?("_rim") ||
                   n.include?("_rafter") ||
                   n.include?("_truss") ||
                   n.include?("_plate") ||
                   n.include?("_btmplate") ||
                   n.include?("_header") ||
                   n.include?("_king") ||
                   n.include?("_trimmer") ||
                   n.include?("_post") ||
                   n.include?("_block") ||
                   n.include?("_sill") ||
                   n.include?("_deck") ||
                   n.include?("_coverboard")

    # --- Earthwork (31) ---
    return F_31 if n.include?("fnd_subbase") || n.include?("fnd_drain")

    # --- Hardware that isn't concrete-ish ---
    return F_05 if n == "door_hw" # (arguable, but sane default)

    # --- Catch-all ---
    F_MISC
  end

  def self.target_folder_for(tag_name)
    return nil if tag_name == "Untagged" || tag_name == "Layer0"
    return F_ANNOT if annotation_tag?(tag_name)
    csi_bucket_for(tag_name)
  end

  def self.run
    model  = Sketchup.active_model
    layers = model.layers

    unless layers.respond_to?(:add_folder)
      UI.messagebox("Tag Folders require SketchUp 2021+.")
      return false
    end

    model.start_operation("Organize Tags by CSI MasterFormat", true)

    folder_objs = {}
    FOLDERS.each { |fname| folder_objs[fname] = ensure_folder(layers, fname) }

    moved = 0
    skipped_default = 0

    layers.each do |tag|
      next unless tag.valid?
      if default_tag?(layers, tag)
        skipped_default += 1
        next
      end

      name = tag.name.to_s
      bucket = target_folder_for(name)
      next unless bucket

      target = folder_objs[bucket]
      next unless target

      if tag.folder != target
        tag.folder = target
        moved += 1
      end
    end

    model.commit_operation
    UI.messagebox("Done.\nTags moved: #{moved}\nDefault tags skipped: #{skipped_default}")
    true
  rescue => e
    model.abort_operation rescue nil
    UI.messagebox("Failed:\n#{e.class}: #{e.message}\n\n#{e.backtrace&.first}")
    false
  end
end

I am realizing that the lable features interact with the names of containers. This is not an editable variable in the Medeek’s Plugins. It can find doors and lable them, but not put any information thats useful on them.

I already have a ready-to-use solution from 5D+ Auto Tag – Tag to Folder.

With just a single click (1), the system automatically executes the predefined automation task based on the configured tag-to-folder mapping rules (2).
The mapping rules can be imported from an Excel file for easier editing, too. (3).

This workflow works in a similar way to the AI-based solution mentioned above, helping users save time and significantly reduce manual operations.

More importantly, all tag settings and mapping configurations can be synchronized across multiple computers as long as they point to the same shared settings file (4).
This allows your entire team to work with one unified system, ensuring consistency and reliability whenever standardized workflows are required.

3 Likes