import copy #ビトウィーン選択 #最後から二番目に選択に追加された要素(頂点、辺、面)と最後に選択に追加された要素を結ぶ形で選択が拡張されます #選択箇所と形状の形によっては進行方向がわからず選択が拡張されない場合もあります。 #現在のアルゴリズムはあんま賢くないです(思ったような結果にならない事がままあり) #shade1301対応 def return_svec(vec): #長さが1の単位ベクトルにして返す if vec[0]==0 and vec[1]==0 and vec[2]==0: tvec=[0,0,0] else: dist=pow(vec[0]**2+vec[1]**2+vec[2]**2,0.5) tvec=[vec[0]/dist,vec[1]/dist,vec[2]/dist] return tvec def sort_point_by_active_order(pointlist): #頂点の選択番号(active_order)順にリストの頂点番号をソートして頂点リストを返す #ソート templist=[] for i in pointlist: templist.append(i) newlist=[] while(len(newlist)0: activepointlist.append(i) if len(activepointlist)>1: #選択番号順に並び替え activepointlist=sort_point_by_active_order(activepointlist) vvlist=[]#頂点と接続している頂点のリストを頂点番号順に格納したリスト for i in range(ashape.total_number_of_control_points): vvlist.append([]) for i in range(ashape.number_of_edges): vv0=ashape.edge(i).v0 vv1=ashape.edge(i).v1 tempvl=vvlist[vv0] tempvl.append(vv1) vvlist[vv0]=tempvl tempvl=vvlist[vv1] tempvl.append(vv0) vvlist[vv1]=tempvl tuikalist=[] stp=activepointlist[len(activepointlist)-2]#スタート imap=stp endp=activepointlist[len(activepointlist)-1]#ゴール owari=0 #選択されている頂点と接続している頂点のうち、一番距離が近い頂点を追加リストにいれていく while True: mugen+=1 if mugen>5000: tuikalist=[] owari=1 if owari==1:break templistv=vvlist[imap] mindist=-1 maxnum=0 tugip=-1 endpos=ashape.vertex(endp).position imapos=ashape.vertex(imap).position # for i in templistv: # kouhopos=ashape.vertex(i).position # t1=[endpos[0]-imapos[0],endpos[1]-imapos[1],endpos[2]-imapos[2]] # t1=return_svec(t1) # t2=[kouhopos[0]-imapos[0],kouhopos[1]-imapos[1],kouhopos[2]-imapos[2]] # t2=return_svec(t2) # t12=t1[0]*t2[0]+t1[1]*t2[1]+t1[2]*t2[2] # if tugip==-1 or t12>maxnum: # maxnum=t12 # tempp=i for i in templistv: endpos=ashape.vertex(endp).position temppos=ashape.vertex(i).position dist=(endpos[0]-temppos[0])**2+(endpos[1]-temppos[1])**2+(endpos[2]-temppos[2])**2 if mindist==-1 or mindist>dist: mindist=dist tempp=i if tempp==endp:owari=1 else: tuikalist.append(tempp) imap=tempp #追加ポイントをアクティブにしていく # erase_same_num(tuikalist) for i in tuikalist: xshade.scene().active_shape().vertex(i).active=True xshade.scene().exit_modify_mode() xshade.scene().enter_modify_mode() #結果を確定するかダイアログ表示 dialog=xshade.create_dialog() dialog.append_push_button('結果を確定しますか?') if mugen<4000: xshade.idle(120) kekka=dialog.ask('ビトウィーン選択') if kekka==False: #元に戻す for i in range(ashape.total_number_of_control_points): ashape.vertex(i).active=False for i in activepointlist: ashape.vertex(i).active=True xshade.scene().exit_modify_mode() xshade.scene().enter_modify_mode() #選択辺のビトウィーン選択 if xshade.scene().selection_mode==1 and xshade.scene().is_modify_mode==True and xshade.scene().active_shape().type==7: #選択されている辺のリスト作成 aelist=[] for i in range(xshade.scene().active_shape().number_of_edges): if xshade.scene().active_shape().edge(i).active_order>0: aelist.append(i) if len(aelist)>1: #選択番号順に並び替え aelist=sort_edge_by_active_order(aelist) ste=aelist[len(aelist)-2] ende=aelist[len(aelist)-1] velist=[]#頂点と接続されている辺のリストを頂点番号順に格納したリスト for i in range(ashape.total_number_of_control_points): velist.append([]) for i in range(ashape.number_of_edges): vv0=ashape.edge(i).v0 vv1=ashape.edge(i).v1 tempel=velist[vv0] tempel.append(i) velist[vv0]=tempel tempel=velist[vv1] tempel.append(i) velist[vv1]=tempel mugen=0 owari=0 tuikalist=[] imae=ste endec=return_center(ende)#最後に選択に追加した辺の中心座標 while True: mugen+=1 if mugen>5000: tuikalist=[] owari=1 if owari==1:break tempp1=ashape.edge(imae).v0 tempp2=ashape.edge(imae).v1 temp1pos=ashape.vertex(tempp1).position temp2pos=ashape.vertex(tempp2).position dist1=(temp1pos[0]-endec[0])**2+(temp1pos[1]-endec[1])**2+(temp1pos[2]-endec[2])**2 dist2=(temp2pos[0]-endec[0])**2+(temp2pos[1]-endec[1])**2+(temp2pos[2]-endec[2])**2 if dist1>dist2:imap=tempp2 else:imap=tempp1 tempelist=velist[imap] mindist=-1 for i in tempelist: centere=return_center(i) dist=(centere[0]-endec[0])**2+(centere[1]-endec[1])**2+(centere[2]-endec[2])**2 if mindist==-1 or mindist>dist: mindist=dist tempe=i if tempe==ende:owari=1 else: tuikalist.append(tempe) imae=tempe #追加辺を選択状態に for i in tuikalist: xshade.scene().active_shape().edge(i).active=True xshade.scene().exit_modify_mode() xshade.scene().enter_modify_mode() #結果を確定するかダイアログ表示 dialog=xshade.create_dialog() dialog.append_push_button('結果を確定しますか?') if mugen<4000: xshade.idle(120) kekka=dialog.ask('ビトウィーン選択') if kekka==False: #元に戻す for i in range(ashape.number_of_edges): ashape.edge(i).active=False for i in aelist: ashape.edge(i).active=True xshade.scene().exit_modify_mode() xshade.scene().enter_modify_mode() #選択面のビトウィーン選択 if xshade.scene().selection_mode==0 and xshade.scene().is_modify_mode==True and xshade.scene().active_shape().type==7: #面が二個以上選択されているか aflist=[] for i in range(ashape.number_of_faces): if ashape.face(i).active==True: aflist.append(i) if len(aflist)>1: #選択番号順に並び替え aflist=sort_face_by_active_order(aflist) eflist=[] #辺の隣接面リストを辺番号順に格納したもの felist=[] #面を構成する辺のリストを面番号順に格納したもの for i in range(ashape.number_of_edges): eflist.append([]) #面の向きを統一 ashape.adjust_face_direction() ashape.setup_winged_edge() for i in range(ashape.number_of_faces): henlist=return_henlist(i) felist.append(henlist) for gg in henlist: tempefl=eflist[gg] tempefl.append(i) eflist[gg]=tempefl ashape.clean_winged_edge() stf=aflist[len(aflist)-2] endf=aflist[len(aflist)-1] endfc=return_fcenter(endf) imaf=stf owari=0 mugen=0 tuikalist=[] while True: mugen+=1 if mugen>5000: tuikalist=[] owari=1 if owari==1:break #面の隣の面のうち、一番エンド面に近い面を選択に追加していく tonarif=[] temphen=felist[imaf] for i in temphen: rinsetuf=copy.copy(eflist[i]) rinsetuf.remove(imaf) tonarif+=rinsetuf mindist=-1 for i in tonarif: tcenf=return_fcenter(i) dist=(tcenf[0]-endfc[0])**2+(tcenf[1]-endfc[1])**2+(tcenf[2]-endfc[2])**2 if mindist==-1 or dist