Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
openaec-foundation avatar

Thatopen Impl Bcf

  • 5 installs
  • 17 repo stars
  • Updated July 8, 2026
  • openaec-foundation/thatopen-claude-skill-package

Helps with ai & agent building tasks.

About

thatopen-impl-bcf is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.

  • thatopen-impl-bcf
  • AI & Agent Building
  • AI-coding skill

Thatopen Impl Bcf by the numbers

  • 5 all-time installs (skills.sh)
  • Ranked #13,065 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
  • Data as of Jul 26, 2026 (Skillselion catalog sync)
npx skills add https://github.com/openaec-foundation/thatopen-claude-skill-package --skill thatopen-impl-bcf

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs5
repo stars17
Last updatedJuly 8, 2026
Repositoryopenaec-foundation/thatopen-claude-skill-package

What it does

Helps with ai & agent building tasks.

Files

SKILL.mdMarkdownGitHub ↗

ThatOpen BCF & Viewpoints

Overview

This skill covers BIM Collaboration Format (BCF) support in @thatopen/components: the BCFTopics component for issue tracking and the Viewpoints component for 3D scene state capture. BCF enables structured communication about BIM model issues between different tools.

Version: @thatopen/components 3.3.x Prerequisites: thatopen-impl-viewer (world setup), thatopen-core-architecture Dependencies: jszip (BCF zip), fast-xml-parser (BCF XML)

Component Overview

ComponentPackageUUIDPurpose
BCFTopics@thatopen/componentsde977976-e4f6-4e4f-a01a-204727839802Issue tracking, BCF import/export
Viewpoints@thatopen/componentsee867824-a796-408d-8aa0-4e5962a83c663D camera state capture, snapshots
IDSSpecifications@thatopen/componentsIDS validation (separate module)

BCFTopics

Setup

ALWAYS call setup() with configuration before creating or importing topics:

import * as OBC from "@thatopen/components";

const bcfTopics = components.get(OBC.BCFTopics);
bcfTopics.setup({
  version: "3",
  author: "user@example.com",
  types: new Set(["Issue", "Request", "Comment"]),
  statuses: new Set(["Active", "Resolved", "Closed"]),
  priorities: new Set(["Critical", "Major", "Normal", "Minor"]),
  labels: new Set(["Architecture", "Structure", "MEP"]),
  stages: new Set(["Design", "Construction", "Handover"]),
  users: new Set(["user@example.com", "reviewer@example.com"]),
});

BCFTopicsConfig

PropertyTypeDefaultDescription
version`"2.1" \"3"`""
authorstring""User email for topic/comment creation
typesSet<string>emptyAllowed topic types
statusesSet<string>emptyAllowed topic statuses
prioritiesSet<string>emptyAllowed topic priorities
labelsSet<string>emptyAllowed topic labels
stagesSet<string>emptyAllowed topic stages
usersSet<string>emptyAllowed user emails
strictbooleanfalseEnforce extensions validation
includeSelectionTagbooleanfalseInclude AuthoringSoftwareId in viewpoints
updateExtensionsOnImportbooleanfalseAuto-update extensions after import
includeAllExtensionsOnExportbooleanfalseExport all found extensions
fallbackVersionOnImport`BCFVersion \null`null
ignoreIncompleteTopicsOnImportbooleanfalseSkip topics missing required fields
exportCustomDataAsLabelsbooleanfalseExport customData as labels

Strict Mode

When strict: true, all Topic property setters validate against the configured extensions. Setting topic.type = "Unknown" throws if "Unknown" is not in config.types. When strict: false (default), any value is accepted.

Properties

PropertyTypeDescription
listDataMap<string, Topic>All topics indexed by GUID
documentsDataMap<string, DocumentReference>Internal/external document references
enabledbooleanComponent enabled state
isSetupbooleanWhether setup() has been called

Events

EventPayloadTrigger
onSetupAfter setup() completes
onBCFImportedTopic[]After load() imports topics
onDisposedAfter dispose()

Methods

MethodReturnsDescription
setup(config?)voidInitialize with configuration
create(data?)TopicCreate a new topic
load(data)Promise<{viewpoints, topics}>Import BCF zip data
export(topics?)Promise<Blob>Export topics to BCF zip
updateExtensions()voidSync config sets with current topics
updateViewpointReferences()voidRemove stale viewpoint references
dispose()voidClean up all resources

Computed Getters

GetterReturnsDescription
usedTypesSet<string>All types currently in use
usedStatusesSet<string>All statuses currently in use
usedPrioritiesSet<string>All priorities currently in use
usedStagesSet<string>All stages currently in use
usedUsersSet<string>All users from authors and comments
usedLabelsSet<string>All labels across topics

Topic

Properties

