Example #1
0
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 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 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]
Example #4
0
    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'}
Example #5
0
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 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'}    
Example #7
0
    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 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)
Example #9
0
    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'}
 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'}