Replace関数の使い方の質問

192 views
Skip to first unread message

宇治抹茶

unread,
Jan 30, 2017, 6:14:23 AM1/30/17
to Autodesk Inventorユーザ会
お久しぶりです、宇治抹茶です。

Replace関数について質問です。

現在A.ipt、B.ipt、C.ipt、D.ipt から成るiamを全てA.iptで置き換えたいと思っています。
なので

Component.Replace(B.ipt, A.ipt,False) 
Component.Replace(C.ipt, A.ipt,False) 
Component.Replace(D.ipt, A.ipt,False) 

というiLogicを使っているのですが、場合によってはどれか1つ以上を使わない場合があるので、例えばC.iptを使わない場合
2行目で「C.iptが見つかりません」とエラーが出てしまいます。

これをスルーしてReplace関数を使う方法はないものでしょうか・・・。

ご教授ください!

やまら

unread,
Jan 30, 2017, 8:57:27 PM1/30/17
to Autodesk Inventorユーザ会
こんにちわ。

ちょっと見てみましたが、iLogicだけでは難しいかもしれませんね。
VBAか何かで、アセンブリ内に含まれるC.iptなりの個数を返す関数を作れば良いのかも。
ちょっと時間が無いので、またあとで試してみます。

2017年1月30日月曜日 20時14分23秒 UTC+9 宇治抹茶:

いとう

unread,
Jan 31, 2017, 8:40:47 PM1/31/17
to Autodesk Inventorユーザ会
ご無沙汰してます。
Replaceはよく使ってます。

やはり複雑な事をやりたくなったらVBAの方が自由が効くでしょうね。
最初はiLogicの方がとっつきやすいかもしれませんが、複雑な事をやろうと思うと、結局VBAのコードを勉強しないといろいろな事は出来ないので、
「だったら最初からVBAで作った方が…」と思います。

今回エラーが起きるのは、コードに書いてあるファイルが見つからないのが原因なので、マクロ等で自動化するのであれば、ファイル名をコードにいちいち書かずに、いろんな場合でも対応できるようにしておいた方が、応用が効いて良いと思います。

というわけで、最初に配置したコンポーネントに全部置換するマクロを書いてみました。VBAエディタにそのまま貼り付ければ、どんなアセンブリファイルでも動くと思います。
ループの回し方や条件分岐を工夫すれば、いろいろ出来ると思いますので、
研究してみて下さい。

Sub RepOcc()
    
    ' 開いているアセンブリを定義
    Dim oDoc As AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument
    
    ' オカレンス(コンポーネント)にアクセスする為の定義
    Dim oCompOccs As ComponentOccurrences
    Set oCompOccs = oDoc.ComponentDefinition.Occurrences
    
    ' 最初のオカレンスのフルパスを格納
    Dim FirstOccName As String
    
    ' 条件分岐用
    Dim bFirstOcc As Boolean
    bFirstOcc = False
    
    Dim oCompOcc As ComponentOccurrence
    Dim oCompOccDoc As Document
    
    ' アセンブリ内の全てのオカレンスをoCompOccに一時的に代入し
    ' 最初のオカレンスと違うものを全て置換する
    For Each oCompOcc In oCompOccs
        
        ' オカレンスからは直接ファイルの内容に辿り着けないので
        ' Documentとして取得する
        Set oCompOccDoc = oCompOcc.Definition.Document
        
        ' 最初のオカレンスのフルパスを取得
        If bFirstOcc = False Then
            FirstOccName = oCompOccDoc.FullFileName
            bFirstOcc = True
        End If
        
        ' 実際の置換作業
        If oCompOccDoc.FullFileName <> FirstOccName Then
            Call oCompOcc.Replace(FirstOccName, False)
        End If
    Next
    
End Sub

2017年1月31日火曜日 10時57分27秒 UTC+9 やまら:

やまら

