Claude Media
Claude Codeで電子納品をチェック — BIMCIMフォルダの構成とパス長

Claude Codeで電子納品をチェック — BIMCIMフォルダの構成とパス長

BIM/CIMモデル等電子納品要領のBIMCIMフォルダについて、配置・大文字名・パス長・必須書類を検査するスクリプトをClaude Codeに書かせる手順です。

Claude Codeで電子納品をチェック — BIMCIMフォルダの構成とパス長

BIM/CIM活用業務や活用工事の電子納品では、通常の成果品フォルダのルート直下に「BIMCIM」フォルダを加えます。この中の置き方には、フォルダ名の綴り、書類の命名規則、パス長255バイトの上限といった機械で確かめられる規則が並んでいます。要領の規則を表にしてClaude Codeに渡せば、納品前に違反を洗い出す検査スクリプトを書かせられます。

この記事は国土交通省の「BIM/CIMモデル等電子納品要領(案)及び同解説」(令和4年3月版)を読み、BIMCIMフォルダに絞った検査を組み立てます。検査項目の抜き出し、CLAUDE.mdへの渡し方、スクリプトの全文、サンプルでの実行結果、機械では判定できない範囲までを順に扱います。

BIMCIMフォルダだけを対象にする理由

要領は、BIM/CIM活用業務の成果品なら「土木設計業務等の電子納品要領」のフォルダ構成のルート直下に、活用工事の成果品なら「工事完成図書の電子納品等要領」のルート直下に、BIMCIMフォルダを作って格納すると定めています。つまりBIMCIMフォルダは、既存の電子納品の外側に増設する一つのフォルダです。

ルート直下のXML管理ファイルやDRAWINGF、REGISTERなどの検査は、Claude Codeで電子納品のフォルダ構成をチェックする手順で扱っています。本記事の検査はその続きに置くもので、BIMCIMの内側だけを見ます。

見る場所を絞る利点は、規則が閉じていることです。BIMCIMの下の階層は要領の図2-1と表2-1〜2-11でほぼ書き尽くされており、検査項目を表にして渡しやすい。逆に、写真管理項目のような別の要領の規則とは混ざりません。写真の整理は施工写真を仕分けて写真台帳にする手順が主題で、電子納品の観点では別の工程です。

要領から機械で判定できる規則を拾う

要領の本文を読むと、判定を自動化できる規則と、人が判断する規則が混ざっています。先に仕分けておくと、Claude Codeへの依頼が曖昧になりません。

規則要領での場所機械で判定できるか
ルート直下にBIMCIMフォルダを置く要領での場所2. フォルダ構成機械で判定できるかできる
直下はDOCUMENT / BIMCIM_MODEL / INTEGRATED_MODEL / MODEL_IMAGE / REQUIREMENT要領での場所2. フォルダ構成機械で判定できるかできる
BIMCIM_MODELの下はLANDSCAPING / GEOLOGICAL / ALIGNMENT_GEOMETRY / STRUCTURAL_MODEL要領での場所2. フォルダ構成機械で判定できるかできる
フォルダ名は半角英数大文字要領での場所2. フォルダ構成機械で判定できるかできる
BIMCIM内に管理ファイルを置かない要領での場所2. フォルダ構成機械で判定できるかできる(名前で判定)
パス長は半角換算255文字以内要領での場所2. 解説、3.機械で判定できるかできる
機種依存文字を使わず、数字とラテン文字は半角要領での場所3. 解説機械で判定できるかできる
DOCUMENTの書類の命名規則要領での場所表2-1機械で判定できるかできる
構造物モデルはIFC 2x3とオリジナル要領での場所3. 表3-1機械で判定できるかファイルの有無と版は見られる
属性情報ファイルをATTRIBUTEに置き、相対パスで参照要領での場所2.2.4機械で判定できるか参照の中身は判定が難しい
格納先の振り分けが妥当か要領での場所2.2機械で判定できるかできない(協議事項)

「できない」の行を最初から区別しておくのがこの検査のコツです。スクリプトに任せる範囲は、名前・配置・長さ・有無までです。モデルの中身が正しいかどうかは、BIM/CIMモデル照査時のチェックシートを使って人が確認する領域に残ります。

フォルダごとに決まっている規則

DOCUMENTフォルダには、要領が命名規則を定めた書類が入ります。事前協議・引継書シートはPRICON.XXXで、拡張子はXLSかXLSXです。実施計画書はBIMCIMPLA00_mm.PDF、実施報告書はBIMCIMREP_mm.PDF、照査時チェックシートはCHECK.PDFの固定名です。mmは01〜99の連番にします。実施計画が変更になった場合だけ、BIMCIMPLAnn_mm.PDFの形で変更計画書を足し、nnが変更回数を表します。

