#内方面選択スクリプト #アルゴリズム変更(2010.01.30) #shade標準の「内方面選択」ツールでは正常に選択できない内包面を選択状態にします #正確には、「面を構成している全ての辺の隣接面の数が3以上の面」を内包面(ポリゴンメッシュの中に作られた面)とみなして選択状態にします。 #動作条件 #選択形状がポリゴンメッシュかどうか 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=0 if xshade.scene().active_shape().type==7:dousasuru=1 if dousasuru==1: xscene=xshade.scene() ashape=xshade.scene().active_shape() #面の向きを統一 ashape.adjust_face_direction() nailist=[] felist=[]#面を構成する辺のセットリスト eflist=[]#辺の隣接面リスト for i in range(ashape.number_of_faces): felist.append([]) for i in range(ashape.number_of_edges): eflist.append([]) #すべての面で面を構成する辺の情報を得てリストに格納していく ashape.setup_winged_edge() for i in range(ashape.number_of_faces): henlist=return_henlist(i) felist[i]=henlist for gg in henlist: temp=eflist[gg] temp.append(i) eflist[gg]=temp ashape.clean_winged_edge() #すべての面で、各面を構成するすべての辺の隣接面が3以上の場合内包面 for i in range(ashape.number_of_faces): henlist=felist[i] hantei=0 for g in henlist: if len(eflist[g])>=3:hantei+=1 if hantei==len(henlist):nailist.append(i) if len(nailist)==0: text1='内包面は見つかりませんでした' else: xshade.scene().enter_modify_mode() xshade.scene().selection_mode=0 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('内包面選択')