



Random Thoughts |
I'm taking Lamaze classes. I'm not having a baby, I'm just having trouble breathing.
|

言語 |
|




|
 |
フォーラムニュース: 質問、相談カテゴリに「SolidWorks操作方法」に関するフォーラムを追加しました。(2003/11/27) |
いらっしゃい、 ゲストさん. まずはこちら→ ログイン または 登録. 2025/07/03 - 22:03:09 |
|
 |
|

著者
|
トピック: 図面シートフォーマット名の取得 (閲覧数 7380 回) |
|
rabby
新人さん 
オフライン
投稿: 5

|
 |
図面シートフォーマット名の取得
« 投稿日: 2004/08/04 - 20:38:28 » |
|
いつも拝見させていただいております。 初めての書き込みさせていただきます。
当方、図面テンプレートのシートフォーマットに 選択した注記を書き込むプログラムを作っております。 図面のシートフォーマットにはパーツやアセンブリからのプロパティリンクが張られているので、 一般ユーザーにはシートフォーマット編集をさせない為に、このようなプログラムを作っています。
基本的な動作は、 選択した文字を図面の決められた場所に決められた注記名で書き込みます。 また、書き込んだ注記を注記名をもとに選択し修正・削除するプログラムです。
書き込みは問題無いのですが、 修正・削除の場合、目的の注記を選択する為にSelectByIDを使用しているのですが、 オブジェクト名で必要な現在アクティブなシートのシートフォマット名が取得できずに困っています。 シートがデフォルトで用意されるものしか使用しなければ、 "シート フォーマット1"で良いのですが複数になった場合に対応できません。 どなたか図面のシートフォマット名を取得する方法をご存知ではないでしょうか? よろしくお願いします。
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:図面シートフォーマット名の取得
« 返信 #1 投稿日: 2004/08/05 - 08:36:15 » |
|
rabbyさん、はじめまして。
こんな感じでどうでしょうか?
|
|
|
|
rabby
新人さん 
オフライン
投稿: 5

|
 |
Re:図面シートフォーマット名の取得
« 返信 #2 投稿日: 2004/08/05 - 14:32:06 » |
|
Makaronさん、サンプルありがとうございます。
早速サンプル拝見させていただきました。 せっかく時間をさいて作っていただいたのですが、 私の説明がわかりにくかった為、誤解を招いてしまったみたいです。 申し訳ございません。
つまづいている部分を具体的に申しますと、 書き込まれた注記を選択する際、 DrawingDoc.Extension.SelectByID "Note@シート フォーマット1", "NOTE", 0, 0, 0, False, 0, Nothing) としています。 上の例で"Note@シート フォーマット1"の「@」前は、名前を付けて書き込んでいるので問題無く指定できます。 問題は「@」以下で、図面シートに書き込まれた注記であれば DrawingDoc.GetSheetNames或いは、Sheet.GetNameで取得出来ると思います。 しかし、今回のように図面テンプレートに書き込まれた注記の場合の取得に困っています。 またまたわかりにくい説明ですが、よろしくお願いします。
それと、使用バージョンを明記していなかったので追記しておきます。 SW2003 SP5
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:図面シートフォーマット名の取得
« 返信 #3 投稿日: 2004/08/05 - 15:50:17 » |
|
' 引用元: rabby 投稿日 '.timeformat('1091683926').' ' しかし、今回のように図面テンプレートに書き込まれた注記の場合の取得に困っています。
|
ここで書かれている 『図面テンプレート』とは、SolidWorksで言う図面のテンプレート(drwdot)ファイルのことですか? もし、そうだとしたら、なぜdrwdotを直接開いて処理するのでしょうか? 通常の図面を指定保存でdrwdotにしてしまえば、OKな様な気がします。
もう一つ確認させてください。 通常の図面(slddrw)の『図面シート』と『シートフォーマット』はOK。 テンプレート(drwdot)の『図面シート』はOK、『シートフォーマット』はNG。 ということでしょうか?
すみません、質問を質問で返してますが、どうでしょうか?
|
|
|
|
rabby
新人さん 
オフライン
投稿: 5

