ページ

2010年8月23日月曜日

カメラ(目?)の位置を取得するRubyスクリプト

Ruby コンソールで下記を入力することで、Point3dクラスが保持している値としてカメラの位置が表示されます。

Sketchup.active_model.active_view.camera.eye

単位はインチなのでミリにしたい場合は25.4倍します。

Sketchup.active_model.active_view.camera.eye.x*25.4
Sketchup.active_model.active_view.camera.eye.y*25.4
Sketchup.active_model.active_view.camera.eye.z*25.4

カメラの方向を取得したい場合は下記を使用します。

Sketchup.active_model.active_view.camera.target

ただしこれは方向(ベクトル)ではなくウィンドウ中心の三次元座標です。
ベクトルが必要な場合はtargetの点ベクトルからeyeの点ベクトルを引きます。

Sketchup.active_model.active_view.camera.target-Sketchup.active_model.active_view.camera.eye

ベクトルの長さを1にしたい場合はVector3dクラスのnormalizeメソッドを使用します。

(Sketchup.active_model.active_view.camera.target-Sketchup.active_model.active_view.camera.eye).normalize

2010年8月10日火曜日

「アウトライン表示」のツリーをエクスポートするプラグイン(日本語対応)

まだ未完成ながら骨格部分ができたので公開します。

以下からファイル名の拡張子が変わらないようにダウンロードし、「C:\Program Files\Google\Google SketchUp 7\Plugins」に保存して下さい。
pm_outline.rb

このプラグインは日本語に対応するために「nkf.so」を使用します。お持ちでない方は以下からダウンロードし、「C:\Program Files\Google\Google SketchUp 7\Tools」に保存して下さい。
nkf.so

使用法;
プラグイン→Export Outline.

留意点;
Windowsでしか使えない。
Cドライブのルートディレクトリを読み書きできないと使えない。
表示順序が「アウトライン表示」と異なる。(並べ替えしていない)

2010年7月27日火曜日

rubyの1行スクリプトの実行方法

これまでも何度か1行スクリプトを紹介しましたが、実行方法がブログ内検索でもヒットしない様子なので記述しておきます。

1.メニューより、「ウィンドウ」→「Ruby コンソール」
2.スクリプトを直接入力またはコピペしてEnter

曲線のみを全て選択する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)}

2010年7月26日月曜日

円の表示を拡大せずに中心を選択する方法

小さな円の中心を寸法ツールや線ツールで指定したいことってありますよね?通常は、ものすごく拡大し、円周上の端点でホバリングし、「端点」のヒントを出してから中心付近をホバリングし、「中心」のヒントを出してからクリックする方法で指定していると思います。

今日は拡大しなくても円の中心を指定できることを紹介します。この方法であれば、円が画面上点で表示されていても中心を指定できます。

「エンティティ情報」の画面を出しておきます。
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で入手し、そこから軽いモデルを作る作業の序盤で使用するために作成しました。

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"}

ローカル変数の名前と値をリストアップ
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)

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

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行目:変数mにModelクラスを登録。
2行目:変数sにSelectionクラスを登録。
3行目:変数eにEntitiesクラスを登録。
4行目:変数pに近接点の座標(2個)を登録。
(2本のLineクラスを元にGeomクラスのclosest_pointsメソッドで算出させる)
5行目:その座標にガイドポイントを描く。

画像を拡大表示しないとわかりませんが、マゼンタの2点が最近接点です。

僕はこの処理を下記の様に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)}

良く使うプラグイン

PurgeAll.rb
使用されていないコンポーネント、マテリアル、レイヤ、スタイルを削除します。無駄が削除されるとファイルサイズが小さくなります。

cleanup_model.rb
面を持っていない線を消します。線を消しても面が維持される場合はその線も消します。最新版では改善されているかもしれませんが、部分的に面が消えてしまうことがあったので少し改造して使ってます。

2010年7月18日日曜日

