def setProjects(): """ Load a new set of Projects in to the enum, runs each time we need to update the list""" global projects projects2 = [] projects = [] a = ShapDoAPI(settings["API"]) try: projectsDict = a.getProjectsList()["result"]["projects"] except (urllib.error.HTTPError, urllib.error.URLError) as e: bpy.ops.error.message( 'INVOKE_DEFAULT', MessageType="Error", message="Could not connect to server, check your API key") return [] for project in projectsDict: projects2.append((project["name"], project["title"], project["url"])) projects.append(project["name"]) #Append 'add new file' option projects2.append( (CREATE_NEW_PROJECT, CREATE_NEW_PROJECT, CREATE_NEW_PROJECT)) bpy.types.Scene.ProjectEnum = EnumProperty(items=projects2, name="Project", update=projectUpdated)
def execute(self, context): global working_on_stl self.report({'INFO'}, "Downloading from ShapeDo") settings["CurrentProject"] = context.scene.ProjectEnum settings["CurrentFile"] = context.scene.FilesEnum save_settings() a = ShapDoAPI(settings["API"]) try: reply = a.downloadProject(settings["CurrentProject"], settings["CurrentFile"], BLEND_SAVE_PATH) print(reply) if not reply["success"]: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message=reply["error"]) return {'FINISHED'} try: bpy.ops.wm.open_mainfile(filepath=BLEND_SAVE_PATH) working_on_stl = False except RuntimeError: bpy.ops.wm.read_homefile() bpy.ops.object.delete() for item in bpy.data.objects: try: bpy.context.scene.objects.unlink(item) bpy.data.objects.remove(item) except: pass bpy.ops.import_mesh.stl(filepath=BLEND_SAVE_PATH) working_on_stl = True setWorkingProject(context) except (urllib.error.HTTPError, urllib.error.URLError) as e: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message="Download error: " + str(e)) return {'FINISHED'}
def setFiles(context, dummy=False): """ Load a new set of files paths from a project in to the enum, runs each time we need to update the list :param context: Scene context :param dummy: Used if we are loading a new project, dummy value will be generated """ global files files2 = [] files = [] if dummy: files2.append((ADD_NEW_FILE, ADD_NEW_FILE, ADD_NEW_FILE)) else: a = ShapDoAPI(settings["API"]) print("project:") print(str(context.scene.ProjectEnum)) reply = a.getProjectInfo(str(context.scene.ProjectEnum)) print(reply) #if not reply["success"]: # bpy.ops.error.message('INVOKE_DEFAULT', # MessageType = "Error", # message = reply["error"]) # return filesDict = reply["result"]["files"] for key in filesDict: if key.split(".")[-1] in ACCEPTED_FILETYPES: files2.append((key, key, filesDict[key])) #Append 'add new file' option files2.append((ADD_NEW_FILE, ADD_NEW_FILE, ADD_NEW_FILE)) files = filesDict.keys() bpy.types.Scene.FilesEnum = EnumProperty(items=files2, name="Files", update=filesUpdated) #Set to first option context.scene.FilesEnum = files2[0][1]
def execute(self, context): global settings self.report({'INFO'}, str(settings)) a = ShapDoAPI() self.settings_username = self.settings_username.strip() self.settings_password = self.settings_password.strip() if self.settings_username != "" and self.settings_password != 0: try: reply = a.getToken(self.settings_username, self.settings_password) if not reply["success"]: bpy.ops.error.message( 'INVOKE_DEFAULT', MessageType="Error", message= "Authentication failed, check your username and password" ) else: settings["API"] = reply["result"]["apiKey"] settings["Username"] = self.settings_username save_settings() setProjects() setFiles(context) except Exception as e: bpy.ops.error.message( 'INVOKE_DEFAULT', MessageType="Error", message= "Could not connect to server, check your internet connection: " + str(e)) return {'FINISHED'}
def modal(self, context, event): try: a = ShapDoAPI(settings["API"]) if context.scene.ProjectEnum == CREATE_NEW_PROJECT: self.report({'INFO'}, "Creating new project") bpy.ops.wm.save_mainfile(filepath=BLEND_SAVE_PATH) newFilePath = self.new_file_path.split(".blend")[0] + ".blend" reply = a.createNewProject( self.new_project_title, BLEND_SAVE_PATH, newFilePath, self.new_project_description, "", self.new_project_category, self.new_project_license, self.new_project_tags, self.new_project_private) if not reply["success"]: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message=reply["error"]) return {'FINISHED'} #Make enums include new project, and set it to the current project newProjectName = reply["result"]['url'].split("/")[-1] settings["CurrentProject"] = newProjectName settings["CurrentFile"] = newFilePath save_settings() setProjects() setFiles(context) context.scene.ProjectEnum = newProjectName context.scene.FilesEnum = newFilePath #uploading new file to existing project elif context.scene.FilesEnum == ADD_NEW_FILE: self.report({'INFO'}, self.commit_message) newFileName = self.new_file_path + ".blend" if newFileName not in files: #uploading new file bpy.ops.wm.save_mainfile(filepath=BLEND_SAVE_PATH) reply = a.uploadFile(context.scene.ProjectEnum, newFileName, self.commit_message, BLEND_SAVE_PATH) if not reply["success"]: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message=reply["error"]) setFiles(context) context.scene.FilesEnum = newFileName else: #Error file already exists bpy.ops.error.message( 'INVOKE_DEFAULT', MessageType="Error", message= "File already exists in project, please provide another." ) #uploading to existing file else: self.report({'INFO'}, self.commit_message) print("updating existing") if not working_on_stl: bpy.ops.wm.save_mainfile(filepath=BLEND_SAVE_PATH) else: # select all objects for object in bpy.data.objects: object.select = True bpy.ops.export_mesh.stl(filepath=BLEND_SAVE_PATH) print(self.commit_message) reply = a.uploadFile(context.scene.ProjectEnum, context.scene.FilesEnum, self.commit_message, BLEND_SAVE_PATH) if not reply["success"]: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message=reply["error"]) except urllib.error.URLError as e: bpy.ops.error.message('INVOKE_DEFAULT', MessageType="Error", message="Connection to ShapeDo failed: " + str(e)) return {'FINISHED'}