1/8 >>
Metasequoia Python Interface
三次元日誌
http://d.hatena.ne.jp/ousttrue/20091201
スクリプトのデバッグを試してみた。
Failed to execute a script in line 46.
Import can't find module, or can't find name in module.
import tracebackでエラー
Python 2.2.3 日本語環境用インストーラ(Win32)をダウンロードして
インストールしていなかったから。
ためしに2.3のpython234jp-20040927.exeをインストールしてみたが、モジュールは呼び出せない。
素直に、Python 2.2.3 日本語環境用インストーラ(Win32)、python223jp-20030608.exeをインストールしました。
http://www.python.jp/Zopeから、
ダウンロード→Python 日本語環境用インストーラ(Win32)
【旧バージョン】
Python 2.2.3 日本語環境用インストーラ(Win32)
をクリックしてください。
ありがとうございます。
MQOSystem Python パスを調べる
Metasequoia(メタセコイア)のPythonAPIを勉強する。中々、難しいところです。
まずは、いろいろなPythonモジュールを利用できるように、Python 2.2.3 日本語環境用インストーラ(Win32)、python223jp-20030608.exeをインストールしておく。
以下のようなスクリプトをメタセコイアで起動して、パスが通っているところを調べる。
メタセコイアマスターガイドを参考にした。リストで出力されるので、リスト長さを調べて真ん中で二つに分けてprintln出力している。
#path01.py
MQSystem.clearLog() #ログ消去
import sys
l=sys.path
a=len(l)/2
MQSystem.println(str(l[:a]))
MQSystem.println(str(l[a:]))
出力結果
['C:\\Program Files (x86)\\Python', 'C:\\Python22jp', 'c:\\Python22jp\\Lib', 'c:\\Python22jp\\DLLs']
['c:\\Python22jp\\Lib\\lib-tk', 'C:\\Program Files (x86)\\Metaseq24\\Script', 'C:\\Program Files (x86)\\Metaseq24', 'c:\\Python22jp\\lib\\site-packages']
たぶん、C:\\Program Files (x86)\\Python', 'C:\\Python22jp'の部分は、PYTHONPATHとして環境設定に書き込んでた部分。他は、Python 2.2.3 日本語環境用インストーラ(Win32)をインストールしたことでパスが追加されている。
ありがとうございます。
カメラ位置を求める
メタセコイアのPython scriptサンプルをちょっと変更してみる。
右クリックでカメラ位置をぐりぐり変更してから、スクリプトを実行すると位置が表示される。カメラ情報を取得し、カメラ設定をどのようにするかいろいろと考えることができます。
#camera_pos.py
doc = MQSystem.getDocument()
scene = doc.getScene(0)
pos = scene.getCameraPos()
angle = scene.getCameraAngle()
lookat = scene.getLookAtPos()
upvec = scene.getLookAtUpVec()
center = scene.getRotationCenter()
fov = scene.fov
MQSystem.println("pos: " + str(pos))
MQSystem.println("angle: " + str(angle))
MQSystem.println("lookat: " + str(lookat))
MQSystem.println("upvec: " + str(upvec))
MQSystem.println("center: " + str(center))
MQSystem.println("fov: %(#).3f" % {"#":fov})
MQSystem.println("----------------------------------")
Pythonでメタセコイアの使い方の幅が広がります。いろいろと勉強ですね。ありがとうございます。
視点の初期化
メタセコイアには、メニュー「表示」→「視点の設定」→「初期化」がついていますが、
これをスクリプトにしてみた。
setCameraAngle(angle)が使えるのかと思ったら、うまく動かない。とりあえず、"""〜"""までコメントアウトにしていますが、スクリプトを実行するとデフォルトの視点位置に戻ります。
#デフォルトにする
#default_home.py
MQSystem.clearLog()
doc = MQSystem.getDocument()
scn = doc.getScene(0)
"""
angle = scn.getCameraAngle()
angle.head= -20.0
angle.pitch= 45.2
angle.bank= 0.0
scn.setCameraAngle(angle)
angle = scn.getCameraAngle()
"""
mqpt = scn.getCameraPos()
mqpt.x = 649.519
mqpt.y = 750.000
mqpt.z = 1125.000
scn.setCameraPos(mqpt)
pos = scn.getCameraPos()
mqpt = scn.getLookAtPos()
mqpt.x = 0.0
mqpt.y = 0.0
mqpt.z = 0.0
scn.setLookAtPos(mqpt)
lookat = scn.getLookAtPos()
angle = scn.getCameraAngle()
scn.fov=15.189
fov=scn.fov
MQSystem.println("pos: " + str(pos))
MQSystem.println("angle: " + str(angle))
MQSystem.println("lookat: " + str(lookat))
MQSystem.println("fov: " + str(fov))
Metasequoia Pythonで平面をつくる その1
基本図形の平面をつくります。
オブジェクトパネルにある最初のオブジェクトobj1に平面を書き込むスクリプト。
作成後、オブジェクトパネル内のオブジェクトを削除して実行しようとするとエラーになる。
# 基本図形、平面をつくる
doc = MQSystem.getDocument()
num = doc.numObject #オブジェクトの数
obj = doc.object[0] #オブジェクトパネルにある最初のオブジェクト
out = MQSystem.println
out(obj.name)
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
obj.name="plane01" #オブジェクト名を変更
a=doc.getObjectIndex(obj) #オブジェクトのインデックスを取得
out("オブジェクトのインデックス番号:%d" % a) #オブジェクトのインデックスを表示
v = []
v.append( obj.addVertex(200,0,200)) #面の向きはカメラから見て反時計回り
v.append( obj.addVertex(-200,0,200))
v.append( obj.addVertex(-200,0,-200))
v.append( obj.addVertex(200,0,-200))
obj.addFace(v)
Metasequoia Pythonで平面をつくる その2
新規オブジェクトで平面を作っていく。
インデックスが-1
[-1] ドキュメントに登録されていないオブジェクトということでしょうか。
# 基本図形、新規オブジェクトで平面をつくる
doc = MQSystem.getDocument()
obj = MQSystem.newObject() #新規オブジェクト
out = MQSystem.println
out(obj.name)
a=doc.getObjectIndex(obj) #オブジェクトのインデックスを取得
obj.name="plane_%d" % a #オブジェクト名をつける
v = []
v.append( obj.addVertex(200,0,200)) #面の向きはカメラから見て反時計回り
v.append( obj.addVertex(-200,0,200))
v.append( obj.addVertex(-200,0,-200))
v.append( obj.addVertex(200,0,-200))
obj.addFace(v)
doc.addObject( obj )
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
-1となるのがわかりました。
doc.addObject( obj )
でシーンにオブジェクトを追加(ドキュメントに登録)した後に、
a=doc.getObjectIndex(obj) #オブジェクトのインデックスを取得
を行えば、aは1となりますね。
obj.name="plane_%d" % a #オブジェクト名をつける
plane_1と表示されます。
オブジェクトのインデックス番号が1なのは、最初にあるobj1がインデックス番号0だからですね。
くりかえしくりかえし、基礎基本の勉強です。
ありがとうございます。
ポリゴン、5角形をつくる
メタセコイアでのPython script練習、繰り返しを使っていない面倒な記述をしていますが、原理を理解するために書いてみた。いろいろと課題はあるけど、Metasequoia Python API勉強です。メタセコイアマスターガイドを参考にしました。ありがとうございます。
#kaku5.py
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
segment = 5
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
obj = MQSystem.newObject()
obj.name = "polygon_%d" % segment
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) )) #中心
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) ))
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) ))
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) ))
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) ))
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
doc.addObject( obj )
八角すいをつくる
前の記事でポリゴン、5角形をつくったが、きちんとくりかえし処理を行うようにした。ただし、ひとつひとつのポリゴンは移動ツールで触るとばらばら。これはこれで面白いか。勉強ですね。
#poly8.py
segment = 8
radius=200.0
from math import *
crad = pi / 180 * 45
irad = 2*pi/segment
doc = MQSystem.getDocument()
obj = MQSystem.newObject()
obj.name = "circle_%d" % segment
for i in range(segment):
v=[]
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
crad = crad+irad
v.append(obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) ))
v.append(obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) ))
obj.addFace(v)
doc.addObject( obj )
オブジェクトパネル
メタセコイアのMetasequoia Python APIいろいろと実験をしながら、納得していく必要があります。オブジェクトの情報を取得する方法について勉強しています。触りながら、いろいろ実験ですね。
いろんなサイトを参考にしながら勉強しています。サクサクできる方はすばらしいです。ありがとうございます。
#obj_info.py
#ログの消去
MQSystem.clearLog()
# ドキュメントを取得
doc = MQSystem.getDocument()
# オブジェクト数を取得
obj_num = doc.numObject
MQSystem.println(" オブジェクト数 : " + str(obj_num))
# インデックス0番のオブジェクトを取得
obj = doc.object[0]
# オブジェクトの頂点数を取得
ver_num = obj.numVertex
MQSystem.println(" 頂点数 : " + str(ver_num))
# オブジェクトの面数を取得
poly_num = obj.numFace
MQSystem.println(" 面数 : " + str(poly_num))
#1 つめのオブジェクトにおいて選択している頂点を調べる
for i in range(len(obj.vertex)):
if obj.vertex[i].select:
MQSystem.println(" 選択頂点番号" + str(i))
メッセージボックス
こんなこともできるのかと試してみる。
#メッセージボックス
a="Hello Metasequoia!!"
MQSystem.messageBox(a)
日本語も出るし、警告音も出ます。
#メッセージボックスその2
MQSystem.messageBox('日本語')
MQSystem.messageBox('日本語2')
MQSystem.messageBox('日本語3')
地道に前に進みます。
ありがとうございます。
1/8 >>