1/2 >>

Metasequoia Python 立方体をつくる

メタセコイアのPythonの使い方として、立方体をつくってみた。一辺が50、原点を中心につくってみる。面の向きは、カメラから見て反時計回りに点を指定すると表向き、カメラから見えない面については、時計回りに点を指定することで、面が表向きになる。

以下はサンプルとなるpythonスクリプトです。


# 基本図形、新規オブジェクトで立方体をつくる
#meta_cube.py
doc = MQSystem.getDocument()

obj = MQSystem.newObject() #新規オブジェクト
out = MQSystem.println

out(obj.name)
num=doc.numObject
a=num

obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(-25.000000,-25.000000,25.000000) #0
a1=obj.addVertex(25.000000,-25.000000,25.000000) #1
a2=obj.addVertex(25.000000,25.000000,25.000000) #2
a3=obj.addVertex(-25.000000,25.000000,25.000000) #3
a4=obj.addVertex(-25.000000,-25.0000,-25.000000) #4
a5=obj.addVertex(-25.000000,25.0000,-25.000000) #5
a6=obj.addVertex(25.000000,25.0000,-25.000000) #6
a7=obj.addVertex(25.000000,-25.0000,-25.000000) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])

doc.addObject( obj )
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
  • -
  • -

Metasequoia Python 立方体を定義する

立方体の辺の長さと位置を指定すれば、生成できるように、関数をつくって定義した。


# 基本図形、新規オブジェクトで立方体をつくる
#meta_cube_def.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )


unitcube(100,50,50,-50) # L:辺の長さ100 x,y,z座標位置

unitcube(50,-50,25,50) # L:辺の長さ50 x,y,z座標位置 2つめ配置


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示

05.jpg
  • -
  • -

Metasequoia Python 立方体を複数つくる

複数つくってみる。
くりかえしfor文がちょっとエラー。
Inappropriate argument type.
メソッドに不適当な引数を渡したためということなんですが、
使わないで、動作確認。
メタセコイアpythonスクリプトは以下のようになります。


# 基本図形、新規オブジェクトで立方体複数つくる
#meta_cube_def2.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )

dist=60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)



num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示




06.jpg
  • -
  • -

Metasequoia Python 立方体を複数つくる その2

くりかえしfor文がうまくいかなかったので、while文にした。


dist=60
while dist<=300:
unitcube(50,50+dist,50,-50)
dist=dist+60



サンプルスクリプトは次のようになります。

# 基本図形、新規オブジェクトで立方体複数つくる その2
#meta_cube_def2.py
doc = MQSystem.getDocument()

out = MQSystem.println

#立方体を生成する 定義
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7

obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )

dist=60
while dist<=300:
unitcube(50,50+dist,50,-50)
dist=dist+60

num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
  • -
  • -

Metasequoia Python 立方体を複数つくる その3

for文を使うとエラーが出るので、詳細を調べる。

exceptions.TypeError
function takes exactly 1 argument (3 given)
\\Documents\\error2.py', 52, '?', 'for i in range(5):')

エラー処理の記事を参考に動かしてみたら上記のエラー
1引数を取るところ、3つ引数があるからということ。
unitcube(50,50+dist,50,-50)が怪しい。



import traceback
import sys
dist=0
try:
for i in range(5):
unitcube(50,50+dist,50,-50)
dist=dist+60

except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))



エラー表示してから立方体を表示した。
  • -
  • -

Metasequoia Python 立方体を複数つくる その4

とりあえず、複数配置を無理やり記述した。
エラーは表示されるが、スクリプトは実行される。

エラー処理の方法、
三次元日誌
http://d.hatena.ne.jp/ousttrue/20091201
を参考にしました。ありがとうございます。

以下、サンプル参考ファイルです。

def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return

for arg in args:
MQSystem.println(str(arg))


# 基本図形、新規オブジェクトで立方体複数つくる その2
#error2.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )


import traceback
import sys
#dist=0
try:
for dist in range(0,340,110):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,0) #無理やり並べる
unitcube(100,50+dist,50,110)
unitcube(100,50+dist,50,220)
unitcube(100,50+dist,50,330)
#dist=dist+60

