#選択の拡張(シフト) #2010.09.26 #shade13に対応 #最初に選択した要素(頂点、辺、面)と、最後に選択した要素の差異を元に、指定の回数分選択を拡張します #パラメーター #kaisuu・・・拡張の回数 #gosa・・・・誤差 #動作条件 #選択形状がポリゴンメッシュ #編集モードに入っている #要素(頂点、辺、面)が二個以上選択されている def faceal(): #面の場合 ashape=xshade.scene().active_shape() xscene=xshade.scene() #選択面をリストに格納 aflist=[] for i in range(ashape.number_of_faces): if ashape.face(i).active==True: aflist.append(i) #選択順にソート aflist=sort_faces_by_active_order(aflist) dousasuru=0 if len(aflist)>1:dousasuru=1 if dousasuru==1: renzoku=1 gosa=0.0001 kaisuu=1 while(renzoku): #ダイアログ開く dialog22=xshade.create_dialog() idxf1=dialog22.append_int('拡張の回数') idxf2=dialog22.append_double('誤差') dialog22.set_value(idxf1,kaisuu) dialog22.set_value(idxf2,gosa) xshade.idle(120) kekka1=dialog22.ask('選択の拡張 シフト') if kekka1==False:renzoku=0 else: kaisuu=dialog22.get_value(idxf1) gosa=dialog22.get_value(idxf2) #選択面の中心位置リストを作成 afcenter=[] for gg in aflist: templist2=ashape.face(gg).vertex_indices tempc=[0,0,0] for jj in templist2: tempos=ashape.vertex(jj).position tempc=[tempc[0]+tempos[0],tempc[1]+tempos[1],tempc[2]+tempos[2]] tempc=[tempc[0]/len(templist2),tempc[1]/len(templist2),tempc[2]/len(templist2)] afcenter.append(tempc) #全ての面の中心位置リストを作成 allcenter=[] for gg in range(ashape.number_of_faces): templist2=ashape.face(gg).vertex_indices tempc=[0,0,0] for jj in templist2: tempos=ashape.vertex(jj).position tempc=[tempc[0]+tempos[0],tempc[1]+tempos[1],tempc[2]+tempos[2]] tempc=[tempc[0]/len(templist2),tempc[1]/len(templist2),tempc[2]/len(templist2)] allcenter.append(tempc) #最初に選択した面と最後に選択した面の差異を計測 a1pos=afcenter[0] a2pos=afcenter[len(aflist)-1] shiftval=[a2pos[0]-a1pos[0],a2pos[1]-a1pos[1],a2pos[2]-a1pos[2]] #検査する面の中心位置リストを作成(最後に選択した面は除外) centerlist=[] for gg in range(kaisuu): for jj in range(len(afcenter)): if jj!=len(afcenter)-1: tempos=[afcenter[jj][0]+(gg+1)*shiftval[0],afcenter[jj][1]+(gg+1)*shiftval[1],afcenter[jj][2]+(gg+1)*shiftval[2]] centerlist.append(tempos) #面の検査と追加リスト作成 tuikalist=[] for gg in centerlist: for jj in range(len(allcenter)): if ((allcenter[jj][0]-gg[0])**2+(allcenter[jj][1]-gg[1])**2+(allcenter[jj][2]-gg[2])**2)1:dousasuru=1 if dousasuru==1: renzoku=1 gosa=0.0001 kaisuu=1 while(renzoku): #ダイアログ開く dialog22=xshade.create_dialog() idxf1=dialog22.append_int('拡張の回数') idxf2=dialog22.append_double('誤差') dialog22.set_value(idxf1,kaisuu) dialog22.set_value(idxf2,gosa) xshade.idle(120) kekka1=dialog22.ask('選択の拡張 シフト') if kekka1==False:renzoku=0 else: kaisuu=dialog22.get_value(idxf1) gosa=dialog22.get_value(idxf2) #選択辺の中心位置リストを作成 aecenter=[] for gg in aelist: v0p=ashape.vertex(ashape.edge(gg).v0).position v1p=ashape.vertex(ashape.edge(gg).v1).position tempc=[(v0p[0]+v1p[0])/2,(v0p[1]+v1p[1])/2,(v0p[2]+v1p[2])/2] aecenter.append(tempc) #全ての辺の中心位置リストを作成 allcenter=[] for gg in range(ashape.number_of_edges): v0p=ashape.vertex(ashape.edge(gg).v0).position v1p=ashape.vertex(ashape.edge(gg).v1).position tempc=[(v0p[0]+v1p[0])/2,(v0p[1]+v1p[1])/2,(v0p[2]+v1p[2])/2] allcenter.append(tempc) #最初に選択した辺の中心と最後に選択した辺の中心の差異を計測 a1pos=aecenter[0] a2pos=aecenter[len(aelist)-1] shiftval=[a2pos[0]-a1pos[0],a2pos[1]-a1pos[1],a2pos[2]-a1pos[2]] #検査する辺の中心位置リストを作成(最後に選択した辺は除外) centerlist=[] for gg in range(kaisuu): for jj in range(len(aecenter)): if jj!=len(aecenter)-1: tempos=[aecenter[jj][0]+(gg+1)*shiftval[0],aecenter[jj][1]+(gg+1)*shiftval[1],aecenter[jj][2]+(gg+1)*shiftval[2]] centerlist.append(tempos) #辺の検査と追加リスト作成 tuikalist=[] for gg in centerlist: for jj in range(len(allcenter)): if ((allcenter[jj][0]-gg[0])**2+(allcenter[jj][1]-gg[1])**2+(allcenter[jj][2]-gg[2])**2)1:dousasuru=1 if dousasuru==1: renzoku=1 gosa=0.0001 kaisuu=1 while(renzoku): #ダイアログ開く dialog22=xshade.create_dialog() idxf1=dialog22.append_int('拡張の回数') idxf2=dialog22.append_double('誤差') dialog22.set_value(idxf1,kaisuu) dialog22.set_value(idxf2,gosa) xshade.idle(120) kekka1=dialog22.ask('選択の拡張 シフト') if kekka1==False:renzoku=0 else: kaisuu=dialog22.get_value(idxf1) gosa=dialog22.get_value(idxf2) #選択頂点の位置リストを作成 apcenter=[] for gg in aplist: tempc=ashape.vertex(gg).position apcenter.append(tempc) #全ての頂点の中心位置リストを作成 allcenter=[] for gg in range(ashape.total_number_of_control_points): tempc=ashape.vertex(gg).position allcenter.append(tempc) #最初に選択した頂点の位置と最後に選択した頂点の位置の差異を計測 a1pos=apcenter[0] a2pos=apcenter[len(aplist)-1] shiftval=[a2pos[0]-a1pos[0],a2pos[1]-a1pos[1],a2pos[2]-a1pos[2]] #検査する頂点の位置リストを作成(最後に選択した頂点は除外) centerlist=[] for gg in range(kaisuu): for jj in range(len(apcenter)): if jj!=len(apcenter)-1: tempos=[apcenter[jj][0]+(gg+1)*shiftval[0],apcenter[jj][1]+(gg+1)*shiftval[1],apcenter[jj][2]+(gg+1)*shiftval[2]] centerlist.append(tempos) #頂点の検査と追加リスト作成 tuikalist=[] for gg in centerlist: for jj in range(len(allcenter)): if ((allcenter[jj][0]-gg[0])**2+(allcenter[jj][1]-gg[1])**2+(allcenter[jj][2]-gg[2])**2)