ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2015年9月16日水曜日

Python 内包表記

ども、更新をさぼってるTERAです

というより、Houdiniの有償チュートリアルをやってる場合は、
書けることがありませんw(とごかましてみます

まあ、本題の Pythonの内部表記ですが、
ちょっとこんなコードがあって、解読に困りました

#Houdini : Python
neighbourDict = dict((point, [geo.iterPoints()[int(num)] for num in point.attribValue(neighbourAttrib).split()]) for point in points)

勝手に改行されてると思いますが、一行です
なんでも一行に書けばいいってもんじゃないと思います orz

要約すると (ポイント, [近似のポイント,近似のポイント,,,])
を辞書登録してるだけです

これはPython 2.6時代の辞書表記で、
内包表記ではないようです。


2.7からは内包表記もできるよってことですので、メモです

詳しくはこちらに
各種リテラルと内包表記について


他力本願ですが2回ぐらい調べたのでメモしておきます orz


■近況

・Houdini
屋根の自動生成
こちらをぼちぼちと追ってはいるのですが、
なかなか成果につながりません。
まあ、ちょっとずつです。

とりあえず、傾斜に合わせてUVを自動で張り付けることはできました。


・仕事
背景と、アセットづくり中。
こちらはまだSIです

2013年5月14日火曜日

Softimage Script : ZSortNumbering v0.1

ども、まだまだ修羅場中のTERAです。
あいかわらず、チラ裏スクリプトです
(整理とか、エラー処理とかしてません)


今回の背景はアルファオブジェクト(半透明)
を多用しています

ZSortの場合アルファオブジェクトは
描画順を指定してやらねばなりません、
※最近のIntelAPUでは、力づくで解決してるみたいだけど


まだまだ世の中はオールドテク万歳です。


で、奥から描画するとして、
命名規則で指定する事になりました

・・・数が・・・。
大量にアルファオブジェクトがあると、
めんどくさいのでスクリプト化します


ZSortNumbering


オブジェクト(複数)を選択して実行すると
奥から順に番号を降ってくれます

axxx_ObjectName
最後のナンバリングは消してます


現状PPG無し、カメラの指定は決めうち、など
Toolとして、体をなしてなく、
条件がたくさんですが
とりあえず乗っけておきます。


こういった事案が多数 or 要望があればTool化するかもしれません。


※拡張性として、以下のスイッチがあります
カメラ平面からの距離 <> カメラからの距離
オブジェクトのセンター <> オブジェクトのBBOXセンター
です。
あと、番号の始まりと、頭につける文字の変更とか。

#ZSortNumbering
#
# 選択したオブジェクトをZSort順に命名変更します
# a000_ObjectName
#
# v0.1 0510 2013 とりあえず動いた
#

from win32com.client import constants as c
app = Application; log = app.LogMessage
import re
p = re.compile("[0-9]")

#GlobalValue
PREFIX = "a"
STRRTINGNUMBER = 0
tempCAM ="Camera"
ZDEPTH = True #ZDEPTH or Distance
OBJECTCENTER = False # Switch BBOX

def vLog(v):
 log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )


def aPosLog(aPos):
 for v in aPos:
  log(str( v.X ) + " , " + str(v.Y) + " , " + str(v.Z) )

#
# bNumDelete
#
def bNumDelete(in_str):
 oName = in_str
 for i in range( len( oName ) ):
  if p.match(oName[-1:]) != None:
   oName = oName[:-1]
  elif oName == "_":
   oName = oName[:-1]
  else:
   break
 return oName

#
# getNumbering
#
def getNumbering(in_digi,in_Start,in_Count):
 num = in_Count + in_Start
 num = str(num).rjust(in_digi,"0")
 return num


#
# getSelectMeshs
#
def getSelectMeshs():

 #-製作中-現在は選択したメッシュのみ
 col = XSIFactory.CreateObject("xsi.collection")
 oMeshs = XSIFactory.CreateObject("xsi.collection")
 col.Unique = True
 oMeshs.Unique = True
 
 oSels = app.Selection
 for oSel in oSels:
  if oSel.Type == "polymsh":
   oMeshs.Add(oSel)
   
 return oMeshs


