【Revit事例解説】鋼箱桁自動作成その2-基準線ファミリの作成と配置-

取り組み事例解説の第2回目です。

鋼箱桁の自動作成では、モデルの位置やパラメータ値を3本の基準線より取得します。今回解説するのは、この基準線ファミリの作成方法と配置方法です。なお、Revitバージョンは2024です。

取り組み事例の内容は、こちらをご覧ください。

目次

概要

道路・鉄道の設計では、中心線は線形計算用ソフトで作成していると思います。もし、そのソフトで線形の3Dモデルをdwg形式で作成可能であれば、Revitへはそのまま取り込めば良いです。

今回は、dwgデータがないため、座標値から基準線ファミリを作成しこれをRevitに配置します。

作成する基準線は、基準線_CL、基準線_G1、基準線_G2の3本です。

この基準線をどのように活用するかは、こちらをご覧ください。

基準線作成のソースコードとグラフ

まずはソースコードやグラフをすべて記載しておきます。なお、SBO式の開発環境を前提としています。

Dynamo+Pycham+Pythonという少し変わった環境で開発をしています。詳細はこちらをご覧ください。

全体構成

実行ファイル名は、create_center_crv_family.pyです。

relibパッケージ内にexcel.py, family.py, revit.pyを作成します。

Dynamoグラフ

ノード名が確認できるようにDynamoプレーヤ用の処理は行っていません。

create_center_crv_family.py

Dynamoで読み込む実行用ファイルです。

Pycharmプロジェクトの構成

ソースコード

import sys
sys.path.append(r"E:\BIM\PyProjects\relib\src")

from relib_sbo.cmn import excel
from relib_sbo.cmn import family

import importlib
importlib.reload(excel)
importlib.reload(family)

excel_path = IN[0]
template_path = IN[1]
directory_path = IN[2]
file_name = IN[3]

# エクセルから情報取得
df = excel.get_df_multi_idx(excel_path, "ベース")

# 線形ファミリを作成し、保存
family.create_center_line_family(
    template_path, directory_path, file_name+"_CL", df.loc["CL"]
)
family.create_center_line_family(
    template_path, directory_path, file_name+"_G1", df.loc["G1"]
)
family.create_center_line_family(
    template_path, directory_path, file_name+"_G2", df.loc["G2"]
)

OUT = "基準線ファミリを作成しました"

excel.py

Excelデータ読み込み用のモジュールです。

Pycharmプロジェクトの構成

ソースコード

import pandas as pd


def get_df_multi_idx(filepath, sheet_name, header=0, index_col1=0, index_col2=1):
    df = pd.read_excel(
        filepath, sheet_name, header=header, index_col=[index_col1, index_col2]
    )
    df.drop([col for col in df.columns if "Unnamed" in str(col)], axis="columns", inplace=True)
    return df

family.py

ファミリ操作用のモジュールです。

Pycharmプロジェクトの構成

ソースコード

import clr

clr.AddReference("RevitAPI")
from Autodesk.Revit import DB

from relib_sbo.cmn import revit
import importlib
importlib.reload(revit)


def create_center_line_family(
        template_path: str,
        save_directory_path: str,
        file_name: str,
        df,
):
    doc, save_path = revit.create_family_document(
        file_name, save_directory_path, template_path
    )
    feet = 0.3048
    ref_pt_array = DB.ReferencePointArray()
    ts = DB.Transaction(doc, "ts")
    ts.Start()
    for col in df.columns:
        xyz = DB.XYZ(df[col]["X"]/feet, df[col]["Y"]/feet, df[col]["Z"]/feet)
        ref_pt_array.Append(
            doc.FamilyCreate.NewReferencePoint(xyz)
        )
    doc.FamilyCreate.NewCurveByPoints(ref_pt_array)
    ts.Commit()
    ts.Dispose()

    doc.SaveAs(save_path)
    doc.Close(False)

revit.py

Revit操作用のモジュールです。

