C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

技術的なオブジェクト?1

最近になりイロイロと調べていたら、Productクラスの
GetTechnologicalObject関数にたどり着きました。
この関数は使った事が無く、存在も知りませんでした。

GetTechnologicalObject関数の引数はString型(文字列)なのですが、
引数String型の場合、何を渡したら良いのか不明な場合が多いです。
(ワークベンチを取得する、DocumentクラスGetWorkbench関数もそうです)


幸いCOEにこんな記載がありました。

COE : Forums : GetTechnologicalObject() Method

確かにAutomationManualに多数のサンプルが有る為、そこから抜き出して
きたようです。

幾つか試したところ、上手く取得できたり出来なかったりします。
ネーミング的にもライセンスの必要そうなものも有りそうです。
そこでリンク先の状態では使用しにくいため、TechnologicalObject名
だけを抜き出したテキストファイルを作成し、
「C:\temp\TechnologicalObject.txt」として保存します。

AnnotatedViews
ArrangementProduct
AssemblyFeatures
CATAnnotationSets
Clashes
ClashResults
Constraints
Distances
Dressups
FastenerWorkBench
ActiveTask
BasicDevice
DOFState
EHMInsertionActPlugMapViewData
GenericAction
GenericActionFactory
GEPosition
GrabAct
Groups
HumanActsFactory
Hyperlinks
Inertia
Marker3Ds
Merges
Mechanisms
MountActivity
MountManager
MoveActionActivity
MoveHomeAct
MoveJointsAct
OLPTranslator
Operation
OrderGenerator
ParameterProfilesFactory
PERT
PertNode
PPRLoader
Product
ProductScenes
PspWorkbench
ReleaseAct
ResourceProgramManager
RobotMotion
RobotTaskFactory
SchematicRoot
Sections
Simplifications
SimulationInitState
StructureFoundations
StructureMembers
StructureObjectFactory
StructurePlates
TCPTraceManagerGraphics
TCPTraceManager
Tag
TagFactory
TagGroup
TagGroupFactory
ThreeDCuts
UnmountActivity
VibrationVolumes
WorkPackageLoader

続いてこのファイルを読み込み、GetTechnologicalObject関数を実行し
成功したもののみを出力するマクロを作成しました。

'vba GetTechnologicalObjectテスト
Sub TechnologicalObject_test()
    Dim Path As String: Path = "C:\temp\TechnologicalObject.txt"
    Dim list: list = ReadFile(Path)
    Dim Prod As Product: Set Prod = CATIA.ActiveDocument.Product
    
    Dim TecOj As Variant: Set TecOj = Nothing
    Dim S As String: S = vbNullString
    Dim Cnt As Long: Cnt = -1
    
    Debug.Print "** start **"
    For I = 0 To UBound(list)
        S = list(I)
        On Error Resume Next
            Set TecOj = Prod.GetTechnologicalObject(S)
            Cnt = TecOj.Count
        On Error GoTo 0
        If Not (TecOj Is Nothing) Then
            Debug.Print S + " : " + TypeName(TecOj) + " : " + CStr(Cnt)
        End If
        Set TecOj = Nothing
        Cnt = -1
    Next
    Debug.Print "** end **"
    
End Sub

' *** IO ***
'FileSystemObject
Private Function GetFSO() As Object
    Set GetFSO = CreateObject("Scripting.FileSystemObject")
End Function

'ファイル読み込み
Private Function ReadFile(ByVal Path) As Variant
    With GetFSO.GetFile(Path).OpenAsTextStream
        ReadFile = Split(.ReadAll, vbNewLine)
        .Close
    End With
End Function

イミディエイトウインドウには、成功した場合のみ
「渡した文字列:取得したオブジェクト型名:カウントプロパティ値」
が表示されます。
多くのTechnologicalObjectは、カウントプロパティを持っている事に
気が付いた為このようにしています。
(-1はカウントプロパティ持っていない 0はカウントプロパティを持っているが
 現状利用できない ことを意味します)


これをCATProductを開いた状態で実行します。
ライセンスによって結果が変わると思いますが、僕の方で実行した結果は
こちらです。

** start **
AnnotatedViews : AnnotatedViews : 0
AssemblyFeatures : AssemblyFeatures : 0
CATAnnotationSets : AnnotationSets : 0
Clashes : Clashes : 0
ClashResults : ClashResults : 0
Distances : Distances : 0
Groups : Groups : 0
Hyperlinks : Hyperlinks : 0
Inertia : Inertia : -1
Marker3Ds : Marker3Ds : 0
Sections : Sections : 0
** end **

大量に有ったリストからこれだけしか使用できなさそうです。
Inertiaを除き、何れもカウントプロパティ値が0の為、現状では利用が出来ない
状態で、ここから先はサンプルコードを読み解くしかなさそうです。