import copy #線形状の繰り返しコピー #2010.02.013 #選択している線形状を指定回数分コピーしていき、一つの線形状にします。 #線形状の始点位置は、一つ前の線形状の終点位置となります。 #線形状とその一つ前の線形状の重複点は一つにマージされます。 #パラメーター #kaisuu・・・コピー回数 1の場合は元の線形状と同じ #動作条件 #選択形状が線形状 #線形状は開いた線形状 #自由曲面パート内の線形状ではない事 dousasuru=0 xscene=xshade.scene() ashape=xshade.scene().active_shape() #動作条件を満たしているか if ashape.type==4: if ashape.closed==0: if ashape.has_dad==True: if ashape.dad.part_type!=1:dousasuru=1 else: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('エラー') #print dousasuru if dousasuru==1: #ここの初期値 renzoku=1 kaisuu=2 while(renzoku==1): #ダイアログ表示 dialog34=xshade.create_dialog() idx1=dialog34.append_int('回数(1の場合は元の線形状と同じ)') dialog34.set_value(idx1,kaisuu) xshade.idle(10) kekka34=dialog34.ask('線形状の繰り返しコピー') if kekka34==False:renzoku=0 else: kaisuu=dialog34.get_value(idx1) if kaisuu<1:kaisuu=1 #元の線形状の情報を格納(インハンドル、アウトハンドルは相対座標) motolist=[] cnum=ashape.total_number_of_control_points for i in range(cnum): tlist=[] pos=ashape.control_point(i).position ipos=ashape.control_point(i).in_handle ivec=[ipos[0]-pos[0],ipos[1]-pos[1],ipos[2]-pos[2]] opos=ashape.control_point(i).out_handle ovec=[opos[0]-pos[0],opos[1]-pos[1],opos[2]-pos[2]] tll=[pos,ivec,ovec] if i==0: sto=ovec #始点のアウトハンドル stpos=pos if i==(cnum-1): endpos=pos motolist.append(tll) #最初のコントロールポイントから最後のコントロールポイントへの相対座標 savec=[endpos[0]-stpos[0],endpos[1]-stpos[1],endpos[2]-stpos[2]] #繰り返し newlist=[] for i in range(kaisuu): for gg in range(cnum): temp=copy.copy(motolist[gg]) pos2=[temp[0][0]+savec[0]*i,temp[0][1]+savec[1]*i,temp[0][2]+savec[2]*i] temp=[pos2,temp[1],temp[2]] if i==0: # temp=copy.copy(motolist[gg]) if gg!=(cnum-1): newlist.append(temp) else: temp[2]=sto newlist.append(temp) else: if gg!=0: # temp=copy.copy(motolist[gg]) if gg!=(cnum-1): newlist.append(temp) else: temp[2]=sto newlist.append(temp) #新しい線形状作成 xscene.begin_creating() xscene.begin_line(None,False) # numnum=0 for i in newlist: temp=i[0] ivec=i[1] ovec=i[2] # temp=[temp[0]+savec[0]*numnum,temp[1]+savec[1]*numnum,temp[2]+savec[2]*numnum] xscene.append_point(temp,[temp[0]+ivec[0],temp[1]+ivec[1],temp[2]+ivec[2]],[temp[0]+ovec[0],temp[1]+ovec[1],temp[2]+ovec[2]],None,None) xscene.end_line() xscene.end_creating() # break #元に戻す? dialog=xshade.create_dialog() idx3=dialog.append_push_button('結果を確定する場合はokを') idx4=dialog.append_push_button('取り消す場合はcancelを押してください') xshade.idle(10) kekka2=dialog.ask('線形状の繰り返しコピー') #キャンセルなら形状を削除してクリップボードの形状を元に戻す #さらに頂点の選択状態も元に戻す? if kekka2==False: xshade.scene().clear() ashape=xshade.scene().active_shape() if kekka2==True: renzoku=0