Pycharmプロジェクトの構成

ソースコードは、以前ご紹介したプロジェクト単位の自動切替の部分も含めます。まだそれほど長くないので良いですが、いずれ行数が増えた場合にどのように紹介すれば良いのか、やや不安です。

今回追加した部分は、解説のところで紹介します。

import os

import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit import DB
from Autodesk.Revit import Exceptions

clr.AddReference("RevitServices")
from RevitServices.Persistence import  DocumentManager
from RevitServices.Transactions import TransactionManager


def get_unit_info(for_dynamo: bool):
    spec_type_ids = (
        DB.SpecTypeId.Length, DB.SpecTypeId.Angle, DB.SpecTypeId.Slope
    )
    if for_dynamo:
        unit_type_ids = (
            DB.UnitTypeId.Meters, DB.UnitTypeId.Degrees, DB.UnitTypeId.PerMille
        )
        accuracies = (0.001, 0.0001, 0.1)
        symbol_type_ids = (
            None, None, DB.SymbolTypeId.PerMille
        )
    else:
        unit_type_ids = (
            DB.UnitTypeId.Millimeters, DB.UnitTypeId.DegreesMinutes, DB.UnitTypeId.OneToRatio
        )
        accuracies = (1, None, 0.01)
        symbol_type_ids = (
            None, None, DB.SymbolTypeId.OneColon
        )
    return spec_type_ids, unit_type_ids, accuracies, symbol_type_ids


def set_units(unit_info):
    doc = DocumentManager.Instance.CurrentDBDocument
    project_unit = doc.GetUnits()

    for spec_type_id, unit_type_id, accuracy, symbol_type_id in zip(
        unit_info[0], unit_info[1], unit_info[2], unit_info[3]
    ):
        if symbol_type_id:
            format_opt = DB.FormatOptions(
                unit_type_id, symbol_type_id
            )
        else:
            format_opt = DB.FormatOptions(
                unit_type_id
            )
        if accuracy:
            format_opt.Accuracy = accuracy
        project_unit.SetFormatOptions(
            spec_type_id,
            format_opt
        )

    TransactionManager.Instance.EnsureInTransaction(doc)
    doc.SetUnits(project_unit)
    TransactionManager.Instance.TransactionTaskDone()


def create_family_document(
        file_name: str,
        save_directory_path: str,
        template_path: str
):
    uiapp = DocumentManager.Instance.CurrentUIApplication
    new_file_name = file_name + ".rfa"
    save_path = os.path.join(save_directory_path, new_file_name)
    try:
        doc = uiapp.Application.OpenDocumentFile(save_path)
    except Exceptions.FileNotFoundException:
        doc = uiapp.Application.NewFamilyDocument(template_path)
    else:
        doc.Close(False)
        os.remove(save_path)
        doc = uiapp.Application.NewFamilyDocument(template_path)

    return doc, save_path

基準線ファミリ作成の解説

ここからは解説です。基準線ファミリの作成手順に沿って説明します。

座標データの作成

最初に、線形モデルのベースとなる座標データを用意します。これは、Excelで作成します。

座標データは、原点を(0, 0, 0)とした小座標系とします。A列に線形の名前、B列にはX,Y,Zと表記します。1行目には各地点の名称を記載し、あとはそれぞれの座標値を入力します。

座標値のシート名は、”ベース”としてください。このシート名を変更したい場合は、ここのコードを修正してください。

また、座標値表に記載する線形の名称は、CL, G1, G2としています。もし、この名称を変更したい場合は、ここのコードを修正してください。上の表では、G1RやG2Lといった名前も表示されていますが、これらは基準線ファミリ作成には必要ありません。一方、G2は表示されておりませんが、必要です。

なお、座標の間隔を狭くするほど、線形モデルの精度が向上します。設計内容により求められる精度が変わりますが、座標間隔を0.1mとすれば、ほとんどの場合で設計上十分な精度を確保できると思います。

