



Random Thoughts |
There are three kinds of people: those who can count, and those who can't.
|

言語 |
|




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

著者
|
トピック: APIで直径寸法設定できない (閲覧数 7449 回) |
|
mic20
新人さん 
オフライン
投稿: 5

I'm a llama!
|
 |
APIで直径寸法設定できない
« 投稿日: 2008/12/24 - 15:02:45 » |
|
はじめまして、 APIの初心者です。
SolidWorks 2007 SP5でプログラムを書いていますが、なかなかできないことがありますので、皆様からの教示をお願い致します。
やりたいこと: *部品を回転フィーチャで作成し、保存する *のそ部品から2D図面を作成する
問題点: *部品作成する時、回転軸を描き、スケッチを描き、寸法と拘束を入れましたが、中心線までの寸法はどうすれば直径寸法に変わるのでしょうか、色々試しましたがうまくできません。 手入力の場合は、中心線の向こう側にマウスを置くで自動的に変わることは知っていますが、APIではどうすればよいのでしょうか?
なぜ直径寸法がほしいかといいますと、図面を作成するときに、モデルアイテムの挿入だけで全ての寸法、公差が入力されるため(せっかく部品作成するときに公差を入れたので2度手間はちょっと。。。)
部品作成ソースは抜粋して、以下のように書いています: 。。。。変数宣言等 Dim BushOuterRadius = 10 Private Function AutoCreate_CorePin() CorePin_BaseDepth = 10 CorePin_PinDepth = 10 swApp.SetUserPreferenceToggle swInputDimValOnCreate, False 'Turn off dimension input dialog Set swModel = swApp.NewPart swModel.SetUserPreferenceIntegerValue swUnitsLinear, SwConst.swMM Set swSelMgr = swModel.SelectionManager Set swFeatMgr = swModel.FeatureManager swModel.SetAddToDB False 'Turn on snapping 'Sketching swModel.InsertSketch2 False swModel.CreateLine2(0, 0, 0, 0, 0.03, 0).ConstructionGeometry = True '中心線 swModel.CreateLine2 0, 0, 0, BushOuterRadius / 1000, 0, 0 'CorePin base line swModel.CreateLine2 BushOuterRadius / 1000, 0, 0, BushOuterRadius / 1000, CorePin_BaseDepth / 1000, 0 'CorePin base depth '寸法と公差を追加 boolstatus = swModel.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0, 0.016, 0, True, 0, Nothing, 0) '寸法を中心線の左側において、直径寸法になってほしいですが。。。一般寸法しかなりませんでした swModel.AddDimension2 -0.005, 0.005, 0 swModel.EditDimensionProperties2 swTolBILAT, 0, -0.01 / 1000, "", "", 1, 9, 2, 1, 11, 11, "<MOD-DIAM>", "", 1, "", "", 0 ' boolstatus = swModel.Extension.SelectByID2("D1@スケッチ1", "DIMENSIONS", 0, 0.005, 0, True, 0, Nothing, 0) 'SolidWorks APIヘルプで、swDispDim.Diametricがあって直径寸法に変更できるとかいていますが。。。 Set swDispDim = swSelMgr.GetSelectedObject5(1) 'この寸法のタイプは、Linearタイプになっているため、swDispDim.Diametricが利かない Debug.Print swDispDim.GetType swDispDim.Diametric = True If swDispDim.Diametric Then Debug.Print "swDispDim.Diametric = True" Else Debug.Print "swDispDim.Diametric = False" End If End Function
以上、よろしくお願い致します。
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:APIで直径寸法設定できない
« 返信 #1 投稿日: 2008/12/25 - 11:35:59 » |
|
mic20さん、なじめまして。 Makoronです。
貼り付けてあるコードを基に、私もテストしてみました。 しかし、mic20さんがおっしゃられる様に、swDispDim.Diametric は動作してくれませんでした。 直径寸法にする為の方法をいろいろと考えたり、試してみたりしたのですが、見つかりませんでした・・・ 
そこで、直径寸法を何とか表現できないかと考えてみたところ、穴ウィザードで使っている方法が使えそうな事に気がつきました。 それは、中心線の反対側に、作図線で輪郭線と対称な線を描き、輪郭線と作図線を選択して寸法を作成する。 と言う方法です。 一応、サンプルマクロも作成したので、使えそうであれば参考にしてみてください。
追伸: 多分、この問題は「バグ」というより「仕様」の様な気がします。 なぜなら、穴ウィザードのスケッチも、直径寸法という設定ではなく、対称な作図線をわざわざ使用しているからです。 APIからは操作できない、と言うより、APIからの操作は考えていないか、要望が少ないから作っていない。ではないでしょうか。 ただ、バグかもしれないので代理店に問い合わせしても良いかもしれませんね。
|
|
|
|
mic20
新人さん 
オフライン
投稿: 5

