├── impl
├── fonts
│ └── tiny.otf
├── apps_v2
│ ├── res
│ │ ├── weather
│ │ │ ├── 01d.png
│ │ │ ├── 01n.png
│ │ │ ├── 02d.png
│ │ │ ├── 02n.png
│ │ │ ├── 03d.png
│ │ │ ├── 03n.png
│ │ │ ├── 04d.png
│ │ │ ├── 04n.png
│ │ │ ├── 09d.png
│ │ │ ├── 09n.png
│ │ │ ├── 10d.png
│ │ │ ├── 10n.png
│ │ │ ├── 11d.png
│ │ │ ├── 11n.png
│ │ │ ├── 13d.png
│ │ │ ├── 13n.png
│ │ │ ├── 50d.png
│ │ │ └── 50n.png
│ │ ├── tothemoon_darker.png
│ │ ├── gif
│ │ │ └── horizontal
│ │ │ │ ├── fine.gif
│ │ │ │ ├── falling.gif
│ │ │ │ ├── padoru.gif
│ │ │ │ ├── penguin.gif
│ │ │ │ └── static.gif
│ │ ├── pixel_logo_flipped.png
│ │ ├── life_patterns
│ │ │ ├── centinal.npy
│ │ │ ├── centinal.png
│ │ │ ├── pboj_p22.npy
│ │ │ ├── pboj_p22.png
│ │ │ ├── achim_p144.npy
│ │ │ └── achim_p144.png
│ │ └── main_screen
│ │ │ ├── cloud-bg.png
│ │ │ ├── forest-bg.png
│ │ │ ├── sakura-bg.png
│ │ │ └── cloud-bg-clear.png
│ ├── gif_viewer.py
│ ├── subcount.py
│ ├── stocks.py
│ ├── life.py
│ ├── weather.py
│ ├── pomodoro.py
│ ├── spotify_player.py
│ ├── notion_v2.py
│ └── main_screen.py
├── InputStatus.py
├── modules
│ ├── weather_module.py
│ ├── notification_module.py
│ └── spotify_module.py
└── controller_v3.py
├── .gitmodules
├── config template.txt
├── README.md
├── cad
├── knob.STEP
└── base swivel cap V2.STEP
└── LICENSE
/impl/fonts/tiny.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/fonts/tiny.otf
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/01d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/01d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/01n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/01n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/02d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/02d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/02n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/02n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/03d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/03d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/03n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/03n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/04d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/04d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/04n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/04n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/09d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/09d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/09n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/09n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/10d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/10d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/10n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/10n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/11d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/11d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/11n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/11n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/13d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/13d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/13n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/13n.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/50d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/50d.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/weather/50n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/weather/50n.png
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "rpi-rgb-led-matrix"]
2 | path = rpi-rgb-led-matrix
3 | url = https://github.com/hzeller/rpi-rgb-led-matrix
4 |
--------------------------------------------------------------------------------
/impl/apps_v2/res/tothemoon_darker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/tothemoon_darker.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/gif/horizontal/fine.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/gif/horizontal/fine.gif
--------------------------------------------------------------------------------
/impl/apps_v2/res/pixel_logo_flipped.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/pixel_logo_flipped.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/gif/horizontal/falling.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/gif/horizontal/falling.gif
--------------------------------------------------------------------------------
/impl/apps_v2/res/gif/horizontal/padoru.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/gif/horizontal/padoru.gif
--------------------------------------------------------------------------------
/impl/apps_v2/res/gif/horizontal/penguin.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/gif/horizontal/penguin.gif
--------------------------------------------------------------------------------
/impl/apps_v2/res/gif/horizontal/static.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/gif/horizontal/static.gif
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/centinal.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/centinal.npy
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/centinal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/centinal.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/pboj_p22.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/pboj_p22.npy
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/pboj_p22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/pboj_p22.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/main_screen/cloud-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/main_screen/cloud-bg.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/main_screen/forest-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/main_screen/forest-bg.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/main_screen/sakura-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/main_screen/sakura-bg.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/achim_p144.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/achim_p144.npy
--------------------------------------------------------------------------------
/impl/apps_v2/res/life_patterns/achim_p144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/life_patterns/achim_p144.png
--------------------------------------------------------------------------------
/impl/apps_v2/res/main_screen/cloud-bg-clear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ty-porter/matrix-dashboard/HEAD/impl/apps_v2/res/main_screen/cloud-bg-clear.png
--------------------------------------------------------------------------------
/impl/InputStatus.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 | class InputStatusEnum(Enum):
4 | NOTHING = 1
5 | SINGLE_PRESS = 2
6 | DOUBLE_PRESS = 3
7 | TRIPLE_PRESS = 4
8 | LONG_PRESS = 5
9 | ENCODER_INCREASE = 6
10 | ENCODER_DECREASE = 7
11 |
--------------------------------------------------------------------------------
/config template.txt:
--------------------------------------------------------------------------------
1 | [Pushbullet]
2 | websocket_url = xxx
3 |
4 | [OWM]
5 | token = xxx
6 | lat = 0.0
7 | lon = 0.0
8 |
9 | [Spotify]
10 | client_id = xxx
11 | client_secret = xxx
12 | redirect_uri = xxx
13 |
14 | [Notion]
15 | token_v2 = xxx
16 | source = xxx
17 |
18 | [Notion_V2]
19 | token = xxx
20 | databaseID = xxx
21 |
22 | [Youtube]
23 | key = xxx
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # matrix-dashboard
2 | Code and CAD Files for Matrix Dashboard
3 |
4 | ---------------
5 | > [!WARNING]
6 | > This software is provided **AS-IS**.
7 | >
8 | > This project is a fork of the original `matrix-dashboard` repository, which has been removed by the author.
9 | >
10 | > **I am unable to provide ongoing support for this project.**
11 | ---------------
12 |
--------------------------------------------------------------------------------
/impl/modules/weather_module.py:
--------------------------------------------------------------------------------
1 | from pyowm.owm import OWM
2 | from threading import Thread
3 | from queue import LifoQueue
4 | import time
5 |
6 | class WeatherModule:
7 | def __init__(self, config):
8 | self.one_call = None
9 | self.queue = LifoQueue()
10 |
11 | if config is not None and 'OWM' in config and 'token' in config['OWM'] and config['OWM']['token'] is not "" and 'lat' in config['OWM'] and 'lon' in config['OWM']:
12 | self.mgr = OWM(config['OWM']['token']).weather_manager()
13 | self.thread = Thread(target = update_weather, args=(self.mgr, self.queue, float(config['OWM']['lat']), float(config['OWM']['lon']),))
14 | self.thread.start()
15 | else:
16 | print("[Weather Module] Empty OWM API Token")
17 |
18 | def getWeather(self):
19 | if not self.queue.empty():
20 | self.one_call = self.queue.get()
21 | self.queue.queue.clear()
22 | return self.one_call
23 |
24 | def update_weather(mgr, weather_queue, lat, lon):
25 | lastTimeCall = 0
26 | while True:
27 | currTime = time.time()
28 | if (currTime - lastTimeCall >= 600):
29 | try:
30 | weather_queue.put(mgr.one_call(lat = lat, lon = lon))
31 | lastTimeCall = currTime
32 | except Exception:
33 | pass
--------------------------------------------------------------------------------
/impl/apps_v2/gif_viewer.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | from InputStatus import InputStatusEnum
3 | from PIL import Image, ImageSequence, ImageDraw
4 | import time
5 | import os
6 |
7 | white = (230,255,255)
8 |
9 | class GifScreen:
10 | def __init__(self, config, modules, default_actions):
11 | #save the numpy arrays to avoid conversion all the time
12 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
13 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
14 |
15 | location = config.get('Gif Viewer', 'location', fallback=None)
16 | if location is None:
17 | print("[Gif Viewer] Location of gifs is not specified in config")
18 | self.animations = []
19 | else:
20 | self.animations = loadAnimations(location)
21 |
22 | self.currentIdx = 0
23 | self.selectMode = False
24 |
25 | self.modules = modules
26 | self.default_actions = default_actions
27 | self.cnt = 0
28 | self.was_horizontal = True
29 |
30 | def generate(self, isHorizontal, inputStatus):
31 | if (inputStatus == InputStatusEnum.LONG_PRESS):
32 | self.selectMode = not self.selectMode
33 |
34 | if self.selectMode:
35 | if (inputStatus is InputStatusEnum.ENCODER_INCREASE):
36 | self.currentIdx += 1
37 | self.cnt = 0
38 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
39 | self.currentIdx -= 1
40 | self.cnt = 0
41 | else:
42 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
43 | self.default_actions['toggle_display']()
44 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
45 | self.default_actions['switch_next_app']()
46 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
47 | self.default_actions['switch_prev_app']()
48 |
49 | curr_gif = ImageSequence.Iterator(self.animations[self.currentIdx % len(self.animations)])
50 | try:
51 | frame = curr_gif[self.cnt].convert('RGB')
52 | except IndexError:
53 | self.cnt = 0
54 | frame = curr_gif[self.cnt].convert('RGB')
55 | self.cnt += 1
56 |
57 | draw = ImageDraw.Draw(frame)
58 |
59 | if (self.selectMode):
60 | draw.rectangle((0,0,self.canvas_width-1,self.canvas_height-1), outline=white)
61 |
62 | time.sleep(0.04)
63 | return frame
64 |
65 | def loadAnimations(location):
66 | print(location)
67 | result = []
68 | for filename in os.listdir(location):
69 | if filename.endswith(".gif"):
70 | result.append(Image.open(location+'/'+filename))
71 | return result
72 |
--------------------------------------------------------------------------------
/impl/apps_v2/subcount.py:
--------------------------------------------------------------------------------
1 | import time
2 | import urllib.request
3 | import json
4 | from PIL import Image, ImageFont, ImageDraw
5 | import threading
6 | import numpy as np
7 | from InputStatus import InputStatusEnum
8 | from queue import LifoQueue
9 | from ast import literal_eval
10 |
11 | class SubcountScreen:
12 | def __init__(self, config, modules, default_actions):
13 | self.modules = modules
14 | self.default_actions = default_actions
15 | self.bg = Image.open('apps_v2/res/pixel_logo_flipped.png').convert('RGB')
16 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
17 | self.queue = LifoQueue()
18 |
19 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
20 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
21 | self.subs = 0
22 |
23 | self.name_color = literal_eval(config.get('Youtube', 'name_color',fallback="(255,255,255)"))
24 | self.sub_color = literal_eval(config.get('Youtube', 'sub_color',fallback="(255,255,255)"))
25 |
26 | yt_token = config.get("Youtube", "key", fallback=None)
27 | if yt_token is None:
28 | print("[Subcount] Youtube token is not specified in config")
29 | else:
30 | self.channel_id = config.get('Youtube', 'channel_id', fallback = None)
31 | if self.channel_id is None:
32 | print("[Subcount] Youtube channel id is not specified in config")
33 | else:
34 | self.display_name = config.get('Youtube', 'display_name', fallback=self.channel_id)
35 | threading.Thread(target=fetchYoutubeSubsAsync, args=(self.queue, yt_token, self.channel_id)).start()
36 |
37 | def generate(self, isHorizontal, inputStatus):
38 | if (not self.queue.empty()):
39 | self.subs = self.queue.get()
40 | self.queue.queue.clear()
41 |
42 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
43 | self.default_actions['toggle_display']()
44 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
45 | self.default_actions['switch_next_app']()
46 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
47 | self.default_actions['switch_prev_app']()
48 |
49 | frame = self.bg.copy()
50 | draw = ImageDraw.Draw(frame)
51 | if self.display_name == "bit of a ch.allen.ge":
52 | draw.text((0, 11), "BIT OF A", self.name_color, font=self.font)
53 | draw.text((0, 18), "CH.ALLEN.GE", self.name_color, font=self.font)
54 | else:
55 | draw.text((0, 18), self.display_name.upper(), self.name_color, font=self.font)
56 | draw.text((0, 25), self.subs + " SUBS", self.sub_color, font=self.font)
57 |
58 | return frame
59 |
60 | def fetchYoutubeSubsAsync(queue, key, channel_id):
61 | while True:
62 | data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&id="+channel_id+"&key="+key).read()
63 | subs = json.loads(data)["items"][0]["statistics"]["subscriberCount"]
64 | queue.put(subs)
65 | time.sleep(60)
66 |
--------------------------------------------------------------------------------
/impl/apps_v2/stocks.py:
--------------------------------------------------------------------------------
1 | from PIL import Image, ImageFont, ImageDraw
2 | import numpy as np
3 | import yfinance as yf
4 | import time
5 | import threading
6 | from queue import LifoQueue
7 |
8 | white = (255,255,255)
9 | red = (255,0,0)
10 | green = (0,255,0)
11 | up_arrow = np.asarray([[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1]])
12 | down_arrow = np.asarray([[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]])
13 |
14 | class StocksVerticalScreen:
15 | def __init__(self, config, modules, default_actions):
16 | self.ticker_symbols = ['DOGE-USD', 'GME', 'AMC', 'TSM', 'AMD']
17 | self.tiny_font = ImageFont.truetype("fonts/tiny.otf", 5)
18 | self.bg = Image.open('apps_v2/res/tothemoon_darker.png').convert('RGB')
19 | self.queue = LifoQueue()
20 | self.thread = threading.Thread(target=generateFrameAsync,
21 | args=(self.queue, self.ticker_symbols, self.tiny_font, self.bg))
22 | self.thread.start()
23 | self.frame = self.bg.rotate(90, expand=True)
24 |
25 | def generate(self, isHorizontal, inputStatus):
26 | if not self.queue.empty():
27 | self.frame = self.queue.get()
28 | self.queue.queue.clear()
29 | return self.frame
30 |
31 | def get_price(symbol):
32 | ticker = yf.Ticker(symbol)
33 | week_data = ticker.history(period='5d')
34 | if (int(week_data['Close'][-1]) < 1.0):
35 | current = "{:.4f}".format(week_data['Close'][-1])
36 | last_close = "{:.4f}".format(week_data['Close'][-2])
37 | else:
38 | current = "{:.2f}".format(week_data['Close'][-1])
39 | last_close = "{:.2f}".format(week_data['Close'][-2])
40 | return (current, last_close)
41 |
42 | def generateLineArray(text, font):
43 | img = Image.new("RGB", (100,500), (0,0,0))
44 | draw = ImageDraw.Draw(img)
45 | draw.text((0,0), text, (255,255,255), font=font)
46 | img = img.crop(img.getbbox())
47 | return np.array(img)[:,:,0]/255
48 |
49 | def placeText(frame, x, y, color, text_arr, isLeftReference):
50 | arr_height = text_arr.shape[0]
51 | arr_width = text_arr.shape[1]
52 | values = np.ones((1, arr_height * arr_width), dtype='uint8')
53 | if (isLeftReference):
54 | np.putmask(frame[y:y+arr_height, x:x+arr_width, 0], text_arr.astype(bool), values * color[0])
55 | np.putmask(frame[y:y+arr_height, x:x+arr_width, 1], text_arr.astype(bool), values * color[1])
56 | np.putmask(frame[y:y+arr_height, x:x+arr_width, 2], text_arr.astype(bool), values * color[2])
57 | else:
58 | np.putmask(frame[y:y+arr_height, x-arr_width:x, 0], text_arr.astype(bool), values * color[0])
59 | np.putmask(frame[y:y+arr_height, x-arr_width:x, 1], text_arr.astype(bool), values * color[1])
60 | np.putmask(frame[y:y+arr_height, x-arr_width:x, 2], text_arr.astype(bool), values * color[2])
61 |
62 | def generateFrameAsync(queue, ticker_symbols, font, bg):
63 | while True:
64 | frame = np.copy(bg)
65 | for i in range(len(ticker_symbols)):
66 | symbol = ticker_symbols[i]
67 | (current, last_close) = get_price(symbol)
68 |
69 | stock_symbol_arr = generateLineArray(symbol.split("-")[0], font)
70 | stock_price_arr = generateLineArray(current, font)
71 | (arrow_color, arrow_arr) = (green, up_arrow) if float(current) - float(last_close) >= 0 else (red, down_arrow)
72 |
73 | placeText(frame, 0, 13*i, white, stock_symbol_arr, True)
74 | placeText(frame, 31, 6+13*i, white, stock_price_arr, False)
75 | placeText(frame, 25, 1+13*i, arrow_color, arrow_arr, True)
76 |
77 | frame = np.rot90(frame)
78 | queue.put(Image.fromarray(frame,'RGB'))
79 | time.sleep(5)
--------------------------------------------------------------------------------
/impl/modules/notification_module.py:
--------------------------------------------------------------------------------
1 | from threading import Thread
2 | from queue import Queue
3 | import websocket
4 | import json
5 | import time
6 | from functools import cmp_to_key
7 |
8 | class NotificationModule:
9 | def __init__(self, config):
10 | app_white_list = parseWhiteList(config.get('Notification Module', 'white_list', fallback=None))
11 | pushbullet_ws = config.get('Notification Module', 'pushbullet_ws', fallback=None)
12 |
13 | self.noti_list = []
14 | self.noti_queue = Queue()
15 | if pushbullet_ws is None or app_white_list is None or len(app_white_list) == 0:
16 | print("[Notification Module] pushbullet websocket url or app white list is not specified in config")
17 | else:
18 | Thread(target = startService, args=(self.noti_queue, pushbullet_ws, app_white_list,)).start()
19 |
20 | def getNotificationList(self):
21 | needToSort = False
22 | while not self.noti_queue.empty():
23 | new_noti = self.noti_queue.get()
24 | if new_noti.addToCount:
25 | found = False
26 | for noti in self.noti_list:
27 | if noti.noti_id == new_noti.noti_id:
28 | found = True
29 | if not found:
30 | needToSort = True
31 | self.noti_list.append(new_noti)
32 | else:
33 | for idx, noti in enumerate(self.noti_list):
34 | if noti.noti_id == new_noti.noti_id:
35 | self.noti_list.pop(idx)
36 | if needToSort:
37 | self.noti_list.sort(key=cmp_to_key(Notification.compare))
38 |
39 | return self.noti_list
40 |
41 | class Notification:
42 | def __init__(self, application, addToCount, noti_id, title, body, noti_time):
43 | self.application = application
44 | self.addToCount = addToCount
45 | self.noti_id = noti_id
46 | self.title = title
47 | self.body = body
48 | self.noti_time = noti_time
49 |
50 | def compare(noti1, noti2):
51 | if noti1.noti_time > noti2.noti_time:
52 | return -1
53 | elif noti1.noti_time < noti2.noti_time:
54 | return 1
55 | else:
56 | return 0
57 |
58 | def on_message(_, message, noti_queue, app_white_list):
59 | message = json.loads(message)
60 |
61 | if (message['type'] == 'push'):
62 | contents = message['push']
63 | if contents['package_name'] in app_white_list.keys():
64 | if contents['type'] == 'mirror':
65 | noti_queue.put(Notification(app_white_list[contents['package_name']], True,\
66 | int(contents['notification_id']), contents['title'], contents['body'], time.time()))
67 | elif contents['type'] == 'dismissal':
68 | noti_queue.put(Notification(app_white_list[contents['package_name']], False,\
69 | int(contents['notification_id']), '', '', time.time()))
70 |
71 | def on_error(_, error, noti_queue, pushbullet_ws, app_white_list):
72 | print(error)
73 | time.sleep(1000)
74 | startService(noti_queue, pushbullet_ws, app_white_list)
75 |
76 | def on_close(_):
77 | print("### websocket closed ###")
78 |
79 | def startService(noti_queue, pushbullet_ws, app_white_list):
80 | ws = websocket.WebSocketApp(pushbullet_ws,
81 | on_message = lambda ws, message : on_message(ws, message, noti_queue, app_white_list),
82 | on_error = lambda ws, error : on_error(ws, error, noti_queue, pushbullet_ws, app_white_list),
83 | on_close = on_close)
84 | ws.run_forever()
85 |
86 | def parseWhiteList(strList):
87 | if strList is None:
88 | return None
89 |
90 | result = {}
91 | pairs = strList.split(',')
92 | for pair in pairs:
93 | pkg, name = pair.split(':')
94 | result[pkg] = name
95 | return result
96 |
--------------------------------------------------------------------------------
/impl/apps_v2/life.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import random
3 | from InputStatus import InputStatusEnum
4 | from datetime import datetime, timedelta
5 | from PIL import Image, ImageSequence, ImageDraw
6 | import os
7 | from scipy.signal import convolve2d
8 |
9 | canvas_height = 32
10 | canvas_width = 64
11 |
12 | class GameOfLifeScreen:
13 | def __init__(self, config, modules, default_actions):
14 | self.modules = modules
15 | self.default_actions = default_actions
16 | self.color = (255,255,255)
17 | self.init_states = [generateRandomState,
18 | lambda : fetchPattern('apps_v2/res/life_patterns/centinal'),
19 | lambda : fetchPattern('apps_v2/res/life_patterns/achim_p144'),
20 | lambda : fetchPattern('apps_v2/res/life_patterns/pboj_p22')]
21 | self.curr_state_idx = 0
22 | self.state = self.init_states[self.curr_state_idx]()
23 |
24 | def generate(self, isHorizontal, inputStatus):
25 | if (inputStatus is InputStatusEnum.SINGLE_PRESS or inputStatus is InputStatusEnum.LONG_PRESS):
26 | if (inputStatus is InputStatusEnum.LONG_PRESS):
27 | self.curr_state_idx = (self.curr_state_idx + 1) % len(self.init_states)
28 | self.state = self.init_states[self.curr_state_idx]()
29 | self.color = generateNewColor()
30 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
31 | self.default_actions['switch_next_app']()
32 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
33 | self.default_actions['switch_prev_app']()
34 |
35 | end_time = datetime.now() + timedelta(seconds=0.1)
36 |
37 | old_state = self.state
38 | frame = Image.new("RGB", (canvas_width, canvas_height), (0,0,0)) #np.zeros((canvas_height, canvas_width, 3), dtype=int)
39 | draw = ImageDraw.Draw(frame)
40 |
41 | new_state = life_step_2(old_state)
42 | for i in range(canvas_height):
43 | for j in range(canvas_width):
44 | if new_state[i][j] == 1:
45 | draw.point((j,i), fill = self.color)
46 | #frame[i][j] = self.color
47 |
48 | self.state = new_state
49 |
50 | while datetime.now() < end_time:
51 | pass
52 |
53 | return frame
54 |
55 | def life_step_2(X):
56 | """Game of life step using scipy tools"""
57 | nbrs_count = convolve2d(X, np.ones((3, 3)), mode='same', boundary='wrap') - X
58 | return (nbrs_count == 3) | (X & (nbrs_count == 2))
59 |
60 | def getNumNeighbors(state, i, j):
61 | num_on = 0
62 | adjusted_i = i+1 if i+1 < canvas_height else 0
63 | adjusted_j = j+1 if j+1 < canvas_width else 0
64 |
65 | if state[i-1][j-1] == 1:
66 | num_on += 1
67 | if state[i-1][j] == 1:
68 | num_on += 1
69 | if state[i-1][adjusted_j] == 1:
70 | num_on += 1
71 | if state[i][j-1] == 1:
72 | num_on += 1
73 | if state[i][adjusted_j] == 1:
74 | num_on += 1
75 | if state[adjusted_i][j-1] == 1:
76 | num_on += 1
77 | if state[adjusted_i][j] == 1:
78 | num_on += 1
79 | if state[adjusted_i][adjusted_j] == 1:
80 | num_on += 1
81 | return num_on
82 |
83 | def generateRandomState():
84 | init_state = np.zeros((canvas_height, canvas_width), dtype=int)
85 | for i in range(canvas_height):
86 | for j in range(canvas_width):
87 | init_state[i][j] = random.randint(0,1)
88 | return init_state
89 |
90 | def generateNewColor():
91 | return (random.randint(50,255), random.randint(50,255), random.randint(50,255))
92 |
93 | def fetchPattern(fileLocation):
94 | if not os.path.exists(fileLocation + ".npy"):
95 | convertImage(fileLocation)
96 | return np.load(fileLocation + ".npy")
97 |
98 | def convertImage(location):
99 | image = Image.open(location + '.png')
100 | width, height = image.size
101 | image_array = np.array(image.convert("RGB"), dtype=int)
102 | np.save(location + '.npy', (image_array[0:height,0:width,0]//255).astype('int32'))
--------------------------------------------------------------------------------
/impl/apps_v2/weather.py:
--------------------------------------------------------------------------------
1 | from PIL import Image, ImageFont, ImageDraw
2 | import os
3 | import numpy as np
4 | import time
5 | from InputStatus import InputStatusEnum
6 | from datetime import datetime
7 | from dateutil import tz
8 | from ast import literal_eval
9 |
10 | class WeatherScreen:
11 | def __init__(self, config, modules, default_actions):
12 | self.modules = modules
13 | self.default_actions = default_actions
14 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
15 |
16 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
17 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
18 | self.icons = generateIconMap()
19 |
20 | self.text_color = literal_eval(config.get('Weather Screen', 'text_color', fallback="(255,255,255)"))
21 | self.low_color = literal_eval(config.get('Weather Screen', 'low_color', fallback="(255,255,255)"))
22 | self.high_color = literal_eval(config.get('Weather Screen', 'high_color', fallback="(255,255,255)"))
23 |
24 | def generate(self, isHorizontal, inputStatus):
25 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
26 | self.default_actions['toggle_display']()
27 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
28 | self.default_actions['switch_next_app']()
29 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
30 | self.default_actions['switch_prev_app']()
31 |
32 | frame = Image.new("RGB", (self.canvas_width, self.canvas_height), (0,0,0))
33 |
34 | weather_module = self.modules['weather']
35 | one_call = weather_module.getWeather()
36 |
37 | if one_call is not None:
38 | forecast = one_call.forecast_daily[0]
39 | rain = round(forecast.precipitation_probability*100)
40 | temps = forecast.temperature('fahrenheit')
41 | min_temp = round(temps['min'])
42 | max_temp = round(temps['max'])
43 | curr_temp = round(one_call.current.temperature('fahrenheit')['temp'])
44 | humidity = round(one_call.current.humidity)
45 | sunrise_timestamp = one_call.forecast_daily[0].sunrise_time()
46 | sunset_timestamp = one_call.forecast_daily[0].sunset_time()
47 | dtsr = datetime.fromtimestamp(sunrise_timestamp, tz=tz.tzlocal())
48 | dtss = datetime.fromtimestamp(sunset_timestamp, tz=tz.tzlocal())
49 | weather_icon_name = one_call.current.weather_icon_name
50 |
51 | draw = ImageDraw.Draw(frame)
52 | draw.text((3,3), str(min_temp), self.low_color, font=self.font)
53 | draw.text((13,3), str(curr_temp), self.text_color, font=self.font)
54 | draw.text((23,3), str(max_temp), self.high_color, font=self.font)
55 |
56 | draw.text((3,10), 'RAIN', self.text_color, font=self.font)
57 | draw.text((21,10), str(rain) + '%', self.text_color, font=self.font)
58 |
59 | draw.text((3,24), 'HUMIDITY', self.text_color, font=self.font)
60 | draw.text((37,24), str(humidity) + '%', self.text_color, font=self.font)
61 |
62 | currentTime = datetime.now(tz=tz.tzlocal())
63 | if (currentTime.hour > dtsr.hour and currentTime.hour <= dtss.hour):
64 | draw.text((3,17), 'SET', self.text_color, font=self.font)
65 | hours = dtss.hour % 12
66 | if (hours == 0):
67 | hours += 12
68 | draw.text((17,17), str(hours) + ':' + convertToTwoDigits(dtss.minute), self.text_color, font=self.font)
69 | else:
70 | draw.text((3,17), 'RISE', self.text_color, font=self.font)
71 | hours = dtsr.hour % 12
72 | if (hours == 0):
73 | hours += 12
74 | draw.text((21,17), str(hours) + ':' + convertToTwoDigits(dtsr.minute), self.text_color, font=self.font)
75 |
76 | if weather_icon_name in self.icons:
77 | frame.paste(self.icons[weather_icon_name], (40,1))
78 |
79 | return frame
80 |
81 | def generateIconMap():
82 | icon_map = dict()
83 | for _, _, files in os.walk("apps_v2/res/weather"):
84 | for file in files:
85 | if file.endswith('.png'):
86 | icon_map[file[:-4]] = Image.open('apps_v2/res/weather/' + file).convert("RGB")
87 | return icon_map
88 |
89 | def convertToTwoDigits(num):
90 | if num < 10:
91 | return '0' + str(num)
92 | return str(num)
--------------------------------------------------------------------------------
/impl/apps_v2/pomodoro.py:
--------------------------------------------------------------------------------
1 | from InputStatus import InputStatusEnum
2 | import time
3 | from datetime import timedelta, datetime
4 | from PIL import Image, ImageFont, ImageDraw
5 |
6 | class PomodoroScreen:
7 | def __init__(self, config, modules, default_actions):
8 | self.modules = modules
9 | self.default_actions = default_actions
10 |
11 | self.active = False
12 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
13 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
14 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
15 |
16 | self.work_duration = timedelta(minutes = 25)
17 | self.short_duration = timedelta(minutes = 5)
18 | self.long_duration = timedelta(minutes = 15)
19 | self.cycle_order = "WSWSWL"
20 | self.cycle_idx = 0
21 | self.status = ''
22 |
23 | self.time_left = None
24 | self.last_update_time = None
25 |
26 | def generate(self, isHorizontal, inputStatus):
27 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
28 | self.active = not self.active
29 | self.last_update_time = time.time()
30 | if self.active and self.time_left is None:
31 | status = self.cycle_order[self.cycle_idx]
32 | if status == 'W':
33 | self.status = "W"
34 | self.time_left = self.work_duration
35 | elif status == 'S':
36 | self.status = "S"
37 | self.time_left = self.short_duration
38 | elif status == 'L':
39 | self.status = "L"
40 | self.time_left = self.long_duration
41 | self.cycle_idx += 1
42 | if self.cycle_idx >= len(self.cycle_order):
43 | self.cycle_idx = 0
44 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
45 | self.default_actions['switch_next_app']()
46 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
47 | self.default_actions['switch_prev_app']()
48 |
49 | if self.active:
50 | self.time_left = self.time_left - timedelta(seconds = (time.time() - self.last_update_time))
51 | self.last_update_time = time.time()
52 |
53 | if self.time_left <= timedelta(seconds=0):
54 | print("time is up")
55 | self.active = False
56 | self.time_left = None
57 | self.last_update_time = None
58 |
59 | # if isHorizontal:
60 | # frame = Image.new("RGB", (self.canvas_width, self.canvas_height), (0,0,0))
61 | # draw = ImageDraw.Draw(frame)
62 |
63 | # if self.time_left is not None:
64 | # minutes, seconds = divmod(self.time_left.total_seconds(), 60)
65 | # time_str = str(int(round(minutes))) + "m " + str(int(round(seconds))) + "s"
66 | # draw.text((0,0), time_str, (255,255,255), font=self.font)
67 |
68 | # if self.status != '':
69 | # draw.text((0,7), self.status, (255,255,255), font=self.font)
70 | # else:
71 | # if self.status != '':
72 | # draw.text((0,7), self.status + " is Over", (255,255,255), font=self.font)
73 | # else:
74 | bg_color = (255,126,109)
75 | if self.status == "W":
76 | bg_color = (255,126,109)
77 | elif self.status == "S":
78 | bg_color = (142,202,255)
79 | elif self.status == "L":
80 | bg_color = (43,156,255)
81 |
82 | frame = Image.new("RGB", (self.canvas_height, self.canvas_width), bg_color)
83 | draw = ImageDraw.Draw(frame)
84 |
85 | if self.status != '':
86 | if self.status == "W":
87 | draw.text((1,7), 'Work', (255,255,255), font=self.font)
88 | elif self.status == "S":
89 | draw.text((1,7), 'Short', (255,255,255), font=self.font)
90 | draw.text((1,13), 'Break', (255,255,255), font=self.font)
91 | elif self.status == "L":
92 | draw.text((1,7), 'Long', (255,255,255), font=self.font)
93 | draw.text((1,13), 'Break', (255,255,255), font=self.font)
94 |
95 | if self.time_left is None:
96 | y_loc = 19
97 | if self.status == "W":
98 | y_loc = 13
99 | draw.text((1, y_loc), "Is Over", (255,255,255), font=self.font)
100 | else:
101 | minutes, seconds = divmod(self.time_left.total_seconds(), 60)
102 | time_str = str(int(round(minutes))) + "m " + str(int(round(seconds))) + "s"
103 | draw.text((1,1), time_str, (255,255,255), font=self.font)
104 | else:
105 | draw.text((0,10), "POMODORO", (255,255,255), font=self.font)
106 | draw.text((7,26), "PRESS", (255,255,255), font=self.font)
107 | draw.text((13,32), "TO", (255,255,255), font=self.font)
108 | draw.text((7,38), "START", (255,255,255), font=self.font)
109 |
110 | frame = frame.rotate(90, expand=True)
111 |
112 |
113 | return frame
114 |
115 |
116 |
--------------------------------------------------------------------------------
/impl/modules/spotify_module.py:
--------------------------------------------------------------------------------
1 | import spotipy
2 | import os
3 |
4 | class SpotifyModule:
5 | def __init__(self, config):
6 | self.invalid = False
7 |
8 | if config is not None and 'Spotify' in config and 'client_id' in config['Spotify'] \
9 | and 'client_secret' in config['Spotify'] and 'redirect_uri' in config['Spotify']:
10 |
11 | client_id = config['Spotify']['client_id']
12 | client_secret = config['Spotify']['client_secret']
13 | redirect_uri = config['Spotify']['redirect_uri']
14 | if client_id is not "" and client_secret is not "" and redirect_uri is not "":
15 | try:
16 | os.environ["SPOTIPY_CLIENT_ID"] = client_id
17 | os.environ["SPOTIPY_CLIENT_SECRET"] = client_secret
18 | os.environ["SPOTIPY_REDIRECT_URI"] = redirect_uri
19 |
20 | scope = "user-read-currently-playing, user-read-playback-state, user-modify-playback-state"
21 | self.auth_manager = spotipy.SpotifyOAuth(scope=scope)
22 | print(self.auth_manager.get_authorize_url())
23 | self.sp = spotipy.Spotify(auth_manager=self.auth_manager, requests_timeout=10)
24 | self.isPlaying = False
25 | except Exception as e:
26 | print(e)
27 | self.invalid = True
28 | else:
29 | print("[Spotify Module] Empty Spotify client id or secret")
30 | self.invalid = True
31 | else:
32 | print("[Spotify Module] Missing config parameters")
33 | self.invalid = True
34 |
35 | def isInvalid(self):
36 | return self.invalid
37 |
38 | def getCurrentPlayback(self):
39 | if self.invalid:
40 | return None
41 |
42 | try:
43 | track = self.sp.current_user_playing_track()
44 | if (track is not None):
45 | if (track['item'] is None):
46 | artist = None
47 | title = None
48 | art_url = None
49 | else:
50 | artist = track['item']['artists'][0]['name']
51 | if len(track['item']['artists']) >= 2:
52 | artist = artist + ", " + track['item']['artists'][1]['name']
53 | title = track['item']['name']
54 | art_url = track['item']['album']['images'][0]['url']
55 | self.isPlaying = track['is_playing']
56 | return (artist, title, art_url, self.isPlaying, track["progress_ms"], track["item"]["duration_ms"])
57 | else:
58 | return None
59 | except Exception as e:
60 | print(e)
61 | return None
62 |
63 | def resume_playback(self):
64 | if not self.invalid:
65 | try:
66 | self.sp.start_playback()
67 | except spotipy.exceptions.SpotifyException:
68 | print('no active, trying specific device')
69 | devices = self.sp.devices()
70 | if 'devices' in devices and len(devices['devices']) > 0:
71 | try:
72 | self.sp.start_playback(device_id = devices['devices'][0]['id'])
73 | except Exception as e:
74 | print(e)
75 | except Exception as e:
76 | print(e)
77 |
78 | def pause_playback(self):
79 | if not self.invalid:
80 | try:
81 | self.sp.pause_playback()
82 | except spotipy.exceptions.SpotifyException:
83 | print('problem pausing')
84 | except Exception as e:
85 | print(e)
86 |
87 | def next_track(self):
88 | if not self.invalid:
89 | try:
90 | self.sp.next_track()
91 | except spotipy.exceptions.SpotifyException:
92 | print('no active, trying specific device')
93 | devices = self.sp.devices()
94 | if 'devices' in devices and len(devices['devices']) > 0:
95 | self.sp.next_track(device_id = devices['devices'][0]['id'])
96 | except Exception as e:
97 | print(e)
98 |
99 | def previous_track(self):
100 | if not self.invalid:
101 | try:
102 | self.sp.previous_track()
103 | except spotipy.exceptions.SpotifyException:
104 | print('no active, trying specific device')
105 | devices = self.sp.devices()
106 | if 'devices' in devices and len(devices['devices']) > 0:
107 | self.sp.previous_track(device_id = devices['devices'][0]['id'])
108 | except Exception as e:
109 | print(e)
110 |
111 | def increase_volume(self):
112 | if not self.invalid and self.isPlaying:
113 | try:
114 | devices = self.sp.devices()
115 | curr_volume = devices['devices'][0]['volume_percent']
116 | self.sp.volume(min(100, curr_volume + 5))
117 | except Exception as e:
118 | print(e)
119 |
120 | def decrease_volume(self):
121 | if not self.invalid and self.isPlaying:
122 | try:
123 | devices = self.sp.devices()
124 | curr_volume = devices['devices'][0]['volume_percent']
125 | self.sp.volume(max(0, curr_volume - 5))
126 | except Exception as e:
127 | print(e)
--------------------------------------------------------------------------------
/impl/apps_v2/spotify_player.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | from PIL import Image, ImageFont, ImageDraw
3 | import requests
4 | from io import BytesIO
5 | from InputStatus import InputStatusEnum
6 | from ast import literal_eval
7 |
8 | class SpotifyScreen:
9 | def __init__(self, config, modules, default_actions):
10 | self.modules = modules
11 | self.default_actions = default_actions
12 |
13 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
14 |
15 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
16 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
17 | self.title_color = literal_eval(config.get('Spotify Player', 'title_color',fallback="(255,255,255)"))
18 | self.artist_color = literal_eval(config.get('Spotify Player', 'artist_color',fallback="(255,255,255)"))
19 | self.play_color = literal_eval(config.get('Spotify Player', 'play_color',fallback="(255,255,255)"))
20 |
21 | self.current_art_url = ''
22 | self.current_art_img = None
23 | self.current_title = ''
24 | self.current_artist = ''
25 |
26 | self.title_animation_cnt = 0
27 | self.artist_animation_cnt = 0
28 |
29 | self.is_playing = False
30 | self.control_mode = False
31 |
32 | def generate(self, isHorizontal, inputStatus):
33 | if (inputStatus is InputStatusEnum.LONG_PRESS):
34 | self.control_mode = not self.control_mode
35 |
36 | spotify_module = self.modules['spotify']
37 |
38 | if not self.control_mode:
39 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
40 | self.default_actions['toggle_display']()
41 | self.title_animation_cnt = 0
42 | self.artist_animation_cnt = 0
43 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
44 | self.default_actions['switch_next_app']()
45 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
46 | self.default_actions['switch_prev_app']()
47 | else:
48 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
49 | if self.is_playing:
50 | spotify_module.pause_playback()
51 | else:
52 | spotify_module.resume_playback()
53 | elif (inputStatus is InputStatusEnum.DOUBLE_PRESS):
54 | spotify_module.next_track()
55 | elif (inputStatus is InputStatusEnum.TRIPLE_PRESS):
56 | spotify_module.previous_track()
57 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE and self.is_playing):
58 | spotify_module.increase_volume()
59 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE and self.is_playing):
60 | spotify_module.decrease_volume()
61 |
62 | response = spotify_module.getCurrentPlayback()
63 | if response is not None:
64 | (artist,title,art_url,self.is_playing, progress_ms, duration_ms) = response
65 |
66 | if (self.current_title != title or self.current_artist != artist):
67 | self.current_artist = artist
68 | self.current_title = title
69 | self.title_animation_cnt = 0
70 | self.artist_animation_cnt = 0
71 | if self.current_art_url != art_url:
72 | self.current_art_url = art_url
73 |
74 | response = requests.get(self.current_art_url)
75 | img = Image.open(BytesIO(response.content))
76 | self.current_art_img = img.resize((self.canvas_height, self.canvas_height), resample=Image.LANCZOS)
77 |
78 | frame = Image.new("RGB", (self.canvas_width, self.canvas_height), (0,0,0))
79 | draw = ImageDraw.Draw(frame)
80 |
81 | draw.line((38,15,58,15), fill=(100,100,100))
82 | draw.line((38,15,38+round(((progress_ms / duration_ms) * 100) // 5),15), fill=(180,180,180))
83 |
84 | title_len = self.font.getsize(self.current_title)[0]
85 | if title_len > 31:
86 | spacer = " "
87 | draw.text((34-self.title_animation_cnt, 0), self.current_title + spacer + self.current_title, self.title_color, font = self.font)
88 | self.title_animation_cnt += 1
89 | if self.title_animation_cnt == self.font.getsize(self.current_title + spacer)[0]:
90 | self.title_animation_cnt = 0
91 | else:
92 | draw.text((34-self.title_animation_cnt, 0), self.current_title, self.title_color, font = self.font)
93 |
94 | artist_len = self.font.getsize(self.current_artist)[0]
95 | if artist_len > 31:
96 | spacer = " "
97 | draw.text((34-self.artist_animation_cnt, 7), self.current_artist + spacer + self.current_artist, self.artist_color, font = self.font)
98 | self.artist_animation_cnt += 1
99 | if self.artist_animation_cnt == self.font.getsize(self.current_artist + spacer)[0]:
100 | self.artist_animation_cnt = 0
101 | else:
102 | draw.text((34-self.artist_animation_cnt, 7), self.current_artist, self.artist_color, font = self.font)
103 |
104 | draw.rectangle((32,0,33,32), fill=(0,0,0))
105 |
106 | if self.current_art_img is not None:
107 | frame.paste(self.current_art_img, (0,0))
108 |
109 | drawPlayPause(draw, self.control_mode, self.is_playing, self.play_color)
110 |
111 | return frame
112 | else:
113 | #not active
114 | frame = Image.new("RGB", (self.canvas_width, self.canvas_height), (0,0,0))
115 | draw = ImageDraw.Draw(frame)
116 | self.current_art_url = ''
117 | self.is_playing = False
118 | drawPlayPause(draw, self.control_mode, self.is_playing, self.play_color)
119 | draw.text((0,3), "No Devices", self.title_color, font = self.font)
120 | draw.text((0,10), "Currently Active", self.title_color, font = self.font)
121 |
122 | return frame
123 |
124 | def drawPlayPause(draw, control_mode, is_playing, color):
125 | if control_mode:
126 | if not is_playing:
127 | draw.line((45,19,45,25), fill = color)
128 | draw.line((46,20,46,24), fill = color)
129 | draw.line((47,20,47,24), fill = color)
130 | draw.line((48,21,48,23), fill = color)
131 | draw.line((49,21,49,23), fill = color)
132 | draw.line((50,22,50,22), fill = color)
133 | else:
134 | draw.line((45,19,45,25), fill = color)
135 | draw.line((46,19,46,25), fill = color)
136 | draw.line((49,19,49,25), fill = color)
137 | draw.line((50,19,50,25), fill = color)
138 |
139 |
--------------------------------------------------------------------------------
/impl/controller_v3.py:
--------------------------------------------------------------------------------
1 | import queue
2 | import math, sys, os, time, copy, inspect
3 | from InputStatus import InputStatusEnum
4 | try:
5 | from gpiozero import Button, RotaryEncoder
6 | except:
7 | class Button:
8 | def __init__(self, num, pull_up=False):
9 | self.num = num
10 | self.pull_up = pull_up
11 | self.when_pressed = lambda : None
12 | self.when_pressed = lambda : None
13 | class RotaryEncoder:
14 | def __init__(self, encoding1, encoding2):
15 | self.encoding1 = encoding1
16 | self.encoding2 = encoding2
17 | self.when_rotated_clockwise = lambda : None
18 | self.when_rotated_counter_clockwise = lambda : None
19 | import configparser
20 | from PIL import Image
21 |
22 | import select
23 |
24 | from apps_v2 import main_screen, notion_v2, subcount, gif_viewer, weather, life, spotify_player
25 | from modules import weather_module, notification_module, spotify_module
26 |
27 | sw = 13
28 | enc_A = 5
29 | enc_B = 6
30 | tilt = 19
31 |
32 | def main():
33 | brightness = 100
34 | displayOn = True
35 |
36 | config = configparser.ConfigParser()
37 | parsed_configs = config.read('../config.ini')
38 | if len(parsed_configs) == 0:
39 | print("no config file found")
40 | sys.exit()
41 |
42 | canvas_width = config.getint('System', 'canvas_width', fallback=64)
43 | canvas_height = config.getint('System', 'canvas_height', fallback=32)
44 |
45 | black_screen = Image.new("RGB", (canvas_width, canvas_height), (0,0,0))
46 |
47 | encButton = Button(sw, pull_up = True)
48 | inputStatusDict = {"value" : InputStatusEnum.NOTHING}
49 | encButton.when_pressed = lambda button : encButtonFunc(button, inputStatusDict)
50 |
51 | encoderQueue = queue.Queue()
52 | encoder = RotaryEncoder(enc_A, enc_B)
53 | encoder.when_rotated_clockwise = lambda enc : rotate_clockwise(enc, encoderQueue)
54 | encoder.when_rotated_counter_clockwise = lambda enc : rotate_counter_clockwise(enc, encoderQueue)
55 | encoder_state = 0
56 |
57 | tilt_switch = Button(tilt, pull_up = True)
58 | isHorizontalDict = {'value': True}
59 | tilt_switch.when_pressed = lambda button : tilt_callback(button, isHorizontalDict)
60 | tilt_switch.when_released = lambda button : tilt_callback(button, isHorizontalDict)
61 |
62 | def toggle_display():
63 | nonlocal displayOn
64 | displayOn = not displayOn
65 | print("Display On: " + str(displayOn))
66 |
67 | def increase_brightness():
68 | nonlocal brightness
69 | brightness = min(100, brightness + 5)
70 |
71 | def decrease_brightness():
72 | nonlocal brightness
73 | brightness = max(0, brightness - 5)
74 |
75 | current_app_idx = 0
76 | def switch_next_app():
77 | nonlocal current_app_idx
78 | current_app_idx += 1
79 |
80 | def switch_prev_app():
81 | nonlocal current_app_idx
82 | current_app_idx -= 1
83 |
84 | callbacks = {
85 | 'toggle_display' : toggle_display,
86 | 'increase_brightness' : increase_brightness,
87 | 'decrease_brightness' : decrease_brightness,
88 | 'switch_next_app' : switch_next_app,
89 | 'switch_prev_app' : switch_prev_app
90 | }
91 |
92 | modules = {
93 | 'weather' : weather_module.WeatherModule(config),
94 | 'notifications' : notification_module.NotificationModule(config),
95 | 'spotify' : spotify_module.SpotifyModule(config)
96 | }
97 |
98 | app_list = [main_screen.MainScreen(config, modules, callbacks),
99 | # notion_v2.NotionScreen(config, modules, callbacks),
100 | # weather.WeatherScreen(config, modules, callbacks),
101 | # subcount.SubcountScreen(config, modules, callbacks),
102 | gif_viewer.GifScreen(config, modules, callbacks),
103 | life.GameOfLifeScreen(config, modules, callbacks)]
104 |
105 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
106 | parentdir = os.path.dirname(currentdir)
107 | sys.path.append(parentdir+"/rpi-rgb-led-matrix/bindings/python")
108 | try:
109 | from rgbmatrix import RGBMatrix, RGBMatrixOptions
110 | except ImportError:
111 | from RGBMatrixEmulator import RGBMatrix, RGBMatrixOptions
112 |
113 | options = RGBMatrixOptions()
114 | options.rows = 32
115 | options.cols = 64
116 | options.chain_length = 1
117 | options.parallel = 1
118 | options.brightness = brightness
119 | options.pixel_mapper_config = "U-mapper;Rotate:180"
120 | options.gpio_slowdown = 1
121 | options.pwm_lsb_nanoseconds = 80
122 | options.limit_refresh_rate_hz = 150
123 | options.hardware_mapping = 'regular' # If you have an Adafruit HAT: 'adafruit-hat'
124 | options.drop_privileges = False
125 | matrix = RGBMatrix(options = options)
126 |
127 | rotation_time = math.floor(time.time())
128 | while(True):
129 | while (not encoderQueue.empty()):
130 | encoder_state += encoderQueue.get()
131 | if (encoder_state > 1):
132 | print("encoder increased")
133 | inputStatusDict['value'] = InputStatusEnum.ENCODER_INCREASE
134 | encoder_state = 0
135 | elif (encoder_state < -1):
136 | print("encoder decreased")
137 | inputStatusDict['value'] = InputStatusEnum.ENCODER_DECREASE
138 | encoder_state = 0
139 |
140 | inputStatusSnapshot = copy.copy(inputStatusDict['value'])
141 | inputStatusDict['value'] = InputStatusEnum.NOTHING
142 |
143 | isHorizontalSnapshot = copy.copy(isHorizontalDict['value'])
144 |
145 | new_rotation_time = math.floor(time.time())
146 | if new_rotation_time % 10 == 0 and new_rotation_time - rotation_time >= 10:
147 | current_app_idx += 1
148 | rotation_time = new_rotation_time
149 |
150 | frame = app_list[current_app_idx % len(app_list)].generate(isHorizontalSnapshot, inputStatusSnapshot)
151 | if not displayOn:
152 | frame = black_screen
153 |
154 | #matrix.brightness = 100
155 | matrix.SetImage(frame)
156 | time.sleep(0.05)
157 |
158 | def encButtonFunc(enc_button, inputStatusDict):
159 | start_time = time.time()
160 | time_diff = 0
161 | hold_time = 1
162 |
163 | while enc_button.is_active and (time_diff < hold_time):
164 | time_diff = time.time() - start_time
165 |
166 | if (time_diff >= hold_time):
167 | print("long press detected")
168 | inputStatusDict['value'] = InputStatusEnum.LONG_PRESS
169 | else:
170 | enc_button.when_pressed = None
171 | start_time = time.time()
172 | while (time.time() - start_time <= 0.3):
173 | time.sleep(0.1)
174 | if (enc_button.is_pressed):
175 | time.sleep(0.1)
176 | new_start_time = time.time()
177 | while (time.time() - new_start_time <= 0.3):
178 | time.sleep(0.1)
179 | if (enc_button.is_pressed):
180 | print("triple press detected")
181 | inputStatusDict['value'] = InputStatusEnum.TRIPLE_PRESS
182 | enc_button.when_pressed = lambda button : encButtonFunc(button, inputStatusDict)
183 | return
184 | print("double press detected")
185 | inputStatusDict['value'] = InputStatusEnum.DOUBLE_PRESS
186 | enc_button.when_pressed = lambda button : encButtonFunc(button, inputStatusDict)
187 | return
188 | print("single press detected")
189 | inputStatusDict['value'] = InputStatusEnum.SINGLE_PRESS
190 | enc_button.when_pressed = lambda button : encButtonFunc(button, inputStatusDict)
191 | return
192 |
193 | def rotate_clockwise(encoder, encoderQueue):
194 | encoderQueue.put(1)
195 | encoder.value = 0
196 |
197 | def rotate_counter_clockwise(encoder, encoderQueue):
198 | encoderQueue.put(-1)
199 | encoder.value = 0
200 |
201 | def tilt_callback(tilt_switch, isHorizontalDict):
202 | startTime = time.time()
203 | while (time.time() - startTime < 0.25):
204 | pass
205 | isHorizontalDict['value'] = tilt_switch.is_pressed
206 |
207 | def reduceFrameToString(frame):
208 | res = frame.flatten()
209 | return ' '.join(map(str, res))
210 |
211 | if __name__ == '__main__':
212 | try:
213 | main()
214 | except KeyboardInterrupt:
215 | print('Interrupted with Ctrl-C')
216 | sys.exit(0)
217 |
--------------------------------------------------------------------------------
/impl/apps_v2/notion_v2.py:
--------------------------------------------------------------------------------
1 | import time
2 | from PIL import Image, ImageFont, ImageDraw
3 | import threading
4 | from queue import LifoQueue
5 | from InputStatus import InputStatusEnum
6 | import requests, json
7 | from datetime import date
8 | from datetime import timedelta
9 | from ast import literal_eval
10 |
11 | class NotionScreen:
12 | def __init__(self, config, modules, default_actions):
13 | self.modules = modules
14 | self.default_actions = default_actions
15 |
16 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
17 | self.queue = LifoQueue()
18 | self.tasks = None
19 | self.animation_cnt = [0,0,0,0,0]
20 |
21 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
22 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
23 |
24 | notion_token = config.get('Notion', 'token', fallback=None)
25 | notion_database_id = config.get('Notion', 'database_id', fallback=None)
26 |
27 | self.text_color = literal_eval(config.get('Notion', 'text_color',fallback="(255,255,255)"))
28 | self.todo_color = literal_eval(config.get('Notion', 'todo_color',fallback="(255,100,140)"))
29 | self.doing_color = literal_eval(config.get('Notion', 'doing_color',fallback="(255,202,0)"))
30 |
31 | self.paused = False
32 |
33 | if notion_token is None or notion_database_id is None:
34 | print("[Notion] Notion token and/or databaseID is not specified in config")
35 | else:
36 | threading.Thread(target=fetchNotionAsync, args=(self.queue, notion_token, notion_database_id)).start()
37 |
38 | def generate(self, isHorizontal, inputStatus):
39 | while not self.queue.empty():
40 | new_tasks = self.queue.get()
41 | if (self.tasks != new_tasks):
42 | self.tasks = new_tasks
43 | self.queue.queue.clear()
44 | self.animation_cnt = [0,0,0,0,0,0,0,0,0,0]
45 |
46 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
47 | self.paused = not self.paused
48 | self.animation_cnt = [0,0,0,0,0,0,0,0,0,0]
49 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
50 | self.default_actions['switch_next_app']()
51 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
52 | self.default_actions['switch_prev_app']()
53 |
54 | frame = None
55 | if isHorizontal:
56 | frame = Image.new("RGB", (self.canvas_width, self.canvas_height), (0,0,0))
57 | draw = ImageDraw.Draw(frame)
58 |
59 | if self.tasks is None or len(self.tasks) == 0:
60 | draw.text((0, 0), "NO TASKS YET.", self.text_color, font = self.font)
61 | else:
62 | for i in range(len(self.tasks[0:5])):
63 | task_desc = self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper()
64 | task_desc_len = self.font.getsize(self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper())[0]
65 |
66 | if task_desc_len >= self.canvas_width - 3:
67 | spacer = " "
68 | draw.text((3-self.animation_cnt[i], 6*i), task_desc + spacer + task_desc, self.text_color, font=self.font)
69 | if not self.paused:
70 | self.animation_cnt[i] += 1
71 | if self.animation_cnt[i] == self.font.getsize(self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper() + spacer)[0]:
72 | self.animation_cnt[i] = 0
73 | else:
74 | draw.text((3, 6*i), task_desc, self.text_color, font=self.font)
75 |
76 | task_status = self.tasks[i]["properties"]["Status"]["select"]["name"]
77 | if task_status == 'To Do':
78 | status_color = self.todo_color
79 | elif task_status == 'Doing':
80 | status_color = self.doing_color
81 | else:
82 | status_color = (0,0,0)
83 |
84 | draw.rectangle((0, 6*i, 1, 6*i+4), fill=status_color)
85 | draw.rectangle((2, 6*i, 2, 6*i+4), fill=(0,0,0))
86 | else:
87 | frame = Image.new("RGB", (self.canvas_height, self.canvas_width), (0,0,0))
88 | draw = ImageDraw.Draw(frame)
89 |
90 | if self.tasks is None or len(self.tasks) == 0:
91 | draw.text((0, 26), "NO TASKS", self.text_color, font = self.font)
92 | else:
93 | for i in range(len(self.tasks[0:9])):
94 | task_desc = self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper()
95 | task_desc_len = self.font.getsize(self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper())[0]
96 |
97 | if task_desc_len >= self.canvas_height - 3:
98 | spacer = " "
99 | draw.text((3-self.animation_cnt[i], 6*i), task_desc + spacer + task_desc, self.text_color, font=self.font)
100 | if not self.paused:
101 | self.animation_cnt[i] += 1
102 | if self.animation_cnt[i] == self.font.getsize(self.tasks[i]["properties"]["Name"]["title"][0]["plain_text"].upper() + spacer)[0]:
103 | self.animation_cnt[i] = 0
104 | else:
105 | draw.text((3, 6*i), task_desc, self.text_color, font=self.font)
106 |
107 | task_status = self.tasks[i]["properties"]["Status"]["select"]["name"]
108 | if task_status == 'To Do':
109 | status_color = self.todo_color
110 | elif task_status == 'Doing':
111 | status_color = self.doing_color
112 | else:
113 | status_color = (0,0,0)
114 |
115 | draw.rectangle((0, 6*i, 1, 6*i+4), fill=status_color)
116 | draw.rectangle((2, 6*i, 2, 6*i+4), fill=(0,0,0))
117 |
118 | frame = frame.rotate(angle=90, expand=True)
119 | return frame
120 |
121 |
122 | def fetchNotionAsync(queue, token, databaseID):
123 | headers = {
124 | "Authorization" : "Bearer " + token,
125 | "Notion-Version" : "2021-08-16",
126 | "Content-Type" : "application/json"
127 | }
128 | queryURL = f"https://api.notion.com/v1/databases/{databaseID}/query"
129 |
130 | while True:
131 | yesterday = date.today() - timedelta(days=1)
132 | week_from_now = date.today() + timedelta(days=7)
133 |
134 | query_params = {
135 | "sorts" : [
136 | {
137 | "property" : "Date Due",
138 | "timestamp" : "created_time",
139 | "direction" : "ascending"
140 | },
141 | ],
142 | "filter" : {
143 | "or" : [
144 | {
145 | "and" : [
146 | {
147 | "property" : "Date Due",
148 | "date" : {
149 | "on_or_before" : week_from_now.isoformat()
150 | }
151 | },
152 | {
153 | "property" : "Status",
154 | "select" : {
155 | "equals" : "Doing"
156 | }
157 | }
158 | ]
159 | },
160 | {
161 | "and" : [
162 | {
163 | "property" : "Date Due",
164 | "date" : {
165 | "on_or_before" : week_from_now.isoformat()
166 | }
167 | },
168 | {
169 | "property" : "Status",
170 | "select" : {
171 | "equals" : "To Do"
172 | }
173 | }
174 | ]
175 | },
176 | {
177 | "property" : "Status",
178 | "select" : {
179 | "equals" : "Unassigned"
180 | }
181 | },
182 | {
183 | "property" : "Date Due",
184 | "date" : {
185 | "on_or_after" : yesterday.isoformat()
186 | }
187 | }
188 | ]
189 | }
190 | }
191 |
192 | res = requests.request("POST", queryURL, headers=headers, data = json.dumps(query_params))
193 | if res.status_code is not 200:
194 | print("[Notion] Status Returned is " + str(res.status_code))
195 | print(res.json())
196 | else:
197 | tasks = res.json()["results"]
198 | queue.put(tasks)
199 | time.sleep(30)
200 |
201 |
--------------------------------------------------------------------------------
/impl/apps_v2/main_screen.py:
--------------------------------------------------------------------------------
1 | from InputStatus import InputStatusEnum
2 | from PIL import Image, ImageFont, ImageDraw
3 | from datetime import datetime
4 | from dateutil import tz
5 | import time
6 | import threading
7 |
8 | from apps_v2 import pomodoro
9 |
10 | light_pink = (255,219,218)
11 | dark_pink = (219,127,142)
12 | white = (230,255,255)
13 |
14 | salmon = (255,150,162)
15 | tan = (255,205,178)
16 | orange_tinted_white = (248,237,235)
17 |
18 | washed_out_navy = (109,104,117)
19 |
20 | discordColor = (150,170,255)
21 | messengerColor = (60, 220, 255)
22 | snapchatColor = (255, 252, 0)
23 | smsColor = (110, 255, 140)
24 |
25 | spotify_color = (0,255,0)
26 |
27 | class MainScreen:
28 | def __init__(self, config, modules, default_actions):
29 | self.font = ImageFont.truetype("fonts/tiny.otf", 5)
30 | self.modules = modules
31 | self.default_actions = default_actions
32 |
33 | self.canvas_width = config.getint('System', 'canvas_width', fallback=64)
34 | self.canvas_height = config.getint('System', 'canvas_height', fallback=32)
35 | self.cycle_time = config.getint('Main Screen', 'cycle_time', fallback=20)
36 | self.use_24_hour = config.getboolean('Main Screen', 'use_24_hour', fallback=False)
37 |
38 | self.vertical = pomodoro.PomodoroScreen(config, modules, default_actions)
39 |
40 | self.lastGenerateCall = None
41 | self.on_cycle = True
42 |
43 | self.bgs = {'sakura' : Image.open('apps_v2/res/main_screen/sakura-bg.png').convert("RGB"),
44 | 'cloud' : Image.open('apps_v2/res/main_screen/cloud-bg-clear.png').convert("RGBA"),
45 | 'forest' : Image.open('apps_v2/res/main_screen/forest-bg.png').convert("RGB")}
46 | self.theme_list = [self.generateSakura, self.generateCloud, self.generateForest]
47 |
48 | self.currentIdx = 0
49 | self.selectMode = False
50 |
51 | self.old_noti_list = []
52 | self.queued_frames = []
53 |
54 | def generate(self, isHorizontal, inputStatus):
55 | if not isHorizontal:
56 | return self.vertical.generate(isHorizontal, inputStatus)
57 |
58 | if (inputStatus == InputStatusEnum.LONG_PRESS):
59 | self.selectMode = not self.selectMode
60 |
61 | if self.selectMode:
62 | if (inputStatus is InputStatusEnum.ENCODER_INCREASE):
63 | self.currentIdx += 1
64 | self.queued_frames = []
65 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
66 | self.currentIdx -= 1
67 | self.queued_frames = []
68 | else:
69 | if (inputStatus is InputStatusEnum.SINGLE_PRESS):
70 | self.default_actions['toggle_display']()
71 | elif (inputStatus is InputStatusEnum.ENCODER_INCREASE):
72 | self.default_actions['switch_next_app']()
73 | elif (inputStatus is InputStatusEnum.ENCODER_DECREASE):
74 | self.default_actions['switch_prev_app']()
75 |
76 | if (self.lastGenerateCall == None):
77 | self.lastGenerateCall = time.time()
78 | if (time.time() - self.lastGenerateCall >= self.cycle_time):
79 | self.on_cycle = not self.on_cycle
80 | self.lastGenerateCall = time.time()
81 |
82 | frame = self.theme_list[self.currentIdx % len(self.theme_list)]()
83 |
84 | if (self.selectMode):
85 | draw = ImageDraw.Draw(frame)
86 | draw.rectangle((0,0,self.canvas_width-1,self.canvas_height-1), outline=white)
87 |
88 | return frame
89 |
90 | def generateSakura(self):
91 | currentTime = datetime.now(tz=tz.tzlocal())
92 | month = currentTime.month
93 | day = currentTime.day
94 | dayOfWeek = currentTime.weekday() + 1
95 | hours = currentTime.hour
96 | if not self.use_24_hour:
97 | hours = hours % 12
98 | if (hours == 0):
99 | hours += 12
100 | minutes = currentTime.minute
101 |
102 | frame = self.bgs['sakura'].copy()
103 | draw = ImageDraw.Draw(frame)
104 |
105 | draw.text((3, 6), padToTwoDigit(hours), light_pink, font=self.font)
106 | draw.text((10, 6), ":", light_pink, font=self.font)
107 | draw.text((13, 6), padToTwoDigit(minutes), light_pink, font=self.font)
108 |
109 | if (self.on_cycle):
110 | #date
111 | draw.text((23, 6), padToTwoDigit(month), dark_pink, font=self.font)
112 | draw.text((30, 6), ".", dark_pink, font=self.font)
113 | draw.text((33, 6), padToTwoDigit(day), dark_pink, font=self.font)
114 | else:
115 | #dayOfWeek
116 | draw.text((23, 6), padToTwoDigit(dayOfWeek), dark_pink, font=self.font)
117 | #weather
118 | weather = self.modules['weather']
119 | one_call = weather.getWeather()
120 | if (one_call != None):
121 | curr_temp = round(one_call.current.temperature('fahrenheit')['temp'])
122 | draw.text((33, 6), padToTwoDigit(curr_temp), white, font=self.font)
123 | draw.point((41,6), fill=white)
124 |
125 | #notifications
126 | noti_list = self.modules['notifications'].getNotificationList()
127 | counts = countList(noti_list)
128 |
129 | if (counts['Discord'] > 0):
130 | draw.rectangle((37,26,38,27), fill=discordColor)
131 | if (counts['SMS'] > 0):
132 | draw.rectangle((34,26,35,27), fill=smsColor)
133 | if (counts['Snapchat'] > 0):
134 | draw.rectangle((34,29,35,30), fill=snapchatColor)
135 | if (counts['Messenger'] > 0):
136 | draw.rectangle((37,29,38,30), fill=messengerColor)
137 |
138 | self.old_noti_list = noti_list
139 |
140 | return frame
141 |
142 | def generateCloud(self):
143 | currentTime = datetime.now(tz=tz.tzlocal())
144 | month = currentTime.month
145 | day = currentTime.day
146 | hours = currentTime.hour
147 | if not self.use_24_hour:
148 | hours = hours % 12
149 | if (hours == 0):
150 | hours += 12
151 | minutes = currentTime.minute
152 | seconds = currentTime.second
153 |
154 | noti_list = self.modules['notifications'].getNotificationList()
155 |
156 | threading.Thread(target=generateNotiFramesAsync,
157 | args=(self.queued_frames, noti_list, self.old_noti_list.copy(), self.font, self.canvas_width, self.canvas_height)).start()
158 |
159 | self.old_noti_list = noti_list.copy()
160 |
161 | if len(self.queued_frames) == 0:
162 | frame = Image.new('RGBA',(self.canvas_width, self.canvas_height),washed_out_navy)
163 | else:
164 | frame = self.queued_frames.pop(0)
165 | draw = ImageDraw.Draw(frame)
166 |
167 | frame.paste(self.bgs['cloud'], (0,0), self.bgs['cloud'])
168 |
169 | time_x_off = 2
170 | time_y_off = 25
171 | draw.text((time_x_off, time_y_off), padToTwoDigit(hours), orange_tinted_white, font=self.font)
172 | draw.text((time_x_off+7, time_y_off), ":", orange_tinted_white, font=self.font)
173 | draw.text((time_x_off+10, time_y_off), padToTwoDigit(minutes), orange_tinted_white, font=self.font)
174 | draw.text((time_x_off+17, time_y_off), ":", orange_tinted_white, font=self.font)
175 | draw.text((time_x_off+20, time_y_off), padToTwoDigit(seconds), orange_tinted_white, font=self.font)
176 |
177 | date_x_off = 45
178 | date_y_off = 25
179 | draw.text((date_x_off, date_y_off), padToTwoDigit(month), orange_tinted_white, font=self.font)
180 | draw.text((date_x_off+7, date_y_off), ".", orange_tinted_white, font=self.font)
181 | draw.text((date_x_off+10, date_y_off), padToTwoDigit(day), orange_tinted_white, font=self.font)
182 |
183 | return frame.convert("RGB")
184 |
185 | def generateForest(self):
186 | frame = self.bgs['forest'].copy()
187 | return frame
188 |
189 |
190 | def padToTwoDigit(num):
191 | if num < 10:
192 | return "0" + str(num)
193 | else:
194 | return str(num)
195 |
196 | def countList(noti_list):
197 | counts = {'Discord':0, 'SMS':0, 'Snapchat':0, 'Messenger':0}
198 | for noti in noti_list:
199 | if noti.application in counts.keys():
200 | counts[noti.application] = counts[noti.application] + 1
201 | return counts
202 |
203 | def generateNotiFramesAsync(queue, noti_list, old_noti_list, font, canvas_width, canvas_height):
204 | for noti in noti_list:
205 | found = False
206 | for old_noti in old_noti_list:
207 | if noti.noti_id == old_noti.noti_id:
208 | found = True
209 | if not found:
210 | color = (0,0,0)
211 | if noti.application == 'Discord':
212 | color = discordColor
213 | elif noti.application == 'SMS':
214 | color = smsColor
215 | elif noti.application == 'Snapchat':
216 | color = snapchatColor
217 | elif noti.application == 'Messenger':
218 | color = messengerColor
219 |
220 | for _ in range(3):
221 | queue.append(Image.new('RGB', (canvas_width, canvas_height), color))
222 | queue.append(Image.new('RGB', (canvas_width, canvas_height), color))
223 | queue.append(Image.new('RGB', (canvas_width, canvas_height), (0,0,0)))
224 | queue.append(Image.new('RGB', (canvas_width, canvas_height), (0,0,0)))
225 |
226 | noti_str = noti.application + " | Title: " + noti.title + " | Body: " + noti.body
227 | noti_len = font.getsize(noti_str)[0]
228 |
229 | for i in range(noti_len+canvas_width):
230 | noti_frame = Image.new('RGB', (canvas_width, canvas_height), color)
231 | noti_draw = ImageDraw.Draw(noti_frame)
232 | noti_draw.text((canvas_width-i,1), noti_str, orange_tinted_white, font)
233 | queue.append(noti_frame)
234 |
235 | for _ in range(3):
236 | queue.append(Image.new('RGB', (canvas_width, canvas_height), color))
237 | queue.append(Image.new('RGB', (canvas_width, canvas_height), color))
238 | queue.append(Image.new('RGB', (canvas_width, canvas_height), (0,0,0)))
239 | queue.append(Image.new('RGB', (canvas_width, canvas_height), (0,0,0)))
--------------------------------------------------------------------------------
/cad/knob.STEP:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | FILE_DESCRIPTION (( 'STEP AP203' ),
4 | '1' );
5 | FILE_NAME ('knob.STEP',
6 | '2022-05-02T14:05:05',
7 | ( '' ),
8 | ( '' ),
9 | 'SwSTEP 2.0',
10 | 'SolidWorks 2020',
11 | '' );
12 | FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
13 | ENDSEC;
14 |
15 | DATA;
16 | #1 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
17 | #2 = EDGE_LOOP ( 'NONE', ( #356, #285, #131, #40 ) ) ;
18 | #3 = VERTEX_POINT ( 'NONE', #397 ) ;
19 | #4 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
20 | #5 = VERTEX_POINT ( 'NONE', #202 ) ;
21 | #6 = VERTEX_POINT ( 'NONE', #74 ) ;
22 | #7 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
23 | #8 = EDGE_CURVE ( 'NONE', #6, #203, #178, .T. ) ;
24 | #9 = ORIENTED_EDGE ( 'NONE', *, *, #416, .F. ) ;
25 | #10 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
26 | #11 = VECTOR ( 'NONE', #406, 999.9999999999998863 ) ;
27 | #12 = AXIS2_PLACEMENT_3D ( 'NONE', #417, #383, #282 ) ;
28 | #13 = ORIENTED_EDGE ( 'NONE', *, *, #28, .T. ) ;
29 | #14 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
30 | #15 = PLANE ( 'NONE', #181 ) ;
31 | #16 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
32 | #17 = ADVANCED_FACE ( 'NONE', ( #173 ), #340, .T. ) ;
33 | #18 = EDGE_CURVE ( 'NONE', #206, #5, #324, .T. ) ;
34 | #19 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
35 | #20 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
36 | #21 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -5.204170427930421283E-15, 0.000000000000000000 ) ) ;
37 | #22 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
38 | #23 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
39 | #24 = CIRCLE ( 'NONE', #124, 3.075000000000000622 ) ;
40 | #25 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
41 | #26 = ADVANCED_FACE ( 'NONE', ( #38 ), #346, .F. ) ;
42 | #27 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
43 | #28 = EDGE_CURVE ( 'NONE', #179, #418, #242, .T. ) ;
44 | #29 = CIRCLE ( 'NONE', #415, 14.90000000000000036 ) ;
45 | #30 = EDGE_LOOP ( 'NONE', ( #73, #341, #71, #370 ) ) ;
46 | #31 = VERTEX_POINT ( 'NONE', #263 ) ;
47 | #32 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
48 | #33 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
49 | #34 = EDGE_LOOP ( 'NONE', ( #117, #176, #116 ) ) ;
50 | #35 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
51 | #36 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
52 | #37 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, 0.000000000000000000 ) ) ;
53 | #38 = FACE_OUTER_BOUND ( 'NONE', #46, .T. ) ;
54 | #39 = APPROVAL_DATE_TIME ( #136, #296 ) ;
55 | #40 = ORIENTED_EDGE ( 'NONE', *, *, #215, .F. ) ;
56 | #41 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 9.500000000000000000, 0.000000000000000000 ) ) ;
57 | #42 = DATE_AND_TIME ( #390, #309 ) ;
58 | #43 = VERTEX_POINT ( 'NONE', #373 ) ;
59 | #44 = PLANE ( 'NONE', #317 ) ;
60 | #45 = AXIS2_PLACEMENT_3D ( 'NONE', #109, #114, #293 ) ;
61 | #46 = EDGE_LOOP ( 'NONE', ( #167, #100, #339, #9 ) ) ;
62 | #47 = ORIENTED_EDGE ( 'NONE', *, *, #416, .T. ) ;
63 | #48 = VECTOR ( 'NONE', #190, 1000.000000000000114 ) ;
64 | #49 = FACE_OUTER_BOUND ( 'NONE', #292, .T. ) ;
65 | #50 = ADVANCED_FACE ( 'NONE', ( #394 ), #268, .T. ) ;
66 | #51 = DIRECTION ( 'NONE', ( -0.000000000000000000, 1.000000000000000000, -0.000000000000000000 ) ) ;
67 | #52 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
68 | #53 = VECTOR ( 'NONE', #345, 999.9999999999998863 ) ;
69 | #54 = LOCAL_TIME ( 10, 5, 5.000000000000000000, #287 ) ;
70 | #55 = CARTESIAN_POINT ( 'NONE', ( 1.702259050814821281E-15, -0.9999999999999991118, -13.90000000000000213 ) ) ;
71 | #56 = ADVANCED_FACE ( 'NONE', ( #234 ), #305, .F. ) ;
72 | #57 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
73 | #58 = FACE_OUTER_BOUND ( 'NONE', #2, .T. ) ;
74 | #59 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
75 | #60 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #59 ) ;
76 | #61 = EDGE_CURVE ( 'NONE', #43, #360, #367, .T. ) ;
77 | #62 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 9.500000000000000000, -14.90000000000000036 ) ) ;
78 | #63 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #232, #32, ( #369 ) ) ;
79 | #64 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
80 | #65 = ORIENTED_EDGE ( 'NONE', *, *, #319, .F. ) ;
81 | #66 = CARTESIAN_POINT ( 'NONE', ( 1.824723730729556232E-15, -5.204170427930421283E-15, 14.90000000000000036 ) ) ;
82 | #67 = CIRCLE ( 'NONE', #283, 3.075000000000000622 ) ;
83 | #68 = VECTOR ( 'NONE', #320, 1000.000000000000000 ) ;
84 | #69 = VERTEX_POINT ( 'NONE', #388 ) ;
85 | #70 = APPROVAL_DATE_TIME ( #365, #378 ) ;
86 | #71 = ORIENTED_EDGE ( 'NONE', *, *, #135, .T. ) ;
87 | #72 = ORIENTED_EDGE ( 'NONE', *, *, #331, .T. ) ;
88 | #73 = ORIENTED_EDGE ( 'NONE', *, *, #168, .F. ) ;
89 | #74 = CARTESIAN_POINT ( 'NONE', ( 1.273632671113249051E-15, 0.000000000000000000, 9.900000000000005684 ) ) ;
90 | #75 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
91 | #76 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 7.806255641895631925E-15, -9.900000000000005684 ) ) ;
92 | #77 = CIRCLE ( 'NONE', #91, 14.90000000000000036 ) ;
93 | #78 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -0.9999999999999991118, 0.000000000000000000 ) ) ;
94 | #79 = AXIS2_PLACEMENT_3D ( 'NONE', #157, #130, #93 ) ;
95 | #80 = ORIENTED_EDGE ( 'NONE', *, *, #18, .T. ) ;
96 | #81 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #106, #358, ( #364 ) ) ;
97 | #82 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
98 | #83 = ORIENTED_EDGE ( 'NONE', *, *, #405, .T. ) ;
99 | #84 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
100 | #85 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, 0.000000000000000000 ) ) ;
101 | #86 = AXIS2_PLACEMENT_3D ( 'NONE', #37, #393, #33 ) ;
102 | #87 = FACE_OUTER_BOUND ( 'NONE', #34, .T. ) ;
103 | #88 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
104 | #89 = ADVANCED_FACE ( 'NONE', ( #211 ), #102, .T. ) ;
105 | #90 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, -3.075000000000000622 ) ) ;
106 | #91 = AXIS2_PLACEMENT_3D ( 'NONE', #375, #189, #52 ) ;
107 | #92 = CARTESIAN_POINT ( 'NONE', ( 1.212400331155880491E-15, 7.806255641895631925E-15, 9.900000000000005684 ) ) ;
108 | #93 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
109 | #94 = EDGE_CURVE ( 'NONE', #360, #31, #29, .T. ) ;
110 | #95 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000082E-05 ), #193, 'distance_accuracy_value', 'NONE');
111 | #96 = CYLINDRICAL_SURFACE ( 'NONE', #385, 3.075000000000000622 ) ;
112 | #97 = CARTESIAN_POINT ( 'NONE', ( 2.670205984563738699, 6.500000000000000000, 1.524999999999999245 ) ) ;
113 | #98 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
114 | #99 = VECTOR ( 'NONE', #240, 1000.000000000000000 ) ;
115 | #100 = ORIENTED_EDGE ( 'NONE', *, *, #362, .F. ) ;
116 | #101 = AXIS2_PLACEMENT_3D ( 'NONE', #187, #271, #272 ) ;
117 | #102 = CYLINDRICAL_SURFACE ( 'NONE', #368, 14.90000000000000036 ) ;
118 | #103 = DATE_AND_TIME ( #259, #54 ) ;
119 | #104 = EDGE_LOOP ( 'NONE', ( #265, #359, #290, #335 ) ) ;
120 | #105 = ORIENTED_EDGE ( 'NONE', *, *, #280, .T. ) ;
121 | #106 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
122 | #107 = FACE_OUTER_BOUND ( 'NONE', #262, .T. ) ;
123 | #108 = ADVANCED_FACE ( 'NONE', ( #208, #336 ), #44, .F. ) ;
124 | #109 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
125 | #110 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #333 ) ) ;
126 | #111 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
127 | #112 = ORIENTED_EDGE ( 'NONE', *, *, #275, .F. ) ;
128 | #113 = AXIS2_PLACEMENT_3D ( 'NONE', #119, #120, #88 ) ;
129 | #114 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
130 | #115 = CC_DESIGN_APPROVAL ( #151, ( #364 ) ) ;
131 | #116 = ORIENTED_EDGE ( 'NONE', *, *, #328, .F. ) ;
132 | #117 = ORIENTED_EDGE ( 'NONE', *, *, #244, .F. ) ;
133 | #118 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
134 | #119 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 8.099999999999999645, 0.000000000000000000 ) ) ;
135 | #120 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
136 | #121 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
137 | #122 = AXIS2_PLACEMENT_3D ( 'NONE', #194, #384, #350 ) ;
138 | #123 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
139 | #124 = AXIS2_PLACEMENT_3D ( 'NONE', #20, #308, #121 ) ;
140 | #125 = MECHANICAL_CONTEXT ( 'NONE', #16, 'mechanical' ) ;
141 | #126 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, 0.000000000000000000 ) ) ;
142 | #127 = APPROVAL_PERSON_ORGANIZATION ( #311, #151, #412 ) ;
143 | #128 = EDGE_CURVE ( 'NONE', #142, #270, #235, .T. ) ;
144 | #129 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
145 | #130 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
146 | #131 = ORIENTED_EDGE ( 'NONE', *, *, #377, .T. ) ;
147 | #132 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
148 | #133 = AXIS2_PLACEMENT_3D ( 'NONE', #321, #25, #64 ) ;
149 | #134 = ORIENTED_EDGE ( 'NONE', *, *, #8, .F. ) ;
150 | #135 = EDGE_CURVE ( 'NONE', #142, #360, #304, .T. ) ;
151 | #136 = DATE_AND_TIME ( #205, #209 ) ;
152 | #137 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 7.806255641895631925E-15, 0.000000000000000000 ) ) ;
153 | #138 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #103, #325, ( #364 ) ) ;
154 | #139 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
155 | #140 = ORIENTED_EDGE ( 'NONE', *, *, #216, .T. ) ;
156 | #141 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -5.204170427930421283E-15, 0.000000000000000000 ) ) ;
157 | #142 = VERTEX_POINT ( 'NONE', #217 ) ;
158 | #143 = AXIS2_PLACEMENT_3D ( 'NONE', #78, #10, #14 ) ;
159 | #144 = ORIENTED_EDGE ( 'NONE', *, *, #94, .T. ) ;
160 | #145 = ORIENTED_EDGE ( 'NONE', *, *, #18, .F. ) ;
161 | #146 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
162 | #147 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 8.099999999999999645, -14.90000000000000036 ) ) ;
163 | #148 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
164 | #149 = EDGE_CURVE ( 'NONE', #5, #418, #67, .T. ) ;
165 | #150 = PLANE ( 'NONE', #155 ) ;
166 | #151 = APPROVAL ( #279, 'UNSPECIFIED' ) ;
167 | #152 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
168 | #153 = CC_DESIGN_SECURITY_CLASSIFICATION ( #239, ( #369 ) ) ;
169 | #154 = VECTOR ( 'NONE', #314, 1000.000000000000000 ) ;
170 | #155 = AXIS2_PLACEMENT_3D ( 'NONE', #85, #274, #57 ) ;
171 | #156 = DESIGN_CONTEXT ( 'detailed design', #59, 'design' ) ;
172 | #157 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
173 | #158 = FACE_OUTER_BOUND ( 'NONE', #241, .T. ) ;
174 | #159 = ADVANCED_FACE ( 'NONE', ( #343 ), #303, .T. ) ;
175 | #160 = AXIS2_PLACEMENT_3D ( 'NONE', #371, #35, #207 ) ;
176 | #161 = CC_DESIGN_APPROVAL ( #378, ( #369 ) ) ;
177 | #162 = ORIENTED_EDGE ( 'NONE', *, *, #184, .T. ) ;
178 | #163 = EDGE_LOOP ( 'NONE', ( #80, #180, #392 ) ) ;
179 | #164 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
180 | #165 = LINE ( 'NONE', #76, #249 ) ;
181 | #166 = VERTEX_POINT ( 'NONE', #246 ) ;
182 | #167 = ORIENTED_EDGE ( 'NONE', *, *, #280, .F. ) ;
183 | #168 = EDGE_CURVE ( 'NONE', #270, #31, #410, .T. ) ;
184 | #169 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
185 | #170 = ORIENTED_EDGE ( 'NONE', *, *, #61, .F. ) ;
186 | #171 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, -3.075000000000000622 ) ) ;
187 | #172 = VERTEX_POINT ( 'NONE', #147 ) ;
188 | #173 = FACE_OUTER_BOUND ( 'NONE', #104, .T. ) ;
189 | #174 = DATE_AND_TIME ( #251, #348 ) ;
190 | #175 = AXIS2_PLACEMENT_3D ( 'NONE', #316, #27, #129 ) ;
191 | #176 = ORIENTED_EDGE ( 'NONE', *, *, #195, .F. ) ;
192 | #177 = ORIENTED_EDGE ( 'NONE', *, *, #377, .F. ) ;
193 | #178 = CIRCLE ( 'NONE', #45, 9.900000000000005684 ) ;
194 | #179 = VERTEX_POINT ( 'NONE', #90 ) ;
195 | #180 = ORIENTED_EDGE ( 'NONE', *, *, #149, .T. ) ;
196 | #181 = AXIS2_PLACEMENT_3D ( 'NONE', #214, #247, #123 ) ;
197 | #182 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
198 | #183 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
199 | #184 = EDGE_CURVE ( 'NONE', #172, #43, #77, .T. ) ;
200 | #185 = VECTOR ( 'NONE', #302, 1000.000000000000000 ) ;
201 | #186 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #42, #236, ( #239 ) ) ;
202 | #187 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, 0.000000000000000000 ) ) ;
203 | #188 = APPROVAL_PERSON_ORGANIZATION ( #329, #378, #226 ) ;
204 | #189 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
205 | #190 = DIRECTION ( 'NONE', ( 8.659560562354963673E-17, -0.7071067811865451302, 0.7071067811865500152 ) ) ;
206 | #191 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
207 | #192 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
208 | #193 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( .MILLI., .METRE. ) );
209 | #194 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738255, 6.500000000000000000, 1.524999999999998801 ) ) ;
210 | #195 = EDGE_CURVE ( 'NONE', #179, #69, #411, .T. ) ;
211 | #196 = AXIS2_PLACEMENT_3D ( 'NONE', #22, #273, #118 ) ;
212 | #197 = CIRCLE ( 'NONE', #12, 14.90000000000000036 ) ;
213 | #198 = EDGE_LOOP ( 'NONE', ( #170, #261, #391, #363 ) ) ;
214 | #199 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
215 | #200 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.7071067811865451302, -0.7071067811865500152 ) ) ;
216 | #201 = EDGE_LOOP ( 'NONE', ( #162, #72 ) ) ;
217 | #202 = CARTESIAN_POINT ( 'NONE', ( 2.670205984563738699, 1.734723475976807094E-15, 1.524999999999999245 ) ) ;
218 | #203 = VERTEX_POINT ( 'NONE', #374 ) ;
219 | #204 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -0.9999999999999991118, 0.000000000000000000 ) ) ;
220 | #205 = CALENDAR_DATE ( 2022, 2, 5 ) ;
221 | #206 = VERTEX_POINT ( 'NONE', #306 ) ;
222 | #207 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
223 | #208 = FACE_OUTER_BOUND ( 'NONE', #298, .T. ) ;
224 | #209 = LOCAL_TIME ( 10, 5, 5.000000000000000000, #291 ) ;
225 | #210 = ORIENTED_EDGE ( 'NONE', *, *, #275, .T. ) ;
226 | #211 = FACE_OUTER_BOUND ( 'NONE', #198, .T. ) ;
227 | #212 = LINE ( 'NONE', #408, #278 ) ;
228 | #213 = AXIS2_PLACEMENT_3D ( 'NONE', #21, #152, #344 ) ;
229 | #214 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
230 | #215 = EDGE_CURVE ( 'NONE', #418, #206, #24, .T. ) ;
231 | #216 = EDGE_CURVE ( 'NONE', #270, #142, #318, .T. ) ;
232 | #217 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 13.90000000000000036 ) ) ;
233 | #218 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
234 | #219 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
235 | #220 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
236 | #221 = LINE ( 'NONE', #97, #354 ) ;
237 | #222 = EDGE_CURVE ( 'NONE', #31, #360, #357, .T. ) ;
238 | #223 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
239 | #224 = AXIS2_PLACEMENT_3D ( 'NONE', #223, #256, #220 ) ;
240 | #225 = AXIS2_PLACEMENT_3D ( 'NONE', #182, #51, #183 ) ;
241 | #226 = APPROVAL_ROLE ( '' ) ;
242 | #227 = ORIENTED_EDGE ( 'NONE', *, *, #353, .F. ) ;
243 | #228 = MANIFOLD_SOLID_BREP ( 'Cut-Extrude3', #355 ) ;
244 | #229 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
245 | #230 = EDGE_LOOP ( 'NONE', ( #400, #140 ) ) ;
246 | #231 = ORIENTED_EDGE ( 'NONE', *, *, #61, .T. ) ;
247 | #232 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
248 | #233 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
249 | #234 = FACE_OUTER_BOUND ( 'NONE', #372, .T. ) ;
250 | #235 = CIRCLE ( 'NONE', #196, 13.90000000000000036 ) ;
251 | #236 = DATE_TIME_ROLE ( 'classification_date' ) ;
252 | #237 = ADVANCED_FACE ( 'NONE', ( #87 ), #150, .F. ) ;
253 | #238 = ORIENTED_EDGE ( 'NONE', *, *, #405, .F. ) ;
254 | #239 = SECURITY_CLASSIFICATION ( '', '', #1 ) ;
255 | #240 = DIRECTION ( 'NONE', ( 1.000000000000000000, -0.000000000000000000, 8.120738091017667639E-17 ) ) ;
256 | #241 = EDGE_LOOP ( 'NONE', ( #145, #177, #326, #83 ) ) ;
257 | #242 = LINE ( 'NONE', #171, #185 ) ;
258 | #243 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -0.9999999999999991118, 13.90000000000000213 ) ) ;
259 | #244 = EDGE_CURVE ( 'NONE', #69, #166, #212, .T. ) ;
260 | #245 = FACE_OUTER_BOUND ( 'NONE', #230, .T. ) ;
261 | #246 = CARTESIAN_POINT ( 'NONE', ( 2.670205984563738699, 6.500000000000000000, 1.524999999999999245 ) ) ;
262 | #247 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
263 | #248 = CARTESIAN_POINT ( 'NONE', ( 1.763491390772188855E-15, -1.000000000000000000, -13.90000000000000036 ) ) ;
264 | #249 = VECTOR ( 'NONE', #200, 1000.000000000000114 ) ;
265 | #250 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
266 | #251 = CALENDAR_DATE ( 2022, 2, 5 ) ;
267 | #252 = ADVANCED_FACE ( 'NONE', ( #277, #245 ), #15, .T. ) ;
268 | #253 = VECTOR ( 'NONE', #146, 1000.000000000000000 ) ;
269 | #254 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #164, #111, ( #369 ) ) ;
270 | #255 = PLANE ( 'NONE', #122 ) ;
271 | #256 = DIRECTION ( 'NONE', ( -0.000000000000000000, 1.000000000000000000, -0.000000000000000000 ) ) ;
272 | #257 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #16 ) ;
273 | #258 = CIRCLE ( 'NONE', #133, 3.075000000000000622 ) ;
274 | #259 = CALENDAR_DATE ( 2022, 2, 5 ) ;
275 | #260 = CYLINDRICAL_SURFACE ( 'NONE', #312, 14.90000000000000036 ) ;
276 | #261 = ORIENTED_EDGE ( 'NONE', *, *, #184, .F. ) ;
277 | #262 = EDGE_LOOP ( 'NONE', ( #396, #231, #144, #227 ) ) ;
278 | #263 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -5.204170427930421283E-15, -14.90000000000000036 ) ) ;
279 | #264 = SHAPE_DEFINITION_REPRESENTATION ( #266, #323 ) ;
280 | #265 = ORIENTED_EDGE ( 'NONE', *, *, #216, .F. ) ;
281 | #266 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #364 ) ;
282 | #267 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
283 | #268 = CONICAL_SURFACE ( 'NONE', #143, 13.90000000000000213, 0.7853981633974501664 ) ;
284 | #269 = ORIENTED_EDGE ( 'NONE', *, *, #328, .T. ) ;
285 | #270 = VERTEX_POINT ( 'NONE', #248 ) ;
286 | #271 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
287 | #272 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
288 | #273 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
289 | #274 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
290 | #275 = EDGE_CURVE ( 'NONE', #322, #3, #380, .T. ) ;
291 | #276 = CC_DESIGN_APPROVAL ( #296, ( #239 ) ) ;
292 | #277 = FACE_BOUND ( 'NONE', #387, .T. ) ;
293 | #278 = VECTOR ( 'NONE', #404, 1000.000000000000000 ) ;
294 | #279 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
295 | #280 = EDGE_CURVE ( 'NONE', #6, #3, #381, .T. ) ;
296 | #281 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #191, #250, ( #333 ) ) ;
297 | #282 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
298 | #283 = AXIS2_PLACEMENT_3D ( 'NONE', #349, #376, #19 ) ;
299 | #284 = LOCAL_TIME ( 10, 5, 5.000000000000000000, #169 ) ;
300 | #285 = ORIENTED_EDGE ( 'NONE', *, *, #195, .T. ) ;
301 | #286 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -3.075000000000000622 ) ) ;
302 | #287 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
303 | #288 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, -10.90000000000001990 ) ) ;
304 | #289 = ORIENTED_EDGE ( 'NONE', *, *, #149, .F. ) ;
305 | #290 = ORIENTED_EDGE ( 'NONE', *, *, #94, .F. ) ;
306 | #291 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
307 | #292 = EDGE_LOOP ( 'NONE', ( #269, #13, #289, #238 ) ) ;
308 | #293 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
309 | #294 = ADVANCED_FACE ( 'NONE', ( #49 ), #310, .F. ) ;
310 | #295 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
311 | #296 = APPROVAL ( #139, 'UNSPECIFIED' ) ;
312 | #297 = APPROVAL_ROLE ( '' ) ;
313 | #298 = EDGE_LOOP ( 'NONE', ( #330, #301 ) ) ;
314 | #299 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738255, 0.000000000000000000, 1.524999999999998801 ) ) ;
315 | #300 = CIRCLE ( 'NONE', #175, 9.900000000000005684 ) ;
316 | #301 = ORIENTED_EDGE ( 'NONE', *, *, #8, .T. ) ;
317 | #302 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
318 | #303 = PLANE ( 'NONE', #113 ) ;
319 | #304 = LINE ( 'NONE', #243, #11 ) ;
320 | #305 = CONICAL_SURFACE ( 'NONE', #160, 9.900000000000005684, 0.7853981633974517207 ) ;
321 | #306 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738699, 0.000000000000000000, 1.524999999999999245 ) ) ;
322 | #307 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
323 | #308 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
324 | #309 = LOCAL_TIME ( 10, 5, 5.000000000000000000, #132 ) ;
325 | #310 = CYLINDRICAL_SURFACE ( 'NONE', #86, 3.075000000000000622 ) ;
326 | #311 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
327 | #312 = AXIS2_PLACEMENT_3D ( 'NONE', #361, #233, #366 ) ;
328 | #313 = ADVANCED_FACE ( 'NONE', ( #107 ), #260, .T. ) ;
329 | #314 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
330 | #315 = LINE ( 'NONE', #62, #68 ) ;
331 | #316 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
332 | #317 = AXIS2_PLACEMENT_3D ( 'NONE', #379, #148, #402 ) ;
333 | #318 = CIRCLE ( 'NONE', #342, 13.90000000000000036 ) ;
334 | #319 = EDGE_CURVE ( 'NONE', #203, #322, #165, .T. ) ;
335 | #320 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
336 | #321 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 6.500000000000000000, 0.000000000000000000 ) ) ;
337 | #322 = VERTEX_POINT ( 'NONE', #288 ) ;
338 | #323 = ADVANCED_BREP_SHAPE_REPRESENTATION ( 'knob', ( #228, #79 ), #338 ) ;
339 | #324 = LINE ( 'NONE', #299, #99 ) ;
340 | #325 = DATE_TIME_ROLE ( 'creation_date' ) ;
341 | #326 = ORIENTED_EDGE ( 'NONE', *, *, #244, .T. ) ;
342 | #327 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
343 | #328 = EDGE_CURVE ( 'NONE', #166, #179, #258, .T. ) ;
344 | #329 = PERSON_AND_ORGANIZATION ( #403, #307 ) ;
345 | #330 = ORIENTED_EDGE ( 'NONE', *, *, #362, .T. ) ;
346 | #331 = EDGE_CURVE ( 'NONE', #43, #172, #197, .T. ) ;
347 | #332 = CARTESIAN_POINT ( 'NONE', ( 1.824723730729556232E-15, 9.500000000000000000, 14.90000000000000036 ) ) ;
348 | #333 = PRODUCT ( 'knob', 'knob', '', ( #125 ) ) ;
349 | #334 = CALENDAR_DATE ( 2022, 2, 5 ) ;
350 | #335 = ORIENTED_EDGE ( 'NONE', *, *, #135, .F. ) ;
351 | #336 = FACE_BOUND ( 'NONE', #163, .T. ) ;
352 | #337 = APPROVAL_PERSON_ORGANIZATION ( #199, #296, #297 ) ;
353 | #338 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #95 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #193, #23, #351 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
354 | #339 = ORIENTED_EDGE ( 'NONE', *, *, #319, .T. ) ;
355 | #340 = CONICAL_SURFACE ( 'NONE', #386, 13.90000000000000213, 0.7853981633974501664 ) ;
356 | #341 = ORIENTED_EDGE ( 'NONE', *, *, #128, .F. ) ;
357 | #342 = AXIS2_PLACEMENT_3D ( 'NONE', #219, #347, #218 ) ;
358 | #343 = FACE_OUTER_BOUND ( 'NONE', #201, .T. ) ;
359 | #344 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
360 | #345 = DIRECTION ( 'NONE', ( 8.659560562354950115E-17, 0.7071067811865462405, -0.7071067811865489050 ) ) ;
361 | #346 = CONICAL_SURFACE ( 'NONE', #398, 9.900000000000005684, 0.7853981633974517207 ) ;
362 | #347 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
363 | #348 = LOCAL_TIME ( 10, 5, 5.000000000000000000, #192 ) ;
364 | #349 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
365 | #350 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, -8.120738091017667639E-17 ) ) ;
366 | #351 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
367 | #352 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
368 | #353 = EDGE_CURVE ( 'NONE', #172, #31, #315, .T. ) ;
369 | #354 = VECTOR ( 'NONE', #352, 1000.000000000000000 ) ;
370 | #355 = CLOSED_SHELL ( 'NONE', ( #294, #56, #17, #313, #108, #89, #252, #159, #50, #26, #237, #389, #399 ) ) ;
371 | #356 = ORIENTED_EDGE ( 'NONE', *, *, #28, .F. ) ;
372 | #357 = CIRCLE ( 'NONE', #213, 14.90000000000000036 ) ;
373 | #358 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
374 | #359 = ORIENTED_EDGE ( 'NONE', *, *, #168, .T. ) ;
375 | #360 = VERTEX_POINT ( 'NONE', #66 ) ;
376 | #361 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 9.500000000000000000, 0.000000000000000000 ) ) ;
377 | #362 = EDGE_CURVE ( 'NONE', #203, #6, #300, .T. ) ;
378 | #363 = ORIENTED_EDGE ( 'NONE', *, *, #222, .T. ) ;
379 | #364 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #369, #156 ) ;
380 | #365 = DATE_AND_TIME ( #334, #284 ) ;
381 | #366 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
382 | #367 = LINE ( 'NONE', #332, #253 ) ;
383 | #368 = AXIS2_PLACEMENT_3D ( 'NONE', #41, #295, #7 ) ;
384 | #369 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #333, .NOT_KNOWN. ) ;
385 | #370 = ORIENTED_EDGE ( 'NONE', *, *, #222, .F. ) ;
386 | #371 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 7.806255641895631925E-15, 0.000000000000000000 ) ) ;
387 | #372 = EDGE_LOOP ( 'NONE', ( #134, #105, #112, #65 ) ) ;
388 | #373 = CARTESIAN_POINT ( 'NONE', ( 1.824723730729556232E-15, 8.099999999999999645, 14.90000000000000036 ) ) ;
389 | #374 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -9.900000000000005684 ) ) ;
390 | #375 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 8.099999999999999645, 0.000000000000000000 ) ) ;
391 | #376 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
392 | #377 = EDGE_CURVE ( 'NONE', #69, #206, #413, .T. ) ;
393 | #378 = APPROVAL ( #4, 'UNSPECIFIED' ) ;
394 | #379 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
395 | #380 = CIRCLE ( 'NONE', #225, 10.90000000000001990 ) ;
396 | #381 = LINE ( 'NONE', #92, #48 ) ;
397 | #382 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
398 | #383 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
399 | #384 = DIRECTION ( 'NONE', ( 8.120738091017667639E-17, 0.000000000000000000, -1.000000000000000000 ) ) ;
400 | #385 = AXIS2_PLACEMENT_3D ( 'NONE', #126, #382, #98 ) ;
401 | #386 = AXIS2_PLACEMENT_3D ( 'NONE', #204, #401, #327 ) ;
402 | #387 = EDGE_LOOP ( 'NONE', ( #210, #47 ) ) ;
403 | #388 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738255, 6.500000000000000000, 1.524999999999998801 ) ) ;
404 | #389 = ADVANCED_FACE ( 'NONE', ( #58 ), #96, .F. ) ;
405 | #390 = CALENDAR_DATE ( 2022, 2, 5 ) ;
406 | #391 = ORIENTED_EDGE ( 'NONE', *, *, #353, .T. ) ;
407 | #392 = ORIENTED_EDGE ( 'NONE', *, *, #215, .T. ) ;
408 | #393 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
409 | #394 = FACE_OUTER_BOUND ( 'NONE', #30, .T. ) ;
410 | #395 = APPROVAL_DATE_TIME ( #174, #151 ) ;
411 | #396 = ORIENTED_EDGE ( 'NONE', *, *, #331, .F. ) ;
412 | #397 = CARTESIAN_POINT ( 'NONE', ( 1.334865011070617611E-15, -1.000000000000000000, 10.90000000000001990 ) ) ;
413 | #398 = AXIS2_PLACEMENT_3D ( 'NONE', #137, #84, #229 ) ;
414 | #399 = ADVANCED_FACE ( 'NONE', ( #158 ), #255, .T. ) ;
415 | #400 = ORIENTED_EDGE ( 'NONE', *, *, #128, .T. ) ;
416 | #401 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
417 | #402 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
418 | #403 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
419 | #404 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 8.120738091017667639E-17 ) ) ;
420 | #405 = EDGE_CURVE ( 'NONE', #166, #5, #221, .T. ) ;
421 | #406 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.7071067811865462405, 0.7071067811865489050 ) ) ;
422 | #407 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #36, #75, ( #239 ) ) ;
423 | #408 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738255, 6.500000000000000000, 1.524999999999998801 ) ) ;
424 | #409 = CIRCLE ( 'NONE', #224, 10.90000000000001990 ) ;
425 | #410 = LINE ( 'NONE', #55, #53 ) ;
426 | #411 = CIRCLE ( 'NONE', #101, 3.075000000000000622 ) ;
427 | #412 = APPROVAL_ROLE ( '' ) ;
428 | #413 = LINE ( 'NONE', #414, #154 ) ;
429 | #414 = CARTESIAN_POINT ( 'NONE', ( -2.670205984563738255, 6.500000000000000000, 1.524999999999998801 ) ) ;
430 | #415 = AXIS2_PLACEMENT_3D ( 'NONE', #141, #267, #82 ) ;
431 | #416 = EDGE_CURVE ( 'NONE', #3, #322, #409, .T. ) ;
432 | #417 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 8.099999999999999645, 0.000000000000000000 ) ) ;
433 | #418 = VERTEX_POINT ( 'NONE', #286 ) ;
434 | ENDSEC;
435 | END-ISO-10303-21;
436 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/cad/base swivel cap V2.STEP:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | FILE_DESCRIPTION (( 'STEP AP203' ),
4 | '1' );
5 | FILE_NAME ('base swivel cap V2.STEP',
6 | '2022-05-02T14:04:46',
7 | ( '' ),
8 | ( '' ),
9 | 'SwSTEP 2.0',
10 | 'SolidWorks 2020',
11 | '' );
12 | FILE_SCHEMA (( 'CONFIG_CONTROL_DESIGN' ));
13 | ENDSEC;
14 |
15 | DATA;
16 | #1 = ORIENTED_EDGE ( 'NONE', *, *, #470, .F. ) ;
17 | #2 = VECTOR ( 'NONE', #135, 1000.000000000000000 ) ;
18 | #3 = LINE ( 'NONE', #429, #717 ) ;
19 | #4 = FACE_OUTER_BOUND ( 'NONE', #224, .T. ) ;
20 | #5 = ADVANCED_FACE ( 'NONE', ( #324 ), #343, .T. ) ;
21 | #6 = LINE ( 'NONE', #1118, #60 ) ;
22 | #7 = EDGE_LOOP ( 'NONE', ( #390, #561, #568, #836 ) ) ;
23 | #8 = AXIS2_PLACEMENT_3D ( 'NONE', #635, #286, #897 ) ;
24 | #9 = PLANE ( 'NONE', #1007 ) ;
25 | #10 = PLANE ( 'NONE', #108 ) ;
26 | #11 = DATE_AND_TIME ( #515, #474 ) ;
27 | #12 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, 13.50000000000003908 ) ) ;
28 | #13 = VECTOR ( 'NONE', #554, 1000.000000000000000 ) ;
29 | #14 = EDGE_CURVE ( 'NONE', #34, #728, #679, .T. ) ;
30 | #15 = ORIENTED_EDGE ( 'NONE', *, *, #1060, .T. ) ;
31 | #16 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
32 | #17 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
33 | #18 = ORIENTED_EDGE ( 'NONE', *, *, #244, .F. ) ;
34 | #19 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
35 | #20 = PERSON ( 'UNSPECIFIED', 'UNSPECIFIED', 'UNSPECIFIED', ('UNSPECIFIED'), ('UNSPECIFIED'), ('UNSPECIFIED') ) ;
36 | #21 = ORIENTED_EDGE ( 'NONE', *, *, #227, .F. ) ;
37 | #22 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, -18.55256701634527161 ) ) ;
38 | #23 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 0.000000000000000000 ) ) ;
39 | #24 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
40 | #25 = AXIS2_PLACEMENT_3D ( 'NONE', #273, #432, #188 ) ;
41 | #26 = EDGE_CURVE ( 'NONE', #39, #775, #776, .T. ) ;
42 | #27 = LINE ( 'NONE', #122, #839 ) ;
43 | #28 = ADVANCED_FACE ( 'NONE', ( #335 ), #9, .T. ) ;
44 | #29 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 21.12439348241742820, -13.49999999999996980 ) ) ;
45 | #30 = LOCAL_TIME ( 10, 4, 46.00000000000000000, #808 ) ;
46 | #31 = ORIENTED_EDGE ( 'NONE', *, *, #966, .T. ) ;
47 | #32 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
48 | #33 = PLANE ( 'NONE', #217 ) ;
49 | #34 = VERTEX_POINT ( 'NONE', #87 ) ;
50 | #35 = VECTOR ( 'NONE', #256, 1000.000000000000000 ) ;
51 | #36 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 0.000000000000000000 ) ) ;
52 | #37 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
53 | #38 = ADVANCED_FACE ( 'NONE', ( #351 ), #439, .F. ) ;
54 | #39 = VERTEX_POINT ( 'NONE', #423 ) ;
55 | #40 = APPROVAL ( #1032, 'UNSPECIFIED' ) ;
56 | #41 = LINE ( 'NONE', #385, #1057 ) ;
57 | #42 = ORIENTED_EDGE ( 'NONE', *, *, #953, .T. ) ;
58 | #43 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, -13.49999999999996980 ) ) ;
59 | #44 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
60 | #45 = ORIENTED_EDGE ( 'NONE', *, *, #649, .T. ) ;
61 | #46 = CIRCLE ( 'NONE', #961, 1.500000000000001332 ) ;
62 | #47 = EDGE_CURVE ( 'NONE', #517, #997, #99, .T. ) ;
63 | #48 = CIRCLE ( 'NONE', #105, 1.600000000000000755 ) ;
64 | #49 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
65 | #50 = VERTEX_POINT ( 'NONE', #177 ) ;
66 | #51 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
67 | #52 = CALENDAR_DATE ( 2022, 2, 5 ) ;
68 | #53 = ORIENTED_EDGE ( 'NONE', *, *, #888, .F. ) ;
69 | #54 = ORIENTED_EDGE ( 'NONE', *, *, #393, .T. ) ;
70 | #55 = EDGE_CURVE ( 'NONE', #150, #157, #755, .T. ) ;
71 | #56 = FACE_OUTER_BOUND ( 'NONE', #230, .T. ) ;
72 | #57 = VERTEX_POINT ( 'NONE', #101 ) ;
73 | #58 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 0.000000000000000000, 33.50000000000002842 ) ) ;
74 | #59 = DATE_TIME_ROLE ( 'creation_date' ) ;
75 | #60 = VECTOR ( 'NONE', #171, 1000.000000000000000 ) ;
76 | #61 = ORIENTED_EDGE ( 'NONE', *, *, #579, .T. ) ;
77 | #62 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
78 | #63 = VECTOR ( 'NONE', #588, 1000.000000000000000 ) ;
79 | #64 = ADVANCED_BREP_SHAPE_REPRESENTATION ( 'base swivel cap V2', ( #502, #603 ), #548 ) ;
80 | #65 = LINE ( 'NONE', #239, #354 ) ;
81 | #66 = EDGE_CURVE ( 'NONE', #829, #604, #3, .T. ) ;
82 | #67 = ORIENTED_EDGE ( 'NONE', *, *, #1048, .T. ) ;
83 | #68 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
84 | #69 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
85 | #70 = ADVANCED_FACE ( 'NONE', ( #766, #96, #508 ), #758, .T. ) ;
86 | #71 = ORIENTED_EDGE ( 'NONE', *, *, #1097, .F. ) ;
87 | #72 = LINE ( 'NONE', #410, #514 ) ;
88 | #73 = APPROVAL_PERSON_ORGANIZATION ( #773, #40, #347 ) ;
89 | #74 = AXIS2_PLACEMENT_3D ( 'NONE', #630, #721, #110 ) ;
90 | #75 = FACE_OUTER_BOUND ( 'NONE', #802, .T. ) ;
91 | #76 = ORIENTED_EDGE ( 'NONE', *, *, #987, .T. ) ;
92 | #77 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, -18.55256701634527161 ) ) ;
93 | #78 = ORIENTED_EDGE ( 'NONE', *, *, #765, .F. ) ;
94 | #79 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, 18.55256701634533911 ) ) ;
95 | #80 = AXIS2_PLACEMENT_3D ( 'NONE', #426, #524, #779 ) ;
96 | #81 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 20.15256701634534053 ) ) ;
97 | #82 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
98 | #83 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, -28.49999999999997158 ) ) ;
99 | #84 = VERTEX_POINT ( 'NONE', #611 ) ;
100 | #85 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
101 | #86 = EDGE_CURVE ( 'NONE', #396, #216, #674, .T. ) ;
102 | #87 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588235725, 2.000000000000000000, -35.46543516246453720 ) ) ;
103 | #88 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
104 | #89 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
105 | #90 = AXIS2_PLACEMENT_3D ( 'NONE', #1020, #338, #907 ) ;
106 | #91 = CIRCLE ( 'NONE', #857, 2.620000000000004103 ) ;
107 | #92 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
108 | #93 = LINE ( 'NONE', #1117, #809 ) ;
109 | #94 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -16.95256701634527019 ) ) ;
110 | #95 = ORIENTED_EDGE ( 'NONE', *, *, #973, .T. ) ;
111 | #96 = FACE_BOUND ( 'NONE', #988, .T. ) ;
112 | #97 = FACE_OUTER_BOUND ( 'NONE', #769, .T. ) ;
113 | #98 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
114 | #99 = CIRCLE ( 'NONE', #278, 12.50000000000000355 ) ;
115 | #100 = VERTEX_POINT ( 'NONE', #81 ) ;
116 | #101 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 12.50000000000000355 ) ) ;
117 | #102 = LINE ( 'NONE', #527, #134 ) ;
118 | #103 = EDGE_CURVE ( 'NONE', #1014, #664, #1018, .T. ) ;
119 | #104 = ORIENTED_EDGE ( 'NONE', *, *, #292, .F. ) ;
120 | #105 = AXIS2_PLACEMENT_3D ( 'NONE', #910, #140, #329 ) ;
121 | #106 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -12.50000000000000355 ) ) ;
122 | #107 = CYLINDRICAL_SURFACE ( 'NONE', #200, 6.120000000000000107 ) ;
123 | #108 = AXIS2_PLACEMENT_3D ( 'NONE', #509, #675, #88 ) ;
124 | #109 = EDGE_LOOP ( 'NONE', ( #234, #61, #704, #887 ) ) ;
125 | #110 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
126 | #111 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
127 | #112 = ADVANCED_FACE ( 'NONE', ( #936 ), #578, .F. ) ;
128 | #113 = ORIENTED_EDGE ( 'NONE', *, *, #1110, .F. ) ;
129 | #114 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
130 | #115 = EDGE_LOOP ( 'NONE', ( #927, #520, #1116, #647 ) ) ;
131 | #116 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, -3.000000000000000000, -35.46689564855758903 ) ) ;
132 | #117 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 18.55256701634533911 ) ) ;
133 | #118 = VERTEX_POINT ( 'NONE', #584 ) ;
134 | #119 = FACE_OUTER_BOUND ( 'NONE', #984, .T. ) ;
135 | #120 = AXIS2_PLACEMENT_3D ( 'NONE', #744, #400, #1010 ) ;
136 | #121 = EDGE_LOOP ( 'NONE', ( #327, #918, #736, #902 ) ) ;
137 | #122 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, -20.15256701634527303 ) ) ;
138 | #123 = EDGE_CURVE ( 'NONE', #492, #265, #185, .T. ) ;
139 | #124 = ORIENTED_EDGE ( 'NONE', *, *, #128, .T. ) ;
140 | #125 = FACE_OUTER_BOUND ( 'NONE', #121, .T. ) ;
141 | #126 = VECTOR ( 'NONE', #506, 1000.000000000000000 ) ;
142 | #127 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 12.50000000000000355 ) ) ;
143 | #128 = EDGE_CURVE ( 'NONE', #651, #517, #1107, .T. ) ;
144 | #129 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -12.50000000000000355 ) ) ;
145 | #130 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
146 | #131 = ORIENTED_EDGE ( 'NONE', *, *, #966, .F. ) ;
147 | #132 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
148 | #133 = VERTEX_POINT ( 'NONE', #1090 ) ;
149 | #134 = VECTOR ( 'NONE', #357, 1000.000000000000000 ) ;
150 | #135 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
151 | #136 = VERTEX_POINT ( 'NONE', #753 ) ;
152 | #137 = CC_DESIGN_APPROVAL ( #361, ( #270 ) ) ;
153 | #138 = ORIENTED_EDGE ( 'NONE', *, *, #1097, .T. ) ;
154 | #139 = EDGE_CURVE ( 'NONE', #698, #992, #801, .T. ) ;
155 | #140 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
156 | #141 = ORIENTED_EDGE ( 'NONE', *, *, #244, .T. ) ;
157 | #142 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
158 | #143 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
159 | #144 = ORIENTED_EDGE ( 'NONE', *, *, #485, .F. ) ;
160 | #145 = EDGE_LOOP ( 'NONE', ( #799, #690, #1008, #932 ) ) ;
161 | #146 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
162 | #147 = EDGE_CURVE ( 'NONE', #84, #539, #223, .T. ) ;
163 | #148 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 31.12000000000003652 ) ) ;
164 | #149 = ADVANCED_FACE ( 'NONE', ( #153 ), #743, .F. ) ;
165 | #150 = VERTEX_POINT ( 'NONE', #1104 ) ;
166 | #151 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
167 | #152 = VERTEX_POINT ( 'NONE', #570 ) ;
168 | #153 = FACE_OUTER_BOUND ( 'NONE', #722, .T. ) ;
169 | #154 = PLANE ( 'NONE', #120 ) ;
170 | #155 = ORIENTED_EDGE ( 'NONE', *, *, #1026, .T. ) ;
171 | #156 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
172 | #157 = VERTEX_POINT ( 'NONE', #493 ) ;
173 | #158 = AXIS2_PLACEMENT_3D ( 'NONE', #534, #713, #537 ) ;
174 | #159 = AXIS2_PLACEMENT_3D ( 'NONE', #79, #757, #334 ) ;
175 | #160 = AXIS2_PLACEMENT_3D ( 'NONE', #208, #201, #17 ) ;
176 | #161 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
177 | #162 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
178 | #163 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
179 | #164 = EDGE_CURVE ( 'NONE', #136, #308, #72, .T. ) ;
180 | #165 = ORIENTED_EDGE ( 'NONE', *, *, #328, .F. ) ;
181 | #166 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #663, #319, ( #270 ) ) ;
182 | #167 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -18.55256701634527161 ) ) ;
183 | #168 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, -33.49999999999996447 ) ) ;
184 | #169 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
185 | #170 = DIRECTION ( 'NONE', ( 8.659560562354937789E-17, 0.7071067811865472397, -0.7071067811865479058 ) ) ;
186 | #171 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
187 | #172 = AXIS2_PLACEMENT_3D ( 'NONE', #833, #577, #315 ) ;
188 | #173 = EDGE_CURVE ( 'NONE', #100, #525, #1098, .T. ) ;
189 | #174 = ORIENTED_EDGE ( 'NONE', *, *, #1040, .T. ) ;
190 | #175 = AXIS2_PLACEMENT_3D ( 'NONE', #924, #132, #991 ) ;
191 | #176 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #1096, #59, ( #1063 ) ) ;
192 | #177 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588235725, 2.000000000000000000, 35.46543516246453720 ) ) ;
193 | #178 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 12.50000000000000355 ) ) ;
194 | #179 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
195 | #180 = ORIENTED_EDGE ( 'NONE', *, *, #310, .F. ) ;
196 | #181 = ADVANCED_FACE ( 'NONE', ( #817 ), #671, .F. ) ;
197 | #182 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
198 | #183 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, -33.49999999999996447 ) ) ;
199 | #184 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
200 | #185 = CIRCLE ( 'NONE', #380, 3.200000000000015277 ) ;
201 | #186 = ORIENTED_EDGE ( 'NONE', *, *, #641, .F. ) ;
202 | #187 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
203 | #188 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
204 | #189 = EDGE_LOOP ( 'NONE', ( #394, #104, #640, #708 ) ) ;
205 | #190 = AXIS2_PLACEMENT_3D ( 'NONE', #759, #945, #352 ) ;
206 | #191 = AXIS2_PLACEMENT_3D ( 'NONE', #469, #718, #383 ) ;
207 | #192 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 6.120000000000036522 ) ) ;
208 | #193 = EDGE_CURVE ( 'NONE', #586, #203, #790, .T. ) ;
209 | #194 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, -16.95256701634527019 ) ) ;
210 | #195 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #650, #823, ( #1063 ) ) ;
211 | #196 = VERTEX_POINT ( 'NONE', #529 ) ;
212 | #197 = CYLINDRICAL_SURFACE ( 'NONE', #500, 35.50000000000000711 ) ;
213 | #198 = FACE_BOUND ( 'NONE', #982, .T. ) ;
214 | #199 = AXIS2_PLACEMENT_3D ( 'NONE', #498, #1078, #741 ) ;
215 | #200 = AXIS2_PLACEMENT_3D ( 'NONE', #951, #169, #1038 ) ;
216 | #201 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
217 | #202 = VECTOR ( 'NONE', #162, 1000.000000000000000 ) ;
218 | #203 = VERTEX_POINT ( 'NONE', #783 ) ;
219 | #204 = PLANE ( 'NONE', #847 ) ;
220 | #205 = ORIENTED_EDGE ( 'NONE', *, *, #206, .F. ) ;
221 | #206 = EDGE_CURVE ( 'NONE', #656, #342, #653, .T. ) ;
222 | #207 = AXIS2_PLACEMENT_3D ( 'NONE', #233, #572, #1004 ) ;
223 | #208 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 0.000000000000000000 ) ) ;
224 | #209 = PLANE ( 'NONE', #1017 ) ;
225 | #210 = CIRCLE ( 'NONE', #442, 35.50000000000000711 ) ;
226 | #211 = ADVANCED_FACE ( 'NONE', ( #358 ), #942, .F. ) ;
227 | #212 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
228 | #213 = ORIENTED_EDGE ( 'NONE', *, *, #268, .F. ) ;
229 | #214 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 21.12439348241742820, 33.50000000000002842 ) ) ;
230 | #215 = APPROVAL_ROLE ( '' ) ;
231 | #216 = VERTEX_POINT ( 'NONE', #264 ) ;
232 | #217 = AXIS2_PLACEMENT_3D ( 'NONE', #639, #976, #807 ) ;
233 | #218 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, -33.49999999999996447 ) ) ;
234 | #219 = ORIENTED_EDGE ( 'NONE', *, *, #485, .T. ) ;
235 | #220 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
236 | #221 = ORIENTED_EDGE ( 'NONE', *, *, #841, .T. ) ;
237 | #222 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
238 | #223 = CIRCLE ( 'NONE', #172, 2.619999999999997442 ) ;
239 | #224 = EDGE_LOOP ( 'NONE', ( #609, #840, #732, #401 ) ) ;
240 | #225 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
241 | #226 = PERSON_AND_ORGANIZATION_ROLE ( 'design_owner' ) ;
242 | #227 = EDGE_CURVE ( 'NONE', #157, #492, #348, .T. ) ;
243 | #228 = EDGE_LOOP ( 'NONE', ( #825, #174, #812, #1084 ) ) ;
244 | #229 = AXIS2_PLACEMENT_3D ( 'NONE', #254, #842, #420 ) ;
245 | #230 = EDGE_LOOP ( 'NONE', ( #667, #724, #737, #444 ) ) ;
246 | #231 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 33.50000000000002842 ) ) ;
247 | #232 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'detail', '', ( #625 ) ) ;
248 | #233 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 18.55256701634533911 ) ) ;
249 | #234 = ORIENTED_EDGE ( 'NONE', *, *, #103, .T. ) ;
250 | #235 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
251 | #236 = SECURITY_CLASSIFICATION_LEVEL ( 'unclassified' ) ;
252 | #237 = ORIENTED_EDGE ( 'NONE', *, *, #471, .T. ) ;
253 | #238 = AXIS2_PLACEMENT_3D ( 'NONE', #770, #854, #182 ) ;
254 | #239 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, -3.000000000000000000, 33.50000000000002842 ) ) ;
255 | #240 = VERTEX_POINT ( 'NONE', #865 ) ;
256 | #241 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
257 | #242 = PERSON_AND_ORGANIZATION_ROLE ( 'classification_officer' ) ;
258 | #243 = ORIENTED_EDGE ( 'NONE', *, *, #490, .T. ) ;
259 | #244 = EDGE_CURVE ( 'NONE', #240, #100, #399, .T. ) ;
260 | #245 = FACE_OUTER_BOUND ( 'NONE', #1059, .T. ) ;
261 | #246 = ORIENTED_EDGE ( 'NONE', *, *, #593, .F. ) ;
262 | #247 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
263 | #248 = CARTESIAN_POINT ( 'NONE', ( 5.204170427930421283E-15, -3.000000000000000000, -33.96689564855758192 ) ) ;
264 | #249 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #730, #658, ( #270 ) ) ;
265 | #250 = ORIENTED_EDGE ( 'NONE', *, *, #471, .F. ) ;
266 | #251 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -12.50000000000000355 ) ) ;
267 | #252 = CIRCLE ( 'NONE', #160, 35.50000000000000711 ) ;
268 | #253 = CIRCLE ( 'NONE', #693, 12.50000000000000355 ) ;
269 | #254 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 3.642919299551294898E-14 ) ) ;
270 | #255 = EDGE_CURVE ( 'NONE', #752, #964, #1027, .T. ) ;
271 | #256 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
272 | #257 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588252823, -3.000000000000000000, -35.46543516246453720 ) ) ;
273 | #258 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, -18.55256701634527161 ) ) ;
274 | #259 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
275 | #260 = AXIS2_PLACEMENT_3D ( 'NONE', #1087, #574, #225 ) ;
276 | #261 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
277 | #262 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
278 | #263 = EDGE_CURVE ( 'NONE', #342, #656, #486, .T. ) ;
279 | #264 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, -25.87999999999996703 ) ) ;
280 | #265 = VERTEX_POINT ( 'NONE', #437 ) ;
281 | #266 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
282 | #267 = FACE_OUTER_BOUND ( 'NONE', #569, .T. ) ;
283 | #268 = EDGE_CURVE ( 'NONE', #100, #964, #701, .T. ) ;
284 | #269 = ORIENTED_EDGE ( 'NONE', *, *, #860, .F. ) ;
285 | #270 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ANY', '', #625, .NOT_KNOWN. ) ;
286 | #271 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
287 | #272 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, 0.000000000000000000 ) ) ;
288 | #273 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, -3.000000000000000000, 3.642919299551294898E-14 ) ) ;
289 | #274 = ORIENTED_EDGE ( 'NONE', *, *, #676, .T. ) ;
290 | #275 = VECTOR ( 'NONE', #710, 1000.000000000000000 ) ;
291 | #276 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 12.50000000000000355 ) ) ;
292 | #277 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, 28.50000000000003908 ) ) ;
293 | #278 = AXIS2_PLACEMENT_3D ( 'NONE', #512, #1035, #259 ) ;
294 | #279 = ORIENTED_EDGE ( 'NONE', *, *, #818, .F. ) ;
295 | #280 = EDGE_CURVE ( 'NONE', #1080, #39, #768, .T. ) ;
296 | #281 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
297 | #282 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #1063 ) ;
298 | #283 = LINE ( 'NONE', #959, #985 ) ;
299 | #284 = ORIENTED_EDGE ( 'NONE', *, *, #86, .T. ) ;
300 | #285 = VECTOR ( 'NONE', #612, 1000.000000000000000 ) ;
301 | #286 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
302 | #287 = CYLINDRICAL_SURFACE ( 'NONE', #1112, 2.619999999999997442 ) ;
303 | #288 = ORIENTED_EDGE ( 'NONE', *, *, #905, .F. ) ;
304 | #289 = PLANE ( 'NONE', #1075 ) ;
305 | #290 = ORIENTED_EDGE ( 'NONE', *, *, #456, .T. ) ;
306 | #291 = FACE_BOUND ( 'NONE', #465, .T. ) ;
307 | #292 = EDGE_CURVE ( 'NONE', #1080, #306, #6, .T. ) ;
308 | #293 = ORIENTED_EDGE ( 'NONE', *, *, #1042, .T. ) ;
309 | #294 = ADVANCED_FACE ( 'NONE', ( #448 ), #107, .F. ) ;
310 | #295 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
311 | #296 = VERTEX_POINT ( 'NONE', #1033 ) ;
312 | #297 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
313 | #298 = ADVANCED_FACE ( 'NONE', ( #267 ), #441, .F. ) ;
314 | #299 = VECTOR ( 'NONE', #981, 1000.000000000000000 ) ;
315 | #300 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, -3.000000000000000000, 33.50000000000002842 ) ) ;
316 | #301 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
317 | #302 = CC_DESIGN_APPROVAL ( #40, ( #979 ) ) ;
318 | #303 = ORIENTED_EDGE ( 'NONE', *, *, #1091, .T. ) ;
319 | #304 = LINE ( 'NONE', #1093, #946 ) ;
320 | #305 = AXIS2_PLACEMENT_3D ( 'NONE', #277, #869, #598 ) ;
321 | #306 = VERTEX_POINT ( 'NONE', #12 ) ;
322 | #307 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -13.49999999999996980 ) ) ;
323 | #308 = VERTEX_POINT ( 'NONE', #1115 ) ;
324 | #309 = LINE ( 'NONE', #148, #745 ) ;
325 | #310 = EDGE_CURVE ( 'NONE', #368, #1103, #1046, .T. ) ;
326 | #311 = ORIENTED_EDGE ( 'NONE', *, *, #14, .F. ) ;
327 | #312 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
328 | #313 = ORIENTED_EDGE ( 'NONE', *, *, #528, .T. ) ;
329 | #314 = ORIENTED_EDGE ( 'NONE', *, *, #1114, .T. ) ;
330 | #315 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
331 | #316 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
332 | #317 = ORIENTED_EDGE ( 'NONE', *, *, #688, .F. ) ;
333 | #318 = PLANE ( 'NONE', #824 ) ;
334 | #319 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
335 | #320 = ORIENTED_EDGE ( 'NONE', *, *, #449, .F. ) ;
336 | #321 = VECTOR ( 'NONE', #526, 1000.000000000000000 ) ;
337 | #322 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
338 | #323 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
339 | #324 = FACE_OUTER_BOUND ( 'NONE', #628, .T. ) ;
340 | #325 = LINE ( 'NONE', #1006, #63 ) ;
341 | #326 = APPROVAL_DATE_TIME ( #389, #361 ) ;
342 | #327 = ORIENTED_EDGE ( 'NONE', *, *, #1114, .F. ) ;
343 | #328 = EDGE_CURVE ( 'NONE', #196, #450, #602, .T. ) ;
344 | #329 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
345 | #330 = VERTEX_POINT ( 'NONE', #763 ) ;
346 | #331 = CYLINDRICAL_SURFACE ( 'NONE', #886, 1.600000000000000755 ) ;
347 | #332 = EDGE_LOOP ( 'NONE', ( #78, #911, #599, #576 ) ) ;
348 | #333 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
349 | #334 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
350 | #335 = FACE_OUTER_BOUND ( 'NONE', #711, .T. ) ;
351 | #336 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
352 | #337 = VECTOR ( 'NONE', #954, 1000.000000000000000 ) ;
353 | #338 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
354 | #339 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
355 | #340 = PLANE ( 'NONE', #550 ) ;
356 | #341 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.7071067811865472397, 0.7071067811865479058 ) ) ;
357 | #342 = VERTEX_POINT ( 'NONE', #519 ) ;
358 | #343 = PLANE ( 'NONE', #435 ) ;
359 | #344 = AXIS2_PLACEMENT_3D ( 'NONE', #77, #489, #142 ) ;
360 | #345 = LINE ( 'NONE', #771, #778 ) ;
361 | #346 = EDGE_CURVE ( 'NONE', #157, #698, #682, .T. ) ;
362 | #347 = APPROVAL_ROLE ( '' ) ;
363 | #348 = LINE ( 'NONE', #94, #427 ) ;
364 | #349 = AXIS2_PLACEMENT_3D ( 'NONE', #353, #184, #689 ) ;
365 | #350 = ORIENTED_EDGE ( 'NONE', *, *, #953, .F. ) ;
366 | #351 = FACE_OUTER_BOUND ( 'NONE', #1002, .T. ) ;
367 | #352 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
368 | #353 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 18.55256701634533911 ) ) ;
369 | #354 = VECTOR ( 'NONE', #917, 1000.000000000000000 ) ;
370 | #355 = ORIENTED_EDGE ( 'NONE', *, *, #428, .F. ) ;
371 | #356 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 0.000000000000000000 ) ) ;
372 | #357 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
373 | #358 = FACE_OUTER_BOUND ( 'NONE', #189, .T. ) ;
374 | #359 = ADVANCED_FACE ( 'NONE', ( #125 ), #33, .F. ) ;
375 | #360 = ORIENTED_EDGE ( 'NONE', *, *, #280, .F. ) ;
376 | #361 = APPROVAL ( #920, 'UNSPECIFIED' ) ;
377 | #362 = VECTOR ( 'NONE', #179, 1000.000000000000000 ) ;
378 | #363 = CYLINDRICAL_SURFACE ( 'NONE', #158, 2.619999999999997442 ) ;
379 | #364 = VERTEX_POINT ( 'NONE', #455 ) ;
380 | #365 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
381 | #366 = ORIENTED_EDGE ( 'NONE', *, *, #263, .T. ) ;
382 | #367 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 0.000000000000000000 ) ) ;
383 | #368 = VERTEX_POINT ( 'NONE', #116 ) ;
384 | #369 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -13.49999999999996980 ) ) ;
385 | #370 = ORIENTED_EDGE ( 'NONE', *, *, #909, .F. ) ;
386 | #371 = AXIS2_PLACEMENT_3D ( 'NONE', #231, #916, #484 ) ;
387 | #372 = APPROVAL_PERSON_ORGANIZATION ( #44, #443, #215 ) ;
388 | #373 = CYLINDRICAL_SURFACE ( 'NONE', #8, 1.500000000000001332 ) ;
389 | #374 = ADVANCED_FACE ( 'NONE', ( #983 ), #204, .F. ) ;
390 | #375 = LINE ( 'NONE', #797, #677 ) ;
391 | #376 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
392 | #377 = ADVANCED_FACE ( 'NONE', ( #119 ), #546, .F. ) ;
393 | #378 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
394 | #379 = VERTEX_POINT ( 'NONE', #1056 ) ;
395 | #380 = AXIS2_PLACEMENT_3D ( 'NONE', #258, #62, #678 ) ;
396 | #381 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
397 | #382 = ORIENTED_EDGE ( 'NONE', *, *, #47, .T. ) ;
398 | #383 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
399 | #384 = ORIENTED_EDGE ( 'NONE', *, *, #841, .F. ) ;
400 | #385 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 25.88000000000004164 ) ) ;
401 | #386 = ORIENTED_EDGE ( 'NONE', *, *, #772, .F. ) ;
402 | #387 = AXIS2_PLACEMENT_3D ( 'NONE', #895, #402, #837 ) ;
403 | #388 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
404 | #389 = DATE_AND_TIME ( #1088, #1092 ) ;
405 | #390 = ORIENTED_EDGE ( 'NONE', *, *, #1055, .F. ) ;
406 | #391 = EDGE_CURVE ( 'NONE', #1103, #517, #891, .T. ) ;
407 | #392 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
408 | #393 = EDGE_CURVE ( 'NONE', #829, #1080, #283, .T. ) ;
409 | #394 = ORIENTED_EDGE ( 'NONE', *, *, #818, .T. ) ;
410 | #395 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
411 | #396 = VERTEX_POINT ( 'NONE', #624 ) ;
412 | #397 = EDGE_LOOP ( 'NONE', ( #975, #1028, #95, #1052 ) ) ;
413 | #398 = CIRCLE ( 'NONE', #199, 1.600000000000000755 ) ;
414 | #399 = CIRCLE ( 'NONE', #349, 1.600000000000000755 ) ;
415 | #400 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
416 | #401 = ORIENTED_EDGE ( 'NONE', *, *, #415, .T. ) ;
417 | #402 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
418 | #403 = AXIS2_PLACEMENT_3D ( 'NONE', #644, #51, #747 ) ;
419 | #404 = ORIENTED_EDGE ( 'NONE', *, *, #139, .T. ) ;
420 | #405 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, -3.000000000000000000, 3.642919299551294898E-14 ) ) ;
421 | #406 = EDGE_LOOP ( 'NONE', ( #740, #144, #1089, #71 ) ) ;
422 | #407 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
423 | #408 = EDGE_CURVE ( 'NONE', #651, #547, #535, .T. ) ;
424 | #409 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #683 ) ;
425 | #410 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -31.11999999999997257 ) ) ;
426 | #411 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
427 | #412 = ORIENTED_EDGE ( 'NONE', *, *, #123, .T. ) ;
428 | #413 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, 20.15256701634534053 ) ) ;
429 | #414 = APPLICATION_PROTOCOL_DEFINITION ( 'international standard', 'config_control_design', 1994, #1109 ) ;
430 | #415 = EDGE_CURVE ( 'NONE', #661, #152, #375, .T. ) ;
431 | #416 = ORIENTED_EDGE ( 'NONE', *, *, #456, .F. ) ;
432 | #417 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, -18.55256701634527161 ) ) ;
433 | #418 = AXIS2_PLACEMENT_3D ( 'NONE', #613, #853, #89 ) ;
434 | #419 = CLOSED_SHELL ( 'NONE', ( #803, #955, #848, #294, #377, #555, #298, #786, #460, #798, #756, #795, #359, #70, #1003, #943, #495, #634, #636, #784, #181, #38, #211, #5, #543, #923, #990, #28, #149, #1009, #453, #511, #838, #112, #863, #374 ) ) ;
435 | #420 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
436 | #421 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 0.000000000000000000, -13.49999999999996980 ) ) ;
437 | #422 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, -3.000000000000000000, 6.120000000000036522 ) ) ;
438 | #423 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 33.50000000000002842 ) ) ;
439 | #424 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
440 | #425 = VECTOR ( 'NONE', #852, 1000.000000000000000 ) ;
441 | #426 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, -18.55256701634527161 ) ) ;
442 | #427 = VECTOR ( 'NONE', #875, 1000.000000000000000 ) ;
443 | #428 = EDGE_CURVE ( 'NONE', #308, #216, #476, .T. ) ;
444 | #429 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 21.12439348241742820, 13.50000000000003908 ) ) ;
445 | #430 = PLANE ( 'NONE', #190 ) ;
446 | #431 = EDGE_CURVE ( 'NONE', #379, #792, #540, .T. ) ;
447 | #432 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
448 | #433 = ORIENTED_EDGE ( 'NONE', *, *, #973, .F. ) ;
449 | #434 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
450 | #435 = AXIS2_PLACEMENT_3D ( 'NONE', #861, #605, #434 ) ;
451 | #436 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
452 | #437 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, -21.75256701634528511 ) ) ;
453 | #438 = ORIENTED_EDGE ( 'NONE', *, *, #765, .T. ) ;
454 | #439 = PLANE ( 'NONE', #1064 ) ;
455 | #440 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
456 | #441 = CYLINDRICAL_SURFACE ( 'NONE', #80, 1.600000000000000755 ) ;
457 | #442 = AXIS2_PLACEMENT_3D ( 'NONE', #36, #878, #114 ) ;
458 | #443 = APPROVAL ( #814, 'UNSPECIFIED' ) ;
459 | #444 = ORIENTED_EDGE ( 'NONE', *, *, #470, .T. ) ;
460 | #445 = LOCAL_TIME ( 10, 4, 46.00000000000000000, #510 ) ;
461 | #446 = AXIS2_PLACEMENT_3D ( 'NONE', #23, #32, #381 ) ;
462 | #447 = FACE_OUTER_BOUND ( 'NONE', #1094, .T. ) ;
463 | #448 = FACE_OUTER_BOUND ( 'NONE', #7, .T. ) ;
464 | #449 = EDGE_CURVE ( 'NONE', #152, #664, #1066, .T. ) ;
465 | #450 = VERTEX_POINT ( 'NONE', #43 ) ;
466 | #451 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, -13.49999999999996980 ) ) ;
467 | #452 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
468 | #453 = ADVANCED_FACE ( 'NONE', ( #729 ), #287, .F. ) ;
469 | #454 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 33.96689564855758192 ) ) ;
470 | #455 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 33.96689564855758192 ) ) ;
471 | #456 = EDGE_CURVE ( 'NONE', #50, #900, #46, .T. ) ;
472 | #457 = ORGANIZATION ( 'UNSPECIFIED', 'UNSPECIFIED', '' ) ;
473 | #458 = LINE ( 'NONE', #716, #13 ) ;
474 | #459 = ORIENTED_EDGE ( 'NONE', *, *, #1060, .F. ) ;
475 | #460 = ADVANCED_FACE ( 'NONE', ( #616, #198, #1070, #885, #1061, #291, #464, #629 ), #209, .T. ) ;
476 | #461 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 28.50000000000003908 ) ) ;
477 | #462 = FACE_OUTER_BOUND ( 'NONE', #782, .T. ) ;
478 | #463 = ORIENTED_EDGE ( 'NONE', *, *, #292, .T. ) ;
479 | #464 = FACE_BOUND ( 'NONE', #483, .T. ) ;
480 | #465 = EDGE_LOOP ( 'NONE', ( #1, #877 ) ) ;
481 | #466 = AXIS2_PLACEMENT_3D ( 'NONE', #521, #1043, #271 ) ;
482 | #467 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
483 | #468 = ORIENTED_EDGE ( 'NONE', *, *, #1091, .F. ) ;
484 | #469 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, -28.49999999999997158 ) ) ;
485 | #470 = EDGE_CURVE ( 'NONE', #475, #525, #620, .T. ) ;
486 | #471 = EDGE_CURVE ( 'NONE', #118, #34, #538, .T. ) ;
487 | #472 = AXIS2_PLACEMENT_3D ( 'NONE', #692, #424, #1036 ) ;
488 | #473 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, -20.15256701634527303 ) ) ;
489 | #474 = LOCAL_TIME ( 10, 4, 46.00000000000000000, #681 ) ;
490 | #475 = VERTEX_POINT ( 'NONE', #933 ) ;
491 | #476 = CIRCLE ( 'NONE', #191, 2.620000000000004103 ) ;
492 | #477 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
493 | #478 = ORIENTED_EDGE ( 'NONE', *, *, #754, .T. ) ;
494 | #479 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
495 | #480 = EDGE_LOOP ( 'NONE', ( #141, #898, #67, #645 ) ) ;
496 | #481 = FACE_OUTER_BOUND ( 'NONE', #764, .T. ) ;
497 | #482 = MECHANICAL_CONTEXT ( 'NONE', #1109, 'mechanical' ) ;
498 | #483 = EDGE_LOOP ( 'NONE', ( #935, #573 ) ) ;
499 | #484 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
500 | #485 = EDGE_CURVE ( 'NONE', #157, #150, #398, .T. ) ;
501 | #486 = CIRCLE ( 'NONE', #542, 2.619999999999997442 ) ;
502 | #487 = CYLINDRICAL_SURFACE ( 'NONE', #934, 1.600000000000000755 ) ;
503 | #488 = ORIENTED_EDGE ( 'NONE', *, *, #310, .T. ) ;
504 | #489 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
505 | #490 = EDGE_CURVE ( 'NONE', #547, #118, #735, .T. ) ;
506 | #491 = AXIS2_PLACEMENT_3D ( 'NONE', #1001, #241, #395 ) ;
507 | #492 = VERTEX_POINT ( 'NONE', #751 ) ;
508 | #493 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -16.95256701634527019 ) ) ;
509 | #494 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
510 | #495 = ADVANCED_FACE ( 'NONE', ( #1095 ), #919, .F. ) ;
511 | #496 = ORIENTED_EDGE ( 'NONE', *, *, #263, .F. ) ;
512 | #497 = VECTOR ( 'NONE', #187, 1000.000000000000000 ) ;
513 | #498 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -18.55256701634527161 ) ) ;
514 | #499 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
515 | #500 = AXIS2_PLACEMENT_3D ( 'NONE', #1050, #281, #549 ) ;
516 | #501 = LINE ( 'NONE', #1105, #960 ) ;
517 | #502 = MANIFOLD_SOLID_BREP ( 'Cut-Extrude6', #419 ) ;
518 | #503 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
519 | #504 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, -12.50000000000000355 ) ) ;
520 | #505 = ORIENTED_EDGE ( 'NONE', *, *, #255, .T. ) ;
521 | #506 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
522 | #507 = AXIS2_PLACEMENT_3D ( 'NONE', #804, #452, #965 ) ;
523 | #508 = FACE_OUTER_BOUND ( 'NONE', #866, .T. ) ;
524 | #509 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
525 | #510 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
526 | #511 = ADVANCED_FACE ( 'NONE', ( #662 ), #318, .T. ) ;
527 | #512 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 0.000000000000000000 ) ) ;
528 | #513 = LINE ( 'NONE', #272, #617 ) ;
529 | #514 = VECTOR ( 'NONE', #146, 1000.000000000000000 ) ;
530 | #515 = CALENDAR_DATE ( 2022, 2, 5 ) ;
531 | #516 = AXIS2_PLACEMENT_3D ( 'NONE', #646, #564, #222 ) ;
532 | #517 = VERTEX_POINT ( 'NONE', #504 ) ;
533 | #518 = LINE ( 'NONE', #855, #337 ) ;
534 | #519 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, 25.88000000000004164 ) ) ;
535 | #520 = ORIENTED_EDGE ( 'NONE', *, *, #874, .F. ) ;
536 | #521 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 0.000000000000000000 ) ) ;
537 | #522 = AXIS2_PLACEMENT_3D ( 'NONE', #167, #851, #850 ) ;
538 | #523 = LINE ( 'NONE', #178, #908 ) ;
539 | #524 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
540 | #525 = VERTEX_POINT ( 'NONE', #413 ) ;
541 | #526 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
542 | #527 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, -3.000000000000000000, -13.49999999999996980 ) ) ;
543 | #528 = EDGE_CURVE ( 'NONE', #992, #698, #967, .T. ) ;
544 | #529 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, -33.49999999999996447 ) ) ;
545 | #530 = VECTOR ( 'NONE', #212, 1000.000000000000000 ) ;
546 | #531 = EDGE_LOOP ( 'NONE', ( #590, #821, #293, #366 ) ) ;
547 | #532 = VECTOR ( 'NONE', #714, 1000.000000000000000 ) ;
548 | #533 = CONICAL_SURFACE ( 'NONE', #207, 1.600000000000000755, 0.7853981633974488341 ) ;
549 | #534 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 28.50000000000003908 ) ) ;
550 | #535 = LINE ( 'NONE', #129, #896 ) ;
551 | #536 = EDGE_LOOP ( 'NONE', ( #553, #922, #956, #21 ) ) ;
552 | #537 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
553 | #538 = CIRCLE ( 'NONE', #881, 1.500000000000001332 ) ;
554 | #539 = VERTEX_POINT ( 'NONE', #830 ) ;
555 | #540 = LINE ( 'NONE', #214, #532 ) ;
556 | #541 = EDGE_LOOP ( 'NONE', ( #303, #505 ) ) ;
557 | #542 = AXIS2_PLACEMENT_3D ( 'NONE', #705, #1024, #774 ) ;
558 | #543 = ADVANCED_FACE ( 'NONE', ( #481 ), #331, .F. ) ;
559 | #544 = AXIS2_PLACEMENT_3D ( 'NONE', #567, #733, #312 ) ;
560 | #545 = FACE_OUTER_BOUND ( 'NONE', #536, .T. ) ;
561 | #546 = CYLINDRICAL_SURFACE ( 'NONE', #507, 2.620000000000004103 ) ;
562 | #547 = VERTEX_POINT ( 'NONE', #668 ) ;
563 | #548 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #844 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #1053, #499, #589 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
564 | #549 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
565 | #550 = AXIS2_PLACEMENT_3D ( 'NONE', #106, #261, #436 ) ;
566 | #551 = ORIENTED_EDGE ( 'NONE', *, *, #128, .F. ) ;
567 | #552 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
568 | #553 = ORIENTED_EDGE ( 'NONE', *, *, #55, .F. ) ;
569 | #554 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
570 | #555 = ADVANCED_FACE ( 'NONE', ( #903 ), #1012, .F. ) ;
571 | #556 = ORIENTED_EDGE ( 'NONE', *, *, #860, .T. ) ;
572 | #557 = VECTOR ( 'NONE', #558, 1000.000000000000000 ) ;
573 | #558 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
574 | #559 = CC_DESIGN_DATE_AND_TIME_ASSIGNMENT ( #856, #601, ( #979 ) ) ;
575 | #560 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
576 | #561 = ORIENTED_EDGE ( 'NONE', *, *, #876, .T. ) ;
577 | #562 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
578 | #563 = EDGE_LOOP ( 'NONE', ( #952, #719 ) ) ;
579 | #564 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
580 | #565 = CIRCLE ( 'NONE', #159, 3.200000000000015277 ) ;
581 | #566 = ORIENTED_EDGE ( 'NONE', *, *, #415, .F. ) ;
582 | #567 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 28.50000000000003908 ) ) ;
583 | #568 = ORIENTED_EDGE ( 'NONE', *, *, #193, .T. ) ;
584 | #569 = EDGE_LOOP ( 'NONE', ( #870, #816, #404, #288 ) ) ;
585 | #570 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, -13.49999999999996980 ) ) ;
586 | #571 = EDGE_CURVE ( 'NONE', #39, #379, #845, .T. ) ;
587 | #572 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
588 | #573 = ORIENTED_EDGE ( 'NONE', *, *, #139, .F. ) ;
589 | #574 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
590 | #575 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
591 | #576 = ORIENTED_EDGE ( 'NONE', *, *, #255, .F. ) ;
592 | #577 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
593 | #578 = CONICAL_SURFACE ( 'NONE', #522, 1.600000000000000755, 0.7853981633974488341 ) ;
594 | #579 = EDGE_CURVE ( 'NONE', #664, #133, #325, .T. ) ;
595 | #580 = CYLINDRICAL_SURFACE ( 'NONE', #1039, 2.620000000000004103 ) ;
596 | #581 = ORIENTED_EDGE ( 'NONE', *, *, #676, .F. ) ;
597 | #582 = PLANE ( 'NONE', #684 ) ;
598 | #583 = ORIENTED_EDGE ( 'NONE', *, *, #571, .F. ) ;
599 | #584 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -35.46689564855758192 ) ) ;
600 | #585 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, 21.75256701634535617 ) ) ;
601 | #586 = VERTEX_POINT ( 'NONE', #422 ) ;
602 | #587 = AXIS2_PLACEMENT_3D ( 'NONE', #494, #828, #666 ) ;
603 | #588 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
604 | #589 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
605 | #590 = ORIENTED_EDGE ( 'NONE', *, *, #1040, .F. ) ;
606 | #591 = CIRCLE ( 'NONE', #633, 1.500000000000001332 ) ;
607 | #592 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, -3.000000000000000000, 33.96689564855758192 ) ) ;
608 | #593 = EDGE_CURVE ( 'NONE', #728, #368, #971, .T. ) ;
609 | #594 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
610 | #595 = EDGE_CURVE ( 'NONE', #829, #379, #657, .T. ) ;
611 | #596 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588235725, 2.000000000000000000, -35.46543516246453720 ) ) ;
612 | #597 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
613 | #598 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
614 | #599 = ORIENTED_EDGE ( 'NONE', *, *, #268, .T. ) ;
615 | #600 = FACE_OUTER_BOUND ( 'NONE', #1072, .T. ) ;
616 | #601 = DATE_TIME_ROLE ( 'classification_date' ) ;
617 | #602 = LINE ( 'NONE', #947, #362 ) ;
618 | #603 = AXIS2_PLACEMENT_3D ( 'NONE', #130, #904, #143 ) ;
619 | #604 = VERTEX_POINT ( 'NONE', #813 ) ;
620 | #605 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
621 | #606 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -12.50000000000000355 ) ) ;
622 | #607 = SHAPE_DEFINITION_REPRESENTATION ( #282, #64 ) ;
623 | #608 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, 18.55256701634533911 ) ) ;
624 | #609 = ORIENTED_EDGE ( 'NONE', *, *, #449, .T. ) ;
625 | #610 = EDGE_CURVE ( 'NONE', #136, #396, #687, .T. ) ;
626 | #611 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 31.12000000000003652 ) ) ;
627 | #612 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
628 | #613 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, -3.000000000000000000, -33.96689564855758192 ) ) ;
629 | #614 = ORIENTED_EDGE ( 'NONE', *, *, #720, .T. ) ;
630 | #615 = CYLINDRICAL_SURFACE ( 'NONE', #446, 12.50000000000000355 ) ;
631 | #616 = FACE_BOUND ( 'NONE', #978, .T. ) ;
632 | #617 = VECTOR ( 'NONE', #266, 1000.000000000000000 ) ;
633 | #618 = CIRCLE ( 'NONE', #793, 6.120000000000000107 ) ;
634 | #619 = ORIENTED_EDGE ( 'NONE', *, *, #1074, .F. ) ;
635 | #620 = CIRCLE ( 'NONE', #387, 1.600000000000000755 ) ;
636 | #621 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
637 | #622 = ORIENTED_EDGE ( 'NONE', *, *, #579, .F. ) ;
638 | #623 = EDGE_CURVE ( 'NONE', #539, #84, #1029, .T. ) ;
639 | #624 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -25.87999999999996703 ) ) ;
640 | #625 = PRODUCT ( 'base swivel cap V2', 'base swivel cap V2', '', ( #482 ) ) ;
641 | #626 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #575, #242, ( #979 ) ) ;
642 | #627 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
643 | #628 = EDGE_LOOP ( 'NONE', ( #1086, #643, #54, #742 ) ) ;
644 | #629 = FACE_OUTER_BOUND ( 'NONE', #715, .T. ) ;
645 | #630 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -18.55256701634527161 ) ) ;
646 | #631 = ORIENTED_EDGE ( 'NONE', *, *, #431, .F. ) ;
647 | #632 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, 33.96689564855758192 ) ) ;
648 | #633 = AXIS2_PLACEMENT_3D ( 'NONE', #592, #336, #597 ) ;
649 | #634 = ADVANCED_FACE ( 'NONE', ( #993 ), #582, .F. ) ;
650 | #635 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
651 | #636 = ADVANCED_FACE ( 'NONE', ( #600 ), #430, .F. ) ;
652 | #637 = CONICAL_SURFACE ( 'NONE', #74, 1.600000000000000755, 0.7853981633974488341 ) ;
653 | #638 = ORIENTED_EDGE ( 'NONE', *, *, #754, .F. ) ;
654 | #639 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 35.50000000000000711 ) ) ;
655 | #640 = ORIENTED_EDGE ( 'NONE', *, *, #393, .F. ) ;
656 | #641 = EDGE_CURVE ( 'NONE', #133, #296, #102, .T. ) ;
657 | #642 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
658 | #643 = ORIENTED_EDGE ( 'NONE', *, *, #595, .F. ) ;
659 | #644 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, 18.55256701634533911 ) ) ;
660 | #645 = ORIENTED_EDGE ( 'NONE', *, *, #659, .F. ) ;
661 | #646 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, 18.55256701634533911 ) ) ;
662 | #647 = ORIENTED_EDGE ( 'NONE', *, *, #893, .F. ) ;
663 | #648 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 28.50000000000003908 ) ) ;
664 | #649 = EDGE_CURVE ( 'NONE', #396, #136, #760, .T. ) ;
665 | #650 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
666 | #651 = VERTEX_POINT ( 'NONE', #606 ) ;
667 | #652 = ORIENTED_EDGE ( 'NONE', *, *, #1110, .T. ) ;
668 | #653 = CIRCLE ( 'NONE', #305, 2.619999999999997442 ) ;
669 | #654 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 3.642919299551294898E-14 ) ) ;
670 | #655 = VECTOR ( 'NONE', #316, 1000.000000000000000 ) ;
671 | #656 = VERTEX_POINT ( 'NONE', #938 ) ;
672 | #657 = LINE ( 'NONE', #58, #2 ) ;
673 | #658 = PERSON_AND_ORGANIZATION_ROLE ( 'design_supplier' ) ;
674 | #659 = EDGE_CURVE ( 'NONE', #240, #475, #1045, .T. ) ;
675 | #660 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
676 | #661 = VERTEX_POINT ( 'NONE', #183 ) ;
677 | #662 = FACE_OUTER_BOUND ( 'NONE', #948, .T. ) ;
678 | #663 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
679 | #664 = VERTEX_POINT ( 'NONE', #1113 ) ;
680 | #665 = VECTOR ( 'NONE', #843, 1000.000000000000000 ) ;
681 | #666 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
682 | #667 = ORIENTED_EDGE ( 'NONE', *, *, #173, .F. ) ;
683 | #668 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
684 | #669 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
685 | #670 = ORIENTED_EDGE ( 'NONE', *, *, #164, .F. ) ;
686 | #671 = PLANE ( 'NONE', #371 ) ;
687 | #672 = EDGE_CURVE ( 'NONE', #57, #997, #862, .T. ) ;
688 | #673 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
689 | #674 = LINE ( 'NONE', #867, #665 ) ;
690 | #675 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
691 | #676 = EDGE_CURVE ( 'NONE', #306, #775, #513, .T. ) ;
692 | #677 = VECTOR ( 'NONE', #899, 1000.000000000000000 ) ;
693 | #678 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
694 | #679 = LINE ( 'NONE', #596, #1102 ) ;
695 | #680 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588234171, -3.000000000000000000, 35.46543516246453720 ) ) ;
696 | #681 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
697 | #682 = LINE ( 'NONE', #194, #557 ) ;
698 | #683 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
699 | #684 = AXIS2_PLACEMENT_3D ( 'NONE', #926, #912, #440 ) ;
700 | #685 = VERTEX_POINT ( 'NONE', #680 ) ;
701 | #686 = DIRECTION ( 'NONE', ( 8.659560562354937789E-17, 0.7071067811865472397, -0.7071067811865479058 ) ) ;
702 | #687 = CIRCLE ( 'NONE', #491, 2.620000000000004103 ) ;
703 | #688 = EDGE_CURVE ( 'NONE', #450, #133, #767, .T. ) ;
704 | #689 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
705 | #690 = ORIENTED_EDGE ( 'NONE', *, *, #610, .F. ) ;
706 | #691 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
707 | #692 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -28.49999999999997158 ) ) ;
708 | #693 = AXIS2_PLACEMENT_3D ( 'NONE', #367, #789, #707 ) ;
709 | #694 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 20.15256701634534053 ) ) ;
710 | #695 = EDGE_CURVE ( 'NONE', #997, #364, #523, .T. ) ;
711 | #696 = CC_DESIGN_SECURITY_CLASSIFICATION ( #979, ( #270 ) ) ;
712 | #697 = VECTOR ( 'NONE', #1054, 1000.000000000000000 ) ;
713 | #698 = VERTEX_POINT ( 'NONE', #950 ) ;
714 | #699 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
715 | #700 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, 15.35256701634532561 ) ) ;
716 | #701 = LINE ( 'NONE', #694, #969 ) ;
717 | #702 = EDGE_LOOP ( 'NONE', ( #15, #1000 ) ) ;
718 | #703 = FACE_OUTER_BOUND ( 'NONE', #332, .T. ) ;
719 | #704 = ORIENTED_EDGE ( 'NONE', *, *, #641, .T. ) ;
720 | #705 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, 28.50000000000003908 ) ) ;
721 | #706 = ORIENTED_EDGE ( 'NONE', *, *, #391, .T. ) ;
722 | #707 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
723 | #708 = ORIENTED_EDGE ( 'NONE', *, *, #66, .T. ) ;
724 | #709 = AXIS2_PLACEMENT_3D ( 'NONE', #417, #322, #85 ) ;
725 | #710 = DIRECTION ( 'NONE', ( -1.616184756637943103E-16, 0.000000000000000000, 1.000000000000000000 ) ) ;
726 | #711 = EDGE_LOOP ( 'NONE', ( #1047, #45 ) ) ;
727 | #712 = CIRCLE ( 'NONE', #516, 1.600000000000000755 ) ;
728 | #713 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
729 | #714 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
730 | #715 = EDGE_LOOP ( 'NONE', ( #382, #815, #884, #832, #796, #488, #706 ) ) ;
731 | #716 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 33.96689564855758192 ) ) ;
732 | #717 = VECTOR ( 'NONE', #699, 1000.000000000000000 ) ;
733 | #718 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
734 | #719 = ORIENTED_EDGE ( 'NONE', *, *, #193, .F. ) ;
735 | #720 = EDGE_CURVE ( 'NONE', #880, #203, #868, .T. ) ;
736 | #721 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
737 | #722 = EDGE_LOOP ( 'NONE', ( #890, #459, #614, #76 ) ) ;
738 | #723 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
739 | #724 = ORIENTED_EDGE ( 'NONE', *, *, #930, .T. ) ;
740 | #725 = EDGE_CURVE ( 'NONE', #150, #265, #93, .T. ) ;
741 | #726 = CIRCLE ( 'NONE', #873, 6.120000000000000107 ) ;
742 | #727 = FACE_OUTER_BOUND ( 'NONE', #145, .T. ) ;
743 | #728 = VERTEX_POINT ( 'NONE', #257 ) ;
744 | #729 = FACE_OUTER_BOUND ( 'NONE', #531, .T. ) ;
745 | #730 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
746 | #731 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
747 | #732 = ORIENTED_EDGE ( 'NONE', *, *, #1074, .T. ) ;
748 | #733 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
749 | #734 = DATE_AND_TIME ( #52, #762 ) ;
750 | #735 = CIRCLE ( 'NONE', #260, 1.500000000000001332 ) ;
751 | #736 = ORIENTED_EDGE ( 'NONE', *, *, #695, .F. ) ;
752 | #737 = ORIENTED_EDGE ( 'NONE', *, *, #659, .T. ) ;
753 | #738 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 0.000000000000000000, -33.49999999999996447 ) ) ;
754 | #739 = EDGE_CURVE ( 'NONE', #1103, #547, #518, .T. ) ;
755 | #740 = ORIENTED_EDGE ( 'NONE', *, *, #725, .F. ) ;
756 | #741 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
757 | #742 = ORIENTED_EDGE ( 'NONE', *, *, #280, .T. ) ;
758 | #743 = CYLINDRICAL_SURFACE ( 'NONE', #90, 6.120000000000000107 ) ;
759 | #744 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 3.642919299551294898E-14 ) ) ;
760 | #745 = VECTOR ( 'NONE', #731, 1000.000000000000000 ) ;
761 | #746 = ORIENTED_EDGE ( 'NONE', *, *, #408, .F. ) ;
762 | #747 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
763 | #748 = CALENDAR_DATE ( 2022, 2, 5 ) ;
764 | #749 = LINE ( 'NONE', #819, #1015 ) ;
765 | #750 = ORIENTED_EDGE ( 'NONE', *, *, #346, .F. ) ;
766 | #751 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 2.000000000000000000, -15.35256701634525633 ) ) ;
767 | #752 = VERTEX_POINT ( 'NONE', #700 ) ;
768 | #753 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -31.11999999999997257 ) ) ;
769 | #754 = EDGE_CURVE ( 'NONE', #296, #196, #777, .T. ) ;
770 | #755 = CIRCLE ( 'NONE', #238, 1.600000000000000755 ) ;
771 | #756 = ADVANCED_FACE ( 'NONE', ( #97 ), #340, .F. ) ;
772 | #757 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
773 | #758 = PLANE ( 'NONE', #466 ) ;
774 | #759 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -33.49999999999996447 ) ) ;
775 | #760 = CIRCLE ( 'NONE', #472, 2.620000000000004103 ) ;
776 | #761 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
777 | #762 = LOCAL_TIME ( 10, 4, 46.00000000000000000, #913 ) ;
778 | #763 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 6.120000000000036522 ) ) ;
779 | #764 = EDGE_LOOP ( 'NONE', ( #750, #219, #1062, #313 ) ) ;
780 | #765 = EDGE_CURVE ( 'NONE', #240, #752, #345, .T. ) ;
781 | #766 = FACE_BOUND ( 'NONE', #541, .T. ) ;
782 | #767 = LINE ( 'NONE', #1019, #285 ) ;
783 | #768 = LINE ( 'NONE', #939, #883 ) ;
784 | #769 = EDGE_LOOP ( 'NONE', ( #124, #944, #849, #746 ) ) ;
785 | #770 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -18.55256701634527161 ) ) ;
786 | #771 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 16.95256701634534124 ) ) ;
787 | #772 = EDGE_CURVE ( 'NONE', #364, #685, #591, .T. ) ;
788 | #773 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
789 | #774 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
790 | #775 = VERTEX_POINT ( 'NONE', #941 ) ;
791 | #776 = LINE ( 'NONE', #1030, #921 ) ;
792 | #777 = LINE ( 'NONE', #168, #497 ) ;
793 | #778 = VECTOR ( 'NONE', #686, 1000.000000000000000 ) ;
794 | #779 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
795 | #780 = EDGE_LOOP ( 'NONE', ( #416, #1005, #386, #370 ) ) ;
796 | #781 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
797 | #782 = EDGE_LOOP ( 'NONE', ( #925, #1067, #551, #269 ) ) ;
798 | #783 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, -3.000000000000000000, -6.119999999999963691 ) ) ;
799 | #784 = ADVANCED_FACE ( 'NONE', ( #4 ), #10, .T. ) ;
800 | #785 = ORIENTED_EDGE ( 'NONE', *, *, #26, .T. ) ;
801 | #786 = ADVANCED_FACE ( 'NONE', ( #447 ), #373, .T. ) ;
802 | #787 = LINE ( 'NONE', #192, #697 ) ;
803 | #788 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
804 | #789 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
805 | #790 = CIRCLE ( 'NONE', #25, 6.120000000000000107 ) ;
806 | #791 = CARTESIAN_POINT ( 'NONE', ( 3.469446951953614189E-15, -3.000000000000000000, -33.96689564855758192 ) ) ;
807 | #792 = VERTEX_POINT ( 'NONE', #300 ) ;
808 | #793 = AXIS2_PLACEMENT_3D ( 'NONE', #654, #673, #929 ) ;
809 | #794 = FACE_OUTER_BOUND ( 'NONE', #115, .T. ) ;
810 | #795 = ADVANCED_FACE ( 'NONE', ( #794 ), #197, .T. ) ;
811 | #796 = ORIENTED_EDGE ( 'NONE', *, *, #593, .T. ) ;
812 | #797 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 0.000000000000000000 ) ) ;
813 | #798 = ADVANCED_FACE ( 'NONE', ( #462 ), #615, .F. ) ;
814 | #799 = ORIENTED_EDGE ( 'NONE', *, *, #86, .F. ) ;
815 | #800 = LINE ( 'NONE', #451, #299 ) ;
816 | #801 = CIRCLE ( 'NONE', #709, 1.600000000000000755 ) ;
817 | #802 = EDGE_LOOP ( 'NONE', ( #18, #438, #468, #213 ) ) ;
818 | #803 = ADVANCED_FACE ( 'NONE', ( #545 ), #637, .F. ) ;
819 | #804 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -28.49999999999997158 ) ) ;
820 | #805 = FACE_OUTER_BOUND ( 'NONE', #780, .T. ) ;
821 | #806 = EDGE_LOOP ( 'NONE', ( #1034, #631, #583, #785 ) ) ;
822 | #807 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
823 | #808 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
824 | #809 = VECTOR ( 'NONE', #170, 1000.000000000000000 ) ;
825 | #810 = VECTOR ( 'NONE', #788, 1000.000000000000000 ) ;
826 | #811 = FACE_OUTER_BOUND ( 'NONE', #702, .T. ) ;
827 | #812 = ORIENTED_EDGE ( 'NONE', *, *, #206, .T. ) ;
828 | #813 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, -3.000000000000000000, 13.50000000000003908 ) ) ;
829 | #814 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
830 | #815 = ORIENTED_EDGE ( 'NONE', *, *, #695, .T. ) ;
831 | #816 = ORIENTED_EDGE ( 'NONE', *, *, #346, .T. ) ;
832 | #817 = FACE_OUTER_BOUND ( 'NONE', #806, .T. ) ;
833 | #818 = EDGE_CURVE ( 'NONE', #604, #306, #957, .T. ) ;
834 | #819 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -35.46689564855758192 ) ) ;
835 | #820 = CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT ( #669, #226, ( #625 ) ) ;
836 | #821 = ORIENTED_EDGE ( 'NONE', *, *, #623, .F. ) ;
837 | #822 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 33.50000000000002842 ) ) ;
838 | #823 = PERSON_AND_ORGANIZATION_ROLE ( 'creator' ) ;
839 | #824 = AXIS2_PLACEMENT_3D ( 'NONE', #648, #1081, #235 ) ;
840 | #825 = ORIENTED_EDGE ( 'NONE', *, *, #147, .F. ) ;
841 | #826 = AXIS2_PLACEMENT_3D ( 'NONE', #608, #594, #98 ) ;
842 | #827 = AXIS2_PLACEMENT_3D ( 'NONE', #989, #220, #562 ) ;
843 | #828 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
844 | #829 = VERTEX_POINT ( 'NONE', #1065 ) ;
845 | #830 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 25.88000000000004164 ) ) ;
846 | #831 = PERSON_AND_ORGANIZATION ( #20, #457 ) ;
847 | #832 = ORIENTED_EDGE ( 'NONE', *, *, #874, .T. ) ;
848 | #833 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, 28.50000000000003908 ) ) ;
849 | #834 = AXIS2_PLACEMENT_3D ( 'NONE', #117, #781, #1058 ) ;
850 | #835 = CYLINDRICAL_SURFACE ( 'NONE', #175, 1.500000000000001332 ) ;
851 | #836 = ORIENTED_EDGE ( 'NONE', *, *, #720, .F. ) ;
852 | #837 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
853 | #838 = ADVANCED_FACE ( 'NONE', ( #703 ), #980, .F. ) ;
854 | #839 = VECTOR ( 'NONE', #295, 1000.000000000000000 ) ;
855 | #840 = ORIENTED_EDGE ( 'NONE', *, *, #103, .F. ) ;
856 | #841 = EDGE_CURVE ( 'NONE', #152, #450, #800, .T. ) ;
857 | #842 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
858 | #843 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
859 | #844 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000082E-05 ), #1053, 'distance_accuracy_value', 'NONE');
860 | #845 = LINE ( 'NONE', #822, #202 ) ;
861 | #846 = CALENDAR_DATE ( 2022, 2, 5 ) ;
862 | #847 = AXIS2_PLACEMENT_3D ( 'NONE', #29, #879, #111 ) ;
863 | #848 = ADVANCED_FACE ( 'NONE', ( #968 ), #363, .F. ) ;
864 | #849 = ORIENTED_EDGE ( 'NONE', *, *, #739, .T. ) ;
865 | #850 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
866 | #851 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
867 | #852 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
868 | #853 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
869 | #854 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
870 | #855 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
871 | #856 = DATE_AND_TIME ( #846, #445 ) ;
872 | #857 = AXIS2_PLACEMENT_3D ( 'NONE', #83, #16, #262 ) ;
873 | #858 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
874 | #859 = ORIENTED_EDGE ( 'NONE', *, *, #623, .T. ) ;
875 | #860 = EDGE_CURVE ( 'NONE', #57, #651, #253, .T. ) ;
876 | #861 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
877 | #862 = LINE ( 'NONE', #276, #958 ) ;
878 | #863 = ADVANCED_FACE ( 'NONE', ( #1068 ), #289, .F. ) ;
879 | #864 = APPROVAL_DATE_TIME ( #11, #40 ) ;
880 | #865 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 16.95256701634534124 ) ) ;
881 | #866 = EDGE_LOOP ( 'NONE', ( #972, #290, #314, #556, #1069, #243, #237 ) ) ;
882 | #867 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -25.87999999999996703 ) ) ;
883 | #868 = LINE ( 'NONE', #1106, #425 ) ;
884 | #869 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
885 | #870 = ORIENTED_EDGE ( 'NONE', *, *, #55, .T. ) ;
886 | #871 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
887 | #872 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
888 | #873 = AXIS2_PLACEMENT_3D ( 'NONE', #405, #560, #660 ) ;
889 | #874 = EDGE_CURVE ( 'NONE', #685, #728, #252, .T. ) ;
890 | #875 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.7071067811865472397, 0.7071067811865479058 ) ) ;
891 | #876 = EDGE_CURVE ( 'NONE', #330, #586, #787, .T. ) ;
892 | #877 = ORIENTED_EDGE ( 'NONE', *, *, #1048, .F. ) ;
893 | #878 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
894 | #879 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
895 | #880 = VERTEX_POINT ( 'NONE', #889 ) ;
896 | #881 = AXIS2_PLACEMENT_3D ( 'NONE', #82, #151, #156 ) ;
897 | #882 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 33.50000000000002842 ) ) ;
898 | #883 = VECTOR ( 'NONE', #19, 1000.000000000000000 ) ;
899 | #884 = ORIENTED_EDGE ( 'NONE', *, *, #772, .T. ) ;
900 | #885 = FACE_BOUND ( 'NONE', #563, .T. ) ;
901 | #886 = AXIS2_PLACEMENT_3D ( 'NONE', #1101, #477, #407 ) ;
902 | #887 = ORIENTED_EDGE ( 'NONE', *, *, #1026, .F. ) ;
903 | #888 = EDGE_CURVE ( 'NONE', #775, #792, #963, .T. ) ;
904 | #889 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, -6.119999999999963691 ) ) ;
905 | #890 = ORIENTED_EDGE ( 'NONE', *, *, #876, .F. ) ;
906 | #891 = LINE ( 'NONE', #791, #275 ) ;
907 | #892 = ORIENTED_EDGE ( 'NONE', *, *, #688, .T. ) ;
908 | #893 = EDGE_CURVE ( 'NONE', #34, #50, #210, .T. ) ;
909 | #894 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 21.12439348241742820, 33.50000000000002842 ) ) ;
910 | #895 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, 18.55256701634533911 ) ) ;
911 | #896 = VECTOR ( 'NONE', #378, 1000.000000000000000 ) ;
912 | #897 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
913 | #898 = ORIENTED_EDGE ( 'NONE', *, *, #173, .T. ) ;
914 | #899 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
915 | #900 = VERTEX_POINT ( 'NONE', #454 ) ;
916 | #901 = LINE ( 'NONE', #218, #1071 ) ;
917 | #902 = ORIENTED_EDGE ( 'NONE', *, *, #672, .F. ) ;
918 | #903 = FACE_OUTER_BOUND ( 'NONE', #480, .T. ) ;
919 | #904 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
920 | #905 = EDGE_CURVE ( 'NONE', #150, #992, #27, .T. ) ;
921 | #906 = EDGE_LOOP ( 'NONE', ( #1011, #384, #566, #42 ) ) ;
922 | #907 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
923 | #908 = VECTOR ( 'NONE', #1022, 1000.000000000000000 ) ;
924 | #909 = EDGE_CURVE ( 'NONE', #900, #364, #458, .T. ) ;
925 | #910 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, 18.55256701634533911 ) ) ;
926 | #911 = ORIENTED_EDGE ( 'NONE', *, *, #930, .F. ) ;
927 | #912 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
928 | #913 = COORDINATED_UNIVERSAL_TIME_OFFSET ( 5, 0, .BEHIND. ) ;
929 | #914 = ORIENTED_EDGE ( 'NONE', *, *, #147, .T. ) ;
930 | #915 = ORIENTED_EDGE ( 'NONE', *, *, #739, .F. ) ;
931 | #916 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, 1.000000000000000000 ) ) ;
932 | #917 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
933 | #918 = ORIENTED_EDGE ( 'NONE', *, *, #909, .T. ) ;
934 | #919 = PLANE ( 'NONE', #1025 ) ;
935 | #920 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
936 | #921 = VECTOR ( 'NONE', #339, 1000.000000000000000 ) ;
937 | #922 = ORIENTED_EDGE ( 'NONE', *, *, #725, .T. ) ;
938 | #923 = ADVANCED_FACE ( 'NONE', ( #56 ), #487, .F. ) ;
939 | #924 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, 33.96689564855758192 ) ) ;
940 | #925 = ORIENTED_EDGE ( 'NONE', *, *, #672, .T. ) ;
941 | #926 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 0.000000000000000000 ) ) ;
942 | #927 = ORIENTED_EDGE ( 'NONE', *, *, #14, .T. ) ;
943 | #928 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, 20.15256701634534053 ) ) ;
944 | #929 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
945 | #930 = EDGE_CURVE ( 'NONE', #100, #240, #48, .T. ) ;
946 | #931 = APPROVAL_PERSON_ORGANIZATION ( #831, #361, #994 ) ;
947 | #932 = ORIENTED_EDGE ( 'NONE', *, *, #428, .T. ) ;
948 | #933 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, 16.95256701634534124 ) ) ;
949 | #934 = AXIS2_PLACEMENT_3D ( 'NONE', #986, #323, #1099 ) ;
950 | #935 = ORIENTED_EDGE ( 'NONE', *, *, #528, .F. ) ;
951 | #936 = FACE_OUTER_BOUND ( 'NONE', #406, .T. ) ;
952 | #937 = DESIGN_CONTEXT ( 'detailed design', #683, 'design' ) ;
953 | #938 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, 31.12000000000003652 ) ) ;
954 | #939 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 0.000000000000000000 ) ) ;
955 | #940 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
956 | #941 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, 33.50000000000002842 ) ) ;
957 | #942 = PLANE ( 'NONE', #1044 ) ;
958 | #943 = ADVANCED_FACE ( 'NONE', ( #245 ), #999, .T. ) ;
959 | #944 = ORIENTED_EDGE ( 'NONE', *, *, #391, .F. ) ;
960 | #945 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
961 | #946 = VECTOR ( 'NONE', #411, 1000.000000000000000 ) ;
962 | #947 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, -3.000000000000000000, 0.000000000000000000 ) ) ;
963 | #948 = EDGE_LOOP ( 'NONE', ( #859, #914 ) ) ;
964 | #949 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -28.49999999999997158 ) ) ;
965 | #950 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, -3.000000000000000000, -16.95256701634527019 ) ) ;
966 | #951 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 3.642919299551294898E-14 ) ) ;
967 | #952 = ORIENTED_EDGE ( 'NONE', *, *, #987, .F. ) ;
968 | #953 = EDGE_CURVE ( 'NONE', #661, #196, #901, .T. ) ;
969 | #954 = DIRECTION ( 'NONE', ( -0.000000000000000000, 1.000000000000000000, -0.000000000000000000 ) ) ;
970 | #955 = ADVANCED_FACE ( 'NONE', ( #75 ), #533, .F. ) ;
971 | #956 = ORIENTED_EDGE ( 'NONE', *, *, #123, .F. ) ;
972 | #957 = LINE ( 'NONE', #974, #977 ) ;
973 | #958 = VECTOR ( 'NONE', #872, 1000.000000000000000 ) ;
974 | #959 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 13.50000000000003908 ) ) ;
975 | #960 = VECTOR ( 'NONE', #161, 1000.000000000000000 ) ;
976 | #961 = AXIS2_PLACEMENT_3D ( 'NONE', #632, #24, #388 ) ;
977 | #962 = ORIENTED_EDGE ( 'NONE', *, *, #26, .F. ) ;
978 | #963 = LINE ( 'NONE', #882, #530 ) ;
979 | #964 = VERTEX_POINT ( 'NONE', #585 ) ;
980 | #965 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
981 | #966 = EDGE_CURVE ( 'NONE', #118, #368, #749, .T. ) ;
982 | #967 = CIRCLE ( 'NONE', #344, 1.600000000000000755 ) ;
983 | #968 = FACE_OUTER_BOUND ( 'NONE', #228, .T. ) ;
984 | #969 = VECTOR ( 'NONE', #341, 1000.000000000000000 ) ;
985 | #970 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 0.000000000000000000 ) ) ;
986 | #971 = CIRCLE ( 'NONE', #827, 1.500000000000008216 ) ;
987 | #972 = ORIENTED_EDGE ( 'NONE', *, *, #893, .T. ) ;
988 | #973 = EDGE_CURVE ( 'NONE', #792, #604, #65, .T. ) ;
989 | #974 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, 13.50000000000003908 ) ) ;
990 | #975 = ORIENTED_EDGE ( 'NONE', *, *, #595, .T. ) ;
991 | #976 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
992 | #977 = VECTOR ( 'NONE', #376, 1000.000000000000000 ) ;
993 | #978 = EDGE_LOOP ( 'NONE', ( #279, #433, #53, #581 ) ) ;
994 | #979 = SECURITY_CLASSIFICATION ( '', '', #236 ) ;
995 | #980 = CONICAL_SURFACE ( 'NONE', #834, 1.600000000000000755, 0.7853981633974488341 ) ;
996 | #981 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
997 | #982 = EDGE_LOOP ( 'NONE', ( #638, #186, #317, #165 ) ) ;
998 | #983 = FACE_OUTER_BOUND ( 'NONE', #109, .T. ) ;
999 | #984 = EDGE_LOOP ( 'NONE', ( #1077, #284, #652, #670 ) ) ;
1000 | #985 = VECTOR ( 'NONE', #37, 1000.000000000000000 ) ;
1001 | #986 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, 18.55256701634533911 ) ) ;
1002 | #987 = EDGE_CURVE ( 'NONE', #203, #586, #726, .T. ) ;
1003 | #988 = EDGE_LOOP ( 'NONE', ( #412, #138 ) ) ;
1004 | #989 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, -3.000000000000000000, -33.96689564855758192 ) ) ;
1005 | #990 = ADVANCED_FACE ( 'NONE', ( #727 ), #580, .F. ) ;
1006 | #991 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
1007 | #992 = VERTEX_POINT ( 'NONE', #473 ) ;
1008 | #993 = FACE_OUTER_BOUND ( 'NONE', #906, .T. ) ;
1009 | #994 = APPROVAL_ROLE ( '' ) ;
1010 | #995 = VECTOR ( 'NONE', #333, 1000.000000000000000 ) ;
1011 | #996 = EDGE_LOOP ( 'NONE', ( #892, #622, #320, #221 ) ) ;
1012 | #997 = VERTEX_POINT ( 'NONE', #127 ) ;
1013 | #998 = CC_DESIGN_APPROVAL ( #443, ( #1063 ) ) ;
1014 | #999 = CYLINDRICAL_SURFACE ( 'NONE', #587, 1.500000000000001332 ) ;
1015 | #1000 = ORIENTED_EDGE ( 'NONE', *, *, #1055, .T. ) ;
1016 | #1001 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -28.49999999999997158 ) ) ;
1017 | #1002 = EDGE_LOOP ( 'NONE', ( #274, #962, #360, #463 ) ) ;
1018 | #1003 = ADVANCED_FACE ( 'NONE', ( #805 ), #835, .T. ) ;
1019 | #1004 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
1020 | #1005 = ORIENTED_EDGE ( 'NONE', *, *, #1023, .F. ) ;
1021 | #1006 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 21.12439348241742820, -13.49999999999996980 ) ) ;
1022 | #1007 = AXIS2_PLACEMENT_3D ( 'NONE', #949, #503, #940 ) ;
1023 | #1008 = ORIENTED_EDGE ( 'NONE', *, *, #164, .T. ) ;
1024 | #1009 = ADVANCED_FACE ( 'NONE', ( #811 ), #154, .T. ) ;
1025 | #1010 = DIRECTION ( 'NONE', ( 0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
1026 | #1011 = ORIENTED_EDGE ( 'NONE', *, *, #328, .T. ) ;
1027 | #1012 = CYLINDRICAL_SURFACE ( 'NONE', #403, 1.600000000000000755 ) ;
1028 | #1013 = LINE ( 'NONE', #1049, #321 ) ;
1029 | #1014 = VERTEX_POINT ( 'NONE', #738 ) ;
1030 | #1015 = VECTOR ( 'NONE', #392, 1000.000000000000000 ) ;
1031 | #1016 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 13.50000000000003908 ) ) ;
1032 | #1017 = AXIS2_PLACEMENT_3D ( 'NONE', #970, #552, #301 ) ;
1033 | #1018 = LINE ( 'NONE', #421, #35 ) ;
1034 | #1019 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -3.000000000000000000, -13.49999999999996980 ) ) ;
1035 | #1020 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, 3.642919299551294898E-14 ) ) ;
1036 | #1021 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
1037 | #1022 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
1038 | #1023 = EDGE_CURVE ( 'NONE', #685, #50, #1076, .T. ) ;
1039 | #1024 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
1040 | #1025 = AXIS2_PLACEMENT_3D ( 'NONE', #307, #68, #247 ) ;
1041 | #1026 = EDGE_CURVE ( 'NONE', #1014, #296, #304, .T. ) ;
1042 | #1027 = CIRCLE ( 'NONE', #826, 3.200000000000015277 ) ;
1043 | #1028 = ORIENTED_EDGE ( 'NONE', *, *, #431, .T. ) ;
1044 | #1029 = CIRCLE ( 'NONE', #544, 2.619999999999997442 ) ;
1045 | #1030 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 33.50000000000002842 ) ) ;
1046 | #1031 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, 16.95256701634534124 ) ) ;
1047 | #1032 = APPROVAL_STATUS ( 'not_yet_approved' ) ;
1048 | #1033 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, -3.000000000000000000, -33.49999999999996447 ) ) ;
1049 | #1034 = ORIENTED_EDGE ( 'NONE', *, *, #888, .T. ) ;
1050 | #1035 = DIRECTION ( 'NONE', ( -0.000000000000000000, 1.000000000000000000, -0.000000000000000000 ) ) ;
1051 | #1036 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
1052 | #1037 = CIRCLE ( 'NONE', #229, 6.120000000000000107 ) ;
1053 | #1038 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
1054 | #1039 = AXIS2_PLACEMENT_3D ( 'NONE', #1079, #479, #49 ) ;
1055 | #1040 = EDGE_CURVE ( 'NONE', #84, #656, #309, .T. ) ;
1056 | #1041 = ORIENTED_EDGE ( 'NONE', *, *, #490, .F. ) ;
1057 | #1042 = EDGE_CURVE ( 'NONE', #539, #342, #41, .T. ) ;
1058 | #1043 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
1059 | #1044 = AXIS2_PLACEMENT_3D ( 'NONE', #1051, #858, #365 ) ;
1060 | #1045 = LINE ( 'NONE', #1031, #1108 ) ;
1061 | #1046 = CIRCLE ( 'NONE', #418, 1.500000000000008216 ) ;
1062 | #1047 = ORIENTED_EDGE ( 'NONE', *, *, #610, .T. ) ;
1063 | #1048 = EDGE_CURVE ( 'NONE', #525, #475, #712, .T. ) ;
1064 | #1049 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 35.50000000000000711 ) ) ;
1065 | #1050 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 2.000000000000000000, 0.000000000000000000 ) ) ;
1066 | #1051 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 13.50000000000003908 ) ) ;
1067 | #1052 = ORIENTED_EDGE ( 'NONE', *, *, #66, .F. ) ;
1068 | #1053 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( .MILLI., .METRE. ) );
1069 | #1054 = DIRECTION ( 'NONE', ( -0.000000000000000000, -1.000000000000000000, -0.000000000000000000 ) ) ;
1070 | #1055 = EDGE_CURVE ( 'NONE', #330, #880, #618, .T. ) ;
1071 | #1056 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 0.000000000000000000, 33.50000000000002842 ) ) ;
1072 | #1057 = VECTOR ( 'NONE', #642, 1000.000000000000000 ) ;
1073 | #1058 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
1074 | #1059 = EDGE_LOOP ( 'NONE', ( #131, #1041, #915, #180 ) ) ;
1075 | #1060 = EDGE_CURVE ( 'NONE', #880, #330, #1037, .T. ) ;
1076 | #1061 = FACE_BOUND ( 'NONE', #1083, .T. ) ;
1077 | #1062 = ORIENTED_EDGE ( 'NONE', *, *, #905, .T. ) ;
1078 | #1063 = PRODUCT_DEFINITION ( 'UNKNOWN', '', #270, #937 ) ;
1079 | #1064 = AXIS2_PLACEMENT_3D ( 'NONE', #356, #691, #92 ) ;
1080 | #1065 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999995701, 0.000000000000000000, 13.50000000000003908 ) ) ;
1081 | #1066 = LINE ( 'NONE', #369, #810 ) ;
1082 | #1067 = ORIENTED_EDGE ( 'NONE', *, *, #47, .F. ) ;
1083 | #1068 = FACE_OUTER_BOUND ( 'NONE', #397, .T. ) ;
1084 | #1069 = ORIENTED_EDGE ( 'NONE', *, *, #408, .T. ) ;
1085 | #1070 = FACE_BOUND ( 'NONE', #1100, .T. ) ;
1086 | #1071 = VECTOR ( 'NONE', #467, 1000.000000000000000 ) ;
1087 | #1072 = EDGE_LOOP ( 'NONE', ( #478, #350, #619, #155 ) ) ;
1088 | #1073 = CIRCLE ( 'NONE', #1111, 3.200000000000015277 ) ;
1089 | #1074 = EDGE_CURVE ( 'NONE', #1014, #661, #501, .T. ) ;
1090 | #1075 = AXIS2_PLACEMENT_3D ( 'NONE', #894, #627, #621 ) ;
1091 | #1076 = LINE ( 'NONE', #1085, #655 ) ;
1092 | #1077 = ORIENTED_EDGE ( 'NONE', *, *, #649, .F. ) ;
1093 | #1078 = DIRECTION ( 'NONE', ( 0.000000000000000000, 1.000000000000000000, 0.000000000000000000 ) ) ;
1094 | #1079 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, 0.000000000000000000, -28.49999999999997158 ) ) ;
1095 | #1080 = VERTEX_POINT ( 'NONE', #1016 ) ;
1096 | #1081 = DIRECTION ( 'NONE', ( 0.000000000000000000, -1.000000000000000000, 0.000000000000000000 ) ) ;
1097 | #1082 = APPROVAL_DATE_TIME ( #734, #443 ) ;
1098 | #1083 = EDGE_LOOP ( 'NONE', ( #355, #113 ) ) ;
1099 | #1084 = ORIENTED_EDGE ( 'NONE', *, *, #1042, .F. ) ;
1100 | #1085 = CARTESIAN_POINT ( 'NONE', ( -1.566176470588235725, 2.000000000000000000, 35.46543516246453720 ) ) ;
1101 | #1086 = ORIENTED_EDGE ( 'NONE', *, *, #571, .T. ) ;
1102 | #1087 = CARTESIAN_POINT ( 'NONE', ( -1.500000000000000000, 2.000000000000000000, -33.96689564855758192 ) ) ;
1103 | #1088 = CALENDAR_DATE ( 2022, 2, 5 ) ;
1104 | #1089 = ORIENTED_EDGE ( 'NONE', *, *, #227, .T. ) ;
1105 | #1090 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, -3.000000000000000000, -13.49999999999996980 ) ) ;
1106 | #1091 = EDGE_CURVE ( 'NONE', #964, #752, #565, .T. ) ;
1107 | #1092 = LOCAL_TIME ( 10, 4, 46.00000000000000000, #69 ) ;
1108 | #1093 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 21.12439348241742820, -33.49999999999996447 ) ) ;
1109 | #1094 = EDGE_LOOP ( 'NONE', ( #250, #31, #246, #311 ) ) ;
1110 | #1095 = FACE_OUTER_BOUND ( 'NONE', #996, .T. ) ;
1111 | #1096 = DATE_AND_TIME ( #748, #30 ) ;
1112 | #1097 = EDGE_CURVE ( 'NONE', #265, #492, #1073, .T. ) ;
1113 | #1098 = LINE ( 'NONE', #928, #995 ) ;
1114 | #1099 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -1.000000000000000000 ) ) ;
1115 | #1100 = EDGE_LOOP ( 'NONE', ( #496, #205 ) ) ;
1116 | #1101 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 5.000000000000000000, -18.55256701634527161 ) ) ;
1117 | #1102 = VECTOR ( 'NONE', #1021, 1000.000000000000000 ) ;
1118 | #1103 = VERTEX_POINT ( 'NONE', #248 ) ;
1119 | #1104 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -20.15256701634527303 ) ) ;
1120 | #1105 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, -33.49999999999996447 ) ) ;
1121 | #1106 = CARTESIAN_POINT ( 'NONE', ( -23.62209682755465323, 0.000000000000000000, -6.119999999999963691 ) ) ;
1122 | #1107 = LINE ( 'NONE', #251, #126 ) ;
1123 | #1108 = VECTOR ( 'NONE', #761, 1000.000000000000000 ) ;
1124 | #1109 = APPLICATION_CONTEXT ( 'configuration controlled 3d designs of mechanical parts and assemblies' ) ;
1125 | #1110 = EDGE_CURVE ( 'NONE', #216, #308, #91, .T. ) ;
1126 | #1111 = AXIS2_PLACEMENT_3D ( 'NONE', #22, #871, #163 ) ;
1127 | #1112 = AXIS2_PLACEMENT_3D ( 'NONE', #461, #723, #297 ) ;
1128 | #1113 = CARTESIAN_POINT ( 'NONE', ( -7.659999999999994813, 0.000000000000000000, -13.49999999999996980 ) ) ;
1129 | #1114 = EDGE_CURVE ( 'NONE', #900, #57, #1013, .T. ) ;
1130 | #1115 = CARTESIAN_POINT ( 'NONE', ( -10.99999999999999645, -3.000000000000000000, -31.11999999999997257 ) ) ;
1131 | #1116 = ORIENTED_EDGE ( 'NONE', *, *, #1023, .T. ) ;
1132 | #1117 = CARTESIAN_POINT ( 'NONE', ( -14.62209682755464968, 0.3999999999999863110, -20.15256701634527303 ) ) ;
1133 | #1118 = CARTESIAN_POINT ( 'NONE', ( -0.8599999999999962119, 0.000000000000000000, 13.50000000000003908 ) ) ;
1134 | ENDSEC;
1135 | END-ISO-10303-21;
1136 |
--------------------------------------------------------------------------------