excel.pyの解説-座標データの読み込み-

excel.pyは、Excelを読み書きするためのモジュールです。今回は、座標データを読み込みデータフレームを作成する関数を作ります。

Excelデータの読み書きは、Pandasを使用します。

ほかにも、openpyxlやpywin32、Data.ImportExcelノード等でも可能ですが、CPython3を使用するならPandasがもっとも良いと思います。これは、データの整形機能に優れているためです。

と、分かっている風な書きっぷりをしましたが、本当はずっとpywin32を使用していました。Revit2024よりPandasが標準インストールされるようになったため、乗り換えました。そのため、Pandasはまだ勉強中です。ただ、CPython3ならPandasがベストは、たぶん本当だと思います。

それでは、ソースコードを解説します。コード > 解説の順で示します。

import pandas

import pandas as pd

pandasをインポートしています。pandasは、pdで略すのが世界共通の作法らしいです。

get_df_multi_idx関数とpd.read_excel()

def get_df_multi_idx(filepath, sheet_name, header=0, index_col1=0, index_col2=1):
    df = pd.read_excel(
        filepath, sheet_name, header=header, index_col=[index_col1, index_col2]
    )

関数の宣言とpandasデータフレームの作成をしています。

引数の解説です

filepath

Excelファイルのパスを入力します。

sheet_name

Excelファイルのシート名を入力します。

header

データフレームの列名となる行を指定します。今回は1行目です(Pythonの0は、Excelの1行目です)。

index_col1, index_col2

こちらは、列を指定します。0列(A)と1列(B)を指定します。

データフレームは、マルチインデックスで作成します。DynamoでいうL3リストに近いです。マルチインデックス化することで、各線形(G1やCL等)の各座標値を指定して取得できるようになります。

データフレームから欲しい値を取得する流れを説明します

df = pd.read_excel(マルチインデックス)で取得したデータ

dfには下表のデータが入っています。

C1C2C3C4
名前座標
G1X数値1数値2数値3数値4
Y数値5数値6数値7数値8
Z数値9数値10数値11数値12
G1RX数値13数値14数値15数値16
Y数値17数値18数値19数値20
Z数値21数値22数値23数値24
df.loc[“G1R”]とすると

G1Rのデータのみ抽出できます。

C1C2C3C4
座標
X数値13数値14数値16数値16
Y数値17数値18数値19数値20
Z数値21数値22数値23数値24
df.loc[“G1R”][“C2”]とすると

G1Rの中のC2を抽出できます。

座標
X数値14
Y数値18
Z数値22
df.loc[“G1R”][“C2”][“Z”]とすると

数値22を取得できます。

データフレームの整形とreturn

    df.drop([col for col in df.columns if "Unnamed" in str(col)], axis="columns", inplace=True)
    return df

データフレームの整形をしています。

もし、座標データ(Excel表)にヘッダーが空欄の列があった場合、その列全体を削除しています。これは、下表のようにExcel表にメモ書き等があった場合などを想定しています。

まず、pd.read_excel()の解説ですが、もしExcel表のヘッダー欄が空欄だった場合、自動的にUnnamedという名称が与えられます。たとえば、下の左表からデータフレームを作成すると右表のようになり、空欄の箇所にはUnnamed: 2とUnnamed: 3というヘッダー名が付与されます。

headera
数値123
Excel表
aUnnamed: 2Unnamed: 3
123
データフレーム

このため、ヘッダーが空欄かどうかは、ヘッダー名にUnnamedがあるかどうかを確認すれば分かります。

この確認を行っているのが[col for col in df.columns if "Unnamed" in str(col)]です。for col in df.columnsで順番にヘッダー名を取得し、if "Unnamed" in str(col)でヘッダー名にUnnamedが含まれているかを確認しています。含まれていた場合は、そのヘッダー名がリスト化されます。もし、上の右表であれば、ヘッダー名リストとして[Unnamed: 2, Unnamed: 3]が作成されます。

