#内方面選択スクリプト #shade標準の「内方面選択」ツールでは正常に選択できない内包面を選択状態にします #正確には、「面を構成している全ての辺の隣接面の数が3以上の面」を内包面(ポリゴンメッシュの中に作られた面)とみなして選択状態にします。 #動作条件 #選択形状がポリゴンメッシュかどうか 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 range(len(menpoints)): if i!=(len(menpoints)-1): kumiawase.append([menpoints[i],menpoints[i+1]]) else: kumiawase.append([menpoints[i],menpoints[0]]) for i in kumiawase: modori=return_edge_number(i[0],i[1]) returnlist.append(modori) return returnlist 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 erase_same_num(list1): #リスト内に同じ値が重複する場合は一つに減らす関数 例[1,1,1,3,3,4]→[1,3,4] #呼び出す時はlist=erase_same_num(list)ではなく、erase_same_num(list)で良い 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=0 if xshade.scene().active_shape().type==7:dousasuru=1 if dousasuru==1: nailist=[] xshade.scene().enter_modify_mode() xshade.scene().selection_mode=0 #面を構成する全ての辺の隣接面の数が3以上の面をリストに加えていく for i in range(xshade.scene().active_shape().number_of_faces): edgelist=return_edgelist(i) hantei=0 for g in edgelist: if len(return_menlist(g))>=3:hantei+=1 if hantei==len(edgelist):nailist.append(i) if len(nailist)==0: text1='内包面は見つかりませんでした' else: text1=str(len(nailist))+'個の内包面が見つかりました。' #内包面を選択状態にした後、ダイアログ表示 for i in range(xshade.scene().active_shape().number_of_faces): xshade.scene().active_shape().face(i).active=False for i in nailist: xshade.scene().active_shape().face(i).active=True dialog=xshade.create_dialog() idx=dialog.append_push_button(text1) dialog.ask('内包面選択')