#エッジループ選択(追加型) #最後に選択したエッジから探索を開始し、エッジループを追加します #SHIFTキーを押しながらエッジを選択してからこのスクリプトを実行すると選択辺をどんどん追加していけます #追加選択したくない場合はSHIFTキーを押さないでエッジを一つだけ選択してからスクリプトを実行してください #はしっこのポイントも選べるように改良すべし #処理遅いので高速化(特定の条件のみ) def return_pointlist(pointnum): #その点と接続されている頂点の頂点番号をリストで返す(引数 頂点番号) pointlist=[] totaledgesuu=xshade.scene().active_shape().number_of_edges for i in range(totaledgesuu): if xshade.scene().active_shape().edge(i).v0==pointnum: pointlist.append(xshade.scene().active_shape().edge(i).v1) if xshade.scene().active_shape().edge(i).v1==pointnum: pointlist.append(xshade.scene().active_shape().edge(i).v0) return pointlist def return_menlist(edgenumber): #その辺を共有する面の面番号をリストで返す(引数 辺番号) menlist=[] edgevertex=[xshade.scene().active_shape().edge(edgenumber).v0,xshade.scene().active_shape().edge(edgenumber).v1] totalmenmen=xshade.scene().active_shape().number_of_faces for i in range(totalmenmen): konomen=0 temppoint=list(xshade.scene().active_shape().face(i).vertex_indices) for j in temppoint: if edgevertex[0]==j: konomen+=1 if edgevertex[1]==j: konomen+=1 if konomen==2: menlist.append(i) if len(menlist)==2: break return menlist def return_edgelist(mennumber): #その面を構成する辺の辺番号をリストで返す #def return_edge_numberが必要 #def erase_same_num が必要 returnlist=[] menpoints=list(xshade.scene().active_shape().face(mennumber).vertex_indices) kumiawase=[]#頂点を組みあわせたリスト(重複分は削除する) for i in menpoints: for j in menpoints: if i!=j: tempp=[i,j] tempp.sort() kumiawase.append(tempp) erase_same_num(kumiawase) for i in kumiawase: modori=return_edge_number(i[0],i[1]) if modori!=-1: returnlist.append(modori) return returnlist def return_same_num(list1): #リスト内に同じ値が重複する場合は重複する値だけを返す関数 例[1,1,1,3,3,4]→[1,3] #def erase_same_numが必要 list1.sort() nagasa=len(list1) if nagasa>1: kesu=[] for i in range(nagasa-1): if list1[i]==list1[i+1]: kesu.append(list1[i]) erase_same_num(kesu) return kesu def return_edge_number(pointnum1,pointnum2): #頂点二つの頂点番号を与えると、その頂点で構成される辺の辺番号を返す #エラー(辺の両端のポイントでは無い)の場合は-1を返す returnnum=-1 for i in range(xshade.scene().active_shape().number_of_edges): if xshade.scene().active_shape().edge(i).v0==pointnum1 and xshade.scene().active_shape().edge(i).v1==pointnum2: returnnum=i break if xshade.scene().active_shape().edge(i).v1==pointnum1 and xshade.scene().active_shape().edge(i).v0==pointnum2: returnnum=i break return returnnum def substract_b_from_a(lista,listb): #リストAからリストBに存在する要素を抜く a[1,2,3,4,4,5] b[3,4] 結果[1,2,5] #リストBに重複する値が存在するとエラーが出るので、あらかじめ重複する値は消しておく kesulis=[] for i in listb: for j in lista: if j==i: kesulis.append(i) for i in kesulis: lista.remove(i) return lista def return_setuzokuhen(point): #頂点番号を渡すと、その頂点と接続されている辺のリストを返す henlist=[] for i in range(xshade.scene().active_shape().number_of_edges): if xshade.scene().active_shape().edge(i).v0==point or xshade.scene().active_shape().edge(i).v1==point: henlist.append(i) return henlist #104行目 def erase_same_num(list1): #リスト内に同じ値が重複する場合は一つに減らす関数 例[1,1,1,3,3,4]→[1,3,4] list1.sort() nagasa=len(list1) if nagasa>1: kesu=[] for i in range(nagasa-1): if list1[i]==list1[i+1]: kesu.append(list1[i]) kesukaisuu=len(kesu) if kesukaisuu>0: for i in kesu: list1.remove(i) dousasuru=1 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 if dousasuru==1: #一番最後に選択した辺の辺番号を調べる # for i in activeedgelist: # if xshade.scene().active_shape().edge(i).active_order==len(activeedgelist): # startedge=i 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 #その辺の端点の頂点番号リストを作成し、この最初の辺を追加辺リストに入れる tuikaedgelist=[startedge] tanten=[xshade.scene().active_shape().edge(startedge).v0,xshade.scene().active_shape().edge(startedge).v1] #ここで全ての辺を検査して、頂点番号順に接続辺のリストを作成するとともに、頂点番号順に接続頂点のリストも一緒に作成 # setuzokupointlist=[] # setuzokuhenlist=[] # for i in range(xshade.scene().active_shape().total_number_of_control_points): # setuzokupointlist.append([]) # setuzokuhenlist.append([]) # for i in range(xshade.scene().active_shape().number_of_edges): # p11=xshade.scene().active_shape().edge(i).v0 # p22=xshade.scene().active_shape().edge(i).v1 # setuzokupointlist[p11].append(p22) # setuzokupointlist[p22].append(p11) # setuzokuhenlist[p11].append(i) # setuzokuhenlist[p22].append(i) #一番最後に選択された辺(選択開始辺)がグリッドの端っこにないかどうか判定して修正 temp2=4 # if len(setuzokuhenlist[tanten[0]])<4 and len(setuzokuhenlist[tanten[1]])<4: if len(return_setuzokuhen(tanten[0]))<4 and len(return_setuzokuhen(tanten[1]))<4: temp2=3 for pp in tanten: kurikaesu=1 tanten1=pp imaedge=startedge while(kurikaesu==1): #tanten1が接している点の数を調べ、temp2(4)以外ならループを抜け出す #ただし最初の選択辺がグリッドの端にある場合は4ではなく3以外の時ループを抜けだす # if len(setuzokupointlist[tanten1])!=temp2: if len(return_pointlist(tanten1))!=temp2: break if temp2==3: #imaedgeを共有する面(一つか二つ)の面番号リストを求め、その面を構成する辺の番号リストを入手(重複分は消す) edgelistkyou=[] menlis=return_menlist(imaedge) for i in menlis: edgelistkyou+=return_edgelist(i) erase_same_num(edgelistkyou) #tanten1と接続されてる辺のリストを得て、その中に先ほど入手した辺が含まれてる場合はのぞく(辺が一つのみ残る) # tempedgelist=setuzokuhenlist[tanten1] tempedgelist=return_setuzokuhen(tanten1) tempedgelist=substract_b_from_a(tempedgelist,edgelistkyou) if temp2==4:#eccwfvとかの命令を使って簡単に次の辺を入手 tentenedge=imaedge xshade.scene().active_shape().setup_winged_edge() tempmen11=xshade.scene().active_shape().fcwev(tentenedge,tanten1,False) tentenedge=xshade.scene().active_shape().ecwfv(tempmen11,tanten1,False) tempmen11=xshade.scene().active_shape().fcwev(tentenedge,tanten1,False) tentenedge=xshade.scene().active_shape().ecwfv(tempmen11,tanten1,False) xshade.scene().active_shape().clean_winged_edge() tempedgelist=[] tempedgelist.append(tentenedge) #この残った辺はすでに格納されてないか?(ループしてないか?) if kurikaesu==1 and len(tempedgelist)==0:kurikaesu=0 if kurikaesu==1: for jj in tuikaedgelist: if jj==tempedgelist[0]: kurikaesu=0 #格納されてないなら追加エッジリストに格納し、imaedgeとtanten1も更新 if kurikaesu==1: tuikaedgelist.append(tempedgelist[0]) imaedge=tempedgelist[0] temptantenlist=[xshade.scene().active_shape().edge(imaedge).v0,xshade.scene().active_shape().edge(imaedge).v1] temptan=substract_b_from_a(temptantenlist,[tanten1]) tanten1=temptan[0] #追加エッジをアクティブにしていく for i in tuikaedgelist: xshade.scene().active_shape().edge(i).active=True xshade.scene().exit_modify_mode() xshade.scene().enter_modify_mode() xshade.scene().update_figure_window()