これらのうち、実施計画書・実施報告書・チェックシート・引継書シートは、BIM/CIM活用業務と活用工事で納品が必須の文書として挙がっています。変更計画書は変更があったときだけなので、必須扱いにしてはいけません。検査スクリプトでも、必須と任意を分けて書く必要があります。

BIMCIM_MODELの下の規則は、モデルの種類で変わります。地形モデル・線形モデル・土工形状モデルはJ-LandXMLとオリジナルファイル、構造物モデルはIFC 2x3とオリジナルファイル、地質・土質モデルと統合モデルはオリジナルファイルだけです。ただし要領には、ソリッドモデルのようにJ-LandXMLで保存できない地形モデルは、IFCで納品するか、オリジナルだけにするかを受発注者間で協議すると書かれています。つまり「XMLがなければ即違反」とは言い切れず、検査では警告に留めるのが妥当です。

REQUIREMENTフォルダの直下に置くサブフォルダの名前は、半角英数大文字でリクワイヤメントの内容が分かる名称にします。要領の例にあるのは3D_KYOGIや4D_KEIKAKUのような名前です。名前の中身は発注内容しだいなので、機械が検査できるのは大文字・数字・アンダースコアの範囲だけです。

パス長は全角を2バイトで数える

パス長の規則は、フォルダ名とファイル名と区切り文字を合わせて半角英数字(1バイト)で255文字以内、というものです。全角文字は1文字が2バイトであることに留意するよう、要領が明記しています。ファイル名に日本語を使える代わりに、長さの数え方が変わります。

もう一つ、解説の注記に実務上の落とし穴があります。使うソフトによっては、100文字を超えるパス長のファイルが自動的に保存されることがあるため、納品前のモデル作成中から、浅い階層に置く注意が必要だというものです。ZIPで圧縮して納品する場合も、パス長255バイト以下に加えて、圧縮前のファイル数は65,536以下、圧縮前のサイズは4GB以下、圧縮後は2GB以下という制限があります。これらも数えられる値なので、検査に入れます。

スクリプトでは、255バイトを超えたら違反(NG)にします。さらに、255に近いパスを早めに拾うため、200を超えたら警告(WARN)にしました。この200は要領の規定ではなく、本記事で置いた目安です。納品直前に初めて255超えが出ると、フォルダの浅い階層への移し替えと外部参照の張り直しが必要になり、直すコストが跳ね上がります。

機種依存文字と全角英数の扱い

BIMCIM内のファイル名には日本語を含む全角文字を使えます。管理ファイルを置かない間は、ファイル名を見るだけで何を表すか分かる必要があるためです。そのうえで、丸囲い数字(①など)、ローマ数字、単位記号(㎜、㎡など)、囲み文字(㈱など)、№、半角カタカナ、数学記号といった機種依存文字は使わず、数字とラテン文字は全角と半角を混在させず半角に統一する、と定められています。

規則は、機種依存文字の一覧と、使える文字による代替例の表で示されています。丸囲い数字なら半角括弧と半角数字の(1)に、㈱なら全角の(株)に置き換えます。検査では、Unicodeの範囲で該当文字を拾えば足ります。後述のスクリプトは、丸囲い文字・ローマ数字・単位記号と囲み文字のブロック・№・℡・半角カタカナ・全角の英数字を一括で検出します。要領の一覧のうち、数学記号は代表的なものだけを個別に並べています。一覧のすべての文字を網羅した保証はないので、取りこぼしが気になる場合は要領の表をそのままClaude Codeに読ませて拡張させてください。

要領本文の綴りの揺れ

規則を表にするときに引っかかる点が一つあります。要領の本文はBIMCIM_MODELの下の構造物用フォルダを「STRUCURAL_MODEL」(Tが一つ足りない綴り)と書く箇所があり、図2-1や表2-6〜は「STRUCTURAL_MODEL」と書いています。同じPDFの中で綴りが食い違っているわけです。

検査を作るときは、正しい綴りを図と表の側(STRUCTURAL_MODEL)に固定するのが現実的です。その代わり、STRUCURAL_MODELというフォルダが見つかったら、規定外のフォルダとして出すだけでなく「綴り違いの可能性」と添えます。本文の綴りに従って作ったフォルダを、受注者が違反と誤解しないためです。どちらを採用するかは発注者の確認事項なので、CLAUDE.mdには「綴りが割れる箇所は要確認として出す」という扱いも書いておきます。

規則をCLAUDE.mdに渡す