I'm a llama!
|
 |
Re:APIで直径寸法設定できない
« 返信 #2 投稿日: 2008/12/25 - 13:06:48 » |
|
makoronさん、 早速のご返信、ありがとうございます。
' 引用元: Makoron 投稿日 '.timeformat('1230172559').' ' 貼り付けてあるコードを基に、私もテストしてみました。 しかし、mic20さんがおっしゃられる様に、swDispDim.Diametric は動作してくれませんでした。 直径寸法にする為の方法をいろいろと考えたり、試してみたりしたのですが、見つかりませんでした・・・ 
|
そうですか :'( 色々調べていただいて、ありがとうございます。
引用: そこで、直径寸法を何とか表現できないかと考えてみたところ、穴ウィザードで使っている方法が使えそうな事に気がつきました。 それは、中心線の反対側に、作図線で輪郭線と対称な線を描き、輪郭線と作図線を選択して寸法を作成する。 と言う方法です。 一応、サンプルマクロも作成したので、使えそうであれば参考にしてみてください。
追伸: 多分、この問題は「バグ」というより「仕様」の様な気がします。 なぜなら、穴ウィザードのスケッチも、直径寸法という設定ではなく、対称な作図線をわざわざ使用しているからです。 APIからは操作できない、と言うより、APIからの操作は考えていないか、要望が少ないから作っていない。ではないでしょうか。 ただ、バグかもしれないので代理店に問い合わせしても良いかもしれませんね。
| サンプルを試してみました。確かにちょっと手間になりますが、この方法で出来るようになりますね。 ソースも拝見しました。初心者の私と書き方が違いますね。。。参考させていただきます。
で、例の穴ウィザードですが、私のPCでは、対称作図線が見当たりません(ちょっと不思議)。なので、代理店に問い合わせて見ます。
またよろしくお願い致します。
|
|
|
|
hisa
カタマリの王様!?     
オフライン
投稿: 507

PANDA-Z!!
|
 |
Re:APIで直径寸法設定できない
« 返信 #3 投稿日: 2008/12/25 - 13:09:55 » |
|
mic20さん、はじめまして 
回転フィーチャーで作成との事ですが、回転フィーチャーを作成した時点で寸法タイプが swDiameterDimension(swRadialDimension)へ切り替わるようです。
なので、回転フィーチャー作成後に寸法にアクセスすればswDispDim.Diametricが 動作しました 
APIで直径表示を操作した時点では、直径表示が変なことになりますが、スケッチ編集を 終了すれば、正常に戻ります  (追記:おかしくなったのは、直径からswDispDim.Diametricで半径表示にしたときだけでした…)
検証環境はmic20さんと同じです
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:APIで直径寸法設定できない
« 返信 #4 投稿日: 2008/12/25 - 13:18:42 » |
|
引用:で、例の穴ウィザードですが、私のPCでは、対称作図線が見当たりません(ちょっと不思議)。なので、代理店に問い合わせて見ます。 |
おっと、早とちりしたかも・・・。 急いで確認したら、基本的な部分は対称線を使ってませんでした。 下きり等の円錐部分に作図線を使ってました。 (間違いです、ごめんなさい。)
引用:回転フィーチャーで作成との事ですが、回転フィーチャーを作成した時点で寸法タイプが swDiameterDimension(swRadialDimension)へ切り替わるようです。 |
hisaさん、さすがです。(フィーチャーを作ってしまう所まで頭がまわりませんでした。)
と言うことで、mic20さん、hisaさんの方法で試して下さいね。
|
|
|
|
hisa
カタマリの王様!?     
オフライン
投稿: 507

PANDA-Z!!
|
 |