データフレームから列を削除する処理が、df.drop([削除対象のヘッダー名], axis="columns", inplace=True)の部分です。axis="columns"は、削除対象がヘッダー名であることを意味します。inplaceはデータフレームのコピーを作成するかどうかです。今回は、データフレームそのものを削除すれば良い(コピーを作成しない)ため、inplace=Trueとしています。

最後に、return dfで取得したデータフレームを返します。

revit.pyの解説-ファミリドキュメントの作成-

次は、revit.pyに新たなファミリドキュメントを作成する関数を作ります。

revit.pyには、既に紹介済みのプロジェクト単位切り替え用コードも記述されています。この部分の解説は省略し、追加した部分のみ解説します。

プロジェクト単位切り替えの解説はこちらをご覧ください。なお、今回、プロジェクト単位の切り替え処理は行いません。

import

import os
from Autodesk.Revit import Exceptions  # 6行目

osとExceptionsをインポートします。osは、Pythonの標準モジュールで、主にファイルやディレクトリの操作を行います。Exceptionsは、Revitの例外をまとめたものです(例外とは何かはこちらでご確認ください。python公式チュートリアルです)。try文のexceptで使用します。

create_family_document関数の宣言

def create_family_document(
        file_name: str,
        save_directory_path: str,
        template_path: str
):

新たなファミリドキュメントを作成するための関数を作ります。

引数の解説です

file_name

作成するファミリのファイル名です。

save_directory_path

作成したファミリを保存するディレクトリの場所です。

template_path

作成するファミリのテンプレートを指定します。

Revitアプリケーション操作の準備

    uiapp = DocumentManager.Instance.CurrentUIApplication

今回の処理では、新たなドキュメントを作成するなどRevitアプリケーションの操作を行う必要があります。これは、その準備です。このコードは、定型文と理解して問題ありません。

uiapp.ApplicationでRevitアプリケーションを操作することができるようになります。詳細は後述します。

前処理

    new_file_name = file_name + ".rfa"
    save_path = os.path.join(save_directory_path, new_file_name)

new_file_name = file_name + ".rfa"は、file_nameに拡張子(.rfa)をつけています。

save_path = os.path.join(save_directory_path, new_file_name)は、作成したファミリを保存するパスを作成しています。

save_pathでドキュメントを開けるか確認

    try:
        doc = uiapp.Application.OpenDocumentFile(save_path)

doc = uiapp.Application.OpenDocumentFile(save_path)は、先ほど作成したsave_pathでドキュメントを開くことを試みています。言い方を変えると、save_pathのドキュメントが存在するかを確認しています。開ける(存在する) or 開けない(存在しない)で今後の処理を分けるため、tryを使用しています。

apidocs.coの説明

今回は、apidocs.coで説明します。前回使用したRevit API Docsとは異なるサイトですが、両方ともGui Talaricoさんが管理されているようです。

まず、前段のuiapp = DocumentManager.Instance.CurrentUIApplicationを確認しましょう。このコードは、Revitアプリケーションを操作したい場合に使用します。作成したuiappの型を確認すると、Autodesk.Revit.UI.UIApplicationであることが分かります。

では、uiapp.Applicationの意味を確認しましょう。apidocs.coでAutodesk.Revit.UI.UIApplicationを見ると、Propaertiesの中にApplicationプロパティが確認できます。これは、Applicationオブジェクトを取得できる、という意味です。

赤字のApplicationをクリックすると、Autodesk.Revit.ApplicationServicesApplicationクラスに飛びます。

この中には、様々なメソッド等があることが分かります。NewProjectDocumentなど、メソッド名だけで何ができるか分かりそうなものもあります。今回使用しているOpenDocumentFileもありました。

OpenDocumentFileには3種類の記述方法があるようですが、今回使用しているのは、OpenDocumentFile(String)です。Stringには、開きたいドキュメントのパスを入力します。