Claude Codeに「BIMCIMフォルダを検査して」とだけ依頼すると、一般的なフォルダ構成の検査を書いてしまいます。要領の規則は、先にCLAUDE.mdへ置きます。CLAUDE.mdはセッションの開始時に毎回読み込まれる、プロジェクト直下のMarkdownファイルです。

# BIMCIM検査のルール
- 適用要領: BIM/CIMモデル等電子納品要領(案)及び同解説 令和4年3月版
- 検査対象は媒体ルート。ルート直下の BIMCIM フォルダだけを見る
- 検査スクリプトは check_bimcim.py(標準ライブラリのみ)
- DOCUMENT の命名: PRICON.XXX / BIMCIMPLA00_mm.PDF / BIMCIMREP_mm.PDF / CHECK.PDF
  変更計画書 BIMCIMPLAnn_mm.PDF は任意
- パス長は全角を2バイトで数え、255 超を NG、200 超を WARN とする
- J-LandXML の有無・IFC 2x3 の版は協議で変わるので WARN にとどめる
- 要領にない規則を推測で足さない。綴りが割れる箇所は要確認として出す
- 納品フォルダの中身をスクリプトから書き換えない

最後の2行が効きます。1行目は、他案件の慣習をチェック項目に混ぜるのを抑えます。2行目は、検査スクリプトが納品物を直す副作用を持たないようにします。検査対象のフォルダに書き込む操作は、そもそも許可しない運用にもできます。

検査スクリプトを書かせる

依頼文は、判定の重さ(NGかWARNか)まで指定します。

CLAUDE.md のルールに沿って、媒体ルートを受け取り BIMCIM フォルダを検査する
check_bimcim.py を標準ライブラリだけで書いてください。
- BIMCIM が無い、DOCUMENT の必須書類が無い、命名規則違反は NG
- 管理ファイル(INDEX_C.XML など)が BIMCIM 内にあれば NG
- フォルダ名の大文字違反、機種依存文字、パス長 255 超は NG、200 超は WARN
- 規定外フォルダ、IFC の有無・版、J-LandXML の有無は WARN
- NG が 1 件でもあれば終了コード 1

Claude Codeが返すスクリプトの形は毎回変わります。下は、この依頼に対する一例です。後述のサンプルフォルダに対して実行し、出力を確かめたものです。

#!/usr/bin/env python3
"""BIMCIMフォルダの検査。使い方: python3 check_bimcim.py <媒体ルート>"""
import re, sys
from pathlib import Path
 
TOP = {"DOCUMENT", "BIMCIM_MODEL", "INTEGRATED_MODEL", "MODEL_IMAGE", "REQUIREMENT"}
MODEL = {"LANDSCAPING", "GEOLOGICAL", "ALIGNMENT_GEOMETRY", "STRUCTURAL_MODEL"}
UPPER = re.compile(r"^[0-9A-Z_]+$")
DOC_RULES = {  # DOCUMENT 直下の命名規則(必須かどうか, 正規表現)
    "CHECK.PDF": (True, re.compile(r"^CHECK\.PDF$")),
    "BIMCIMPLA00_mm.PDF": (True, re.compile(r"^BIMCIMPLA00_\d{2}\.PDF$")),
    "BIMCIMREP_mm.PDF": (True, re.compile(r"^BIMCIMREP_\d{2}\.PDF$")),
    "PRICON.XXX": (True, re.compile(r"^PRICON\.[0-9A-Z]{1,4}$")),
    "BIMCIMPLAnn_mm.PDF": (False, re.compile(r"^BIMCIMPLA\d{2}_\d{2}\.PDF$")),
}
BAD_CHARS = re.compile(
    "[①-⑳Ⅰ-ⅻ㈀-㏿№℡。-゚"
    "0-9A-Za-z≒≡∫§Σ√⊥∠∟⊿∵∩∪]")
MGMT = re.compile(r"^(INDEX_[CD]\.XML|INDE_[CD]\d+\.DTD)$")
 
def blen(s):  # 半角=1, 全角=2 として数える
    return sum(1 if ord(c) < 128 else 2 for c in s)
 
