.*?)\]}')
10 | re_table = re.compile(r'\|(?P +)(?P--+)(?P +)\|')
11 |
12 | def read_file(filename):
13 | try: return codecs.open(filename, encoding='utf-8').read()
14 | except: pass
15 | try: return codecs.open(filename, encoding='utf-16').read()
16 | except: pass
17 | return None
18 |
19 |
20 | if len(sys.argv) != 2:
21 | print(f'Usage: {sys.argv[0]} [file.md]')
22 | sys.exit(1)
23 |
24 | fn = sys.argv[1]
25 | f = read_file(fn)
26 |
27 | # convert keymaps {{something foo, bar}} ==> ,
28 | nf = []
29 | for l in f.splitlines():
30 | while True:
31 | m = re_keymap.search(l)
32 | if not m: break
33 | keys = m.group('key').split(',')
34 | nkeys = []
35 | for key in keys:
36 | key = key.strip()
37 | key = key.replace(' ','_')
38 | key = f''
39 | nkeys += [key]
40 | keys = ', '.join(nkeys)
41 | l = l[:m.start()] + keys + l[m.end():]
42 | nf += [l]
43 | f = '\n'.join(nf)
44 |
45 | # convert options {[something foo]} ==>
46 | nf = []
47 | for l in f.splitlines():
48 | while True:
49 | m = re_options.search(l)
50 | if not m: break
51 | key = m.group('key')
52 | key = key.strip()
53 | key = key.replace(' ', '_')
54 | key = f''
55 | l = l[:m.start()] + key + l[m.end():]
56 | nf += [l]
57 | f = '\n'.join(nf)
58 |
59 | # convert tables | --- | --- | --- | ==> | :--- | :--- | :--- |
60 | nf = []
61 | for l in f.splitlines():
62 | while True:
63 | m = re_table.search(l)
64 | if not m: break
65 | l = l[:m.start()] + '|' + m.group('pre') + ':' + m.group('dashes') + m.group('post') + '|' + l[m.end():]
66 | nf += [l]
67 | f = '\n'.join(nf)
68 |
69 | f = f + '\n\n'
70 |
71 | # print(type(f))
72 | # print(f)
73 |
74 | with open(fn, 'w') as fo:
75 | fo.write(f) #.encode('utf8'))
76 |
--------------------------------------------------------------------------------
/scripts/create_thumbnails.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import png
5 | import sys
6 | import glob
7 | import shutil
8 | import subprocess
9 |
10 | w,h = 120,120
11 | tempfn = '_temporary.thumb.png'
12 |
13 | def same_pngs(fnA, fnB):
14 | wA, hA, dA, mA = png.Reader(filename=fnA).read()
15 | wB, hB, dB, mB = png.Reader(filename=fnB).read()
16 | if (wA, hA) != (wB, hB): return False # different sizes
17 | for rowA, rowB in zip(dA, dB):
18 | for colA, colB in zip(rowA, rowB):
19 | if colA != colB: return False
20 | # not checking meta data (mA == mB)
21 | # for example: ignoring the creation timestamp
22 | return True
23 |
24 | for fullfn in glob.glob('*.png'):
25 | if fullfn.endswith('.thumb.png'):
26 | # do not thumb the thumb files!
27 | continue
28 | fullbase, _ = os.path.splitext(fullfn)
29 | thumbfn = f'{fullbase}.thumb.png'
30 | subprocess.call(f'convert "{fullfn}" -resize {w}x{h} "{tempfn}"', shell=True)
31 | if os.path.exists(thumbfn) and same_pngs(tempfn, thumbfn):
32 | # pixel data did not change
33 | os.remove(tempfn)
34 | else:
35 | shutil.move(tempfn, thumbfn)
--------------------------------------------------------------------------------
/scripts/detect_filename_case_conflicts.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import sys
5 | import glob
6 |
7 | issue = False
8 |
9 | def check(path):
10 | global issue
11 | pwd = os.getcwd()
12 | os.chdir(path)
13 | filenames = set(glob.glob('*'))
14 | lfilenames = {}
15 | for f in filenames:
16 | lfilenames.setdefault(f.lower(), [])
17 | lfilenames[f.lower()].append(f)
18 | if any(len(v)>1 for k,v in lfilenames.items()):
19 | issue = True
20 | print(f'Issues detected in {path}')
21 | for k,v in lfilenames.items():
22 | if len(v) == 1: continue
23 | for f in v: print(f' {f}')
24 | for f in filenames:
25 | if not os.path.isdir(f): continue
26 | check(os.path.join(path, f))
27 | os.chdir(pwd)
28 |
29 | check(os.path.abspath('.'))
30 |
31 | sys.exit(1 if issue else 0)
32 |
--------------------------------------------------------------------------------
/scripts/download_b280.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import re
5 | import glob
6 | import wget
7 | import shutil
8 | import tarfile
9 | import datetime
10 |
11 | assert False, 'do not use this anymore'
12 |
13 | now = datetime.datetime.now()
14 | user = os.path.expanduser('~')
15 | urlroot='https://builder.blender.org'
16 | url='%s/download/' % urlroot
17 | tmp='/tmp/download.html'
18 | blendertar=os.path.join(user, 'software/blender-2.80-%04d%02d%02d.tar.bz2' % (now.year, now.month, now.day))
19 | blenderpath=os.path.join(user, 'software/blender-2.80-%04d%02d%02d' % (now.year, now.month, now.day))
20 | blendersym=os.path.join(user, 'software/blender-2.80')
21 |
22 | print('finding latest blender 2.80')
23 | tmp=wget.download(url=url, out=tmp, bar=None)
24 | html=open(tmp, 'rt').read()
25 | m = re.search(r'/download/blender-2\.80-[0-9a-f]+-linux-glibc[^-]*?-x86_64\.tar\.bz2', html)
26 | assert m, 'could not find match'
27 |
28 | url = '%s/%s' % (urlroot, m.group(0))
29 | print('downloading %s' % url)
30 | blendertar=wget.download(url=url, out=blendertar, bar=None)
31 |
32 | print('extracting from %s' % blendertar)
33 | t = tarfile.open(name=blendertar)
34 | t.extractall(path=blenderpath)
35 |
36 | innerpath=list(glob.glob(os.path.join(blenderpath,'*')))[0]
37 | print('moving from inner folder (%s) to outer' % innerpath)
38 | for f in glob.glob(os.path.join(innerpath, '*')):
39 | shutil.move(f, blenderpath)
40 | os.rmdir(innerpath)
41 |
42 | print('creating new symlink and cleaning up')
43 | os.unlink(blendertar)
44 | os.unlink(blendersym)
45 | os.symlink(blenderpath, blendersym)
46 |
--------------------------------------------------------------------------------
/scripts/download_b281.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import re
5 | import glob
6 | import wget
7 | import shutil
8 | import tarfile
9 | import datetime
10 |
11 | now = datetime.datetime.now()
12 | user = os.path.expanduser('~')
13 | urlroot='https://builder.blender.org'
14 | url='%s/download/' % urlroot
15 | tmp='/tmp/download.html'
16 | blendertar=os.path.join(user, 'software/blender-2.81-%04d%02d%02d.tar.bz2' % (now.year, now.month, now.day))
17 | blenderpath=os.path.join(user, 'software/blender-2.81-%04d%02d%02d' % (now.year, now.month, now.day))
18 | blendersym=os.path.join(user, 'software/blender-2.81')
19 |
20 | print('finding latest blender 2.81')
21 | tmp=wget.download(url=url, out=tmp, bar=None)
22 | html=open(tmp, 'rt').read()
23 | m = re.search(r'/download/blender-2\.81-[0-9a-f]+-linux-glibc[^-]*?-x86_64\.tar\.bz2', html)
24 | assert m, 'could not find match'
25 |
26 | url = '%s/%s' % (urlroot, m.group(0))
27 | print('downloading %s' % url)
28 | blendertar=wget.download(url=url, out=blendertar, bar=None)
29 |
30 | print('extracting from %s' % blendertar)
31 | t = tarfile.open(name=blendertar)
32 | t.extractall(path=blenderpath)
33 |
34 | innerpath=list(glob.glob(os.path.join(blenderpath,'*')))[0]
35 | print('moving from inner folder (%s) to outer' % innerpath)
36 | for f in glob.glob(os.path.join(innerpath, '*')):
37 | shutil.move(f, blenderpath)
38 | os.rmdir(innerpath)
39 |
40 | print('creating new symlink and cleaning up')
41 | os.unlink(blendertar)
42 | os.unlink(blendersym)
43 | os.symlink(blenderpath, blendersym)
44 |
--------------------------------------------------------------------------------
/scripts/download_b282.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import re
5 | import glob
6 | import wget
7 | import shutil
8 | import tarfile
9 | import datetime
10 |
11 | now = datetime.datetime.now()
12 | user = os.path.expanduser('~')
13 | urlroot='https://builder.blender.org'
14 | url='%s/download/' % urlroot
15 | tmp='/tmp/download.html'
16 | blendertar=os.path.join(user, 'software/blender-2.82-%04d%02d%02d.tar.bz2' % (now.year, now.month, now.day))
17 | blenderpath=os.path.join(user, 'software/blender-2.82-%04d%02d%02d' % (now.year, now.month, now.day))
18 | blendersym=os.path.join(user, 'software/blender-2.82')
19 |
20 | print('finding latest blender 2.82')
21 | tmp=wget.download(url=url, out=tmp, bar=None)
22 | html=open(tmp, 'rt').read()
23 | m = re.search(r'/download/blender-2\.82-[0-9a-f]+-linux-glibc[^-]*?-x86_64\.tar\.(bz2|xz)', html)
24 | assert m, 'could not find match'
25 |
26 | url = '%s/%s' % (urlroot, m.group(0))
27 | print('downloading %s' % url)
28 | blendertar=wget.download(url=url, out=blendertar, bar=None)
29 |
30 | print('extracting from %s' % blendertar)
31 | t = tarfile.open(name=blendertar)
32 | t.extractall(path=blenderpath)
33 |
34 | innerpath=list(glob.glob(os.path.join(blenderpath,'*')))[0]
35 | print('moving from inner folder (%s) to outer' % innerpath)
36 | for f in glob.glob(os.path.join(innerpath, '*')):
37 | shutil.move(f, blenderpath)
38 | os.rmdir(innerpath)
39 |
40 | print('creating new symlink and cleaning up')
41 | os.unlink(blendertar)
42 | os.unlink(blendersym)
43 | os.symlink(blenderpath, blendersym)
44 |
--------------------------------------------------------------------------------
/scripts/get_hive_value.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | import sys
5 | import json
6 |
7 | if len(sys.argv) != 2:
8 | print(f'Usage: {sys.argv[0]} key')
9 | sys.exit(1)
10 |
11 | hive_path = os.path.join(os.path.dirname(__file__), '..', 'hive.json')
12 | hive = json.load(open(hive_path, 'rt'))
13 |
14 | print(hive[sys.argv[1]])
15 |
--------------------------------------------------------------------------------
/scripts/memlimited.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash -e
2 |
3 | # runs blender with limited memory (will crash if blender allocates too much)
4 |
5 | ulimit -Sv 5000000
6 | #shift
7 | ./blender $@
--------------------------------------------------------------------------------
/scripts/modal_event_reporting.blend:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CGCookie/retopoflow/82ed2a97188d903816e296a577b8bbc8bd97c236/scripts/modal_event_reporting.blend
--------------------------------------------------------------------------------