スクリプト内でCPlaneとワールドを切り替える確実な方法


スクリプトを作成しているときに、ワールド座標と作業平面座標が混在してしまうときがあります。

主に、スクリプトのrs.Commandでは、作業平面座標で指示をしていることになっているからです。

(そして、どうしても、rs.Commandを使わないとモデリングができない作業もあります)

1)PythonScriptでワールド座標で指示をするには・・

座標を切り替え、ということですが、「通常のCommandの指示座標」(wなどをつけないもの)はビューの作業平面に対するものです。
座標値にwをつければ、ワールドで指示ができますが、これでも不十分なときがあります。

「ビューの方向」に依存するコマンドが多々あるからです。作業平面を切り替える必要がでてきます。

カレントビューを Topに切り替える。
カレントビューの作業平面をワールドのXY平面にする。

		rs.CurrentView("Top")
		rs.ViewCPlane(None, rs.WorldXYPlane())

以上おしまい。(;・∀・)

と、簡単なのですが、

ただ、コマンド終了後に元に戻すことを考えると、

	# (ユーザーのビューと作業平面を覚えておく処理)
	save_view= rs.CurrentView()
	save_cplane= rs.ViewCPlane()
	# (切り替える処理)
	rs.CurrentView("Top")
	rs.ViewCPlane(None, rs.WorldXYPlane())

	# (いろんな処理)

	# (ユーザーの処理に戻す処理)
	rs.CurrentView(save_view)
	rs.ViewCPlane(save_view, save_cplane)

保存と復元の処理をする必要があります。

またここからさらに、(いろんな処理)の中でエラーが発生しても、かならず元に戻す、というような堅牢なプログラムにするには、try finally を使って、

	save_view= rs.CurrentView()
	save_cplane= rs.ViewCPlane()
	try:
		rs.CurrentView("Top")
		rs.ViewCPlane(None, rs.WorldXYPlane())
		# (いろんな処理)
	finally:
		rs.CurrentView(save_view)
		rs.ViewCPlane(save_view, save_cplane)

ということにするでしょう。

毎回上記のことを関数の最初と最後に描けばよいのですが、Pythonのwithとyield を使うこともできます。
(Pythonの標準機能(contextmanagerライブラリ)でできているので、ビューの他にも、いろんなことに使えます。)

枠関数を定義します。枠の中身が入るところは、yieldを書いておくことでPythonらしく便利に使えます。

from contextlib import contextmanager

@contextmanager
def CurrentViewWorldTop():
	save_view= rs.CurrentView()
	save_cplane= rs.ViewCPlane()
	try:
		rs.CurrentView("Top")
		rs.ViewCPlane(None, rs.WorldXYPlane())
		yield
	finally:
		rs.CurrentView(save_view)
		rs.ViewCPlane(save_view, save_cplane)

ビューを切り替えて、戻したいところで、withブロックを使います。

	with CurrentViewWorldTop():
		rs.Command(cmd, True)

以上です。

スクリプトのモデリングをおこなう関数自体は、いくつも作成して組み合わせる可能性があります。
ワールドを想定したもので作成しておいて、作業平面の相違部分は、関数の外のUIに近い関数でやっておくほうが、いろんなコマンドを組み合わせるときにすっきりするかもしれません。