def check(root: Path):
    out = []
    ng = lambda p, m: out.append(f"NG   {p}: {m}")
    warn = lambda p, m: out.append(f"WARN {p}: {m}")
    bim = root / "BIMCIM"
    if not bim.is_dir():
        ng("BIMCIM", "ルート直下にありません")
        return out
    files = [p for p in bim.rglob("*") if p.is_file()]
    for p in sorted(bim.rglob("*")):
        rel = p.relative_to(root).as_posix()
        if blen(rel) > 255:
            ng(rel, f"パス長 {blen(rel)} > 255")
        elif blen(rel) > 200:
            warn(rel, f"パス長 {blen(rel)}(255 まで余裕が少ない)")
        if BAD_CHARS.search(p.name):
            ng(rel, "機種依存文字・全角英数・半角カナを含む")
        if p.is_dir() and not UPPER.match(p.name):
            ng(rel, "フォルダ名が半角英数大文字ではない")
        if p.is_file() and MGMT.match(p.name):
            ng(rel, "BIMCIM 内に管理ファイルは置かない")
    for d in sorted(c for c in bim.iterdir() if c.is_dir()):
        if d.name not in TOP:
            warn(f"BIMCIM/{d.name}", "規定外のフォルダ(追加は協議が前提)")
    for name in ("DOCUMENT", "BIMCIM_MODEL"):
        if not (bim / name).is_dir():
            ng(f"BIMCIM/{name}", "フォルダがありません")
    doc = bim / "DOCUMENT"
    if doc.is_dir():
        names = [f.name for f in doc.iterdir() if f.is_file()]
        for label, (required, rx) in DOC_RULES.items():
            if required and not any(rx.match(n) for n in names):
                ng(f"BIMCIM/DOCUMENT/{label}", "必須の書類が見つかりません")
        for n in names:
            if n.upper() != n and any(rx.match(n.upper()) for _, rx in DOC_RULES.values()):
                ng(f"BIMCIM/DOCUMENT/{n}", "命名規則は大文字固定")
    model = bim / "BIMCIM_MODEL"
    if model.is_dir():
        for d in sorted(c for c in model.iterdir() if c.is_dir()):
            if d.name not in MODEL:
                hint = " (STRUCTURAL_MODEL の綴り違い?)" if d.name.startswith("STRUC") else ""
                warn(f"BIMCIM/BIMCIM_MODEL/{d.name}", "規定外のフォルダ" + hint)
        struct = model / "STRUCTURAL_MODEL"
        ifcs = list(struct.rglob("*.IFC")) + list(struct.rglob("*.ifc")) if struct.is_dir() else []
        if struct.is_dir() and not ifcs:
            warn("BIMCIM/BIMCIM_MODEL/STRUCTURAL_MODEL", "IFC ファイルがありません")
        for f in ifcs:
            head = f.read_bytes()[:4096].decode("ascii", "ignore").upper()
            if "IFC2X3" not in head:
                warn(f.relative_to(root).as_posix(), "FILE_SCHEMA が IFC2X3 ではありません")
        for name in ("LANDSCAPING", "ALIGNMENT_GEOMETRY"):
            d = model / name
            if d.is_dir() and not list(d.rglob("*.xml")) + list(d.rglob("*.XML")):
                warn(f"BIMCIM/BIMCIM_MODEL/{name}", "J-LandXML(XML)がありません。協議で例外にしたなら記録を確認")
    if len(files) > 65536:
        warn("BIMCIM", f"ファイル数 {len(files)} > 65,536(ZIP にする場合の上限)")
    if sum(f.stat().st_size for f in files) > 4 * 1024**3:
        warn("BIMCIM", "合計 4GB 超(ZIP にする場合は圧縮前の上限)")
    return out
 
if __name__ == "__main__":
    res = check(Path(sys.argv[1]))
    print("\n".join(res) if res else "指摘なし")
    sys.exit(1 if any(r.startswith("NG") for r in res) else 0)

BIMCIM_MODELの各フォルダで見ているのは、種類ごとの形式の有無です。IFCはテキスト形式のSTEPファイルで、先頭付近のFILE_SCHEMAにスキーマ名が書かれます。スクリプトはこの行からIFC2X3かどうかを判定します。ファイルの中身を読む検査はこれだけにしました。それ以上の中身(属性情報の正しさ、モデルの形状)は、人の照査に残します。

サンプルのフォルダで動かす

本物の納品物を使わず、わざと違反を詰めたフォルダで確かめます。空のファイルで足りるものは空のまま作り、IFCだけは中身にFILE_SCHEMA(('IFC4'))の行を書いています。

python3 check_bimcim.py sample

実行結果は次のとおりです(長いパスは省略して表示しています)。