#
# getCamera
#
def getCamera():
 #カメラ取得は仮
 oCam = app.Dictionary.GetObject(tempCAM)
 
 return oCam


#
# getObjectBBOXPositionArray
# 
def getObjectBBOXPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oA = oObj.GetBoundingBox( oTrans );
  pos.Set( (oA[3] - oA[0]) *.5 + oA[0],
     (oA[4] - oA[1]) *.5 + oA[1],
     (oA[5] - oA[2]) *.5 + oA[2] )
  aPos.append(pos)
 return aPos


#
# getObjectPositionArray
#
def getObjectPositionArray(inObjects):
 aPos = []
 for oObj in inObjects:
  pos = XSIMath.CreateVector3()
  oTrans = oObj.Kinematics.Global.Transform
  oTrans.GetTranslation(pos)
  aPos.append(pos)
 return aPos


#
# getMeshZNumber
#
def getMeshZNumber(oCam, oMeshs):
 log("-----getMehsNumber-----")
 aDis = []
 aNum = []
 
 #ObjectPositionArray
 if OBJECTCENTER:
  aPos = getObjectPositionArray( oMeshs )
  
 else:
  aPos = getObjectBBOXPositionArray( oMeshs ) 
 
 #aPosLog(aPos) 
 
 #ZDepth or Distance
 camPos = XSIMath.CreateVector3()
 camAxis = XSIMath.CreateVector3()
 camRot = XSIMath.CreateRotation()
 m3 = XSIMath.CreateMatrix3()
 oCamTrans = oCam.Kinematics.Global.Transform
 oCamTrans.GetTranslation(camPos)
 oCamTrans.GetRotation(camRot)
 camRot.GetMatrix3(m3)
 aM3 = m3.Get2()
 camAxis.Set(aM3[6],aM3[7],aM3[8])
 
 log("")
 log("---camPos---")
 vLog(camPos)
 
 log("")
 log("---camAxis---") 
 vLog(camAxis)
 
 if(ZDEPTH):#ZDepthの場合
  log("-----ZDepth-----")
  d = camPos.Dot(camAxis) #PolyPlane = p・n - d
  #log(d)
  for oPos in aPos:
   dis = ( oPos.Dot(camAxis) - d ) * -1
   aDis.append(dis)
   log(dis)
 else:
  v = XSIMath.CreateVector3()
  for oPos in aPos:
   v.Sub(camPos,oPos)
   dis = v.Length()
   aDis.append(dis)
   log(dis)
 
 aTemp = []
 for i,d in enumerate(aDis):
  bTemp = [d,i]
  aTemp.append(bTemp)
  
 aTemp.sort()
 aTemp.reverse()
 
 log(str(aTemp))
 for i in aTemp:
  aNum.append(i[1])
   
 return aNum

#
# main
#
def main():
 log("-----ASortNumbering")
 
 #GetMeshObject
 oMeshs = getSelectMeshs()
 if oMeshs.Count == 0:
  log("Pls Select Meshs")
  return
  
 #Camera
 oCam = getCamera()
 
 #GetNumber From Depth
 aNum = getMeshZNumber(oCam,oMeshs)
 log(str(aNum))
 
 #Renema
 for i,num in enumerate(aNum):
  oObj = oMeshs(num)
  no = getNumbering(3,STRRTINGNUMBER,i)
  oName = PREFIX + str(no) + "_" + oObj.Name
  oObj.Name = bNumDelete(oName)
main()

2012年4月10日火曜日

SoftimageScript PPGLayout : 小数点以下

UVのPluguinを作っているのですが
PPGにパラメータを追加します

UVは基本0-1間に収めるものですから
その扱いは小数点以下になります

しかし、標準での表示は少数点以下、3位までしか表示です

仮に解像度ぶんUVを移動させようとしたとき
その値は1/1024
小数点以下、3位では足りませんね

うーん、どうしたものかと思ったのですが、
junkiさんに教えてもらいました。

友愛その10。 小数点以下。

こういったオプションがあるのですね〜。
知りませんでした


小数点以下の指定