unread,
Jan 31, 2017, 10:22:25 PM1/31/17
to Autodesk Inventorユーザ会
VBAでComponentの個数を数える関数を作ろうとしたけど、iLogicが戻り値を取れないということが判明しました。
VBAで、0個時のエラーを無視するMyReplaceサブルーチンを作るしかないかなと思います。
そうなると、iLogicじゃなくて、全てVBAで良いんじゃない? って気もします。

あぁそうか、iLogicだけでもThisApplicationから辿って行ってOccurrencesを獲得して、それをなめてComponentがあるかどうかを事前に確認すれば良いのか。
また夜にでもチャレンジしてみます。

でも、いとうさんもおっしゃられる通り、そろそろVBAに移行しても良いのでは、と思いますね。

やまら

unread,
Feb 1, 2017, 8:25:30 PM2/1/17
to Autodesk Inventorユーザ会
iLogicで"Part1.ipt"のオカレンス数を表示するコードを書きました。
あとはお好きにどうぞ。

Dim occ as ComponentOccurrence
Dim occs as ComponentOccurrences
Dim count As Integer

occs = ThisApplication.ActiveEditDocument.ComponentDefinition.Occurrences

For Each occ in occs
    If Dir(occ.Definition.Document.FullDocumentName) = "Part1.ipt"
        count = count + 1
    End If
Next
    
MsgBox (count)
Message has been deleted

宇治抹茶

unread,
Feb 2, 2017, 1:45:32 AM2/2/17
to Autodesk Inventorユーザ会
>>やまらさん いとうさん

おお、ありがとうございます!

コンポーネントやオカレンスを指定する際のVBAはさっぱり触ったことがないので、こういう構文で書くのも知りませんでした。勉強になります。

送っていただいたコードをいじって、早速VBAの海に挑戦してみようと思います。

ありがとうございました!

宇治抹茶

unread,
Feb 2, 2017, 1:49:13 AM2/2/17
to Autodesk Inventorユーザ会
ちなみに、こういうコンポーネントやオカレンスをいじる際の

構文が勉強できる本もしくはサイトってご存じありませんか? 

やまら

unread,
Feb 2, 2017, 8:21:56 AM2/2/17
to Autodesk Inventorユーザ会
ちなみに、私の示したコードはiLogicのものです。
VBAでもそのまま動くかもしれません。
いま見直したら、countを0に初期化するのを忘れていますね。

> 構文が勉強できる本もしくはサイトってご存じありませんか?
ひたすらヘルプを読んで勉強するしかないかも。
とっかかりが掴めないと、しんどいかもしれません。
Object, Document, Definition, Occurrence, Proxyなど、同じようなものが出てきます。
これらの世界観がわかるまで、何のことやら・・・となると思います。
という私も、良くはわかっていません(苦笑
VBAでコードを書くときは、その都度、helpやwatchでツリーを見ながら、目的のmethodなりpropertyなりを探しています。

宇治抹茶

unread,
Feb 3, 2017, 2:26:52 AM2/3/17
to Autodesk Inventorユーザ会
なるほど。ほぼ独学といった感じなのですね。

了解しました。ありがとうございます。 

いとう

unread,
Feb 7, 2017, 3:54:21 AM2/7/17
to Autodesk Inventorユーザ会
ヘルプのサンプルファイルが最大の情報源だと思います。
あとは、英語のフォーラムを覗いてみたりですね。

わたしが最初に勉強したのは
My First Plug-in Training(英語)
Visual Studioが必要になりますが、こちらに慣れるとInventorに付いてくるVBAエディタは不便で仕方なくなりますよ。

以下はある程度マクロが組めるようになってから読みました。
カスタマイズ系ブログ(最近はForgeの話ばっかり)
Inventor2017 APIトレーニング日本語版

とにかくサンプルプログラムを1行ずつ走らせながら改造していくのが、一番の近道だと思います。頑張って下さい!

2017年2月3日金曜日 16時26分52秒 UTC+9 宇治抹茶:
なるほど。ほぼ独学といった感じなのですね。

了解しました。ありがとうございます。 
Reply all
Reply to author
Forward
0 new messages