Smino.Bcf.Toolkit 2.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Smino.Bcf.Toolkit --version 2.1.0                
NuGet\Install-Package Smino.Bcf.Toolkit -Version 2.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Smino.Bcf.Toolkit" Version="2.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Smino.Bcf.Toolkit --version 2.1.0                
#r "nuget: Smino.Bcf.Toolkit, 2.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Smino.Bcf.Toolkit as a Cake Addin
#addin nuget:?package=Smino.Bcf.Toolkit&version=2.1.0

// Install Smino.Bcf.Toolkit as a Cake Tool
#tool nuget:?package=Smino.Bcf.Toolkit&version=2.1.0                

This C# NuGet library allows you to easily build up and convert data into BCF files. It gives you a straightforward API to build your BCF objects exactly how you want in your order.

Installation

You can install the BcfToolkit library via NuGet Package Manager or by adding it to your project's .csproj file.

nuget install Smino.Bcf.Toolkit

Usage

Creating BCF objects

To create a BCF Model, BcfBuilder class can be used. Then, various functions provided by the builder can be used to fulfill the BCF model objects.

Here are some examples:

using BcfToolkit.Builder.Bcf30;

var builder = new BcfBuilder();
var bcf = builder
  .AddMarkup(m => m
    .SetTitle("Simple title")
    .SetDescription("This is a description")
    .AddLabel("Architecture")
    .SetPriority("Critical")
    .SetTopicType("Clash")
    .SetTopicStatus("Active")
    .AddComment(c => c
      .SetComment("This is a comment")
      .SetDate(DateTime.Now)
      .SetAuthor("jimmy@page.com"))
    .AddViewPoint(v => v
        .SetPerspectiveCamera(pCam => pCam
          .SetCamera(cam => cam
            .SetViewPoint(10, 10, 10))),
      snapshotData)) // Provide a snapshot data here
  .SetExtensions(e => e
    .AddPriority("Critical")
    .AddPriority("Major")
    .AddPriority("Normal")
    .AddPriority("Minor")
    .AddTopicType("Issue")
    .AddTopicType("Fault")
    .AddTopicType("Clash")
    .AddTopicType("Remark")
    .AddTopicLabel("Architecture")
    .AddTopicLabel("Structure")
    .AddTopicLabel("MEP"))
  .SetProject(p => p
    .SetProjectId("projectId")
    .SetProjectName("My project"))
  .SetDocumentInfo(dI => dI
    .AddDocument(d => d
      .SetFileName("document.pdf")
      .SetDescription("This is a document")))
  .Build();

The BcfBuilder class can also consume BCF files as a stream and build up the model objects.

using BcfToolkit.Builder.Bcf30;

await using var stream = new FileStream(source, FileMode.Open, FileAccess.Read);
var builder = new BcfBuilder();
var bcf = await builder
  .BuildFromStream(stream);

The default builders can be used if the user prefers not to deal with filling the required fields. The builder.WithDefaults() function serves this. However in certain cases the user may need to replace the component IDs of IFC objects with the actual GUIDs during the build process.

using BcfToolkit.Builder.Bcf30;

var builder = new BcfBuilder();
var bcf = builder
  .WithDefaults()
  .Build();

Using BCF worker

The worker is implemented to use predefined workflows to convert BCF files into json and back. The function decides which workflow must be used according to the source and target. If the source ends with .bcfzip the converter uses the BcfZipToJson for example.

using BcfToolkit;

var worker = new Worker();
await worker.Convert(source, target);

The exact converter can be called directly as well for both converting directions, BCF into json and back.

using BcfToolkit.Converter.Bcf30;

var converter = new Converter()
converter.BcfZipToJson(source, target);
using BcfToolkit.Converter.Bcf30;

var converter = new Converter()
converter.JsonToBcfZip(source, target);

Furthermore BCF archive can be consumed as a stream. The version of the source is established by the code, then the class lets the nested converter object to do the conversion to BCF 3.0 accordingly.

using BcfToolkit;

await using var stream = new FileStream(source, FileMode.Open, FileAccess.Read);

var worker = new Worker();
var bcf = await worker.BuildBcfFromStream(stream);

The worker can return a file stream from the specified instance of the bcf object. The function converts the bcf to the target version. Disposing the stream after the usage is the responsibility of the caller.

using BcfToolkit;

var worker = new Worker();
var stream = await worker.ToBcfStream(bcf, BcfVersionEnum.Bcf30);
// custom code to use the stream...
await stream.FlushAsync();

File Structure

The structure of the BCF is per the standard. There is, however, no standard for the JSON format other than the BCF API specification.

The naming convention for this converter is taken from the BCF API, but the output is opinionated:

There is one JSON for every Markup and within the structure of the information follows that of the XML. There are no separate files for screenshots, they are base64 encoded in the field snapshot_data of the Viewpoint. The files are named using the uuid of the Topic within.

|- json
  |- 2ea98d1e-77ae-467f-bbc9-1aed1c1785f6.json
  |- 3395f1b1-893f-4ca0-8b7d-c2d17d7a9198.json
  |- c799e527-a413-43f8-8871-80918a52b0f0.json
  |- ...
  |- project.json
  |- extensions.json
  |- documents.json
  |- version.json

Development

The development of the tool is ongoing, the table below shows the currently completed features.

BCF 2.0 BCF 2.1 BCF 3.0 JSON 2.0 JSON 2.1 JSON 3.0
BCF 2.0
BCF 2.1 X
BCF 3.0 X
JSON 2.0
JSON 2.1 X
JSON 3.0 X

The models for the BCF in-memory representation were auto-created from the latest XSDs using the XmlSchemaClassGenerator.

~ dotnet tool install --global dotnet-xscgen
~ xscgen -n [namespace] version.xsd

To publish, run the script at dist/publish.sh.

TODO

  • profile memory and CPU usage

Contribution

Code style guide can be found in the bcf-toolkit.sln.DotSettings file.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.1.3 1,106 7/31/2024
3.1.2 57 7/30/2024
3.1.1 67 7/26/2024
3.1.0 87 7/26/2024
3.0.1 143 7/22/2024
3.0.0 56 7/19/2024
2.3.1 146 7/12/2024
2.3.0 55 7/4/2024
2.2.4 75 7/2/2024
2.2.3 59 6/28/2024
2.2.2 57 6/27/2024
2.2.1 54 6/26/2024
2.2.0 49 6/25/2024
2.1.4 58 6/13/2024
2.1.3 66 6/5/2024
2.1.2 53 6/4/2024
2.1.1 58 6/3/2024
2.1.0 77 5/22/2024
2.0.0 68 5/8/2024
1.0.0 87 1/29/2024
0.0.1 148 10/13/2023