goo blog サービス終了のお知らせ 

CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

Obsidianを使ってみた。

2025-05-17 11:20:33 | 日記

Obsidian - Apps on Google Play

Obsidian - Apps on Google Play

Plain-text personal knowledge base on the go

高機能テキストエディタ・メモ帳Obsidianを使ってみた。
下記の糞ブログ仕様の表示が見事にマークダウン方式で表記できた。

おい、11月で廃業するとふざけたことをほざいている何処ぞの糞ブログ!PythonのソースコードのIndentを何とかしやがれ!!!



# ExcelとRevit Dynamoを連携した電気工事積算プログラム

以下は、Revit Dynamoを使用して電気工事関連要素を抽出し、Excelで積算を行うためのプログラムの概要です。

## 必要な前提条件
- Revitがインストールされている
- Dynamoがインストールされている
- Microsoft Excelがインストールされている
- DynamoのData-Shapesパッケージがインストールされている(UI作成用)

## Dynamoスクリプト (電気工事要素抽出部分)

```python
# Pythonスクリプトノード内

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Electrical import *

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

doc = DocumentManager.Instance.CurrentDBDocument

# 電気設備要素を収集
def get_electrical_elements():
# 電気設備の要素タイプをフィルタリング
collector = FilteredElementCollector(doc)
# 電気系統
electrical_systems = collector.OfClass(ElectricalSystem).ToElements()
# 照明器具
lighting_fixtures = collector.OfCategory(BuiltInCategory.OST_LightingFixtures).WhereElementIsNotElementType().ToElements()
# コンセント
electrical_fixtures = collector.OfCategory(BuiltInCategory.OST_ElectricalFixtures).WhereElementIsNotElementType().ToElements()
# ケーブルトレイ
cable_trays = collector.OfCategory(BuiltInCategory.OST_CableTray).WhereElementIsNotElementType().ToElements()
# 配線ダクト
conduits = collector.OfCategory(BuiltInCategory.OST_Conduit).WhereElementIsNotElementType().ToElements()
# スイッチ
switches = collector.OfCategory(BuiltInCategory.OST_ElectricalEquipment).WhereElementIsNotElementType().ToElements()
return {
"ElectricalSystems": electrical_systems,
"LightingFixtures": lighting_fixtures,
"ElectricalFixtures": electrical_fixtures,
"CableTrays": cable_trays,
"Conduits": conduits,
"Switches": switches
}

# 要素を処理して積算用データを作成
def process_elements(elements):
results = []
# 照明器具処理
for fixture in elements["LightingFixtures"]:
fixture_type = doc.GetElement(fixture.GetTypeId())
results.append({
"Category": "照明器具",
"Type": fixture_type.FamilyName,
"Quantity": 1,
"Length": 0,
"Parameters": get_parameters(fixture)
})
# ケーブルトレイ処理
for tray in elements["CableTrays"]:
length_param = tray.LookupParameter("Length")
length = length_param.AsDouble() * 0.3048 if length_param else 0 # フィートからメートルに変換
results.append({
"Category": "ケーブルトレイ",
"Type": tray.Name,
"Quantity": 1,
"Length": length,
"Parameters": get_parameters(tray)
})
# 同様に他の要素も処理...
return results

def get_parameters(element):
params = {}
for param in element.Parameters:
params[param.Definition.Name] = param.AsValueString() if param.HasValue else ""
return params

# メイン実行
elements = get_electrical_elements()
output_data = process_elements(elements)

OUT = output_data
```

## Excel連携部分 (Dynamo側)

