Skip to content

Commit 9366372

Browse files
committed
🎉 auto conversion setup
1 parent 2d9b42d commit 9366372

File tree

1 file changed

+208
-0
lines changed

1 file changed

+208
-0
lines changed

GDL.py

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
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

Comments
 (0)