ドキュメントを開けなかった場合

    except Exceptions.FileNotFoundException:
        doc = uiapp.Application.NewFamilyDocument(template_path)

開けなかった場合の処理です。tryを使用しているため、開けなかったとしても即座にエラーとはなりません。except Exceptions.FileNotFoundException:は、もしFileNotFoundExceptionという例外が発生したら次の処理をしてね、という意味です。FileNotFoundExceptionは、ファイルが存在しないとき/見つからないときに発生する例外です。

その時にどんな処理をするかというと、doc = uiapp.Application.NewFamilyDocument(template_path)です。template_pathで示されたファミリテンプレートを使用し、新しいファミリドキュメントを作成します。なお、ファミリテンプレートは、一般モデル_アダプティブを指定します。

apidocs.coの説明

まず、Exceptions.FileNotFoundExceptionです。先ほど確認したOpenDocumentFileメソッドの説明を確認します。すると、例外(Exceptions)の一覧が記載されているので、この中から該当するものを使用します。

次に、doc = uiapp.Application.NewFamilyDocument(template_path)です。uiapp.ApplicationまではOpenDocumentFileメソッドと同じということから、これもAutodesk.Revit.ApplicationServices.Applicationの中にありそうだということが分かります。stringにファミリテンプレートのパス(template_path)を入力すれば、これに従いファミリドキュメントを作成します。

ドキュメントが開けた場合

    else:
        doc.Close(False)
        os.remove(save_path)
        doc = uiapp.Application.NewFamilyDocument(template_path)

今度は、ドキュメントが開けた場合です。

まず、doc.Close(False)で開いたドキュメントを閉じます。(False)は、上書き保存しないことを意味します。

次に、os.remove(save_path)でそのドキュメントを削除します。

最後に、先ほどと同じくdoc = uiapp.Application.NewFamilyDocument(template_path)で新たなファミリドキュメントを作成します。

return

    return doc, save_path

作成したファミリドキュメント(doc)とファミリドキュメントの保存場所(save_path)を返します。これで、この関数の処理は終わりです。

family.pyの解説-基準線ファミリの作成-

ここでは、基準線ファミリを作成する関数を作成します。

import

import clr

clr.AddReference("RevitAPI")
from Autodesk.Revit import DB

from relib_sbo.cmn import revit
import importlib
importlib.reload(revit)

APIを使用するため、Autodesk.Revit.DBをインポートします。また、先ほど作成したcreate_family_document関数等を使用するため、relib.sbo.cmn.rebitもインポートします。こちらは、開発中のためimportlib.reload()を使用します。

create_center_line_family関数

def create_center_line_family(
        template_path: str,
        save_directory_path: str,
        file_name: str,
        df,
):

基準線ファミリを作成するための関数を作ります。

引数の解説

template_path

先ほど作成したcreate_family_document関数で使用するtemplate_pathです。ファミリテンプレートのパスを入力します。

save_directory_path

こちらもcreate_family_document関数で使用する引数です。ファミリドキュメントを保存するディレクトリを入力します。

file_name

これもcreate_family_document関数用です。ファミリドキュメントの名前を入力します。

df

excel.pyのget_df_multi_idx関数で作成したデータフレームを入力します。

ファミリドキュメントの作成

    doc, save_path = revit.create_family_document(
        file_name, save_directory_path, template_path
    )

revit.pyに作成したcreate_famly_document関数でファミリドキュメント(doc)とその保存場所(save_path)を作成します。

基準線ファミリの作成

    feet = 0.3048
    ref_pt_array = DB.ReferencePointArray()
    ts = DB.Transaction(doc, "ts")
    ts.Start()
    for col in df.columns:
        xyz = DB.XYZ(df[col]["X"]/feet, df[col]["Y"]/feet, df[col]["Z"]/feet)
        ref_pt_array.Append(
            doc.FamilyCreate.NewReferencePoint(xyz)
        )
    doc.FamilyCreate.NewCurveByPoints(ref_pt_array)
    ts.Commit()
    ts.Dispose()