except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示


課題はありますが、継続して勉強です。
07.jpg
  • -
  • -

5角形をつくる メタセコイア Python

検証しながら、復習しながら、くりかえしですね。
5角形というか三角形のポリゴンが5つ並んだmetasequoia python scriptです。

#polygon5.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

obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#0

crad = crad+irad

obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#1

crad = crad+irad

obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#2

crad = crad+irad

obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#3

crad = crad+irad

obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#4

obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) )#5


obj.addFace([0,5,1])
obj.addFace([1,5,2])
obj.addFace([2,5,3])
obj.addFace([3,5,4])
obj.addFace([4,5,0])

doc.addObject( obj )



poly5.jpg
  • -
  • -

5角形をつくる メタセコイア Python その2

くりかえし処理を使って、5角形をつくる方法を記述してみた。obj.addFaceの部分でどういう順番で書けばよいか、前の記事の頂点の並び方を見て考えればわかってくる。(i+1)%segmentは、割り算の余りを求めている。メタセコイアPythonの使い方、わかってくると面白い。さらに勉強ですね。


#polygon5_2.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


for i in range(segment):
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )#0
crad = crad+irad

obj.addVertex( MQSystem.newPoint( 0.0, 100.0, 0.0 ) )#5

for i in range(segment):
obj.addFace([i,segment,(i+1)%segment])


doc.addObject( obj )
  • -
  • -

Metasequoia Python 立方体を複数つくる その5

for文を使うとエラーが出ていましたが、マテリアルを関数の中に記述したら、エラーが出なくなりました。
for face in obj.face:
    face.material=0 #マテリアル0番を面に割り当てる
を追加することでエラーが消えています。
しかもネスト入れ子構造にしてもOK。メタセコイアPython、とりあえず動いています。

まだマテリアルのところの処理は良くないです。材質パネルにたくさんできてしまいます。サンプルスクリプトはこちらです。


def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return

for arg in args:
MQSystem.println(str(arg))


# 基本図形、新規オブジェクトで立方体複数つくる その2
#error4.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )

mat1=MQSystem.newMaterial()
doc.addMaterial(mat1)

doc.material[0].color.red=0.99
doc.material[0].color.green=0.12
doc.material[0].color.blue=0.11
for face in obj.face:
face.material=0 #マテリアル0番を面に割り当てる


import traceback
import sys
#dist=0
try:
for dist in range(0,340,110):
for dist2 in range(0,340,110):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,dist2)



except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示

082.jpg
  • -
  • -

立方体を整列、ランダムに色をつける

メタセコイアでPythonを触る。これまでの記事をくりかえし復習しながら
サンプルスクリプトを実行してみた。
関数で立方体を生成し、新規マテリアルを追加、ランダムな色をつけておき、指定した座標に配置する。
使い方としては、立方体の大きさを調整したり、配置する間隔を決めていく、試行錯誤しながら決めていく。
ありがとうございます。
サンプルpythonスクリプトを参考にしてください。

import random

def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return

for arg in args:
MQSystem.println(str(arg))


# 基本図形、新規オブジェクトで立方体複数つくる その2
#meta_cube_def_rndc.py
doc = MQSystem.getDocument()


out = MQSystem.println

#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける

obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0 頂点番号
obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7


obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )

mat1=MQSystem.newMaterial()
doc.addMaterial(mat1) #マテリアルをドキュメントに追加
num0 = doc.numMaterial #現在の材質数を数える
numm=num0-1 #マテリアル番号は一つ少ない
doc.material[numm].color.red=random.random()
doc.material[numm].color.green=random.random()
doc.material[numm].color.blue=random.random()
for face in obj.face:
face.material=numm #マテリアルnumm番を面に割り当てる


import traceback
import sys
#dist=0
try:
for dist in range(0,340,110):
for dist2 in range(0,340,110):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,dist2)



except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示

09.jpg
  • -
  • -

1/2 >>