PropertyTypeDefaultDescription
guidstringauto-generatedUnique identifier
titlestring"BCF Topic"Topic title
typestring"Issue"Topic type (validated in strict mode)
statusstring"Active"Topic status (validated in strict mode)
prioritystring?Priority (validated in strict mode)
stagestring?Project stage (validated in strict mode)
assignedTostring?Assigned user email
descriptionstring?Topic description
labelsSet<string>emptyTopic labels/tags
dueDateDate?Due date
indexnumber?Display ordering index
creationDateDateauto-setCreation timestamp
creationAuthorstringfrom configAuthor email
modifiedDateDate?Last modification timestamp
modifiedAuthorstring?Last modifier email
customDataRecord<string, any>{}Arbitrary metadata

Topic References (stored as GUIDs)

PropertyTypeDescription
viewpointsDataSet<string>Associated viewpoint GUIDs
relatedTopicsDataSet<string>Related topic GUIDs (no self-reference)
commentsDataMap<string, Comment>Comments on this topic
documentReferencesDataSet<string>Document reference GUIDs

Topic Methods

MethodReturnsDescription
set(data)TopicBulk update properties (skips GUID)
createComment(text, viewpoint?)CommentCreate a comment on this topic
toJSON()BCFApiTopicSerialize to API format
serialize()stringGenerate BCF XML markup

set() vs Direct Assignment

Direct property assignment updates internally without triggering events. Use set() to broadcast changes for reactive UI updates:

// Silent update — no events fired
topic.title = "Updated Title";

// Reactive update — listeners notified
topic.set({ title: "Updated Title", status: "Resolved" });

Comment

PropertyTypeDescription
guidstringUnique identifier
dateDateCreation timestamp
authorstringFrom config at creation time
commentstringText (setter updates modifiedDate/modifiedAuthor)
viewpointstring?Associated viewpoint GUID
modifiedDateDate?Auto-set on comment text change
modifiedAuthorstring?Auto-set from config on change

Document References

Two types of document references stored in bcfTopics.documents:

// Internal (embedded in BCF zip)
{ type: "internal", fileName: "report.pdf", data: Uint8Array, description?: string }

// External (URL reference)
{ type: "external", url: "https://...", description?: string }

Viewpoints

Setup

const viewpoints = components.get(OBC.Viewpoints);
viewpoints.world = world; // REQUIRED — default world for viewpoint creation

Properties

PropertyTypeDescription
listDataMap<string, Viewpoint>All viewpoints indexed by GUID
snapshotsDataMap<string, Uint8Array>Binary snapshot data
world`World \null`
enabledbooleanDefaults to true

Methods

MethodReturnsDescription
create(data?)ViewpointCreate a viewpoint (optionally from BCFViewpoint data)
getSnapshotExtension(name)stringDetect snapshot format from header bytes
dispose()voidClean up resources

Viewpoint Instance

Each Viewpoint captures a complete 3D scene state:

PropertyTypeDescription
guidstringUnique identifier
titlestring?Viewpoint name
cameracamera dataPerspective or orthogonal camera settings
defaultVisibilitybooleanBase visibility state
selectionComponentsDataSet<string>Component GUIDs to highlight
exceptionComponentsDataSet<string>Visibility override GUIDs
componentColorsDataMap<string, string[]>Hex color to GUID array
clippingPlanesDataSet<string>Enabled clipping plane IDs
spacesVisiblebooleanShow IfcSpace elements
spaceBoundariesVisiblebooleanShow space boundaries
openingsVisiblebooleanShow IfcOpeningElement
snapshotstring?Snapshot reference ID
customDataRecord<string, any>Arbitrary metadata

Viewpoint Methods

MethodReturnsDescription
updateCamera(takeSnapshot?)voidSync from current world camera
go(config?)Promise<void>Apply viewpoint to world
takeSnapshot()voidCapture canvas to snapshots map
applyVisibility()voidEnforce visibility/exceptions
setColorizationState(state)voidApply/reset component colors
updateClippingPlanes()voidSync from Clipper component
toJSON()BCFViewpointSerialize to BCF data
serialize(version)stringGenerate BCF XML (v2.1 or v3.0)

BCF Version Differences

FeatureBCF 2.1BCF 3.0
XML schemabcf/2.1 namespacebcf/3.0 namespace
Viewpoint references<Viewpoints> element<Viewpoints> element
Document referencesIn markup XMLIn markup XML
Labels<Labels> element<Labels> element
Related topics<RelatedTopics><RelatedTopics>
Extensions filebcf.extensionsbcf.extensions
Config version value"2.1""3"

ALWAYS set config.version before exporting. The serialization format of viewpoints and markup XML differs between versions.

BCF Import/Export Workflow

Export

// Export all topics
const blob = await bcfTopics.export();

