#エッジパラレル選択(追加型) #最後に選択したエッジから探索を開始し、その辺と面を共有していてかつ頂点は共有していない辺をどんどん選択に追加していきます #ただし、面を構成する頂点の数が4個の面に限る #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) 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 if xshade.scene().active_shape().edge(i).v1==pointnum1 and xshade.scene().active_shape().edge(i).v0==pointnum2: returnnum=i 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 #102 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 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().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: #一番最後に選択した辺の辺番号を調べる # 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 #その辺に隣接している面のリストを作成 startmenlist=return_menlist(startedge) tuikaedgelist=[startedge] for pp in startmenlist: kurikaesu=1 tanmen=pp#現在の査定面番号 imaedge=startedge while(kurikaesu==1): #まず現在の面の頂点数が4個か調べる そうでないならkurikaesuを0に menpoints=list(xshade.scene().active_shape().face(tanmen).vertex_indices) if len(menpoints)==4: #面の頂点4個からimaedgの頂点二個を引くと、面の反対側の辺を構成する頂点2個が得られる temppointlist=[xshade.scene().active_shape().edge(imaedge).v0,xshade.scene().active_shape().edge(imaedge).v1] newedgepointlist=substract_b_from_a(menpoints,temppointlist) #新しく追加する辺の番号は newedgenum=return_edge_number(newedgepointlist[0],newedgepointlist[1]) #すでに追加エッジリストに入ってないか調べる(入ってたらkurikaesuを0に、入ってたら追加してimaedgeとtanmen更新) hantei1=0 for jjj in tuikaedgelist: if jjj==newedgenum: hantei1+=1 if hantei1>0: kurikaesu=0 else: tuikaedgelist.append(newedgenum) imaedge=newedgenum tempmenlist33=return_menlist(imaedge) if len(tempmenlist33)>1: tempmenlist33=substract_b_from_a(tempmenlist33,[tanmen]) tanmen=tempmenlist33[0] else: kurikaesu=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()