|
 |
Re:図面シートフォーマット名の取得
« 返信 #4 投稿日: 2004/08/05 - 17:14:41 » |
|
なかなかうまく説明できないですねー。
' 引用元: Makoron 投稿日 '.timeformat('1091688617').' ' ここで書かれている 『図面テンプレート』とは、SolidWorksで言う図面のテンプレート(drwdot)ファイルのことですか?
|
図面ファイル(*.slddrw)を開いて、右クリックの「シートフォーマット編集」を選んだ状態です。 APIヘルプで「図面テンプレート」と表現されていたのでこのように書きました。 最初の書き込みと表現を変えてしまった為、さらに混乱させてしまったようです。申し訳ありません。
やりたいことは、 「シートフォーマット編集状態で(図面テンプレートに)書き込まれた注記をプログラムから選択したい」 ということです。
引用: もう一つ確認させてください。 通常の図面(slddrw)の『図面シート』と『シートフォーマット』はOK。 テンプレート(drwdot)の『図面シート』はOK、『シートフォーマット』はNG。 ということでしょうか?
|
通常の図面、テンプレートともに、『シートフォーマット』はNGです。 テンプレート(*.drwdot)を直接開いて処理する作業はありませんので、 通常の図面(*.slddrw)を開いての作業だけを前提としています。
引用: すみません、質問を質問で返してますが、どうでしょうか?
|
いえいえ、私の説明がわかりにくくお手数をかけてしまってスミマセン。 こんな感じでわかりますでしょうか? まだ、わかりにくい点がありましたらどんどん突っ込んでください。
参考にJpgを添付します。 取得したいのは赤丸をつけた部分です。
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:図面シートフォーマット名の取得
« 返信 #5 投稿日: 2004/08/05 - 17:43:42 » |
|
もしかして、DrawingDoc::EditTemplateが抜けているのではないでしょうか。
私が使用しているのはSolidWorks2004sp4.1なので正確かどうかわかりませんが、 図面を作成し、図面シートとシートフォーマットに注記を作成して、マクロの記録を行ってみました。 (1)図面シート上の注記を選択 (2)シートフォーマット編集に入る (3)シートフォーマット上の注記を選択 の手順で記録しました。
以下がそのマクロです。(不要な部分は消してあります。) Sub main() Dim swApp As Object Dim Part As Object Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc '(1)図面シート上の注記を選択 boolstatus = Part.Extension.SelectByID("詳細アイテム195@シート1", "NOTE", 0, 0, 0, False, 0, Nothing) '(2)シートフォーマット編集に入る Part.EditTemplate '(3)シートフォーマット上の注記を選択 boolstatus = Part.Extension.SelectByID("詳細アイテム196@シート フォーマット1", "NOTE", 0, 0, 0, False, 0, Nothing) '(図面シート編集に戻る) Part.EditSheet End Sub
この部分が原因であれば良いのですが... どうでしょうか?
|
|
|
|
rabby
新人さん 
オフライン
投稿: 5

|
 |
Re:図面シートフォーマット名の取得
« 返信 #6 投稿日: 2004/08/05 - 18:47:01 » |
|
' 引用元: Makoron 投稿日 '.timeformat('1091695422').' ' boolstatus = Part.Extension.SelectByID("詳細アイテム196@シート フォーマット1", "NOTE", 0, 0, 0, False, 0, Nothing)
|
この部分で困っています。 プログラムから選択する場合、「詳細アイテム196@シート フォーマット1」の「シート フォーマット1」が指定できないでいます。 現在アクティブなシートのシートフォーマット名(?)が取得出来ていない状況です。
例えば、 ===(省略)=== Part.EditTemplate set sheet=Part.GetCurrentSheet() strName=sheet.GetName () ==========
こんな風にしても、返ってくるのは「シート1」とかの普通のシート名ですし…。(当然ですね) ちなみに、オブジェクト名("詳細アイテム196@シート フォーマット1"の部分)を正しく指定していれば、 図面シート編集中でも図面シートフォーマットのオブジェクトを選択できるようです。 こんな状況なんですが、何か良い方法はないものでしょうか?
|
|
|
|
webmaster 管理人
議長 カタマリの王様!?     
オフライン
投稿: 649

