|
| 1 | +import os |
| 2 | +import sublime |
| 3 | +import sublime_plugin |
| 4 | +import sys |
| 5 | + |
| 6 | +PACKAGE_SETTINGS = "GDL.sublime-settings" |
| 7 | +DEFAULT_AC_PATH = "C:/Program Files/GRAPHISOFT/ARCHICAD 23" |
| 8 | + |
| 9 | +def check_system(): |
| 10 | + """ Returns the file ending of executables depending on the |
| 11 | + operating system of the user. |
| 12 | + """ |
| 13 | + if sys.platform.startswith('darwin'): # OSX |
| 14 | + return "app" |
| 15 | + elif sys.platform.startswith('win'): # Windows |
| 16 | + return "exe" |
| 17 | + else: |
| 18 | + sublime.error_message("GDL build error: Your OS is not supported.") |
| 19 | + return |
| 20 | + |
| 21 | +def save_all_files(): |
| 22 | + """ Saves all files open in sublime. |
| 23 | + Mimics the 'save on build' behavior of Sublime Text. |
| 24 | + """ |
| 25 | + for window in sublime.windows(): |
| 26 | + for view in window.views(): |
| 27 | + if view.file_name() and view.is_dirty(): |
| 28 | + view.run_command("save") |
| 29 | + |
| 30 | +def get_project_data(view, invoke): # invoke is either 'to-hsf' or 'to-gsm' |
| 31 | + """ Gets the data of the .sublime-project file. |
| 32 | + Returns additional arguments for the commandline operation, |
| 33 | + if the user has set any. |
| 34 | + """ |
| 35 | + project_data = view.window().project_data() |
| 36 | + if not project_data: |
| 37 | + sublime.error_message("You must create a project first! (Project > Save Project As…)") |
| 38 | + return |
| 39 | + |
| 40 | + project_settings = project_data.get('cmdargs', {}) |
| 41 | + if type(project_settings) is dict: |
| 42 | + # check if dict is empty |
| 43 | + if bool(project_settings): |
| 44 | + return project_settings.get(invoke, "") |
| 45 | + else: |
| 46 | + # dict is empty, which means user hasn't set any cmdargs |
| 47 | + return "" |
| 48 | + else: |
| 49 | + sublime.error_message("Something went wrong.") |
| 50 | + return |
| 51 | + |
| 52 | +# go to |
| 53 | +# http://gdl.graphisoft.com/tips-and-tricks/how-to-use-the-lp_xmlconverter-tool |
| 54 | +# for detailed information |
| 55 | +class HsfBuildCommand(sublime_plugin.WindowCommand): |
| 56 | + |
| 57 | + def run(self, *args, **kwargs): |
| 58 | + self.os = check_system() |
| 59 | + view = self.window.active_view() |
| 60 | + if view.settings().get("auto_save", True): |
| 61 | + save_all_files() |
| 62 | + |
| 63 | + settings = sublime.load_settings(PACKAGE_SETTINGS) |
| 64 | + self.AC_path = str(settings.get("AC_path", DEFAULT_AC_PATH)) |
| 65 | + |
| 66 | + folders = self.window.folders() |
| 67 | + if len(folders) <= 0: |
| 68 | + sublime.error_message("GDL build command error: You must have a project open.") |
| 69 | + else: |
| 70 | + if len(folders) == 1: |
| 71 | + self.multipleFolders = False |
| 72 | + self.project_folder = folders[0] |
| 73 | + else: |
| 74 | + self.multipleFolders = True |
| 75 | + self.pick_project_folder(folders) |
| 76 | + |
| 77 | + self.find_gsm() |
| 78 | + self.cmdargs = get_project_data(view, 'to-hsf') |
| 79 | + self.run_hsf() |
| 80 | + |
| 81 | + def pick_project_folder(self, folders): |
| 82 | + folderNames = [] |
| 83 | + for folder in folders: |
| 84 | + index = folder.rfind('/') + 1 |
| 85 | + if index > 0: |
| 86 | + folderNames.append(folder[index:]) |
| 87 | + else: |
| 88 | + folderNames.append(folder) |
| 89 | + |
| 90 | + # self.sel_proj will be called once, with the index of the selected item |
| 91 | + self.show_quick_panel(folderNames, self.select_project) |
| 92 | + |
| 93 | + def select_project(self, select): |
| 94 | + folders = self.window.folders() |
| 95 | + if select < 0: # will be -1 if panel was cancelled |
| 96 | + return |
| 97 | + self.project_folder = folders[select] |
| 98 | + |
| 99 | + def find_gsm(self): |
| 100 | + self.files = [] |
| 101 | + # r=root, d=directories, f=files |
| 102 | + for r, d, f in os.walk(self.project_folder): |
| 103 | + for file in f: |
| 104 | + if '.gsm' in file: |
| 105 | + self.files.append(os.path.join(r, file)) |
| 106 | + |
| 107 | + if len(self.files) <= 0: |
| 108 | + sublime.error_message("GDL build error: No GSM found.") |
| 109 | + |
| 110 | + if len(self.files) > 1: |
| 111 | + self.show_quick_panel(folderNames, self.select_project) |
| 112 | + else: |
| 113 | + self.file_to_convert = self.files[0] |
| 114 | + |
| 115 | + def select_gsm(self, select): |
| 116 | + if select < 0: |
| 117 | + return |
| 118 | + self.file_to_convert = self.files[select] |
| 119 | + |
| 120 | + # Sublime Text 3 requires a short timeout between quick panels |
| 121 | + def show_quick_panel(self, options, done): |
| 122 | + sublime.set_timeout(lambda: self.window.show_quick_panel(options, done), 10) |
| 123 | + |
| 124 | + def run_hsf(self, ): |
| 125 | + converter = self.AC_path + "/LP_XMLConverter." + self.os |
| 126 | + cmd = [converter, "libpart2hsf", self.cmdargs, self.file_to_convert, self.project_folder] # cmd, source, dest |
| 127 | + execCMD = {"cmd": cmd} |
| 128 | + |
| 129 | + self.window.run_command("exec", execCMD) |
| 130 | + |
| 131 | +############################################################################ |
| 132 | +class LibpartBuildCommand(sublime_plugin.WindowCommand): |
| 133 | + |
| 134 | + def run(self, *args, **kwargs): |
| 135 | + self.os = check_system() |
| 136 | + view = self.window.active_view() |
| 137 | + if view.settings().get("auto_save", True): |
| 138 | + save_all_files() |
| 139 | + |
| 140 | + settings = sublime.load_settings(PACKAGE_SETTINGS) |
| 141 | + self.AC_path = str(settings.get("AC_path", DEFAULT_AC_PATH)) |
| 142 | + |
| 143 | + folders = self.window.folders() |
| 144 | + if len(folders) <= 0: |
| 145 | + sublime.error_message("GDL build command error: You must have a project open.") |
| 146 | + else: |
| 147 | + if len(folders) == 1: |
| 148 | + self.multipleFolders = False |
| 149 | + self.project_folder = folders[0] |
| 150 | + else: |
| 151 | + self.multipleFolders = True |
| 152 | + self.pick_project_folder(folders) |
| 153 | + |
| 154 | + self.find_hsf() |
| 155 | + self.gsm_name = self.folder_to_convert + ".gsm" |
| 156 | + self.cmdargs = get_project_data(view, 'to-gsm') |
| 157 | + self.run_libpart() |
| 158 | + |
| 159 | + def pick_project_folder(self, folders): |
| 160 | + folderNames = [] |
| 161 | + for folder in folders: |
| 162 | + index = folder.rfind('/') + 1 |
| 163 | + if index > 0: |
| 164 | + folderNames.append(folder[index:]) |
| 165 | + else: |
| 166 | + folderNames.append(folder) |
| 167 | + |
| 168 | + # self.sel_proj will be called once, with the index of the selected item |
| 169 | + self.show_quick_panel(folderNames, self.select_project) |
| 170 | + |
| 171 | + def select_project(self, select): |
| 172 | + folders = self.window.folders() |
| 173 | + if select < 0: # will be -1 if panel was cancelled |
| 174 | + return |
| 175 | + self.project_folder = folders[select] |
| 176 | + |
| 177 | + def find_hsf(self): |
| 178 | + # self.folders = [] |
| 179 | + #for fldr in os.listdir(self.project_folder): |
| 180 | + # for fldr in os.scandir(self.project_folder): |
| 181 | + # self.folders.append(fldr.name) |
| 182 | + self.folders = [fldr for fldr in os.listdir(self.project_folder) if os.path.isdir(os.path.join(self.project_folder, fldr))] |
| 183 | + print(self.folders) |
| 184 | + |
| 185 | + if len(self.folders) <= 0: |
| 186 | + sublime.error_message("GDL build error: No HSF found.") |
| 187 | + |
| 188 | + if len(self.folders) > 1: |
| 189 | + self.show_quick_panel(self.folders, self.select_hsf) |
| 190 | + else: |
| 191 | + self.folder_to_convert = self.project_folder + "\\" + self.folders[0] |
| 192 | + |
| 193 | + def select_hsf(self, select): |
| 194 | + folders = self.folders |
| 195 | + if select < 0: # will be -1 if panel was cancelled |
| 196 | + return |
| 197 | + self.folder_to_convert = self.project_folder + "\\" + folders[select] |
| 198 | + |
| 199 | + # Sublime Text 3 requires a short timeout between quick panels |
| 200 | + def show_quick_panel(self, options, done): |
| 201 | + sublime.set_timeout(lambda: self.window.show_quick_panel(options, done), 10) |
| 202 | + |
| 203 | + def run_libpart(self): |
| 204 | + converter = self.AC_path + "/LP_XMLConverter.exe" |
| 205 | + cmd = [converter, "hsf2libpart", self.cmdargs, self.folder_to_convert, self.gsm_name] # cmd, source, dest |
| 206 | + execCMD = {"cmd": cmd} |
| 207 | + |
| 208 | + self.window.run_command("exec", execCMD) |
0 commit comments