import copy #エッジ一括選択ツール #utf8足す #複数のエッジを選択状態で実行すると個々のエッジごとにエッジループ選択や #エッジパラレル選択を実行して一括で選択範囲を拡張してくれるスクリプトです。 #検索の対象は「すべての辺」以外に「後ろから何番目」というのも選択可能 #モードは「選択に追加する」と「選択から除外する」の2種類 # #パラメーター #mode   0で選択に追加する 1で選択から除外する #stype 0でエッジループ選択  1でエッジパラレル選択 #target  0ですべての選択辺が対象  1で後ろから何番目までの選択辺が対象 #nn  後ろからnn番目までが対象 #動作条件 #選択形状がポリゴンメッシュ #編集モードに入っている #辺編集モード #辺が一つ以上選択されている 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 def ring_sel(ashpe,tuikalist,imaedge,face): startedge=imaedge while True: #面から面を構成する辺のリストを作る henlist=return_henlist(face) if len(henlist)==4: vlist=list(ashape.face(face).vertex_indices) vv0=ashape.edge(imaedge).v0 vv1=ashape.edge(imaedge).v1 # print vlist vlist.remove(vv0) vlist.remove(vv1) #残った頂点二個から辺の番号を取得 for i in henlist: # print ashape.edge(i).v0,ashape.edge(i).v1 if ashape.edge(i).v0==vlist[0] and ashape.edge(i).v1==vlist[1]:temp1=i if ashape.edge(i).v1==vlist[0] and ashape.edge(i).v0==vlist[1]:temp1=i if temp1==startedge:return True else: imaedge=temp1 tuikalist.append(imaedge) tflist=[] tempface=ashape.fccwev(imaedge,vlist[0],False) if tempface>=0:tflist.append(tempface) tempface=ashape.fcwev(imaedge,vlist[0],False) if tempface>=0:tflist.append(tempface) tflist.remove(face) if len(tflist)>0: face=tflist[0] else:return False else:return False def do_ring_sel(ashape,sedge): #面の向きを統一 ashape.adjust_face_direction() dousasuru=1 #辺の両端の面リストを作る ashape.setup_winged_edge() #最後らへんでcleanし忘れないように ev0=ashape.edge(sedge).v0 ev1=ashape.edge(sedge).v1 face1=ashape.fccwev(sedge,ev0,False) face2=ashape.fcwev(sedge,ev0,False) facelist=[] if face1>=0:facelist.append(face1) if face2>=0:facelist.append(face2) if face1<0 and face2<0: #隣接面無し dousasuru=0 ashape.clean_winged_edge() if dousasuru==1: # xscene.inhibit_update() # tuikalist=[] #隣接面の数でパターンをちょっと変える if len(facelist)>1: if ring_sel(ashape,tuikalist,sedge,face1)!=True: ring_sel(ashape,tuikalist,sedge,face2) else: ring_sel(ashape,tuikalist,sedge,facelist[0]) ashape.clean_winged_edge() def do_loop_sel(ashape,sedge): #面の向きを統一 ashape.adjust_face_direction() dousasuru=1 #ポリゴンメッシュの端にある辺なのか、中にある辺なのか調べる。ついでにどっちまわりかも type=-1#隣接面が二つの場合0、一つしかない場合その1は1、 一つしかない場合その2は2 ashape.setup_winged_edge() #最後らへんでcleanし忘れないように ev0=ashape.edge(sedge).v0 ev1=ashape.edge(sedge).v1 face1=ashape.fccwev(sedge,ev0,False) face2=ashape.fcwev(sedge,ev0,False) if face1<0 and face2<0: #隣接面無し dousasuru=0 ashape.clean_winged_edge() if face1>=0 and face2>=0:type=0 if face1>=0 and face2<0:type=1 #fccwevを使う if face1<0 and face2>=0:type=2 #fcwevを使う if dousasuru==1: # xscene.inhibit_update() # tuikalist=[] #typeごとに選択辺の拡張メソッドを変える if type==0: if loop_sel1(ashape,tuikalist,sedge,ev0)!=True: loop_sel1(ashape,tuikalist,sedge,ev1) if type==1: if loop_sel2(ashape,tuikalist,sedge,ev0,1)!=True: loop_sel2(ashape,tuikalist,sedge,ev1,2) if type==2: if loop_sel2(ashape,tuikalist,sedge,ev0,2)!=True: loop_sel2(ashape,tuikalist,sedge,ev1,1) ashape.clean_winged_edge() def sort_edge_by_active_order(edgelist): #辺の選択番号(active_order)順にリストの辺番号をソートして辺リストを返す #ソート templist=[] for i in edgelist: templist.append(i) newlist=[] while(len(newlist)-1: tempedge=ashape.ecwfv(tempface,vv,False) if tempedge>-1: tempface=ashape.fcwev(tempedge,vv,False) if tempface>-1: right=ashape.ecwfv(tempface,vv,False) if right>-1: tempface=ashape.fccwev(imaedge,vv,False) if tempface>-1: tempedge=ashape.eccwfv(tempface,vv,False) if tempedge>-1: tempface=ashape.fccwev(tempedge,vv,False) if tempface>-1: left=ashape.eccwfv(tempface,vv,False) if left>-1: if left==right: if right==startedge: return True else: tuikalist.append(right) imaedge=right templist=[ashape.edge(imaedge).v0,ashape.edge(imaedge).v1] templist.remove(vv) vv=templist[0] else:return False else:return False else:return False else:return False else:return False else:return False else:return False else:return False else:return False def loop_sel2(ashape,tuikalist,imaedge,vv,type2): startedge=imaedge while True: if type2==2:tempface=ashape.fcwev(imaedge,vv,False) else:tempface=ashape.fccwev(imaedge,vv,False) if tempface>-1: if type2==2:tempedge=ashape.ecwfv(tempface,vv,False) else:tempedge=ashape.eccwfv(tempface,vv,False) if tempedge>-1: if type2==2:tempface=ashape.fcwev(tempedge,vv,False) else:tempface=ashape.fccwev(tempedge,vv,False) if tempface>-1: if type2==2:temp2=ashape.ecwfv(tempface,vv,False) else:temp2=ashape.eccwfv(tempface,vv,False) if temp2>-1: if type2==2:tempface=ashape.fcwev(temp2,vv,False) else:tempface=ashape.fccwev(temp2,vv,False) if tempface<0: if temp2==startedge:return True else: tuikalist.append(temp2) imaedge=temp2 templist=[ashape.edge(imaedge).v0,ashape.edge(imaedge).v1] templist.remove(vv) vv=templist[0] else:return False else:return False else:return False else:return False else:return False dousasuru=0 xscene=xshade.scene() ashape=xshade.scene().active_shape() if ashape.type==7 and xscene.is_modify_mode==True and xscene.selection_mode==1: edgelist=[] for i in range(ashape.number_of_edges): if ashape.edge(i).active==True: edgelist.append(i) if len(edgelist)>0:dousasuru=1 if dousasuru==1: #選択辺を選択番号順に並び替える edgelist=sort_edge_by_active_order(edgelist) #ここに初期値 renzoku=1 mode=0 stype=0 target=0 nn=1 nnmax=len(edgelist) while(renzoku==1): tuikalist=[] #ダイアログ開く dialog=xshade.create_dialog() dialog.begin_group() idx1=dialog.append_radio_button('/選択に追加する/選択から除外する') dialog.end_group() dialog.begin_group() idx2=dialog.append_radio_button('モード/エッジループ選択/エッジパラレル選択') dialog.end_group() dialog.begin_group() idx3=dialog.append_radio_button('検索の対象/すべての選択辺/後ろからn番目以内') dialog.end_group() idx4=dialog.append_int('後ろからn番目以内(max:'+str(nnmax)+')') dialog.set_value(idx1,mode) dialog.set_value(idx2,stype) dialog.set_value(idx3,target) dialog.set_value(idx4,nn) xshade.idle(10) kekka=dialog.ask('エッジ一括選択ツール') if kekka==False:renzoku=0 if kekka==True: mode=dialog.get_value(idx1) stype=dialog.get_value(idx2) target=dialog.get_value(idx3) nn=dialog.get_value(idx4) if nn<1:nn=1 if nn>nnmax:nn=nnmax motoedgelist=copy.copy(edgelist) #targetで絞りこみ if target==1: edgelist=edgelist[(len(edgelist)-nn):] for i in edgelist: if stype==0:do_loop_sel(ashape,i) if stype==1:do_ring_sel(ashape,i) if mode==1: tuikalist=tuikalist+edgelist #辺を選択に追加か除外 for i in tuikalist: if mode==0:ashape.edge(i).active=True else:ashape.edge(i).active=False xscene.exit_modify_mode() xscene.enter_modify_mode() # xscene.allow_update() #元に戻すか聞く dialog2=xshade.create_dialog() dialog2.append_push_button('処理を確定しますか?') xshade.idle(10) kekka3=dialog2.ask('エッジ一括選択ツール') if kekka3==True: renzoku=0 if kekka3==False: #選択状態を元に戻す for i in range(ashape.number_of_edges): ashape.edge(i).active=False for i in motoedgelist: ashape.edge(i).active=True for i in range(len(motoedgelist)): xshade.scene().active_shape().edge(motoedgelist[i]).active_order=i+1 edgelist=copy.copy(motoedgelist) xscene.exit_modify_mode() xscene.enter_modify_mode()