これまでも何度か1行スクリプトを紹介しましたが、実行方法がブログ内検索でもヒットしない様子なので記述しておきます。
1.メニューより、「ウィンドウ」→「Ruby コンソール」
2.スクリプトを直接入力またはコピペしてEnter
2010年7月27日火曜日
曲線のみを全て選択するrubyスクリプト
例によって1行スクリプトです。
s=Sketchup.active_model.selection;Sketchup.active_model.active_entities.each{|i| s.add i if i.kind_of?(Sketchup::Edge) and i.curve}
使用例:
1.2D-DWGをインポートし、3Dモデルを作成する。
2.穴の情報はインポートした2Dデータをそのまま使いたい。
3.このスクリプトを使用し、コピーし、3Dモデル内で「所定の位置に貼り付け」を実施する。
その後、僕の場合は拙作の円、円弧、ポリゴンのセグメント数を減らすプラグインを実行し、データサイズを抑制します。
また、姉妹品として「面のみを全て選択するスクリプト」もあります。
s=Sketchup.active_model.selection;Sketchup.active_model.active_entities.each{|i| s.add i if i.kind_of?(Sketchup::Face)}
s=Sketchup.active_model.selection;Sketchup.active_model.active_entities.each{|i| s.add i if i.kind_of?(Sketchup::Edge) and i.curve}
使用例:
1.2D-DWGをインポートし、3Dモデルを作成する。
2.穴の情報はインポートした2Dデータをそのまま使いたい。
3.このスクリプトを使用し、コピーし、3Dモデル内で「所定の位置に貼り付け」を実施する。
その後、僕の場合は拙作の円、円弧、ポリゴンのセグメント数を減らすプラグインを実行し、データサイズを抑制します。
また、姉妹品として「面のみを全て選択するスクリプト」もあります。
s=Sketchup.active_model.selection;Sketchup.active_model.active_entities.each{|i| s.add i if i.kind_of?(Sketchup::Face)}
2010年7月26日月曜日
円の表示を拡大せずに中心を選択する方法
小さな円の中心を寸法ツールや線ツールで指定したいことってありますよね?通常は、ものすごく拡大し、円周上の端点でホバリングし、「端点」のヒントを出してから中心付近をホバリングし、「中心」のヒントを出してからクリックする方法で指定していると思います。
今日は拡大しなくても円の中心を指定できることを紹介します。この方法であれば、円が画面上点で表示されていても中心を指定できます。
「エンティティ情報」の画面を出しておきます。
1.円の上でホバリングし、「エンティティ情報」に「円」と表示させます。
2.カーソルを円から少し離します。(別のヒントが表示されることのない方向へ)
3.「中心」のヒントが表示されてからクリックします。
円を描いた直後だったり、円の中心を選択した直後だったりすると番号1の段階で「中心」のヒントが表示されることもあります。その場合はそのままクリックすれば指定できます。
今日は拡大しなくても円の中心を指定できることを紹介します。この方法であれば、円が画面上点で表示されていても中心を指定できます。
「エンティティ情報」の画面を出しておきます。
1.円の上でホバリングし、「エンティティ情報」に「円」と表示させます。
2.カーソルを円から少し離します。(別のヒントが表示されることのない方向へ)
3.「中心」のヒントが表示されてからクリックします。
円を描いた直後だったり、円の中心を選択した直後だったりすると番号1の段階で「中心」のヒントが表示されることもあります。その場合はそのままクリックすれば指定できます。
寸法ツールで円の中心を指定する場合の画面例。 青い点の下に小さな円があります。 カーソルの先端が完全に円から外れるくらいに離します。 |
2010年7月25日日曜日
xy平面に平行な線以外を選択解除するスクリプト
sel=Sketchup.active_model.selection; sel.each {|i| sel.remove(i) if (not i.kind_of?(Sketchup::Edge) or not i.start.position.z==i.end.position.z)}
yz平面に平行な線以外を選択解除
sel=Sketchup.active_model.selection; sel.each {|i| sel.remove(i) if (not i.kind_of?(Sketchup::Edge) or not i.start.position.x==i.end.position.x)}
xz平面に平行な線以外を選択解除
sel=Sketchup.active_model.selection; sel.each {|i| sel.remove(i) if (not i.kind_of?(Sketchup::Edge) or not i.start.position.y==i.end.position.y)}
これらのスクリプトは、ワイヤーフレームの三次元データを3D-DXFで入手し、そこから軽いモデルを作る作業の序盤で使用するために作成しました。
yz平面に平行な線以外を選択解除
sel=Sketchup.active_model.selection; sel.each {|i| sel.remove(i) if (not i.kind_of?(Sketchup::Edge) or not i.start.position.x==i.end.position.x)}
xz平面に平行な線以外を選択解除
sel=Sketchup.active_model.selection; sel.each {|i| sel.remove(i) if (not i.kind_of?(Sketchup::Edge) or not i.start.position.y==i.end.position.y)}
これらのスクリプトは、ワイヤーフレームの三次元データを3D-DXFで入手し、そこから軽いモデルを作る作業の序盤で使用するために作成しました。
2010年7月24日土曜日
rubyにて変数の名前と値をリストアップする方法
rubyにて、例えばglobal_variablesで変数の名前のリストを取得できることは知っていたのですが、その変数が持つ値も同時に取得する方法は知らないまま放置していました。
知ってしまえば基本だったのですが、ネットで逆引き的に検索してもすぐには答えが得られなかったので、一応書いておきます。
グローバル変数の名前と値をリストアップ
global_variables.sort.each{|i| print i,"\t",eval(i),"\n"}
インスタンス変数の名前と値をリストアップ
instance_variables.sort.each{|i| print i,"\t",eval(i),"\n"}
知ってしまえば基本だったのですが、ネットで逆引き的に検索してもすぐには答えが得られなかったので、一応書いておきます。
グローバル変数の名前と値をリストアップ
global_variables.sort.each{|i| print i,"\t",eval(i),"\n"}
インスタンス変数の名前と値をリストアップ
instance_variables.sort.each{|i| print i,"\t",eval(i),"\n"}
ローカル変数の名前と値をリストアップ
local_variables.sort.each{|i| print i,"\t",eval(i),"\n"}
これを調べ始めた理由は、円、ポリゴン、円弧ツールのデフォルトのセグメント数をSketchUp起動時に自動的に変更したかったからであり、どこかの変数を無理矢理上書きすることで実現できるのではないかと期待していたからです。しかし、それらの値を格納している変数を見つけることはできませんでしたので、結果的には無駄骨でした。でも勉強になったのでオーケイ!
Observerプラグインの紹介
僕が使用している数種類のObserverのうち、最近作成したプラグインを紹介します。ちなみにObserverの英語の意味は知りませんが、SketchUpではトリガーと同様の意味で解釈できます。ある条件が満足されたら自動的に実行されるプログラムのことです。
さて、SketchUpでは寸法を記入する機能が思い切り妥協されていますので、普段は寸法ツールをあまり使いません。寸法を測りたい時は線ツールかエンティティ情報かメジャーツールを使用します。しかし、他人が作ったモデルをコンポーネントとして使用する際に、その形状が正しいかを確認する作業は、やはり寸法が記入されている方が楽です。そんな訳で「見た目で邪魔にならないならばモデルには寸法が記入されている方が良い」と考え、このプラグインを開発しました。
ずばり、寸法を記入したら自動的にそのレイヤを「dimension」に変更するプラグインです。
下記をテキストファイルにコピペして拡張子を.rbに変更してPluginsフォルダに保存すると有効になります。これが有効な環境下で作成されたモデルでは、寸法がコンポーネントの中に記入されていようと、グループの中に記入されていようと、「レイヤ」ウィンドウでワンクリックで表示、非表示を切り換えできます。
class MyEntitiesObserver < Sketchup::EntitiesObserver
def onElementAdded(entities, entity)
if entity.kind_of?(Sketchup::Drawingelement) and (entity.typename=="DimensionLinear" or entity.typename=="DimensionRadial") then
layer = entity.model.layers.add "dimension"
entity.layer = layer
end #if
end #def
end #class
Sketchup.active_model.entities.add_observer(MyEntitiesObserver.new)
さて、SketchUpでは寸法を記入する機能が思い切り妥協されていますので、普段は寸法ツールをあまり使いません。寸法を測りたい時は線ツールかエンティティ情報かメジャーツールを使用します。しかし、他人が作ったモデルをコンポーネントとして使用する際に、その形状が正しいかを確認する作業は、やはり寸法が記入されている方が楽です。そんな訳で「見た目で邪魔にならないならばモデルには寸法が記入されている方が良い」と考え、このプラグインを開発しました。
ずばり、寸法を記入したら自動的にそのレイヤを「dimension」に変更するプラグインです。
下記をテキストファイルにコピペして拡張子を.rbに変更してPluginsフォルダに保存すると有効になります。これが有効な環境下で作成されたモデルでは、寸法がコンポーネントの中に記入されていようと、グループの中に記入されていようと、「レイヤ」ウィンドウでワンクリックで表示、非表示を切り換えできます。
class MyEntitiesObserver < Sketchup::EntitiesObserver
def onElementAdded(entities, entity)
if entity.kind_of?(Sketchup::Drawingelement) and (entity.typename=="DimensionLinear" or entity.typename=="DimensionRadial") then
layer = entity.model.layers.add "dimension"
entity.layer = layer
end #if
end #def
end #class
Sketchup.active_model.entities.add_observer(MyEntitiesObserver.new)
1行目:既存のクラスを参照する形式でクラスを作成
2行目:メソッドを作成(名前は変更できません)
3行目:追加されたエンティティが寸法かを判定
4行目:特定のレイヤを作成(既存だとしても問題なし)
5行目:エンティティのレイヤを変更
6,7,8行目:ブロック定義の終了を宣言
9行目:SketchUpのEntitiesクラスにObserverを追加
2010年7月23日金曜日
ビデオチュートリアル日本語版
画面がちょっと古いSketchUpですが、それでも英語よりはマシと思う方はSketchUp JAPANのWebページのビデオチュートリアルをどうぞ。
http://www.gsu.jp/tutorial
動画ではありませんが、山形雄次郎さんのWebページもわかりやすいと思います。
http://ayy18.exblog.jp/d2007-04-01
http://www.gsu.jp/tutorial
動画ではありませんが、山形雄次郎さんのWebページもわかりやすいと思います。
http://ayy18.exblog.jp/d2007-04-01
2010年7月22日木曜日
稀に役立つスクリプト(その1)
2本のエッジが交差または最も近接している場所にガイドポイントを描くスクリプトです。電線や配管などのモデルを作る際に、「この2本の間を最短距離で繋ぎたいんだけど」という場合に使います。
2本のエッジを選択した状態で「Ruby コンソール」に以下を入力して下さい。
m=Sketchup.active_model
s=m.selection
e=m.active_entities
p=Geom.closest_points s[0].line,s[1].line
p.each {|i| e.add_cpoint i}
僕はこの処理を下記の様に1行にまとめてテキストファイルに保存しています。
2本のエッジを選択した状態で「Ruby コンソール」に以下を入力して下さい。
m=Sketchup.active_model
s=m.selection
e=m.active_entities
p=Geom.closest_points s[0].line,s[1].line
p.each {|i| e.add_cpoint i}
1行目:変数mにModelクラスを登録。
2行目:変数sにSelectionクラスを登録。
3行目:変数eにEntitiesクラスを登録。
4行目:変数pに近接点の座標(2個)を登録。
(2本のLineクラスを元にGeomクラスのclosest_pointsメソッドで算出させる)
5行目:その座標にガイドポイントを描く。
僕はこの処理を下記の様に1行にまとめてテキストファイルに保存しています。
model=Sketchup.active_model;(Geom.closest_points model.selection[0].line,model.selection[1].line).each {|i| model.active_entities.add_cpoint i}
この様な、ツールバーやメニューに常駐させるほどの使用頻度ではないシンプルなスクリプトを多数、1個のテキストファイルにまとめ、必要に応じてその中の1行だけをコピペする、という使い方もお奨めです。ちょっと複雑なプラグインを開発する際の辞書代わりにもなります。
2010年7月21日水曜日
役に立たないスクリプト(その1)
プラグインの味見の味見くらいで・・・。
少し軽めのモデルを開き、Ruby コンソールに下記を入力すると面が50インチずつプッシュプルされます。(直方体だとあまり面白い結果にはならない)
Sketchup.active_model.start_operation "test"
e=[]
Sketchup.active_model.active_entities.each{|i| e<<i if i.kind_of?(Sketchup::Face)}
e.each{|i| i.pushpull 50}
1行目:2行目以降の処理の結果を1回の「元に戻す」で戻せるように宣言。
2行目:変数(リスト)を作成。
3行目:面のオブジェクトだけをリストに追加。
4行目:面を1つずつプッシュプル
ちなみに、2行目と4行目を省略しようとして下記の通り入力すると、モデルによってはハングアップに近い状態になってしまうためご注意下さい。(繰り返し処理の途中で処理の対象が増減しかねないため)
Sketchup.active_model.active_entities.each{|i| i.pushpull 50 if i.kind_of?(Sketchup::Face)}
少し軽めのモデルを開き、Ruby コンソールに下記を入力すると面が50インチずつプッシュプルされます。(直方体だとあまり面白い結果にはならない)
Sketchup.active_model.start_operation "test"
e=[]
Sketchup.active_model.active_entities.each{|i| e<<i if i.kind_of?(Sketchup::Face)}
e.each{|i| i.pushpull 50}
1行目:2行目以降の処理の結果を1回の「元に戻す」で戻せるように宣言。
2行目:変数(リスト)を作成。
3行目:面のオブジェクトだけをリストに追加。
4行目:面を1つずつプッシュプル
ちなみに、2行目と4行目を省略しようとして下記の通り入力すると、モデルによってはハングアップに近い状態になってしまうためご注意下さい。(繰り返し処理の途中で処理の対象が増減しかねないため)
Sketchup.active_model.active_entities.each{|i| i.pushpull 50 if i.kind_of?(Sketchup::Face)}
良く使うプラグイン
PurgeAll.rb
使用されていないコンポーネント、マテリアル、レイヤ、スタイルを削除します。無駄が削除されるとファイルサイズが小さくなります。
cleanup_model.rb
面を持っていない線を消します。線を消しても面が維持される場合はその線も消します。最新版では改善されているかもしれませんが、部分的に面が消えてしまうことがあったので少し改造して使ってます。
2010年7月18日日曜日
プラグインを作ろうと思う3つの理由
理由;
- 数十回のクリックが必要となる処理を数回のクリックに抑えたい。
- 標準機能にはない機能を追加したい。
- 単純な処理でも多数のファイルまたはコンポーネントを対象に処理したい。
背景;
まだ誰もそのプラグインを公開していなかった、または見つけられなかった。
ちなみに、僕が開発するプラグインは理由3に偏っています。作る上での技術レベルとしては理由2が最も難しいので、いくつかアイデアはあるのですが力不足で実現できていません。例えば、下記はSketchUpを使い始めた当初から感じているのですが、実現できないままです。
ちなみに、僕が開発するプラグインは理由3に偏っています。作る上での技術レベルとしては理由2が最も難しいので、いくつかアイデアはあるのですが力不足で実現できていません。例えば、下記はSketchUpを使い始めた当初から感じているのですが、実現できないままです。
- 円ツールとポリゴンツールを回転ツールまたは分度器ツールの様に、中心軸をドラッグで指定できるようにしたい。
- ポリゴンツールでは対角半径だけでなく対面半径でも指定できるようにしたい。
2010年7月17日土曜日
プラグインの実行
完成したプラグインは使いやすいようにツールバーを作ったりメニューを作ったりしますが、開発中はそうでもありません。プラグインの実行方法を何種類か紹介しておきます。
1.直接入力
例えば、「Ruby コンソール」に「Sketchup.active_model.entities.add_cpoint [0,0,0]」と入力すると原点にガイドポイントが追加されます。以下の欠点がありますが、使用頻度は高いです。
・1行で完結する処理しか実行できない。
・日本語が使えない。
2.ファイル読み込み
未完成のプラグインは、SketchUp起動時に自動的に読み込まれることを避けるため、Pluginsフォルダには置きたくないものです。その場合は適当なサブフォルダを作り、そこに保存しておけば自動読み込みされることもなく、任意のタイミングで試用することができます。例えば、「Ruby コンソール」に「load "test/test.rb"」と入力すると「C:\Program Files\Google\Google SketchUp 7\Plugins\test\test.rb」が読み込まれます。「Ruby Toolbar」の「Load Script」ボタンを使えばもっと楽に実行できます。
ファイル読み込みの場合は、そのファイルの記述要領によって処理が実行されたり、処理を実行するための関数が定義されたりします。例えば、次の記述は処理が実行されます。
Sketchup.active_model.entities.add_cpoint [0,0,0]
例えば、次の記述はファイル読み込みした後で、「Ruby コンソール」に「Test.test」と入力することで処理が実行されます。
module Test
def self.test(position=[0,0,0])
Sketchup.active_model.entities.add_cpoint position
end #def
end #module
1.直接入力
例えば、「Ruby コンソール」に「Sketchup.active_model.entities.add_cpoint [0,0,0]」と入力すると原点にガイドポイントが追加されます。以下の欠点がありますが、使用頻度は高いです。
・1行で完結する処理しか実行できない。
・日本語が使えない。
2.ファイル読み込み
未完成のプラグインは、SketchUp起動時に自動的に読み込まれることを避けるため、Pluginsフォルダには置きたくないものです。その場合は適当なサブフォルダを作り、そこに保存しておけば自動読み込みされることもなく、任意のタイミングで試用することができます。例えば、「Ruby コンソール」に「load "test/test.rb"」と入力すると「C:\Program Files\Google\Google SketchUp 7\Plugins\test\test.rb」が読み込まれます。「Ruby Toolbar」の「Load Script」ボタンを使えばもっと楽に実行できます。
ファイル読み込みの場合は、そのファイルの記述要領によって処理が実行されたり、処理を実行するための関数が定義されたりします。例えば、次の記述は処理が実行されます。
Sketchup.active_model.entities.add_cpoint [0,0,0]
例えば、次の記述はファイル読み込みした後で、「Ruby コンソール」に「Test.test」と入力することで処理が実行されます。
module Test
def self.test(position=[0,0,0])
Sketchup.active_model.entities.add_cpoint position
end #def
end #module
日本語とSketchUp
SketchUpは日本語を含む非ASCII文字をUTF-8で扱いますが、WindowsはShift-JISで扱うため、ファイル名、シーンの名前、レイヤの名前、グループの名前、コンポーネントの名前と定義名、ウィンドウタイトルなどをプラグインで制御したい場合にはnkf.soなどの文字コード変換機能のお世話になります。
プラグインの開発者として真っ先に活用したいrubytoolbar.rb(http://sketchuptips.blogspot.com/2007/08/plugin-ruby-toolbar.html)も、ウィンドウタイトルに日本語が含まれているので、そのままでは使用できません。
それを使用できるようにするための方法を紹介します。
when "DE"
"Ruby-Konsole"
when "FR"
"Console Ruby"
when "ja"
NKF.nkf("-s","Ruby コンソール")
else
"Ruby Console"
end
これだけで、プラグインの開発効率は大きく改善されるでしょう。
プラグインの開発者として真っ先に活用したいrubytoolbar.rb(http://sketchuptips.blogspot.com/2007/08/plugin-ruby-toolbar.html)も、ウィンドウタイトルに日本語が含まれているので、そのままでは使用できません。
それを使用できるようにするための方法を紹介します。
- 「nkf.so」を「C:\Program Files\Google\Google SketchUp 7\Tools」に保存する。
- 「rubytoolbar.rb」をUTF-8の文字コードで保存する。
- 「rubytoolbar.rb」の下記の部分に赤字部分を追記する。
when "DE"
"Ruby-Konsole"
when "FR"
"Console Ruby"
when "ja"
NKF.nkf("-s","Ruby コンソール")
else
"Ruby Console"
end
これだけで、プラグインの開発効率は大きく改善されるでしょう。
2010年7月14日水曜日
ハイエンドと呼ばれる三次元CAD
単純に価格の高さだけだったり、機能の豊富さ、カスタマイズ性の高さまで考慮されたりしますが、僕にとってのハイエンド三次元CADとは、現在の非力なコンピュータのハード的ソフト的な制約をできる限り取り除く努力をしているものです。
重い処理をする際にはマルチコアマルチスレッドのCPUを使い切ることができるとか、メインメモリの使用量が制限値に届きそうになった場合の回避策を盛り込んでいるとか、制限を無くすために64bit版をリリースするとか、そういうことです。
SketchUpはどう考えてもハイエンドとは言えません。
三次元CADをコンピュータに例えると、ハイエンドはパソコンで、SketchUpは電卓って所でしょうか。
これは決して悪口ではなくて、用途によってはパソコンよりも電卓の方が便利な状況が多々あるということです。
アセンブリ設計では難しい仕事に頭を使う時間よりも、難しくない仕事に手を動かす時間の方が長いので、僕はハイエンドを触るよりも多くの時間をSketchUpに使用しています。
2010年7月13日火曜日
三次元モデルの軽さの追及
SketchUpは32bit OS用のソフトウェアなので、プログラム本体と読み込んだデータを合わせて4GBまでのメモリ使用量が理論値としての制限になりますが、32bit Windowsの制約により実際の制限値は2GBです。
(64bit Windowsで32bitプログラムを実行した場合は3GB強まで使えるらしい)
(64bit Windowsで32bitプログラムを実行した場合は3GB強まで使えるらしい)
例えば、他の三次元CADからそれなりの規模の組立モデルを3D-DXFにエクスポートし、それをSketchUpにインポートする場合、dxfファイルのサイズが200MBを超えていたとしたら、インポートの途中でメモリ使用量が2GBに到達してしまう可能性は高く、到達してしまった場合にはプログラムは強制終了するしかない状態になります。
このような理由により、組立モデルの設計にSketchUpを使用している僕は、部品モデル1個ずつをできる限り軽く作ることにこだわっていますが、後々の設計工程までを踏まえるとどこまでの簡略化を許せるかが悩ましい毎日です。
2010年7月11日日曜日
三次元CADと三次元モデリングソフトとの違い
普段は明確に区別せずに呼んでいますが、厳密には以下の違いがあります。
三次元CAD;
寸法、角度等を数値的に指定できる三次元データ作成ソフト。
三次元形状の変更においては面または線を対象にするものが多い。
三次元モデリングソフト;
寸法、角度等を視覚的に指定できる三次元データ作成ソフト。
上記の観点であれば、SketchUpは間違いなく三次元CADですが、「寸法はわからないけど大体これくらい」といった操作も得意ですので、両者の良い所を併せ持っていると言えます。
三次元CAD;
寸法、角度等を数値的に指定できる三次元データ作成ソフト。
三次元形状の変更においては面または線を対象にするものが多い。
三次元モデリングソフト;
寸法、角度等を視覚的に指定できる三次元データ作成ソフト。
三次元形状の変更においては点を対象にするものが多い。
2010年7月10日土曜日
三次元モデルの共有
3d warehouseにアップロードしても良いけど手間、という理由でアップロードしていない部品モデルが1000個を超えました。
三次元CADを導入するアセンブリメーカが最初に苦労する点が部品モデルのライブラリの作成なので、SketchUpの普及促進用に3d warehouseをもっとリッチにしたいのですが、現時点では一括アップロードの方法がわからないためあきらめています。
Googleさ~ん、ここにあなたの味方(のつもりの者)がいるんですよ~(笑)
SketchUpってどうなの?
InventorユーザとかCATIAユーザとかそれらの開発元サイドとかからタイトルの通り質問されることが時々あります。
その際は、状況にあわせて「操作教育期間が最も短い三次元モデリングツール」とか「三次元のプレゼン資料作成ツール」とか「コンセプトデザイン(概念設計)ツール」とか回答していますが、その後「触って見たよ」と言って下さる方がいないことが残念です。
それよりも、使用中の画面を後ろから覗き込んで、「それ何?」と聞いてきた人は後日使用してたりします。
百聞は一見に如かず、ですね。
Microsoftの3Dモデリングソフト「trueSpace」
SketchUpファンとしてはアレなんですが、ちょっと試してみました。
機能は確かにものすごい豊富ですが、難しすぎです(汗)
SketchUpは「簡単に使えること」が売りなのでtrueSpaceとの比較は無意味だったようです。
登録:
投稿 (Atom)