import copy import math #ポイント移動と面の複製 #選択している頂点だけを指定の位置へ移動します(移動モード) #選択している頂点に囲まれる面を指定の位置へ複製します(複製モード) #上位パートに変換がかかっていると使用できません(2010.05.09) #処理の高速化(2010.12.28) #複製の時だけ回数を指定できるように改良(2011.03.09) #動作条件 #選択形状がポリゴンメッシュ #編集モードに入っている #頂点選択モード #頂点が一つ(開始点、目標点の記憶の場合)か一つ以上選択されている #設定項目 #開始点の座標 (「開始点の記憶」で記憶) #目標点の座標 (「目標点の記憶」で記憶) #x座標固定 (「選択頂点の移動」の場合) #y座標固定 (「選択頂点の移動」の場合) #z座標固定 (「選択頂点の移動」の場合) #モード(移動、複製) #「移動」の場合は選択頂点を移動 #「複製」の場合は選択頂点で囲まれる面を複製してから移動 #(面に隣接してないポリラインは複製されません) dousasuru=0 xscene=xshade.scene() ashape=xshade.scene().active_shape() if ashape.type==7 and xscene.is_modify_mode==True: #面選択モードの場合は頂点選択モードに移行 if xscene.selection_mode==0:xscene.selection_mode=2 if xscene.selection_mode==2: aplist=[]#選択頂点リスト for i in range(ashape.total_number_of_control_points): if ashape.vertex(i).active==True: aplist.append(i) if len(aplist)>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: # global startpoint11 # global targetpoint11 ppmode=100 #まずダイアログを表示してモード選択 dialog4=xshade.create_dialog() idx111=dialog4.append_radio_button('/開始点の記憶/目標点の記憶/選択頂点の移動(か面の複製)/相対座標の表示') dialog4.set_value(idx111,0) kekka2=dialog4.ask('ポイント移動') if kekka2==True: ppmode=dialog4.get_value(idx111) if ppmode==0: #開始点の記憶 if len(aplist)==1: dialog6=xshade.create_dialog() dialog6.append_push_button('開始点の座標を') dialog6.append_push_button('記憶しますか?') kekka44=dialog6.ask('開始点の記憶') if kekka44==True: temppoint=ashape.vertex(aplist[0]).position # global startpoint11 startpoint11=[temppoint[0],temppoint[1],temppoint[2]] # print '開始点:'+str(startpoint11) else: dialog5=xshade.create_dialog() dialog5.append_push_button('頂点は一つだけ選択してください。') dialog5.ask('エラー') if ppmode==1: #目標点の記憶 if len(aplist)==1: dialog6=xshade.create_dialog() dialog6.append_push_button('目標点の座標を') dialog6.append_push_button('記憶しますか?') kekka44=dialog6.ask('目標点の記憶') if kekka44==True: temppoint=ashape.vertex(aplist[0]).position # global targetpoint11 targetpoint11=[temppoint[0],temppoint[1],temppoint[2]] # print '目標点:'+str(targetpoint11) else: dialog5=xshade.create_dialog() dialog5.append_push_button('頂点は一つだけ選択してください。') dialog5.ask('エラー') if ppmode==3: try: if startpoint11[0]==0:okk=1 except NameError: startpoint11=[0,0,0] try: if targetpoint11[0]==0:okk=1 except NameError: targetpoint11=[0,0,0] #相対座標の表示 dialog88=xshade.create_dialog() idouvec=[targetpoint11[0]-startpoint11[0],targetpoint11[1]-startpoint11[1],targetpoint11[2]-startpoint11[2]] dialog88.append_push_button('開始点から目標点への') dialog88.append_push_button('相対座標は') dialog88.append_push_button('x:'+str(idouvec[0])) dialog88.append_push_button('y:'+str(idouvec[1])) dialog88.append_push_button('z:'+str(idouvec[2])) dialog88.append_push_button('です') dialog88.ask('相対座標の表示') if ppmode==2: xkotei=0 ykotei=0 zkotei=0 kaisuu=1 #複製の場合の回数 mode11=0 #デフォルトでは移動モード renzoku=1 try: if startpoint11[0]==0:okk=1 except NameError: startpoint11=[0,0,0] try: if targetpoint11[0]==0:okk=1 except NameError: targetpoint11=[0,0,0] startpoint11a=startpoint11 targetpoint11a=targetpoint11 while(renzoku==1): dialog7=xshade.create_dialog() dialog7.begin_group() idx212=dialog7.append_vec3('開始点') idx214=dialog7.append_vec3('目標点') dialog7.end_group() dialog7.begin_group() idx216=dialog7.append_bool('X座標固定') idx217=dialog7.append_bool('Y座標固定') idx218=dialog7.append_bool('Z座標固定') dialog7.end_group() idx219=dialog7.append_radio_button('モード/選択頂点の移動/選択頂点で囲まれた面の複製') idxkai=dialog7.append_int('回数(複製の場合)') dialog7.set_value(idx212,startpoint11a) dialog7.set_value(idx214,targetpoint11a) dialog7.set_value(idx216,xkotei) dialog7.set_value(idx217,ykotei) dialog7.set_value(idx218,zkotei) dialog7.set_value(idx219,mode11) dialog7.set_value(idxkai,kaisuu) kekka12=dialog7.ask('ポイント移動') if kekka12==False: renzoku=0 if kekka12==True: xshade.scene().inhibit_update() startpoint11a=dialog7.get_value(idx212) targetpoint11a=dialog7.get_value(idx214) xkotei=dialog7.get_value(idx216) ykotei=dialog7.get_value(idx217) zkotei=dialog7.get_value(idx218) mode11=dialog7.get_value(idx219) kaisuu=dialog7.get_value(idxkai) if kaisuu<=0:kaisuu=1 #元の形状をクリップボードにコピー ashape.copy() xscene.enter_modify_mode() #開始点から目標点への移動ベクトルを求める idouvec=[targetpoint11a[0]-startpoint11a[0],targetpoint11a[1]-startpoint11a[1],targetpoint11a[2]-startpoint11a[2]] if xkotei==1:idouvec[0]=0 if ykotei==1:idouvec[1]=0 if zkotei==1:idouvec[2]=0 kaisuu2=kaisuu if mode11==0:kaisuu2=1 for ii in range(kaisuu2): #各頂点の移動開始(モードが「移動」の場合) if mode11==0: for i in aplist: motop=ashape.vertex(i).position tempp=[motop[0]+idouvec[0],motop[1]+idouvec[1],motop[2]+idouvec[2]] ashape.vertex(i).position=[tempp[0],tempp[1],tempp[2]] #面の複製移動(モードが「面の複製」の場合 if mode11==1: xscene.selection_mode=0 #アクティブな面を構成する頂点リストを作成 afacelist=[] afacevlist=[] for i in range(ashape.number_of_faces): if ashape.face(i).active==True: afacelist.append(i) for i in afacelist: tempvlist=ashape.face(i).vertex_indices templist=[] for gg in tempvlist: temppos=ashape.vertex(gg).position templist.append(temppos) afacevlist.append(templist) xscene.selection_mode=2 #コピー for i in afacevlist: maxnum=ashape.total_number_of_control_points maxpoint=len(i) #頂点追加 for gg in i: temppos1=[gg[0]+idouvec[0]*(ii+1),gg[1]+idouvec[1]*(ii+1),gg[2]+idouvec[2]*(ii+1)] ashape.append_point(temppos1) #辺を追加 for gg in range(len(i)): if gg<(len(i)-1): ashape.make_edge((maxnum+gg),(maxnum+gg+1)) else: ashape.make_edge((maxnum+gg),maxnum) #面を張る tempvindex=[] for gg in range(len(i)): tempvindex.append(maxnum+gg) ashape.append_face(tuple(tempvindex)) #頂点マージ ashape.cleanup_redundant_vertices() #面の方向統一 ashape.adjust_face_direction() #元に戻すか聞く xshade.scene().allow_update() dialog=xshade.create_dialog() idx3=dialog.append_push_button('処理を確定しますか?') kekka=dialog.ask('ポイント移動') if kekka==True:renzoku=0 if kekka==False: idou1=0 if xshade.scene().active_shape().has_sis==True: idou1=1 xshade.scene().paste() xshade.scene().select_sister(1) xshade.scene().clear() if idou1==1: xshade.scene().select_brother() xshade.scene().enter_modify_mode() ashape=xshade.scene().active_shape() for i in aplist: ashape.vertex(i).active=True