2012年3月14日水曜日

Softimage Script : PostScript : ExportUV2EPS V0.1

プリンターに出力するときに送られるファイルを
psファイルというのです。

まあ、説明はいろいろ省いてw
イラストレターに使われるベクターデータも記述できるファイルと思ってOKだと思う。
ベクターだけだと、写真張れないジャン、ってことで、
画像を埋め込めるようになった拡張がepsファイル。
ちょっと昔のPhotoshop Illustrator共通の保存形式ですな。
※現在はさらに拡張されて、おなじみのPDFとなっております。


Softimage StampUV

SoftimageのUVの画像書き出しStampUVなのですが
チェック模様のバックから書き出そうとすると
グレーで選択、出力出来ませんでした

これ、既存のテクスチャがないと、
UV描けない仕様なんだよね~弱


PostScript 記述

最近UVのプラグインを続けてたので、UVの座標が扱える
ならば、そのポストスクリプトを直接書き出せればいいんじゃね?
と思い立ち調べてみた。DTPの仕事と重なるので、損はなかろう

ということでサンプル

ポストスクリプトはこんな記述みたい


newpath
0 0 moveto
200 0 lineto
100 200 lineto
closepath
fill



コレをポリゴンごとにやれば出来るかもね~
※急にめんどくさくなったので、PrintScreenでOKってことでw

以下後記

実作業をやっていてやはり、UVが簡単に書き出せないのは痛い。
めんどくさい。
メンドクサイがメンドクサイを上回ったときがToolを作る時w
ちょっと昼休みにPythonで組んでみた
多少制限があるものの,思った以上にすんなりできた


ExportUV2EPS


プラグインにするには、まだ足りないのだけど
いろいろ多忙になり、拡張する暇がなさそうなので
コードをさらしておきます

思ったより反響があったので折を見て、
プラグイン化するかもしれません

それまでに使いたい人がありましたら、ご自身の責任でどぞ~。


ExportUV2EPS v0.1


※現状の制限
・書き出しは固定 R:\ExportUV.eps
・解像度は1024、アスペクト比は固定(ベクターデーターなので依存するのは塗りだし)
・塗りだしサイズは 2pix (解像度、アスペクト比に依存)
・マテリアル周りの検証が不完全だと思われる


#ExportUV2EPS
#
#UVをEPSファイルで書き出します
#

#グローバル変数 解像度と、出力先を指定
pictSize = 1024
path = "R:\ExportUV.eps"

app = Application; log = app.LogMessage
import re


#-------------------------------------------------
# getCurrentTextureEditer
#-------------------------------------------------
def getCurrentTextureEditer():
 ly = app.Desktop.ActiveLayout
 views = ly.Views

 TextureEditerView = False

 #vmだった場合の処理
 for view in views:
  if view.name == "vm":
   for vmView in view.views:
    if vmView.Type == "Texture Editor":
     TextureEditerView = vmView

 #フローティングパレットを精査 上書き
 for view in views:
  if view.Type == "Texture Editor":
   TextureEditerView = view

 return TextureEditerView


#-------------------------------------------------
# x() 倍率設定
#-------------------------------------------------
def x(var):
 return pictSize * var


#-------------------------------------------------
# writeHeader() epsのヘッダー
#------------------------------------------------- 
def writeHeader(f):
 f.write(
  "%!PS-Adobe-3.0 EPSF-3.0\n" +
  "%%BoundingBox: 0 0 " + str(pictSize) + " " + str(pictSize) + "\n\n" +
  "newpath" + "\n" +
  str(x(0)) + " " + str(x(0)) + " " + "moveto" + "\n" +
  str(x(1)) + " " + str(x(0)) + " " + "lineto" + "\n" +
  str(x(1)) + " " + str(x(1)) + " " + "lineto" + "\n" +
  str(x(0)) + " " + str(x(1)) + " " + "lineto" + "\n" +
  "closepath 0.0 setlinewidth stroke\n\n"
 )
 return


#-------------------------------------------------
# writeLine() 通常の lineto
#-------------------------------------------------
def writeLine(u,v):
 return  str(x(u)) + " " + str(x(v)) + " " + "lineto" + "\n"


#-------------------------------------------------
# fwriteLine() 最初の書き込み moveto
#-------------------------------------------------
def fwriteLine(u,v):
 return  str(x(u)) + " " + str(x(v)) + " " + "moveto" + "\n" 


#-------------------------------------------------
# writePS(inPolygon,in_aUV,f)
#-------------------------------------------------
def writePS(inPolygon,in_aUV,f,oColor):
 
 #始まり
 f.write("\n" + "newpath\n")
 
 #サンプルの数だけ繰り返す
 oSamples = inPolygon.Samples
 oSampleCount = oSamples.Count
 u = in_aUV[0][oSamples[0].Index]
 v = in_aUV[1][oSamples[0].Index]
 f.write(fwriteLine(u,v))
  
 for i in range(oSampleCount):
  if (i != 0):
   u = in_aUV[0][oSamples[i].Index]
   v = in_aUV[1][oSamples[i].Index]
   f.write(writeLine(u,v)) 

 #Color
 if oColor != None:
  r = oColor.Parameters("red").Value
  g = oColor.Parameters("green").Value
  b = oColor.Parameters("blue").Value
 else :
  r = g = b = 0

 f.write(str(r) + " " + str(g) + " " + str(b) + " setrgbcolor\n" )
 f.write("closepath\n")
 f.write("gsave\n") 
 f.write("fill\n")
 f.write("grestore\n")
 f.write("4.0 setlinewidth stroke\n")
 
 return
 

#-------------------------------------------------
# main()
#-------------------------------------------------
def main():
 f = open( path ,"w")
 writeHeader(f)
 
 #TextureEditerを取得
 TE = getCurrentTextureEditer() 
 if TE == False:
  log("Not Found TextureEditer")
  return
  
 #プロジェクション名を取得
 aStrProjection = TE.GetAttributeValue("allprojectionnames")
 if (aStrProjection == None):
  log("Not Found UV")
  return
  
 lStrProjection = aStrProjection.split(",")
 for strProjection in lStrProjection:
  oProjection = app.Dictionary.GetObject(strProjection)
  aUV = oProjection.Elements.Array
  oObj = oProjection.Parent3DObject
  oGeo = oObj.ActivePrimitive.Geometry
  oPolys = oGeo.Polygons
  oMat = oObj.Material
  oShaders = oMat.GetAllShaders()
  for oShader in oShaders:
   #log(oShader.ProgID)
   if oShader.ProgID == "Softimage.material-phong.1.0":
    oColor = oShader.parameters("Diffuse")
   elif oShader.ProgID == "Softimage.material-lambert.1.0":
    oColor = oShader.parameters("Diffuse")
   elif oShader.ProgID == "Softimage.material-blinn.1.0":
    oColor = oShader.parameters("Diffuse")
   elif oShader.ProgID == "Softimage.material-constant.1.0":  
    oColor = oShader.parameters("Color")
   elif oShader.ProgID == "Softimage.sitoon_paint.1.0":  
    oColor = oShader.parameters("Color")
   else:
    oColor = None

  
  for oPoly in oPolys:
   writePS(oPoly,aUV,f,oColor)


 f.close()
 log("----- Export Eps!!! -----")

main()


今後の拡張

・PPGに対応
・出力先のダイアログの設定
・線の描画のON OFF
・オフセットのON OFF
・Plugin化 ・0-1以上に対応するかの ON OFF
・アスペクト比の対応

うお、けっこうありやがりますよ !

0 件のコメント:

コメントを投稿