#Python
oItem = ly.AddItem( "offset" )
oItem.SetAttribute(c.siUIDecimals,5)




できた~
junkiさん、ありがとうございます


ttUVTools
 いろいろボタンは用意してますが
 まだまだあふぉなところが、
 多くて公開にはいたりません orz

2012年2月17日金曜日

Softimage Script : SeparateSelCluster

ツイッターで、クラスターを分離するスクリプトの話題が上がったので、
以前作った物をUPしてみたのですが、
人に見せるコードではないですね orz
自分ですらわかりません。

最近は、自スクリプトのメンテもするようになってきましたので
これは意識して修正をして行かねばなりませんね


SelarateSelCluster


選択したクラスターを分離して新しいオブジェクトにするスクリプト

#-----------------------------------------------------------------------
#SeparateSelCluster
#選択したクラスタを分離、マテリアルを適用

#使用法
#クラスタを選択実行

#履歴
# v1.0 完成

from win32com.client import constants as c
app = Application;log = app.Logmessage
import re
  
#-----------------------------------------------------------------------
# Main
#-----------------------------------------------------------------------
def main():

 #クラスターを確認
 oSel = app.Selection(0)
 if oSel.Type != "poly":
  log("Select Poly Cluster")
  return 0


 oCls = oSel
 oObj = oSel.Parent3DObject
 oGeo = oObj.ActivePrimitive.Geometry
 
 #ポリゴンのインデックスを-1で初期化[-1,-1,-1]
 aIndex = oGeo.Polygons.IndexArray  
 a = []
 for i in aIndex:
  a.append(-1)

 for i,v in enumerate(oCls.FindIndices(aIndex)):
  if v != -1:
   a[i] = 1
 extIndex = []

 for i,v in enumerate(a):
  if v == 1:
   extIndex.append(i)

 subset = extIndex
 oSub = oGeo.Polygons.SubComponent
 oSub.ElementArray = subset
 app.SelectObj(oSub)

 op = app.ExtractFromComponents("ExtractPolygonsOp", oSub, oObj.Name + "_" + oSel.Name, True, "siImmediateOperation", "siKeepGenOpInputs", "")
 newObj = op(0)(0)
 app.DeleteObj(oCls)

 oCls = newObj.ActivePrimitive.Geometry.Clusters
 for i in oCls:
  if i.Type == "polygon":
   newObj.SetMaterial(oCls.Material)
   app.DeleteObj(oCls)

 #親子付けをする
 #バグ報告アリガトウございますです。ちょっとOffっておきます〜
 #app.ParentObj(oObj.Parent3DObject,newObj)
 
 return 1

main()
#-----------------------------------------------------------------------


使用の際の不具合の責は負いませんぜ
バグ報告は歓迎します (≧▽≦)ゞ

2012年1月16日月曜日

Softimage Script : Python でショートカット入力

SI の TextureEditer は SDK で用意されてないらしく
スクリプト上からの操作は、むりなようです
※(扱えると言う情報がありましたら下さい〜)

しかし TextureEditer でショートカットキーが
設定してあるものについては
ショートカットをScriptで入力してやればよいと思われます

Pythonを利用し、キー入力の送り方を調査します


Pythonでのキーの送信

#Python
import win32com.client
shell = win32com.client.Dispatch("WScript.shell")
shell.SendKeys("{F6}",0)


この状態でキー入力を行う事が出来ました

参考サイト

しかし、製作中のツールでは反応しませんでした。なんでじゃろ?


修正

myaraさんの指摘で以下を修正しました

Despatch > Dispatch //スペルミス
"F6" > "{F6}" //{}が抜けてました!(なぜか不要と決め付けてました orz)

以上を修正したら、TextureEditerで更新ができるようになりました!!!
バグだしは終わってないですけどスクリプトが動いたー


安定動作したら公開しま~す
そのほか、スクリプトの中でスクリプトを呼び出してますね、
ふむり~、参考になります

myara さん、ありがとうございましたーーー。


備考
myaraさんが、キーをスクリプトで送る件に関して記事を書かれたようですよ!
参考になることばかりです

キーをスクリプトで打つ