```python
# Pythonスクリプトノード内 (Excel出力用)

import clr
clr.AddReference('Microsoft.Office.Interop.Excel')
from Microsoft.Office.Interop.Excel import ApplicationClass, XlFileFormat

import sys
import os

def export_to_excel(data, file_path):
# Excelアプリケーション起動
excel = ApplicationClass()
excel.Visible = False
# 新しいワークブック作成
workbook = excel.Workbooks.Add()
sheet = workbook.ActiveSheet
# ヘッダー書き込み
headers = ["カテゴリ", "タイプ", "数量", "長さ(m)", "備考"]
for col, header in enumerate(headers, 1):
sheet.Cells[1, col] = header
# データ書き込み
for row, item in enumerate(data, 2):
sheet.Cells[row, 1] = item["Category"]
sheet.Cells[row, 2] = item["Type"]
sheet.Cells[row, 3] = item["Quantity"]
sheet.Cells[row, 4] = round(item["Length"], 2)
# パラメータから重要な情報を備考欄に
params = item["Parameters"]
note = ""
if "仕様" in params: note += f"仕様:{params['仕様']}; "
if "メーカー" in params: note += f"メーカー:{params['メーカー']}"
sheet.Cells[row, 5] = note
# 保存
workbook.SaveAs(file_path, XlFileFormat.xlWorkbookDefault)
workbook.Close()
excel.Quit()
return file_path

# 出力ファイルパス (ユーザーが指定可能にすると良い)
output_path = os.path.join(os.path.expanduser("~"), "Desktop", "電気工事積算.xlsx")

# 実行
result_path = export_to_excel(IN[0], output_path)

OUT = result_path
```

## Excel積算シートの改善 (VBAコード)

Excel側で以下のようなVBAマクロを作成すると、さらに使いやすくなります。

```vba
' 標準モジュールに追加

Sub CalculateElectricalCost()
Dim ws As Worksheet
Dim lastRow As Long
Dim totalQuantity As Double
Dim totalLength As Double
Dim i As Long
Set ws = ThisWorkbook.Sheets("積算")
' 最終行取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 合計計算
totalQuantity = 0
totalLength = 0
For i = 2 To lastRow
totalQuantity = totalQuantity + ws.Cells(i, 3).Value
totalLength = totalLength + ws.Cells(i, 4).Value
Next i
' 合計行に出力
ws.Cells(lastRow + 1, 1).Value = "合計"
ws.Cells(lastRow + 1, 3).Value = totalQuantity
ws.Cells(lastRow + 1, 4).Value = totalLength
' 単価を適用して金額計算 (単価シートから取得)
Dim unitPriceSheet As Worksheet
Set unitPriceSheet = ThisWorkbook.Sheets("単価表")
For i = 2 To lastRow
Dim itemType As String
Dim unitPrice As Double
itemType = ws.Cells(i, 2).Value
unitPrice = 0
' 単価表から検索
Dim priceLastRow As Long
priceLastRow = unitPriceSheet.Cells(unitPriceSheet.Rows.Count, "A").End(xlUp).Row
Dim j As Long
For j = 2 To priceLastRow
If unitPriceSheet.Cells(j, 1).Value = itemType Then
unitPrice = unitPriceSheet.Cells(j, 2).Value
Exit For
End If
Next j
' 金額計算 (数量ベースまたは長さベース)
If ws.Cells(i, 1).Value Like "*ケーブル*" Or ws.Cells(i, 1).Value Like "*ダクト*" Then
ws.Cells(i, 6).Value = ws.Cells(i, 4).Value * unitPrice ' 長さベース
Else
ws.Cells(i, 6).Value = ws.Cells(i, 3).Value * unitPrice ' 数量ベース
End If
Next i
' 合計金額計算
ws.Cells(lastRow + 1, 6).Value = Application.WorksheetFunction.Sum(ws.Range("F2:F" & lastRow))
MsgBox "積算完了しました。", vbInformation
End Sub
```

## 実装のポイント

1. **Revit要素のフィルタリング**:
- 電気工事関連の要素のみを対象に抽出
- 照明器具、コンセント、ケーブルトレイなどカテゴリ別に処理

2. **パラメータ抽出**:
- 各要素のRevitパラメータを取得し、必要な情報を抽出

3. **Excel連携**:
- Dynamoから直接Excelファイルを生成
- 構造化されたデータ形式で出力

4. **積算ロジック**:
- 数量ベース(照明器具など)と長さベース(配線など)の両方に対応
- 単価表を参照して金額計算

5. **拡張性**:
- 追加の要素タイプや計算ロジックを簡単に追加可能

## 改善提案

1. **UIの追加**:
- Data-Shapesパッケージを使用してDynamo内にユーザーフレンドリーなインターフェースを作成

2. **単価管理**:
- Excel単価表とRevit要素をマッピングするシステムを追加

3. **進捗管理**:
- 大規模プロジェクト用に進捗バーを追加

4. **レポート生成**:
- PDF形式でのレポート自動生成機能

このプログラムは、電気工事に特化した積算作業を大幅に効率化し、RevitモデルとExcelのシームレスな連携を実現します。


最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。