#選択パートの中心を球の中心位置へ移動 #使えるのはshade12以上 #パートの中心がグリッドの交点上に無い場合、一部のパーツを回転状に複製する場合や #選択パートの中心をベースに新規で回転体などを作成する時にずれが発生してしまう事が #あるので、選択パートの中心を近場のグリッドの交点へ移動するために作ったスクリプトです。 #パート一つ選択状態で作動するスクリプトなので、とりあえずパートの中に入れて、 #弟階層でスナップON状態で球を作成してください。 #動作条件 #選択形状がパートで、選択している形状は一つのみ #選択形状は弟を持っており、その弟形状は球 dousasuru=0 ashape=xshade.scene().active_shape() if xshade.scene().active_shape().type==2 and len(xshade.scene().active_shapes)==1: if ashape.has_bro==True: if ashape.bro.type==5: 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: xscene=xshade.scene() ashape=xshade.scene().active_shape() #ここにダイアログの初期値 # dfhankei=100#半径デフォルト値 # hankei=dfhankei#半径 # dfdekoboko=1#でこぼこ係数 デフォルト値 # dekoboko=dfdekoboko# renzoku=1#結果をキャンセルするとやり直しできるかどうか。 # kakudo2=360 #角度 # syoumenn=False#正面に向けるかどうか # diskawa=False xkotei=0 #X座標値を固定するか ykotei=0 #Y座標値を固定するか zkotei=0 #Z座標値を固定するか #nagasaを求めておく # nagasa=0 # for i in range(ashape.total_number_of_control_points): # tempx=ashape.vertex(i).position[0] # if tempx>nagasa:nagasa=tempx #選択辺の長さの違いを選択辺順にリスト化しておく # lllist=[] # for i in range(len(activeedgelist)): # tempe=activeedgelist[i] # v00=xshade.scene().active_shape().vertex(xshade.scene().active_shape().edge(tempe).v0).position # v11=xshade.scene().active_shape().vertex(xshade.scene().active_shape().edge(tempe).v1).position # if i==0: # motolong=pow((v00[0]-v11[0])**2+(v00[1]-v11[1])**2+(v00[2]-v11[2])**2,0.5) # lllist.append(1) # else: # if motolong==0: # lllist.append(1) # else: # templong=pow((v00[0]-v11[0])**2+(v00[1]-v11[1])**2+(v00[2]-v11[2])**2,0.5) # lllist.append(templong/motolong) while(renzoku==1): #ダイアログを表示 dialog=xshade.create_dialog() idx1=dialog.append_bool('X座標値固定') idx2=dialog.append_bool('Y座標値固定') idx3=dialog.append_bool('Z座標値固定') dialog.set_value(idx1,xkotei) dialog.set_value(idx2,ykotei) dialog.set_value(idx3,zkotei) xshade.scene().update_figure_window() kekka=dialog.ask('選択パートの中心を移動') # kekka=True # renzoku=0 if kekka==False: renzoku=0 if kekka==True: xkotei=dialog.get_value(idx1) ykotei=dialog.get_value(idx2) zkotei=dialog.get_value(idx3) #元の形状をクリップボードにコピーしておく # xshade.scene().active_shape().copy() #移動処理 stpoint=ashape.center_position tgpoint=ashape.bro.center_position vec33=(tgpoint[0]-stpoint[0],tgpoint[1]-stpoint[1],tgpoint[2]-stpoint[2]) vec33=(vec33[0]*(1-xkotei),vec33[1]*(1-ykotei),vec33[2]*(1-zkotei)) ashape.move_object(((1,0,0,0),(0,1,0,0),(0,0,1,0),(vec33[0],vec33[1],vec33[2],1))) #やりなおすかどうか kekka2=True #ダイアログを表示して、選択頂点数と結果を確認してもらう #okで確定(何もせず)cancelだと元に戻す dialog2=xshade.create_dialog_with_uuid() idxa3=dialog2.append_push_button('結果を確定しますか?') xshade.idle(120) xshade.scene().update_figure_window() kekka2=dialog2.ask('選択パートの中心を移動') #キャンセル処理 if kekka2==True:renzoku=0 if kekka2==False: ashape.move_object(((1,0,0,0),(0,1,0,0),(0,0,1,0),(-vec33[0],-vec33[1],-vec33[2],1))) # renzoku=0 #戻す終わり