import copy #エッジバウンダリー選択(追加型) #最後に選択したエッジから探索を開始し、接続されている縁部分の辺をどんどん選択に追加していきます #SHIFTキーを押しながらエッジを選択してからこのスクリプトを実行すると選択辺をどんどん追加していけます #追加選択したくない場合はSHIFTキーを押さないでエッジを一つだけ選択してからスクリプトを実行してください #動作条件 #ポリゴンメッシュ #編集モード #辺選択モード #辺が一つでも選択されている事 #最後に選択した辺の隣接面が一つのみ場合機能 #アルゴリズム変更(2010.01.31) #面の向きバラバラで動作するか? def boundary_sel(ashape,imaedge,vv,eflist,velist): startedge=imaedge mugen=0 while True: if len(velist[vv])>1: tvelist=copy.copy(velist[vv]) tvelist.remove(imaedge) hantei=0 for i in tvelist: if len(eflist[i])==1: tempedge=i hantei+=1 break if hantei>0: if tempedge==startedge:return True else: tuikalist.append(tempedge) imaedge=tempedge tempv01=[ashape.edge(imaedge).v0,ashape.edge(imaedge).v1] tempv01.remove(vv) vv=tempv01[0] mugen+=1 if mugen>5000:return False else:return False else:return False def return_henlist(face): #面番号から面を構成する辺の番号を返す #前後にsetup_winged_edgeとclean_winged_edgeが必要 tempvlist=xshade.scene().active_shape().face(face).vertex_indices henlist=[] for i in tempvlist: tempf=xshade.scene().active_shape().eccwfv(face,i,False) henlist.append(tempf) return henlist dousasuru=1 if xshade.scene().active_shape().type==7: if xshade.scene().selection_mode!=1 or xshade.scene().is_modify_mode==False: dousasuru=0 else: #選択されている辺のリストを作るとともに、辺が一つでも選択されてるか判定 activeedgelist=[] for i in range(xshade.scene().active_shape().number_of_edges): if xshade.scene().active_shape().edge(i).active_order>0: activeedgelist.append(i) if len(activeedgelist)<1: dousasuru=0 else: dousasuru=0 if dousasuru==1: #一番最後に選択した辺の辺番号を調べる startedge=activeedgelist[0] for i in activeedgelist: if xshade.scene().active_shape().edge(i).active_order>xshade.scene().active_shape().edge(startedge).active_order: startedge=i xscene=xshade.scene() ashape=xshade.scene().active_shape() #後で呼び出すリストを作成 velist=[] #頂点に接続されている辺(接続辺)のリスト(頂点番号順に並べてる) eflist=[] #辺の隣接面リスト(辺番号順に並べている) for i in range(ashape.total_number_of_control_points): velist.append([]) for i in range(ashape.number_of_edges): eflist.append([]) ashape.setup_winged_edge() for i in range(ashape.number_of_edges): vv0=ashape.edge(i).v0 vv1=ashape.edge(i).v1 temp=velist[vv0] temp.append(i) velist[vv0]=temp temp=velist[vv1] temp.append(i) velist[vv1]=temp for i in range(ashape.number_of_faces): henlist=return_henlist(i) for gg in henlist: temp=eflist[gg] temp.append(i) eflist[gg]=temp ashape.clean_winged_edge() #最初の辺の隣接面の数が1以下か? if len(eflist[startedge])>1: dousasuru=0 if dousasuru==1: tuikalist=[] ev0=ashape.edge(startedge).v0 ev1=ashape.edge(startedge).v1 if boundary_sel(ashape,startedge,ev0,eflist,velist)!=True: boundary_sel(ashape,startedge,ev1,eflist,velist) xscene.inhibit_update() #追加エッジをアクティブにしていく for i in tuikalist: xshade.scene().active_shape().edge(i).active=True xscene.allow_update()