245 lines
9.7 KiB
Python
245 lines
9.7 KiB
Python
|
# THIS FILE IS A PART OF VCStudio
|
||
|
# PYTHON 3
|
||
|
|
||
|
import os
|
||
|
import datetime
|
||
|
|
||
|
#from studio import checklist
|
||
|
import checklist
|
||
|
|
||
|
def get_legacy(project_location):
|
||
|
|
||
|
# This function will return analytics data about a project. This particular
|
||
|
# function is desinged to read old, Blender-Organizer projects. It's a first
|
||
|
# step of conversion. And used to display basic analitycs into the
|
||
|
# project-manager.
|
||
|
|
||
|
data = {
|
||
|
"name" : "", # Name of the project (typed properly)
|
||
|
"director" : "", # Name of the project's director.
|
||
|
"status" : "", # Projects's comment / type
|
||
|
"donework" : 0.0, # Percentage of Assets and Scenes done
|
||
|
"fraction" : 0.0, # Project's completion percentage
|
||
|
"checklist" : 0.0, # Project's main checklist percentage
|
||
|
"startdate" : "0000/00/00", # Date of the start of the project
|
||
|
"deadline" : "0000/00/00", # Date when project's deadline is
|
||
|
"duration" : 0, # Amount in days between startdate and deadline
|
||
|
"timepassed" : 0.0, # Percentage of how much time had passed
|
||
|
"dayspassed" : 0, # Amount of days since the startdate
|
||
|
"chr_factor" : 1, # Importance factor for Characters
|
||
|
"veh_factor" : 1, # Importance factor for Vehicles
|
||
|
"loc_factor" : 1, # Importance factor for Locations
|
||
|
"obj_factor" : 1, # Importance factor for Objects (Other)
|
||
|
"rnd_factor" : 1, # Importance factor for Scenes (Renders)
|
||
|
"chr" : 0.0, # Percentage of Characters done
|
||
|
"veh" : 0.0, # Percentage of Vehicles done
|
||
|
"loc" : 0.0, # Percentage of Locations done
|
||
|
"obj" : 0.0, # Percentage of Objects (Other) done
|
||
|
"rnd" : 0.0, # Percentage of Scenes (Renders) done
|
||
|
"dates" : {} # Per date, detailed data about the project
|
||
|
}
|
||
|
|
||
|
# Okay let's get the name, director and status from the old file. Funny that
|
||
|
# it still survived from so far back. In the Organizer 1.0 you had to manually
|
||
|
# type in the number of assets that had to be done in each category.
|
||
|
|
||
|
# And so for this task was created a file called "project.data". Here is
|
||
|
# an example :
|
||
|
|
||
|
# Project :Moria's Race
|
||
|
# Status :Short Action Driving Film
|
||
|
# Director :J.Y.Amihud
|
||
|
# Character:1
|
||
|
# Locations:1
|
||
|
# Objects :1
|
||
|
# Vehicles :1
|
||
|
# Scenes :4
|
||
|
|
||
|
# So that's survived up to the last Blender-Organizer. But no longer the
|
||
|
# last 5 lines were utilized. I was using it mainly for the first 3 things.
|
||
|
|
||
|
# Tho from a version 4.85 of Blender-Organizer those last lines were used
|
||
|
# to controll the influence factor. Basically the number stored will multiply
|
||
|
# the number of times a given category is counted in the final percentage.
|
||
|
|
||
|
# For example animating scenes should take more then half the time of the
|
||
|
# project. More then 50% of the project then should be in the scenes. But
|
||
|
# previous / primitive algorythm was giving each category an even 20%. So
|
||
|
# of course I fixed it. LOL.
|
||
|
|
||
|
# I think for VCStudio I gonna make a more unified file format. That will
|
||
|
# unite all "project.data", "percentage_hystory.data", "history.data" and
|
||
|
# "schedule.data".
|
||
|
|
||
|
# I'm going to still have the main checklist separate tho. The checklist
|
||
|
# format is quite good.
|
||
|
|
||
|
projectdata = open(project_location+"/project.data")
|
||
|
projectdata = projectdata.read()
|
||
|
projectdata = projectdata.split("\n")
|
||
|
|
||
|
for line in projectdata:
|
||
|
|
||
|
if line.startswith("Project"):
|
||
|
data["name"] = line[line.find(":")+1:]
|
||
|
|
||
|
elif line.startswith("Status"):
|
||
|
data["status"] = line[line.find(":")+1:]
|
||
|
|
||
|
elif line.startswith("Director"):
|
||
|
data["director"] = line[line.find(":")+1:]
|
||
|
|
||
|
# Next up some integer conversions. So...
|
||
|
|
||
|
elif line.startswith("Character"):
|
||
|
try:
|
||
|
data["chr_factor"] = int(line[line.find(":")+1:])
|
||
|
except:
|
||
|
data["chr_factor"] = 1
|
||
|
|
||
|
|
||
|
elif line.startswith("Vehicles"):
|
||
|
try:
|
||
|
data["veh_factor"] = int(line[line.find(":")+1:])
|
||
|
except:
|
||
|
data["veh_factor"] = 1
|
||
|
|
||
|
elif line.startswith("Locations"):
|
||
|
try:
|
||
|
data["loc_factor"] = int(line[line.find(":")+1:])
|
||
|
except:
|
||
|
data["loc_factor"] = 1
|
||
|
|
||
|
elif line.startswith("Objects"):
|
||
|
try:
|
||
|
data["obj_factor"] = int(line[line.find(":")+1:])
|
||
|
except:
|
||
|
data["obj_factor"] = 1
|
||
|
|
||
|
elif line.startswith("Scenes"):
|
||
|
try:
|
||
|
data["rnd_factor"] = int(line[line.find(":")+1:])
|
||
|
except:
|
||
|
data["rnd_factor"] = 1
|
||
|
|
||
|
# Okay this first file was easy. Let's now parse the main checklist and
|
||
|
# get 5 more values. Funny thing is that for the old checklists and new
|
||
|
# checklists you can use the same function to read them. ( The main check-
|
||
|
# list data ). But old checklists had something else in there that was
|
||
|
# making them a bit different from VCStudio checklists. It's the STR and FIN
|
||
|
# variables in the beginig.
|
||
|
|
||
|
# See in the Organizer 1.0 there was no scheduling system as there was in
|
||
|
# Blender-Orgaznier 4.9. The scheduling was done per asset and not per
|
||
|
# action in the checklist. So STR and FIN were 2 dates between which you
|
||
|
# should have had working on the asset.
|
||
|
|
||
|
# But in the main checklists ("project.progress") those 2 survived to the
|
||
|
# late Blender-Organizer as a project startdate and deadline.
|
||
|
|
||
|
# One more rub that I have is that date format was 00/00/0000 and not the
|
||
|
# way better one 0000/00/00 which makes sorting easy. So yeah...
|
||
|
|
||
|
old_date_format = "%d/%m/%Y"
|
||
|
new_date_format = "%Y/%m/%d"
|
||
|
|
||
|
projectdata = open(project_location+"/project.progress")
|
||
|
projectdata = projectdata.read()
|
||
|
projectdata = projectdata.split("\n")
|
||
|
|
||
|
startdate = datetime.datetime.today()
|
||
|
deadline = datetime.datetime.today()
|
||
|
|
||
|
for line in projectdata:
|
||
|
if line.startswith("STR"):
|
||
|
startdate = datetime.datetime.strptime(line[4:], old_date_format)
|
||
|
data["startdate"] = datetime.datetime.strftime(startdate, new_date_format)
|
||
|
|
||
|
elif line.startswith("FIN"):
|
||
|
deadline = datetime.datetime.strptime(line[4:], old_date_format)
|
||
|
data["deadline"] = datetime.datetime.strftime(deadline, new_date_format)
|
||
|
|
||
|
# So we've go the dates. Let's calculate time perventage I guess.
|
||
|
delta = deadline - startdate
|
||
|
data["duration"] = int(delta.days)
|
||
|
|
||
|
delta = datetime.datetime.today() - startdate
|
||
|
data["dayspassed"] = int(delta.days)
|
||
|
|
||
|
data["timepassed"] = data["dayspassed"] / data["duration"]
|
||
|
if data["timepassed"] > 1.0:
|
||
|
data["timepassed"] = 1.0
|
||
|
|
||
|
# Now let's lauch the main checklist and get the data from there. I mean
|
||
|
# the percentage. Btw It's just a hard thing. That I needed a separate
|
||
|
# function for it.
|
||
|
|
||
|
projectdata = checklist.get_list(project_location+"/project.progress")
|
||
|
data["checklist"] = projectdata["fraction"]
|
||
|
|
||
|
# NEXT THING. As I love to type it into place where people read me while I'm
|
||
|
# working. We've got data from 2 files. Now we need to get data from ALL the
|
||
|
# project.
|
||
|
|
||
|
# First we going to get data about the assets. Because it's relativelly easy
|
||
|
# compared to the story. For which you need to parce a crazy complicated .bos
|
||
|
# file. Which is a complex database in it's own right.
|
||
|
|
||
|
# So let's go and quickly get data about the assets.
|
||
|
|
||
|
asstfols = ["chr", "veh", "loc", "obj"]
|
||
|
astlist = []
|
||
|
|
||
|
for n , f in enumerate(asstfols):
|
||
|
|
||
|
flist = []
|
||
|
|
||
|
if len(os.listdir(project_location+"/dev/"+f)) > 0:
|
||
|
for asset in os.listdir(project_location+"/dev/"+f):
|
||
|
|
||
|
if asset+".blend" in os.listdir(project_location+"/ast/"+f):
|
||
|
flist.append(1.0)
|
||
|
|
||
|
else:
|
||
|
try:
|
||
|
fcheck = checklist.get_list(project_location+"/dev/"+f+"/"+asset+"/asset.progress")
|
||
|
flist.append(fcheck["fraction"])
|
||
|
except:
|
||
|
flist.append(0.0)
|
||
|
|
||
|
# The multiplication thing that I was talking about earlier.
|
||
|
|
||
|
multiply = data[f+"_factor"]
|
||
|
for m in range(multiply):
|
||
|
astlist.append(sum(flist)/len(flist))
|
||
|
|
||
|
data[f] = sum(flist)/len(flist)
|
||
|
|
||
|
|
||
|
# For the next step I need to have the story parsed and read. But it's going
|
||
|
# to be so hard. That I will need to write a separate function for it.
|
||
|
|
||
|
data["rnd"] = 0.0
|
||
|
|
||
|
# After all of it we need to get the final project percentage.
|
||
|
multiply = data["rnd_factor"]
|
||
|
for m in range(multiply):
|
||
|
astlist.append(data["rnd"])
|
||
|
|
||
|
try:
|
||
|
data["donework"] = sum(astlist) / len(astlist)
|
||
|
except:
|
||
|
data["donework"] = 0.0
|
||
|
data["fraction"] = (data["donework"] + data["checklist"]) / 2
|
||
|
|
||
|
# Next section of this data gathering will be about history, scheduling and
|
||
|
# similar things. I gonna create a dictionary of dates. And input data about
|
||
|
# those dates into the dates.
|
||
|
|
||
|
|
||
|
return data
|
||
|
|
||
|
this = get_legacy("/home/vcs/Projects/Films/Shorts/MoriasRace")
|
||
|
for i in this:
|
||
|
print(i, " : " ,this[i])
|