選択したエッジを繋ぐようにポリゴンを分割するスクリプト
SiloのConnectツールみたいなヤツ
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");