しかし、こういうときこそトラックバックとか使うんじゃなかったっけ?
使い方がわからん orz

2011年11月8日火曜日

Softimage Script : Extract Plus

オブジェクトをエリアごとに分割する必要があって、
ポリゴンを分けてたんだけど、
標準だといろいろメンドクサイ

通常のExtract

・原点はワールドに移動し
・新しいオブジェクトはScene_Rootの子に

オブジェクト数が少ないうちはいいが
新規のオブジェクトの位置が遠い orz


Extract Plust

・オブジェクトの親を同じにする
・名前を同じにする
・SRTを同じにする


2011年8月23日火曜日

Python : PythonでA*アルゴリズムを実装してみる

PythonでA*アルゴリズムを実装してみる
いやいや、全く理解できませんが、高度なアルゴリズムを実装しておられるサイト。
経路探索とか、ちょっと興味あり

2011年7月24日日曜日

SoftimageScript : ObjectBrake v01

1ポリゴン 1オブジェクトに分割するスクリプト

■オブジェクトを選択(複数化)

■実行

CEに渡すときはオブジェクトをポリゴンごとに分割する必要がある。
その補助を行うスクリプト。

オブジェクトごとに名前を持たせ、
CE側でオブジェクトごとに異なるルールを適用できる。

#Python
#ObjectBrake v0.1
#Create By Tera 2011 07 24

app = Application; log = app.Logmessage
oSels = app.Selection
oNames = []
oCounts = []
oColl = XSIFactory.CreateObject("XSI.Collection")

for oObj in oSels:
 oNames.append(oObj.Name)
 oGeo = oObj.ActivePrimitive.Geometry
 oPolys = oGeo.Polygons
 oCounts .append(oPolys.Count)

for i in range(oSels.Count):
 for j in range(oCounts[i]):
  temp = oNames[i] + '.poly[' + str(j) + "]"
  op = Application.ExtractFromComponents("ExtractPolygonsOp", temp, "polymsh_extracted", "", "siImmediateperation", "siKeepGenOpInputs", "")
  newObj = op(0)(0)
  newObj.Name = oNames[i] + "_" 
  oColl.Add(newObj)
oNull = app.ActiveSceneRoot.AddNull("CE_Export")
app.ParentObj( oNull, oColl )

■今後の展開
マテリアルごとに名前を変えたほうが好いかもしれない

2011年6月16日木曜日

Mari : PYTHON SCRIPTING FOR MARI



コンソールって、ログとは違うのだね。
 いまいち使い方がわからんかった。使ってて慣れるしか無いな〜。

いまだにポリゴンへのアクセスが見つからず。

2011年6月14日火曜日

Python : 多次元配列の要素でのソート

Pythonでの多次元配列の比較
基本の.sort()だと、要素の[0]番目でソートされる。
たとえば、[ [Index,x,y,z], , , ,]ではIndexでソートされる事になる。

たとえば、yでソートしたい場合等に対応するには
関数で指定してやれば良い。

def hikaku(x,y):
    return x[2] - y[2] #ココに、比較したい要素の番号を入れる

list = [ [0,0,5,9] , [1,3,4,5] , [2,6,3,5] ]

list.sort( hikaku )

パイソンすげぇと思ったら、普通にJScriptでもあった orz
知らなかっただけ。



lambdaを使う
わざわざ関数を指定するのがメンドクサイ場合、無名関数のlambdaを使うと良い

list.sort( cmp = lambda x , y: cmp(x[2],y[2]) )

cmp関数
cmp(a,b)は a,bを比較して、値を返す

2011年5月21日土曜日

SoftimageScript Python(list,tuple)

Pythonのシーケンス(配列?)には、リスト、タプルがあり、SIでは両方使われている。

list = [0,2,3]
tuple = (0,2,3)

#Softimage でポリゴンIDを取得してみる
app = Application
oSel = app.Selection(0)
oPolys = oSel.ActivePrimitive.Geometry.Polygons
oSub = oPolys.SubComponent

#ここで取得できるのはタプルのようだ。
taple = oSub.ElementArray
app.Logmessage(str(taple))

#ちなみにSet()は、リスト、タプル、どちらでもイイみたい。