import copy import math #平面状形状を円筒化 #正面図で、左端をx=0となるようにモデリングした平面状形状 #(z座標は基本は0で、多少デコボコしててもいい) #を円筒状に変換してくれるスクリプトです。 #「角度」と「正面に向ける」パラメーター追加(2014.11.03) #動作条件 #選択形状がポリゴンメッシュで、選択している形状は一つのみ #上位パートに変換マトリクスがかかっていると動作しない dousasuru=0 if xshade.scene().active_shape().type==7 and len(xshade.scene().active_shapes)==1: 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#正面に向けるかどうか #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_float('半径(0より大)') idx3=dialog.append_float('角度(1から360)') idx2=dialog.append_float('でこぼこ係数(0より大)') idx4=dialog.append_bool('正面に向ける') dialog.set_value(idx1,hankei) dialog.set_value(idx2,dekoboko) dialog.set_value(idx3,kakudo2) dialog.set_value(idx4,syoumenn) xshade.scene().update_figure_window() kekka=dialog.ask('平面形状を円筒化') # kekka=True # renzoku=0 if kekka==False: renzoku=0 if kekka==True: hankei=dialog.get_value(idx1) if hankei<=0:hankei=10 dekoboko=dialog.get_value(idx2) if dekoboko<=0:dekoboko=1 kakudo2=dialog.get_value(idx3) if kakudo2<=0:kakudo2=1 if kakudo2>360:kakudo2=360 syoumenn=dialog.get_value(idx4) #元の形状をクリップボードにコピーしておく xshade.scene().active_shape().copy() #個々の頂点を新しい位置へ移動 for i in range(ashape.total_number_of_control_points): px=ashape.vertex(i).position[0] py=ashape.vertex(i).position[1] pz=ashape.vertex(i).position[2] kakudo=(360*(px/nagasa)*math.pi)/180 kakudo=-kakudo kakudo=kakudo*kakudo2/360 # if i==10:print kakudo if syoumenn==True:kakudo=kakudo-(270-kakudo2/2)*math.pi/180 # (nx,ny,nz)=(hankei*math.cos(kakudo)*dekoboko,py,hankei*math*sin(kakudo)) # print "ok" # ashape.vertex(i).position=[1,1,1] # ashape.vertex(i).position=[hankei*math.cos(kakudo),py,hankei*math.sin(kakudo)] pt=10 ashape.vertex(i).position=[hankei*math.cos(kakudo)*(1+pt*pz*dekoboko/nagasa),py,hankei*math.sin(kakudo)*(1+pt*pz*dekoboko/nagasa)] #重複点をマージ xshade.scene().active_shape().cleanup_redundant_vertices() #面の方向を統一 xshade.scene().active_shape().adjust_face_direction() #やりなおすかどうか 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: # renzoku=0 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 activeedgelist: # xshade.scene().active_shape().edge(i).active=True #選択番号が変更されているので、入れなおし(今回は見送り) # for i in range(len(activepointlist2)): # xshade.scene().active_shape().vertex(activepointlist2[i]).active_order=i+1 xshade.idle(120) #戻す終わり