import copy #カゴ作成支援スクリプト #バージョン1改 #選択している面と一番近い面(ただし選択面の隣の面は除く)とブリッジ処理を行います #スーパーのカゴみたいなのを作る際の支援スクリプト #厚みがありすぎるとうまく機能しません #上位パートに変換がかかっていると使用できないように変更(2010.03.03) #処理速度高速化(2010.12.28) #shade121も対応(2011.12.09) #shade1301に対応 #動作条件 #選択形状がポリゴンメッシュ #編集モードに入っている #面編集モード #選択面が一つ以上ある def erase_same_num_all(list1): #リスト内に同じ値が重複する場合はその値を全て消したリストを返す関数 例[1,1,1,3,3,4]→[4] #erase_same_numが必要 list1copy=[] for i in range(len(list1)): list1copy.append(list1[i]) list1copy.sort() nagasa=len(list1copy) if nagasa>1: kesu=[] for i in range(nagasa-1): if list1copy[i]==list1copy[i+1]: kesu.append(list1copy[i]) kesukaisuu=len(kesu) if kesukaisuu>0: for i in kesu: list1copy.remove(i) erase_same_num(kesu) if len(kesu)>0: for i in kesu: list1copy.remove(i) return list1copy 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) 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 xscene=xshade.scene() ashape=xshade.scene().active_shape() dousasuru=0 if ashape.type==7 and xscene.selection_mode==0 and xscene.is_modify_mode==True: afacelist=[] for i in range(ashape.number_of_faces): if ashape.face(i).active==True: afacelist.append(i) if len(afacelist)>0:dousasuru=1 if dousasuru>0: #上位パートに変換がかかっているなら動作しない if xshade.scene().active_shape().local_to_world_matrix!=((1.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0), (0.0, 0.0, 0.0, 1.0)): dousasuru=0 dialog=xshade.create_dialog() dialog.append_push_button('上位パートに変換がかかっているため') dialog.append_push_button('スクリプトが実行できません') dialog.ask('エラー') if dousasuru==1: #元の形状をクリップボードにコピー xshade.scene().inhibit_update() ashape.copy() xscene.enter_modify_mode() eflist=[]#辺に隣接されている面リストを辺番号順に格納したもの felist=[]#面を構成する辺リストを面番号順に格納したもの #return_henlist必要 for i in range(xshade.scene().active_shape().number_of_edges): eflist.append([]) xshade.scene().active_shape().setup_winged_edge() for i in range(xshade.scene().active_shape().number_of_faces): thenlist=return_henlist(i) felist.append(thenlist) for gg in thenlist: tempf=eflist[gg] tempf.append(i) eflist[gg]=tempf xshade.scene().active_shape().clean_winged_edge() #隣接面の隣接面も対象にする? rinlist=[]#隣接面リスト+選択面 for i in afacelist: temphenl=felist[i] ttl=[] for gg in temphenl: ttl+=eflist[gg] for gg in range(len(temphenl)): ttl.remove(i) ttl3=copy.copy(ttl) for gg in ttl3: temphenl2=felist[gg] ttl2=[] for hh in temphenl2: ttl2+=eflist[hh] # for hh in range(len(temphenl2)): # ttl2.remove(i) ttl+=ttl2 ttl+=afacelist rinlist.append(ttl) cfacelist=[]#面の中心座標を面番号順に格納したもの for i in range(ashape.number_of_faces): vlist=list(ashape.face(i).vertex_indices) xsum=0 ysum=0 zsum=0 for gg in vlist: xsum=xsum+ashape.vertex(gg).position[0] ysum=ysum+ashape.vertex(gg).position[1] zsum=zsum+ashape.vertex(gg).position[2] temppos=[xsum/len(vlist),ysum/len(vlist),zsum/len(vlist)] cfacelist.append(temppos) #選択面を構成する辺のうち二つの選択面にはさまれていない辺のみを選別したリストを作る edgelist=[] for i in afacelist: edgelist+=felist[i] edgelist=erase_same_num_all(edgelist) #選択面と一番近い面を探す kinflist=[] for i in range(len(afacelist)): dist=100000000 min=-1 for gg in range(ashape.number_of_faces): tenrin=rinlist[i] hantei=0 for hh in tenrin: if gg==hh:hantei+=1 if hantei==0: dist2=(cfacelist[gg][0]-cfacelist[afacelist[i]][0])**2+(cfacelist[gg][1]-cfacelist[afacelist[i]][1])**2+(cfacelist[gg][2]-cfacelist[afacelist[i]][2])**2 if dist2