日々適当

hibitekitou

センター位置を選択したコンポーネント中心へ

cg |2014-01-23
先日の疑問点。暫定的に解決しました。コメントで教えてもらったその方法は、2種類。
一つ目。

まず、センターに設定したいコンポーネントを選びます。図ではポリゴンを選んでいます。



次に作業平面を選択範囲に合わせます。



センターを選んだ後、 setup→設定→設定→作業平面の位置へ を実行します。



必要なら、終わったら作業平面はリセットしときましょう。

二つ目は、センターを選択した状態で、コンポーネントを選び、その上で center.matchGeometryPos ってコマンドを実行してやる、というものです。ただこれ、なんか分からないのですけど、うまく動くときと動かないときがありまして、複数のコンポーネント選択時の最後に選ばれたコンポーネント中心にセンターが移動するとかすることがありました。

そんなわけで、面倒なんでスクリプト書いてみました。コンポーネント選択後実行です。コンポーネントを構成するバーテックスの位置の平均の位置にセンターを移動します。

centerToComponets.py
#python
import lx

def whichMode():
	#current edit mode
	#0: vertex
	#1: edge
	#2: polygon
	#3: item
	#4: ptag
	#5: center
	#6: pivot
	if lx.eval("select.typeFrom vertex;edge;polygon;item;pivot;center;ptag ?"):
		return 0
	elif lx.eval("select.typeFrom edge;vertex;polygon;item;pivot;center;ptag ?"):
		return 1
	elif lx.eval("select.typeFrom polygon;edge;vertex;item;pivot;center;ptag ?"):
		return 2
	elif lx.eval("select.typeFrom item;pivot;center;edge;polygon;vertex;ptag ?"):
		return 3
	elif lx.eval("select.typeFrom item;pivot;center;edge;polygon;vertex;ptag ?"):
		return 4
	elif lx.eval("select.typeFrom center;pivot;item;edge;polygon;vertex;ptag ?"):
		return 5
	elif lx.eval("select.typeFrom pivot;center;item;edge;polygon;vertex;ptag ?"):
		return 6

def compIndex(eMode):
	return lx.evalN("query layerservice %s ? selected"%eMode)


def convVertex():
	lx.eval("select.convert vertex")


def setCenterToPosition(pos):
	lx.eval("select.type item")
	lx.eval("select.convert center")

	lx.eval("center.setPosition x:%f y:%f z:%f mode:world"%(avePos[0], avePos[1], avePos[2]))


def restoreVertex(verts):
	lx.eval("select.drop vertex") 
	lx.eval("select.type vertex")
	for p in verts:
		lx.eval("select.element %s veretex add %s" % ( currentLayer , p ) )


def calcAvePos(verts):
	posx = 0.0
	posy = 0.0
	posz = 0.0
	for p in verts:
		pos = lx.evalN ("query layerservice vert.wpos ? " + p)
		posx = posx + pos[0]
		posy = posy + pos[1]
		posz = posz + pos[2]
	return [ posx / len( verts ), posy / len( verts ) ,  posz / len( verts ) ]
	

# Get Index of Current Layer
currentLayer = lx.eval("query layerservice layer.index ? main")
lx.out(currentLayer)

#Get Current mode
currentEditMode = whichMode()

eMode = "verts"

if currentEditMode == 0:
	oriVerts = selComps = compIndex(eMode)
	avePos = calcAvePos(selComps)
	setCenterToPosition(avePos)

elif currentEditMode == 1:
	lx.eval("select.type vertex")
	oriVerts = compIndex(eMode)
	lx.eval("select.type edge")
	convVertex()
	selComps = compIndex(eMode)
	restoreVertex(oriVerts)
	avePos = calcAvePos(selComps)
	setCenterToPosition(avePos)

elif currentEditMode == 2:
	lx.eval("select.type vertex")
	oriVerts = compIndex(eMode)
	lx.eval("select.type polygon")
	convVertex()
	selComps = compIndex(eMode)	
	restoreVertex(oriVerts)
	avePos = calcAvePos(selComps)
	setCenterToPosition(avePos)
コメント ( 2 )|Trackback ( )
 
コメント
 
 
 
Unknown (mechpalace)
2014-01-24 22:44:55
結局スクリプトを作らせてしまいましたね~。ご面倒をお掛けしました。

スクリプト使わせていただきました。大変便利です。ありがとうございます。
pythonが書けるなんて素晴らしいです。
 
 
 
Unknown (m4g)
2014-01-25 09:39:47
方法を示唆していただいたおかげで、手数を減らすためにスクリプトを書く覚悟がつきました(^^) modoのスクリプトを(それなりにちゃんと機能があるものを)書いたのは実は初めてなもので、四苦八苦でしたよ。

うちの環境以外でも動いたってのはうれしいご報告です。
ありがとうございます。
 
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。