|
 |
Re:図面シートフォーマット名の取得
« 返信 #7 投稿日: 2004/08/05 - 19:43:22 » |
|
ものすごく力技ですが、こんな方法はどうでしょう。
注記の挿入は問題なくできているようですから、挿入するときに直接文字列を入れずに、図面のカスタムプロパティのリンクを入れて、プロパティに表示させたい文字列を入力します。
これで変更したいときはそのカスタムプロパティを変更するだけですみます。 削除はわかりません。
|
webmaster (仕事のカタマリ管理人)
|
|
|
Tama
Jr. メンバー  
オフライン
投稿: 12

I'm a llama!
|
 |
Re:図面シートフォーマット名の取得
« 返信 #8 投稿日: 2004/08/05 - 22:55:59 » |
|
こんばんは〜、Tamaです。
アクティブなシートのシートフォーマットがわかればいいのですよね?
私のSW API虎の巻(むか〜し作った書類です)によると、シートのサブフィーチャーにシートフォーマットがあるからその名前を調べればよい、とあります。
サブフィーチャーをループして調べるときに、サブフィーチャーのTypeNameが"DrTemplate"かどうかで判断します。 (シートフォーマットフィーチャーのTypeNameが"DrTemplate"です)
SW2001の頃調べたので最近のバージョンでは動作しないかもしれません。  そのときはごめんなさい。
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:図面シートフォーマット名の取得
« 返信 #9 投稿日: 2004/08/06 - 10:11:18 » |
|
rabbyさん、こんにちわ。
私は、このシートフォーマット名にの取得に断念してしまいました。 (Tamaさんの方法でうまくいくと良いですね。)
で、別の方法を考えてみました。 『DrawingDoc.Extension.SelectByID "Note@シート フォーマット1", "NOTE", 0, 0, 0, False, 0, Nothing)』 (retval = ModelDocExtension.SelectByID ( Name, Type, X, Y, Z, Append, Mark, Callout )) で注記を選択しに行くことが出来るということは、 「Nameが確定している」か「X,Y,Zが確定している」のどちらかだと思います。
そこで、以下のコードで代用できないかと思って作ってみました。 Sub main() Dim swApp As SldWorks.SldWorks Dim swModelDoc2 As SldWorks.ModelDoc2 Dim swDrawingDoc As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swNote As SldWorks.note Dim vntPoint As Variant Dim strMsg As String '***** 図面オブジェクトを取得 ***** Set swApp = Application.SldWorks Set swModelDoc2 = swApp.ActiveDoc Set swDrawingDoc = swModelDoc2 '***** ビューオブジェクトの取得 ***** Set swView = swDrawingDoc.GetFirstView() '***** シート&シートフォーマット上の注記を取得 ***** Set swNote = swView.GetFirstNote '***** シート&シートフォーマット上の注記がなくなるまでループ ***** Do While Not swNote Is Nothing '***** 注記の内容を表示 ***** vntPoint = swNote.GetTextPoint strMsg = "" strMsg = strMsg & "Name =" & swNote.GetName & vbCrLf strMsg = strMsg & "Text =" & swNote.GetText & vbCrLf strMsg = strMsg & "TagName =" & swNote.TagName & vbCrLf strMsg = strMsg & "TextPoint=" & vntPoint(0) & "," & vntPoint(1) & "," & vntPoint(2) MsgBox strMsg '***** 注記を操作 ***** swNote.SetText "文字追加" & swNote.GetText swNote.SetText swNote.GetText & "文字追加" swNote.SetText Replace(swNote.GetText, "文字追加", "置き換え") swNote.SetText Replace(swNote.GetText, "置き換え", "") '***** 次の注記を取得 ***** Set swNote = swNote.GetNext Loop End Sub
これに、「Name」か「X,Y,Z」のIF文を追加して、Noteオブジェクトを特定してから編集や削除が行えると思います。
|
|
|
|
rabby
新人さん 
オフライン
投稿: 5

