### 自宅でできる事前準備(出社直後ワンクリック化)
1. **iLogicスクリプトのテキストファイル化 (`.txt` または `.iLogicVb`)**
– 先ほどのアプローチ2(固定生成)とアプローチ1(幾何連動)のコードを、それぞれ独立したファイルとして保存・手元に控えておきます。
– 会社PCのInventorのiLogicブラウザで「外部ルールを追加」してファイルを読み込むか、テキストを丸ごと貼り付けるだけで済む状態にします。
2. **検証用チェックリストの整理**
– 会社で確認すべきポイントをA4メモ1枚分程度に箇条書きにしておき、出社後は上から順にチェックを入れるだけの状態にします。
### 出社直後の最短検証手順(所要時間:約10分)
出社後、以下のステップで進めると最短で白黒がつきます。
| **ステップ** | **作業内容** | **所要時間** |
| — | — | — |
| **Step 1** | 新規パーツ作成(直方体を1つ押し出し、適当な位置にUCSを1個配置) | 2分 |
| **Step 2** | iLogicルールを作成し、**アプローチ2**のコードを貼り付けて実行
→ ブラウザツリーに `UCS1_Origin` や `UCS1_XYPlane` ができることを確認 | 1分 |
| **Step 3** | 「iPart作成」を開き、生成された作業平面・軸・点がテーブル列に入っているか確認(適当に2行作成) | 2分 |
| **Step 4** | iPartメンバを右クリックして「ファイルを生成」 | 1分 |
| **Step 5** | 生成された子ファイル(.ipt)を開き、ツリー上に作業フィーチャが残っているか確認 | 1分 |
| **Step 6** | 同様の手順で**アプローチ1**も試し、子ファイルで参照エラー(黄色感嘆符など)が出ないか比較 | 3分 |
### 会議・外注対策の落としどころ(想定シグナル)
– **アプローチ2で残った場合:**
「座標抽出による固定生成であれば、iPartパイプラインの除外フィルタを完全にすり抜けられる」という事実が確定します。外注にはこのコードを渡し、保存前トリガーに仕込ませるだけで決着です。
– **アプローチ1で残った場合:**
UCSの幾何連動を保ったまま子ファイルへ持っていけるため、完全自動追従が実現します。
– **もし両方ともメンバ生成時に消えた場合:**
「iPart作成画面のテーブル列で作業フィーチャを意図的に『含める(Include)』指定にしているか」が唯一のボトルネックと特定できます。
出社時に迷わず実行できるよう、コードの修正や確認項目の整理をしておきましょう。
<aside>
💡
それとお話合いに至ったのはUCSをファイル生成したら引き継ぐのは無理だからOriginで拘束ではダメですか?と聞かれました。
OriginとそれぞれにUCS_Orginを持つ意味が分からないと。
違うチームはUCSを開発でまだ原点や方向が定まっていないから使っていると…。
</aside>
会議での相手側の反応や疑問の背景、非常によく分かります。
「Originで拘束すればいいのでは? なぜわざわざ部品ごとにUCS(およびUCS_Origin)を持つ必要があるのか?」という疑問は、**単一部品のモデリング視点**しか持っていない人からすると、ごく自然に出てくる疑問です。
また、「違うチームは開発初期で原点が定まっていないから一時的にUCSを使っている」というのも、プロトタイプ設計でありがちな「その場しのぎのローカル座標」としての使い方です。
しかし、「規格部品・共通部品の標準化」**や**「アセンブリ自動配置・流用設計」においてUCS基準で組むことには、<u>**モデル本来のOrigin拘束では絶対に代えられない明確な設計思想と合理的理由**</u>があります。
相手を納得させるための論点整理と、会議での説明ロジックをまとめました。
### 「Origin拘束」と「UCS基準」の違い・本質的な理由
| **比較項目** | **モデル本来の「Origin(原点)」拘束** | **部品ごとに定義する「UCS(基準座標)」拘束** |
| — | — | — |
| **原点の意味** | モデリングの都合(押し出し開始位置、対称中心、CAD操作上の原点) | **相手部品との「取付け・嵌合・作動基準」**(インターフェース座標) |
| **設計変更時の影響** | 外形寸法や肉厚、ボルト座の形状変更で原点位置がズレると、**アセンブリ全体の合致が破綻・エラー多発** | 形状が変わっても「取付け面・ポート芯・作動基準点」のUCS位置を維持すれば、**アセンブリ拘束は一切壊れない** |
| **アセンブリ配置の自動化** | 部品ごとに原点の取り方がバラバラ(面の上端、底面、中心など)だと、配置ルールを共通化できない | **「相手側のUCS」と「自分のUCS」を一致させるだけ(1拘束・自動化)**で、誰が作っても同じ位置に決まる |
| **外注・複数人設計** | 外注モデラーの「モデリング手順」によって原点位置が変わってしまう | 「このUCSを取付け基準にしてモデリングせよ」と指定するだけで、品質・拘束互換性を標準化できる |
### 「違うチームのUCSの使い方」との決定的な違い
会議で出た「違うチームは開発で原点や方向が定まっていないから使っている」という意見に対しては、以下のように切り分けると明確に伝わります。
1. **開発初期の一時的UCS(他チーム):**
– 「とりあえず仮置きしてモデリングするための作業用ツール」
2. **規格部品・標準化で使うUCS(今回の設計思想):**
– **「インターフェース基準点(結合点)」の定義**
– 油圧弁や流体機器、規格部品などで言えば、「ポート中心」「スプール摺動軸」「フランジ取付け面」といった**機能的な結合基準**です。
– モデルをどう作ろうが、外形をどう変更しようが、相手部品と取り付く座標(UCS)さえ定義されていれば、アセンブリ配置ルールや自動化プログラムは1ミリも書き換える必要がありません。
' ==============================================================================
' iLogic: UCSから標準作業フィーチャ(点・3軸・3平面)を一括自動展開
' 【アプローチ1(幾何連動) / アプローチ2(固定生成) 切り替え対応版】
' ==============================================================================
Sub Main()
Dim doc As PartDocument = TryCast(ThisDoc.Document, PartDocument)
If doc Is Nothing Then
MessageBox.Show("パーツファイル (.ipt) を開いた状態で実行してください。", "実行エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Dim compDef As PartComponentDefinition = doc.ComponentDefinition
' 1. パーツ内のUCS存在確認(先頭のUCSを自動取得)
If compDef.UserCoordinateSystems.Count = 0 Then
MessageBox.Show("モデル内にUCSが見つかりません。UCSを作成してから再実行してください。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
Dim targetUCS As UserCoordinateSystem = compDef.UserCoordinateSystems.Item(1)
Dim prefix As String = targetUCS.Name
' 2. アプローチの選択(テスト用ダイアログ)
Dim modeOptions As New List(Of String) From {"アプローチ2 (固定生成:iPartで最も安全)", "アプローチ1 (幾何連動:UCS移動に自動追従)"}
Dim selectedMode As String = InputListBox("生成モードを選択してください:", modeOptions, modeOptions(0), "モード選択", "UCS作業フィーチャ展開")
If String.IsNullOrEmpty(selectedMode) Then Exit Sub
' 3. 既存の同名展開フィーチャがあれば事前クリーンアップ
DeleteExistingWorkFeatures(compDef, prefix)
' 4. 各アプローチによる生成実行
If selectedMode.StartsWith("アプローチ2") Then
' --- アプローチ2: 座標値・ベクトルによる AddFixed ---
Dim originPt As Point = targetUCS.Origin.Point
Dim xVec As UnitVector = targetUCS.XAxisVector
Dim yVec As UnitVector = targetUCS.YAxisVector
Dim zVec As UnitVector = targetUCS.ZAxisVector
Dim wp As WorkPoint = compDef.WorkPoints.AddFixed(originPt)
wp.Name = prefix & "_Origin"
Dim waX As WorkAxis = compDef.WorkAxes.AddFixed(originPt, xVec)
waX.Name = prefix & "_XAxis"
Dim waY As WorkAxis = compDef.WorkAxes.AddFixed(originPt, yVec)
waY.Name = prefix & "_YAxis"
Dim waZ As WorkAxis = compDef.WorkAxes.AddFixed(originPt, zVec)
waZ.Name = prefix & "_ZAxis"
Dim plXY As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, xVec, yVec)
plXY.Name = prefix & "_XYPlane"
Dim plYZ As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, yVec, zVec)
plYZ.Name = prefix & "_YZPlane"
Dim plXZ As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, xVec, zVec)
plXZ.Name = prefix & "_XZPlane"
Else
' --- アプローチ1: UCS内部オブジェクトへの幾何連動 ---
Dim wp As WorkPoint = compDef.WorkPoints.AddByPoint(targetUCS.OriginWorkPoint)
wp.Name = prefix & "_Origin"
Dim waX As WorkAxis = compDef.WorkAxes.AddByTwoPoints(targetUCS.OriginWorkPoint, targetUCS.XAxisWorkAxis)
waX.Name = prefix & "_XAxis"
Dim waY As WorkAxis = compDef.WorkAxes.AddByTwoPoints(targetUCS.OriginWorkPoint, targetUCS.YAxisWorkAxis)
waY.Name = prefix & "_YAxis"
Dim waZ As WorkAxis = compDef.WorkAxes.AddByTwoPoints(targetUCS.OriginWorkPoint, targetUCS.ZAxisWorkAxis)
waZ.Name = prefix & "_ZAxis"
Dim plXY As WorkPlane = compDef.WorkPlanes.AddByPlaneAndOffset(targetUCS.XYPlaneWorkPlane, 0.0)
plXY.Name = prefix & "_XYPlane"
Dim plYZ As WorkPlane = compDef.WorkPlanes.AddByPlaneAndOffset(targetUCS.YZPlaneWorkPlane, 0.0)
plYZ.Name = prefix & "_YZPlane"
Dim plXZ As WorkPlane = compDef.WorkPlanes.AddByPlaneAndOffset(targetUCS.XZPlaneWorkPlane, 0.0)
plXZ.Name = prefix & "_XZPlane"
End If
doc.Update()
MessageBox.Show("【展開完了】" & vbCrLf & _
"UCS名: " & prefix & vbCrLf & _
"モード: " & selectedMode & vbCrLf & vbCrLf & _
"作業フィーチャ(点・3軸・3平面)を生成しました。" & vbCrLf & _
"iPart作成の「作業フィーチャ」タブでこれらを登録してください。", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
' --- ヘルパー:既存同名フィーチャ削除 ---
Sub DeleteExistingWorkFeatures(compDef As PartComponentDefinition, prefix As String)
On Error Resume Next
Dim toDelete As New List(Of Object)
For Each wp As WorkPoint In compDef.WorkPoints
If wp.Name.StartsWith(prefix & "_") Then toDelete.Add(wp)
Next
For Each wa As WorkAxis In compDef.WorkAxes
If wa.Name.StartsWith(prefix & "_") Then toDelete.Add(wa)
Next
For Each pl As WorkPlane In compDef.WorkPlanes
If pl.Name.StartsWith(prefix & "_") Then toDelete.Add(pl)
Next
For Each feat In toDelete
feat.Delete()
Next
On Error GoTo 0
End Sub' ==============================================================================
' iLogic: UCSから標準作業フィーチャ(点・軸・平面)を一括自動展開
' ==============================================================================
Sub Main()
Dim doc As PartDocument = TryCast(ThisDoc.Document, PartDocument)
If doc Is Nothing Then
MessageBox.Show("パーツファイル (.ipt) で実行してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Dim compDef As PartComponentDefinition = doc.ComponentDefinition
' 展開対象のUCS名を指定
Dim targetUcsName As String = "UCS_Origin"
' 1. 対象UCSの検索
Dim targetUCS As UserCoordinateSystem = Nothing
For Each ucs As UserCoordinateSystem In compDef.UserCoordinateSystems
If String.Compare(ucs.Name, targetUcsName, True) = 0 Then
targetUCS = ucs
Exit For
End If
Next
If targetUCS Is Nothing Then
MessageBox.Show("指定されたUCSが見つかりません: " & targetUcsName, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
' 2. 既存の同名作業フィーチャがあればクリーンアップ(再実行時の重複・エラー防止)
DeleteExistingFeature(compDef, targetUcsName)
' 3. 座標情報・ベクトルの抽出
Dim tg As TransientGeometry = ThisApplication.TransientGeometry
Dim originPt As Point = targetUCS.Origin.Point
Dim xVec As UnitVector = targetUCS.XAxisVector
Dim yVec As UnitVector = targetUCS.YAxisVector
Dim zVec As UnitVector = targetUCS.ZAxisVector
' 4. 作業点(Origin)の作成
Dim wpOrigin As WorkPoint = compDef.WorkPoints.AddFixed(originPt)
wpOrigin.Name = targetUcsName & "_Origin"
' 5. 作業軸(X / Y / Z)の作成
Dim waX As WorkAxis = compDef.WorkAxes.AddFixed(originPt, xVec)
waX.Name = targetUcsName & "_XAxis"
Dim waY As WorkAxis = compDef.WorkAxes.AddFixed(originPt, yVec)
waY.Name = targetUcsName & "_YAxis"
Dim waZ As WorkAxis = compDef.WorkAxes.AddFixed(originPt, zVec)
waZ.Name = targetUcsName & "_ZAxis"
' 6. 作業平面(XY / YZ / XZ)の作成
Dim planeXY As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, xVec, yVec)
planeXY.Name = targetUcsName & "_XYPlane"
Dim planeYZ As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, yVec, zVec)
planeYZ.Name = targetUcsName & "_YZPlane"
Dim planeXZ As WorkPlane = compDef.WorkPlanes.AddFixed(originPt, xVec, zVec)
planeXZ.Name = targetUcsName & "_XZPlane"
doc.Update()
MessageBox.Show(targetUcsName & " から以下の作業フィーチャを展開しました:" & vbCrLf & _
"- 作業点: 1" & vbCrLf & _
"- 作業軸: 3 (X, Y, Z)" & vbCrLf & _
"- 作業平面: 3 (XY, YZ, XZ)", "生成完了", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
' --- ヘルパー:同名フィーチャの削除処理 ---
Sub DeleteExistingFeature(compDef As PartComponentDefinition, prefix As String)
On Error Resume Next
Dim featuresToDelete As New List(Of Object)
For Each wp As WorkPoint In compDef.WorkPoints
If wp.Name.StartsWith(prefix & "_") Then featuresToDelete.Add(wp)
Next
For Each wa As WorkAxis In compDef.WorkAxes
If wa.Name.StartsWith(prefix & "_") Then featuresToDelete.Add(wa)
Next
For Each pl As WorkPlane In compDef.WorkPlanes
If pl.Name.StartsWith(prefix & "_") Then featuresToDelete.Add(pl)
Next
For Each feat In featuresToDelete
feat.Delete()
Next
On Error GoTo 0
End Sub