Re:APIで直径寸法設定できない
« 返信 #5 投稿日: 2008/12/25 - 13:46:15 » |
|
' 引用元: Makoron 投稿日 '.timeformat('1230178722').' 'hisaさん、さすがです。(フィーチャーを作ってしまう所まで頭がまわりませんでした。) |
いえいえ^^;
実は、この回答に至るまでにMakoronさんと同じ道を通っていたりします(恐らく Makoronさんのレスを確認して、「やっぱダメかぁ・・・」と思ってた矢先に、 「あ、確か何かで寸法に勝手にΦやRが付いたなぁ・・・」とかすかな記憶が蘇り、 試してみた結果です  (と言うことは、mic20さんのコードにある、プレフィックスの"<MOD-DIAM>"追加も 省けますね)
|
|
|
|
mic20
新人さん 
オフライン
投稿: 5

I'm a llama!
|
 |
Re:APIで直径寸法設定できない
« 返信 #6 投稿日: 2008/12/25 - 13:54:30 » |
|
hisaさん、Makoronさん
感謝、感謝です。 
早速ためしてみます。
回転フィーチャを作成してからスケッチを変更してみたらどうかなって、思ったことありましたが、確認するまでは手がまわりませんでした(ちょっとくやしいい)。もっと頑張らなきゃ。。。 
|
|
|
|
mic20
新人さん 
オフライン
投稿: 5

I'm a llama!
|
 |
Re:APIで直径寸法設定できない
« 返信 #7 投稿日: 2009/01/06 - 15:48:28 » |
|
Makoronさん、hisaさん
hisaさんが教えていただいた方法で、うまくできました ありがとうございました。
他の方が参考するために書いておきます: *スケッチを描くときに、寸法を挿入(その時は一般寸法になっています) *回転フィーチャを作成 *回転フィーチャにアクセスし、寸法タイプを変更する(スケッチを編集しなくてもできるのです)。必要に応じて公差を設定
以下が私が書いたコードです(変数の宣言等省きますので動かないけど参考の程度で。。。):
Set swFeature = swModel.FirstFeature Do While Not swFeature Is Nothing '回転フィーチャを探す If "Revolution" = swFeature.GetTypeName Then Exit Do End If Set swFeature = swFeature.GetNextFeature Loop '公差設定+直径寸法に変更 Set swDispDim = swFeature.GetFirstDisplayDimension Do While Not swDispDim Is Nothing Set swDim = swDispDim.GetDimension If swRadialDimension = swDispDim.GetType Then '直径寸法に変更 swDispDim.Diametric = True End If '公差設定 If swDim.Name = "D5" Then swDim.SetToleranceType swTolSYMMETRIC swDim.SetToleranceValues 0, 0.01 / 1000 End If Set swDispDim = swFeature.GetNextDisplayDimension(swDispDim) Loop
--------------------------------------------------- 注記: *このやり方では、全ての半径寸法は直径寸法に変更されます *Dimension::SetToleranceTypeはDimensionTolerance::Typeにいれられるようですが、面倒(やりかた分かりません)なので無視しています。 やりかたが分かる方、教示していただければ嬉しいですが
|
|
|
|
Makoron
カタマリの王様!?     
オフライン
投稿: 1277

SW2011SP5.0
|
 |
Re:APIで直径寸法設定できない
« 返信 #8 投稿日: 2009/01/07 - 10:10:24 » |
|
mic20さん、こんにちは。
今までフィーチャーを作るマクロを作ったことが無かったので、勉強も兼ねてサンプルを作ってみました。 前に添付したマクロに、mic20さんコードを取り入れて作りました。 また、DimensionTolerance::Typeを使ってみたので、確認してみてください。
|
|
|
|
hisa
カタマリの王様!?     
オフライン
投稿: 507

PANDA-Z!!
|
 |
Re:APIで直径寸法設定できない
« 返信 #9 投稿日: 2009/01/07 - 13:31:10 » |
|
' 引用元: mic20 投稿日 '.timeformat('1231224508').' '注記: *このやり方では、全ての半径寸法は直径寸法に変更されます |
"半径(直径)寸法が定義された元エンティティが2つとなる場合"と限定すれば、 軸径寸法だけ直径表示に切り替えられると思います。
具体的には、 Do While Not swDispDim Is Nothing Set Annotation = swDispDim.GetAnnotation If swRadialDimension = swDispDim.GetType And Annotation.GetAttachedEntityCount2 = 2 Then '直径寸法に変更 swDispDim.Diametric = True End If '公差設定 If swDim.Name = "D5" Then swDim.SetToleranceType swTolSYMMETRIC swDim.SetToleranceValues 0, 0.01 / 1000 End If Set swDispDim = Feature.GetNextDisplayDimension(swDispDim) Loop
こんな感じです
|
|
|
|
|
|
|

|