Blenderで日経平均チャートを作成するPythonScript

 Blenderを使用して立体的なローソク足による日経平均チャートを作成する

使い方は、スクリプトを画面上のスクリプトエディタに貼り付ける。Webスクレイピングを使用してるので、ライブラリとかアドオンとか入っていないとエラーがでるし、場合によってはPythonのバージョンで動作しないかもしれない。基本的な構造を理解して修正すればよい。このスクリプトはMacで作成したのでディレクトリのパスは使用するPC環境に合わせる必要がある。特にフォントはかなり違いがあるので変更が必要だろう


日経平均の数日前の株価を取得して日足チャートを作成する。猫は手動でオブジェクトを挿入してる。場合によっては、ローソクが変な場所に移動したりする。これは急落急騰したときに座標が大きく変動するからなので、そういったときは手動でオブジェクトを移動させたりする。


以下Pythonスクリプト

  1. import os
  2. import bpy
  3. import math
  4. import copy
  5. import time
  6. import pandas_datareader.data as data
  7. from datetime import datetime,timedelta
  8.  
  9. #blender 2.91 ,2.93
  10. #Mac Big Sur
  11. #ターミナル起動site ,Text menu >> Run Script このスクリプトを実行させる
  12. #/Applications/Blender.app/Contents/MacOS/Blender
  13.  
  14. #GLOBAL
  15. # count
  16. # xmove
  17. # bairitsu
  18.  
  19. #2021/09/20 move animation
  20. '''
  21. keyframe Num 24
  22. candle1 0,4
  23. candle2 4,8
  24. candle3 8,12
  25. candle4 12,16
  26. candle5 16,20
  27. candle6 20,24
  28. one by one move
  29. '''
  30. def fmoveObjAnime(fobjname,fhighHaba,fstep):
  31. changeFrame=0
  32. counter=0
  33. #obj is only one
  34. for item in bpy.data.objects:
  35. if fobjname in item.name:
  36. counter+=1
  37. #obj are many
  38. for item in bpy.data.objects:
  39. if fobjname in item.name:
  40. if counter==1:
  41. changeFrame=24#last frame number
  42. else:
  43. changeFrame+=fstep
  44. frame_num=changeFrame
  45. ob=bpy.data.objects[item.name]
  46. bpy.context.scene.frame_set(frame_num)
  47. ob.keyframe_insert(data_path = "location",index = -1)
  48.  
  49. #frame move keyframe
  50. tmpNum=0
  51. changeFrame=0
  52. for item in bpy.data.objects:
  53. if fobjname in item.name:
  54. if counter==1:
  55. changeFrame=20#before 4 frame at last frame24
  56. else:
  57. changeFrame=fstep*tmpNum
  58. tmpNum+=1
  59. frame_num=changeFrame
  60. ob=bpy.data.objects[item.name]
  61. #first move frame
  62. bpy.context.scene.frame_set(frame_num)
  63. #second move obj
  64. #z up
  65. ob.location[2]+=fhighHaba
  66. ob.keyframe_insert(data_path = "location",index = -1)
  67. #set 0
  68. bpy.context.scene.frame_set(0)
  69.  
  70.  
  71. #https://bluebirdofoz.hatenablog.com/entry/2018/04/25/231414
  72. # オブジェクトの原点変更
  73. # オブジェクトの原点を指定位置に移動する
  74. # 引数 arg_objectname:指定オブジェクト名
  75. # 戻り値
  76. def set_origin_cursor(arg_objectname='Default',arg_location=(0,0,0)):
  77. # 他のオブジェクトの寸法を適用しないよう全てのオブジェクトを走査する
  78. for ob in bpy.context.scene.objects:
  79. # 非選択状態に設定する
  80. #ob.select=False#2.7
  81. ob.select_set(False) #2.9
  82. # 指定オブジェクトを取得する
  83. selectob = bpy.data.objects[arg_objectname]
  84. # 変更オブジェクトをアクティブに変更する
  85. #bpy.context.scene.objects.active = selectob#2.7
  86. bpy.context.view_layer.objects.active=selectob#2.9
  87. # 変更オブジェクトを選択状態にする
  88. #selectob.select=True #2.7
  89. selectob.select_set(True) #2.9
  90. # 3Dカーソルの元の位置を記録しておく(参照型のコピー)
  91. #cursorpos = copy.copy(bpy.context.scene.cursor_location)
  92. # 3Dカーソルの位置を指定位置に移動する
  93. #bpy.context.scene.cursor_location = arg_location#2.7
  94. bpy.context.scene.cursor.location=arg_location#2.9
  95. # オブジェクトの原点を3Dカーソル位置に移動する
  96. bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
  97. # 3Dカーソルの位置を元に戻す
  98. #bpy.context.scene.cursor_location = cursorpos #2.7
  99. #bpy.context.scene.cursor.location=cursorpos#2.9 not use
  100. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  101. return
  102.  
  103. def fcandle(candleType,kopen,kclose,bairitsu,xmove,mat1,mat2):
  104. #count is Global
  105. global count
  106. #global xmove
  107. #global bairitsu
  108. if bairitsu=='' or bairitsu==0:
  109. print('def fcandle(),bairitsu not defined,use 0.001')
  110. bairitsu=0.001
  111. if count=='':
  112. print('def fcandle(),count is Global, not defined, Please check, so use 1')
  113. count=1
  114. candle=candleType
  115. #1.円柱location:図形の中心座標 radius:円の半径 depth:高さ rotation:立体の回転角(rad)
  116. bpy.ops.mesh.primitive_cylinder_add(location=(0, 0, 0), radius=0.022, depth=3, rotation=(0, 0, 0))
  117. if candle=='yousen':
  118. bpy.context.object.data.materials.append(mat1) # 材質(赤)指定
  119. else:#insen
  120. bpy.context.object.data.materials.append(mat2) # 材質(青)指定
  121. bpy.ops.transform.translate(value=(xmove,0,0))
  122. #location=bpy.context.object.location
  123. for obj in bpy.context.selected_objects:
  124. if obj.name=='Cylinder':
  125. tmpcount=count+1
  126. obj.name = "candle"+str(tmpcount)
  127. #bpy.ops.object.shade_smooth()
  128. new_bar = bpy.context.object
  129. for vert in new_bar.data.vertices:
  130. if candle=='yousen':
  131. if vert.co[2] > 0:#Zjiku ni up
  132. vert.co[2] = kclose*bairitsu#close
  133. else:
  134. vert.co[2] = kopen*bairitsu
  135. elif candle=='insen':
  136. if vert.co[2] > 0:
  137. vert.co[2] = kopen*bairitsu
  138. else:
  139. vert.co[2] = kclose*bairitsu
  140. clocation=(xmove,0,(kopen+kclose)*bairitsu/2)
  141. set_origin_cursor(obj.name,clocation)
  142. location=bpy.context.object.location
  143. return location#candle
  144. #end def
  145.  
  146. def fcandle_hige(candleType,khigh,klow,bairitsu,candleLocation,mat1,mat2):
  147. global count
  148. #global xmove
  149. #global bairitsu
  150. #count,bairitsu is Global
  151. #if bairistu=='' or bairitsu==0:
  152. # print('def fcandle_hige(),bairitsu not defined, so use 0.001')
  153. # bairitsu=0.001
  154. if count=='':
  155. print('def fcandle_hige(),count is Global, not defined, Please check, so use 1')
  156. count=1
  157. candle=candleType
  158. bpy.ops.mesh.primitive_cylinder_add(location=(0, 0, 0), radius=0.022/7, depth=3, rotation=(0, 0, 0))
  159. if candle=='yousen':
  160. bpy.context.object.data.materials.append(mat1) # 材質(赤)指定
  161. else:#insen
  162. bpy.context.object.data.materials.append(mat2) # 材質(青)指定
  163. bpy.ops.transform.translate(value=(candleLocation[0],candleLocation[1],0))#hige location is same candle location
  164. for obj in bpy.context.selected_objects:
  165. if obj.name=='Cylinder':
  166. tmpcount=count+1
  167. obj.name = "hige"+str(tmpcount)
  168. #xmove+=0.048
  169. #bpy.ops.object.shade_smooth()
  170. new_bar = bpy.context.object
  171. for vert in new_bar.data.vertices:
  172. if vert.co[2] > 0:#Zjiku ni up
  173. vert.co[2] = khigh*bairitsu#close
  174. else:
  175. vert.co[2] = klow*bairitsu
  176. set_origin_cursor(obj.name,candleLocation)
  177. #end def
  178. # テキストオブジェクトの追加
  179. def add_text(text, t_color,location):
  180. # 角度設定時に利用
  181. ROT_QUATER = math.pi / 2
  182. bpy.ops.object.text_add()
  183. ob = bpy.context.object
  184. ob.data.body = text
  185. ob.data.extrude = 0.05
  186. ob.data.bevel_depth = 0.002
  187. bpy.ops.font.open(filepath="/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc")
  188. #bpy.data.fonts["HiraginoSans-W6"].name = "HiraginoSans-W6"
  189. fnt = bpy.data.fonts.load('/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc')
  190. ob.data.font = fnt
  191. ob.rotation_euler[0] = ROT_QUATER
  192. # 3Dカーソルの位置を0,0,0
  193. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  194. #3Dカーソルを原点を変更してから、translateする必要がある。
  195. bpy.ops.transform.translate(value=location)#26500*0.001,(1.8,0.1/3,26.5)
  196. bpy.ops.transform.resize(value=(0.2,0.1,0.2)) # 図形を変形
  197. #ob.rotation_euler[2] = ROT_QUATER
  198. ob.data.align_x = 'CENTER'
  199. ob.data.align_y = 'CENTER'
  200. mat = bpy.data.materials.new('color_txt')
  201. mat.diffuse_color = t_color#(0.8, 0.8, 0.8, 1.0)
  202. # マテリアルスロットを追加する
  203. bpy.ops.object.material_slot_add()
  204. # 作成したマテリアルスロットに新規マテリアルを設定する
  205. bpy.context.object.active_material = mat
  206. #ob.active_material.diffuse_color = (1,0,0)
  207. #bpy.context.object.active_material.diffuse_color = (1,0,0)
  208. #mat.diffuse_color = (1.0,0.0,0.0)
  209. #mat.diffuse_color = (1,0,0)#t_color #error , I do not yet 2020/05/15
  210. #ob.data.materials.append(mat)
  211. #ob.active_material.diffuse_color = t_color # error
  212.  
  213. #convert to mesh
  214.  
  215. #s = bpy.context.scene.objects.active
  216. #s.name = "text_name"
  217. bpy.ops.object.convert(target='MESH')# work
  218. for obj in bpy.context.selected_objects:
  219. if obj.name=='Text':
  220. obj.name=text
  221.  
  222. return ob
  223. #end def
  224.  
  225. def add_textKai(text, t_color,location,size):
  226. # 角度設定時に利用
  227. ROT_QUATER = math.pi / 2
  228. bpy.ops.object.text_add()
  229. ob = bpy.context.object
  230. ob.data.body = text
  231. ob.data.extrude = 0.05
  232. ob.data.bevel_depth = 0.002
  233. bpy.ops.font.open(filepath="/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc")
  234. #2022/0404 here error
  235. #bpy.data.fonts["HiraginoSans-W6"].name = "HiraginoSans-W6"
  236. fnt = bpy.data.fonts.load('/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc')
  237. ob.data.font = fnt
  238. ob.rotation_euler[0] = ROT_QUATER
  239. # 3Dカーソルの位置を0,0,0
  240. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  241. #3Dカーソルを原点を変更してから、translateする必要がある。
  242. bpy.ops.transform.translate(value=location)#26500*0.001,(1.8,0.1/3,26.5)
  243. bpy.ops.transform.resize(value=size) # 図形を変形(0.2,0.1,0.2)
  244. #ob.rotation_euler[2] = ROT_QUATER
  245. ob.data.align_x = 'CENTER'
  246. ob.data.align_y = 'CENTER'
  247. mat = bpy.data.materials.new('color_txt')
  248. mat.diffuse_color = t_color#(0.8, 0.8, 0.8, 1.0)
  249. # マテリアルスロットを追加する
  250. bpy.ops.object.material_slot_add()
  251. # 作成したマテリアルスロットに新規マテリアルを設定する
  252. bpy.context.object.active_material = mat
  253. #ob.active_material.diffuse_color = (1,0,0)
  254. #bpy.context.object.active_material.diffuse_color = (1,0,0)
  255. #mat.diffuse_color = (1.0,0.0,0.0)
  256. #mat.diffuse_color = (1,0,0)#t_color #error , I do not yet 2020/05/15
  257. #ob.data.materials.append(mat)
  258. #ob.active_material.diffuse_color = t_color # error
  259. #convert to mesh
  260. #s = bpy.context.scene.objects.active
  261. #s.name = "text_name"
  262. bpy.ops.object.convert(target='MESH')# work
  263. for obj in bpy.context.selected_objects:
  264. if obj.name=='Text':
  265. obj.name=text
  266. return ob
  267. #end def
  268.  
  269. #2020/12/29
  270. #print('Max:',max(df['High']))#最大値が取れる
  271. #高値の最大値maxと安値の最小値minを取得して
  272. #500円ごとのバー基準株価線(26500,27000,27500)を自動で作成したい。
  273. def makeBarMaxtoMin(highobj,lowobj):
  274. #print('Max:',max(highobj))#df['High']
  275. #print('Min:',min(lowobj))#df['Low']
  276. #bairitsu is Global
  277. global count
  278. global xmove
  279. global bairitsu
  280. #if bairistu=='' or bairitsu==0:
  281. # print('def makeBarMaxtoMin(),bairitsu not defined,use 0.001')
  282. # bairitsu=0.001
  283. #every 500yen
  284. priceRange=500
  285. #highPriceNumはバーの本数を取得する
  286. highPriceNum,highmod=divmod(max(highobj),priceRange)#26200/priceRange
  287. lowPriceNum,lowmod=divmod(min(lowobj),priceRange)
  288. #高値については、余りが出たら、1を追加する
  289. #print('highmod:',highmod)
  290. if highmod!=0:
  291. highPriceNum=highPriceNum+1
  292. #Rangeで範囲を指定してしようする場合1加算では足りないので、rangeで更に1を加算する
  293. #print('after highPriceNum:',highPriceNum)
  294.  
  295. for i in range(math.floor(lowPriceNum),math.floor(highPriceNum+1)):
  296. #range()が出力するのは、(highPriceNum-1)なので1を加算してhighPriceNum分までを計算させる
  297. print('barPrice:',i*priceRange)
  298. #i*priceRangeの位置でBarオブジェクトを作成する。
  299. # 3Dカーソルの位置を0,0,0
  300. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  301. color=(0.8,0.5,0.8,0.8)
  302. add_text(str(i*priceRange), color,(1.8,0.1/3, (i*priceRange)*bairitsu+0.045))#0.045 is ajustment
  303. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  304. # 平板作成 26500bar1
  305. bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), size=2.0)
  306. bpy.ops.transform.translate(value=(0.0,0.1/2,(i*priceRange)*bairitsu))#26500*0.001
  307. bpy.ops.transform.resize(value=(2.0,0.06/6,0.01/6)) # 図形を変形
  308. bpy.context.object.data.materials.append(mat3) # 材質
  309. for obj in bpy.context.selected_objects:
  310. if obj.name=='Cube':
  311. obj.name='bar_'+str(i*priceRange)
  312. #end def
  313. ######################################################################
  314. #main
  315. ######################################################################
  316. print('start')
  317. count=0#count is Global
  318. xmove=0.8#1# move distancs
  319. bairitsu=0.001# size Global
  320.  
  321. #anime
  322. animeOn=0 # 1:anime,0:non
  323. highHaba=1.2#m
  324. stepFrame=4
  325.  
  326. #delet keyframe
  327. context = bpy.context
  328. for ob in bpy.data.objects:
  329. ob.animation_data_clear()
  330.  
  331. #Stock date
  332. n=maenohi=5
  333. end = datetime.now()
  334. #start = end - timedelta(days=maenohi)#end.day-7 changes
  335. #start = datetime(end.year, end.month, end.day-7)
  336. ##土日があると表示させるローソク足の数が少ないので、数が満たされるまでループするためSleepを入れた
  337. #大量のデータはCSVで取得してからローソク足にしたほうが良さそう
  338. x=0
  339. while x<=(maenohi):
  340. start = end - timedelta(days=n)
  341. df=data.DataReader('^N225','yahoo',start,end)#3990.T,#^N225
  342. date=df.index# 日付
  343. time.sleep(3)
  344. print('len(date):',len(date))
  345. print('3秒待ち')
  346. x=len(date)
  347. n=n+1
  348. print(df.head(8))
  349. if len(date)==0:
  350. print('ERROR Can not get any Price data, Check internet or yahoo finance com.')
  351. sys.exit()
  352.  
  353. #animation delete
  354. #here
  355.  
  356. # 既存要素削除
  357. for item in bpy.data.meshes:
  358. bpy.data.meshes.remove(item)
  359.  
  360. for item in bpy.data.materials:
  361. bpy.data.materials.remove(item)
  362. #bpy.ops.outliner.item_rename()
  363. #2.立方体 location:図形の中心座標 size:立方体の一辺の長さ rotation:立体の回転角(rad)
  364. #bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), size=1.0, rotation=(0, 0, 0))
  365.  
  366. # 2.材質の定義(赤色)
  367. mat1 = bpy.data.materials.new('Red')
  368. mat1.diffuse_color = (1.0, 0.0, 0.0, 1.0)
  369.  
  370. # 3.材質の定義(青色)
  371. mat2 = bpy.data.materials.new('blue')
  372. mat2.diffuse_color = (0.0, 0.0, 1.0, 1.0)
  373.  
  374. mat3 = bpy.data.materials.new('gray')
  375. mat3.diffuse_color = (0.8, 0.8, 0.8, 0.5)
  376.  
  377. mat5 = bpy.data.materials.new('yellow')
  378. mat5.diffuse_color = (1.0, 0.9, 0.1, 1.0)
  379.  
  380. # 平板作成 27000bar
  381. #bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), size=2.0)
  382. #Resizeして、ポイント移動をするとポイントの縮尺が変わり、想定した位置に移動しない(推測)。
  383. #これはオブジェクトの原点とScaleの考え方の違いかもしれない。
  384. #よって、リサイズして、ポイントを移動させたいときは、
  385. #リサイズをする前にオブジェクト自体を移動させてから、ポイントを移動させたほうが良いと思う。
  386. #bpy.ops.transform.translate(value=(0.0,0.1/2,27))#27000*0.001
  387. #bpy.ops.transform.resize(value=(2.0,0.06/6,0.01/6)) # 図形を変形
  388. #bpy.context.object.data.materials.append(mat3) # 材質
  389.  
  390. # 平板作成 26500bar1
  391. #bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), size=2.0)
  392. #bpy.ops.transform.translate(value=(0.0,0.1/2,bar1*bairitsu))#26500*0.001
  393. #bpy.ops.transform.resize(value=(2.0,0.06/6,0.01/6)) # 図形を変形
  394. #bpy.context.object.data.materials.append(mat3) # 材質
  395.  
  396. # 3Dカーソルの位置を0,0,0
  397. #bpy.context.scene.cursor_location =(0.0,0.0,0.0)
  398. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  399.  
  400. #26500txt
  401. #color=(0.8,0.5,0.8,0.8)
  402. #add_text('26500', color,(1.8,0.1/3,bar1*bairitsu+0.045))#0.045 is ajustment
  403. #27000txt
  404. #add_text('27000', color,(1.8,0.1/3,bar2*bairitsu+0.045))
  405.  
  406.  
  407. #date=df.indexをカウントして、それぞれを取得する。ちょっとスマートではないが、、
  408. for fdate in date:
  409. khigh=df['High'][count]
  410. klow=df['Low'][count]
  411. kopen=df['Open'][count]
  412. kclose=df['Adj Close'][count]
  413. #ここに日付ごとの処理を入れる。
  414. #
  415. if kopen-kclose<0: 0.04="" 00:00:00="" 0="" align="WORLD" andle_hige="" andle_main="" bairitsu="" blue="" bpy.data.objects:="" bpy.ops.mesh.primitive_cone_add="" candle="" candlecount="" candlelocation="" candlename="candle" color="" count="" d="" depth="2," else:="" enter_editmode="False," fcandle_hige="" fdate.strftime="" for="" global="" if="" in="" is="" khigh="" klow="" location="(0," m="" mat1="" mat2="" obj.name:="" obj.name="" obj="" print="" radius1="1," radius2="0," red="" rrow="" scale="(0.04," str="" xmove="">0.04
  416. #図形を回転(Y軸周りに90°)
  417. bpy.ops.transform.rotate(value=-3.1415/2 ,orient_axis='Y')
  418. bpy.context.object.data.materials.append(mat5)
  419. bpy.ops.transform.translate(value=(bpy.data.objects[candleName].location[0]+0.08,bpy.data.objects[candleName].location[1],bpy.data.objects[candleName].location[2]))#
  420.  
  421.  
  422. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  423. #open,close
  424. color=(1.0,1.0,1.0,1.0)
  425. #str,color,location,size
  426. lastOpen=df['Open'][len(date)-1]#始値
  427. lastClose=df['Close'][len(date)-1]#終値
  428. roundOpen='O:'+str(round(lastOpen,2))#画面に表示させる直近の始値文字
  429. roundClose='C:'+str(round(lastClose,2))#画面に表示させる直近の終値文字
  430.  
  431. add_textKai(roundOpen, color,(xmove+0.1,0,lastOpen*bairitsu),(0.06,0.05,0.06))
  432. add_textKai(roundClose, color,(xmove+0.1,0,lastClose*bairitsu),(0.06,0.05,0.06))
  433.  
  434. #end.strftime("%Y/%m/%d") or date[len(date)-1].strftime("%Y/%m/%d")today
  435. color=(0.0,1.0,0.0,1.0)
  436. coneLocation=bpy.data.objects['Cone'].location
  437. tyokkinDay=date[len(date)-1].strftime("%Y/%m/%d")
  438. if len(date)>0:
  439. add_textKai(tyokkinDay,color, (coneLocation[0]+0.16,coneLocation[1],coneLocation[2]),(0.06,0.05,0.06))
  440. #print('last day:',date[len(date)-1])
  441.  
  442. #始値、終値、直近の日付の調整。オブジェクトが重なってしまう金額が近いときに離す処理
  443. if candle=='yousen':#Openが下側でCloseが上側にあるはず
  444. #bpy.data.objects[roundOpen].dimensions[1]#Z方向の幅サイズではなくてY軸、理由はローカルで回転させたから
  445. #bpy.data.objects[roundClose].dimensions[1]
  446. #bpy.data.objects[tyokkinDay].dimensions[1]
  447. #始値、終値、直近の日付のlocationを取得する。Z方向ではなくてY軸の幅の半分を上下に加減算して重なりを調べる
  448. #bpy.data.objects[roundOpen].location[2]
  449. #bpy.data.objects[roundClose].location[2]
  450. #bpy.data.objects[tyokkinDay].location[2]
  451. #roundCloseを調整する.roundCloseの下側位置が、直近日付の上側位置以下になっているときに、直近日付の上の方にroundCloseを上へ移動させる
  452. #location is [2]:Z, dimensions is [1]:Y
  453. if bpy.data.objects[roundClose].location[2]-bpy.data.objects[roundClose].dimensions[1]/2 <= bpy.data.objects[tyokkinDay].location[2]+bpy.data.objects[tyokkinDay].dimensions[1]/2:
  454. #直近日付の位置に、プラスへ移動
  455. bpy.data.objects[roundClose].location[2]=bpy.data.objects[tyokkinDay].location[2]+bpy.data.objects[tyokkinDay].dimensions[1]*1.5
  456. #roundOpenを調整する。roundOpenの「上側」位置が、直近日付の「下側」以上になっているときに、直近日付の「下の方」にroundOpenを下へ移動させる
  457. if bpy.data.objects[roundOpen].location[2]+bpy.data.objects[roundOpen].dimensions[1]/2 >=bpy.data.objects[tyokkinDay].location[2]-bpy.data.objects[tyokkinDay].dimensions[1]/2:
  458. #「マイナス」へ移動
  459. bpy.data.objects[roundOpen].location[2]=bpy.data.objects[tyokkinDay].location[1]-bpy.data.objects[tyokkinDay].dimensions[1]*1.5
  460. else:#insen Openが上側でCloseが下側にあるはず.Yousenとは逆
  461. #roundOpen
  462. print('insen')
  463. if bpy.data.objects[roundOpen].location[2]-bpy.data.objects[roundOpen].dimensions[1]/2<=bpy.data.objects[tyokkinDay].location[2]+bpy.data.objects[tyokkinDay].dimensions[1]/2:
  464. bpy.data.objects[roundOpen].location[2]=bpy.data.objects[tyokkinDay].location[2]+bpy.data.objects[tyokkinDay].dimensions[1]*1.5
  465. print('Open')
  466. #roundClose
  467. if bpy.data.objects[roundClose].location[2]+bpy.data.objects[roundClose].dimensions[1]/2>=bpy.data.objects[tyokkinDay].location[2]-bpy.data.objects[tyokkinDay].dimensions[1]/2:
  468. bpy.data.objects[roundClose].location[2]=bpy.data.objects[tyokkinDay].location[2]-bpy.data.objects[tyokkinDay].dimensions[1]*1.5
  469. print('Close')
  470.  
  471.  
  472. #2020/12/29
  473. #print('Max:',max(df['High']))#最大値が取れる
  474. #高値の最大値maxと安値の最小値minを取得して
  475. #500円ごとのバー基準株価線(26500,27000,27500)を自動で作成したい。
  476. makeBarMaxtoMin(df['High'],df['Low'])
  477.  
  478. #camera move, near Cone obj
  479. camera_obj = bpy.data.objects['Camera']
  480. print(camera_obj.location)
  481. camera_obj.location=(coneLocation[0]+0.16,coneLocation[1]-3.0,coneLocation[2])
  482.  
  483. #Neko呼び出し
  484. file_path = '/Users/toshiromaseda/Documents/blender/model/テスト、研究モデル/Neko/Neko_simple_001.blend'
  485. inner_path = 'Object'
  486. object_name = 'Neko'
  487. bpy.ops.wm.append(
  488. filepath=os.path.join(file_path, inner_path, object_name),
  489. directory=os.path.join(file_path, inner_path),
  490. filename=object_name
  491. )
  492.  
  493. bpy.context.scene.cursor.location=(0.0,0.0,0.0)
  494. # 指定オブジェクトを取得する
  495. #arg_objectname='Neko'
  496. selectob = bpy.data.objects[object_name]
  497. selectob.select_set(True) #2.9
  498. selectob.location=(coneLocation[0],coneLocation[1]-0.1,coneLocation[2])
  499. bpy.ops.transform.resize(value=(0.07,0.07,0.07)) # 図形を変形
  500. #bpy.ops.transform.resize(value=(0.37,0.37,0.37)) # 図形を変形
  501.  
  502. #anime
  503. if animeOn==1 :# if you make animation animeOn:1
  504. #fmoveObjAnime(fobjname,fhighHaba,fstep)
  505. fmoveObjAnime('candle',highHaba,stepFrame)
  506. fmoveObjAnime('hige',highHaba,stepFrame)
  507. fmoveObjAnime('C:',highHaba,stepFrame)
  508. fmoveObjAnime('O:',highHaba,stepFrame)
  509. #fmoveObjAnime('Cone',hightHaba,stepFrame)
  510.  
  511. print('done.')
  512.  
  513. ''' Result
  514.  
  515.  
  516.  
  517. '''
株式ランキング
株式ランキング にほんブログ村 株ブログ 株 デイトレードへ
にほんブログ村 にほんブログ村 デザインブログ 3DCGへ
にほんブログ村

このブログの人気の投稿

国税庁確定申告でエラーになったところ株式譲渡が赤字の場合には、配当を申告不要とすることはできません

メモ、BlenderPythonスクリプトで参考になるオブジェクトや頂点の選択ツリー選択スクリプトリンクメモ

楽天証券、信用取引口座から楽天FX口座へ振替手順