BIM + BrxDbProperties and Python.

Playing with the new BrxDbProperties in V25, an attempt to extract some data into pandas

from pyrx_imp import Rx, Ge, Gs, Gi, Db, Ap, Ed, Brx
from collections import defaultdict
import pandas as pd
import traceback


def PyRxCmd_doit1():
    try:
        # search conditions
        bimTypeKey = "Type~BIM"
        bimTypeVal = "Column"
        data = {"AxisLength~BIM": [], "Space~BIM": [], "Count": []}

        ps, ss = Ed.Editor.select([(Db.DxfCode.kDxfStart, "3DSOLID")])
        for id in ss.objectIds():
            props = set(Brx.DbProperties.listAll(id))
            if bimTypeKey in props and Brx.DbProperties.isValid(id, bimTypeKey)[0]:
                acval = Brx.DbProperties.getValue(id, bimTypeKey)
                if acval.format() != bimTypeVal:
                    continue
                # this could be better
                if not Brx.DbProperties.isValid(id, "AxisLength~BIM")[0]:
                    continue
                if not Brx.DbProperties.isValid(id, "Space~BIM")[0]:
                    continue
                data["AxisLength~BIM"].append(
                    Brx.DbProperties.getValue(id, "AxisLength~BIM").format())
                data["Space~BIM"].append(
                    Brx.DbProperties.getValue(id, "Space~BIM").format())
                data["Count"].append(1)

        df = pd.DataFrame(data)
        gdf = df.groupby(
            ["AxisLength~BIM", "Space~BIM"], sort=True, as_index=False
        ).agg({"Count": "sum"})
        odf = gdf[["Count", "AxisLength~BIM", "Space~BIM"]]

        print(odf)

        # write it to exel
        # with pd.ExcelWriter("e:\\pandas_to_excel.xlsx") as writer:
        #     odf.to_excel(writer, sheet_name="sheet1", index=False)

    except Exception as err:
        traceback.print_exception(err)

Comments

  • Sebastian
    edited December 2024

    Thanks for the inspiration! Here's an example using a translation table to auto-classify mechanical components as bim types.

    def PyRxCmd_bim_attsync():
    try: # Translation table translation_table = { "DIN EN 558 Flanged Angle Valve": "eBimFlowController", "DIN 2605 Elbow Type 10 45 Deg": "eBimFlowSegment", # add more translation pairs to table } # Suchbedingungen bimTypeKey = "Component name~MCAD" print(f"Looking up objects with TypeKey {bimTypeKey}") print("Using translation table") print(translation_table) db = Db.curDb() ids = db.objectIds(Db.BlockReference.desc()) for id in ids: props = set(Brx.DbProperties.listAll(id)) if bimTypeKey in props and Brx.DbProperties.isValid(id, bimTypeKey)[0]: acval = Brx.DbProperties.getValue(id, bimTypeKey) if acval.format() in translation_table: bimElementTypeStr = translation_table[acval.format()] bimElementType = getattr(Bim.BimElementType, bimElementTypeStr) print(f"ID: {id}, Current Classification: {Bim.BimClassification.getClassification(id)}") if Bim.BimClassification.getClassification(id) != bimElementType: Bim.BimClassification.classifyAs(id, bimElementType) print(f"ID: {id} classified as {bimElementTypeStr}") except Exception as err: traceback.print_exception(err)

    06.12.24: Updated Db.BlockReference.desc()