2005年06月30日

SplitEdge

選択したエッジを繋ぐようにポリゴンを分割するスクリプト
SiloのConnectツールみたいなヤツ

SplitEdge

2005/06/30
マテリアルがデフォルトになってしまうのを修正
シンメトリーモード時に使うとポリゴンが裏返ってしまうのを修正

 

#! perl

#
# SplitEdge
#
# 選択したエッジを繋ぐようにポリゴンを分割します
#


# エッジモードでなければ終了させる
if( !lxq("select.typeFrom typelist:edge;vertex;polygon;item ?") ){
 die("Must be in Edge selection mode.");
}


lxout("--- SplitEdge.pl --- START");

# シンメトリーモードを一旦解除
my $sym = lxq("select.symmetryAxis ?");
if( "x" == $sym ){
 lx("select.symmetryAxis off");
}


my $mainLayer = lxq("query layerservice layers ? main");
my @selEdges = lxq("query layerservice edges ? selected");
my $numSelEdge = lxq("query layerservice edge.N ? selected");


# 選択されたエッジを含むポリゴンを選択して
# 配列@selPolysに保存
lx("select.drop polygon");
foreach my $edge (@selEdges){
 my @polys = lxq("query layerservice edge.polyList ? $edge");
 foreach $pol (@polys){
  lx("select.element $mainLayer polygon add $pol");
 }
}
my @selPolys = lxq("query layerservice polys ? selected");


# エッジ中間に作られる頂点
# 配列@newVertの初期化
my @newVerts = ();
foreach my $edge (@selEdges){
 push(@newVerts, -1);
}


# 張替え用の新しいポリゴンを作る
# ポリゴン毎に頂点リストを作り、分割されるエッジ
# の中間に新しい頂点を挿入していき、頂点の増えた
# ポリゴンを作る
foreach $pol (@selPolys){
 @polverts = lxq("query layerservice poly.vertList ? $pol");
 push(@polverts, $polverts[0]);
 $numverts = lxq("query layerservice poly.numVerts ? $pol");
 @verts = ();
 for( my $i = 0; $i < $numverts; $i++ ){
  push(@verts, $polverts[$i]);
  for( my $j=0; $j<$numSelEdge; $j++){
   my @v = lxq("query layerservice edge.vertList ? $selEdges[$j]");
   if( $polverts[$i] == $v[0] ){
    if( $polverts[$i+1] == $v[1] ){
     if( $newVerts[$j] == -1 ){
      lx("select.drop vertex");
      lx("select.invert");
      @pos = lxq("query layerservice edge.pos ? $selEdges[$j]");
      lx("vert.new $pos[0] $pos[1] $pos[2]");
      $newVerts[$j] = lxq("query layerservice verts ? unselected");
     }
     push(@verts, $newVerts[$j]);
     last;
    }
   }elsif( $polverts[$i] == $v[1] ){
    if( $polverts[$i+1] == $v[0] ){
     if( $newVerts[$j] == -1 ){
      lx("select.drop vertex");
      lx("select.invert");
      @pos = lxq("query layerservice edge.pos ? $selEdges[$j]");
      lx("vert.new $pos[0] $pos[1] $pos[2]");
      $newVerts[$j] = lxq("query layerservice verts ? unselected");
     }
     push(@verts, $newVerts[$j]);
     last;
    }
   }
  }
 }
 lx("select.drop polygon");
 lx("select.drop vertex");
 foreach $v (@verts){
  lx("select.element $mainLayer vertex add $v");
 }
 my $type = lxq("query layerservice poly.type ? $pol");
 my $mat = lxq("query layerservice poly.material ? $pol");
 my $part = lxq("query layerservice poly.part ? $pol");
 my @selSets = lxq("query layerservice poly.selSets ? $pol");
# my @tags = lxq("query layerservice poly.tags ? $pol");
# my @tagTypes = lxq("query layerservice poly.tagTypes ? $pol");
 lx("poly.make $type");
 lx("select.type polygon");
 lx("poly.setMaterial $mat");
 lx("poly.setPart $part");
 foreach my $sSet (@selSets){
  lx("select.editSet $sSet add");
 }
# foreach my $t (@tags){
#  my $tType  shift(@tagTypes);
# }
}


# 古いポリゴンを選択して削除
lx("select.drop polygon");
foreach $p (@selPolys){
 lx("select.element $mainLayer polygon add $p");
}
lx("select.delete");


# 追加した頂点を選択してsplitコマンドを実行
lx("select.drop edge");
lx("select.drop vertex");
foreach $v (@newVerts){
 lx("select.element $mainLayer vertex add $v");
}
lx("poly.split");

lx("select.convert edge");


# シンメトリーモードに戻す
if( "x" == $sym ){
 lx("select.symmetryAxis x");
}

lxout("--- SplitEdge.pl --- END");

【関連する記事】
posted by toka at 11:47| Comment(0) | TrackBack(0) | modo: perl | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。