最近になりイロイロと調べていたら、Productクラスの
GetTechnologicalObject関数にたどり着きました。
この関数は使った事が無く、存在も知りませんでした。
GetTechnologicalObject関数の引数はString型(文字列)なのですが、
引数String型の場合、何を渡したら良いのか不明な場合が多いです。
(ワークベンチを取得する、DocumentクラスGetWorkbench関数もそうです)
幸いCOEにこんな記載がありました。
確かに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の為、現状では利用が出来ない
状態で、ここから先はサンプルコードを読み解くしかなさそうです。