// Export specific topics
const selectedTopics = [...bcfTopics.list.values()].filter(t => t.status === "Active");
const blob = await bcfTopics.export(selectedTopics);

// Download in browser
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = "issues.bcf";
link.click();
URL.revokeObjectURL(url);

Import

// From file input
const input = document.createElement("input");
input.type = "file";
input.accept = ".bcf,.bcfzip";
input.addEventListener("change", async () => {
  const file = input.files?.[0];
  if (!file) return;
  const data = new Uint8Array(await file.arrayBuffer());
  const { topics, viewpoints } = await bcfTopics.load(data);
  console.log(`Imported ${topics.length} topics, ${viewpoints.length} viewpoints`);
});
input.click();

Linking Viewpoints to Topics

ALWAYS link viewpoints to topics using GUIDs, not object references:

const viewpoint = viewpoints.create();
viewpoint.title = "Clash at Level 2";
await viewpoint.updateCamera();
viewpoint.takeSnapshot();

const topic = bcfTopics.create({
  title: "Steel beam clashes with duct",
  type: "Issue",
  priority: "Critical",
});
topic.viewpoints.add(viewpoint.guid);

Auto-linking on Creation

viewpoints.list.onItemSet.add(({ value: vp }) => {
  const topic = bcfTopics.create();
  topic.viewpoints.add(vp.guid);
});

IDSSpecifications Overview

The IDSSpecifications component in @thatopen/components provides Information Delivery Specification (IDS) validation. IDS is a buildingSMART standard for specifying information requirements on BIM models.

This component is exported from the openbim module alongside BCFTopics. For detailed IDS usage, refer to the ThatOpen documentation.

Complete Setup Pattern

import * as OBC from "@thatopen/components";

// 1. Get components
const bcfTopics = components.get(OBC.BCFTopics);
const viewpoints = components.get(OBC.Viewpoints);

// 2. Configure BCFTopics (REQUIRED before create/load/export)
bcfTopics.setup({
  version: "3",
  author: "user@example.com",
  types: new Set(["Issue", "Request", "Comment"]),
  statuses: new Set(["Active", "Resolved", "Closed"]),
  priorities: new Set(["Critical", "Major", "Normal", "Minor"]),
  labels: new Set(["Architecture", "Structure", "MEP"]),
  stages: new Set(["Design", "Construction"]),
  users: new Set(["user@example.com"]),
  strict: false,
});

// 3. Set viewpoints world (REQUIRED before creating viewpoints)
viewpoints.world = world;

// 4. Create topic with viewpoint
const viewpoint = viewpoints.create();
await viewpoint.updateCamera();
viewpoint.takeSnapshot();

const topic = bcfTopics.create({
  title: "Coordination issue at grid A-3",
  type: "Issue",
  priority: "Major",
  assignedTo: "user@example.com",
  description: "Steel column interferes with HVAC duct routing",
});
topic.viewpoints.add(viewpoint.guid);
topic.createComment("Please review and propose resolution");

Critical Rules

1. ALWAYS call bcfTopics.setup() before creating, loading, or exporting topics. Without setup, the author field is empty and extensions are not configured. 2. ALWAYS set viewpoints.world before creating viewpoints. Camera capture and snapshot require a valid world reference. 3. ALWAYS set config.version to "2.1" or "3" before exporting. An empty version string produces invalid BCF output. 4. ALWAYS link viewpoints to topics via topic.viewpoints.add(guid), not by storing object references. GUIDs prevent memory leaks. 5. ALWAYS call updateCamera() after creating a viewpoint to capture the current camera state. New viewpoints have no camera data by default. 6. NEVER skip setup() and rely on defaults. All config sets start empty, meaning strict mode would reject every value. 7. NEVER assume imported BCF files specify a version. Use fallbackVersionOnImport to handle version-less files. 8. NEVER mix BCF version strings: use "2.1" or "3" (not "3.0"). 9. NEVER store Topic or Viewpoint object references in external data structures. Use GUIDs from topic.guid / viewpoint.guid and look up via bcfTopics.list.get(guid) / viewpoints.list.get(guid). 10. NEVER forget to call dispose() or components.dispose() on cleanup. BCFTopics and Viewpoints hold DataMaps that must be freed.

Reference Files

  • references/methods.md — BCFTopics, Viewpoints,

Topic, Comment full API reference

  • references/examples.md — Create topic, import/

export BCF, viewpoints integration examples

  • references/anti-patterns.md — Wrong BCF

version, missing config, memory leaks

Source Verification

All API signatures verified against:

  • GitHub: ThatOpen/engine_components main branch

(packages/core/src/openbim/BCFTopics/, packages/core/src/core/Viewpoints/)

  • npm: @thatopen/components@3.3.3
  • Research: docs/research/vooronderzoek-thatopen.md (Section 7)

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.