コード例 #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)
コード例 #2
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'}
コード例 #3
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]
コード例 #4
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'}
コード例 #5
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'}