少し長いですが、まとめて解説します。基準線ファミリの作成手順は、以下のとおりです。

  • データフレームから座標値を抽出
  • 座標値から点を作成
  • 点から参照点を作成し、配列に格納する
  • 参照点間を滑らかに結ぶ曲線を作成し、これを基準線ファミリとする。

①~➂を行っているのが、24行目から始まるfor文です。まず、for col in df.columns:でデータフレームのヘッダー(下図赤枠)を順番に取り出します。df[col]で下図青枠を取得できるので、あとはdf[col]["X"]としてX, Y, Z値を取得します。

そして、xyz = DB.XYZ(df[col]["X"]/feet, df[col]["Y"]/feet, df[col]["Z"]/feet)で座標値から点を作成しています。座標値はm単位のため、0.3048で割りfeetに変換しています(20行目で変数feetには0.3048を代入しています)。

次にref_pt_array.Append(doc.FamilyCreate.NewReferencePoint(xyz))で、作成した点から参照点を作成し、それをref_pt_arrayに挿入し配列を作成しています。なお、ref_pt_arrayの型は、ReferencePointArrayである必要があるため、21行目のref_pt_array = DB.ReferencePointArray()が必要です。ref_pt_array = []でリストとするのは不可です。

④の基準線ファミリ作成は、29行目のdoc.FamilyCreate.NewCurveByPoints(ref_pt_array)です。ref_pt_arrayを基に3D曲線を作成しています。

ts = DB.Transaction(doc, "ts")等の22, 23, 30, 31行目は、トランザクションです。これは後述します。

apidocs.coの説明

まずは、29行目で使用しているdoc.FamilyCreateを確認しましょう。すると、FamilyItemFactoryというオブジェクトを取得できることが分かります。下図のFamilyItemFactory(赤枠部分)をクリックしてみます。

すると、Autodesk.Revit.CreationFamilyItemFactoryクラスの説明に飛びます。様々なメソッドがありますが、その中に、今回使用しているNewCurveByPointsメソッドがあります。

これをクリックすると、NewCurveByPointsは、ReferencePointArrayを基に作成できることが分かります。では、ReferencePointArrayをクリックします。

Constructorにあるとおり、ReferencePointArray()とすればインスタンスを作成できるので、ソースコードの21行目のようにref_pt_array = DB.ReferencePointArray()とし、参照点の配列の枠を作ります。そして、ReferecePointArrayのメソッドにあるAppendを使えば、その配列に点を挿入していくことが可能です。

次は、参照点(ReferencePoint)の作成方法です。NewCurveByPointsと同様にFamilyItemFactoryの中にNewReferencePointメソッドがあります。

作り方は3通りあるようですが、今回は、NewReferencePoint(XYZ)を使用します。

Autodesk.Revit.DB.XYZのConstructorを確認すると、XYZの作成方法が確認できます。

トランザクションについて

Dynamoでのトランザクションの基本形は、下のコードです。

import clr
clr.AddReference("RevitServices")
from RevitServices.Persistence import  DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument

TransactionManager.Instance.EnsureInTransaction(doc)
# ここにRevit処理を記述
TransactionManager.Instance.TransactionTaskDone()

これは、ドキュメントをdoc = DocumentManager.Instance.CurrentDBDocumentで取得した場合に利用できます。つまり、ほとんどの場合で利用できるはずです。

一方、今回のドキュメント取得方法はdoc = uiapp.Application.OpenDocumentFile(save_path)でした。このように、uiapp.Application経由でドキュメントを取得した場合、上のトランザクションではエラーが発生する場合があります。

まだトランザクションの仕組みは理解できておらず、原因を正確に説明できないため、対処法のみ紹介します。APIのトランザクションを使用すれば、エラーは発生しません。

import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit import DB

ts = DB.Transaction(doc, "ts")
ts.Start()
# ここにRevit処理を記述
ts.Commit()
ts.Dispose()