プラグインを作ろうと思う3つの理由

理由;
  1. 数十回のクリックが必要となる処理を数回のクリックに抑えたい。
  2. 標準機能にはない機能を追加したい。
  3. 単純な処理でも多数のファイルまたはコンポーネントを対象に処理したい。
背景;
  まだ誰もそのプラグインを公開していなかった、または見つけられなかった。

ちなみに、僕が開発するプラグインは理由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

日本語とSketchUp

SketchUpは日本語を含む非ASCII文字をUTF-8で扱いますが、WindowsはShift-JISで扱うため、ファイル名、シーンの名前、レイヤの名前、グループの名前、コンポーネントの名前と定義名、ウィンドウタイトルなどをプラグインで制御したい場合にはnkf.soなどの文字コード変換機能のお世話になります。

プラグインの開発者として真っ先に活用したいrubytoolbar.rb(http://sketchuptips.blogspot.com/2007/08/plugin-ruby-toolbar.html)も、ウィンドウタイトルに日本語が含まれているので、そのままでは使用できません。

それを使用できるようにするための方法を紹介します。
  1. 「nkf.so」を「C:\Program Files\Google\Google SketchUp 7\Tools」に保存する。
  2. 「rubytoolbar.rb」をUTF-8の文字コードで保存する。
  3. 「rubytoolbar.rb」の下記の部分に赤字部分を追記する。
  @wname = case Sketchup.os_language
  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強まで使えるらしい)

例えば、他の三次元CADからそれなりの規模の組立モデルを3D-DXFにエクスポートし、それをSketchUpにインポートする場合、dxfファイルのサイズが200MBを超えていたとしたら、インポートの途中でメモリ使用量が2GBに到達してしまう可能性は高く、到達してしまった場合にはプログラムは強制終了するしかない状態になります。

このような理由により、組立モデルの設計にSketchUpを使用している僕は、部品モデル1個ずつをできる限り軽く作ることにこだわっていますが、後々の設計工程までを踏まえるとどこまでの簡略化を許せるかが悩ましい毎日です。

2010年7月11日日曜日

三次元CADと三次元モデリングソフトとの違い

普段は明確に区別せずに呼んでいますが、厳密には以下の違いがあります。

三次元CAD;
寸法、角度等を数値的に指定できる三次元データ作成ソフト。
三次元形状の変更においては面または線を対象にするものが多い。

三次元モデリングソフト;
寸法、角度等を視覚的に指定できる三次元データ作成ソフト。
三次元形状の変更においては点を対象にするものが多い。

上記の観点であれば、SketchUpは間違いなく三次元CADですが、「寸法はわからないけど大体これくらい」といった操作も得意ですので、両者の良い所を併せ持っていると言えます。

2010年7月10日土曜日

三次元モデルの共有

3d warehouseにアップロードしても良いけど手間、という理由でアップロードしていない部品モデルが1000個を超えました。

三次元CADを導入するアセンブリメーカが最初に苦労する点が部品モデルのライブラリの作成なので、SketchUpの普及促進用に3d warehouseをもっとリッチにしたいのですが、現時点では一括アップロードの方法がわからないためあきらめています。

Googleさ~ん、ここにあなたの味方(のつもりの者)がいるんですよ~(笑)

SketchUpってどうなの?

InventorユーザとかCATIAユーザとかそれらの開発元サイドとかからタイトルの通り質問されることが時々あります。
その際は、状況にあわせて「操作教育期間が最も短い三次元モデリングツール」とか「三次元のプレゼン資料作成ツール」とか「コンセプトデザイン(概念設計)ツール」とか回答していますが、その後「触って見たよ」と言って下さる方がいないことが残念です。

それよりも、使用中の画面を後ろから覗き込んで、「それ何?」と聞いてきた人は後日使用してたりします。
百聞は一見に如かず、ですね。

Microsoftの3Dモデリングソフト「trueSpace」