NG   BIMCIM/BIMCIM_MODEL/LANDSCAPING/地形モデル①.XML: 機種依存文字・全角英数・半角カナを含む
NG   BIMCIM/INDEX_C.XML: BIMCIM 内に管理ファイルは置かない
WARN BIMCIM/INTEGRATED_MODEL/A…/B…/C….DAT: パス長 210(255 まで余裕が少ない)
NG   BIMCIM/model_image: フォルダ名が半角英数大文字ではない
WARN BIMCIM/model_image: 規定外のフォルダ(追加は協議が前提)
NG   BIMCIM/DOCUMENT/BIMCIMREP_mm.PDF: 必須の書類が見つかりません
NG   BIMCIM/DOCUMENT/bimcimrep_01.pdf: 命名規則は大文字固定
WARN BIMCIM/BIMCIM_MODEL/STRUCURAL_MODEL: 規定外のフォルダ (STRUCTURAL_MODEL の綴り違い?)
WARN BIMCIM/BIMCIM_MODEL/STRUCTURAL_MODEL/BRIDGE/BRIDGE.IFC: FILE_SCHEMA が IFC2X3 ではありません

終了コードは1です。BIMCIMフォルダそのものが無い空のフォルダに実行すると、NG BIMCIM: ルート直下にありませんだけが出ます。

読み方で押さえたいのは、同じ原因から2つの指摘が出ることです。小文字で作ったbimcimrep_01.pdfは、「命名規則は大文字固定」と「必須の書類が見つかりません」の両方に引っかかります。大文字にリネームすれば二つとも消えます。一つずつ直さず、元の原因を見てからまとめて直してください。

指摘をどう直させるか

NGが出たら、Claude Codeに直させる範囲を分けます。フォルダ名や書類名のリネームは機械的に直せますが、納品物を勝手に動かさせるのは避けます。直す対象は検査の出力から作る「リネーム案」に留め、実際の変更は人が確認してから行う運用が無難です。

上の NG と WARN について、リネーム案だけを表で出してください。
ファイルは移動・削除せず、外部参照のリンク切れが起きそうなものには印を付けてください。

リンク切れの印が要る理由は、要領が外部参照の相対パスを原則としているためです。構造物モデルが、同じ階層のATTRIBUTEフォルダにある属性情報ファイルや、DRAWINGFなど別の成果品フォルダのファイルを相対パスで参照します。モデルファイル側に参照先が書かれているので、ファイル名やフォルダ名を変えると、リンクが切れる可能性があります。要領も、成果品の構成が再現できないと外部参照のリンクが切れ、後工程での利活用が難しくなると注意しています。リネームしたら、そのモデルを作成ソフトで開き直して参照が通るか見る工程を、必ず挟んでください。

この検査では判定できないこと

スクリプトが保証しない範囲もあります。NGが0件でも、納品の適合は保証されません。

  • 格納先の妥当性: ソフトの制限で地形モデルと土工形状モデルを分けられないとき、どのフォルダにまとめるかは受発注者間協議で決まり、その旨を引継書シートに書く決まりです。スクリプトは協議の記録を読めません
  • モデルの中身: 基準点オブジェクトの有無、座標系(世界測地系、平面直角座標系、T.P.)、IFCの属性は見ていません
  • 外部参照の通り: モデルが相対パスで参照するファイルが実在するかは、モデルを作成したソフトで開かないと分かりません
  • 要領の版: 本記事は令和4年3月版を読んで作った規則です。契約が別の版に基づく場合は、版ごとにフォルダ名や書類名の規則を確かめ直します。要領の改定は国土交通省のページで確認します

Claude Codeに作らせる検査は、納品直前に人が見るチェックシートの前段で、機械的な見落としを減らすためのものです。電子納品のBIMCIMフォルダに限らず、日本語のファイル名を扱う作業では、文字コードの違いでパスが壊れる問題も起きます。Windowsのバッチファイルが関わる例はClaude Codeが作る.cmdとCP932に、VS Codeでリンクが開かない例は日本語・スペースのパスにまとめています。

まとめ

BIMCIMフォルダの検査は、要領の図と表から「名前・配置・長さ・有無」の規則だけを拾い、判断が要る規則は警告に回すのが基本です。次の3点を決めておくと、Claude Codeが書くスクリプトが安定します。

  1. 必須書類と任意書類(変更計画書)を分ける
  2. 全角は2バイトで数え、255はNG、手前の目安はWARNにする
  3. 要領本文の綴りの揺れ(STRUCURAL_MODEL)は要確認として扱う

スクリプトは標準ライブラリだけの一本で、CLAUDE.mdの規則を直せば別の版にも載せ替えられます。ただしNG 0件は適合の証明ではなく、モデルの照査と発注者との協議は人の作業として残ります。

参照した一次ソース

この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。

  1. mlit.go.jp/tec/content/001472866.pdf
  2. code.claude.com/docs/en/overview
この記事を共有:XはてブLinkedIn