-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathobservatory.sysml
More file actions
251 lines (218 loc) · 5.41 KB
/
Copy pathobservatory.sysml
File metadata and controls
251 lines (218 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
package Observatory {
private import DocumentQueries::*;
private import KerML::Root::Element;
private import ScalarValues::*;
private import Views::*;
// ---- The system model the report is generated from ----
part def Subsystem {
attribute mass : Real;
attribute zone : String;
}
part telescope {
part optics : Subsystem {
attribute redefines mass = 8.5;
attribute redefines zone = "payload";
}
part segmentControl : Subsystem {
attribute redefines mass = 20.0;
attribute redefines zone = "payload";
}
part mount : Subsystem {
attribute redefines mass = 15.0;
attribute redefines zone = "support";
}
}
port def DataPort;
part def Camera {
port output : DataPort;
}
part def Recorder {
port input : DataPort;
}
part imagingChain {
part camera : Camera;
part recorder : Recorder;
connection link connect camera.output to recorder.input;
}
requirement massRequirement;
part observatory {
satisfy massRequirement by telescope;
}
verification def MassTest;
verification massVerification : MassTest {
objective {
verify massRequirement;
}
}
view interconnectView {
expose imagingChain;
render asInterconnectionDiagram;
}
// ---- Document queries ----
calc def Subsystems :> Query {
in root : Element;
WhereType(
source = Descendants(source = root, maxDepth = 3),
type = "PartUsage"
)
}
calc def SubsystemTable :> Query {
in root : Element;
Project(
source = OrderBy(
source = Subsystems(root = root),
property = "name",
direction = "ascending",
missing = "last",
multiple = "error"
),
properties = ("name", "mass")
)
}
calc def HeavySubsystemNames :> Query {
in root : Element;
in threshold : String;
Project(
source = OrderBy(
source = WhereFeature(
source = Subsystems(root = root),
'feature' = "mass",
operator = ">=",
value = threshold
),
property = "name",
direction = "ascending",
missing = "last",
multiple = "error"
),
properties = ("name")
)
}
calc def ZonedSubsystems :> Query {
in root : Element;
Project(
source = OrderBy(
source = Subsystems(root = root),
property = "name",
direction = "ascending",
missing = "last",
multiple = "error"
),
properties = ("zone", "name", "mass")
)
}
calc def SatisfyingParts :> Query {
in req : Element;
Project(
source = RelatedElements(
source = req,
relationshipKind = "satisfaction",
direction = "incoming",
maxDepth = 1
),
properties = ("name", "qualifiedName")
)
}
calc def VerifyingElements :> Query {
in req : Element;
Project(
source = RelatedElements(
source = req,
relationshipKind = "verification",
direction = "incoming",
maxDepth = 1
),
properties = ("qualifiedName")
)
}
// ---- The document definition ----
part def MassReport :> Document {
attribute redefines title = "Telescope Mass Report";
part intro : Paragraph {
attribute redefines text = "Mass rollup and requirement status for the telescope assembly.";
}
part guide : Paragraph {
part lead : Span {
attribute redefines text = "This report is";
}
part generated : Span {
attribute redefines text = "generated";
attribute redefines style = "emphasis";
}
part sourceNote : Span {
attribute redefines text = "from the model by";
}
part tool : Span {
attribute redefines text = "sysml -render-document";
attribute redefines style = "code";
}
part docsLink : Link {
attribute redefines text = "(OpenSysML)";
attribute redefines target = "https://opensysml.org/";
}
part see : Span {
attribute redefines text = "— masses are tabulated in";
}
part massesRef : Ref {
ref redefines target = breakdown;
}
}
part breakdown : Section {
attribute redefines title = "Subsystem Masses";
part masses : Table {
attribute redefines caption = "All subsystems by mass";
calc rows : SubsystemTable {
in root = telescope;
}
}
part zones : Table {
attribute redefines caption = "Subsystems grouped by zone";
attribute redefines groupBy = "zone";
calc rows : ZonedSubsystems {
in root = telescope;
}
}
part heavy : Section {
attribute redefines title = "Heavy Subsystems";
part note : Paragraph {
attribute redefines text = "Subsystems at or above 10 kg:";
}
part heavyItems : List {
attribute redefines style = "number";
calc items : HeavySubsystemNames {
in root = telescope;
in threshold = "10";
}
}
}
}
part requirements : Section {
attribute redefines title = "Mass Requirement";
part satisfiers : Table {
attribute redefines caption = "Parts satisfying the mass requirement";
calc rows : SatisfyingParts {
in req = massRequirement;
}
}
part verifiers : Table {
attribute redefines caption = "Verifications of the mass requirement";
calc rows : VerifyingElements {
in req = massRequirement;
}
}
}
part diagrams : Section {
attribute redefines title = "Diagrams";
part imaging : Diagram {
attribute redefines caption = "Imaging chain interconnection";
ref redefines source = interconnectView;
}
part structure : Diagram {
attribute redefines caption = "Telescope part tree, left to right";
attribute redefines kind = "tree";
attribute redefines direction = "LR";
ref redefines source = telescope;
}
}
}
}