|
 |
Re:図面シートフォーマット名の取得
« 返信 #10 投稿日: 2004/08/06 - 15:36:34 » |
|
管理人さん、Tamaさん、Makoronさんこんにちは。 皆様の意見を参考に色々試してみました。
管理人さん> 最初はカスタムプロパティに書き込むことも考えました。 しかし、書き込む文字は決められた枠内に収めなければならず、時には複数行になることもあり、 そのときはカスタムプロパティは一行しか表現できないと思い込んでおり断念していました。 今改めて試してみると、SolidWorksからプロパティウィンドウを開いて 書き込む場合は複数行書けなさそうですが、プログラムからCustominfo2で書き込めば複数行書ける事を確認しました。 削除の場合は、とりあえず空白文字でも入ておけば実用できそうですね。
Tamaさん> 私もツリー表示されているので、サブフィーチャーを調べて Feature.Nameで取得できないか試してみたことがありました。 例えば、表示されているツリーが
Draw1 ├アノテートアイテム ├ブロック登録 └モデル └シートフォーマット1
の場合、 「モデル」の最初の子フィーチャーの名前を取得すると「平面1」となってしまい、 てっきりパートモデルの子フィーチャーを見に行っているものと勘違いしてあきらめていました。 今回、同列の子フィーチャー全てを調べてみたら最後のフィーチャーで「シートフォーマット1」を取得できました。 今から考えると、今一歩だったんですね。  しかし、他のフィーチャー「平面1」、「スケッチ1」、「詳細フォルダー1」は何でしょうね。 
Makoronさん> はっ!  注記は必ず決められた場所に書き込まれるので、座標からオブジェクトの取得は出来きますね。 「灯台下暗し」でした。
このように、皆様のおかげで無事解決できました。 どうもありがとうございました。 解決できたところか、2つもお土産をいただいてしまって…。感謝です。 これからどの方法を使おうか、また悩んでしまいそうです。 
最後に、今更ながらですが途中の書き込みで、添付し忘れていましたね。スミマセン。
|
|
|
|
Tama
Jr. メンバー  
オフライン
投稿: 12

I'm a llama!
|
 |
Re:図面シートフォーマット名の取得
« 返信 #11 投稿日: 2004/08/06 - 22:48:02 » |
|
うまく動いたようで、よかったです。 私も、SolidWorks 2003,2004で試してシートフォーマット名が取れるのがわかったので安心しました。 
「平面1」、「スケッチ1」などのフィーチャーはSolidWorksの3Dと2Dの動作を同じ処理で実現するためのつじつま合わせのためにあるのではないかと思います。APIを触られているとわかると思いますが、モデルでのスケッチと図面でのスケッチは同じものですし、図面ビューはモデルの特定の表示方向を投影することで実現しているようにみえます。通常は図面で平面やスケッチが見えていても仕方がないので隠してあるのだと想像します。
もうひとつの方法のことですけど、図面で注記を座標を元に選択しようとすると、図面が全体表示されているようなときは選択に失敗することがあります。実はこれでかなり困った経験があります。 
注記の名前かタグ名をたとえば"NOTE_MATERIAL"のように変更しておけば、どのサイズの図面でも同じ処理で動かせるようになりますよ。
|
|
|
|
|
|
|

|