UCS

### 自宅でできる事前準備(出社直後ワンクリック化)

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
タイトルとURLをコピーしました