SketchUpファンとしてはアレなんですが、ちょっと試してみました。
機能は確かにものすごい豊富ですが、難しすぎです(汗)
SketchUpは「簡単に使えること」が売りなのでtrueSpaceとの比較は無意味だったようです。

2010年6月13日日曜日

3Dデータのインポート

機械部品などの小さなモデルをインポートすると、面の欠落が激しい場合があります。
そんな場合はインポートオプションの単位を「メートル」にし、インポートした後で尺度ツールを使って元の大きさにすることで、欠落を予防できることがあります。

頑張れば、3D-DXFをインポートし、原点を基準に0.001倍し、SketchUpデータとして保存する、という処理をDXFファイルの個数だけ繰り返すプラグインを開発できそうです。

2010年4月30日金曜日

長方形、円、ポリゴン機能でのちょっと贅沢な悩み?

3次元的に斜めになっている線に垂直な面を作ることが難しい、と聞くことがあります。

その場合は、軸ツールを使って「3次元的に斜め」を「赤軸」に変更し、緑軸青軸平面に平行な(Shiftロック機能を使う)円を作り、軸で右クリックして軸をリセットする、という操作で解決できます。

「軸で右クリック」という操作が直感的ではないのかも・・・?

回転機能のちょっと贅沢な悩み

SketchUpでは、ものを回転する場合に、回転中心と回転軸を先に決めてから回転角度を指示します。
ほとんどの状況ではこの機能で不都合ないのですが、回転中心を指示した後で、回転軸はわかんないけどこの点をこの線/面に乗せたい、という操作はちょっと難しくなります。

DWG/DXF インポータ

DWG/DXF インポータが Google SketchUp (無料版) から削除されました。ユーザー数を増やすための武器が弱くなる気がしてちょっと残念です。

現時点では「今回リリースされた SketchUp での変更点」のページからDWG/DXF インポータをダウンロードできます。

2010年4月29日木曜日

SketchUpの機能拡張

SketchUpにはAPIが用意されており、スクリプト言語のRubyによって開発された機能を追加することができます。
http://code.google.com/apis/sketchup/docs/index.html
SketchUcation Community Forums

自分で開発することが面倒臭い/難しいと思う方はどこかの誰かが開発して公開している機能を活用しましょう。
http://sketchup.google.com/intl/en/download/plugins.html
Smustard.com
Ruby Library Depot

SketchUpの自習

以下のドキュメントがあります。
SketchUp 入門ガイド
SketchUp コンセプト ガイド
SketchUp ユーザー ガイド
SketchUp リファレンス ガイド

書類が苦手な方は、以下のビデオを一通り見れば各種機能の使い方がわかるでしょう。
http://sketchup.google.com/intl/ja/training/videos.html
(英語が苦手なわたくしでも勉強になりました)

3次元CADなんてのは普通3日とか1週間とかの研修を経て、そのツールの世界観をある程度把握してから自習によって習熟するものなんですが、SketchUpは独特な世界観を持っていないので最初から自習できます。

どこかの誰かが作ったSketchUpモデル

どこかの誰かが作った3次元データを無償でダウンロードできます。
スターウォーズとかもあります。
http://sketchup.google.com/3dwarehouse/?hl=ja&ct=lc

※JISとかの規格部品もライブラリ化して欲しいなぁ。2次元CADの世界と同じで、オペレータの作業効率ってツールへの習熟度がある程度進んだら、ライブラリの充実度と使いこなし度で決まるんですよね。

SketchUpのダウンロード

フリー版で味見したいのに、間違えてPro版をダウンロードしてしまう方が多い様です。
Googleのホームページの作り方がちょっと良くないのかも?
フリー版はこちら。
http://sketchup.google.com/intl/ja/download/gsu.html

Pro版はこちら。
http://sketchup.google.com/intl/ja/download/gsup.html

SketchUpとは?

本家ホームページを参照して下さい。
http://sketchup.google.com/intl/ja/