コードは定型文のため、解説は省略します。

ドキュメントの取得方法により、トランザクションを使い分ける必要があることを覚えておいてください。

ファミリの保存

    doc.SaveAs(save_path)
    doc.Close(False)

doc.SaveAs(save_path)で作成したファミリを保存し、doc.Close(False)でファミリドキュメントを閉じます。以上で基準線ファミリ作成用の関数ができました。

create_center_crv_family.pyの解説

最後に、Dynamoからアクセスするcreate_center_crv_family.pyの解説です。

import

import sys
sys.path.append(r"E:\BIM\PyProjects\relib\src")

from relib_sbo.cmn import excel
from relib_sbo.cmn import family

import importlib
importlib.reload(excel)
importlib.reload(family)

sysやimportlibの解説は、こちらをご覧ください。

IN

excel_path = IN[0]
template_path = IN[1]
directory_path = IN[2]
file_name = IN[3]

IN[0]~[3]には、それぞれノードをつなぎます。つなぐノードはこちら(今回のグラフです)をご覧ください。

それぞれおさらいしておきます。

excel_path

座標値が入力されているExcelファイルのパスです。ファイル名まで指定します。

template_path

ファミリテンプレート(一般モデル_アダプティブ)のパスです。Revitのバージョンにより場所が変わります。Revit2024であれば、C > ProgramData > Autodesk > RVT2024 > Family Templates > Japaneseの中にあります。

なお、ProgramDataフォルダは隠しフォルダのため、表示されない場合があります。その際は、エクスプローラの隠しファイルにチェックを入れてください。

directory_path

作成する基準線ファミリの保存場所です。

file_name

作成する基準線ファミリの名前です。ここで指定した名称に_CL, _G1, _G2をそれぞれ加えた3つのファミリが作成されます(たとえば、file_nameと指定したら、file_name_CL, file_name_G1, file_name_G2ができます)。

データフレームの作成

df = excel.get_df_multi_idx(excel_path, "ベース")

excel.pyに作成したget_df_multi_idx()を使用し、データフレームを作成します。

“ベース”は、Excelのシート名です。今回は、コードに手書きとしていますが、必要によりノードで入力するなどしてください。

基準線ファミリの作成

family.create_center_line_family(
    template_path, directory_path, file_name+"_CL", df.loc["CL"]
)
family.create_center_line_family(
    template_path, directory_path, file_name+"_G1", df.loc["G1"]
)
family.create_center_line_family(
    template_path, directory_path, file_name+"_G2", df.loc["G2"]
)

OUT = "基準線ファミリを作成しました"

family.pyのcreate_center_line関数を呼び出して、基準線ファミリを作成します。

ファミリの名前は、ここでfile_name+"_CL"のように”_CL”, “_G1”, “_G2″を付記しています。ファミリの名前を変えたい場合は、ここを修正します。

データフレームは、df.loc["CL"]等とし、必要な部分だけcreate_center_line関数に入力しています。”CL”の部分は、Excelの座標値表と一致している必要があります。もし、座標値表で異なる名称を使用する場合は、ここも修正します。

基準線ファミリの配置

最後に、できあがった基準線ファミリの配置方法を解説します。

基準線ファミリは、(0, 0, 0)を基点として作成しています。そのため、プロジェクト基準点に配置すれば良いです。

もし、プロジェクト基準点が表示されていない場合は、表示/グラフィックスの上書きからこれを表示させます。

また、必要により、ビュー範囲を調整してください(表示範囲が狭い場合、線形が表示されないことがあります)。

最後に

コードの解説は難しいです。分かりづらい部分が多々あると思います。

分かりづらい部分は、コメント等いただければできる限り対応いたします。

次回は、ようやくファミリ作成に入ります。まずは、主桁ファミリのウェブを解説する予定です。

コメント(承認後に表示されます。メールアドレスは表示されません)

コメントする

目次